From f5ac9a3e6ca230ea913eda0e315a553a41bb7f6e Mon Sep 17 00:00:00 2001 From: Marcel Hollerbach Date: Sat, 21 Mar 2020 19:44:48 +0100 Subject: [PATCH] efl_ui_widget: fix disabled set behaviour this fixes disabled set behaviour. This ensures that when setting disabled twice, that unsetting it once does not break the overall state. This never appeared in any real life example, because elm_object_disabled_set is already checking for equalness. However, this is not wanted here, because the simple setter can also be used to sync the state with the parent, which appears to be helpfull. --- src/lib/elementary/efl_ui_widget.c | 20 +++++++----- src/tests/elementary/efl_ui_test_widget.c | 39 +++++++++++++++++++++++ 2 files changed, 51 insertions(+), 8 deletions(-) diff --git a/src/lib/elementary/efl_ui_widget.c b/src/lib/elementary/efl_ui_widget.c index 929e53a2e4..f5063a3575 100644 --- a/src/lib/elementary/efl_ui_widget.c +++ b/src/lib/elementary/efl_ui_widget.c @@ -2111,7 +2111,9 @@ EOLIAN static void _efl_ui_widget_disabled_set(Eo *obj EINA_UNUSED, Elm_Widget_Smart_Data *pd, Eina_Bool disabled) { Efl_Ui_Widget *subs; - int distance, parent_counter = (pd->parent_obj ? _disabled_counter_get(pd->parent_obj) : 0); + int old_state, distance, parent_counter = (pd->parent_obj ? _disabled_counter_get(pd->parent_obj) : 0); + + old_state = pd->disabled; if (disabled) pd->disabled ++; @@ -2125,15 +2127,17 @@ _efl_ui_widget_disabled_set(Eo *obj EINA_UNUSED, Elm_Widget_Smart_Data *pd, Eina distance = MAX(MIN(disabled, 1), 0); pd->disabled = parent_counter + distance; } - for (unsigned int i = 0; i < eina_array_count(pd->children); ++i) + if (old_state != pd->disabled) { - subs = eina_array_data_get(pd->children, i); - if (efl_isa(subs, EFL_UI_WIDGET_CLASS)) - efl_ui_widget_disabled_set(subs, efl_ui_widget_disabled_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)) + efl_ui_widget_disabled_set(subs, efl_ui_widget_disabled_get(obj)); + } + if (efl_finalized_get(obj)) + _elm_widget_full_eval_children(obj, pd); } - - if (efl_finalized_get(obj)) - _elm_widget_full_eval_children(obj, pd); } EOLIAN static Eina_Bool diff --git a/src/tests/elementary/efl_ui_test_widget.c b/src/tests/elementary/efl_ui_test_widget.c index 7b260dd40c..c369ad4565 100644 --- a/src/tests/elementary/efl_ui_test_widget.c +++ b/src/tests/elementary/efl_ui_test_widget.c @@ -364,6 +364,44 @@ EFL_START_TEST(efl_ui_test_widget_tree_unfocusable) } EFL_END_TEST +#define CHECK_DISABLED_STATE(x) \ + ck_assert_int_eq(efl_ui_widget_disabled_get(s.box), x); \ + ck_assert_int_eq(efl_ui_widget_disabled_get(s.win), x); \ + ck_assert_int_eq(efl_ui_widget_disabled_get(s.ic), x); \ + ck_assert_int_eq(efl_ui_widget_disabled_get(s.btn1), x); \ + ck_assert_int_eq(efl_ui_widget_disabled_get(s.btn2), x) + + +EFL_START_TEST(efl_ui_test_widget_disabled_repeat_call) +{ + State s; + + _small_ui(&s); + printf("ASD\n"); + CHECK_DISABLED_STATE(0); + + printf("ASD\n"); + efl_ui_widget_disabled_set(s.win, EINA_TRUE); + CHECK_DISABLED_STATE(1); + + printf("ASD\n"); + efl_ui_widget_disabled_set(s.win, EINA_FALSE); + CHECK_DISABLED_STATE(0); + + printf("ASD\n"); + efl_ui_widget_disabled_set(s.win, EINA_TRUE); + CHECK_DISABLED_STATE(1); + + printf("ASD\n"); + efl_ui_widget_disabled_set(s.win, EINA_TRUE); + CHECK_DISABLED_STATE(1); + + printf("ASD\n"); + efl_ui_widget_disabled_set(s.win, EINA_FALSE); + CHECK_DISABLED_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); @@ -379,4 +417,5 @@ void efl_ui_test_widget(TCase *tc) 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); + tcase_add_test(tc, efl_ui_test_widget_disabled_repeat_call); }