summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMarcel Hollerbach <marcel-hollerbach@t-online.de>2016-12-21 20:23:55 +0100
committerMarcel Hollerbach <marcel-hollerbach@t-online.de>2017-04-19 13:32:00 +0200
commitb7b7dbc749b077d9292c2859159a422c53254f03 (patch)
tree6f43f8a13e49dd17fa1d0b7b1308726f4fbf895d
parent3c89abb55d863fd250dcf68053d925b85551422b (diff)
downloadefl-b7b7dbc749b077d9292c2859159a422c53254f03.tar.gz
efl_ui_focus_manager: make setting a order easier
-rw-r--r--src/lib/elementary/efl_ui_focus_manager.c96
-rw-r--r--src/lib/elementary/efl_ui_focus_manager.eo8
-rw-r--r--src/lib/elementary/elm_box.c2
-rw-r--r--src/lib/elementary/elm_grid.c2
-rw-r--r--src/lib/elementary/elm_table.c2
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