raster pushed a commit to branch master.

commit 3f4c3e03c600c87782543cf08de886016f2c192e
Author: Tae-Hwan Kim <[email protected]>
Date:   Fri Mar 29 22:23:38 2013 +0900

    Because of relcount, genlist items cannot be deleted immediately.
    If we use reverse relatvie lists, we can delete item immediately.
---
 src/lib/elm_genlist.c        | 53 +++++++++++++++-----------------------------
 src/lib/elm_widget_genlist.h |  1 +
 2 files changed, 19 insertions(+), 35 deletions(-)

diff --git a/src/lib/elm_genlist.c b/src/lib/elm_genlist.c
index 3672714..9af7f22 100644
--- a/src/lib/elm_genlist.c
+++ b/src/lib/elm_genlist.c
@@ -2917,7 +2917,7 @@ _elm_genlist_item_del_not_serious(Elm_Gen_Item *it)
                                                      * the item is
                                                      * deleted */
 
-   if ((it->relcount > 0) || (it->walking > 0)) return;
+   if (it->walking > 0) return;
 
    if (it->selected)
      GL_IT(it)->wsd->selected =
@@ -3499,20 +3499,12 @@ _item_block_new(Elm_Genlist_Smart_Data *sd,
    return itb;
 }
 
-/**
- * @internal
- *
- * This function adds an item to a block's item list. This may or may not
- * rearrange existing blocks and create a new block.
- *
- */
 static Eina_Bool
 _item_block_add(Elm_Genlist_Smart_Data *sd,
                 Elm_Gen_Item *it)
 {
    Item_Block *itb = NULL;
 
-   // when a new item does not depend on another item
    if (!it->item->rel)
      {
 newblock:
@@ -3580,7 +3572,6 @@ newblock:
           }
         else
           {
-             // item move_before, prepend, insert_before, sorted_insert with 
before
              if (it->item->before)
                {
                   if (sd->blocks)
@@ -3601,7 +3592,6 @@ newblock:
 
                   _item_position_update(itb->items, 0);
                }
-             // item move_after, append, insert_after, sorted_insert without 
before
              else
                {
                   if (sd->blocks)
@@ -3623,7 +3613,6 @@ newblock:
                }
           }
      }
-   // when a new item depends on another item
    else
      {
         Eina_List *tmp;
@@ -3666,17 +3655,6 @@ newblock:
    it->item->block = itb;
    if (itb->sd->calc_job) ecore_job_del(itb->sd->calc_job);
    itb->sd->calc_job = ecore_job_add(_calc_job, itb->sd);
-   if (it->item->rel)
-     {
-        it->item->rel->relcount--;
-        if ((it->item->rel->generation < GL_IT(it)->wsd->generation)
-            && (!it->item->rel->relcount))
-          {
-             _item_del(it->item->rel);
-             elm_widget_item_free(it->item->rel);
-          }
-        it->item->rel = NULL;
-     }
 
    if (itb->count > itb->sd->max_items_per_block)
      {
@@ -3939,7 +3917,7 @@ _item_move_after(Elm_Gen_Item *it,
    GL_IT(it)->wsd->items = eina_inlist_append_relative
        (GL_IT(it)->wsd->items, EINA_INLIST_GET(it), EINA_INLIST_GET(after));
    it->item->rel = after;
-   it->item->rel->relcount++;
+   after->item->rel_revs = eina_list_append(after->item->rel_revs, it);
    it->item->before = EINA_FALSE;
    if (after->item->group_item) it->item->group_item = after->item->group_item;
    _item_queue(GL_IT(it)->wsd, it, NULL);
@@ -4010,7 +3988,7 @@ _item_move_before(Elm_Gen_Item *it,
    GL_IT(it)->wsd->items = eina_inlist_prepend_relative
        (GL_IT(it)->wsd->items, EINA_INLIST_GET(it), EINA_INLIST_GET(before));
    it->item->rel = before;
-   it->item->rel->relcount++;
+   before->item->rel_revs = eina_list_append(before->item->rel_revs, it);
    it->item->before = EINA_TRUE;
    if (before->item->group_item)
      it->item->group_item = before->item->group_item;
@@ -5060,11 +5038,8 @@ _item_select(Elm_Gen_Item *it)
      {
         if ((!it->walking) && (it->generation < GL_IT(it)->wsd->generation))
           {
-             if (!it->relcount)
-               {
-                  it->del_cb(it);
-                  elm_widget_item_free(it);
-               }
+             it->del_cb(it);
+             elm_widget_item_free(it);
           }
         else
           GL_IT(it)->wsd->last_selected_item = (Elm_Object_Item *)it;
@@ -5141,6 +5116,15 @@ _item_del_pre_hook(Elm_Object_Item *item)
 
    if ((it->relcount > 0) || (it->walking > 0))
      {
+     // FIXME: relative will be better to be fixed. it is too harsh.
+      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(item);
         if (GL_IT(it)->wsd->show_item == it)
           GL_IT(it)->wsd->show_item = NULL;
@@ -5329,7 +5313,7 @@ _item_append(Eo *obj EINA_UNUSED, void *_pd, va_list 
*list)
         sd->items = eina_inlist_append_relative
             (sd->items, EINA_INLIST_GET(it), EINA_INLIST_GET(it2));
         it->item->rel = it2;
-        it->item->rel->relcount++;
+        it2->item->rel_revs = eina_list_append(it2->item->rel_revs, it);
      }
    it->item->before = EINA_FALSE;
    _item_queue(sd, it, NULL);
@@ -5390,7 +5374,7 @@ _item_prepend(Eo *obj EINA_UNUSED, void *_pd, va_list 
*list)
         sd->items = eina_inlist_prepend_relative
             (sd->items, EINA_INLIST_GET(it), EINA_INLIST_GET(it2));
         it->item->rel = it2;
-        it->item->rel->relcount++;
+        it2->item->rel_revs = eina_list_append(it2->item->rel_revs, it);
      }
    it->item->before = EINA_TRUE;
    _item_queue(sd, it, NULL);
@@ -5457,7 +5441,7 @@ _item_insert_after(Eo *obj EINA_UNUSED, void *_pd, 
va_list *list)
        (sd->items, EINA_INLIST_GET(it), EINA_INLIST_GET(after));
 
    it->item->rel = after;
-   it->item->rel->relcount++;
+   after->item->rel_revs = eina_list_append(after->item->rel_revs, it);
    it->item->before = EINA_FALSE;
    _item_queue(sd, it, NULL);
 
@@ -5522,7 +5506,6 @@ _item_insert_before(Eo *obj EINA_UNUSED, void *_pd, 
va_list *list)
        (sd->items, EINA_INLIST_GET(it), EINA_INLIST_GET(before));
 
    it->item->rel = before;
-   it->item->rel->relcount++;
    it->item->before = EINA_TRUE;
    _item_queue(sd, it, NULL);
 
@@ -5631,7 +5614,7 @@ _item_sorted_insert(Eo *obj EINA_UNUSED, void *_pd, 
va_list *list)
    if (rel)
      {
         it->item->rel = rel;
-        it->item->rel->relcount++;
+        rel->item->rel_revs = eina_list_append(rel->item->rel_revs, it);
      }
 
    _item_queue(sd, it, _elm_genlist_item_list_compare);
diff --git a/src/lib/elm_widget_genlist.h b/src/lib/elm_widget_genlist.h
index d001cfc..6a24d66 100644
--- a/src/lib/elm_widget_genlist.h
+++ b/src/lib/elm_widget_genlist.h
@@ -200,6 +200,7 @@ struct Elm_Gen_Item_Type
    Evas_Coord              scrl_x, scrl_y, old_scrl_y;
 
    Elm_Gen_Item           *rel;
+   Eina_List              *rel_revs; // FIXME: find better way not to use this
    Evas_Object            *deco_it_view;
    int                     expanded_depth;
    int                     order_num_in;

-- 

------------------------------------------------------------------------------
Own the Future-Intel(R) Level Up Game Demo Contest 2013
Rise to greatness in Intel's independent game demo contest. Compete 
for recognition, cash, and the chance to get your game on Steam. 
$5K grand prize plus 10 genre and skill prizes. Submit your demo 
by 6/6/13. http://altfarm.mediaplex.com/ad/ck/12124-176961-30367-2

Reply via email to