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)
 {

-- 


Reply via email to