const char *stacking;
const char *stacking_even;
- if ((!it) || (it->item->decorate_all_item_realized) ||
- (it->generation < GL_IT(it)->wsd->generation))
+ if ((!it) || (it->item->decorate_all_item_realized))
return;
it->deco_all_view = edje_object_add(evas_object_evas_get(WIDGET(it)));
char buf[1024];
int tsize = 20;
- if (it->generation < GL_IT(it)->wsd->generation) return;
if (it->realized)
{
if (it->item->order_num_in != in)
EINA_LIST_FOREACH(itb->items, l, it)
{
- if (it->generation < GL_IT(it)->wsd->generation) continue;
- else if (GL_IT(it)->wsd->reorder_it == it)
+ if (GL_IT(it)->wsd->reorder_it == it)
continue;
it->x = 0;
if (!sd->selected)
{
prev = ELM_GEN_ITEM_FROM_INLIST(sd->items->last);
- while ((prev) && (prev->generation < sd->generation))
+ while (prev)
prev = ELM_GEN_ITEM_FROM_INLIST(EINA_INLIST_GET(prev)->prev);
}
else
if (!sd->selected)
{
next = ELM_GEN_ITEM_FROM_INLIST(sd->items);
- while ((next) && (next->generation < sd->generation))
+ while (next)
next = ELM_GEN_ITEM_FROM_INLIST(EINA_INLIST_GET(next)->next);
}
else
if ((GL_IT(it)->wsd->select_mode == ELM_OBJECT_SELECT_MODE_NONE) ||
(!GL_IT(it)->wsd->highlight) ||
- (it->generation < GL_IT(it)->wsd->generation) ||
(it->highlighted) || elm_widget_item_disabled_get(it) ||
(it->select_mode == ELM_OBJECT_SELECT_MODE_NONE) ||
(it->item->deco_it_view) ||
static void
_item_unhighlight(Elm_Gen_Item *it)
{
- if ((it->generation < GL_IT(it)->wsd->generation) || (!it->highlighted))
+ if (!it->highlighted)
return;
edje_object_signal_emit(VIEW(it), "elm,state,unselected", "elm");
_elm_genlist_item_del_not_serious(Elm_Gen_Item *it)
{
elm_widget_item_pre_notify_del(it);
- it->generation = GL_IT(it)->wsd->generation - 1; /* This means that
- * the item is
- * deleted */
-
- if (it->walking > 0) return;
if (it->selected)
GL_IT(it)->wsd->selected =
eina_inlist_remove(GL_IT(it)->wsd->items, EINA_INLIST_GET(it));
if (it->tooltip.del_cb)
it->tooltip.del_cb((void *)it->tooltip.data, WIDGET(it), it);
- GL_IT(it)->wsd->walking -= it->walking;
if (it->long_timer)
{
ecore_timer_del(it->long_timer);
static void
_item_unselect(Elm_Gen_Item *it)
{
- if ((it->generation < GL_IT(it)->wsd->generation)) return;
_item_unhighlight(it); /* unhighlight the item first */
if (!it->selected) return; /* then check whether the item is selected */
te = evas_object_evas_get(obj);
- if ((it->generation < GL_IT(it)->wsd->generation) || (!it->realized)
- || (!it->item->deco_it_view)) return;
+ if ((!it->realized) || (!it->item->deco_it_view)) return;
evas_event_freeze(te);
it->item->nocache_once = EINA_FALSE;
itb->num = in;
EINA_LIST_FOREACH(itb->items, l, it)
{
- if (it->generation < GL_IT(it)->wsd->generation) continue;
show_me |= it->item->show_me;
if (!itb->realized)
{
char buf[1024];
Evas_Object *obj = (GL_IT(it)->wsd)->obj;
- if ((it->item->deco_it_view) || (it->generation <
- GL_IT(it)->wsd->generation)) return;
+ if (it->item->deco_it_view) return;
evas_event_freeze(evas_object_evas_get(obj));
it->item->deco_it_view = edje_object_add(evas_object_evas_get(WIDGET(it)));
elm_widget_can_focus_set(obj, EINA_TRUE);
elm_widget_on_show_region_hook_set(obj, _show_region_hook, NULL);
- priv->generation = 1;
-
if (!elm_layout_theme_set
(obj, "genlist", "base", elm_widget_style_get(obj)))
CRITICAL("Failed to set layout!");
}
static void
-_elm_genlist_clear(Evas_Object *obj,
- Eina_Bool standby)
+_elm_genlist_clear(Evas_Object *obj)
{
- Eina_Inlist *next, *l;
+ Elm_Gen_Item *it;
ELM_GENLIST_DATA_GET(obj, sd);
- if (!standby) sd->generation++;
-
if (sd->state)
{
eina_inlist_sorted_state_free(sd->state);
sd->state = NULL;
}
- if (sd->walking > 0)
- {
- sd->clear_me = EINA_TRUE;
- return;
- }
-
evas_event_freeze(evas_object_evas_get(sd->obj));
- for (l = sd->items, next = l ? l->next : NULL;
- l;
- l = next, next = next ? next->next : NULL)
+ // Do not use EINA_INLIST_FOREACH or EINA_INLIST_FOREACH_SAFE
+ // because sd->items can be modified inside elm_widget_item_del()
+ while (sd->items)
{
- Elm_Gen_Item *it = ELM_GEN_ITEM_FROM_INLIST(l);
-
- if (it->generation < sd->generation)
- {
- Elm_Gen_Item *itn = NULL;
-
- if (next) itn = ELM_GEN_ITEM_FROM_INLIST(next);
- if (itn) itn->walking++; /* prevent early death of subitem */
- it->del_cb(it);
- elm_widget_item_free(it);
- if (itn) itn->walking--;
- }
+ it = EINA_INLIST_CONTAINER_GET(sd->items->last, Elm_Gen_Item);
+ it->item->nocache_once = EINA_TRUE;
+ elm_widget_item_del(it);
}
- sd->clear_me = EINA_FALSE;
sd->pan_changed = EINA_TRUE;
if (!sd->queue)
{
{
Evas_Object *obj = WIDGET(it);
- if ((it->generation < GL_IT(it)->wsd->generation) ||
- (it->decorate_it_set) ||
+ if ((it->decorate_it_set) ||
(it->select_mode == ELM_OBJECT_SELECT_MODE_NONE) ||
(GL_IT(it)->wsd->select_mode == ELM_OBJECT_SELECT_MODE_NONE))
return;
return;
evas_object_ref(obj);
- it->walking++;
- GL_IT(it)->wsd->walking++;
if (it->func.func) it->func.func((void *)it->func.data, WIDGET(it), it);
- if (it->generation == GL_IT(it)->wsd->generation)
- evas_object_smart_callback_call(WIDGET(it), SIG_SELECTED, it);
-
- it->walking--;
- GL_IT(it)->wsd->walking--;
- if ((GL_IT(it)->wsd->clear_me) && (!GL_IT(it)->wsd->walking))
- _elm_genlist_clear(WIDGET(it), EINA_TRUE);
- else
- {
- if ((!it->walking) && (it->generation < GL_IT(it)->wsd->generation))
- {
- it->del_cb(it);
- elm_widget_item_free(it);
- }
- else
- GL_IT(it)->wsd->last_selected_item = (Elm_Object_Item *)it;
- }
+ evas_object_smart_callback_call(WIDGET(it), SIG_SELECTED, it);
evas_object_unref(obj);
}
Evas_Object *obj;
Elm_Gen_Item *it = (Elm_Gen_Item *)item;
- if (it->generation < GL_IT(it)->wsd->generation) return;
-
if (it->selected)
elm_genlist_item_selected_set(item, EINA_FALSE);
{
Elm_Gen_Item *it = (Elm_Gen_Item *)item;
- if (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;
+ _elm_genlist_item_del_not_serious(it);
+ if (it->item->block)
{
- // 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;
-
- _elm_genlist_item_del_not_serious(it);
- if (it->item->block)
- {
- if (it->realized) _elm_genlist_item_unrealize(it, EINA_FALSE);
- it->item->block->changed = EINA_TRUE;
- if (GL_IT(it)->wsd->calc_job)
- ecore_job_del(GL_IT(it)->wsd->calc_job);
- GL_IT(it)->wsd->calc_job =
- ecore_job_add(_calc_job, GL_IT(it)->wsd);
- }
- if (it->parent)
- {
- it->parent->item->items =
- eina_list_remove(it->parent->item->items, it);
- it->parent = NULL;
- }
- return EINA_FALSE;
+ if (it->realized) _elm_genlist_item_unrealize(it, EINA_FALSE);
+ it->item->block->changed = EINA_TRUE;
+ if (GL_IT(it)->wsd->calc_job)
+ ecore_job_del(GL_IT(it)->wsd->calc_job);
+ GL_IT(it)->wsd->calc_job =
+ ecore_job_add(_calc_job, GL_IT(it)->wsd);
+ }
+ if (it->parent)
+ {
+ it->parent->item->items =
+ eina_list_remove(it->parent->item->items, it);
+ it->parent = NULL;
}
_item_del(it);
it = elm_widget_item_new(sd->obj, Elm_Gen_Item);
if (!it) return NULL;
- it->generation = sd->generation;
it->itc = itc;
elm_genlist_item_class_ref((Elm_Genlist_Item_Class *)itc);
static void
_clear_eo(Eo *obj, void *_pd EINA_UNUSED, va_list *list EINA_UNUSED)
{
- _elm_genlist_clear(obj, EINA_FALSE);
+ _elm_genlist_clear(obj);
}
EAPI void
if (!sd->items) return;
it = ELM_GEN_ITEM_FROM_INLIST(sd->items);
- while ((it) && (it->generation < sd->generation))
+ while (it)
it = ELM_GEN_ITEM_FROM_INLIST(EINA_INLIST_GET(it)->next);
*ret = (Elm_Object_Item *)it;
if (!sd->items) return;
it = ELM_GEN_ITEM_FROM_INLIST(sd->items->last);
- while ((it) && (it->generation < sd->generation))
+ while (it)
it = ELM_GEN_ITEM_FROM_INLIST(EINA_INLIST_GET(it)->prev);
*ret = (Elm_Object_Item *)it;
while (it)
{
it = ELM_GEN_ITEM_FROM_INLIST(EINA_INLIST_GET(it)->next);
- if ((it) && (it->generation == GL_IT(it)->wsd->generation)) break;
+ if (it) break;
}
return (Elm_Object_Item *)it;
while (it)
{
it = ELM_GEN_ITEM_FROM_INLIST(EINA_INLIST_GET(it)->prev);
- if ((it) && (it->generation == GL_IT(it)->wsd->generation)) break;
+ if (it) break;
}
return (Elm_Object_Item *)it;
ELM_GENLIST_ITEM_CHECK_OR_RETURN(item);
sd = GL_IT(it)->wsd;
- if ((it->generation < sd->generation) || elm_widget_item_disabled_get(it))
+ if (elm_widget_item_disabled_get(it))
return;
selected = !!selected;
if (it->selected == selected) return;
Elm_Gen_Item *it = (Elm_Gen_Item *)item;
Evas_Coord gith = 0;
- if (it->generation < GL_IT(it)->wsd->generation) return EINA_FALSE;
if (!((GL_IT(it)->wsd->homogeneous) &&
(GL_IT(it)->wsd->mode == ELM_LIST_COMPRESS)))
{
ELM_GENLIST_ITEM_CHECK_OR_RETURN(item);
- if (it->generation < GL_IT(it)->wsd->generation) return;
_item_move_before
(it, (Elm_Gen_Item *)elm_genlist_first_item_get(WIDGET(it)));
}
Elm_Gen_Item *it = (Elm_Gen_Item *)item;
ELM_GENLIST_ITEM_CHECK_OR_RETURN(item);
- if (it->generation < GL_IT(it)->wsd->generation) return;
_item_move_after(it, (Elm_Gen_Item *)elm_genlist_last_item_get(WIDGET(it)));
}
ELM_GENLIST_ITEM_CHECK_OR_RETURN(item);
if (!it->item->block) return;
- if (it->generation < GL_IT(it)->wsd->generation) return;
it->item->mincalcd = EINA_FALSE;
it->item->updateme = EINA_TRUE;
it->item->block->updateme = EINA_TRUE;
ELM_GENLIST_ITEM_CHECK_OR_RETURN(item);
if (!it->item->block) return;
- if (it->generation < GL_IT(it)->wsd->generation) return;
if ((!itf) || (itf & ELM_GENLIST_ITEM_FIELD_TEXT))
{
if (!it->item->block) return;
EINA_SAFETY_ON_NULL_RETURN(itc);
- if (it->generation < GL_IT(it)->wsd->generation) return;
it->itc = itc;
it->item->nocache_once = EINA_TRUE;
Elm_Gen_Item *it = (Elm_Gen_Item *)item;
ELM_GENLIST_ITEM_CHECK_OR_RETURN(item, NULL);
- if (it->generation < GL_IT(it)->wsd->generation) return NULL;
return it->itc;
}
sd = GL_IT(it)->wsd;
if (!decorate_it_type) return;
- if ((it->generation < sd->generation) ||
- elm_widget_item_disabled_get(it)) return;
+ if (elm_widget_item_disabled_get(it)) return;
if (sd->decorate_all_mode) return;
if ((sd->mode_item == it) &&
ELM_GENLIST_ITEM_CHECK_OR_RETURN(item);
if (!it) return;
- if (it->generation < GL_IT(it)->wsd->generation) return;
if (mode >= ELM_OBJECT_SELECT_MODE_MAX)
return;
if (it->select_mode != mode)