diff options
author | Marcel Hollerbach <marcel-hollerbach@t-online.de> | 2016-12-21 20:23:55 +0100 |
---|---|---|
committer | Marcel Hollerbach <marcel-hollerbach@t-online.de> | 2017-04-19 13:32:00 +0200 |
commit | b7b7dbc749b077d9292c2859159a422c53254f03 (patch) | |
tree | 6f43f8a13e49dd17fa1d0b7b1308726f4fbf895d | |
parent | 3c89abb55d863fd250dcf68053d925b85551422b (diff) | |
download | efl-b7b7dbc749b077d9292c2859159a422c53254f03.tar.gz |
efl_ui_focus_manager: make setting a order easier
-rw-r--r-- | src/lib/elementary/efl_ui_focus_manager.c | 96 | ||||
-rw-r--r-- | src/lib/elementary/efl_ui_focus_manager.eo | 8 | ||||
-rw-r--r-- | src/lib/elementary/elm_box.c | 2 | ||||
-rw-r--r-- | src/lib/elementary/elm_grid.c | 2 | ||||
-rw-r--r-- | src/lib/elementary/elm_table.c | 2 |
5 files changed, 74 insertions, 36 deletions
diff --git a/src/lib/elementary/efl_ui_focus_manager.c b/src/lib/elementary/efl_ui_focus_manager.c index 7ce235a794..8056d0595b 100644 --- a/src/lib/elementary/efl_ui_focus_manager.c +++ b/src/lib/elementary/efl_ui_focus_manager.c @@ -646,35 +646,80 @@ _equal_set(Eina_List *none_nodes, Eina_List *nodes) return EINA_TRUE; } +EOLIAN static void +_efl_ui_focus_manager_update_order(Eo *obj, Efl_Ui_Focus_Manager_Data *pd, Efl_Ui_Focus_Object *parent, Eina_List *order) +{ + Node *pnode; + Efl_Ui_Focus_Object *o; + Eina_List *node_order = NULL, *not_ordered, *trash, *node_order_clean; + + pnode = node_get(obj, pd, parent); + + if (!pnode) + return; + + //get all nodes from the subset + EINA_LIST_FREE(order, o) + { + Node *tmp; + + tmp = eina_hash_find(pd->node_hash, &o); + + if (!tmp) continue; + + node_order = eina_list_append(node_order, tmp); + } + + not_ordered = _set_a_without_b(T(pnode).children, node_order); + trash = _set_a_without_b(node_order, T(pnode).children); + node_order_clean = _set_a_without_b(node_order, trash); + + eina_list_free(node_order); + eina_list_free(trash); + + T(pnode).children = eina_list_merge(node_order_clean, not_ordered); + + return; +} + EOLIAN static Eina_Bool -_efl_ui_focus_manager_update_children(Eo *obj EINA_UNUSED, Efl_Ui_Focus_Manager_Data *pd, Efl_Ui_Focus_Object *parent, Eina_List *order, Eina_Bool subset) +_efl_ui_focus_manager_update_children(Eo *obj EINA_UNUSED, Efl_Ui_Focus_Manager_Data *pd, Efl_Ui_Focus_Object *parent, Eina_List *order) { Node *pnode; + Efl_Ui_Focus_Object *o; + Eina_Bool fail = EINA_FALSE; + Eina_List *node_order = NULL; pnode = node_get(obj, pd, parent); if (!pnode) return EINA_FALSE; - if (!subset) + //get all nodes from the subset + EINA_LIST_FREE(order, o) { - if (!_equal_set(order, T(pnode).children)) - { - ERR("Set of children is not equal"); - return EINA_FALSE; - } - T(pnode).children = order; + Node *tmp; + + tmp = node_get(obj, pd, o); + if (!tmp) + fail = EINA_TRUE; + node_order = eina_list_append(node_order, tmp); } - else - { - Eina_List *not_ordered; - not_ordered = _set_a_without_b(T(pnode).children, order); + if (fail) + { + eina_list_free(node_order); + return EINA_FALSE; + } - eina_list_free(T(pnode).children); - T(pnode).children = eina_list_merge(order, not_ordered); + if (!_equal_set(node_order, T(pnode).children)) + { + ERR("Set of children is not equal"); + return EINA_FALSE; } + T(pnode).children = node_order; + return EINA_TRUE; } @@ -1068,23 +1113,6 @@ _efl_ui_focus_manager_request_move(Eo *obj EINA_UNUSED, Efl_Ui_Focus_Manager_Dat } } -static Efl_Ui_Focus_Object* -_find_normal_node(Node *n) -{ - Eina_List *l; - Node *n2; - if (n->type == NODE_TYPE_NORMAL) return n->focusable; - - EINA_LIST_FOREACH(T(n).children , l, n2) - { - Efl_Ui_Focus_Object *r; - - r = _find_normal_node(n2); - if (r) return r; - } - return NULL; -} - EOLIAN static void _efl_ui_focus_manager_focus(Eo *obj, Efl_Ui_Focus_Manager_Data *pd, Efl_Ui_Focus_Object *focus) { @@ -1096,7 +1124,11 @@ _efl_ui_focus_manager_focus(Eo *obj, Efl_Ui_Focus_Manager_Data *pd, Efl_Ui_Focus //if we want to focus the root then just spin to the first normal if (focus == pd->root->focusable) { - focus = _find_normal_node(pd->root); + Node *f = _logical_movement(pd, pd->root, EFL_UI_FOCUS_DIRECTION_NEXT); + + if (f) + focus = f->focusable; + if (!focus) return; } diff --git a/src/lib/elementary/efl_ui_focus_manager.eo b/src/lib/elementary/efl_ui_focus_manager.eo index dd13e71c89..4c5f0fbf67 100644 --- a/src/lib/elementary/efl_ui_focus_manager.eo +++ b/src/lib/elementary/efl_ui_focus_manager.eo @@ -96,10 +96,16 @@ class Efl.Ui.Focus.Manager (Efl.Object) { params { parent : Efl.Ui.Focus.Object @nonull; [[the parent to update]] children : list<Efl.Ui.Focus.Object>; [[the list with the new order]] - subset : bool; [[$false to make sure childrenlist is the same size as the real logical children, $true to just add this order to the beginning of the children]] } return : bool; } + update_order { + [[Give the given order to the parent's child. Children from the list which are no real children are ignored]] + params { + parent : Efl.Ui.Focus.Object @nonull; [[the parent to update]] + children : list<Efl.Ui.Focus.Object>; [[the order of items]] + } + } unregister { [[unregister the given item from the graph]] params { diff --git a/src/lib/elementary/elm_box.c b/src/lib/elementary/elm_box.c index f8920db86e..580b7070a2 100644 --- a/src/lib/elementary/elm_box.c +++ b/src/lib/elementary/elm_box.c @@ -28,7 +28,7 @@ _focus_order_flush(Eo *obj, Elm_Box_Data *pd EINA_UNUSED) Elm_Widget_Smart_Data *wpd = efl_data_scope_get(obj, ELM_WIDGET_CLASS); Eina_List *order = evas_object_box_children_get(wpd->resize_obj); - efl_ui_focus_manager_update_children(wpd->focus.manager, obj, order, EINA_TRUE); + efl_ui_focus_manager_update_order(wpd->focus.manager, obj, order); } static void * diff --git a/src/lib/elementary/elm_grid.c b/src/lib/elementary/elm_grid.c index 886549a567..b3e1fa11c0 100644 --- a/src/lib/elementary/elm_grid.c +++ b/src/lib/elementary/elm_grid.c @@ -19,7 +19,7 @@ _focus_order_flush(Eo *obj) Elm_Widget_Smart_Data *wpd = efl_data_scope_get(obj, ELM_WIDGET_CLASS); Eina_List *order = evas_object_grid_children_get(wpd->resize_obj); - efl_ui_focus_manager_update_children(wpd->focus.manager, obj, order, EINA_TRUE); + efl_ui_focus_manager_update_order(wpd->focus.manager, obj, order); } diff --git a/src/lib/elementary/elm_table.c b/src/lib/elementary/elm_table.c index f32b4c3938..cd57be3775 100644 --- a/src/lib/elementary/elm_table.c +++ b/src/lib/elementary/elm_table.c @@ -20,7 +20,7 @@ _focus_order_flush(Eo *obj) Elm_Widget_Smart_Data *wpd = efl_data_scope_get(obj, ELM_WIDGET_CLASS); Eina_List *order = evas_object_table_children_get(wpd->resize_obj); - efl_ui_focus_manager_update_children(wpd->focus.manager, obj, order, EINA_TRUE); + efl_ui_focus_manager_update_order(wpd->focus.manager, obj, order); } EOLIAN static Eina_Bool |