edje: preserve drag information to.
authorcedric <cedric>
Mon, 14 May 2012 11:18:45 +0000 (11:18 +0000)
committercedric <cedric@7cbeb6ba-43b4-40fd-8cce-4c39aea84d33>
Mon, 14 May 2012 11:18:45 +0000 (11:18 +0000)
git-svn-id: http://svn.enlightenment.org/svn/e/trunk/edje@70997 7cbeb6ba-43b4-40fd-8cce-4c39aea84d33

ChangeLog
NEWS
src/lib/edje_load.c

index 5fc6a4d..927365b 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
 
        * Preserve user box and table items during call of edje_object_file_set.
 
-2012-04-30  Rajeev Ranjan (Rajeev)
+2012-05-12  Rajeev Ranjan (Rajeev)
 
        * Add edje_cc optimization to remove alpha channel flag from images
         with absolutely no alpha in them if marked as havin alpha in the
         originals
 
+2012-05-14  Cedric Bail
+
+       * Preserve drag informations during call of edje_object_file_set.
diff --git a/NEWS b/NEWS
index b6c1965..575c01d 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -15,7 +15,7 @@ Fixes:
     * Add missing files in the tarballs.
     * Prevent crash when running nested edje_object_signal_emit with edje_object_signal_callback_{add,del}.
     * Do actually verify that the file on disk is different from the file we have loaded.
-    * Preserve user bix and table items during call of edje_object_file_set.
+    * Preserve user drag, box and table information during call of edje_object_file_set.
 
 Edje 1.2.0
 
index 1b89a8b..e6f4cce 100644 (file)
@@ -11,6 +11,19 @@ struct _Edje_Table_Items
    unsigned short rowspan;
 };
 
+typedef struct _Edje_Drag_Items Edje_Drag_Items;
+struct _Edje_Drag_Items
+{
+   const char *part;
+   FLOAT_T x, y, w, h;
+   struct {
+      FLOAT_T x, y;
+   } step;
+   struct {
+      FLOAT_T x, y;
+   } page;
+};
+
 #ifdef EDJE_PROGRAM_CACHE
 static Eina_Bool  _edje_collection_free_prog_cache_matches_free_cb(const Eina_Hash *hash, const void *key, void *data, void *fdata);
 #endif
@@ -20,6 +33,7 @@ static void _cb_signal_repeat(void *data, Evas_Object *obj, const char *signal,
 static Eina_List *_edje_swallows_collect(Edje *ed);
 static Eina_List *_edje_box_items_collect(Edje *ed);
 static Eina_List *_edje_table_items_collect(Edje *ed);
+static Eina_List *_edje_drag_collect(Edje *ed);
 
 /************************** API Routines **************************/
 
@@ -296,6 +310,7 @@ _edje_object_file_set_internal(Evas_Object *obj, const char *file, const char *g
    Eina_List *old_swallows;
    Eina_List *old_table_items;
    Eina_List *old_box_items;
+   Eina_List *old_drag;
    unsigned int n;
    Eina_List *parts = NULL;
    int group_path_started = 0;
@@ -321,6 +336,7 @@ _edje_object_file_set_internal(Evas_Object *obj, const char *file, const char *g
    old_swallows = _edje_swallows_collect(ed);
    old_table_items = _edje_table_items_collect(ed);
    old_box_items = _edje_box_items_collect(ed);
+   old_drag = _edje_drag_collect(ed);
 
    if (_edje_script_only(ed)) _edje_script_only_shutdown(ed);
    if (_edje_lua_script_only(ed)) _edje_lua_script_only_shutdown(ed);
@@ -894,6 +910,37 @@ _edje_object_file_set_internal(Evas_Object *obj, const char *file, const char *g
                     }
                }
 
+             if (old_drag)
+               {
+                  Edje_Drag_Items *drag;
+
+                  EINA_LIST_FREE(old_drag, drag)
+                    {
+                       Edje_Real_Part *drp;
+
+                       fprintf(stderr, "trying to restore drag on '%s'\n", drag->part);
+                       drp = _edje_real_part_recursive_get(ed, drag->part);
+                       if (!drp || !drp->drag) goto next;
+
+                       fprintf(stderr, "VAL [%f, %f]\n", drag->x, drag->y);
+                       drp->drag->val.x = drag->x;
+                       drp->drag->val.y = drag->y;
+                       drp->drag->size.x = drag->w;
+                       drp->drag->size.y = drag->h;
+                       /* drp->drag->step.x = drag->step.x; */
+                       /* drp->drag->step.y = drag->step.y; */
+                       drp->drag->page.x = drag->page.x;
+                       drp->drag->page.y = drag->page.y;
+
+                       _edje_dragable_pos_set(drp->edje, drp, drp->drag->val.x, drp->drag->val.y);
+                       _edje_emit(drp->edje, "drag,set", drp->part->name);
+
+                    next:
+                       eina_stringshare_del(drag->part);
+                       free(drag);
+                    }
+               }
+
             _edje_recalc(ed);
             _edje_thaw(ed);
             _edje_unblock(ed);
@@ -1055,6 +1102,40 @@ _edje_box_items_collect(Edje *ed)
    return items;
 }
 
+static Eina_List *
+_edje_drag_collect(Edje *ed)
+{
+   Eina_List *items = NULL;
+   unsigned int i;
+
+   if (!ed->file || !ed->table_parts) return NULL;
+   for (i = 0; i < ed->table_parts_size; i++)
+     {
+        Edje_Real_Part *rp;
+        Edje_Drag_Items *drag;
+
+        rp = ed->table_parts[i];        
+        if (!rp->drag) continue ;
+
+        drag = calloc(1, sizeof (Edje_Drag_Items));
+        if (!drag) continue;
+
+        drag->part = eina_stringshare_add(rp->part->name);
+        drag->x = rp->drag->val.x;
+        drag->y = rp->drag->val.y;
+        drag->w = rp->drag->size.x;
+        drag->h = rp->drag->size.y;
+        drag->step.x = rp->drag->step.x;
+        drag->step.y = rp->drag->step.y;
+        drag->page.x = rp->drag->page.x;
+        drag->page.y = rp->drag->page.y;
+
+        items = eina_list_append(items, drag);
+     }
+
+   return items;
+}
+
 void
 _edje_file_del(Edje *ed)
 {