raster pushed a commit to branch master. http://git.enlightenment.org/core/elementary.git/commit/?id=7d6c0d12e676d5981b4110a74ffc6fe00699add3
commit 7d6c0d12e676d5981b4110a74ffc6fe00699add3 Author: shilpa.singh <shilpa.si...@samsung.com> Date: Thu Jan 8 16:06:34 2015 +0900 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 --- src/bin/Makefile.am | 1 + src/bin/test.c | 5 ++ src/bin/test_disable.c | 207 +++++++++++++++++++++++++++++++++++++++++++++++++ src/lib/elm_widget.c | 67 +++++++++++++++- 4 files changed, 277 insertions(+), 3 deletions(-) diff --git a/src/bin/Makefile.am b/src/bin/Makefile.am index fbddf40..8c438da 100644 --- a/src/bin/Makefile.am +++ b/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/src/bin/test.c b/src/bin/test.c index eeec24a..f812bb0 100644 --- a/src/bin/test.c +++ b/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/src/bin/test_disable.c b/src/bin/test_disable.c new file mode 100644 index 0000000..9895369 --- /dev/null +++ b/src/bin/test_disable.c @@ -0,0 +1,207 @@ +#ifdef HAVE_CONFIG_H +# include "elementary_config.h" +#endif +#include <Elementary.h> + +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/src/lib/elm_widget.c b/src/lib/elm_widget.c index c0dacac..0323123 100644 --- a/src/lib/elm_widget.c +++ b/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 --