efl_ui_widget: fix disabled set behaviour

Summary:
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.

Depends on D11550

Reviewers: zmike

Reviewed By: zmike

Subscribers: zmike, cedric, #reviewers, #committers

Tags: #efl

Differential Revision: https://phab.enlightenment.org/D11551
This commit is contained in:
Marcel Hollerbach 2020-03-23 12:12:12 -04:00 committed by Mike Blumenkrantz
parent 8e0a7cedc1
commit 151862f50c
2 changed files with 45 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,38 @@ 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);
CHECK_DISABLED_STATE(0);
efl_ui_widget_disabled_set(s.win, EINA_TRUE);
CHECK_DISABLED_STATE(1);
efl_ui_widget_disabled_set(s.win, EINA_FALSE);
CHECK_DISABLED_STATE(0);
efl_ui_widget_disabled_set(s.win, EINA_TRUE);
CHECK_DISABLED_STATE(1);
efl_ui_widget_disabled_set(s.win, EINA_TRUE);
CHECK_DISABLED_STATE(1);
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 +411,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);
}