zmike pushed a commit to branch master.

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

commit 8e0a7cedc1b8f2f5c808517fec597ec412682200
Author: Marcel Hollerbach <[email protected]>
Date:   Mon Mar 23 12:12:06 2020 -0400

    efl_ui_widget: fix tree_unfocusable setting
    
    Summary:
    when setting twice the same value, unsetting the same value would not
    restore the same state in the tree again. With this commit, we ensure
    this is working correctly.
    
    Reviewers: zmike
    
    Reviewed By: zmike
    
    Subscribers: zmike, cedric, #reviewers, #committers
    
    Tags: #efl
    
    Differential Revision: https://phab.enlightenment.org/D11550
---
 src/lib/elementary/efl_ui_widget.c        | 21 ++++++++++++--------
 src/tests/elementary/efl_ui_test_widget.c | 33 +++++++++++++++++++++++++++++++
 2 files changed, 46 insertions(+), 8 deletions(-)

diff --git a/src/lib/elementary/efl_ui_widget.c 
b/src/lib/elementary/efl_ui_widget.c
index a58c66b99c..929e53a2e4 100644
--- a/src/lib/elementary/efl_ui_widget.c
+++ b/src/lib/elementary/efl_ui_widget.c
@@ -1748,7 +1748,9 @@ elm_widget_tree_unfocusable_set(Eo *obj, Eina_Bool 
tree_unfocusable)
    Efl_Ui_Widget *subs;
    Elm_Widget_Smart_Data *pd = efl_data_scope_safe_get(obj, MY_CLASS);
    EINA_SAFETY_ON_NULL_RETURN(pd);
-   int distance, parent_counter = (pd->parent_obj ? 
_tree_unfocusable_counter_get(pd->parent_obj) : 0);
+   int old_tree_unfocusable, distance, parent_counter = (pd->parent_obj ? 
_tree_unfocusable_counter_get(pd->parent_obj) : 0);
+
+   old_tree_unfocusable = pd->tree_unfocusable;
 
    if (tree_unfocusable)
      pd->tree_unfocusable ++;
@@ -1762,15 +1764,18 @@ elm_widget_tree_unfocusable_set(Eo *obj, Eina_Bool 
tree_unfocusable)
         distance = MAX(MIN(tree_unfocusable, 1), 0);
         pd->tree_unfocusable = parent_counter + distance;
      }
-   for (unsigned int i = 0; i < eina_array_count(pd->children); ++i)
+   if (old_tree_unfocusable != pd->tree_unfocusable)
      {
-        subs = eina_array_data_get(pd->children, i);
-        if (efl_isa(subs, EFL_UI_WIDGET_CLASS))
-          elm_widget_tree_unfocusable_set(subs, 
elm_widget_tree_unfocusable_get(obj));
-     }
+        for (unsigned int i = 0; i < eina_array_count(pd->children); ++i)
+          {
+             subs = eina_array_data_get(pd->children, i);
+             if (efl_isa(subs, EFL_UI_WIDGET_CLASS))
+               elm_widget_tree_unfocusable_set(subs, 
elm_widget_tree_unfocusable_get(obj));
+          }
 
-   //focus state eval on all children
-   _elm_widget_full_eval_children(obj, pd);
+        //focus state eval on all children
+        _elm_widget_full_eval_children(obj, pd);
+     }
 }
 
 /**
diff --git a/src/tests/elementary/efl_ui_test_widget.c 
b/src/tests/elementary/efl_ui_test_widget.c
index 7e55fd1b79..7b260dd40c 100644
--- a/src/tests/elementary/efl_ui_test_widget.c
+++ b/src/tests/elementary/efl_ui_test_widget.c
@@ -332,6 +332,38 @@ EFL_START_TEST(efl_ui_test_widget_win_provider_find)
 }
 EFL_END_TEST
 
+#define CHECK_UNFOCUSABLE_STATE(x) \
+   ck_assert_int_eq(elm_widget_tree_unfocusable_get(s.box), x); \
+   ck_assert_int_eq(elm_widget_tree_unfocusable_get(s.win), x); \
+   ck_assert_int_eq(elm_widget_tree_unfocusable_get(s.ic), x); \
+   ck_assert_int_eq(elm_widget_tree_unfocusable_get(s.btn1), x); \
+   ck_assert_int_eq(elm_widget_tree_unfocusable_get(s.btn2), x)
+
+
+EFL_START_TEST(efl_ui_test_widget_tree_unfocusable)
+{
+   State s;
+
+   _small_ui(&s);
+   CHECK_UNFOCUSABLE_STATE(0);
+
+   elm_widget_tree_unfocusable_set(s.win, EINA_TRUE);
+   CHECK_UNFOCUSABLE_STATE(1);
+
+   elm_widget_tree_unfocusable_set(s.win, EINA_FALSE);
+   CHECK_UNFOCUSABLE_STATE(0);
+
+   elm_widget_tree_unfocusable_set(s.win, EINA_TRUE);
+   CHECK_UNFOCUSABLE_STATE(1);
+
+   elm_widget_tree_unfocusable_set(s.win, EINA_TRUE);
+   CHECK_UNFOCUSABLE_STATE(1);
+
+   elm_widget_tree_unfocusable_set(s.win, EINA_FALSE);
+   CHECK_UNFOCUSABLE_STATE(0);
+}
+EFL_END_TEST
+
 void efl_ui_test_widget(TCase *tc)
 {
    tcase_add_checked_fixture(tc, fail_on_errors_setup, 
fail_on_errors_teardown);
@@ -346,4 +378,5 @@ void efl_ui_test_widget(TCase *tc)
    tcase_add_test(tc, efl_ui_test_widget_disabled_parent);
    tcase_add_test(tc, efl_ui_test_widget_disabled_behaviour);
    tcase_add_test(tc, efl_ui_test_widget_win_provider_find);
+   tcase_add_test(tc, efl_ui_test_widget_tree_unfocusable);
 }

-- 


Reply via email to