yakov pushed a commit to branch master.

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

commit 6bb54bddd18b3c4648b63c86952b80bb8f073828
Author: Yakov Goldberg <yako...@samsung.com>
Date:   Thu Nov 26 11:30:31 2015 +0200

    Refactoring wdg_parent_container_eid_get()
    
    Now this function checks if requested widget is packed into its parent,
    and returns parent eid.
---
 src/bin/gui/editor.c |  4 ---
 src/lib/gui_widget.c | 79 +++++++++++++++++++++++++++++++++++++---------------
 src/lib/gui_widget.h |  3 --
 3 files changed, 57 insertions(+), 29 deletions(-)

diff --git a/src/bin/gui/editor.c b/src/bin/gui/editor.c
index 7a05058..328042e 100644
--- a/src/bin/gui/editor.c
+++ b/src/bin/gui/editor.c
@@ -1922,7 +1922,6 @@ _drop_target_drop(Gui_Widget *drop_target_wdg, Eo 
*canvas_drop_target, const cha
              else
                {
                   wdg_parent_set(wdg_get(di->drop_instead_item_obj), 
wdg_name_get(wdg_main_wdg_get(drop_target_wdg)));
-                  
wdg_parent_container_eid_set(wdg_get(di->drop_instead_item_obj), NULL);
                }
           }
      }
@@ -3708,7 +3707,6 @@ _field_update_from_itemview(void *data EINA_UNUSED, Eo 
*obj, const Eo_Event_Desc
                     }
                   memento_command_add(wdg_eid_get(w), MEMENTO_WIDGET_PARENT, 
wdg_eid_get(wdg_parent_get(w)), wdg_eid_get(wdg));
                   wdg_parent_set(w, wdg_name_get(wdg));
-                  wdg_parent_container_eid_set(w, wdg_eid_get(wdg));
                }
           }
         /* If old_value is some widget, set main_obj as it's parent. */
@@ -3719,7 +3717,6 @@ _field_update_from_itemview(void *data EINA_UNUSED, Eo 
*obj, const Eo_Event_Desc
                   Eid *old_name_id = 
gui_context_eid_get_by_name(_active_context_get(), old_value);
                   Gui_Widget *w = wdg_get(old_name_id);
                   wdg_parent_set(w, wdg_name_get(wdg_main_wdg_get(wdg)));
-                  wdg_parent_container_eid_set(w, NULL);
                }
           }
         objtree_item_selected_set(wdg);
@@ -4242,7 +4239,6 @@ _content_change_from_propview(void *data EINA_UNUSED, Eo 
*obj, const Eo_Event_De
 
                             memento_command_add(wdg_eid_get(new_param_wdg), 
MEMENTO_WIDGET_PARENT, wdg_eid_get(prev_wdg_container), 
wdg_eid_get(wdg_main_wdg_get(prev_wdg_container)));
                             wdg_parent_set(new_param_wdg, 
wdg_name_get(wdg_main_wdg_get(prev_wdg_container)));
-                            wdg_parent_container_eid_set(new_param_wdg, NULL);
                          }
                     }
                }
diff --git a/src/lib/gui_widget.c b/src/lib/gui_widget.c
index a917e03..9f67ac4 100644
--- a/src/lib/gui_widget.c
+++ b/src/lib/gui_widget.c
@@ -1373,7 +1373,18 @@ wdg_copy(const Gui_Widget *src, Eid *dest_id, Eina_Bool 
full)
 Container_Type
 wdg_container_type_get(const Gui_Widget *wdg)
 {
-   Container_Desc *c_desc = db_container_desc_get(wdg_class_name_get(wdg));
+   const char *wdg_class_name = wdg_class_name_get(wdg);
+   /* Try to get Container Description from class itself.*/
+   Container_Desc *c_desc = db_container_desc_get(wdg_class_name);
+   /* If it doesn't work, take last class in inheritance list. */
+   if (!c_desc)
+     {
+        Eina_List *lst = db_class_inherit_containers_list_get(wdg_class_name);
+        if (!lst) return NOT_CONTAINER;
+        const char *cont_name = eina_list_data_get(eina_list_last(lst));
+        c_desc = db_container_desc_get(cont_name);
+     }
+
    if (c_desc)
      {
         const Op_Desc *op_pack = db_container_desc_op_desc_get(c_desc, 
CONTAINER_PACK);
@@ -1818,18 +1829,58 @@ wdg_data_get(const Gui_Widget *wdg, const char *key)
 
 /************************************************************/
 
-void
-wdg_parent_container_eid_set(Gui_Widget *wdg, Eid *eid)
+static Eina_Bool
+_item_container_items_iterate(const Item_Container_Item *item, Eid 
*wdg_eid_search)
 {
-   EINA_SAFETY_ON_NULL_RETURN(wdg);
-   wdg->parent_container_id = eid;
+   const Eina_List *items_lst = item_container_item_subitems_get(item), *itr;
+   /* Detect if cursor is inside swallow object.*/
+   Eid *eid_itr;
+   EINA_LIST_FOREACH(items_lst, itr, eid_itr)
+     {
+        const Item_Container_Item *cit = 
item_container_item_get_from_id(eid_itr);
+        const Gui_Widget_Property *prop = item_container_item_prop_get(cit);
+        Eina_List *values = prop_value_get(prop), *itr2;
+        Gui_Value *val;
+        EINA_LIST_FOREACH(values, itr2, val)
+          {
+             if (gui_value_type_get(val) == GUI_TYPE_OBJECT)
+               {
+                  if (wdg_eid_search == EID_ID_GET(val))
+                    {
+                       return EINA_TRUE;
+                    }
+               }
+          }
+        Eina_Bool found = _item_container_items_iterate(cit, wdg_eid_search);
+        if (found) return EINA_TRUE;
+     }
+   return EINA_FALSE;
 }
 
 Eid *
 wdg_parent_container_eid_get(const Gui_Widget *wdg)
 {
    EINA_SAFETY_ON_NULL_RETURN_VAL(wdg, 0);
-   return wdg->parent_container_id;
+   Container_Type c_type;
+   const Gui_Widget *wdg_parent = wdg_parent_get(wdg);
+   if (!wdg_parent) return NULL;
+   c_type = wdg_container_type_get(wdg_parent);
+
+   if (c_type == NOT_CONTAINER) return NULL;
+   if (c_type == OBJ_CONTAINER)
+     {
+        if (wdg_obj_container_item_get(wdg_parent, -1, wdg_name_get(wdg)))
+          return wdg_eid_get(wdg_parent);
+     }
+   else
+     {
+        Eid *wdg_eid = wdg_eid_get(wdg);
+        const Item_Container_Item *root_item = 
wdg_item_container_root_get(wdg_parent);
+        if (_item_container_items_iterate(root_item, wdg_eid))
+          return wdg_eid_get(wdg_parent);
+     }
+
+   return NULL;
 }
 
 Object_Container_Item *
@@ -1930,7 +1981,6 @@ wdg_obj_container_item_add(const Gui_Widget *wdg, 
Object_Container_Item *ci, int
 
    Eid *eid = obj_container_item_eid_get(ci);
    Gui_Widget *w = wdg_get(eid);
-   wdg_parent_container_eid_set(w, wdg_eid_get(wdg));
    if (w && wdg_parent_get(w))
      {
         wdg_parent_set(w, wdg_name_get(wdg));
@@ -1967,7 +2017,6 @@ wdg_obj_container_item_remove(const Gui_Widget *wdg, 
Object_Container_Item *ci)
      {
         const Gui_Widget *parent_win = wdg_main_wdg_get(w);
         wdg_parent_set(w, wdg_name_get(parent_win));
-        wdg_parent_container_eid_set(w, 0);
      }
 }
 
@@ -2417,20 +2466,6 @@ Eina_Bool
 wdg_item_insert_after(Gui_Widget *wdg, Item_Container_Item *parent_item, 
Item_Container_Item *after, Item_Container_Item *item)
 {
    _item_container_item_add(wdg, parent_item, after, item);
-
-   const Gui_Widget_Property *prop = item_container_item_prop_get(item);
-   Eina_List *values = prop_value_get(prop), *itr;
-   Gui_Value *val;
-   Eid *weid = NULL;
-   EINA_LIST_FOREACH(values, itr, val)
-     {
-        if (gui_value_type_get(val) == GUI_TYPE_OBJECT)
-          {
-             weid = EID_ID_GET(val);
-             if (weid)
-               wdg_parent_container_eid_set(wdg_get(weid), wdg_eid_get(wdg));
-          }
-     }
    return EINA_TRUE;
 }
 
diff --git a/src/lib/gui_widget.h b/src/lib/gui_widget.h
index 1062a2c..6974f96 100644
--- a/src/lib/gui_widget.h
+++ b/src/lib/gui_widget.h
@@ -504,9 +504,6 @@ wdg_obj_container_item_remove(const Gui_Widget *wdg, 
Object_Container_Item *ci);
 void
 wdg_obj_container_item_remove_all(const Gui_Widget *wdg);
 
-void
-wdg_parent_container_eid_set(Gui_Widget *wdg, Eid *eid);
-
 Eid *
 wdg_parent_container_eid_get(const Gui_Widget *wdg);
 

-- 


Reply via email to