bu5hm4n pushed a commit to branch master.

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

commit f2248410b29f2ebabec4ce23d9e6d51fe4422ec4
Author: Marcel Hollerbach <[email protected]>
Date:   Wed Nov 16 18:54:26 2016 +0100

    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 737a7b5..1a58f9b 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 7db508d..9d68776 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
 

-- 


Reply via email to