From 84e589e5ede286d488f3f8e504b66ce3493a8eb4 Mon Sep 17 00:00:00 2001 From: Carsten Haitzler Date: Mon, 11 May 2009 13:10:19 +0000 Subject: [PATCH] genlis - create and del as items come into view. SVN revision: 40588 --- legacy/elementary/src/lib/Elementary.h.in | 4 -- legacy/elementary/src/lib/elm_genlist.c | 59 ++++++++++++++--------- 2 files changed, 37 insertions(+), 26 deletions(-) diff --git a/legacy/elementary/src/lib/Elementary.h.in b/legacy/elementary/src/lib/Elementary.h.in index 4ce4877cd2..3dc951e194 100644 --- a/legacy/elementary/src/lib/Elementary.h.in +++ b/legacy/elementary/src/lib/Elementary.h.in @@ -749,10 +749,6 @@ extern "C" { // * when entries are in a scroller and change size, the scroller shows scrollbars. fix. same for selecting. for 1 line entries in a scroller should only have scroll arrow indicators. // //// (more widgets/features - medium priority) -// * -// * -// * -// // * multiple genlist item styles (multi-label, 1 icon + 2 line label, header etc.) // * carousel selector widget // * auto-size label/text that adapts text size to its allocated region diff --git a/legacy/elementary/src/lib/elm_genlist.c b/legacy/elementary/src/lib/elm_genlist.c index a016d44767..2610f94a71 100644 --- a/legacy/elementary/src/lib/elm_genlist.c +++ b/legacy/elementary/src/lib/elm_genlist.c @@ -428,6 +428,8 @@ _item_realize(Elm_Genlist_Item *it, int in, int calc) static void _item_unrealize(Elm_Genlist_Item *it) { + Evas_Object *icon; + if (!it->realized) return; evas_object_del(it->base); it->base = NULL; @@ -439,9 +441,7 @@ _item_unrealize(Elm_Genlist_Item *it) it->icons = NULL; _stringlist_free(it->states); - Evas_Object *icon; - EINA_LIST_FREE(it->icon_objs, icon) - evas_object_del(icon); + EINA_LIST_FREE(it->icon_objs, icon) evas_object_del(icon); it->states = NULL; it->realized = 0; @@ -483,7 +483,7 @@ _item_block_recalc(Item_Block *itb, int in) } static void -_item_block_realize(Item_Block *itb, int in) +_item_block_realize(Item_Block *itb, int in, int full) { const Eina_List *l; Elm_Genlist_Item *it; @@ -491,7 +491,7 @@ _item_block_realize(Item_Block *itb, int in) EINA_LIST_FOREACH(itb->items, l, it) { if (it->delete_me) continue; - _item_realize(it, in, 0); + if (full) _item_realize(it, in, 0); in++; } itb->realized = 1; @@ -512,28 +512,43 @@ _item_block_unrealize(Item_Block *itb) } static void -_item_block_position(Item_Block *itb) +_item_block_position(Item_Block *itb, int in) { const Eina_List *l; Elm_Genlist_Item *it; - Evas_Coord y = 0, ox, oy; + Evas_Coord y = 0, ox, oy, ow, oh; + int vis; - evas_object_geometry_get(itb->wd->pan_smart, &ox, &oy, NULL, NULL); + evas_object_geometry_get(itb->wd->pan_smart, &ox, &oy, &ow, &oh); EINA_LIST_FOREACH(itb->items, l, it) { if (it->delete_me) continue; it->x = 0; it->y = y; it->w = itb->w; + vis = (ELM_RECTS_INTERSECT(itb->x + it->x - itb->wd->pan_x, + itb->y + it->y - itb->wd->pan_y, + it->w, it->h, + 0, 0, ow, oh)); + if ((itb->realized) && (!it->realized)) + { + if (vis) _item_realize(it, in, 0); + } if (it->realized) { - evas_object_resize(it->base, it->w, it->h); - evas_object_move(it->base, - ox + itb->x + it->x - itb->wd->pan_x, - oy + itb->y + it->y - itb->wd->pan_y); - evas_object_show(it->base); + if (vis) + { + evas_object_resize(it->base, it->w, it->h); + evas_object_move(it->base, + ox + itb->x + it->x - itb->wd->pan_x, + oy + itb->y + it->y - itb->wd->pan_y); + evas_object_show(it->base); + } + else + _item_unrealize(it); } y += it->h; + in++; } } @@ -617,12 +632,12 @@ static void _pan_set(Evas_Object *obj, Evas_Coord x, Evas_Coord y) { Pan *sd = evas_object_smart_data_get(obj); - Evas_Coord ow, oh; - evas_object_geometry_get(obj, NULL, NULL, &ow, &oh); - ow = sd->wd->minw - ow; - if (ow < 0) ow = 0; - oh = sd->wd->minh - oh; - if (oh < 0) oh = 0; +// Evas_Coord ow, oh; +// evas_object_geometry_get(obj, NULL, NULL, &ow, &oh); +// ow = sd->wd->minw - ow; +// if (ow < 0) ow = 0; +// oh = sd->wd->minh - oh; +// if (oh < 0) oh = 0; // if (x < 0) x = 0; // if (y < 0) y = 0; // if (x > ow) x = ow; @@ -717,9 +732,9 @@ _pan_calculate(Evas_Object *obj) { if ((!itb->realized) || (itb->changed)) { - _item_block_realize(itb, in); + _item_block_realize(itb, in, 0); } - _item_block_position(itb); + _item_block_position(itb, in); } else { @@ -1427,7 +1442,7 @@ elm_genlist_item_update(Elm_Genlist_Item *it) _item_unrealize(it); _item_realize(it, num, 0); _item_block_recalc(it->block, numb); - _item_block_position(it->block); + _item_block_position(it->block, num); } else {