cedric pushed a commit to branch master. http://git.enlightenment.org/core/elementary.git/commit/?id=4729f24a91390ec7ce0705ee909672f3fe7fe0b1
commit 4729f24a91390ec7ce0705ee909672f3fe7fe0b1 Author: SangHyeon Lee <dltkdgus1...@gmail.com> Date: Wed Jul 29 23:22:28 2015 +0200 genlist: Refactoring genlist item cache logics. Summary: This patch is code refactoring for genlist item cache logic as same as gengrid item cache and removing unnecessary Item_Cache properties. {selected, disabled, expanded} exist in Item_Cache, but _item_cache_find ignore those flagged properties, so _elm_genlist_item_status_update will not working with itc properties(all itc properties are EINA_FALSE). Test Plan: Need to check elementary_test genlist sample working properly. Reviewers: raster, Hermet, seoz, jaehwan, cedric Reviewed By: cedric Subscribers: cedric, singh.amitesh, eagleeye Differential Revision: https://phab.enlightenment.org/D2660 Signed-off-by: Cedric BAIL <ced...@osg.samsung.com> --- src/lib/elm_genlist.c | 250 ++++++++++++++++++++----------------------- src/lib/elm_widget_genlist.h | 5 - 2 files changed, 118 insertions(+), 137 deletions(-) diff --git a/src/lib/elm_genlist.c b/src/lib/elm_genlist.c index 7f223b2..f628fa0 100644 --- a/src/lib/elm_genlist.c +++ b/src/lib/elm_genlist.c @@ -1249,62 +1249,29 @@ _item_order_update(const Eina_Inlist *l, } static void -_elm_genlist_item_state_update(Elm_Gen_Item *it, - Item_Cache *itc) +_elm_genlist_item_state_update(Elm_Gen_Item *it) { Eina_Bool tmp; - if (itc) + if (it->selected) { - if (it->selected != itc->selected) - { - if (it->selected) - { - edje_object_signal_emit(VIEW(it), SIGNAL_SELECTED, "elm"); - if (it->deco_all_view) - edje_object_signal_emit - (it->deco_all_view, SIGNAL_SELECTED, "elm"); - } - } - if (eo_do_ret(EO_OBJ(it), tmp, elm_wdg_item_disabled_get()) != itc->disabled) - { - if (eo_do_ret(EO_OBJ(it), tmp, elm_wdg_item_disabled_get())) - edje_object_signal_emit(VIEW(it), SIGNAL_DISABLED,"elm"); - if (it->deco_all_view) - edje_object_signal_emit - (it->deco_all_view, SIGNAL_DISABLED, "elm"); - } - if (it->item->expanded != itc->expanded) - { - if (it->item->expanded) - edje_object_signal_emit(VIEW(it), SIGNAL_EXPANDED, "elm"); - if (it->deco_all_view) - edje_object_signal_emit - (it->deco_all_view, SIGNAL_EXPANDED, "elm"); - } + edje_object_signal_emit(VIEW(it), SIGNAL_SELECTED, "elm"); + if (it->deco_all_view) + edje_object_signal_emit + (it->deco_all_view, SIGNAL_SELECTED, "elm"); } - else + if (eo_do_ret(EO_OBJ(it), tmp, elm_wdg_item_disabled_get())) { - if (it->selected) - { - edje_object_signal_emit(VIEW(it), SIGNAL_SELECTED, "elm"); - if (it->deco_all_view) - edje_object_signal_emit - (it->deco_all_view, SIGNAL_SELECTED, "elm"); - } - if (eo_do_ret(EO_OBJ(it), tmp, elm_wdg_item_disabled_get())) - { - edje_object_signal_emit(VIEW(it), SIGNAL_DISABLED, "elm"); - if (it->deco_all_view) - edje_object_signal_emit - (it->deco_all_view, SIGNAL_DISABLED, "elm"); - } - if (it->item->expanded) - { - edje_object_signal_emit(VIEW(it), SIGNAL_EXPANDED, "elm"); - if (it->deco_all_view) - edje_object_signal_emit - (it->deco_all_view, SIGNAL_EXPANDED, "elm"); - } + edje_object_signal_emit(VIEW(it), SIGNAL_DISABLED, "elm"); + if (it->deco_all_view) + edje_object_signal_emit + (it->deco_all_view, SIGNAL_DISABLED, "elm"); + } + if (it->item->expanded) + { + edje_object_signal_emit(VIEW(it), SIGNAL_EXPANDED, "elm"); + if (it->deco_all_view) + edje_object_signal_emit + (it->deco_all_view, SIGNAL_EXPANDED, "elm"); } if (it == (Elm_Gen_Item *)GL_IT(it)->wsd->focused_item && elm_widget_focus_highlight_enabled_get(WIDGET(it))) @@ -1385,7 +1352,7 @@ _decorate_all_item_realize(Elm_Gen_Item *it, (it->deco_all_view, elm_widget_mirrored_get(WIDGET(it))); _elm_genlist_item_position_state_update(it); - _elm_genlist_item_state_update(it, NULL); + _elm_genlist_item_state_update(it); if (GL_IT(it)->wsd->reorder_mode) { @@ -1460,37 +1427,61 @@ _contract_signal_cb(void *data, } //-- item cache handle routine --// -// clean up item cache by removing overflowed caches -static void -_item_cache_clean(Elm_Genlist_Data *sd) +// push item cache into caches +static Eina_Bool +_item_cache_push(Elm_Genlist_Data *sd, Item_Cache *itc) { - evas_event_freeze(evas_object_evas_get(sd->obj)); + if (!itc || (sd->item_cache_max <= 0)) + return EINA_FALSE; - while ((sd->item_cache) && (sd->item_cache_count > sd->item_cache_max)) - { - Item_Cache *itc; + sd->item_cache_count++; + sd->item_cache = + eina_inlist_prepend(sd->item_cache, EINA_INLIST_GET(itc)); - itc = EINA_INLIST_CONTAINER_GET(sd->item_cache->last, Item_Cache); - sd->item_cache = eina_inlist_remove - (sd->item_cache, sd->item_cache->last); - sd->item_cache_count--; - evas_object_del(itc->spacer); - evas_object_del(itc->base_view); - eina_stringshare_del(itc->item_style); - free(itc); - } - evas_event_thaw(evas_object_evas_get(sd->obj)); - evas_event_thaw_eval(evas_object_evas_get(sd->obj)); + return EINA_TRUE; +} + +// pop item cache from caches +static Item_Cache * +_item_cache_pop(Elm_Genlist_Data *sd, Item_Cache *itc) +{ + if (!itc || (!sd->item_cache) || + (sd->item_cache_count <= 0)) + return NULL; + + sd->item_cache = + eina_inlist_remove (sd->item_cache, EINA_INLIST_GET(itc)); + sd->item_cache_count--; + + return itc; } // free one item cache static void _item_cache_free(Item_Cache *itc) { + if (!itc) return; + evas_object_del(itc->spacer); evas_object_del(itc->base_view); eina_stringshare_del(itc->item_style); - free(itc); + ELM_SAFE_FREE(itc, free); +} + +// clean up item cache by removing overflowed caches +static void +_item_cache_clean(Elm_Genlist_Data *sd) +{ + evas_event_freeze(evas_object_evas_get(sd->obj)); + + while ((sd->item_cache) && (sd->item_cache_count > sd->item_cache_max)) + { + Item_Cache *itc = + EINA_INLIST_CONTAINER_GET(sd->item_cache->last, Item_Cache); + _item_cache_free(_item_cache_pop(sd, itc)); + } + evas_event_thaw(evas_object_evas_get(sd->obj)); + evas_event_thaw_eval(evas_object_evas_get(sd->obj)); } // empty all item caches @@ -1505,48 +1496,42 @@ _item_cache_zero(Elm_Genlist_Data *sd) } // add an item to item cache -static void +static Eina_Bool _item_cache_add(Elm_Gen_Item *it) { - Item_Cache *itc; + if (it->item->nocache_once || it->item->nocache) return EINA_FALSE; + + Item_Cache *itc = NULL; ELM_GENLIST_DATA_GET_FROM_ITEM(it, sd); Evas_Object *obj = sd->obj; + Eina_Bool tmp; evas_event_freeze(evas_object_evas_get(obj)); - if (sd->item_cache_max <= 0) - { - ELM_SAFE_FREE(VIEW(it), evas_object_del); - ELM_SAFE_FREE(it->spacer, evas_object_del); - evas_event_thaw(evas_object_evas_get(obj)); - evas_event_thaw_eval(evas_object_evas_get(obj)); - - return; - } + if (sd->item_cache_max > 0) + itc = ELM_NEW(Item_Cache); - sd->item_cache_count++; - itc = calloc(1, sizeof(Item_Cache)); - if (!itc) + if (!_item_cache_push(sd, itc)) { + if (itc) ELM_SAFE_FREE(itc, free); + evas_event_thaw(evas_object_evas_get(obj)); evas_event_thaw_eval(evas_object_evas_get(obj)); - return; + return EINA_FALSE; } - sd->item_cache = - eina_inlist_prepend(sd->item_cache, EINA_INLIST_GET(itc)); itc->spacer = it->spacer; - it->spacer = NULL; itc->base_view = VIEW(it); - - VIEW(it) = NULL; - edje_object_signal_emit(itc->base_view, SIGNAL_UNSELECTED, "elm"); - evas_object_hide(itc->base_view); - evas_object_move(itc->base_view, -9999, -9999); itc->item_style = eina_stringshare_add(it->itc->item_style); if (it->item->type & ELM_GENLIST_ITEM_TREE) itc->tree = 1; - itc->selected = it->selected; - eo_do(EO_OBJ(it), itc->disabled = elm_wdg_item_disabled_get()); - itc->expanded = it->item->expanded; + + if (it->selected) + edje_object_signal_emit(itc->base_view, SIGNAL_UNSELECTED, "elm"); + if (eo_do_ret(EO_OBJ(it), tmp, elm_wdg_item_disabled_get())) + edje_object_signal_emit(itc->base_view, SIGNAL_ENABLED, "elm"); + if (it == (Elm_Gen_Item *)sd->focused_item && + elm_widget_focus_highlight_enabled_get(obj)) + edje_object_signal_emit(itc->base_view, SIGNAL_UNFOCUSED, "elm"); + ELM_SAFE_FREE(it->long_timer, ecore_timer_del); ELM_SAFE_FREE(it->item->swipe_timer, ecore_timer_del); @@ -1559,16 +1544,32 @@ _item_cache_add(Elm_Gen_Item *it) edje_object_signal_callback_del_full (itc->base_view, "elm,action,contract", "elm", _contract_signal_cb, it); _item_mouse_callbacks_del(it, itc->base_view); + + edje_object_mirrored_set(itc->base_view, + elm_widget_mirrored_get(WIDGET(it))); + edje_object_scale_set(itc->base_view, + elm_widget_scale_get(WIDGET(it)) + * elm_config_scale_get()); + + it->spacer = NULL; + VIEW(it) = NULL; + evas_object_hide(itc->base_view); + evas_object_move(itc->base_view, -9999, -9999); + _item_cache_clean(sd); evas_event_thaw(evas_object_evas_get(obj)); evas_event_thaw_eval(evas_object_evas_get(obj)); + + return EINA_TRUE; } // find an item from item cache and remove it from the cache -static Item_Cache * +static Eina_Bool _item_cache_find(Elm_Gen_Item *it) { + if (it->item->nocache_once || it->item->nocache) return EINA_FALSE; + Item_Cache *itc = NULL; Eina_Inlist *l; Eina_Bool tree = 0; @@ -1577,22 +1578,24 @@ _item_cache_find(Elm_Gen_Item *it) if (it->item->type & ELM_GENLIST_ITEM_TREE) tree = 1; EINA_INLIST_FOREACH_SAFE(sd->item_cache, l, itc) { - if ((itc->selected) || (itc->disabled) || (itc->expanded)) - continue; - if ((itc->tree == tree) && (((!it->itc->item_style) && (!itc->item_style)) || (it->itc->item_style && itc->item_style && (!strcmp(it->itc->item_style, itc->item_style))))) { - sd->item_cache = - eina_inlist_remove (sd->item_cache, EINA_INLIST_GET(itc)); - sd->item_cache_count--; + itc = _item_cache_pop(sd, itc); + if (!itc) continue; - return itc; + it->spacer = itc->spacer; + VIEW(it) = itc->base_view; + itc->spacer = NULL; + itc->base_view = NULL; + + _item_cache_free(itc); + return EINA_TRUE; } } - return NULL; + return EINA_FALSE; } static char * @@ -1683,7 +1686,6 @@ _item_realize(Elm_Gen_Item *it, int in, Eina_Bool calc) { - Item_Cache *itc = NULL; const char *treesize; int tsize = 20; ELM_GENLIST_DATA_GET_FROM_ITEM(it, sd); @@ -1693,26 +1695,20 @@ _item_realize(Elm_Gen_Item *it, if (it->item->order_num_in != in) { _item_order_update(EINA_INLIST_GET(it), in); - _elm_genlist_item_state_update(it, NULL); + _elm_genlist_item_state_update(it); _elm_genlist_item_index_update(it); } return; } it->item->order_num_in = in; - if (it->item->nocache_once) - it->item->nocache_once = EINA_FALSE; - else if (!it->item->nocache) - itc = _item_cache_find(it); - if (itc && (!sd->tree_effect_enabled)) + if (sd->tree_effect_enabled || + (!_item_cache_find(it))) { - VIEW(it) = itc->base_view; - itc->base_view = NULL; - it->spacer = itc->spacer; - itc->spacer = NULL; + VIEW(it) = _view_create(it, it->itc->item_style); + if (it->item->nocache_once) + it->item->nocache_once = EINA_FALSE; } - else - VIEW(it) = _view_create(it, it->itc->item_style); /* access */ if (_elm_config->access_mode) _access_widget_item_register(it); @@ -1763,7 +1759,7 @@ _item_realize(Elm_Gen_Item *it, (it->itc->decorate_all_item_style)) _decorate_all_item_realize(it, EINA_FALSE); - _elm_genlist_item_state_update(it, itc); + _elm_genlist_item_state_update(it); _elm_genlist_item_index_update(it); if (EO_OBJ(it) == sd->focused_item) @@ -1873,7 +1869,6 @@ _item_realize(Elm_Gen_Item *it, it->realized = EINA_TRUE; it->want_unrealize = EINA_FALSE; - if (itc) _item_cache_free(itc); if (!calc) { if (it->item->tree_effect_hide_me) @@ -3544,7 +3539,7 @@ _decorate_all_item_unrealize(Elm_Gen_Item *it) evas_object_smart_member_add(VIEW(it), GL_IT(it)->wsd->pan_obj); elm_widget_sub_object_add(WIDGET(it), VIEW(it)); _elm_genlist_item_position_state_update(it); - _elm_genlist_item_state_update(it, NULL); + _elm_genlist_item_state_update(it); if (it->item->wsd->reorder_mode) { @@ -5008,20 +5003,11 @@ _item_unrealize(Elm_Gen_Item *it) _decorate_item_unrealize(it); if (GL_IT(it)->wsd->decorate_all_mode) _decorate_all_item_unrealize(it); - if (it->item->nocache_once || it->item->nocache) + if (!_item_cache_add(it)) { ELM_SAFE_FREE(VIEW(it), evas_object_del); ELM_SAFE_FREE(it->spacer, evas_object_del); } - else - { - edje_object_mirrored_set(VIEW(it), - elm_widget_mirrored_get(WIDGET(it))); - edje_object_scale_set(VIEW(it), - elm_widget_scale_get(WIDGET(it)) - * elm_config_scale_get()); - _item_cache_add(it); - } it->states = NULL; it->realized = EINA_FALSE; diff --git a/src/lib/elm_widget_genlist.h b/src/lib/elm_widget_genlist.h index a6e2422..df034b8 100644 --- a/src/lib/elm_widget_genlist.h +++ b/src/lib/elm_widget_genlist.h @@ -267,12 +267,7 @@ struct _Item_Cache EINA_INLIST; Evas_Object *base_view, *spacer; - const char *item_style; // it->itc->item_style - - Eina_Bool selected : 1; // it->selected - Eina_Bool disabled : 1; // it->disabled - Eina_Bool expanded : 1; // it->item->expanded Eina_Bool tree : 1; // it->group }; --