ui.relative_layout: add callbacks to update layout 79/204779/2
authorYeongjong Lee <yj34.lee@samsung.com>
Wed, 24 Apr 2019 11:32:45 +0000 (20:32 +0900)
committerYeongJong Lee <yj34.lee@samsung.com>
Fri, 26 Apr 2019 08:05:56 +0000 (08:05 +0000)
Summary:
If the size or hints of a child changes, relative_layout need to update layout.
And, if a child is deleted, it should be unregisterd from relative_layout.

Depends on D8625

Test Plan: elementary_test -to 'efl.ui.relative_layout'

Reviewers: Jaehyun_Cho

Reviewed By: Jaehyun_Cho

Subscribers: cedric, #reviewers, #committers

Tags: #efl

Differential Revision: https://phab.enlightenment.org/D8626

Change-Id: I591ffef693eee563e9a7d266b7e122936aa7aa7b

src/bin/elementary/test_ui_relative_layout.c
src/lib/elementary/efl_ui_relative_layout.c

index dbb1647..f1d58af 100644 (file)
@@ -120,8 +120,6 @@ _slider_changed_align_cb(void *data, const Efl_Event *event)
      efl_gfx_hint_align_set(btn, val, y);
    else if (opt == 'y')
      efl_gfx_hint_align_set(btn, x, val);
-
-   efl_pack_layout_request(layout);
 }
 
 static void
index 90a8c82..9b42d9d 100644 (file)
@@ -24,6 +24,40 @@ _chain_sort_cb(const void *l1, const void *l2)
    return calc2->comp_factor <= calc1->comp_factor ? -1 : 1;
 }
 
+static void
+_on_child_size_changed(void *data, const Efl_Event *event EINA_UNUSED)
+{
+   Efl_Ui_Relative_Layout_Data *pd = data;
+
+   efl_pack_layout_request(pd->obj);
+}
+
+static void
+_on_child_hints_changed(void *data, const Efl_Event *event EINA_UNUSED)
+{
+   Efl_Ui_Relative_Layout_Data *pd = data;
+
+   efl_pack_layout_request(pd->obj);
+}
+
+static void
+_on_child_del(void *data, const Efl_Event *event)
+{
+   Efl_Ui_Relative_Layout_Data *pd = data;
+
+   if (eina_hash_del_by_key(pd->children, &event->object))
+     efl_pack_layout_request(pd->obj);
+   else
+     ERR("child(%p(%s)) is not registered", event->object,
+         efl_class_name_get(event->object));
+}
+
+EFL_CALLBACKS_ARRAY_DEFINE(efl_ui_relative_layout_callbacks,
+  { EFL_GFX_ENTITY_EVENT_SIZE_CHANGED, _on_child_size_changed },
+  { EFL_GFX_ENTITY_EVENT_HINTS_CHANGED, _on_child_hints_changed },
+  { EFL_EVENT_DEL, _on_child_del }
+);
+
 static Efl_Ui_Relative_Layout_Child *
 _efl_ui_relative_layout_register(Efl_Ui_Relative_Layout_Data *pd, Eo *child)
 {
@@ -48,6 +82,7 @@ _efl_ui_relative_layout_register(Efl_Ui_Relative_Layout_Data *pd, Eo *child)
 
    efl_key_data_set(child, "_elm_leaveme", pd->obj);
    efl_canvas_object_clipper_set(child, pd->clipper);
+   efl_event_callback_array_add(child, efl_ui_relative_layout_callbacks(), pd);
    efl_canvas_group_member_add(pd->obj, child);
    efl_canvas_group_change(pd->obj);
 
@@ -539,7 +574,7 @@ _efl_ui_relative_layout_unregister(Eo *obj, Efl_Ui_Relative_Layout_Data *pd, Efl
         efl_canvas_group_member_remove(obj, child);
         efl_canvas_object_clipper_set(child, NULL);
         efl_key_data_set(child, "_elm_leaveme", NULL);
-
+        efl_event_callback_array_del(child, efl_ui_relative_layout_callbacks(), pd);
         efl_pack_layout_request(obj);
      }
    else