static void
_item_cache_free(Item_Cache *itc)
{
+ Evas_Object *c;
if (!itc) return;
evas_object_del(itc->spacer);
evas_object_del(itc->base_view);
eina_stringshare_del(itc->item_style);
+ EINA_LIST_FREE(itc->contents, c)
+ evas_object_del(c);
ELM_SAFE_FREE(itc ,free);
}
// add an item to item cache
static Eina_Bool
-_item_cache_add(Elm_Gen_Item *it)
+_item_cache_add(Elm_Gen_Item *it, Eina_List *contents)
{
if (it->item->nocache_once || it->item->nocache) return EINA_FALSE;
itc->spacer = it->spacer;
itc->base_view = VIEW(it);
itc->item_style = eina_stringshare_add(it->itc->item_style);
+ itc->contents = contents;
if (!it->group)
{
itc->spacer = NULL;
itc->base_view = NULL;
+ itc->contents = eina_list_free(itc->contents);
_item_cache_free(itc);
return EINA_TRUE;
}
const char *parts)
{
Evas_Object *content;
+ Eina_List *source;
+ const char *key;
if (!parts)
{
EINA_LIST_FREE(*contents, content)
evas_object_del(content);
}
- if (it->itc->func.content_get)
- {
- Eina_List *source;
- const char *key;
+ if ((!it->itc->func.content_get) &&
+ ((it->itc->version < 4) || (!it->itc->func.reusable_content_get))) return;
- source = elm_widget_stringlist_get(edje_object_data_get(target, src));
+ source = elm_widget_stringlist_get(edje_object_data_get(target, src));
- EINA_LIST_FREE(source, key)
- {
- if (parts && fnmatch(parts, key, FNM_PERIOD))
- continue;
+ EINA_LIST_FREE(source, key)
+ {
+ if (parts && fnmatch(parts, key, FNM_PERIOD))
+ continue;
- Evas_Object *old = edje_object_part_swallow_get(target, key);
- if (old)
- {
- *contents = eina_list_remove(*contents, old);
- evas_object_del(old);
- }
- content = NULL;
+ Evas_Object *old = edje_object_part_swallow_get(target, key);
+ // Reuse content by popping from the cache
+ content = NULL;
+ if (it->itc->func.reusable_content_get)
+ content = it->itc->func.reusable_content_get(
+ (void *)WIDGET_ITEM_DATA_GET(EO_OBJ(it)), WIDGET(it), key, old);
+ if (!content)
+ {
if (it->itc->func.content_get)
content = it->itc->func.content_get
((void *)WIDGET_ITEM_DATA_GET(EO_OBJ(it)), WIDGET(it), key);
- if (!content) continue;
- *contents = eina_list_append(*contents, content);
- if (!edje_object_part_swallow(target, key, content))
- {
- ERR("%s (%p) can not be swallowed into %s",
- evas_object_type_get(content), content, key);
- evas_object_hide(content);
- continue;
- }
- elm_widget_sub_object_add(WIDGET(it), content);
- if (elm_wdg_item_disabled_get(EO_OBJ(it)))
- elm_widget_disabled_set(content, EINA_TRUE);
+ if (!content) goto out;
+ }
+ *contents = eina_list_append(*contents, content);
+ if (!edje_object_part_swallow(target, key, content))
+ {
+ ERR("%s (%p) can not be swallowed into %s",
+ evas_object_type_get(content), content, key);
+ evas_object_del(content);
+ goto out;
+ }
+ elm_widget_sub_object_add(WIDGET(it), content);
+ if (elm_wdg_item_disabled_get(EO_OBJ(it)))
+ elm_widget_disabled_set(content, EINA_TRUE);
+out:
+ if (old && content != old)
+ {
+ *contents = eina_list_remove(*contents, old);
+ evas_object_del(old);
}
}
}
edje_object_part_text_set(view, part, NULL);
ELM_SAFE_FREE(*texts, elm_widget_stringlist_free);
+ if (!contents) return;
EINA_LIST_FREE(*contents, c)
evas_object_del(c);
}
efl_event_callback_legacy_call(WIDGET(it), ELM_GENGRID_EVENT_UNREALIZED, EO_OBJ(it));
ELM_SAFE_FREE(it->long_timer, ecore_timer_del);
- _view_clear(VIEW(it), &(it->texts), &(it->contents));
+ _view_clear(VIEW(it), &(it->texts), NULL);
ELM_SAFE_FREE(it->states, elm_widget_stringlist_free);
elm_wdg_item_track_cancel(EO_OBJ(it));
}
}
+static Eina_List *
+_content_cache_add(Elm_Gen_Item *it, Eina_List **cache)
+{
+ Evas_Object *content = NULL;
+ EINA_LIST_FREE(it->contents, content)
+ {
+ *cache = eina_list_append(*cache, content);
+ }
+
+ return *cache;
+}
+
static void
_item_unrealize_cb(Elm_Gen_Item *it)
{
- if (!_item_cache_add(it))
+ Eina_List *cache = NULL;
+ Evas_Object *c;
+ if (!_item_cache_add(it, _content_cache_add(it, &cache)))
{
ELM_SAFE_FREE(VIEW(it), evas_object_del);
ELM_SAFE_FREE(it->spacer, evas_object_del);
+ EINA_LIST_FREE(cache, c)
+ evas_object_del(c);
}
}