efl_ui_pager: track lifetime of children
authorMarcel Hollerbach <mail@marcel-hollerbach.de>
Fri, 26 Apr 2019 18:22:14 +0000 (20:22 +0200)
committerHermet Park <hermetpark@gmail.com>
Wed, 8 May 2019 04:25:02 +0000 (13:25 +0900)
when a child is deleted (externally), the widget should be forgotten
internally.

Reviewed-by: Cedric BAIL <cedric.bail@free.fr>
Differential Revision: https://phab.enlightenment.org/D8751

src/lib/elementary/efl_ui_pager.c

index 620b8e8..69e89ad 100644 (file)
@@ -11,6 +11,8 @@
 
 #define MY_CLASS EFL_UI_PAGER_CLASS
 
+static void _unpack(Eo *obj, Efl_Ui_Pager_Data *pd, Efl_Gfx_Entity *subobj, int index);
+
 static int
 clamp_index(Efl_Ui_Pager_Data *pd, int index)
 {
@@ -420,6 +422,20 @@ _efl_ui_pager_efl_container_content_count(Eo *obj EINA_UNUSED,
    return pd->cnt;
 }
 
+static void
+_child_inv(void *data, const Efl_Event *ev)
+{
+   Efl_Ui_Pager_Data *pd = efl_data_scope_get(data, EFL_UI_PAGER_CLASS);
+   int index = eina_list_data_idx(pd->content_list, ev->object);
+
+   pd->content_list = eina_list_remove(pd->content_list, ev->object);
+
+   if (((index == pd->curr.page) && ((index != 0) || (pd->cnt == 0))) ||
+       (index < pd->curr.page))
+     pd->curr.page--;
+   pd->cnt--;
+}
+
 static Eina_Bool
 _register_child(Eo *obj EINA_UNUSED, Efl_Ui_Pager_Data *pd, Efl_Gfx_Entity *subobj)
 {
@@ -434,6 +450,8 @@ _register_child(Eo *obj EINA_UNUSED, Efl_Ui_Pager_Data *pd, Efl_Gfx_Entity *subo
    if (!pd->transition)
      efl_canvas_object_clipper_set(subobj, pd->backclip);
 
+   efl_event_callback_add(subobj, EFL_EVENT_INVALIDATE, _child_inv, obj);
+
    return EINA_TRUE;
 }
 
@@ -801,7 +819,8 @@ _efl_ui_pager_loop_mode_get(const Eo *obj EINA_UNUSED,
 }
 
 static void
-_unpack_all(Efl_Ui_Pager_Data *pd,
+_unpack_all(Eo *obj EINA_UNUSED,
+            Efl_Ui_Pager_Data *pd,
             Eina_Bool clear)
 {
    Eo *subobj;
@@ -825,12 +844,18 @@ _unpack_all(Efl_Ui_Pager_Data *pd,
    if (clear)
      {
         EINA_LIST_FREE(pd->content_list, subobj)
-           evas_object_del(subobj);
+          {
+             efl_event_callback_del(subobj, EFL_EVENT_INVALIDATE, _child_inv, obj);
+             evas_object_del(subobj);
+          }
      }
    else
      {
         EINA_LIST_FREE(pd->content_list, subobj)
-           efl_canvas_object_clipper_set(subobj, NULL);
+          {
+             efl_event_callback_del(subobj, EFL_EVENT_INVALIDATE, _child_inv, obj);
+             efl_canvas_object_clipper_set(subobj, NULL);
+          }
      }
 
    if (pd->indicator)
@@ -843,7 +868,7 @@ EOLIAN static Eina_Bool
 _efl_ui_pager_efl_pack_pack_clear(Eo *obj EINA_UNUSED,
                                   Efl_Ui_Pager_Data *pd)
 {
-   _unpack_all(pd, EINA_TRUE);
+   _unpack_all(obj, pd, EINA_TRUE);
 
    return EINA_TRUE;
 }
@@ -852,7 +877,7 @@ EOLIAN static Eina_Bool
 _efl_ui_pager_efl_pack_unpack_all(Eo *obj EINA_UNUSED,
                                   Efl_Ui_Pager_Data *pd)
 {
-   _unpack_all(pd, EINA_FALSE);
+   _unpack_all(obj, pd, EINA_FALSE);
 
    return EINA_TRUE;
 }
@@ -897,6 +922,8 @@ _unpack(Eo *obj,
 
    if (pd->indicator)
      efl_page_indicator_unpack(pd->indicator, index);
+
+   efl_event_callback_del(subobj, EFL_EVENT_INVALIDATE, _child_inv, obj);
 }
 
 EOLIAN static Eina_Bool