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;
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;
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;
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, ""},
}
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;
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;
}
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);
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);
{
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 &&
}
((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
}
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)
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));
_effect_item_realize(it, EINA_FALSE);
_elm_genlist_item_state_update(it, itc);
+ _elm_genlist_item_index_update(it);
}
if ((calc) && (it->wd->homogeneous) &&
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;
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
{
(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);
}
}
}
wd->blocks =
eina_inlist_prepend(wd->blocks,
EINA_INLIST_GET(itb));
+ _item_block_position_update(wd->blocks, 0);
}
}
else
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
{
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
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;
}
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);
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;
}