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