From 74dd82cf60a2e11a1bd21188e8b33b5cdeb51673 Mon Sep 17 00:00:00 2001 From: Cedric BAIL Date: Sat, 25 Jun 2011 23:20:22 +0000 Subject: [PATCH] elementary: add some usefull function around sorted insert. SVN revision: 60691 --- legacy/elementary/src/lib/elm_gengrid.c | 58 ++++++++++++--- legacy/elementary/src/lib/elm_genlist.c | 95 +++++++++++++++++-------- 2 files changed, 115 insertions(+), 38 deletions(-) diff --git a/legacy/elementary/src/lib/elm_gengrid.c b/legacy/elementary/src/lib/elm_gengrid.c index 1648be2a79..7e35b038d7 100644 --- a/legacy/elementary/src/lib/elm_gengrid.c +++ b/legacy/elementary/src/lib/elm_gengrid.c @@ -296,6 +296,7 @@ static const Evas_Smart_Cb_Description _signals[] = { }; static Eina_Compare_Cb _elm_gengrid_item_compare_cb; +static Eina_Compare_Cb _elm_gengrid_item_compare_data_cb; static Eina_Bool _event_hook(Evas_Object *obj, @@ -1730,13 +1731,22 @@ _scr_scroll(void *data, evas_object_smart_callback_call(data, SIG_SCROLL, NULL); } +static int +_elm_gengrid_item_compare_data(const void *data, const void *data1) +{ + const Elm_Gengrid_Item *item = data; + const Elm_Gengrid_Item *item1 = data1; + + return _elm_gengrid_item_compare_data_cb(item->base.data, item1->base.data); +} + static int _elm_gengrid_item_compare(const void *data, const void *data1) { Elm_Gengrid_Item *item, *item1; item = ELM_GENGRID_ITEM_FROM_INLIST(data); item1 = ELM_GENGRID_ITEM_FROM_INLIST(data1); - return _elm_gengrid_item_compare_cb(item->base.data, item1->base.data); + return _elm_gengrid_item_compare_cb(item, item1); } /** @@ -2106,12 +2116,12 @@ elm_gengrid_item_insert_after(Evas_Object *obj, } EAPI Elm_Gengrid_Item * -elm_gengrid_item_sorted_insert(Evas_Object *obj, - const Elm_Gengrid_Item_Class *gic, - const void *data, - Eina_Compare_Cb comp, - Evas_Smart_Cb func, - const void *func_data) +elm_gengrid_item_direct_sorted_insert(Evas_Object *obj, + const Elm_Gengrid_Item_Class *gic, + const void *data, + Eina_Compare_Cb comp, + Evas_Smart_Cb func, + const void *func_data) { Elm_Gengrid_Item *item; ELM_CHECK_WIDTYPE(obj, widtype) NULL; @@ -2120,8 +2130,8 @@ elm_gengrid_item_sorted_insert(Evas_Object *obj, item = _item_create(wd, gic, data, func, func_data); if (!item) return NULL; - _elm_gengrid_item_compare_cb = comp; + _elm_gengrid_item_compare_cb = comp; wd->items = eina_inlist_sorted_insert(wd->items, EINA_INLIST_GET(item), _elm_gengrid_item_compare); if (wd->calc_job) ecore_job_del(wd->calc_job); @@ -2130,6 +2140,19 @@ elm_gengrid_item_sorted_insert(Evas_Object *obj, return item; } +EAPI Elm_Gengrid_Item * +elm_gengrid_item_sorted_insert(Evas_Object *obj, + const Elm_Gengrid_Item_Class *gic, + const void *data, + Eina_Compare_Cb comp, + Evas_Smart_Cb func, + const void *func_data) +{ + _elm_gengrid_item_compare_data_cb = comp; + + return elm_gengrid_item_direct_sorted_insert(obj, gic, data, _elm_gengrid_item_compare_data, func, func_data); +} + /** * Remove an item from the Gengrid. * @@ -2351,6 +2374,25 @@ elm_gengrid_item_data_set(Elm_Gengrid_Item *item, elm_gengrid_item_update(item); } +EAPI const Elm_Gengrid_Item_Class * +elm_gengrid_item_item_class_get(const Elm_Gengrid_Item *item) +{ + ELM_WIDGET_ITEM_WIDTYPE_CHECK_OR_RETURN(item, NULL); + if (item->delete_me) return NULL; + return item->gic; +} + +EAPI void +elm_gengrid_item_item_class_set(Elm_Gengrid_Item *item, + const Elm_Gengrid_Item_Class *gic) +{ + ELM_WIDGET_ITEM_WIDTYPE_CHECK_OR_RETURN(item); + EINA_SAFETY_ON_NULL_RETURN(gic); + if (item->delete_me) return; + item->gic = gic; + elm_gengrid_item_update(item); +} + /** * Get the item's coordinates. * diff --git a/legacy/elementary/src/lib/elm_genlist.c b/legacy/elementary/src/lib/elm_genlist.c index 005541e087..c3358de54d 100644 --- a/legacy/elementary/src/lib/elm_genlist.c +++ b/legacy/elementary/src/lib/elm_genlist.c @@ -469,6 +469,7 @@ static const Evas_Smart_Cb_Description _signals[] = { }; static Eina_Compare_Cb _elm_genlist_item_compare_cb; +static Eina_Compare_Cb _elm_genlist_item_compare_data_cb; static Eina_Bool _event_hook(Evas_Object *obj, @@ -3482,13 +3483,22 @@ _item_queue(Widget_Data *wd, wd->queue_idle_enterer = ecore_idle_enterer_add(_item_idle_enterer, wd); } +static int +_elm_genlist_item_compare_data(const void *data, const void *data1) +{ + const Elm_Genlist_Item *item = data; + const Elm_Genlist_Item *item1 = data1; + + return _elm_genlist_item_compare_data_cb(item->base.data, item1->base.data); +} + static int _elm_genlist_item_compare(const void *data, const void *data1) { Elm_Genlist_Item *item, *item1; item = ELM_GENLIST_ITEM_FROM_INLIST(data); item1 = ELM_GENLIST_ITEM_FROM_INLIST(data1); - return _elm_genlist_item_compare_cb(item->base.data, item1->base.data); + return _elm_genlist_item_compare_cb(item, item1); } static void @@ -3697,6 +3707,49 @@ elm_genlist_item_insert_before(Evas_Object *obj, return it; } +EAPI Elm_Genlist_Item * +elm_genlist_item_direct_sorted_insert(Evas_Object *obj, + const Elm_Genlist_Item_Class *itc, + const void *data, + Elm_Genlist_Item *parent, + Elm_Genlist_Item_Flags flags, + Eina_Compare_Cb comp, + Evas_Smart_Cb func, + const void *func_data) +{ + ELM_CHECK_WIDTYPE(obj, widtype) NULL; + Widget_Data *wd = elm_widget_data_get(obj); + if (!wd) return NULL; + Elm_Genlist_Item *it = _item_new(wd, itc, data, parent, flags, func, + func_data); + if (!it) return NULL; + + _elm_genlist_item_compare_cb = comp; + + if (it->parent) + { + it->parent->items = + eina_list_sorted_insert(it->parent->items, _elm_genlist_item_compare, it); + } + wd->items = eina_inlist_sorted_insert(wd->items, EINA_INLIST_GET(it), + _elm_genlist_item_compare); + if (EINA_INLIST_GET(it)->next) + { + it->rel = ELM_GENLIST_ITEM_FROM_INLIST(EINA_INLIST_GET(it)->next); + it->rel->relcount++; + it->before = EINA_TRUE; + } + else if (EINA_INLIST_GET(it)->prev) + { + it->rel = ELM_GENLIST_ITEM_FROM_INLIST(EINA_INLIST_GET(it)->prev); + it->rel->relcount++; + it->before = EINA_FALSE; + } + _item_queue(wd, it); + + return it; +} + /** * Insert a new item into the sorted genlist object * @@ -3722,36 +3775,10 @@ elm_genlist_item_sorted_insert(Evas_Object *obj, Evas_Smart_Cb func, const void *func_data) { - ELM_CHECK_WIDTYPE(obj, widtype) NULL; - Widget_Data *wd = elm_widget_data_get(obj); - if (!wd) return NULL; - Elm_Genlist_Item *it = _item_new(wd, itc, data, parent, flags, func, - func_data); - if (!it) return NULL; + _elm_genlist_item_compare_data_cb = comp; - _elm_genlist_item_compare_cb = comp; - if (it->parent) - { - it->parent->items = - eina_list_sorted_insert(it->parent->items, comp, it); - } - wd->items = eina_inlist_sorted_insert(wd->items, EINA_INLIST_GET(it), - _elm_genlist_item_compare); - if (EINA_INLIST_GET(it)->next) - { - it->rel = ELM_GENLIST_ITEM_FROM_INLIST(EINA_INLIST_GET(it)->next); - it->rel->relcount++; - it->before = EINA_TRUE; - } - else if (EINA_INLIST_GET(it)->prev) - { - it->rel = ELM_GENLIST_ITEM_FROM_INLIST(EINA_INLIST_GET(it)->prev); - it->rel->relcount++; - it->before = EINA_FALSE; - } - _item_queue(wd, it); - - return it; + return elm_genlist_item_direct_sorted_insert(obj, itc, data, parent, flags, + _elm_genlist_item_compare_data, func, func_data); } /** @@ -4876,6 +4903,14 @@ elm_genlist_item_item_class_update(Elm_Genlist_Item *it, elm_genlist_item_update(it); } +EAPI const Elm_Genlist_Item_Class * +elm_genlist_item_item_class_get(const Elm_Genlist_Item *it) +{ + ELM_WIDGET_ITEM_WIDTYPE_CHECK_OR_RETURN(it, NULL); + if (it->delete_me) return NULL; + return it->itc; +} + static Evas_Object * _elm_genlist_item_label_create(void *data, Evas_Object *obj,