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 { --
