On Mon, May 24, 2010 at 8:41 AM, Enlightenment SVN <no-re...@enlightenment.org> wrote: > Log: > Implement elm index sorted insert > - Name index item as Elm_Index_Item > - Add some other index functions: > + Item find > + Data get/set > + Letter get > > I think this stuff will make easier to create index for > dynamically created lists. > > Author: bdilly > Date: 2010-05-23 16:41:32 -0700 (Sun, 23 May 2010) > New Revision: 49171 > > Modified: > trunk/TMP/st/elementary/src/lib/Elementary.h.in > trunk/TMP/st/elementary/src/lib/elm_index.c > > Modified: trunk/TMP/st/elementary/src/lib/Elementary.h.in > =================================================================== > --- trunk/TMP/st/elementary/src/lib/Elementary.h.in 2010-05-23 23:23:51 > UTC (rev 49170) > +++ trunk/TMP/st/elementary/src/lib/Elementary.h.in 2010-05-23 23:41:32 > UTC (rev 49171) > @@ -1266,6 +1266,7 @@ > * vertical (two up/down buttons at the right side and text left aligned) > */ > > + typedef struct _Elm_Index_Item Elm_Index_Item; > EAPI Evas_Object *elm_index_add(Evas_Object *parent); > EAPI void elm_index_active_set(Evas_Object *obj, Eina_Bool active); > EAPI void elm_index_item_level_set(Evas_Object *obj, int level); > @@ -1275,9 +1276,14 @@ > EAPI void elm_index_item_prepend(Evas_Object *obj, const char > *letter, const void *item); > EAPI void elm_index_item_append_relative(Evas_Object *obj, const > char *letter, const void *item, const void *relative); > EAPI void elm_index_item_prepend_relative(Evas_Object *obj, const > char *letter, const void *item, const void *relative); > + EAPI void elm_index_item_sorted_insert(Evas_Object *obj, const > char *letter, const void *item, Eina_Compare_Cb cmp_func, Eina_Compare_Cb > cmp_data_func); > EAPI void elm_index_item_del(Evas_Object *obj, const void *item); > + EAPI Elm_Index_Item *elm_index_item_find(Evas_Object *obj, const void > *item); > EAPI void elm_index_item_clear(Evas_Object *obj); > EAPI void elm_index_item_go(Evas_Object *obj, int level); > + EAPI void *elm_index_item_data_get(const Elm_Index_Item *item); > + EAPI void elm_index_item_data_set(Elm_Index_Item *it, const void > *data); > + EAPI const char *elm_index_item_letter_get(const Elm_Index_Item *item); > /* smart callbacks called: > * "changed" - when the selected index item changes > * "delay,changed" - when the selected index item changes, but after some > small idle period > > Modified: trunk/TMP/st/elementary/src/lib/elm_index.c > =================================================================== > --- trunk/TMP/st/elementary/src/lib/elm_index.c 2010-05-23 23:23:51 UTC (rev > 49170) > +++ trunk/TMP/st/elementary/src/lib/elm_index.c 2010-05-23 23:41:32 UTC (rev > 49171) > @@ -9,7 +9,6 @@ > */ > > typedef struct _Widget_Data Widget_Data; > -typedef struct _Item Item; > > struct _Widget_Data > { > @@ -26,7 +25,7 @@ > Eina_Bool down : 1; > }; > > -struct _Item > +struct _Elm_Index_Item > { > Evas_Object *obj; > const char *letter; > @@ -42,13 +41,13 @@ > static void _sizing_eval(Evas_Object *obj); > static void _index_box_auto_fill(Evas_Object *obj, Evas_Object *box, int > level); > static void _index_box_clear(Evas_Object *obj, Evas_Object *box, int level); > -static void _item_free(Item *it); > +static void _item_free(Elm_Index_Item *it); > > static void > _del_hook(Evas_Object *obj) > { > Widget_Data *wd = elm_widget_data_get(obj); > - Item *it; > + Elm_Index_Item *it; > Eina_List *l, *clear = NULL; > if (!wd) return; > _index_box_clear(obj, wd->bx[wd->level], wd->level); > @@ -138,13 +137,13 @@ > evas_object_size_hint_max_set(obj, maxw, maxh); > } > > -static Item * > +static Elm_Index_Item * > _item_new(Evas_Object *obj, const char *letter, const void *item) > { > Widget_Data *wd = elm_widget_data_get(obj); > - Item *it; > + Elm_Index_Item *it; > if (!wd) return NULL; > - it = calloc(1, sizeof(Item)); > + it = calloc(1, sizeof(Elm_Index_Item)); > if (!it) return NULL; > it->obj = obj; > it->letter = eina_stringshare_add(letter); > @@ -153,12 +152,12 @@ > return it; > } > > -static Item * > +static Elm_Index_Item * > _item_find(Evas_Object *obj, const void *item) > { > Widget_Data *wd = elm_widget_data_get(obj); > Eina_List *l; > - Item *it; > + Elm_Index_Item *it; > if (!wd) return NULL; > EINA_LIST_FOREACH(wd->items, l, it) > if (it->data == item) return it; > @@ -166,7 +165,7 @@ > } > > static void > -_item_free(Item *it) > +_item_free(Elm_Index_Item *it) > { > Widget_Data *wd = elm_widget_data_get(it->obj); > if (!wd) return; > @@ -182,7 +181,7 @@ > { > Widget_Data *wd = elm_widget_data_get(obj); > Eina_List *l; > - Item *it; > + Elm_Index_Item *it; > Evas_Coord mw, mh, w, h; > int i = 0; > if (!wd) return; > @@ -235,7 +234,7 @@ > { > Widget_Data *wd = elm_widget_data_get(obj); > Eina_List *l; > - Item *it; > + Elm_Index_Item *it; > if (!wd) return; > if (!wd->level_active[level]) return; > EINA_LIST_FOREACH(wd->items, l, it) > @@ -264,7 +263,7 @@ > _sel_eval(Evas_Object *obj, Evas_Coord evx, Evas_Coord evy) > { > Widget_Data *wd = elm_widget_data_get(obj); > - Item *it, *it_closest, *it_last; > + Elm_Index_Item *it, *it_closest, *it_last; > Eina_List *l; > Evas_Coord x, y, w, h, bx, by, bw, bh, xx, yy; > double cdv = 0.5; > @@ -614,7 +613,7 @@ > ELM_CHECK_WIDTYPE(obj, widtype) NULL; > Widget_Data *wd = elm_widget_data_get(obj); > Eina_List *l; > - Item *it; > + Elm_Index_Item *it; > if (!wd) return NULL; > EINA_LIST_FOREACH(wd->items, l, it) > if ((it->selected) && (it->level == level)) return it->data; > @@ -635,7 +634,7 @@ > { > ELM_CHECK_WIDTYPE(obj, widtype); > Widget_Data *wd = elm_widget_data_get(obj); > - Item *it; > + Elm_Index_Item *it; > if (!wd) return; > it = _item_new(obj, letter, item); > if (!it) return; > @@ -657,7 +656,7 @@ > { > ELM_CHECK_WIDTYPE(obj, widtype); > Widget_Data *wd = elm_widget_data_get(obj); > - Item *it; > + Elm_Index_Item *it; > > if (!wd) return; > it = _item_new(obj, letter, item); > @@ -681,7 +680,7 @@ > { > ELM_CHECK_WIDTYPE(obj, widtype); > Widget_Data *wd = elm_widget_data_get(obj); > - Item *it, *it_rel; > + Elm_Index_Item *it, *it_rel; > if (!wd) return; > if (!relative) > { > @@ -715,7 +714,7 @@ > { > ELM_CHECK_WIDTYPE(obj, widtype); > Widget_Data *wd = elm_widget_data_get(obj); > - Item *it, *it_rel; > + Elm_Index_Item *it, *it_rel; > if (!wd) return; > if (!relative) > { > @@ -735,6 +734,62 @@ > } > > /** > + * Insert a new @p item into the sorted index @p obj in @p letter. > + * > + * @param obj The index object > + * @param letter Letter under which the item should be indexed > + * @param item The item to put in the index > + * @param cmp_func The function called for the sort of index items. > + * @param cmp_data_func The function called for the sort of the data. It will > + * be used when cmp_func return 0. It means the index item already exists. > + * So, to decide which data item should be pointed by the index item, a > function > + * to compare them is needed. If this function is not provided, index items > + * will be duplicated. > + * > + * @ingroup Index > + */ > +EAPI void > +elm_index_item_sorted_insert(Evas_Object *obj, const char *letter, const > void *item, Eina_Compare_Cb cmp_func, Eina_Compare_Cb cmp_data_func) > +{ > + ELM_CHECK_WIDTYPE(obj, widtype); > + Widget_Data *wd = elm_widget_data_get(obj); > + Eina_List *lnear; > + Elm_Index_Item *it; > + int cmp; > + > + if (!wd) return; > + if (!(wd->items)) > + { > + elm_index_item_append(obj, letter, item); > + return; > + } > + > + it = _item_new(obj, letter, item); > + if (!it) return; > + > + lnear = eina_list_search_sorted_near_list(wd->items, cmp_func, it, &cmp); > + if (cmp < 0) > + wd->items = eina_list_append_relative_list(wd->items, it, lnear); > + else if (cmp > 0) > + wd->items = eina_list_prepend_relative_list(wd->items, it, lnear); > + else > + { > + /* If cmp_data_func is not provided, append a duplicated item */ > + if (!cmp_data_func) > + wd->items = eina_list_append_relative_list(wd->items, it, lnear); > + else > + { > + Elm_Index_Item *p_it = eina_list_data_get(lnear); > + if (cmp_data_func(p_it->data, it->data) >= 0) > + p_it->data = it->data; > + _item_free(it);
What happens to the old data from p_it here? Also, what about the case where the cmp_data_func is used to sort two different items with the same label? Shouldn't a 0 return be used for replace and the other two just for order of insertion? > + } > + } > + > + _index_box_clear(obj, wd->bx[wd->level], wd->level); > +} > + > +/** > * Remove an item from the index. > * > * @param obj The index object > @@ -747,7 +802,7 @@ > { > ELM_CHECK_WIDTYPE(obj, widtype); > Widget_Data *wd = elm_widget_data_get(obj); > - Item *it; > + Elm_Index_Item *it; > if (!wd) return; > it = _item_find(obj, item); > if (!it) return; > @@ -756,6 +811,24 @@ > } > > /** > + * Find an index item using item data. > + * > + * @param obj The index object > + * @param item The item pointed by index item > + * @return The index item pointing to @p item > + * > + * @ingroup Index > + */ > +EAPI Elm_Index_Item * > +elm_index_item_find(Evas_Object *obj, const void *item) > +{ > + ELM_CHECK_WIDTYPE(obj, widtype); > + Widget_Data *wd = elm_widget_data_get(obj); > + if (!wd) return NULL; > + return _item_find(obj, item); > +} > + > +/** > * Clears an index of its items. > * > * @param obj The index object. > @@ -767,7 +840,7 @@ > { > ELM_CHECK_WIDTYPE(obj, widtype); > Widget_Data *wd = elm_widget_data_get(obj); > - Item *it; > + Elm_Index_Item *it; > Eina_List *l, *clear = NULL; > if (!wd) return; > _index_box_clear(obj, wd->bx[wd->level], wd->level); > @@ -796,3 +869,51 @@ > _index_box_auto_fill(obj, wd->bx[0], 0); > if (wd->level == 1) _index_box_auto_fill(obj, wd->bx[1], 1); > } > + > +/** > + * Returns the data associated with the item. > + * > + * @param it The list item > + * @return The data associated with @p it > + * > + * @ingroup Index > + */ > +EAPI void * > +elm_index_item_data_get(const Elm_Index_Item *it) > +{ > + if (!it) return NULL; > + return (void *)it->data; > +} > + > +/** > + * Set the data item from the index item > + * > + * This set a new data value. > + * > + * @param it The item > + * @param data The new data pointer to set > + * > + * @ingroup Index > + */ > +EAPI void > +elm_index_item_data_set(Elm_Index_Item *it, const void *data) > +{ > + if (!it) return; > + it->data = data; > +} > + > +/** > + * Gets the letter of the item. > + * > + * @param it The list item > + * @return The letter of @p it > + * > + * @ingroup Index > + */ > +EAPI const char * > +elm_index_item_letter_get(const Elm_Index_Item *it) > +{ > + if (!it) return NULL; > + return it->letter; > +} > + > > > ------------------------------------------------------------------------------ > > _______________________________________________ > enlightenment-svn mailing list > enlightenment-...@lists.sourceforge.net > https://lists.sourceforge.net/lists/listinfo/enlightenment-svn > ------------------------------------------------------------------------------ _______________________________________________ enlightenment-devel mailing list enlightenment-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/enlightenment-devel