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

-- 


Reply via email to