genlist: process item block positioning before relative item deleted 34/144534/2
authorSangHyeon Jade Lee <dltkdgus1764@gmail.com>
Thu, 17 Aug 2017 06:14:46 +0000 (15:14 +0900)
committerSangHyeon Jade Lee <dltkdgus1764@gmail.com>
Thu, 17 Aug 2017 08:00:22 +0000 (17:00 +0900)
Change-Id: Iac552c946bd37e0abf551c1c74a6a08a3c6a5acc
Signed-off-by: SangHyeon Jade Lee <dltkdgus1764@gmail.com>
src/lib/elm_genlist.c
src/mobile_lib/elm_genlist.c

index 75c8ced..adf4e1b 100644 (file)
@@ -171,6 +171,9 @@ static void _decorate_item_set(Elm_Gen_Item *);
 static void _internal_elm_genlist_clear(Evas_Object *obj);
 static Eina_Bool _item_filtered_get(Elm_Gen_Item *it);
 
+static Eina_Bool _item_process(Elm_Genlist_Data *sd, Elm_Gen_Item *it);
+static void _item_process_post(Elm_Genlist_Data *sd, Elm_Gen_Item *it,Eina_Bool qadd);
+
 static const Elm_Action key_actions[] = {
    {"move", _key_action_move},
    {"select", _key_action_select},
@@ -3901,16 +3904,26 @@ _item_del(Elm_Gen_Item *it)
 
    evas_event_freeze(evas_object_evas_get(obj));
 
+   if (it->item->rel_revs)
+     {
+        Elm_Gen_Item *tmp;
+        EINA_LIST_FREE(it->item->rel_revs, tmp)
+          {
+             if (tmp->item->queued && !(tmp->base)->on_deletion)
+               {
+                  tmp->item->queued = EINA_FALSE;
+                  sd->queue = eina_list_remove(sd->queue, tmp);
+                  _item_process(sd, tmp);
+                  _item_process_post(sd, tmp, EINA_TRUE);
+               }
+             tmp->item->rel = NULL;
+          }
+     }
    if (it->item->rel)
      {
         it->item->rel->item->rel_revs =
            eina_list_remove(it->item->rel->item->rel_revs, it);
      }
-   if (it->item->rel_revs)
-     {
-        Elm_Gen_Item *tmp;
-        EINA_LIST_FREE(it->item->rel_revs, tmp) tmp->item->rel = NULL;
-     }
    elm_genlist_item_subitems_clear(EO_OBJ(it));
    if (sd->show_item == it) sd->show_item = NULL;
    if (it->realized) _elm_genlist_item_unrealize(it, EINA_FALSE);
index 6d32c1a..367d7b4 100644 (file)
@@ -6376,6 +6376,33 @@ _item_free(Elm_Gen_Item *it)
    sd->del_fx.pending_items = eina_list_remove(sd->del_fx.pending_items, it);
    sd->add_fx.items = eina_list_remove(sd->add_fx.items, it);
 #endif
+
+   if (GL_IT(it)->rel)
+     GL_IT(it)->rel->item->rel_revs =
+        eina_list_remove(GL_IT(it)->rel->item->rel_revs, it);
+   if (GL_IT(it)->rel_revs)
+     {
+        Elm_Gen_Item *tmp;
+        EINA_LIST_FREE(GL_IT(it)->rel_revs, tmp)
+          {
+             if (tmp->item->queued && !(tmp->base)->on_deletion)
+               {
+                  GL_IT(tmp)->queued = EINA_FALSE;
+                  GL_IT(tmp)->resized = EINA_FALSE;
+                  sd->queue = eina_list_remove(sd->queue, tmp);
+                  _item_process(sd, tmp);
+               }
+             tmp->item->rel = NULL;
+          }
+     }
+   EINA_LIST_FOREACH_SAFE(it->item->items, l, ll, eo_it2)
+     {
+        //elm_widget_item_del(it2);
+        ELM_GENLIST_ITEM_DATA_GET(eo_it2, it2);
+        _item_free(it2);
+     }
+   sd->reorder.move_items = eina_list_remove(sd->reorder.move_items, it);
+
    if (GL_IT(it)->block) _item_block_del(it);
    if (it->parent)
      it->parent->item->items =
@@ -6393,23 +6420,6 @@ _item_free(Elm_Gen_Item *it)
    if (GL_IT(it)->type == ELM_GENLIST_ITEM_GROUP)
       sd->group_items = eina_list_remove(sd->group_items, it);
 
-   // FIXME: relative will be better to be fixed. it is too harsh.
-   if (GL_IT(it)->rel)
-     GL_IT(it)->rel->item->rel_revs =
-        eina_list_remove(GL_IT(it)->rel->item->rel_revs, it);
-   if (GL_IT(it)->rel_revs)
-     {
-        Elm_Gen_Item *tmp;
-        EINA_LIST_FREE(GL_IT(it)->rel_revs, tmp) tmp->item->rel = NULL;
-     }
-   EINA_LIST_FOREACH_SAFE(it->item->items, l, ll, eo_it2)
-     {
-        //elm_widget_item_del(it2);
-        ELM_GENLIST_ITEM_DATA_GET(eo_it2, it2);
-        _item_free(it2);
-     }
-
-   sd->reorder.move_items = eina_list_remove(sd->reorder.move_items, it);
    if (it->selected)
       {
          sd->selected = eina_list_remove(sd->selected, EO_OBJ(it));