From f2248410b29f2ebabec4ce23d9e6d51fe4422ec4 Mon Sep 17 00:00:00 2001 From: Marcel Hollerbach Date: Wed, 16 Nov 2016 18:54:26 +0100 Subject: [PATCH] efl_ui_focus_manager: new api for adding a logical widget a widget which is registered logically will not be used for right left top or down relations. --- src/lib/elementary/efl_ui_focus_manager.c | 42 ++++++++++++++++++++-- src/lib/elementary/efl_ui_focus_manager.eo | 12 +++++++ 2 files changed, 51 insertions(+), 3 deletions(-) diff --git a/src/lib/elementary/efl_ui_focus_manager.c b/src/lib/elementary/efl_ui_focus_manager.c index 737a7b5c44..1a58f9bc2c 100644 --- a/src/lib/elementary/efl_ui_focus_manager.c +++ b/src/lib/elementary/efl_ui_focus_manager.c @@ -36,6 +36,7 @@ struct _Border { typedef enum { NODE_TYPE_NORMAL = 0, NODE_TYPE_LISTENER = 1, + NODE_TYPE_ONLY_LOGICAL = 2, } Node_Type; struct _Node{ @@ -252,12 +253,17 @@ _calculate_node(Efl_Ui_Focus_Manager_Data *pd, Efl_Ui_Focus_Object *node, Dimens EINA_ITERATOR_FOREACH(nodes, focus_key) { + Node *n; Eina_Rectangle op_rect = EINA_RECTANGLE_INIT; int min, max; op = *focus_key; if (op == node) continue; + n = node_get(pd, op); + + if (n->type == NODE_TYPE_ONLY_LOGICAL) continue; + efl_ui_focus_object_geometry_get(op, &op_rect); if (dim == DIMENSION_X) @@ -430,6 +436,12 @@ dirty_flush(Efl_Ui_Focus_Manager *obj, Efl_Ui_Focus_Manager_Data *pd) static void dirty_add(Eo *obj, Efl_Ui_Focus_Manager_Data *pd, Node *dirty) { + if (dirty->type == NODE_TYPE_ONLY_LOGICAL) + { + ERR("Only not only logical nodes can be marked dirty"); + return; + } + //if (eina_list_data_find(pd->dirty, dirty)) return; pd->dirty = eina_list_remove(pd->dirty, dirty); pd->dirty = eina_list_append(pd->dirty, dirty); @@ -494,11 +506,29 @@ _register(Eo *obj, Efl_Ui_Focus_Manager_Data *pd, Efl_Ui_Focus_Object *child, No T(parent).children = eina_list_append(T(parent).children, node); } - //listen to changes - efl_event_callback_array_add(child, focusable_node(), obj); - return node; } +EOLIAN static Eina_Bool +_efl_ui_focus_manager_register_logical(Eo *obj, Efl_Ui_Focus_Manager_Data *pd, Efl_Ui_Focus_Object *child, Efl_Ui_Focus_Object *parent) +{ + Node *node = NULL; + Node *pnode = NULL; + + EINA_SAFETY_ON_NULL_RETURN_VAL(child, EINA_FALSE); + EINA_SAFETY_ON_NULL_RETURN_VAL(parent, EINA_FALSE); + + pnode = node_get(pd, parent); + if (!pnode) return EINA_FALSE; + + node = _register(obj, pd, child, pnode); + if (!node) return EINA_FALSE; + + node->type = NODE_TYPE_ONLY_LOGICAL; + + + return EINA_TRUE; +} + EOLIAN static Eina_Bool _efl_ui_focus_manager_register(Eo *obj, Efl_Ui_Focus_Manager_Data *pd, Efl_Ui_Focus_Object *child, Efl_Ui_Focus_Object *parent, Efl_Ui_Focus_Manager *redirect) @@ -515,6 +545,9 @@ _efl_ui_focus_manager_register(Eo *obj, Efl_Ui_Focus_Manager_Data *pd, Efl_Ui_Fo node = _register(obj, pd, child, pnode); if (!node) return EINA_FALSE; + //listen to changes + efl_event_callback_array_add(child, focusable_node(), obj); + if (!redirect) { node->type = NODE_TYPE_NORMAL; @@ -1021,6 +1054,9 @@ _efl_ui_focus_manager_root_set(Eo *obj EINA_UNUSED, Efl_Ui_Focus_Manager_Data *p node = _register(obj, pd, root, NULL); + //listen to changes + efl_event_callback_array_add(node->focusable, focusable_node(), obj); + pd->root = node; } diff --git a/src/lib/elementary/efl_ui_focus_manager.eo b/src/lib/elementary/efl_ui_focus_manager.eo index 7db508dd0d..9d687764af 100644 --- a/src/lib/elementary/efl_ui_focus_manager.eo +++ b/src/lib/elementary/efl_ui_focus_manager.eo @@ -55,6 +55,18 @@ class Efl.Ui.Focus.Manager (Efl.Object) { } return : bool; [[$true if it was successfull $false if not]] } + 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. + ]] + params { + child : Efl.Ui.Focus.Object @nonull; + parent : Efl.Ui.Focus.Object @nonull; + } + return : bool; [[$true if it was successfull $false if not]] + } + update_redirect { [[Set a new redirect object for the given child