Merge "[entry] remove autoenable_returnkey code"
authorSehwan Park <sehwan@samsung.com>
Mon, 20 Feb 2012 08:10:44 +0000 (17:10 +0900)
committerGerrit Code Review <gerrit2@localhost>
Mon, 20 Feb 2012 08:10:44 +0000 (17:10 +0900)
src/lib/elm_genlist.c
src/lib/elm_genlist.h

index c0a8370..9b78003 100644 (file)
@@ -106,24 +106,6 @@ struct _Widget_Data
    Elm_Genlist_Item *rename_it, *expanded_next_item;
 };
 
-struct _Item_Block
-{
-   EINA_INLIST;
-   int          count;
-   int          num;
-   int          reorder_offset;
-   Widget_Data *wd;
-   Eina_List   *items;
-   Evas_Coord   x, y, w, h, minw, minh;
-   Eina_Bool    want_unrealize : 1;
-   Eina_Bool    realized : 1;
-   Eina_Bool    changed : 1;
-   Eina_Bool    updateme : 1;
-   Eina_Bool    changeme : 1;
-   Eina_Bool    showme : 1;
-   Eina_Bool    must_recalc : 1;
-};
-
 struct _Elm_Genlist_Item
 {
    ELM_WIDGET_ITEM;
@@ -167,7 +149,9 @@ struct _Elm_Genlist_Item
    int                           walking;
    int                           expanded_depth;
    int                           order_num_in;
+   int                           position;
 
+   Eina_Bool                     position_update : 1;
    Eina_Bool                     before : 1;
 
    Eina_Bool                     want_unrealize : 1;
@@ -204,6 +188,28 @@ struct _Elm_Genlist_Item
    Evas_Coord  old_scrl_y;
 };
 
+struct _Item_Block
+{
+   EINA_INLIST;
+   int          count;
+   int          num;
+   int          reorder_offset;
+   Widget_Data *wd;
+   Eina_List   *items;
+   Evas_Coord   x, y, w, h, minw, minh;
+   int          position;
+   int          item_position_stamp;
+
+   Eina_Bool    position_update : 1;
+   Eina_Bool    want_unrealize : 1;
+   Eina_Bool    realized : 1;
+   Eina_Bool    changed : 1;
+   Eina_Bool    updateme : 1;
+   Eina_Bool    changeme : 1;
+   Eina_Bool    showme : 1;
+   Eina_Bool    must_recalc : 1;
+};
+
 struct _Item_Cache
 {
    EINA_INLIST;
@@ -329,6 +335,7 @@ static const char SIG_MULTI_SWIPE_DOWN[] = "multi,swipe,down";
 static const char SIG_MULTI_PINCH_OUT[] = "multi,pinch,out";
 static const char SIG_MULTI_PINCH_IN[] = "multi,pinch,in";
 static const char SIG_SWIPE[] = "swipe";
+static const char SIG_INDEX_UPDATE[] = "index,update";
 
 static const Evas_Smart_Cb_Description _signals[] = {
    {SIG_CLICKED_DOUBLE, ""},
@@ -791,6 +798,31 @@ _item_unhighlight(Elm_Genlist_Item *it)
 }
 
 static void
+_item_block_position_update(Eina_Inlist *list, int idx)
+{
+   Item_Block *tmp;
+
+   EINA_INLIST_FOREACH(list, tmp)
+     {
+        tmp->position = idx++;
+        tmp->position_update = EINA_TRUE;
+     }
+}
+
+static void
+_item_position_update(Eina_List *list, int idx)
+{
+   Elm_Genlist_Item *it;
+   Eina_List *l;
+
+   EINA_LIST_FOREACH(list, l, it)
+     {
+        it->position = idx++;
+        it->position_update = EINA_TRUE;
+     }
+}
+
+static void
 _item_block_del(Elm_Genlist_Item *it)
 {
    Eina_Inlist *il;
@@ -812,7 +844,10 @@ _item_block_del(Elm_Genlist_Item *it)
         if (it->parent)
           it->parent->items = eina_list_remove(it->parent->items, it);
         else
-          it->wd->blocks = eina_inlist_remove(it->wd->blocks, il);
+          {
+             _item_block_position_update(il->next, itb->position);
+             it->wd->blocks = eina_inlist_remove(it->wd->blocks, il);
+          }
         free(itb);
         if (itbn) itbn->changed = EINA_TRUE;
      }
@@ -834,6 +869,8 @@ _item_block_del(Elm_Genlist_Item *it)
                        itbp->count++;
                        itbp->changed = EINA_TRUE;
                     }
+                  _item_block_position_update(EINA_INLIST_GET(itb)->next,
+                                              itb->position);
                   it->wd->blocks = eina_inlist_remove(it->wd->blocks,
                                                       EINA_INLIST_GET(itb));
                   free(itb);
@@ -852,6 +889,8 @@ _item_block_del(Elm_Genlist_Item *it)
                        itbn->count++;
                        itbn->changed = EINA_TRUE;
                     }
+                  _item_block_position_update(EINA_INLIST_GET(itb)->next,
+                                              itb->position);
                   it->wd->blocks =
                     eina_inlist_remove(it->wd->blocks, EINA_INLIST_GET(itb));
                   free(itb);
@@ -916,18 +955,16 @@ _item_select(Elm_Genlist_Item *it)
 {
    Eina_List *l;
    Evas_Object *obj;
-   Evas_Object *parent = WIDGET(it);
 
    if ((it->wd->no_select) || (it->no_select) || (it->delete_me)) return;
-   if (it->selected)
+   if (!it->selected)
      {
-        if (it->wd->always_select) goto call;
-        return;
+        it->selected = EINA_TRUE;
+        it->wd->selected = eina_list_append(it->wd->selected, it);
      }
-   it->selected = EINA_TRUE;
-   it->wd->selected = eina_list_append(it->wd->selected, it);
-call:
-   evas_object_ref(parent);
+   else if (!it->wd->always_select) return;
+
+   evas_object_ref(WIDGET(it));
    it->walking++;
    it->wd->walking++;
    if (it->wd->last_selected_item &&
@@ -940,28 +977,27 @@ call:
           }
         ((Elm_Genlist_Item *)it->wd->last_selected_item)->can_focus = EINA_FALSE;
      }
-   if (it->func.func) it->func.func((void *)it->func.data, parent, it);
+   if (it->func.func) it->func.func((void *)it->func.data, WIDGET(it), it);
    if (!it->delete_me)
-     evas_object_smart_callback_call(parent, SIG_SELECTED, it);
+     evas_object_smart_callback_call(WIDGET(it), SIG_SELECTED, it);
    it->walking--;
    it->wd->walking--;
+   evas_object_unref(WIDGET(it));
    if ((it->wd->clear_me) && (!it->wd->walking))
-     {
-        _elm_genlist_clear(WIDGET(it), EINA_TRUE);
-        goto end;
-     }
+     _elm_genlist_clear(WIDGET(it), EINA_TRUE);
    else
      {
         if ((!it->walking) && (it->delete_me))
           {
-             if (!it->relcount) _item_del(it);
-             goto end;
+             if (!it->relcount)
+               {
+                  _item_del(it);
+                  elm_widget_item_free(it);
+               }
           }
+        else
+          it->wd->last_selected_item = (Elm_Object_Item *) it;
      }
-   // TODO: Remove 'if'?
-   if (it && it->wd) it->wd->last_selected_item = (Elm_Object_Item *) it;
-end:
-   evas_object_unref(parent);
 }
 
 static void
@@ -1812,6 +1848,16 @@ _item_cache_find(Elm_Genlist_Item *it)
 }
 
 static void
+_elm_genlist_item_index_update(Elm_Genlist_Item *it)
+{
+   if (it->position_update || it->block->position_update)
+     {
+        evas_object_smart_callback_call(WIDGET(it), SIG_INDEX_UPDATE, it);
+        it->position_update = EINA_FALSE;
+     }
+}
+
+static void
 _elm_genlist_item_odd_even_update(Elm_Genlist_Item *it)
 {
    if (!it->nostacking)
@@ -2166,6 +2212,7 @@ _item_realize(Elm_Genlist_Item *it,
              it->order_num_in = in;
              _elm_genlist_item_odd_even_update(it);
              _elm_genlist_item_state_update(it, NULL);
+             _elm_genlist_item_index_update(it);
           }
         evas_event_thaw(evas_object_evas_get(it->wd->obj));
         evas_event_thaw_eval(evas_object_evas_get(it->wd->obj));
@@ -2258,6 +2305,7 @@ _item_realize(Elm_Genlist_Item *it,
           _effect_item_realize(it, EINA_FALSE);
 
         _elm_genlist_item_state_update(it, itc);
+        _elm_genlist_item_index_update(it);
      }
 
    if ((calc) && (it->wd->homogeneous) &&
@@ -2471,6 +2519,7 @@ _item_block_recalc(Item_Block *itb,
    itb->minw = minw;
    itb->minh = minh;
    itb->changed = EINA_FALSE;
+   itb->position_update = EINA_FALSE;
    evas_event_thaw(evas_object_evas_get(itb->wd->obj));
    evas_event_thaw_eval(evas_object_evas_get(itb->wd->obj));
    return showme;
@@ -3884,16 +3933,36 @@ newblock:
                   wd->blocks =
                     eina_inlist_append(wd->blocks, EINA_INLIST_GET(itb));
                   itb->items = eina_list_append(itb->items, it);
+                  itb->position_update = EINA_TRUE;
+                  it->position = eina_list_count(itb->items);
+                  it->position_update = EINA_TRUE;
+
+                  if (wd->blocks != EINA_INLIST_GET(itb))
+                    {
+                       itb->position = ((Item_Block *) (EINA_INLIST_GET(itb)->prev))->position + 1;
+                    }
+                  else
+                    {
+                       itb->position = 0;
+                    }
                }
              else
                {
+                  Eina_List *tmp;
+
+                  tmp = eina_list_data_find_list(itb->items, it->rel);
                   if (it->before)
                     {
                        wd->blocks = eina_inlist_prepend_relative
                            (wd->blocks, EINA_INLIST_GET(itb),
                            EINA_INLIST_GET(it->rel->block));
                        itb->items =
-                         eina_list_prepend_relative(itb->items, it, it->rel);
+                         eina_list_prepend_relative_list(itb->items, it, tmp);
+
+                       /* Update index from where we prepended */
+                       _item_position_update(eina_list_prev(tmp), it->rel->position);
+                       _item_block_position_update(EINA_INLIST_GET(itb),
+                                                   it->rel->block->position);
                     }
                   else
                     {
@@ -3901,7 +3970,12 @@ newblock:
                            (wd->blocks, EINA_INLIST_GET(itb),
                            EINA_INLIST_GET(it->rel->block));
                        itb->items =
-                         eina_list_append_relative(itb->items, it, it->rel);
+                         eina_list_append_relative_list(itb->items, it, tmp);
+
+                       /* Update block index from where we appended */
+                       _item_position_update(eina_list_next(tmp), it->rel->position + 1);
+                       _item_block_position_update(EINA_INLIST_GET(itb),
+                                                   it->rel->block->position + 1);
                     }
                }
           }
@@ -3920,6 +3994,7 @@ newblock:
                             wd->blocks =
                               eina_inlist_prepend(wd->blocks,
                                                   EINA_INLIST_GET(itb));
+                            _item_block_position_update(wd->blocks, 0);
                          }
                     }
                   else
@@ -3929,8 +4004,11 @@ newblock:
                        itb->wd = wd;
                        wd->blocks =
                          eina_inlist_prepend(wd->blocks, EINA_INLIST_GET(itb));
+                       _item_block_position_update(wd->blocks, 0);
                     }
                   itb->items = eina_list_prepend(itb->items, it);
+
+                  _item_position_update(itb->items, 0);
                }
              else
                {
@@ -3945,6 +4023,15 @@ newblock:
                             wd->blocks =
                               eina_inlist_append(wd->blocks,
                                                  EINA_INLIST_GET(itb));
+                            itb->position_update = EINA_TRUE;
+                            if (wd->blocks != EINA_INLIST_GET(itb))
+                              {
+                                 itb->position = ((Item_Block *) (EINA_INLIST_GET(itb)->prev))->position + 1;
+                              }
+                            else
+                              {
+                                 itb->position = 0;
+                              }
                          }
                     }
                   else
@@ -3954,19 +4041,38 @@ newblock:
                        itb->wd = wd;
                        wd->blocks =
                          eina_inlist_append(wd->blocks, EINA_INLIST_GET(itb));
+                       itb->position_update = EINA_TRUE;
+                       if (wd->blocks != EINA_INLIST_GET(itb))
+                         {
+                            itb->position = ((Item_Block *) (EINA_INLIST_GET(itb)->prev))->position + 1;
+                         }
+                       else
+                         {
+                            itb->position = 0;
+                         }
                     }
                   itb->items = eina_list_append(itb->items, it);
+                  it->position = eina_list_count(itb->items);
                }
           }
      }
    else
      {
+        Eina_List *tmp;
+
         itb = it->rel->block;
+        tmp = eina_list_data_find_list(itb->items, it->rel);
         if (!itb) goto newblock;
         if (it->before)
-          itb->items = eina_list_prepend_relative(itb->items, it, it->rel);
+          {
+             itb->items = eina_list_prepend_relative_list(itb->items, it, tmp);
+             _item_position_update(eina_list_prev(tmp), it->rel->position);
+          }
         else
-          itb->items = eina_list_append_relative(itb->items, it, it->rel);
+          {
+             itb->items = eina_list_append_relative_list(itb->items, it, tmp);
+             _item_position_update(eina_list_next(tmp), it->rel->position + 1);
+          }
      }
    itb->count++;
    itb->changed = EINA_TRUE;
@@ -4835,6 +4941,26 @@ elm_genlist_item_show(Elm_Object_Item *it)
 }
 
 EAPI void
+elm_genlist_item_promote(Elm_Object_Item *it)
+{
+   ELM_OBJ_ITEM_CHECK_OR_RETURN(it);
+   Elm_Genlist_Item *_it = (Elm_Genlist_Item *) it;
+   if (_it->delete_me) return;
+   _item_move_before(_it,
+                     (Elm_Genlist_Item *) elm_genlist_first_item_get(WIDGET(_it)));
+}
+
+EAPI void
+elm_genlist_item_demote(Elm_Object_Item *it)
+{
+   ELM_OBJ_ITEM_CHECK_OR_RETURN(it);
+   Elm_Genlist_Item *_it = (Elm_Genlist_Item *) it;
+   if (_it->delete_me) return;
+   _item_move_after(_it,
+                    (Elm_Genlist_Item *) elm_genlist_last_item_get(WIDGET(_it)));
+}
+
+EAPI void
 elm_genlist_item_bring_in(Elm_Object_Item *it)
 {
    ELM_OBJ_ITEM_CHECK_OR_RETURN(it);
@@ -5328,7 +5454,7 @@ elm_genlist_item_index_get(Elm_Object_Item *it)
    Elm_Genlist_Item *_it = (Elm_Genlist_Item *) it;
 
    if (_it->block)
-     return 0; //_it->position + _it->block->position; //upstream
+     return _it->position + (_it->block->position * _it->wd->max_items_per_block);
    return -1;
 }
 
index 7548101..eb2ae75 100644 (file)
@@ -1372,6 +1372,24 @@ EAPI const Evas_Object            *elm_genlist_item_object_get(const Elm_Object_
 EAPI void                          elm_genlist_item_update(Elm_Object_Item *it);
 
 /**
+ * Promote an item to the top of the list
+ *
+ * @param it The item
+ *
+ * @ingroup Genlist
+ */
+EAPI void                          elm_genlist_item_promote(Elm_Object_Item *it);
+
+/**
+ * Demote an item to the end of the list
+ *
+ * @param it The item
+ *
+ * @ingroup Genlist
+ */
+EAPI void                          elm_genlist_item_demote(Elm_Object_Item *it);
+
+/**
  * Update the part of an item
  *
  * @param it The item