rimmed pushed a commit to branch master. http://git.enlightenment.org/tools/eflete.git/commit/?id=8d961bd41b438f4e14143fadb4817e671ab61a5b
commit 8d961bd41b438f4e14143fadb4817e671ab61a5b Author: Vitalii Vorobiov <vi.vorob...@samsung.com> Date: Fri Sep 30 15:31:29 2016 +0300 editor: part_item_index_ restack/del/append reworked --- src/bin/common/signals.h | 3 + src/bin/editor/diff.c | 24 ++++++ src/bin/editor/diff.h | 11 +++ src/bin/editor/editor.h | 10 +++ src/bin/editor/editor_part.c | 193 +++++++++++++++++++++++++++++++++++++++++++ 5 files changed, 241 insertions(+) diff --git a/src/bin/common/signals.h b/src/bin/common/signals.h index 8b19a2f..1de2dec 100644 --- a/src/bin/common/signals.h +++ b/src/bin/common/signals.h @@ -391,6 +391,7 @@ typedef struct { const char *part_name; const char *item_name; const char *source; + unsigned int item_index; } Editor_Item; /** * emited when item is added in editor. @@ -492,6 +493,8 @@ typedef struct { const char *part_name; const char *part_item; const char *relative_part_item; + unsigned int item_index; + unsigned int relative_item_index; } Editor_Part_Item_Restack; /** * emited when part item is restacked. diff --git a/src/bin/editor/diff.c b/src/bin/editor/diff.c index 2161fb3..6990b8b 100644 --- a/src/bin/editor/diff.c +++ b/src/bin/editor/diff.c @@ -48,6 +48,8 @@ typedef Eina_Bool (* function_type_string_int) (Evas_Object *, Change*, Eina_Boo const char *, int); typedef Eina_Bool (* function_type_string_string) (Evas_Object *, Change*, Eina_Bool, Eina_Bool, const char *, const char *); +typedef Eina_Bool (* function_type_string_uint) (Evas_Object *, Change*, Eina_Bool, Eina_Bool, + const char *, unsigned int); typedef Eina_Bool (* function_type_string) (Evas_Object *, Change*, Eina_Bool, Eina_Bool, const char *); typedef Eina_Bool (* function_type_string_string_edjeaspectcontrol) (Evas_Object *, Change*, Eina_Bool, Eina_Bool, @@ -72,6 +74,8 @@ typedef Eina_Bool (* function_type_string_uint_ushort) (Evas_Object *, Change*, const char *, unsigned int, unsigned short); typedef Eina_Bool (* function_type_string_string_string) (Evas_Object *, Change*, Eina_Bool, Eina_Bool, const char *, const char *, const char *); +typedef Eina_Bool (* function_type_string_uint_uint) (Evas_Object *, Change*, Eina_Bool, Eina_Bool, + const char *, unsigned int, unsigned int); typedef Eina_Bool (* function_type_string_uint_string) (Evas_Object *, Change*, Eina_Bool, Eina_Bool, const char *, unsigned int, const char *); typedef Eina_Bool (* function_type_string_string_int_int_int_int) (Evas_Object *, Change*, Eina_Bool, Eina_Bool, @@ -147,6 +151,9 @@ _apply(Evas_Object *obj, Function_Info *fi) case FUNCTION_TYPE_STRING_STRING_RENAME: return ((function_type_string_string)fi->function)(obj, NULL, false, true, fi->args.type_ss.s1, fi->args.type_ss.s2); + case FUNCTION_TYPE_STRING_UINT: + return ((function_type_string_uint)fi->function)(obj, NULL, false, true, + fi->args.type_sui.s1, fi->args.type_sui.ui2); case FUNCTION_TYPE_STRING: return ((function_type_string)fi->function)(obj, NULL, false, true, fi->args.type_s.s1); @@ -177,6 +184,9 @@ _apply(Evas_Object *obj, Function_Info *fi) case FUNCTION_TYPE_STRING_STRING_STRING: return ((function_type_string_string_string)fi->function)(obj, NULL, false, true, fi->args.type_sss.s1, fi->args.type_sss.s2, fi->args.type_sss.s3); + case FUNCTION_TYPE_STRING_UINT_UINT: + return ((function_type_string_uint_uint)fi->function)(obj, NULL, false, true, + fi->args.type_suiui.s1, fi->args.type_suiui.ui2, fi->args.type_suiui.ui3); case FUNCTION_TYPE_STRING_UINT_STRING: return ((function_type_string_uint_string)fi->function)(obj, NULL, false, true, fi->args.type_suis.s1, fi->args.type_suis.ui2, fi->args.type_suis.s3); @@ -327,6 +337,10 @@ diff_update(Diff *diff, Diff *new_diff) eina_stringshare_ref(new_diff->redo.args.type_ss.s1); eina_stringshare_ref(new_diff->redo.args.type_ss.s2); break; + case FUNCTION_TYPE_STRING_UINT: + eina_stringshare_del(diff->redo.args.type_sui.s1); + eina_stringshare_ref(new_diff->redo.args.type_sui.s1); + break; case FUNCTION_TYPE_STRING_STRING_RENAME: /* rename needs special update */ assert(diff->redo.type == diff->undo.type); @@ -390,6 +404,10 @@ diff_update(Diff *diff, Diff *new_diff) eina_stringshare_ref(new_diff->redo.args.type_sss.s2); eina_stringshare_ref(new_diff->redo.args.type_sss.s3); break; + case FUNCTION_TYPE_STRING_UINT_UINT: + eina_stringshare_del(diff->redo.args.type_suiui.s1); + eina_stringshare_ref(new_diff->redo.args.type_suiui.s1); + break; case FUNCTION_TYPE_STRING_UINT_STRING: eina_stringshare_del(diff->redo.args.type_suis.s1); eina_stringshare_del(diff->redo.args.type_suis.s3); @@ -508,6 +526,9 @@ diff_free(Diff *diff) eina_stringshare_del(diff->redo.args.type_ss.s1); eina_stringshare_del(diff->redo.args.type_ss.s2); break; + case FUNCTION_TYPE_STRING_UINT: + eina_stringshare_del(diff->redo.args.type_sui.s1); + break; case FUNCTION_TYPE_STRING: eina_stringshare_del(diff->redo.args.type_s.s1); break; @@ -544,6 +565,9 @@ diff_free(Diff *diff) eina_stringshare_del(diff->redo.args.type_sss.s2); eina_stringshare_del(diff->redo.args.type_sss.s3); break; + case FUNCTION_TYPE_STRING_UINT_UINT: + eina_stringshare_del(diff->redo.args.type_suiui.s1); + break; case FUNCTION_TYPE_STRING_UINT_STRING: eina_stringshare_del(diff->redo.args.type_suis.s1); eina_stringshare_del(diff->redo.args.type_suis.s3); diff --git a/src/bin/editor/diff.h b/src/bin/editor/diff.h index 74c1d18..fe82dac 100644 --- a/src/bin/editor/diff.h +++ b/src/bin/editor/diff.h @@ -39,6 +39,7 @@ typedef enum { FUNCTION_TYPE_STRING_BOOL, FUNCTION_TYPE_STRING_INT, FUNCTION_TYPE_STRING_STRING, + FUNCTION_TYPE_STRING_UINT, FUNCTION_TYPE_STRING_STRING_RENAME, FUNCTION_TYPE_STRING, FUNCTION_TYPE_STRING_STRING_EDJEASPECTCONTROL, @@ -50,6 +51,7 @@ typedef enum { FUNCTION_TYPE_STRING_STRING_USHORT, FUNCTION_TYPE_STRING_UINT_USHORT, FUNCTION_TYPE_STRING_STRING_STRING, + FUNCTION_TYPE_STRING_UINT_UINT, FUNCTION_TYPE_STRING_UINT_STRING, FUNCTION_TYPE_STRING_STRING_INT_INT_INT_INT, FUNCTION_TYPE_STRING_EDJEEDITSELECTMODE, @@ -146,6 +148,10 @@ struct _Function_Info { } type_ss; struct { Eina_Stringshare *s1; + unsigned int ui2; + } type_sui; + struct { + Eina_Stringshare *s1; } type_s; struct { Eina_Stringshare *s1; @@ -195,6 +201,11 @@ struct _Function_Info { struct { Eina_Stringshare *s1; unsigned int ui2; + unsigned int ui3; + } type_suiui; + struct { + Eina_Stringshare *s1; + unsigned int ui2; Eina_Stringshare *s3; } type_suis; struct { diff --git a/src/bin/editor/editor.h b/src/bin/editor/editor.h index 6ea39a0..f77e61c 100644 --- a/src/bin/editor/editor.h +++ b/src/bin/editor/editor.h @@ -236,6 +236,7 @@ typedef struct { Eina_Stringshare *part_name; Eina_Stringshare *item_name; unsigned int item_index; + unsigned int relative_item_index; Eina_Stringshare *state_name; Eina_Stringshare *program_name; double state_value; @@ -620,12 +621,21 @@ Eina_Bool editor_part_item_restack(Evas_Object *edit_object, Change *change, Eina_Bool merge, Eina_Bool apply, const char *part_name, const char *part_item, const char *relative_part_item) EINA_WARN_UNUSED_RESULT; Eina_Bool +editor_part_item_index_restack(Evas_Object *edit_object, Change *change, Eina_Bool merge, Eina_Bool apply, + const char *part_name, unsigned int index, unsigned int index_relative, Eina_Bool relative) EINA_WARN_UNUSED_RESULT; +Eina_Bool editor_part_item_append(Evas_Object *edit_object, Change *change, Eina_Bool merge, Eina_Bool apply, const char *part_name, const char *item_name, const char *source_group) EINA_WARN_UNUSED_RESULT; Eina_Bool +editor_part_item_index_append(Evas_Object *edit_object, Change *change, Eina_Bool merge, Eina_Bool apply, + const char *part_name, const char *item_name, const char *source_group) EINA_WARN_UNUSED_RESULT; +Eina_Bool editor_part_item_del(Evas_Object *edit_object, Change *change, Eina_Bool merge, Eina_Bool apply, const char *part_name, const char *item_name) EINA_WARN_UNUSED_RESULT; Eina_Bool +editor_part_item_index_del(Evas_Object *edit_object, Change *change, Eina_Bool merge, Eina_Bool apply, + const char *part_name, unsigned int index) EINA_WARN_UNUSED_RESULT; +Eina_Bool editor_part_item_min_w_set(Evas_Object *obj, Change *change, Eina_Bool merge, Eina_Bool apply, const char *part_name, const char *item_name, int new_val) EINA_WARN_UNUSED_RESULT; Eina_Bool diff --git a/src/bin/editor/editor_part.c b/src/bin/editor/editor_part.c index 1d600b6..53b7131 100644 --- a/src/bin/editor/editor_part.c +++ b/src/bin/editor/editor_part.c @@ -1022,6 +1022,63 @@ editor_part_item_append(Evas_Object *edit_object, Change *change, Eina_Bool merg } Eina_Bool +editor_part_item_index_append(Evas_Object *edit_object, Change *change, Eina_Bool merge __UNUSED__, Eina_Bool apply, + const char *part_name, const char *item_name, const char *source_group) +{ + Diff *diff; + Editor_Item event_info; + int count; + + assert(edit_object != NULL); + + count = edje_edit_part_items_count_get(edit_object, part_name); + + if (change) + { + diff = mem_calloc(1, sizeof(Diff)); + diff->redo.type = FUNCTION_TYPE_STRING_STRING_STRING; + diff->redo.function = editor_part_item_index_append; + diff->redo.args.type_sss.s1 = eina_stringshare_add(part_name); + diff->redo.args.type_sss.s2 = eina_stringshare_add(item_name); + diff->redo.args.type_sss.s3 = eina_stringshare_add(source_group); + diff->undo.type = FUNCTION_TYPE_STRING_UINT; + diff->undo.function = editor_part_item_index_del; + diff->undo.args.type_sui.s1 = eina_stringshare_add(part_name); + diff->undo.args.type_sui.ui2 = count; + + change_diff_add(change, diff); + } + if (apply) + { + Edje_Part_Type type = edje_edit_part_type_get(edit_object, part_name); + + CRIT_ON_FAIL(edje_edit_part_item_insert_after_index(edit_object, part_name, item_name, count - 1, source_group)); + if (item_name) + CRIT_ON_FAIL(edje_edit_part_item_index_name_set(edit_object, part_name, count, item_name)); + + if (type == EDJE_PART_TYPE_TABLE) + { + /* fixing incorrect default item position */ + CRIT_ON_FAIL(edje_edit_part_item_index_position_row_set(edit_object, part_name, count, 0)); + CRIT_ON_FAIL(edje_edit_part_item_index_position_col_set(edit_object, part_name, count, 0)); + } + + CRIT_ON_FAIL(editor_save(edit_object)); + _editor_project_changed(); + + event_info.part_name = eina_stringshare_add(part_name); + event_info.item_name = eina_stringshare_add(item_name); + event_info.source = eina_stringshare_add(source_group); + if (!_editor_signals_blocked) + evas_object_smart_callback_call(ap.win, SIGNAL_EDITOR_PART_ITEM_ADDED, (void *)&event_info); + eina_stringshare_del(event_info.part_name); + eina_stringshare_del(event_info.item_name); + eina_stringshare_del(event_info.source); + } + return true; +} + +Eina_Bool editor_part_item_del(Evas_Object *edit_object, Change *change, Eina_Bool merge __UNUSED__, Eina_Bool apply, const char *part_name, const char *item_name) { @@ -1072,6 +1129,58 @@ editor_part_item_del(Evas_Object *edit_object, Change *change, Eina_Bool merge _ } Eina_Bool +editor_part_item_index_del(Evas_Object *edit_object, Change *change, Eina_Bool merge __UNUSED__, Eina_Bool apply, + const char *part_name, unsigned int index) +{ + Diff *diff; + Editor_Item event_info; + Eina_Stringshare *source_group, *item_name; + + assert(edit_object != NULL); + + item_name = edje_edit_part_item_index_name_get(edit_object, part_name, index); + + event_info.part_name = eina_stringshare_add(part_name); + event_info.item_index = index; + if (!_editor_signals_blocked) + { + /* so in here we need to delete part from workspace, groupedit, + all kind of UI part lists since they use original Resource structure, + and only after that we can finally delete it, + so keep those signals in this order please */ + evas_object_smart_callback_call(ap.win, SIGNAL_EDITOR_PART_ITEM_PREDELETED, (void *)&event_info); + evas_object_smart_callback_call(ap.win, SIGNAL_EDITOR_PART_ITEM_DELETED, (void *)&event_info); + } + if (change) + { + source_group = edje_edit_part_item_index_source_get(edit_object, part_name, index); +// if (!editor_part_item_index_reset(edit_object, change, apply, part_name, index)) +// return false; + diff = mem_calloc(1, sizeof(Diff)); + diff->redo.type = FUNCTION_TYPE_STRING_UINT; + diff->redo.function = editor_part_item_index_del; + diff->redo.args.type_sui.s1 = eina_stringshare_add(part_name); + diff->redo.args.type_sui.ui2 = index; + diff->undo.type = FUNCTION_TYPE_STRING_UINT_STRING; + diff->undo.function = editor_part_item_index_append; + diff->undo.args.type_sss.s1 = eina_stringshare_add(part_name); + diff->undo.args.type_sss.s2 = eina_stringshare_add(item_name); + diff->undo.args.type_sss.s3 = eina_stringshare_add(source_group); + + change_diff_add(change, diff); + } + if (apply) + { + CRIT_ON_FAIL(edje_edit_part_item_index_del(edit_object, part_name, index)); + CRIT_ON_FAIL(editor_save(edit_object)); + _editor_project_changed(); + } + eina_stringshare_del(event_info.part_name); + eina_stringshare_del(event_info.item_name); + return true; +} + +Eina_Bool editor_part_reset(Evas_Object *edit_object, Change *change, Eina_Bool apply, const char *part_name) { @@ -1507,6 +1616,90 @@ editor_part_item_restack(Evas_Object *edit_object, Change *change, Eina_Bool mer } Eina_Bool +editor_part_item_index_restack(Evas_Object *edit_object, Change *change, Eina_Bool merge, Eina_Bool apply, + const char *part_name, unsigned int index, unsigned int index_relative, Eina_Bool relative) +{ + Diff *diff; + Editor_Part_Item_Restack event_info; + Change *virtual_change; + Eina_Bool res; + unsigned int count, i; + + assert(edit_object != NULL); + assert(part_name != NULL); + + count = edje_edit_part_items_count_get(edit_object, part_name); + + if (change) + { + diff = mem_calloc(1, sizeof(Diff)); + diff->redo.type = FUNCTION_TYPE_STRING_UINT_UINT; + diff->redo.function = editor_part_item_index_restack; + diff->redo.args.type_suiui.s1 = eina_stringshare_add(part_name); + diff->redo.args.type_suiui.ui2 = index; + diff->redo.args.type_suiui.ui3 = index_relative; + diff->undo.type = FUNCTION_TYPE_STRING_UINT_UINT; + diff->undo.function = editor_part_item_index_restack; + diff->undo.args.type_suiui.s1 = eina_stringshare_add(part_name); + diff->undo.args.type_suiui.ui2 = index; + diff->undo.args.type_suiui.ui3 = index_relative; + if (merge) + change_diff_merge_add(change, diff); + else + change_diff_add(change, diff); + } + + virtual_change = change_add(NULL); + you_shall_not_pass_editor_signals(NULL); + + _part_item_restacking = true; + if (relative) + { + if (index + 1 != index_relative) + { + for(i = count - 1; i > index_relative; i--) + { + if (i == index) continue; + + res = editor_part_item_index_del(edit_object, virtual_change, false, apply, part_name, i); + assert(res); + + if (i == index_relative) break; + } + res = editor_part_item_index_del(edit_object, virtual_change, false, apply, part_name, index); + assert(res); + res = change_undo(edit_object, virtual_change); + assert(res); + } + } + else + { + if (index + 2 < count) + { + res = editor_part_item_index_del(edit_object, virtual_change, false, apply, part_name, index); + assert(res); + res = change_undo(edit_object, virtual_change); + assert(res); + } + } + + _part_item_restacking = false; + you_shall_pass_editor_signals(NULL); + change_free(virtual_change); + + _editor_project_changed(); + if (!_editor_signals_blocked) + { + event_info.part_name = eina_stringshare_add(part_name); + event_info.item_index = index; + event_info.relative_item_index = index_relative; + evas_object_smart_callback_call(ap.win, SIGNAL_EDITOR_PART_ITEM_RESTACKED, &event_info); + eina_stringshare_del(event_info.part_name); + } + return true; +} + +Eina_Bool editor_part_selected_state_set(Evas_Object *edit_object, Change *change, Eina_Bool merge, Eina_Bool apply, const char *part_name, const char *state_name, double state_val) { --