From 92deae574ac17f704e5d57e6921b2a336fcd587a Mon Sep 17 00:00:00 2001 From: "shilpa.singh" Date: Thu, 8 Jan 2015 16:06:34 +0900 Subject: [PATCH] elm_widget: elm_object_disabled_set API fix Summary: When elm_object_disabled_set API is called on any widget, All the subobjects of the widget also has to be disabled issue fix. @fix Test Plan: Call the API elm_object_disabled_set on any container widget like box, layout etc:-, fix can be tested with test_box.c and test_layout.c test codes. Reviewers: Hermet, seoz, raster Subscribers: govi, rajeshps Differential Revision: https://phab.enlightenment.org/D1778 --- legacy/elementary/src/bin/Makefile.am | 1 + legacy/elementary/src/bin/test.c | 5 + legacy/elementary/src/bin/test_disable.c | 207 +++++++++++++++++++++++ legacy/elementary/src/lib/elm_widget.c | 67 +++++++- 4 files changed, 277 insertions(+), 3 deletions(-) create mode 100644 legacy/elementary/src/bin/test_disable.c diff --git a/legacy/elementary/src/bin/Makefile.am b/legacy/elementary/src/bin/Makefile.am index fbddf40dd8..8c438dacae 100644 --- a/legacy/elementary/src/bin/Makefile.am +++ b/legacy/elementary/src/bin/Makefile.am @@ -47,6 +47,7 @@ test_ctxpopup.c \ test_cursor.c \ test_datetime.c \ test_dayselector.c \ +test_disable.c \ test_diskselector.c \ test_dnd.c \ test_eio.c \ diff --git a/legacy/elementary/src/bin/test.c b/legacy/elementary/src/bin/test.c index eeec24adfd..f812bb0fed 100644 --- a/legacy/elementary/src/bin/test.c +++ b/legacy/elementary/src/bin/test.c @@ -252,6 +252,8 @@ void test_task_switcher(void *data, Evas_Object *obj, void *event_info); void test_application_server_message(void *data, Evas_Object *obj, void *event_info); void test_application_server_phone(void *data, Evas_Object *obj, void *event_info); void test_win_dialog(void *data, Evas_Object *obj, void *event_info); +void test_box_disable(void *data, Evas_Object *obj, void *event_info); +void test_layout_disable(void *data, Evas_Object *obj, void *event_info); Evas_Object *win, *tbx; // TODO: refactoring void *tt; @@ -839,6 +841,9 @@ add_tests: ADD_TEST(NULL, "Application client/server", "Phone", test_application_server_phone); ADD_TEST(NULL, "Application client/server", "Message", test_application_server_message); + ADD_TEST(NULL, "Widgets Disable/Enable", "Box", test_box_disable); + ADD_TEST(NULL, "Widgets Disable/Enable", "Layout", test_layout_disable); + #undef ADD_TEST if (autorun) diff --git a/legacy/elementary/src/bin/test_disable.c b/legacy/elementary/src/bin/test_disable.c new file mode 100644 index 0000000000..9895369aac --- /dev/null +++ b/legacy/elementary/src/bin/test_disable.c @@ -0,0 +1,207 @@ +#ifdef HAVE_CONFIG_H +# include "elementary_config.h" +#endif +#include + +static void +_disable_cb(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + Eina_Bool status = EINA_FALSE; + status = elm_object_disabled_get(data); + elm_object_disabled_set(data, !status); +} + +void +test_box_disable(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + Evas_Object *win, *bx, *bt, *bx_out, *fr, *lb; + Evas_Object *btn[4]; + + win = elm_win_util_standard_add("box-transition", "Box Transition"); + elm_win_autodel_set(win, EINA_TRUE); + + bx_out = elm_box_add(win); + evas_object_size_hint_weight_set(bx_out, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_win_resize_object_add(win, bx_out); + evas_object_show(bx_out); + + fr = elm_frame_add(bx_out); + evas_object_size_hint_weight_set(fr, EVAS_HINT_EXPAND, 0.0); + evas_object_size_hint_align_set(fr, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_box_pack_end(bx_out, fr); + elm_object_text_set(fr, "Description"); + evas_object_show(fr); + + bx = elm_box_add(fr); + elm_object_content_set(fr, bx); + evas_object_show(bx); + + lb = elm_label_add(bx); + elm_object_text_set(lb, "This test shows how enable/disable of Container widget works"); + evas_object_size_hint_align_set(lb, 0.0, EVAS_HINT_FILL); + elm_box_pack_end(bx, lb); + evas_object_show(lb); + + btn[0] = elm_button_add(bx); + elm_object_text_set(btn[0], "Disable/Enable Box"); + evas_object_size_hint_weight_set(btn[0], EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(btn[0], EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_box_pack_end(bx, btn[0]); + evas_object_show(btn[0]); + + btn[1] = elm_button_add(bx); + elm_object_text_set(btn[1], "Disable/Enable Button 1"); + evas_object_size_hint_weight_set(btn[1], EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(btn[1], EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_box_pack_end(bx, btn[1]); + evas_object_show(btn[1]); + + btn[2] = elm_button_add(bx); + elm_object_text_set(btn[2], "Disable/Enable Button 2"); + evas_object_size_hint_weight_set(btn[2], EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(btn[2], EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_box_pack_end(bx, btn[2]); + evas_object_show(btn[2]); + + btn[3] = elm_button_add(bx); + elm_object_text_set(btn[3], "Disable/Enable Button 3"); + evas_object_size_hint_weight_set(btn[3], EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(btn[3], EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_box_pack_end(bx, btn[3]); + evas_object_show(btn[3]); + + bx = elm_box_add(bx_out); + evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(bx, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_box_pack_end(bx_out, bx); + evas_object_show(bx); + evas_object_smart_callback_add(btn[0], "clicked", _disable_cb, bx); + + bt = elm_button_add(win); + elm_object_text_set(bt, "Button 1"); + evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_box_pack_end(bx, bt); + evas_object_show(bt); + evas_object_smart_callback_add(btn[1], "clicked", _disable_cb, bt); + + bt = elm_button_add(win); + elm_object_text_set(bt, "Button 2"); + evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_box_pack_end(bx, bt); + evas_object_show(bt); + evas_object_smart_callback_add(btn[2], "clicked", _disable_cb, bt); + + bt = elm_button_add(win); + elm_object_text_set(bt, "Button 3"); + evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_box_pack_end(bx, bt); + evas_object_show(bt); + evas_object_smart_callback_add(btn[3], "clicked", _disable_cb, bt); + + evas_object_resize(win, 300, 300); + evas_object_show(win); +} + +void +test_layout_disable(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + Evas_Object *win, *box, *ly, *bt; + Evas_Object *fr, *btn[3], *bx, *lb; + char buf[PATH_MAX]; + + win = elm_win_util_standard_add("layout", "Layout"); + elm_win_autodel_set(win, EINA_TRUE); + + box = elm_box_add(win); + evas_object_size_hint_weight_set(box, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_win_resize_object_add(win, box); + evas_object_show(box); + + fr = elm_frame_add(box); + evas_object_size_hint_weight_set(fr, EVAS_HINT_EXPAND, 0.0); + evas_object_size_hint_align_set(fr, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_box_pack_end(box, fr); + elm_object_text_set(fr, "Description"); + evas_object_show(fr); + + bx = elm_box_add(fr); + elm_object_content_set(fr, bx); + evas_object_show(bx); + + lb = elm_label_add(bx); + elm_object_text_set(lb, "This test shows how enable/disable of Container widget works"); + evas_object_size_hint_align_set(lb, 0.0, EVAS_HINT_FILL); + elm_box_pack_end(bx, lb); + evas_object_show(lb); + + btn[0] = elm_button_add(bx); + elm_object_text_set(btn[0], "Disable/Enable Layout"); + evas_object_size_hint_weight_set(btn[0], EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(btn[0], EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_box_pack_end(bx, btn[0]); + evas_object_show(btn[0]); + + btn[1] = elm_button_add(bx); + elm_object_text_set(btn[1], "Disable/Enable Button 1"); + evas_object_size_hint_weight_set(btn[1], EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(btn[1], EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_box_pack_end(bx, btn[1]); + evas_object_show(btn[1]); + + btn[2] = elm_button_add(bx); + elm_object_text_set(btn[2], "Disable/Enable Button 2"); + evas_object_size_hint_weight_set(btn[2], EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(btn[2], EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_box_pack_end(bx, btn[2]); + evas_object_show(btn[2]); + + btn[3] = elm_button_add(bx); + elm_object_text_set(btn[3], "Disable/Enable Button 3"); + evas_object_size_hint_weight_set(btn[3], EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(btn[3], EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_box_pack_end(bx, btn[3]); + evas_object_show(btn[3]); + + ly = elm_layout_add(win); + + if (!elm_layout_theme_set( + ly, "layout", "application", "titlebar")) + fprintf(stderr, "Failed to set layout"); + + elm_object_part_text_set(ly, "elm.text", "Layout Disable/Enable Test"); + evas_object_size_hint_weight_set(ly, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(ly, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_box_pack_end(box, ly); + evas_object_show(ly); + + ly = elm_layout_add(win); + snprintf(buf, sizeof(buf), "%s/objects/test.edj", elm_app_data_dir_get()); + elm_layout_file_set(ly, buf, "layout"); + evas_object_size_hint_weight_set(ly, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_box_pack_end(box, ly); + evas_object_show(ly); + evas_object_smart_callback_add(btn[0], "clicked", _disable_cb, ly); + + bt = elm_button_add(win); + elm_object_text_set(bt, "Button 1"); + elm_object_part_content_set(ly, "element1", bt); + evas_object_show(bt); + evas_object_smart_callback_add(btn[1], "clicked", _disable_cb, bt); + + bt = elm_button_add(win); + elm_object_text_set(bt, "Button 2"); + elm_object_part_content_set(ly, "element2", bt); + evas_object_show(bt); + evas_object_smart_callback_add(btn[2], "clicked", _disable_cb, bt); + + bt = elm_button_add(win); + elm_object_text_set(bt, "Button 3"); + elm_object_part_content_set(ly, "element3", bt); + evas_object_show(bt); + evas_object_smart_callback_add(btn[3], "clicked", _disable_cb, bt); + + evas_object_show(win); +} diff --git a/legacy/elementary/src/lib/elm_widget.c b/legacy/elementary/src/lib/elm_widget.c index c0dacac7b5..0323123c79 100644 --- a/legacy/elementary/src/lib/elm_widget.c +++ b/legacy/elementary/src/lib/elm_widget.c @@ -1098,6 +1098,15 @@ _elm_widget_sub_object_add(Eo *obj, Elm_Widget_Smart_Data *sd, Evas_Object *sobj else sdc->orient_mode = sd->orient_mode; + if (!sdc->on_create) + { + if (!sdc->disabled && (elm_widget_disabled_get(obj))) + { + elm_widget_focus_disabled_handle(sobj); + eo_do(sobj, elm_obj_widget_disable()); + } + } + _elm_widget_top_win_focused_set(sobj, sd->top_win_focused); /* update child focusable-ness on self and parents, now that a @@ -2860,19 +2869,71 @@ _elm_widget_top_win_focused_get(const Evas_Object *obj) return sd->top_win_focused; } +static void +_elm_widget_disabled_eval(const Evas_Object *obj, Eina_Bool disabled) +{ + const Eina_List *l; + Evas_Object *child; + ELM_WIDGET_DATA_GET(obj, sd); + + if (disabled) + { + EINA_LIST_FOREACH(sd->subobjs, l, child) + { + if (elm_widget_is(child)) + { + elm_widget_focus_disabled_handle(child); + eo_do(child, elm_obj_widget_disable()); + _elm_widget_disabled_eval(child, EINA_TRUE); + } + } + } + else + { + EINA_LIST_FOREACH(sd->subobjs, l, child) + { + ELM_WIDGET_DATA_GET(child, sdc); + if (elm_widget_is(child) && !sdc->disabled) + { + elm_widget_focus_disabled_handle(child); + eo_do(child, elm_obj_widget_disable()); + _elm_widget_disabled_eval(child, EINA_FALSE); + } + } + } +} + EOLIAN static void _elm_widget_disabled_set(Eo *obj, Elm_Widget_Smart_Data *sd, Eina_Bool disabled) { + Eina_Bool parent_state = EINA_FALSE; if (sd->disabled == disabled) return; sd->disabled = !!disabled; - elm_widget_focus_disabled_handle(obj); - eo_do(obj, elm_obj_widget_disable()); + + if (disabled) + { + elm_widget_focus_disabled_handle(obj); + eo_do(obj, elm_obj_widget_disable()); + _elm_widget_disabled_eval(obj, EINA_TRUE); + } + else + { + parent_state = elm_widget_disabled_get(elm_widget_parent_get(obj)); + if (parent_state) return; + elm_widget_focus_disabled_handle(obj); + eo_do(obj, elm_obj_widget_disable()); + _elm_widget_disabled_eval(obj, EINA_FALSE); + } } EOLIAN static Eina_Bool _elm_widget_disabled_get(Eo *obj EINA_UNUSED, Elm_Widget_Smart_Data *sd) { - return sd->disabled; + Eina_Bool disabled = EINA_FALSE; + + if (sd->disabled) disabled = EINA_TRUE; + else disabled = elm_widget_disabled_get(elm_widget_parent_get(obj)); + return disabled; } EOLIAN static void