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;
 }

-- 


Reply via email to