forked from enlightenment/efl
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:
parent
2677b9d480
commit
f5ac9a3e6c
|
@ -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
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue