jackdanielz pushed a commit to branch master.

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

commit 16ffdd349b2d598c9f12c25c6c0a2c2ae8a73d94
Author: Daniel Zaoui <daniel.za...@samsung.com>
Date:   Sun Nov 8 14:09:02 2015 +0200

    Objtree: more refactor due to latest changes
    
    Now that the reload is not done on every action, objtree build is no
    more needed.
    Insertion has now got to determine the item position in the list.
---
 src/bin/gui/editor.c  |  22 ++-------
 src/bin/gui/objtree.c | 127 +++++++++++++++++++++++++++++++-------------------
 src/bin/gui/objtree.h |  11 +++--
 src/lib/gui_widget.c  |  17 +++++++
 src/lib/gui_widget.h  |   3 ++
 5 files changed, 107 insertions(+), 73 deletions(-)

diff --git a/src/bin/gui/editor.c b/src/bin/gui/editor.c
index e98b1f3..4a7d683 100644
--- a/src/bin/gui/editor.c
+++ b/src/bin/gui/editor.c
@@ -165,14 +165,14 @@ Eina_Bool
 widget_name_change(Gui_Widget *wdg, const char *str)
 {
    const Gui_Context *ctx = wdg_context_get(wdg);
-   if (!eid_rename(wdg_eid_get(wdg), str))
+   if (strcmp(wdg_name_get(wdg), str) && !eid_rename(wdg_eid_get(wdg), str))
      {
         ERR("Name \"%s\" already exists!", str);
         return EINA_FALSE;
      }
 
    const Gui_Widget *sel  = gui_context_data_get(ctx, SELECTED_WDG);
-   objtree_build();
+   objtree_item_refresh(wdg);
    objtree_item_selected_set(sel);
 
    return EINA_TRUE;
@@ -1907,7 +1907,6 @@ end:
    if (new_wdg)
      {
         _editor_wdg_selected_set(new_wdg);
-        objtree_build();
         objtree_item_selected_set(new_wdg);
      }
 
@@ -2431,7 +2430,6 @@ _dragdone_post_cb(Eina_Bool accept, const Eo *wdg_eo, 
const Gui_Widget *drag_sta
         eo_do(g->main_win->toolbar_undo_it, 
elm_wdg_item_disabled_set(context_can_undo(ctx) ? EINA_FALSE : EINA_TRUE));
 
         _editor_wdg_selected_set(drag_wdg);
-        objtree_build();
         objtree_item_selected_set(drag_wdg);
 
         _dragged_wdg = NULL;
@@ -2667,6 +2665,7 @@ _widget_add(Gui_Session *session, const Gui_Widget *wdg, 
void *data EINA_UNUSED)
         elm_theme_free(theme);
      }
 
+   objtree_item_add(wdg);
    return EINA_TRUE;
 }
 
@@ -2782,7 +2781,6 @@ __undo_no_update(const Gui_Context *ctx)
                    /* If old_property == NULL, need to reload widget. */
                    else
                      {
-                        objtree_build();
                         objtree_item_selected_set(wdg);
                      }
                    if (op_desc)
@@ -2928,7 +2926,6 @@ _editor_undo_redo_post(const Memento *memento)
                 {
                    proplayout_view_switch(CONTENT_TYPE);
                    _editor_wdg_selected_set(memento_wdg);
-                   objtree_build();
                    objtree_item_selected_set(memento_wdg);
                    break;
                 }
@@ -2948,7 +2945,6 @@ _editor_undo_redo_post(const Memento *memento)
                    if (memento_wdg)
                      {
                         _editor_wdg_selected_set(memento_wdg);
-                        objtree_build();
                         objtree_item_selected_set(memento_wdg);
                      }
                    break;
@@ -3042,7 +3038,6 @@ _editor_redo(const Gui_Context *ctx)
                      }
                    else
                      {
-                        objtree_build();
                         objtree_item_selected_set(wdg);
                      }
                    if (op_desc)
@@ -3205,7 +3200,6 @@ _editor_ctx_call(const Gui_Context *ctx)
     * So need to hide border. */
    _editor_wdg_selected_set(NULL);
    proplayout_build(NULL);
-   objtree_build();
    objtree_item_selected_set(NULL);
 
    return EINA_TRUE;
@@ -3236,7 +3230,6 @@ _editor_selected_wdg_del_cb()
 
    /* Set selected widget: t.e. if I delete button, box will be selected after.
     * If I delete window, main item will be selected. */
-//   objtree_build();
 //   objtree_item_selected_set(parent_wdg);
 //   _editor_wdg_selected_set(parent_wdg);
    context_memento_finalize(ctx);
@@ -3476,7 +3469,6 @@ _prop_update_from_propview(void *data EINA_UNUSED, Eo 
*obj, const Eo_Event_Descr
      {
         proplayout_build(NULL);
         _editor_wdg_selected_set(wdg);
-        objtree_build();
         objtree_item_selected_set(wdg);
      }
 #if 0
@@ -3524,7 +3516,6 @@ _drop_property_cb(void *data, Evas_Object *obj, void 
*event_info EINA_UNUSED)
              wdg_prop_remove((Gui_Widget *) wdg, (Gui_Widget_Property *) prop);
              proplayout_build(NULL);
              _editor_wdg_selected_set(wdg);
-             objtree_build();
              objtree_item_selected_set(wdg);
           }
      }
@@ -3634,7 +3625,6 @@ _field_update_from_itemview(void *data EINA_UNUSED, Eo 
*obj, const Eo_Event_Desc
              /* Reloading all window. */
              proplayout_build(NULL);
              _editor_wdg_selected_set(wdg);
-             objtree_build();
              objtree_item_selected_set(wdg);
              itemview_item_selected_set(new_wit);
           }
@@ -3853,7 +3843,6 @@ _itemview_item_do_(unsigned int type)
      {
         proplayout_build(NULL);
         _editor_wdg_selected_set(wdg);
-        objtree_build();
         objtree_item_selected_set(wdg);
         itemview_item_selected_set(it);
      }
@@ -3899,7 +3888,6 @@ _content_del_from_propview(void *data, Eo *obj 
EINA_UNUSED, const Eo_Event_Descr
    wdg_obj_container_item_remove(wdg, ci);
    /* Reload window when unpacking something. */
    _editor_wdg_selected_set(wdg);
-   objtree_build();
    objtree_item_selected_set(wdg);
 
    context_memento_finalize(ctx);
@@ -3935,7 +3923,6 @@ _content_reorder_from_propview(void *data, Eo *obj 
EINA_UNUSED, const Eo_Event_D
 
              /* Update propview. */
              _editor_wdg_selected_set(wdg);
-             objtree_build();
              objtree_item_selected_set(wdg);
           }
         obj_container_unref(_old_container);
@@ -4064,7 +4051,6 @@ _content_change_from_propview(void *data EINA_UNUSED, Eo 
*obj, const Eo_Event_De
              wdg_obj_container_item_add((Gui_Widget *) wdg, ci, 
pfd->it_data->idx);
 
              _editor_wdg_selected_set(wdg);
-             objtree_build();
              objtree_item_selected_set(wdg);
           }
 
@@ -4093,7 +4079,6 @@ _content_change_from_propview(void *data EINA_UNUSED, Eo 
*obj, const Eo_Event_De
                    * Check ToDo. */
                   _wdg_parent_win_reload(wdg);
                   _editor_wdg_selected_set(wdg);
-                  objtree_build();
                   objtree_item_selected_set(wdg);
                }
           }
@@ -4159,7 +4144,6 @@ _content_change_from_propview(void *data EINA_UNUSED, Eo 
*obj, const Eo_Event_De
 
              /* Update propview. */
              _editor_wdg_selected_set(wdg);
-             objtree_build();
              objtree_item_selected_set(wdg);
           }
      }
diff --git a/src/bin/gui/objtree.c b/src/bin/gui/objtree.c
index 33e3484..2e84f48 100644
--- a/src/bin/gui/objtree.c
+++ b/src/bin/gui/objtree.c
@@ -28,6 +28,13 @@ _item_label_get(void *data, Evas_Object *obj EINA_UNUSED, 
const char *part)
    return NULL;
 }
 
+void
+objtree_item_refresh(const Gui_Widget *wdg)
+{
+   Elm_Object_Item *item = wdg_data_get(wdg, DATA_ITEM);
+   if (item) elm_genlist_item_update(item);
+}
+
 static Eina_Bool
 _wdg_has_real_children(const Gui_Widget *wdg)
 {
@@ -56,20 +63,6 @@ _item_content_get(void *data, Evas_Object *obj, const char 
*part)
    return ic;
 }
 
-static void
-_expand_request_cb(void *data EINA_UNUSED, Evas_Object *o EINA_UNUSED, void 
*event_info)
-{
-   Elm_Object_Item *glit = event_info;
-   elm_genlist_item_expanded_set(glit, EINA_TRUE);
-}
-
-static void
-_contract_request_cb(void *data EINA_UNUSED, Evas_Object *o EINA_UNUSED, void 
*event_info)
-{
-   Elm_Object_Item *glit = event_info;
-   elm_genlist_item_expanded_set(glit, EINA_FALSE);
-}
-
 static Elm_Object_Item *
 _item_realize(Eid *eid)
 {
@@ -87,12 +80,28 @@ _item_realize(Eid *eid)
      }
 
    item = wdg_data_get(wdg, DATA_ITEM);
-   if (!item)
+   if (!item && (!parent || parent_item))
      {
-        if (!parent || parent_item)
-           item = elm_genlist_item_append(lst, _itc, wdg, parent_item,
-                 (_wdg_has_real_children(wdg)) ? ELM_GENLIST_ITEM_TREE : 
ELM_GENLIST_ITEM_NONE,
-                 _view_cbs->item_selection_cb_func, NULL);
+        const Gui_Widget *prev_wdg = wdg;
+        Eid *prev_id = eid;
+        do
+          {
+             prev_wdg = wdg_prev_get(prev_wdg);
+             if (prev_wdg) prev_id = wdg_eid_get(prev_wdg);
+          }
+        while(prev_wdg && (eid_is_dummy(prev_id) || !eid_exists(prev_id)));
+        Elm_Object_Item *prev_item = prev_wdg ? wdg_data_get(prev_wdg, 
DATA_ITEM) : NULL;
+        Elm_Genlist_Item_Type type = (_wdg_has_real_children(wdg)) ? 
ELM_GENLIST_ITEM_TREE : ELM_GENLIST_ITEM_NONE;
+        if (prev_item)
+          {
+             item = elm_genlist_item_insert_after(lst, _itc, wdg, parent_item, 
prev_item,
+                   type, _view_cbs->item_selection_cb_func, NULL);
+          }
+        else
+          {
+             item = elm_genlist_item_prepend(lst, _itc, wdg, parent_item,
+                   type, _view_cbs->item_selection_cb_func, NULL);
+          }
         wdg_data_set(wdg, DATA_ITEM, item);
      }
 
@@ -100,8 +109,24 @@ _item_realize(Eid *eid)
 }
 
 static void
-_item_expand(Gui_Widget *wdg)
+_expand_request_cb(void *data EINA_UNUSED, Evas_Object *o EINA_UNUSED, void 
*event_info)
+{
+   Elm_Object_Item *glit = event_info;
+   elm_genlist_item_expanded_set(glit, EINA_TRUE);
+}
+
+static void
+_contract_request_cb(void *data EINA_UNUSED, Evas_Object *o EINA_UNUSED, void 
*event_info)
 {
+   Elm_Object_Item *glit = event_info;
+   elm_genlist_item_expanded_set(glit, EINA_FALSE);
+}
+
+static void
+_expanded_cb(void *data EINA_UNUSED, Evas_Object *o EINA_UNUSED, void 
*event_info)
+{
+   Elm_Object_Item *glit = event_info;
+   Gui_Widget *wdg = elm_object_item_data_get(glit);
    Eid *wid;
    const Eina_List *itr;
 
@@ -114,14 +139,6 @@ _item_expand(Gui_Widget *wdg)
 }
 
 static void
-_expanded_cb(void *data EINA_UNUSED, Evas_Object *o EINA_UNUSED, void 
*event_info)
-{
-   Elm_Object_Item *glit = event_info;
-   Gui_Widget *wdg = elm_object_item_data_get(glit);
-   _item_expand(wdg);
-}
-
-static void
 _contracted_cb(void *data EINA_UNUSED, Evas_Object *o EINA_UNUSED, void 
*event_info)
 {
    Elm_Object_Item *glit = event_info;
@@ -169,14 +186,9 @@ _useless_items_check(Eid *wid)
    return EINA_TRUE;
 }
 
-/* Filter function to be called, when Filter entry is changed. */
 static void
-_filter_entry_changed_cb(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, 
void *event_info EINA_UNUSED)
+_build()
 {
-   const char *str = elm_entry_entry_get(filter_entry);
-   //Trim from left
-   while (*str == ' ') str++;
-   _filter = strlen(str) ? str : NULL;
    if (_filter)
      {
         const Eina_List *itr;
@@ -194,7 +206,26 @@ _filter_entry_changed_cb(void *data EINA_UNUSED, 
Evas_Object *obj EINA_UNUSED, v
           }
      }
    else
-      objtree_build();
+     {
+        const Eina_List *itr;
+        Eid *eid;
+        EINA_LIST_FOREACH(gui_context_main_widgets_get(_active_ctx), itr, eid)
+          {
+             if (eid_is_dummy(eid) || !eid_exists(eid)) continue;
+             _item_realize(eid);
+          }
+     }
+}
+
+/* Filter function to be called, when Filter entry is changed. */
+static void
+_filter_entry_changed_cb(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, 
void *event_info EINA_UNUSED)
+{
+   const char *str = elm_entry_entry_get(filter_entry);
+   //Trim from left
+   while (*str == ' ') str++;
+   _filter = strlen(str) ? str : NULL;
+   _build();
 }
 
 /** Assign visible list to logical one.
@@ -248,22 +279,19 @@ objtree_item_selected_set(const Gui_Widget *wdg)
    elm_genlist_item_selected_set(item, EINA_TRUE);
 }
 
-/* Call this function when it is needed to rebuild objtree.
- * In cases like: repacking object, undo/redo.
- * */
 void
-objtree_build()
+objtree_item_add(const Gui_Widget *wdg)
 {
-   if (_filter) _filter_entry_changed_cb(NULL, NULL, NULL);
-   else
+   if (!wdg) return;
+   Eid *eid = wdg_eid_get(wdg);
+   if (eid_is_dummy(eid) || !eid_exists(eid)) return;
+   const Gui_Widget *parent = wdg_parent_get(wdg);
+   Elm_Object_Item *parent_item = parent ? wdg_data_get(parent, DATA_ITEM) : 
NULL;
+   if (!parent || parent_item)
      {
-        const Eina_List *itr;
-        Eid *eid;
-        EINA_LIST_FOREACH(gui_context_main_widgets_get(_active_ctx), itr, eid)
-          {
-             if (eid_is_dummy(eid) || !eid_exists(eid)) continue;
-             _item_realize(eid);
-          }
+        if (parent_item && elm_genlist_item_type_get(parent_item) != 
ELM_GENLIST_ITEM_TREE)
+           objtree_item_remove(parent);
+        _item_realize(wdg_eid_get(wdg));
      }
 }
 
@@ -291,5 +319,6 @@ objtree_context_set(const Gui_Context *ctx)
    _active_ctx = ctx;
    if (!ctx) return;
 
-   objtree_build();
+   elm_genlist_clear(lst);
+   _build();
 }
diff --git a/src/bin/gui/objtree.h b/src/bin/gui/objtree.h
index d5e8cd2..3abd8a7 100644
--- a/src/bin/gui/objtree.h
+++ b/src/bin/gui/objtree.h
@@ -23,21 +23,22 @@ objtree_init();
 void
 objtree_shutdown();
 
+void
+objtree_item_refresh(const Gui_Widget *wdg);
+
 /* Assign context to objtree view.
  * Set active context for objtree view. */
 void
 objtree_context_set(const Gui_Context *ctx);
 
-/* Currentrly func is used to invoke building of objtree
- * when filter string is changed. */
-void
-objtree_build(void);
-
 /* Set list's item, which corresponds to wdg, selected.
  * (Called when click on widget in layout.)*/
 void
 objtree_item_selected_set(const Gui_Widget *wdg);
 
+void
+objtree_item_add(const Gui_Widget *wdg);
+
 /* Remove an item */
 void
 objtree_item_remove(const Gui_Widget *wdg);
diff --git a/src/lib/gui_widget.c b/src/lib/gui_widget.c
index 501db7b..ab94dd7 100644
--- a/src/lib/gui_widget.c
+++ b/src/lib/gui_widget.c
@@ -1221,6 +1221,23 @@ wdg_find_by_eo(const Gui_Session *session, const 
Gui_Context *ctx, Eo *eo)
    return NULL;
 }
 
+const Gui_Widget *
+wdg_prev_get(const Gui_Widget *wdg)
+{
+   if (!wdg) return NULL;
+   const Gui_Widget *parent = wdg_parent_get(wdg);
+   Eid *cid, *prev_id = NULL, *wid = wdg_eid_get(wdg);
+   const Eina_List *itr, *lst;
+   if (!parent) lst = gui_context_main_widgets_get(wdg_context_get(wdg));
+   else lst = wdg_children_list_get(parent);
+   EINA_LIST_FOREACH(lst, itr, cid)
+     {
+        if (cid == wid) return wdg_get(prev_id);
+        prev_id = cid;
+     }
+   return NULL;
+}
+
 const Gui_Context *
 wdg_context_get(const Gui_Widget *wdg)
 {
diff --git a/src/lib/gui_widget.h b/src/lib/gui_widget.h
index b48e532..edf72ec 100644
--- a/src/lib/gui_widget.h
+++ b/src/lib/gui_widget.h
@@ -351,6 +351,9 @@ wdg_first_find(const Gui_Context *ctx, const char 
*wdg_name);
 Gui_Widget *
 wdg_find_by_eo(const Gui_Session *session, const Gui_Context *ctx, Eo *eo);
 
+const Gui_Widget *
+wdg_prev_get(const Gui_Widget *wdg);
+
 /* Get context by widget. */
 const Gui_Context *
 wdg_context_get(const Gui_Widget *wdg);

-- 


Reply via email to