efl_ui_focus_manager: make setting a order easier
authorMarcel Hollerbach <marcel-hollerbach@t-online.de>
Wed, 21 Dec 2016 19:23:55 +0000 (20:23 +0100)
committerMarcel Hollerbach <marcel-hollerbach@t-online.de>
Thu, 20 Apr 2017 12:38:58 +0000 (14:38 +0200)
src/lib/elementary/efl_ui_focus_manager.c
src/lib/elementary/efl_ui_focus_manager.eo
src/lib/elementary/elm_box.c
src/lib/elementary/elm_grid.c
src/lib/elementary/elm_table.c

index 7ce235a..8056d05 100644 (file)
@@ -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;
      }
 
index dd13e71..4c5f0fb 100644 (file)
@@ -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 {
index f8920db..580b707 100644 (file)
@@ -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 *
index 886549a..b3e1fa1 100644 (file)
@@ -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);
 }
 
 
index f32b4c3..cd57be3 100644 (file)
@@ -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