From 9a91e03859a0fd7554881926233e28ca0cffdda6 Mon Sep 17 00:00:00 2001 From: Carsten Haitzler Date: Tue, 17 Feb 2009 14:39:08 +0000 Subject: [PATCH] more genlist work. SVN revision: 39059 --- src/bin/test.c | 36 +++++++++++++++++++++++++++++ src/lib/Elementary.h.in | 1 + src/lib/elm_genlist.c | 61 +++++++++++++++++++++++++++++++++++-------------- 3 files changed, 81 insertions(+), 17 deletions(-) diff --git a/src/bin/test.c b/src/bin/test.c index 3269619..63a5342 100644 --- a/src/bin/test.c +++ b/src/bin/test.c @@ -2158,6 +2158,26 @@ my_gl_del(void *data, Evas_Object *obj, void *event_info) } static void +my_gl_first(void *data, Evas_Object *obj, void *event_info) +{ + Evas_Object *gl = data; + Elm_Genlist_Item *gli = elm_genlist_first_item_get(gl); + if (!gli) return; + elm_genlist_item_show(gli); + elm_genlist_item_selected_set(gli, 1); +} + +static void +my_gl_last(void *data, Evas_Object *obj, void *event_info) +{ + Evas_Object *gl = data; + Elm_Genlist_Item *gli = elm_genlist_last_item_get(gl); + if (!gli) return; + elm_genlist_item_show(gli); + elm_genlist_item_selected_set(gli, 1); +} + +static void my_bt_30(void *data, Evas_Object *obj, void *event_info) { Evas_Object *win, *bg, *gl, *bx, *bx2, *bt; @@ -2192,6 +2212,22 @@ my_bt_30(void *data, Evas_Object *obj, void *event_info) evas_object_size_hint_align_set(bx2, -1.0, -1.0); bt = elm_button_add(win); + elm_button_label_set(bt, "[/\\]"); + evas_object_smart_callback_add(bt, "clicked", my_gl_first, gl); + evas_object_size_hint_align_set(bt, -1.0, -1.0); + evas_object_size_hint_weight_set(bt, 1.0, 0.0); + elm_box_pack_end(bx2, bt); + evas_object_show(bt); + + bt = elm_button_add(win); + elm_button_label_set(bt, "[\\/]"); + evas_object_smart_callback_add(bt, "clicked", my_gl_last, gl); + evas_object_size_hint_align_set(bt, -1.0, -1.0); + evas_object_size_hint_weight_set(bt, 1.0, 0.0); + elm_box_pack_end(bx2, bt); + evas_object_show(bt); + + bt = elm_button_add(win); elm_button_label_set(bt, "[+]"); evas_object_smart_callback_add(bt, "clicked", my_gl_add, gl); evas_object_size_hint_align_set(bt, -1.0, -1.0); diff --git a/src/lib/Elementary.h.in b/src/lib/Elementary.h.in index 949c6f7..d81b026 100644 --- a/src/lib/Elementary.h.in +++ b/src/lib/Elementary.h.in @@ -523,6 +523,7 @@ extern "C" { EAPI const Elm_Genlist_Item *elm_genlist_item_next_get(Elm_Genlist_Item *item); EAPI const Elm_Genlist_Item *elm_genlist_item_prev_get(Elm_Genlist_Item *item); EAPI void elm_genlist_item_selected_set(Elm_Genlist_Item *item, Evas_Bool selected); + EAPI void elm_genlist_item_show(Elm_Genlist_Item *item); EAPI void elm_genlist_item_del(Elm_Genlist_Item *item); EAPI const void *elm_genlist_item_data_get(Elm_Genlist_Item *item); diff --git a/src/lib/elm_genlist.c b/src/lib/elm_genlist.c index f81cc76..e563fd4 100644 --- a/src/lib/elm_genlist.c +++ b/src/lib/elm_genlist.c @@ -19,6 +19,7 @@ struct _Widget_Data Ecore_Idler *queue_idler; Eina_List *queue; Eina_List *selected; + Item *show_item; Evas_Bool on_hold : 1; Evas_Bool multi : 1; Evas_Bool min_w : 1; @@ -63,6 +64,7 @@ struct _Item Evas_Bool disabled : 1; Evas_Bool mincalcd : 1; Evas_Bool queued : 1; + Evas_Bool showme : 1; }; struct _Pan { @@ -76,26 +78,29 @@ static void _show_region_hook(void *data, Evas_Object *obj); static void _sizing_eval(Evas_Object *obj); static void _sub_del(void *data, Evas_Object *obj, void *event_info); +static void _item_unrealize(Item *it); + static Evas_Smart_Class _pan_sc = {NULL}; static void _del_hook(Evas_Object *obj) { Widget_Data *wd = elm_widget_data_get(obj); -/* + while (wd->items) + { + Item *it = (Item *)(wd->items); + wd->items = eina_inlist_remove(wd->items, wd->items); + if (it->realized) _item_unrealize(it); + if (it->itc->func.del) it->itc->func.del(it->data, it->wd->obj); + free(it); + } while (wd->blocks) { - Item_Block *itb = wd->blocks; - while (itb->items) - { - Item *it = itb->items->data; - - } + Item_Block *itb = (Item_Block *)(wd->blocks); + wd->blocks = eina_inlist_remove(wd->blocks, wd->blocks); + if (itb->items) eina_list_free(itb->items); free(itb); } - */ - // free wd->items - // free wd->blocks if (wd->selected) eina_list_free(wd->selected); if (wd->queue) eina_list_free(wd->queue); if (wd->calc_job) ecore_job_del(wd->calc_job); @@ -392,15 +397,17 @@ _item_unrealize(Item *it) it->realized = 0; } -static void +static int _item_block_recalc(Item_Block *itb, int in) { Eina_List *l; Evas_Coord minw = 0, minh = 0; - + int showme = 0; + for (l = itb->items; l; l = l->next) { Item *it = l->data; + showme |= it->showme; if (!itb->realized) { _item_realize(it, in, 1); @@ -417,6 +424,7 @@ _item_block_recalc(Item_Block *itb, int in) itb->changed = 0; /* force an evas norender to garbage collect deleted objects */ evas_norender(evas_object_evas_get(itb->wd->obj)); + return showme; } static void @@ -483,8 +491,8 @@ _calc_job(void *data) for (bn = 0, in = 0, il = wd->blocks; il; il = il->next, bn++) { Item_Block *itb = (Item_Block *)il; - if (itb->changed) - _item_block_recalc(itb, in); + int showme; + if (itb->changed) showme = _item_block_recalc(itb, in); itb->y = y; itb->x = 0; itb->w = itb->minw; @@ -494,6 +502,12 @@ _calc_job(void *data) itb->h = itb->minh; y += itb->minh; in += itb->count; + if (showme) + { + wd->show_item->showme = 0; + elm_smart_scroller_child_region_show(wd->scr, wd->show_item->x, wd->show_item->y, wd->show_item->w, wd->show_item->h); + wd->show_item = NULL; + } } evas_object_geometry_get(wd->pan_smart, NULL, NULL, &ow, &oh); if (minw < ow) minw = ow; @@ -723,6 +737,7 @@ _item_block_del(Item *it) static void _item_del(Item *it) { + if (it->wd->show_item == it) it->wd->show_item = NULL; if (it->selected) it->wd->selected = eina_list_remove(it->wd->selected, it); if (it->itc->func.del) it->itc->func.del(it->data, it->wd->obj); if (it->realized) _item_unrealize(it); @@ -926,13 +941,13 @@ elm_genlist_last_item_get(Evas_Object *obj) EAPI const Elm_Genlist_Item * elm_genlist_item_next_get(Elm_Genlist_Item *item) { - return ((Eina_Inlist *)item)->next; + return (Elm_Genlist_Item *)(((Eina_Inlist *)item)->next); } EAPI const Elm_Genlist_Item * elm_genlist_item_prev_get(Elm_Genlist_Item *item) { - return ((Eina_Inlist *)item)->prev; + return (Elm_Genlist_Item *)(((Eina_Inlist *)item)->prev); } EAPI void @@ -973,7 +988,19 @@ elm_genlist_item_disabled_set(Elm_Genlist_Item *item, Evas_Bool disabled) EAPI void elm_genlist_item_show(Elm_Genlist_Item *item) { - // call this to jump to item in scroll + Item *it = (Item *)item; + if ((it->queued) || (!it->mincalcd)) + { + it->wd->show_item = it; + it->showme = 1; + return; + } + if (it->wd->show_item) + { + it->wd->show_item->showme = 0; + it->wd->show_item = NULL; + } + elm_smart_scroller_child_region_show(it->wd->scr, it->x, it->y, it->w, it->h); } EAPI void -- 2.7.4