yakov pushed a commit to branch master.

http://git.enlightenment.org/tools/erigo.git/commit/?id=b81de27d139edafa82d9c0db48bd2afe81154424

commit b81de27d139edafa82d9c0db48bd2afe81154424
Author: Yakov Goldberg <yako...@samsung.com>
Date:   Wed Feb 11 17:20:04 2015 +0200

    Add items reordering in itemview
---
 src/bin/egui_gui/editor.c         | 42 +++++++++++++++++---
 src/bin/egui_gui/egui_layout.json | 84 ++++++++++++++++++++++++++++++++++++---
 src/bin/egui_gui/itemview.c       | 18 ++++++++-
 src/bin/egui_gui/itemview.h       |  4 +-
 src/bin/egui_gui/objtree.c        |  1 +
 src/lib/gui_widget.c              | 33 +++++++++++++++
 src/lib/gui_widget.h              |  3 ++
 7 files changed, 172 insertions(+), 13 deletions(-)

diff --git a/src/bin/egui_gui/editor.c b/src/bin/egui_gui/editor.c
index 429a9bf..eb2fcf2 100644
--- a/src/bin/egui_gui/editor.c
+++ b/src/bin/egui_gui/editor.c
@@ -3645,6 +3645,7 @@ _itemview_item_selected(void *data EINA_UNUSED, 
Evas_Object *obj EINA_UNUSED, vo
 static Eina_Bool
 _itemview_item_do_(unsigned int type)
 {
+   Eina_Bool reload = EINA_TRUE;
    static int i = -1;
    i++;
    Item_Container_Item *wit = NULL, *parent_it = NULL;
@@ -3744,6 +3745,25 @@ _itemview_item_do_(unsigned int type)
 
         item_container_item_set_on_id(item_container_item_eid_get(parent_it), 
new_parent_item);
      }
+   else if (type == ITEM_MOVE_UP || (type == ITEM_MOVE_DOWN))
+     {
+        if (!wit) return EINA_FALSE;
+        parent_it = (Item_Container_Item *) 
item_container_item_parent_item_get(wit);
+
+        new_parent_item = item_container_item_copy(parent_it);
+
+        /* Ref old parent it, because it will be unreffed in _set_on_id() */
+        item_container_item_ref(parent_it);
+        item_container_item_set_on_id(item_container_item_eid_get(parent_it), 
new_parent_item);
+
+        intptr_t dir = (type == ITEM_MOVE_UP) ? UP : DOWN;
+        if ((reload = item_container_item_reorder(wit, dir)))
+          {
+             Gui_Memento *memento = gui_memento_new(wdg_eid_get(wdg), 
MEMENTO_ITEM_CONTAINER_ITEM, parent_it, new_parent_item);
+             gui_context_memento_add((Gui_Context *) ctx, memento);
+          }
+        item_container_item_unref(parent_it);
+     }
 
    /* Adding item to widget and parent item
     * If some item is selected and we add item, we add it after. */
@@ -3767,14 +3787,24 @@ _itemview_item_do_(unsigned int type)
                                     item_container_item_eid_get(it));
               break;
            }
+      case ITEM_MOVE_UP:
+      case ITEM_MOVE_DOWN:
+           {
+              break;
+           }
+      default:
+         ERR("case - default");
      }
 
-   _wdg_parent_win_reload(wdg);
-   proplayout_build(NULL);
-   _editor_wdg_selected_set(wdg);
-   objtree_build(ctx);
-   objtree_item_selected_set(wdg);
-   itemview_item_selected_set(it);
+   if (reload)
+     {
+        _wdg_parent_win_reload(wdg);
+        proplayout_build(NULL);
+        _editor_wdg_selected_set(wdg);
+        objtree_build(ctx);
+        objtree_item_selected_set(wdg);
+        itemview_item_selected_set(it);
+     }
 
    return EO_CALLBACK_CONTINUE;
 }
diff --git a/src/bin/egui_gui/egui_layout.json 
b/src/bin/egui_gui/egui_layout.json
index 7eded62..fd9b7e2 100644
--- a/src/bin/egui_gui/egui_layout.json
+++ b/src/bin/egui_gui/egui_layout.json
@@ -33,7 +33,9 @@
       "_proplayout_toolbar_clicked":"_proplayout_toolbar_clicked",
       "_contentview_up_btn_clicked":"_contentview_up_btn_clicked",
       "_contentview_down_btn_clicked":"_contentview_down_btn_clicked",
-      "_contentview_del_btn_clicked":"_contentview_del_btn_clicked"
+      "_contentview_del_btn_clicked":"_contentview_del_btn_clicked",
+      "_itemview_up_btn_clicked":"_itemview_up_btn_clicked",
+      "_itemview_down_btn_clicked":"_itemview_down_btn_clicked"
     }
   },
   "Widgets":
@@ -2940,7 +2942,7 @@
         "Evas.Object.size_hint_weight":[1, 0],
         "Evas.Object.size_hint_align":[-1, 0]
       },
-      "Contains":["itemview_add_item_but", "itemview_add_item_nested_but", 
"itemview_add_separator_but", "itemview_del_item_but"]
+      "Contains":["itemview_add_item_but", "itemview_add_item_nested_but", 
"itemview_add_separator_but", "itemview_up_btn", "itemview_down_btn", 
"itemview_del_item_but"]
     },
     "itemview_add_item_but":
     {
@@ -3004,14 +3006,56 @@
       },
       "Properties":
       {
-        "Elm_Widget.part_text":[null, "Delete Item"],
-        "Evas.Object.visibility":[true]
+        "Evas.Object.visibility":[true],
+        "Elm_Widget.part_text":[null, "X"]
       },
       "Callbacks":
       {
         "clicked":["Invoke", "_itemview_item_del_but_clicked_cb", null]
       }
     },
+    "itemview_up_btn":
+    {
+      "Desc":
+      {
+        "parent":"itemview_buttons_box",
+        "class":"Elm_Button"
+      },
+      "Properties":
+      {
+        "Evas.Object.visibility":[true],
+        "Evas.Object.size":[73, 30]
+      },
+      "Callbacks":
+      {
+        "clicked":["Invoke", "_itemview_up_btn_clicked", null]
+      },
+      "Contains":
+      {
+        "itemview_up_btn_icon":[null]
+      }
+    },
+    "itemview_down_btn":
+    {
+      "Desc":
+      {
+        "parent":"itemview_buttons_box",
+        "class":"Elm_Button"
+      },
+      "Properties":
+      {
+        "Evas.Object.visibility":[true],
+        "Evas.Object.size":[73, 30]
+      },
+      "Callbacks":
+      {
+        "clicked":["Invoke", "_itemview_down_btn_clicked", null]
+      },
+      "Contains":
+      {
+        "itemview_down_btn_icon":[null]
+      }
+    },
     "contentview_up_btn_icon":
     {
       "Desc":
@@ -3071,6 +3115,36 @@
         "Evas.Object.size":[40, 40],
         "Efl.File.file":["move_down_icon", null]
       }
+    },
+    "itemview_up_btn_icon":
+    {
+      "Desc":
+      {
+        "parent":"itemview_up_btn",
+        "class":"Elm_Icon"
+      },
+      "Properties":
+      {
+        "Evas.Object.size_hint_weight":[1, 1],
+        "Evas.Object.visibility":[true],
+        "Evas.Object.size":[40, 40],
+        "Efl.File.file":["move_up_icon", null]
+      }
+    },
+    "itemview_down_btn_icon":
+    {
+      "Desc":
+      {
+        "parent":"itemview_down_btn",
+        "class":"Elm_Icon"
+      },
+      "Properties":
+      {
+        "Evas.Object.size_hint_weight":[1, 1],
+        "Evas.Object.visibility":[true],
+        "Evas.Object.size":[40, 40],
+        "Efl.File.file":["move_down_icon", null]
+      }
     }
   }
- }
+ }
\ No newline at end of file
diff --git a/src/bin/egui_gui/itemview.c b/src/bin/egui_gui/itemview.c
index 0949ccb..cb02400 100644
--- a/src/bin/egui_gui/itemview.c
+++ b/src/bin/egui_gui/itemview.c
@@ -361,7 +361,7 @@ _itemview_separator_add_but_clicked_cb(void *data 
EINA_UNUSED, Eo *obj EINA_UNUS
    return EO_CALLBACK_CONTINUE;
 }
 
-/* This callback is called, when "Delete Item" button is pressed. */
+/* This callback is called, when "X" - delete item button is pressed. */
 Eina_Bool
 _itemview_item_del_but_clicked_cb(void *data EINA_UNUSED, Eo *obj EINA_UNUSED, 
const Eo_Event_Description *desc EINA_UNUSED, void *event_info EINA_UNUSED)
 {
@@ -369,3 +369,19 @@ _itemview_item_del_but_clicked_cb(void *data EINA_UNUSED, 
Eo *obj EINA_UNUSED, c
    return EO_CALLBACK_CONTINUE;
 }
 
+/* This callback is called, when "move up" button is pressed. */
+Eina_Bool
+_itemview_up_btn_clicked(void *data EINA_UNUSED, Eo *obj EINA_UNUSED, const 
Eo_Event_Description *desc EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+   _view_cbs->_itemview_item_do_(ITEM_MOVE_UP);
+   return EO_CALLBACK_CONTINUE;
+}
+
+/* This callback is called, when "move down" button is pressed. */
+Eina_Bool
+_itemview_down_btn_clicked(void *data EINA_UNUSED, Eo *obj EINA_UNUSED, const 
Eo_Event_Description *desc EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+   _view_cbs->_itemview_item_do_(ITEM_MOVE_DOWN);
+   return EO_CALLBACK_CONTINUE;
+}
+
diff --git a/src/bin/egui_gui/itemview.h b/src/bin/egui_gui/itemview.h
index 403646c..b716172 100644
--- a/src/bin/egui_gui/itemview.h
+++ b/src/bin/egui_gui/itemview.h
@@ -17,7 +17,9 @@ enum
    ITEM_ADD,
    ITEM_ADD_NESTED,
    SEPARATOR_ADD,
-   ITEM_DELETE
+   ITEM_DELETE,
+   ITEM_MOVE_UP,
+   ITEM_MOVE_DOWN
 };
 
 void
diff --git a/src/bin/egui_gui/objtree.c b/src/bin/egui_gui/objtree.c
index 1f22730..42556f4 100644
--- a/src/bin/egui_gui/objtree.c
+++ b/src/bin/egui_gui/objtree.c
@@ -232,6 +232,7 @@ objtree_item_selected_set(const Gui_Widget *wdg)
    /* If filter was active, need to drop filter and clear open items hash. */
    if (_objtree_filter_entry_string_get())
      {
+        ERR("strane but we are here");
         objtree_filtering_reset();
         elm_genlist_clear(lst);
         _item_expand(NULL, NULL);
diff --git a/src/lib/gui_widget.c b/src/lib/gui_widget.c
index 92c1104..27c9cba 100644
--- a/src/lib/gui_widget.c
+++ b/src/lib/gui_widget.c
@@ -1976,6 +1976,39 @@ _item_container_item_add(Gui_Widget *wdg, 
Item_Container_Item *parent_item, Item
    parent_item->items = eina_list_append_relative(parent_item->items, (void *) 
(uintptr_t) item->eid, (void *) (uintptr_t) eid_after);
 }
 
+Eina_Bool
+item_container_item_reorder(const Item_Container_Item *item, intptr_t dir)
+{
+   EINA_SAFETY_ON_NULL_RETURN_VAL(item, EINA_FALSE);
+
+   Eid *parent_item_id = item->parent_item_id;
+   Item_Container_Item *parent_item = 
item_container_item_get_from_id(parent_item_id);
+
+   /* If there is less then one item in list, nothing can be reordered */
+   if (eina_list_count(parent_item->items) <= 1) return EINA_FALSE;
+
+   /* Check if item is first/last according to direction */
+   if (((dir == UP) && (item->eid == (void *) 
eina_list_data_get(parent_item->items))) ||
+       ((dir == DOWN) && (item->eid == (void *) 
eina_list_data_get(eina_list_last(parent_item->items)))))
+     return EINA_FALSE;
+
+   Eid *eid_after = 0;
+   if (dir == UP)
+     {
+        eid_after = 
eina_list_data_get(eina_list_prev(eina_list_data_find_list(parent_item->items, 
item->eid)));
+        parent_item->items = eina_list_remove(parent_item->items, item->eid);
+        parent_item->items = eina_list_prepend_relative(parent_item->items, 
item->eid, eid_after);
+     }
+   else
+     {
+        eid_after = 
eina_list_data_get(eina_list_next(eina_list_data_find_list(parent_item->items, 
item->eid)));
+        parent_item->items = eina_list_remove(parent_item->items, item->eid);
+        parent_item->items = eina_list_append_relative(parent_item->items, 
item->eid, eid_after);
+     }
+
+   return EINA_TRUE;
+}
+
 /* Add item to widget.
  * If parent_item is NULL, item will be added to Widget. */
 Eina_Bool
diff --git a/src/lib/gui_widget.h b/src/lib/gui_widget.h
index 2b5a9d9..1880ed1 100644
--- a/src/lib/gui_widget.h
+++ b/src/lib/gui_widget.h
@@ -563,6 +563,9 @@ item_container_item_parent_item_get(const 
Item_Container_Item *item);
 Eid *
 item_container_item_parent_item_id_get(const Item_Container_Item *item);
 
+Eina_Bool
+item_container_item_reorder(const Item_Container_Item *item, intptr_t dir);
+
 
/******************************************************************************/
 /* Property functions */
 

-- 


Reply via email to