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

View File

@ -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

View File

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