static Node*
_logical_movement(Efl_Ui_Focus_Manager_Data *pd EINA_UNUSED, Node *upper, Efl_Ui_Focus_Direction direction)
{
+ Node* (*deliver)(Node *n);
+ Node *result;
if (direction == EFL_UI_FOCUS_DIRECTION_NEXT)
- return _next(upper);
+ deliver = _next;
else
- return _prev(upper);
+ deliver = _prev;
+
+ //search as long as we have a none logical parent
+ result = upper;
+ do {
+ result = deliver(result);
+ } while(result && result->type == NODE_TYPE_ONLY_LOGICAL);
+
+ return result;
}
EOLIAN static Efl_Ui_Focus_Object*
register_logical {
[[Register a new item just for the logical parent.
- This item can just be used as a parent for a child. It cannot be reached via coordinate wise movements.
+ The item can never get focus, it just help to build a tree out of the items who are getting focus.
]]
params {
child : Efl.Ui.Focus.Object @nonull;
//register everything
efl_ui_focus_manager_register(m, child1, root, NULL);
efl_ui_focus_manager_register(m, child2, root, NULL);
- efl_ui_focus_manager_register(m, child3, root, NULL);
+ efl_ui_focus_manager_register_logical(m, child3, root);
efl_ui_focus_manager_register(m, subchild11, child1, NULL);
efl_ui_focus_manager_register(m, subchild12, child1, NULL);
efl_ui_focus_manager_register(m, subchild13, child1, NULL);
Efl_Object *logical_chain[] = {
child1, subchild11, subchild12, subchild13,
- child2, child3, subchild21, subchild22, subchild23, root, NULL
+ child2, subchild21, subchild22, subchild23, root, NULL
};
for (i = 0; logical_chain[i]; ++i)
{