bu5hm4n pushed a commit to branch master.

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

commit b0568570936f1a2048e62c6dcde5f7e4ffb9d1a9
Author: Marcel Hollerbach <[email protected]>
Date:   Thu Dec 22 00:28:24 2016 +0100

    focus: update object definition
    
    Summary: This introduces a new focus system and the migration to this 
system.
    
    Test Plan: run elementary_test
    
    Reviewers: cedric
    
    Differential Revision: https://phab.enlightenment.org/D4511
---
 src/lib/elementary/elm_toolbar.c        | 192 +++++++++++++++-----------------
 src/lib/elementary/elm_toolbar.eo       |   1 +
 src/lib/elementary/elm_toolbar_item.eo  |   5 +-
 src/lib/elementary/elm_widget_toolbar.h |   1 +
 4 files changed, 97 insertions(+), 102 deletions(-)

diff --git a/src/lib/elementary/elm_toolbar.c b/src/lib/elementary/elm_toolbar.c
index 4505e24..1b15924 100644
--- a/src/lib/elementary/elm_toolbar.c
+++ b/src/lib/elementary/elm_toolbar.c
@@ -54,17 +54,70 @@ static const Evas_Smart_Cb_Description _smart_callbacks[] = 
{
 };
 
 static Eina_Bool _key_action_select(Evas_Object *obj, const char *params);
-static Eina_Bool _key_action_move(Evas_Object *obj, const char *params);
 static void _sizing_eval(Evas_Object *obj);
 
 static const Elm_Action key_actions[] = {
    {"select", _key_action_select},
-   {"move", _key_action_move},
    {NULL, NULL}
 };
 
 static void _item_select(Elm_Toolbar_Item_Data *it);
 
+static void
+_item_focus_eval(Elm_Toolbar_Item_Data *pd)
+{
+   Eina_Bool want = EINA_TRUE;
+   Efl_Ui_Focus_Object *widget;
+   Efl_Ui_Focus_Manager *manager;
+
+   if (elm_wdg_item_disabled_get(pd->base->eo_obj))
+     want = EINA_FALSE;
+
+   if (!evas_object_visible_get(VIEW(pd)))
+     want = EINA_FALSE;
+
+   if (!!pd->registered == !!want) return;
+
+   //grab manager from widget
+   widget = WIDGET(pd);
+   manager = efl_ui_focus_user_manager_get(widget);
+
+   if (want)
+     {
+        efl_ui_focus_manager_register(manager, EO_OBJ(pd), widget, NULL);
+        pd->registered = manager;
+     }
+   else
+     {
+        efl_ui_focus_manager_unregister(manager, EO_OBJ(pd));
+        pd->registered = NULL;
+     }
+
+}
+
+static void
+_item_focus_eval_all(Elm_Toolbar *obj, Elm_Toolbar_Data *pd)
+{
+   Elm_Toolbar_Item_Data *it;
+   Elm_Widget_Smart_Data *wpd;
+   Eina_List *order = NULL;
+
+   wpd = efl_data_scope_get(obj, ELM_WIDGET_CLASS);
+   EINA_INLIST_FOREACH(pd->items, it)
+     {
+        _item_focus_eval(it);
+        order = eina_list_append(order, EO_OBJ(it));
+     }
+
+   if (pd->more_item)
+     {
+        _item_focus_eval(pd->more_item);
+        order = eina_list_append(order, EO_OBJ(pd->more_item));
+     }
+
+   efl_ui_focus_manager_update_order(wpd->focus.manager, obj, order);
+}
+
 static int
 _toolbar_item_prio_compare_cb(const void *i1,
                               const void *i2)
@@ -594,6 +647,8 @@ _resize_job(void *data)
    eina_list_free(list);
 
    _mirrored_set(obj, elm_widget_mirrored_get(obj));
+
+   _item_focus_eval_all(obj, sd);
 }
 
 static void
@@ -781,47 +836,6 @@ _elm_toolbar_elm_widget_on_focus(Eo *obj, Elm_Toolbar_Data 
*sd, Elm_Object_Item
    return EINA_TRUE;
 }
 
-static Elm_Toolbar_Item_Data *
-_focus_next_item_get(Evas_Object *obj, Eina_Bool reverse)
-{
-   ELM_TOOLBAR_DATA_GET(obj, sd);
-   Eina_List *list = NULL, *children_list;
-   Elm_Toolbar_Item_Data *it = NULL;
-   Evas_Object *it_obj = NULL;
-
-   children_list = evas_object_box_children_get(sd->bx);
-   if (reverse)
-     children_list = eina_list_reverse(children_list);
-   list = children_list;
-   if (sd->focused_item)
-     {
-        ELM_TOOLBAR_ITEM_DATA_GET(sd->focused_item, focus_it);
-        list = eina_list_data_find_list(list, VIEW(focus_it));
-        if (list) list = eina_list_next(list);
-     }
-   it_obj = eina_list_data_get(list);
-   if (it_obj) it = evas_object_data_get(it_obj, "item");
-   else it = NULL;
-
-   while (it &&
-          (it->separator ||
-           elm_object_item_disabled_get(EO_OBJ(it))))
-     {
-        if (list) list = eina_list_next(list);
-        if (!list)
-          {
-             it = NULL;
-             break;
-          }
-        it_obj = eina_list_data_get(list);
-        if (it_obj) it = evas_object_data_get(it_obj, "item");
-        else it = NULL;
-     }
-   eina_list_free(children_list);
-
-   return it;
-}
-
 EOLIAN static void
 _elm_toolbar_item_elm_widget_item_focus_set(Eo *eo_it, Elm_Toolbar_Item_Data 
*it, Eina_Bool focused)
 {
@@ -872,28 +886,6 @@ _elm_toolbar_item_elm_widget_item_focus_get(Eo *eo_it, 
Elm_Toolbar_Item_Data *it
 }
 
 static Eina_Bool
-_item_focused_next( Evas_Object *obj,
-                   Eina_Bool reverse,
-                   Elm_Focus_Direction dir)
-{
-   ELM_TOOLBAR_DATA_GET(obj, sd);
-   Elm_Toolbar_Item_Data *next_focused_item;
-
-   next_focused_item = _focus_next_item_get(obj, reverse);
-   if (!next_focused_item)
-     return EINA_FALSE;
-
-   if ((sd->orientation == EFL_ORIENT_HORIZONTAL && (dir == ELM_FOCUS_LEFT || 
dir == ELM_FOCUS_RIGHT))
-         || (sd->orientation == EFL_ORIENT_VERTICAL && (dir == ELM_FOCUS_UP || 
dir == ELM_FOCUS_DOWN)))
-   {
-      elm_object_item_focus_set(EO_OBJ(next_focused_item), EINA_TRUE);
-      return EINA_TRUE;
-   }
-   _elm_widget_focus_highlight_start(obj);
-   return EINA_FALSE;
-}
-
-static Eina_Bool
 _key_action_select(Evas_Object *obj, const char *params EINA_UNUSED)
 {
    ELM_TOOLBAR_DATA_GET(obj, sd);
@@ -907,38 +899,6 @@ _key_action_select(Evas_Object *obj, const char *params 
EINA_UNUSED)
    return EINA_TRUE;
 }
 
-static Eina_Bool
-_key_action_move(Evas_Object *obj, const char *params)
-{
-   const char *dir = params;
-
-   _elm_widget_focus_auto_show(obj);
-   if (!strcmp(dir, "left"))
-     {
-        if (!_item_focused_next(obj, EINA_TRUE, ELM_FOCUS_LEFT))
-          return EINA_FALSE;
-     }
-   else if (!strcmp(dir, "right"))
-     {
-        if (!_item_focused_next(obj, EINA_FALSE, ELM_FOCUS_RIGHT))
-          return EINA_FALSE;
-     }
-   else if (!strcmp(dir, "up"))
-     {
-        if (!_item_focused_next(obj, EINA_TRUE, ELM_FOCUS_UP))
-          return EINA_FALSE;
-     }
-   else if (!strcmp(dir, "down"))
-     {
-        if (!_item_focused_next(obj, EINA_FALSE, ELM_FOCUS_DOWN))
-          return EINA_FALSE;
-     }
-   else return EINA_FALSE;
-
-   return EINA_TRUE;
-
-}
-
 EOLIAN static Eina_Bool
 _elm_toolbar_elm_widget_widget_event(Eo *obj, Elm_Toolbar_Data *sd, 
Evas_Object *src, Evas_Callback_Type type, void *event_info)
 {
@@ -998,6 +958,13 @@ _resize_cb(void *data,
 }
 
 EOLIAN static void
+_elm_toolbar_item_elm_widget_item_disabled_set(Eo *eo_id, 
Elm_Toolbar_Item_Data *sd, Eina_Bool disabled)
+{
+   elm_wdg_item_disabled_set(efl_super(eo_id, ELM_TOOLBAR_ITEM_CLASS), 
disabled);
+   _item_focus_eval(sd);
+}
+
+EOLIAN static void
 _elm_toolbar_item_elm_widget_item_disable(Eo *eo_toolbar, 
Elm_Toolbar_Item_Data *toolbar_it)
 {
    const char* emission;
@@ -2407,6 +2374,12 @@ _elm_toolbar_item_efl_object_destructor(Eo *eo_item, 
Elm_Toolbar_Item_Data *item
           }
      }
 
+   if (item->registered)
+     {
+        efl_ui_focus_manager_unregister(item->registered, eo_item);
+        item->registered = NULL;
+     }
+
    _item_del(item);
 
    if (item != sd->more_item)
@@ -2450,6 +2423,12 @@ _access_widget_item_register(Elm_Toolbar_Item_Data *it)
    _elm_access_activate_callback_set(ai, _access_activate_cb, NULL);
 }
 
+EOLIAN static void
+_elm_toolbar_item_efl_ui_focus_object_geometry_get(Eo *obj EINA_UNUSED, 
Elm_Toolbar_Item_Data *pd, Eina_Rectangle *rect)
+{
+   evas_object_geometry_get(VIEW(pd), &rect->x, &rect->y, &rect->w, &rect->h);
+}
+
 EOLIAN static Eo *
 _elm_toolbar_item_efl_object_constructor(Eo *eo_it, Elm_Toolbar_Item_Data *it)
 {
@@ -2486,6 +2465,7 @@ _item_new(Evas_Object *obj,
    WIDGET_ITEM_DATA_SET(EO_OBJ(it), data);
 
    VIEW(it) = elm_layout_add(obj);
+   elm_widget_tree_unfocusable_set(VIEW(it), EINA_TRUE);
    evas_object_data_set(VIEW(it), "item", it);
    elm_interface_atspi_accessible_type_set(VIEW(it), ELM_ATSPI_TYPE_DISABLED);
 
@@ -3071,6 +3051,13 @@ _elm_toolbar_coordinates_adjust(Elm_Toolbar_Item_Data 
*it,
 }
 
 EOLIAN static void
+_elm_toolbar_item_efl_ui_focus_object_focus_set(Eo *obj, Elm_Toolbar_Item_Data 
*pd EINA_UNUSED, Eina_Bool focus)
+{
+   efl_ui_focus_object_focus_set(efl_super(obj, ELM_TOOLBAR_ITEM_CLASS), 
focus);
+   elm_wdg_item_focus_set(obj, focus);
+}
+
+EOLIAN static void
 _elm_toolbar_elm_widget_focus_highlight_geometry_get(const Eo *obj, 
Elm_Toolbar_Data *sd, Evas_Coord *x, Evas_Coord *y, Evas_Coord *w, Evas_Coord 
*h)
 {
    if (sd->focused_item)
@@ -3093,6 +3080,13 @@ elm_toolbar_add(Evas_Object *parent)
    return obj;
 }
 
+EOLIAN static Eina_Bool
+_elm_toolbar_elm_widget_focus_register(Eo *obj, Elm_Toolbar_Data *pd 
EINA_UNUSED, Efl_Ui_Focus_Manager *manager, Efl_Ui_Focus_Object *logical, 
Eina_Bool full EINA_UNUSED)
+{
+   efl_ui_focus_manager_register_logical(manager, obj, logical, NULL);
+   return EINA_FALSE;
+}
+
 EOLIAN static Eo *
 _elm_toolbar_efl_object_constructor(Eo *obj, Elm_Toolbar_Data *_pd EINA_UNUSED)
 {
@@ -4043,10 +4037,6 @@ 
_elm_toolbar_elm_interface_atspi_widget_action_elm_actions_get(Eo *obj EINA_UNUS
 {
    static Elm_Atspi_Action atspi_actions[] = {
           { "select", "select", NULL, _key_action_select},
-          { "move,left", "move", "left", _key_action_move},
-          { "move,right", "move", "right", _key_action_move},
-          { "move,up", "move", "up", _key_action_move},
-          { "move,down", "move", "down", _key_action_move},
           { NULL, NULL, NULL, NULL }
    };
    return &atspi_actions[0];
diff --git a/src/lib/elementary/elm_toolbar.eo 
b/src/lib/elementary/elm_toolbar.eo
index 360ec3d..af7ee07 100644
--- a/src/lib/elementary/elm_toolbar.eo
+++ b/src/lib/elementary/elm_toolbar.eo
@@ -332,6 +332,7 @@ class Elm.Toolbar (Elm.Widget, Elm.Interface_Scrollable, 
Efl.Orientation,
       Elm.Widget.focus_highlight_geometry_get;
       Elm.Widget.focused_item { get; }
       Efl.Orientation.orientation { get; set; }
+      Elm.Widget.focus_register;
       Elm.Interface.Atspi_Widget_Action.elm_actions { get; }
       Elm.Interface.Atspi_Accessible.children { get; }
       Elm.Interface.Atspi_Accessible.state_set { get; }
diff --git a/src/lib/elementary/elm_toolbar_item.eo 
b/src/lib/elementary/elm_toolbar_item.eo
index f181d03..a74cd63 100644
--- a/src/lib/elementary/elm_toolbar_item.eo
+++ b/src/lib/elementary/elm_toolbar_item.eo
@@ -23,7 +23,7 @@ struct Elm.Toolbar.Item.State
    data: const(void_ptr); [[Item data]]
 }
 
-class Elm.Toolbar.Item(Elm.Widget.Item, Efl.Ui.Item)
+class Elm.Toolbar.Item(Elm.Widget.Item, Efl.Ui.Item, Efl.Ui.Focus.Object)
 {
       [[Elementary toolbar item class]]
       legacy_prefix: elm_toolbar_item;
@@ -266,11 +266,14 @@ class Elm.Toolbar.Item(Elm.Widget.Item, Efl.Ui.Item)
            Efl.Object.constructor;
            Efl.Object.destructor;
            Elm.Widget.Item.disable;
+           Elm.Widget.Item.disabled { set; }
            Elm.Widget.Item.focus { get; set; }
            Elm.Widget.Item.signal_emit;
            Elm.Widget.Item.part_text { get; set; }
            Elm.Widget.Item.part_content { get; set; }
            Elm.Widget.Item.part_content_unset;
+           Efl.Ui.Focus.Object.geometry_get;
+           Efl.Ui.Focus.Object.focus { set; }
            Elm.Interface.Atspi_Accessible.name { get; }
            Elm.Interface.Atspi_Accessible.state_set { get; }
            Efl.Ui.Item.selected { get; set; }
diff --git a/src/lib/elementary/elm_widget_toolbar.h 
b/src/lib/elementary/elm_widget_toolbar.h
index 9ea98ab..3af13ea 100644
--- a/src/lib/elementary/elm_widget_toolbar.h
+++ b/src/lib/elementary/elm_widget_toolbar.h
@@ -83,6 +83,7 @@ struct _Elm_Toolbar_Item_Data
    Eina_List    *states;
    Eina_List    *current_state;
 
+   Efl_Ui_Focus_Manager *registered;
    Eina_Bool     separator : 1;
    Eina_Bool     selected : 1;
    Eina_Bool     menu : 1;

-- 


Reply via email to