diff options
author | Marcel Hollerbach <mail@marcel-hollerbach.de> | 2020-03-21 19:44:48 +0100 |
---|---|---|
committer | Marcel Hollerbach <mail@marcel-hollerbach.de> | 2020-03-21 19:48:46 +0100 |
commit | f5ac9a3e6ca230ea913eda0e315a553a41bb7f6e (patch) | |
tree | 43169e0823b4e1b14dd762c0144f4bd5b3029725 | |
parent | 2677b9d4808b4f99da1b15d12d3bba04b6908aa2 (diff) | |
download | efl-devs/bu5hm4n/work_widget.tar.gz |
efl_ui_widget: fix disabled set behaviourdevs/bu5hm4n/work_widget
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.
-rw-r--r-- | src/lib/elementary/efl_ui_widget.c | 20 | ||||
-rw-r--r-- | 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); } |