summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMarcel Hollerbach <mail@marcel-hollerbach.de>2020-03-21 19:44:48 +0100
committerMarcel Hollerbach <mail@marcel-hollerbach.de>2020-03-21 19:48:46 +0100
commitf5ac9a3e6ca230ea913eda0e315a553a41bb7f6e (patch)
tree43169e0823b4e1b14dd762c0144f4bd5b3029725
parent2677b9d4808b4f99da1b15d12d3bba04b6908aa2 (diff)
downloadefl-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.c20
-rw-r--r--src/tests/elementary/efl_ui_test_widget.c39
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);
}