efl_ui_widget: fix tree_unfocusable setting

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.
This commit is contained in:
Marcel Hollerbach 2020-03-21 19:31:10 +01:00
parent e9493fbafc
commit 2677b9d480
2 changed files with 46 additions and 8 deletions

View File

@ -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);
}
}
/**

View File

@ -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);
}