cedric pushed a commit to branch master. http://git.enlightenment.org/core/elementary.git/commit/?id=d195270b6415c165f842f4f3debba8f0fc43525d
commit d195270b6415c165f842f4f3debba8f0fc43525d Author: Jee-Yong Um <[email protected]> Date: Fri Feb 5 07:47:31 2016 +0100 hoversel: improve key_action_move to handle disabled items Summary: Existing key_action_move logic used elm_widget_focus_cycle on hover, but only handled the first and last item to move focus circularly. So if the first or last item is disabled, focus movement is blocked. This patch makes hoversel handle focus movement by itself to handle disabled item better. Test Plan: elementary_test -to hoversel Reviewers: Hermet, cedric, Jaehyun Differential Revision: https://phab.enlightenment.org/D3640 Signed-off-by: Cedric BAIL <[email protected]> --- src/lib/elc_hoversel.c | 84 ++++++++++++++++++++++++++------------------------ 1 file changed, 44 insertions(+), 40 deletions(-) diff --git a/src/lib/elc_hoversel.c b/src/lib/elc_hoversel.c index b089f4f..370d2d3 100644 --- a/src/lib/elc_hoversel.c +++ b/src/lib/elc_hoversel.c @@ -848,63 +848,67 @@ item_focused_get(Elm_Hoversel_Data *sd) } static Eina_Bool +item_focused_set(Elm_Object_Item *eo_item, Eina_Bool focus) +{ + ELM_HOVERSEL_ITEM_DATA_GET(eo_item, item); + if (elm_object_disabled_get(VIEW(item))) + return EINA_FALSE; + elm_object_focus_set(VIEW(item), focus); + return EINA_TRUE; +} + +static Eina_Bool _key_action_move(Evas_Object *obj, const char *params) { + Eina_List *l; + Elm_Object_Item *focused_item, *eo_item; + Eina_Bool ret, next = EINA_FALSE; + ELM_HOVERSEL_DATA_GET(obj, sd); const char *dir = params; - Elm_Object_Item *eo_litem, *eo_fitem; - eo_litem = eina_list_last_data_get(sd->items); - eo_fitem = eina_list_data_get(sd->items); - _elm_widget_focus_auto_show(obj); - if (!strcmp(dir, "down")) + if (!strcmp(dir, "down") || !strcmp(dir, "right")) { - if ((!sd->horizontal) && - (item_focused_get(sd) == eo_litem)) + focused_item = item_focused_get(sd); + EINA_LIST_FOREACH(sd->items, l, eo_item) { - ELM_HOVERSEL_ITEM_DATA_GET(eo_fitem, fitem); - elm_object_focus_set(VIEW(fitem), EINA_TRUE); - return EINA_TRUE; + if (next) + { + ret = item_focused_set(eo_item, EINA_TRUE); + if (ret) return EINA_TRUE; + } + if (eo_item == focused_item) next = EINA_TRUE; } - elm_widget_focus_cycle(sd->hover, ELM_FOCUS_DOWN); - return EINA_TRUE; - } - else if (!strcmp(dir, "up")) - { - if ((!sd->horizontal) && - (item_focused_get(sd) == eo_fitem)) + EINA_LIST_FOREACH(sd->items, l, eo_item) { - ELM_HOVERSEL_ITEM_DATA_GET(eo_litem, litem); - elm_object_focus_set(VIEW(litem), EINA_TRUE); - return EINA_TRUE; + if (eo_item == focused_item) return EINA_FALSE; + + ret = item_focused_set(eo_item, EINA_TRUE); + if (ret) return EINA_TRUE; } - elm_widget_focus_cycle(sd->hover, ELM_FOCUS_UP); - return EINA_TRUE; + return EINA_FALSE; } - else if (!strcmp(dir, "left")) + else if (!strcmp(dir, "up") || !strcmp(dir, "left")) { - if (sd->horizontal && - (item_focused_get(sd) == eo_fitem)) + focused_item = item_focused_get(sd); + EINA_LIST_REVERSE_FOREACH(sd->items, l, eo_item) { - ELM_HOVERSEL_ITEM_DATA_GET(eo_litem, litem); - elm_object_focus_set(VIEW(litem), EINA_TRUE); - return EINA_TRUE; + if (next) + { + ret = item_focused_set(eo_item, EINA_TRUE); + if (ret) return EINA_TRUE; + } + if (eo_item == focused_item) next = EINA_TRUE; } - elm_widget_focus_cycle(sd->hover, ELM_FOCUS_LEFT); - return EINA_TRUE; - } - else if (!strcmp(dir, "right")) - { - if (sd->horizontal && - (item_focused_get(sd) == eo_litem)) + EINA_LIST_REVERSE_FOREACH(sd->items, l, eo_item) { - ELM_HOVERSEL_ITEM_DATA_GET(eo_fitem, fitem); - elm_object_focus_set(VIEW(fitem), EINA_TRUE); - return EINA_TRUE; + if (eo_item == focused_item) return EINA_FALSE; + + ret = item_focused_set(eo_item, EINA_TRUE); + if (ret) return EINA_TRUE; } - elm_widget_focus_cycle(sd->hover, ELM_FOCUS_RIGHT); - return EINA_TRUE; + return EINA_FALSE; } else return EINA_FALSE; } --
