bu5hm4n pushed a commit to branch master.

http://git.enlightenment.org/core/efl.git/commit/?id=65feeb1b0bf64dc07413df0043d0aa5a43b1d6c4

commit 65feeb1b0bf64dc07413df0043d0aa5a43b1d6c4
Author: Marcel Hollerbach <[email protected]>
Date:   Wed Jun 28 15:10:14 2017 +0200

    elm_gengrid: refactor reorder mode
    
    Its breaking the logic down into 3 little functions that could be reused
    later. Overall this reduces the code duplication
---
 src/lib/elementary/elm_gengrid.c | 122 ++++++++++++++++++++-------------------
 1 file changed, 62 insertions(+), 60 deletions(-)

diff --git a/src/lib/elementary/elm_gengrid.c b/src/lib/elementary/elm_gengrid.c
index edcc031128..7886e8c80f 100644
--- a/src/lib/elementary/elm_gengrid.c
+++ b/src/lib/elementary/elm_gengrid.c
@@ -3339,6 +3339,64 @@ _item_horizontal_loop(Evas_Object *obj, 
Elm_Focus_Direction dir)
    return EINA_FALSE;
 }
 
+/*
+ * transform the focus direction so it can be used for deciding in which 
direction to go on the internal data structure
+ * This is respecting the horizontal
+ */
+
+static Elm_Focus_Direction
+_direction_transform_horizontal(Elm_Gengrid_Data *sd, Elm_Focus_Direction dir)
+{
+   if (!sd->horizontal) return dir;
+
+   switch(dir){
+      case ELM_FOCUS_DOWN: return ELM_FOCUS_RIGHT;
+      case ELM_FOCUS_UP: return ELM_FOCUS_LEFT;
+      case ELM_FOCUS_RIGHT: return ELM_FOCUS_DOWN;
+      case ELM_FOCUS_LEFT: return ELM_FOCUS_UP;
+      default: break;
+   }
+   ERR("unhandled transform case");
+   return dir;
+}
+
+static Elm_Object_Item*
+_get_neighbor(Elm_Gengrid_Data *sd, Elm_Object_Item *item, Elm_Focus_Direction 
dir)
+{
+   Elm_Focus_Direction access_dir = _direction_transform_horizontal(sd, dir);
+
+   switch(access_dir){
+      case ELM_FOCUS_DOWN: return get_down_item(sd, item);
+      case ELM_FOCUS_UP: return get_up_item(sd, item);
+      case ELM_FOCUS_RIGHT: return elm_gengrid_item_next_get(item);
+      case ELM_FOCUS_LEFT: return elm_gengrid_item_prev_get(item);
+      default: break;
+   }
+
+   return NULL;
+}
+
+static Eina_Bool
+_reorder_helper(Elm_Gengrid_Data *sd, Elm_Focus_Direction dir)
+{
+   Elm_Object_Item *neighbor;
+
+   if (_elm_gengrid_item_edge_check(sd->focused_item, dir))
+     {
+        if ((dir == ELM_FOCUS_LEFT || dir == ELM_FOCUS_RIGHT) && 
sd->item_loop_enable)
+          return EINA_TRUE;
+        return EINA_FALSE;
+     }
+
+   neighbor = _get_neighbor(sd, sd->focused_item, dir);
+
+   if (!neighbor) return EINA_FALSE;
+
+   _swap_items(sd->focused_item, neighbor, dir);
+
+   return EINA_TRUE;
+}
+
 static Eina_Bool
 _key_action_move(Evas_Object *obj, const char *params)
 {
@@ -3369,23 +3427,7 @@ _key_action_move(Evas_Object *obj, const char *params)
      {
         if (sd->reorder_mode)
           {
-             Elm_Object_Item *eo_left;
-
-             if (_elm_gengrid_item_edge_check(sd->focused_item, 
ELM_FOCUS_LEFT))
-               {
-                  if (sd->item_loop_enable)
-                    return EINA_TRUE;
-                  return EINA_FALSE;
-               }
-             if (!sd->horizontal)
-               eo_left = elm_gengrid_item_prev_get(sd->focused_item);
-             else
-               eo_left = get_up_item(sd, sd->focused_item);
-             if (!eo_left)
-               return EINA_TRUE;
-             _swap_items(sd->focused_item, eo_left, ELM_FOCUS_LEFT);
-
-             return EINA_TRUE;
+             return _reorder_helper(sd, ELM_FOCUS_LEFT);
           }
         else
           {
@@ -3467,23 +3509,7 @@ _key_action_move(Evas_Object *obj, const char *params)
      {
         if (sd->reorder_mode)
           {
-             Elm_Object_Item *eo_right;
-
-             if (_elm_gengrid_item_edge_check(sd->focused_item, 
ELM_FOCUS_RIGHT))
-               {
-                  if (sd->item_loop_enable)
-                    return EINA_TRUE;
-                  return EINA_FALSE;
-               }
-             if (!sd->horizontal)
-               eo_right = elm_gengrid_item_next_get(sd->focused_item);
-             else
-               eo_right = get_down_item(sd, sd->focused_item);
-             if (!eo_right)
-               return EINA_TRUE;
-             _swap_items(sd->focused_item, eo_right, ELM_FOCUS_RIGHT);
-
-             return EINA_TRUE;
+             return _reorder_helper(sd, ELM_FOCUS_RIGHT);
           }
         else
           {
@@ -3563,19 +3589,7 @@ _key_action_move(Evas_Object *obj, const char *params)
      {
         if (sd->reorder_mode)
           {
-             Elm_Object_Item *eo_up;
-
-             if (_elm_gengrid_item_edge_check(sd->focused_item, ELM_FOCUS_UP))
-               return EINA_FALSE;
-             if (!sd->horizontal)
-               eo_up = get_up_item(sd, sd->focused_item);
-             else
-               eo_up = elm_gengrid_item_prev_get(sd->focused_item);
-             if (!eo_up)
-               return EINA_TRUE;
-             _swap_items(sd->focused_item, eo_up, ELM_FOCUS_UP);
-
-             return EINA_TRUE;
+             return _reorder_helper(sd, ELM_FOCUS_UP);
           }
         else
           {
@@ -3639,19 +3653,7 @@ _key_action_move(Evas_Object *obj, const char *params)
      {
         if (sd->reorder_mode)
           {
-             Elm_Object_Item *eo_down;
-
-             if (_elm_gengrid_item_edge_check(sd->focused_item, 
ELM_FOCUS_DOWN))
-               return EINA_FALSE;
-             if (!sd->horizontal)
-               eo_down = get_down_item(sd, sd->focused_item);
-             else
-               eo_down = elm_gengrid_item_next_get(sd->focused_item);
-             if (!eo_down)
-               return EINA_TRUE;
-             _swap_items(sd->focused_item, eo_down, ELM_FOCUS_DOWN);
-
-             return EINA_TRUE;
+             return _reorder_helper(sd, ELM_FOCUS_DOWN);
           }
         else
           {

-- 


Reply via email to