efl_ui_focus_manager: correctly handle subitem directions in a redirect
authorMarcel Hollerbach <marcel@osg.samsung.com>
Fri, 27 Oct 2017 12:31:27 +0000 (14:31 +0200)
committerMarcel Hollerbach <marcel@osg.samsung.com>
Fri, 27 Oct 2017 13:29:58 +0000 (15:29 +0200)
in default focus just sets the focus to the first item in the redirect
manager, we now reset that back and move the focus to the last element
of a item.

src/lib/elementary/efl_ui_focus_manager_calc.c

index 171bc79..3c43852 100644 (file)
@@ -1422,6 +1422,26 @@ _efl_ui_focus_manager_calc_efl_ui_focus_manager_focus_set(Eo *obj, Efl_Ui_Focus_
      }
 }
 
+static void
+_followup_previous_direction(Eo *obj, Efl_Ui_Focus_Manager_Calc_Data *pd)
+{
+   Efl_Ui_Focus_Manager *rec_manager;
+   rec_manager = efl_ui_focus_manager_redirect_get(obj);
+   if (rec_manager)
+     {
+        Efl_Ui_Focus_Manager_Logical_End_Detail last;
+        efl_ui_focus_manager_reset_history(rec_manager);
+
+        do {
+          last = efl_ui_focus_manager_logical_end(rec_manager);
+          EINA_SAFETY_ON_NULL_RETURN(last.element);
+          efl_ui_focus_manager_focus_set(rec_manager, last.element);
+
+          rec_manager = efl_ui_focus_manager_redirect_get(rec_manager);
+        } while (!last.is_regular_end);
+     }
+}
+
 EOLIAN static Efl_Ui_Focus_Object*
 _efl_ui_focus_manager_calc_efl_ui_focus_manager_move(Eo *obj EINA_UNUSED, Efl_Ui_Focus_Manager_Calc_Data *pd, Efl_Ui_Focus_Direction direction)
 {
@@ -1441,10 +1461,16 @@ _efl_ui_focus_manager_calc_efl_ui_focus_manager_move(Eo *obj EINA_UNUSED, Efl_Ui
              if (DIRECTION_IS_LOGICAL(direction))
                {
                   // lets just take the last
+
                   Node *n = eina_list_last_data_get(pd->focus_stack);
                   new_candidate = _request_move(obj, pd, direction, n);
+
                   if (new_candidate)
                     efl_ui_focus_manager_focus_set(obj, new_candidate);
+
+                  if (direction == ELM_FOCUS_PREVIOUS)
+                    _followup_previous_direction(obj, pd);
+
                   candidate = new_candidate;
                }
              else
@@ -1474,7 +1500,11 @@ _efl_ui_focus_manager_calc_efl_ui_focus_manager_move(Eo *obj EINA_UNUSED, Efl_Ui
         F_DBG("Manager: %p moved to %p %s in direction %d", obj, candidate, efl_class_name_get(candidate), direction);
 
         if (candidate)
-          efl_ui_focus_manager_focus_set(obj, candidate);
+          {
+             efl_ui_focus_manager_focus_set(obj, candidate);
+             if (direction == ELM_FOCUS_PREVIOUS)
+               _followup_previous_direction(obj, pd);
+          }
      }