yakov pushed a commit to branch master. http://git.enlightenment.org/tools/erigo.git/commit/?id=44170e5e4011386a65a3a41149f54bfc92d996c6
commit 44170e5e4011386a65a3a41149f54bfc92d996c6 Author: Yakov Goldberg <yako...@samsung.com> Date: Mon Nov 23 16:53:02 2015 +0200 Start implementing Naviframe as drop target --- src/bin/gui/editor.c | 162 ++++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 159 insertions(+), 3 deletions(-) diff --git a/src/bin/gui/editor.c b/src/bin/gui/editor.c index 4dd3d87..db76f15 100644 --- a/src/bin/gui/editor.c +++ b/src/bin/gui/editor.c @@ -71,6 +71,12 @@ typedef struct const char *part; Evas_Coord ox, ow, oy, oh; }; + /* Naviframe packing data. */ + struct + { + Eid *drop_instead_item_obj; + Item_Container_Item *drop_item_cont_item; + }; }; int pointer_x; @@ -1654,6 +1660,7 @@ enum DROP_TO_BOX, DROP_TO_TABLE, DROP_TO_LAYOUT, + DROP_TO_NAVIFRAME, DROP_TO_MAIN }; @@ -1703,6 +1710,10 @@ _drop_target_drop(Gui_Widget *drop_target_wdg, Eo *canvas_drop_target, const cha { drop_to_wdg = DROP_TO_LAYOUT; } + else if (!strcmp(wdg_class_name_get(drop_target_wdg), DB_DEF_NAVIFRAME_CLASS)) + { + drop_to_wdg = DROP_TO_NAVIFRAME; + } else if (IS_MAIN(drop_target_wdg)) { drop_to_wdg = DROP_TO_MAIN; @@ -1841,7 +1852,9 @@ _drop_target_drop(Gui_Widget *drop_target_wdg, Eo *canvas_drop_target, const cha wdg_obj_container_item_remove(drop_target_wdg, cit); wdg_obj_container_item_add(drop_target_wdg, ci, idx); if (eid_is_dummy(di->drop_instead_obj)) - memento_command_add(di->drop_instead_obj, MEMENTO_WIDGET, (void *) (intptr_t) EINA_TRUE, (void *) (intptr_t) EINA_FALSE); + { + memento_command_add(di->drop_instead_obj, MEMENTO_WIDGET, (void *) (intptr_t) EINA_TRUE, (void *) (intptr_t) EINA_FALSE); + } } } else @@ -1874,6 +1887,50 @@ _drop_target_drop(Gui_Widget *drop_target_wdg, Eo *canvas_drop_target, const cha wdg_prop_add((Gui_Widget *) new_wdg, prop); } } + else if (drop_to_wdg == DROP_TO_NAVIFRAME) + { + ERR("implement drop to naviframe"); + if (di->drop_instead_item_obj) + { + Item_Container_Item *wit = di->drop_item_cont_item, *new_wit; + /* Copy item with old property. Property inside item will be ref()ed*/ + new_wit = item_container_item_copy(wit); + /* Create memento. */ + memento_command_add(wdg_eid_get(drop_target_wdg), MEMENTO_ITEM_CONTAINER_ITEM, (void *) wit, new_wit); + + const Gui_Widget_Property *prop = item_container_item_prop_get(wit); + const Gui_Widget_Property *new_prop = prop_copy(prop); + + /* Assign property to item, old property will be unref()ed. */ + item_container_item_prop_set(new_wit, new_prop); + + /* Change item in Dep_Data*/ + item_container_item_set_on_id(item_container_item_eid_get(wit), new_wit); + + Eina_List *values = prop_value_get(new_prop), *itr; + Gui_Value *val; + EINA_LIST_FOREACH(values, itr, val) + { + if ((gui_value_type_get(val) == GUI_TYPE_OBJECT) && + (di->drop_instead_item_obj == EID_ID_GET(val))) + { + ERR("Found val to drop item: %s", eid_name_get(di->drop_instead_item_obj)); + break; + } + } + gui_value_name_id_set(val, GUI_TYPE_OBJECT, wdg_eid_get(new_wdg)); + + if (eid_is_dummy(di->drop_instead_item_obj)) + { + memento_command_add(di->drop_instead_item_obj, MEMENTO_WIDGET, (void *) (intptr_t) EINA_TRUE, (void *) (intptr_t) EINA_FALSE); + } + 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); + } + } + } else if (drop_to_wdg == DROP_TO_BOX) { /* Append content memento to the creation memento (which was created in _editor_factory_wdg_create()) @@ -2144,8 +2201,11 @@ _drop_target_pos(void *data, Eo *obj, Evas_Coord x, Evas_Coord y, Elm_Xdnd_Actio } else { - eo_do(di->eo_cur, efl_gfx_visible_set(EINA_TRUE)); - dnd_drag_window_object_visibility_set(EINA_FALSE); + if (!di->drop_instead_item_obj) + { + eo_do(di->eo_cur, efl_gfx_visible_set(EINA_TRUE)); + dnd_drag_window_object_visibility_set(EINA_FALSE); + } } if (drop_target_wdg && !strcmp(wdg_class_name_get(drop_target_wdg), DB_DEF_BOX_CLASS)) @@ -2439,6 +2499,94 @@ _drop_target_pos(void *data, Eo *obj, Evas_Coord x, Evas_Coord y, Elm_Xdnd_Actio } } } + if (drop_target_wdg && !strcmp(wdg_class_name_get(drop_target_wdg), DB_DEF_NAVIFRAME_CLASS)) + { + /* manually check for part's contents. + * FIXME: DUMMY objects can be changed to dummy widget: the same widget but with dummy_id, + * thus it can be iterated as a child.*/ + Evas_Coord ox, ow, oy, oh; + Eina_Bool repack = EINA_FALSE; + Eid *ieid = NULL; + const Eina_List *items_lst = item_container_item_subitems_get(wdg_item_container_root_get(drop_target_wdg)), *itr; + + /* If dragged object is packed and cursor is in coords of swallow object, + * don't need to check anything*/ + if (di->packed && + ((x >= di->ox) && (x <= di->ox + di->ow)) && + ((y >= di->oy) && (y <= di->oy + di->oh))) + { + return; + } + + /* Detect if cursor is inside swallow object.*/ + Eid *eid_itr; + EINA_LIST_FOREACH(items_lst, itr, eid_itr) + { + 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) + { + ieid = EID_ID_GET(val); + if (!ieid) continue; + Gui_Widget *iw = wdg_get(ieid); + Eo *ieo = session_eo_get(session, iw); + eo_do(ieo, efl_gfx_position_get(&ox, &oy), + efl_gfx_size_get(&ow, &oh)); + if (((x >= ox) && (x <= ox + ow)) && + ((y >= oy) && (y <= oy + oh))) + { + ERR("Found item: %s %p", eid_name_get(ieid), ieid); + break; + } + ox = oy = ow = oh = 0; + ieid = NULL; + } + } + /* If previously found object changed. */ + if (di->drop_instead_item_obj != ieid) + { + di->drop_instead_item_obj = ieid; + di->drop_item_cont_item = item_container_item_get_from_id(eid_itr); + repack = EINA_TRUE; + di->ox = ox; + di->oy = oy; + di->ow = ow; + di->oh = oh; + if (di->packed) + { + di->packed = EINA_FALSE; + } + break; + } + } + + /* If need to repack, iterate over all content, unset original object and set dragged.*/ + if (repack) + { + EINA_LIST_FOREACH(items_lst, itr, eid_itr) + { + 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) + { + ieid = EID_ID_GET(val); + if (ieid == di->drop_instead_item_obj) + { + di->packed = EINA_TRUE; + } + } + } + } + } + } } /*********************************************************/ @@ -2715,6 +2863,14 @@ _widget_add(Gui_Session *session, const Gui_Widget *wdg, void *data EINA_UNUSED) _drop_target_pos, (void *) wdg, _drop_target_drop_cb, (void *) wdg); } + else if (!strcmp(wdg_class_name_get(wdg), DB_DEF_NAVIFRAME_CLASS)) + { + drop_target_wdg_set((Gui_Widget *) wdg, o, + _drop_target_enter, (void *) wdg, + _drop_target_leave, (void *) wdg, + _drop_target_pos, (void *) wdg, + _drop_target_drop_cb, (void *) wdg); + } } else { --