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
      {

-- 


Reply via email to