raster pushed a commit to branch master.

http://git.enlightenment.org/core/elementary.git/commit/?id=4bdf40f03900710d16aacee44a0a666766857afc

commit 4bdf40f03900710d16aacee44a0a666766857afc
Author: Amitesh Singh <[email protected]>
Date:   Wed Jul 9 15:09:43 2014 +0900

    gengrid: Added normal reorder type
    
    Summary:
    - Added Elm_Gengrid_Reorder_Type enum
    - Added API elm_gengrid_reorder_type_set()
    - Implemented the normal reorder type animation
    - The old reorder type is changed to ELM_GENGRID_REORDER_TYPE_SWAP.
    - ELM_GENGRID_REORDER_TYPE_NORMAL is the default reorder type.
    
    Test Plan:
    1. elementary_test->"Gengrid Focus"
    2. Enable "Reorder Mode Enable"
    3. Move the items by keys
    
    @feature
    
    Reviewers: raster, seoz
    
    CC: seoz, chinmaya061, aryarockstar
    
    Differential Revision: https://phab.enlightenment.org/D813
---
 src/lib/elm_gengrid.c        | 200 ++++++++++++++++++++++++++++++++++++++++---
 src/lib/elm_gengrid_legacy.h |  19 ++++
 src/lib/elm_widget_gengrid.h |   2 +
 3 files changed, 207 insertions(+), 14 deletions(-)

diff --git a/src/lib/elm_gengrid.c b/src/lib/elm_gengrid.c
index b44f316..26ea778 100644
--- a/src/lib/elm_gengrid.c
+++ b/src/lib/elm_gengrid.c
@@ -2056,6 +2056,26 @@ get_down_item(Elm_Gengrid_Data *sd, Elm_Object_Item *it)
    return next;
 }
 
+typedef struct _Item_Info
+{
+   Elm_Gen_Item *it;
+   Evas_Coord x, y;
+} Item_Info;
+
+typedef struct _Reorder_Normal_Data
+{
+   Item_Info *items;
+   Elm_Gen_Item *corner_item;
+   int no;
+} Reorder_Normal_Data;
+
+static void
+_free_reorder_normal_data(Reorder_Normal_Data *rnd)
+{
+   free(rnd->items);
+   free(rnd);
+}
+
 static void
 _anim_end(Elm_Gengrid_Data *sd)
 {
@@ -2064,8 +2084,34 @@ _anim_end(Elm_Gengrid_Data *sd)
    it1_prev = ELM_GEN_ITEM_FROM_INLIST(EINA_INLIST_GET(sd->reorder.it1)->prev);
    it2_prev = ELM_GEN_ITEM_FROM_INLIST(EINA_INLIST_GET(sd->reorder.it2)->prev);
 
-   if ((!sd->horizontal && ((sd->reorder.dir == ELM_FOCUS_UP) || 
(sd->reorder.dir == ELM_FOCUS_DOWN))) ||
-       (sd->horizontal && ((sd->reorder.dir == ELM_FOCUS_LEFT) || 
(sd->reorder.dir == ELM_FOCUS_RIGHT))))
+   if ((sd->reorder.type == ELM_GENGRID_REORDER_TYPE_NORMAL) &&
+       ((!sd->horizontal && ((sd->reorder.dir == ELM_FOCUS_UP) || 
(sd->reorder.dir == ELM_FOCUS_DOWN))) ||
+       (sd->horizontal && ((sd->reorder.dir == ELM_FOCUS_LEFT) || 
(sd->reorder.dir == ELM_FOCUS_RIGHT)))))
+     {
+        sd->items = eina_inlist_remove(sd->items, 
EINA_INLIST_GET(sd->reorder.it1));
+        if ((sd->reorder.dir == ELM_FOCUS_UP) ||
+            (sd->reorder.dir == ELM_FOCUS_LEFT))
+          {
+             if (it2_prev)
+               {
+                  tmp = eina_inlist_find(sd->items, EINA_INLIST_GET(it2_prev));
+                  sd->items = eina_inlist_append_relative(sd->items, 
EINA_INLIST_GET(sd->reorder.it1),
+                                                          tmp);
+               }
+             else
+               sd->items = eina_inlist_prepend(sd->items, 
EINA_INLIST_GET(sd->reorder.it1));
+          }
+        else if ((sd->reorder.dir == ELM_FOCUS_DOWN) ||
+                 (sd->reorder.dir == ELM_FOCUS_RIGHT))
+          {
+             tmp = eina_inlist_find(sd->items, 
EINA_INLIST_GET(sd->reorder.it2));
+             sd->items = eina_inlist_append_relative(sd->items, 
EINA_INLIST_GET(sd->reorder.it1),
+                                                          tmp);
+          }
+     }
+   else if ((sd->reorder.type == ELM_GENGRID_REORDER_TYPE_SWAP) &&
+            ((!sd->horizontal && ((sd->reorder.dir == ELM_FOCUS_UP) || 
(sd->reorder.dir == ELM_FOCUS_DOWN))) ||
+       (sd->horizontal && ((sd->reorder.dir == ELM_FOCUS_LEFT) || 
(sd->reorder.dir == ELM_FOCUS_RIGHT)))))
      {
         sd->items = eina_inlist_remove(sd->items, 
EINA_INLIST_GET(sd->reorder.it1));
         sd->items = eina_inlist_remove(sd->items, 
EINA_INLIST_GET(sd->reorder.it2));
@@ -2189,18 +2235,37 @@ _item_move_cb(void *data, double pos)
 
    dx = sd->reorder.x2 - sd->reorder.x1;
    dy = sd->reorder.y2 - sd->reorder.y1;
-   xx1 = sd->reorder.x1 + dx * frame;
-   yy1 = sd->reorder.y1 + dy * frame;
+   xx1 = sd->reorder.x1 + (dx * frame);
+   yy1 = sd->reorder.y1 + (dy * frame);
 
-   xx2 = sd->reorder.x2 - dx * frame;
-   yy2 = sd->reorder.y2 - dy * frame;
+   if (sd->reorder.type == ELM_GENGRID_REORDER_TYPE_NORMAL)
+     {
+        int i = 0;
+        Reorder_Normal_Data *rnd = sd->reorder.data;
+
+        for (;i < rnd->no; i++)
+          {
+             dx = rnd->items[i + 1].x - rnd->items[i].x;
+             dy = rnd->items[i + 1].y - rnd->items[i].y;
+             xx2 = rnd->items[i].x + (frame * dx);
+             yy2 = rnd->items[i].y + (frame * dy);
+             evas_object_move(VIEW(rnd->items[i].it), xx2, yy2);
+          }
+     }
+   else if (sd->reorder.type == ELM_GENGRID_REORDER_TYPE_SWAP)
+     {
+        xx2 = sd->reorder.x2 - (dx * frame);
+        yy2 = sd->reorder.y2 - (dy * frame);
+        evas_object_move(VIEW(sd->reorder.it2), xx2, yy2);
+     }
 
    evas_object_move(VIEW(sd->reorder.it1), xx1, yy1);
-   evas_object_move(VIEW(sd->reorder.it2), xx2, yy2);
 
    if (pos == 1.0)
      {
         _anim_end(sd);
+        if (sd->reorder.type == ELM_GENGRID_REORDER_TYPE_NORMAL)
+          _free_reorder_normal_data(sd->reorder.data);
         elm_gengrid_item_show((Elm_Object_Item *)sd->reorder.it1,
                               ELM_GENGRID_ITEM_SCROLLTO_IN);
         evas_object_smart_callback_call(sd->obj, SIG_ITEM_REORDER_START,
@@ -2213,11 +2278,105 @@ _item_move_cb(void *data, double pos)
 }
 
 static void
+_store_nearby_items(Elm_Gengrid_Data *sd)
+{
+   Reorder_Normal_Data *rnd = sd->reorder.data;
+   Eina_Inlist *itr;
+   Evas_Coord x, y, cvw, cvh, col = 0, row = 0;
+   int i = 0;
+   int corner_item_pos = 0;
+   Eina_Inlist *it1_list, *it2_list;
+
+   evas_object_geometry_get(sd->pan_obj, NULL, NULL, &cvw, &cvh);
+
+   rnd->no = abs(sd->reorder.it2->position - sd->reorder.it1->position);
+   rnd->items = malloc(sizeof(Item_Info) * (rnd->no + 1));
+
+  if (sd->horizontal && sd->item_height > 0)
+    {
+       row = cvh / sd->item_height;
+       if (row <= 0) row = 1;
+       if (sd->reorder.dir == ELM_FOCUS_RIGHT)
+         {
+            corner_item_pos = (sd->reorder.it2->position + 1) / row;
+            corner_item_pos = corner_item_pos * row;
+            corner_item_pos = sd->reorder.it2->position - corner_item_pos;
+         }
+       else if (sd->reorder.dir == ELM_FOCUS_LEFT)
+         {
+            corner_item_pos = (sd->reorder.it2->position + 1) / row;
+            corner_item_pos = (corner_item_pos + 1) * row;
+            corner_item_pos = corner_item_pos - sd->reorder.it2->position;
+         }
+    }
+  else if (sd->item_width > 0)
+    {
+       col = cvw / sd->item_width;
+       if (col <= 0) col = 1;
+       if (sd->reorder.dir == ELM_FOCUS_DOWN)
+         {
+            corner_item_pos = (sd->reorder.it2->position + 1) / col;
+            corner_item_pos = corner_item_pos * col;
+            corner_item_pos = sd->reorder.it2->position - corner_item_pos;
+         }
+       else if (sd->reorder.dir == ELM_FOCUS_UP)
+         {
+            corner_item_pos = (sd->reorder.it2->position + 1) / col;
+            corner_item_pos = (corner_item_pos + 1) * col;
+            corner_item_pos = corner_item_pos - sd->reorder.it2->position;
+         }
+    }
+
+  it1_list = eina_inlist_find(sd->items, EINA_INLIST_GET(sd->reorder.it1));
+  it2_list = eina_inlist_find(sd->items, EINA_INLIST_GET(sd->reorder.it2));
+
+  if ((sd->reorder.it1->position) < (sd->reorder.it2)->position)
+    {
+       for (itr = it2_list; itr != it1_list; itr = itr->prev)
+         {
+            Elm_Gen_Item *cur = EINA_INLIST_CONTAINER_GET(itr, Elm_Gen_Item);
+            evas_object_geometry_get(VIEW(cur), &x, &y, NULL, NULL);
+            rnd->items[i].it = cur;
+            rnd->items[i].x = x;
+            rnd->items[i].y = y;
+            if (i == (corner_item_pos - 1))
+              rnd->corner_item = cur;
+            i++;
+         }
+       rnd->items[i].it = sd->reorder.it1;
+       rnd->items[i].x = sd->reorder.x1;
+       rnd->items[i].y = sd->reorder.y1;
+    }
+  else if (sd->reorder.it1->position > sd->reorder.it2->position)
+    {
+       for (itr = it2_list; itr != it1_list; itr = itr->next)
+         {
+            Elm_Gen_Item *cur = EINA_INLIST_CONTAINER_GET(itr, Elm_Gen_Item);
+            evas_object_geometry_get(VIEW(cur), &x, &y, NULL, NULL);
+            rnd->items[i].it = cur;
+            rnd->items[i].x = x;
+            rnd->items[i].y = y;
+            if (i == (corner_item_pos - 1))
+              rnd->corner_item = cur;
+            i++;
+         }
+       rnd->items[i].it = sd->reorder.it1;
+       rnd->items[i].x = sd->reorder.x1;
+       rnd->items[i].y = sd->reorder.y1;
+    }
+}
+
+static void
 _swap_items(Elm_Gen_Item *it1, Elm_Gen_Item *it2, Elm_Focus_Direction dir)
 {
    ELM_GENGRID_DATA_GET(WIDGET(it1), sd);
    Evas_Coord xx1, yy1, xx2, yy2;
 
+   sd->reorder.running = EINA_TRUE;
+   sd->reorder.dir = dir;
+   sd->reorder.it1 = it1;
+   sd->reorder.it2 = it2;
+
    evas_object_geometry_get(VIEW(it1), &xx1, &yy1, NULL, NULL);
    evas_object_geometry_get(VIEW(it2), &xx2, &yy2, NULL, NULL);
    sd->reorder.x1 = xx1;
@@ -2225,13 +2384,16 @@ _swap_items(Elm_Gen_Item *it1, Elm_Gen_Item *it2, 
Elm_Focus_Direction dir)
    sd->reorder.x2 = xx2;
    sd->reorder.y2 = yy2;
 
-   sd->reorder.running = EINA_TRUE;
-   sd->reorder.dir = dir;
-   sd->reorder.it1 = it1;
-   sd->reorder.it2 = it2;
-
-   evas_object_raise(VIEW(it2));
-   evas_object_stack_above(VIEW(it1), VIEW(it2));
+   if (sd->reorder.type == ELM_GENGRID_REORDER_TYPE_NORMAL)
+     {
+        Reorder_Normal_Data *rnd = malloc(sizeof(Reorder_Normal_Data));
+        memset(rnd, 0, sizeof(Reorder_Normal_Data));
+        sd->reorder.data = rnd;
+        _store_nearby_items(sd);
+        if (rnd->corner_item)
+          evas_object_raise(VIEW(rnd->corner_item));
+     }
+   evas_object_raise(VIEW(it1));
    evas_object_smart_callback_call(sd->obj, SIG_ITEM_REORDER_STOP,
                                    sd->reorder.it1);
    //TODO: Add elm config for time
@@ -4008,6 +4170,7 @@ elm_gengrid_reorder_mode_start(Evas_Object *obj, 
Ecore_Pos_Map tween_mode)
 
    sd->reorder_mode = EINA_TRUE;
    sd->reorder.tween_mode = tween_mode;
+   sd->reorder.type = ELM_GENGRID_REORDER_TYPE_NORMAL;
 }
 
 EAPI void
@@ -4020,6 +4183,15 @@ elm_gengrid_reorder_mode_stop(Evas_Object *obj)
    sd->reorder.tween_mode = -1;
 }
 
+EAPI void
+elm_gengrid_reorder_type_set(Evas_Object *obj, Elm_Gengrid_Reorder_Type type)
+{
+   ELM_GENGRID_CHECK(obj);
+   ELM_GENGRID_DATA_GET(obj, sd);
+
+   sd->reorder.type = type;
+}
+
 EOLIAN static void
 _elm_gengrid_reorder_mode_set(Eo *obj EINA_UNUSED, Elm_Gengrid_Data *sd, 
Eina_Bool reorder_mode)
 {
diff --git a/src/lib/elm_gengrid_legacy.h b/src/lib/elm_gengrid_legacy.h
index 3b4ce69..6c2602d 100644
--- a/src/lib/elm_gengrid_legacy.h
+++ b/src/lib/elm_gengrid_legacy.h
@@ -211,6 +211,12 @@ EINA_DEPRECATED EAPI void          
elm_gengrid_last_page_get(const Evas_Object *
  */
 EINA_DEPRECATED EAPI void          elm_gengrid_page_bring_in(const Evas_Object 
*obj, int h_pagenumber, int v_pagenumber);
 
+typedef enum _Elm_Gengrid_Reorder_Type
+{
+   ELM_GENGRID_REORDER_TYPE_NORMAL,
+   ELM_GENGRID_REORDER_TYPE_SWAP
+} Elm_Gengrid_Reorder_Type;
+
 /**
  * Enable the gengrid widget mode reordered with keys
  *
@@ -237,4 +243,17 @@ EAPI void                        
elm_gengrid_reorder_mode_start(Evas_Object *obj
  */
 EAPI void                        elm_gengrid_reorder_mode_stop(Evas_Object 
*obj);
 
+/**
+ * Set the reorder type
+ *
+ * @param obj The gengrid object
+ * @param type Elm_Gengrid_Reorder_Type value
+ *
+ * @see Elm_Gengrid_Reorder_Type
+ * @since 1.10
+ *
+ * @ingroup Gengrid
+ */
+EAPI void                        elm_gengrid_reorder_type_set(Evas_Object 
*obj, Elm_Gengrid_Reorder_Type type);
+
 #include "elm_gengrid.eo.legacy.h"
diff --git a/src/lib/elm_widget_gengrid.h b/src/lib/elm_widget_gengrid.h
index a44d0fc..a2b94c2 100644
--- a/src/lib/elm_widget_gengrid.h
+++ b/src/lib/elm_widget_gengrid.h
@@ -77,9 +77,11 @@ struct _Elm_Gengrid_Data
    struct
    {
       Elm_Gen_Item                          *it1, *it2; /**< The items which 
are getting swapped */
+      void                                  *data; /**< This is the data used 
to store information related to animation */
       Elm_Focus_Direction                   dir; /**< focus key direction */
       Ecore_Pos_Map                         tween_mode; /**< Position mappings 
for animation */
       Evas_Coord                            x1, y1, x2, y2; /**< Coordinates 
of it1 and it2 */
+      Elm_Gengrid_Reorder_Type              type; /**< Reorder type */
       Eina_Bool                             running : 1; /**< animation is 
happening */
    } reorder;
 

-- 


Reply via email to