1 #include <Elementary.h>
5 * @defgroup Index Index
7 * An index object is a type of list that categorizes items in it
11 typedef struct _Widget_Data Widget_Data;
16 Evas_Object *event[2];
17 Evas_Object *bx[2]; // 2 - for now all that's supported
18 Eina_List *items; // 1 list. yes N levels, but only 2 for now and # of items will be small
22 Eina_Bool level_active[2];
23 Eina_Bool horizontal : 1;
28 struct _Elm_Index_Item
33 Eina_Bool selected : 1;
36 static const char *widtype = NULL;
37 static void _theme_hook(Evas_Object *obj);
38 static void _sizing_eval(Evas_Object *obj);
39 static void _index_box_auto_fill(Evas_Object *obj, Evas_Object *box, int level);
40 static void _index_box_clear(Evas_Object *obj, Evas_Object *box, int level);
41 static void _item_free(Elm_Index_Item *it);
44 _del_pre_hook(Evas_Object *obj)
46 Widget_Data *wd = elm_widget_data_get(obj);
48 _index_box_clear(obj, wd->bx[wd->level], wd->level);
49 _index_box_clear(obj, wd->bx[0], 0);
50 while (wd->items) _item_free(wd->items->data);
51 if (wd->delay) ecore_timer_del(wd->delay);
55 _del_hook(Evas_Object *obj)
57 Widget_Data *wd = elm_widget_data_get(obj);
62 _layout(Evas_Object *o, Evas_Object_Box_Data *priv, void *data)
64 Widget_Data *wd = data;
66 _els_box_layout(o, priv, wd->horizontal, 1);
70 _signal_emit_hook(Evas_Object *obj, const char *emission, const char *source)
72 Widget_Data *wd = elm_widget_data_get(obj);
74 edje_object_signal_emit(wd->base, emission, source);
78 _signal_callback_add_hook(Evas_Object *obj, const char *emission, const char *source, void (*func_cb) (void *data, Evas_Object *o, const char *emission, const char *source), void *data)
80 Widget_Data *wd = elm_widget_data_get(obj);
82 edje_object_signal_callback_add(wd->base, emission, source, func_cb, data);
86 _signal_callback_del_hook(Evas_Object *obj, const char *emission, const char *source, void (*func_cb) (void *data, Evas_Object *o, const char *emission, const char *source), void *data)
88 Widget_Data *wd = elm_widget_data_get(obj);
89 edje_object_signal_callback_del_full(wd->base, emission, source, func_cb,
94 _theme_hook(Evas_Object *obj)
96 Evas_Coord minw = 0, minh = 0;
97 Widget_Data *wd = elm_widget_data_get(obj);
99 _index_box_clear(obj, wd->bx[0], 0);
100 _index_box_clear(obj, wd->bx[1], 1);
102 _elm_theme_object_set(obj, wd->base, "index", "base/horizontal", elm_widget_style_get(obj));
104 _elm_theme_object_set(obj, wd->base, "index", "base/vertical", elm_widget_style_get(obj));
105 edje_object_part_swallow(wd->base, "elm.swallow.event.0", wd->event[0]);
106 elm_coords_finger_size_adjust(1, &minw, 1, &minh);
107 evas_object_size_hint_min_set(wd->event[0], minw, minh);
108 edje_object_part_swallow(wd->base, "elm.swallow.index.0", wd->bx[0]);
109 if (edje_object_part_exists(wd->base, "elm.swallow.index.1"))
113 wd->bx[1] = evas_object_box_add(evas_object_evas_get(wd->base));
114 evas_object_box_layout_set(wd->bx[1], _layout, wd, NULL);
115 elm_widget_sub_object_add(obj, wd->bx[1]);
117 edje_object_part_swallow(wd->base, "elm.swallow.index.1", wd->bx[1]);
118 evas_object_show(wd->bx[1]);
122 evas_object_del(wd->bx[1]);
125 if (edje_object_part_exists(wd->base, "elm.swallow.event.1"))
129 wd->event[1] = evas_object_rectangle_add(evas_object_evas_get(wd->base));
130 evas_object_color_set(wd->event[1], 0, 0, 0, 0);
131 elm_widget_sub_object_add(obj, wd->event[1]);
133 edje_object_part_swallow(wd->base, "elm.swallow.event.1", wd->event[1]);
134 evas_object_size_hint_min_set(wd->event[1], minw, minh);
136 else if (wd->event[1])
138 evas_object_del(wd->event[1]);
141 edje_object_message_signal_process(wd->base);
142 edje_object_scale_set(wd->base, elm_widget_scale_get(obj) * _elm_config->scale);
144 _index_box_auto_fill(obj, wd->bx[0], 0);
147 _index_box_auto_fill(obj, wd->bx[1], 1);
151 _sizing_eval(Evas_Object *obj)
153 Widget_Data *wd = elm_widget_data_get(obj);
154 Evas_Coord minw = -1, minh = -1, maxw = -1, maxh = -1;
156 edje_object_size_min_calc(wd->base, &minw, &minh);
157 evas_object_size_hint_min_set(obj, minw, minh);
158 evas_object_size_hint_max_set(obj, maxw, maxh);
161 static Elm_Index_Item *
162 _item_new(Evas_Object *obj, const char *letter, const void *item)
164 Widget_Data *wd = elm_widget_data_get(obj);
166 if (!wd) return NULL;
167 it = elm_widget_item_new(obj, Elm_Index_Item);
168 if (!it) return NULL;
169 it->letter = eina_stringshare_add(letter);
170 it->base.data = item;
171 it->level = wd->level;
175 static Elm_Index_Item *
176 _item_find(Evas_Object *obj, const void *item)
178 Widget_Data *wd = elm_widget_data_get(obj);
181 if (!wd) return NULL;
182 EINA_LIST_FOREACH(wd->items, l, it)
183 if (it->base.data == item) return it;
188 _item_free(Elm_Index_Item *it)
190 Widget_Data *wd = elm_widget_data_get(it->base.widget);
192 wd->items = eina_list_remove(wd->items, it);
193 elm_widget_item_pre_notify_del(it);
194 eina_stringshare_del(it->letter);
195 elm_widget_item_del(it);
198 // FIXME: always have index filled
200 _index_box_auto_fill(Evas_Object *obj, Evas_Object *box, int level)
202 Widget_Data *wd = elm_widget_data_get(obj);
205 Evas_Coord mw, mh, w, h;
208 if (wd->level_active[level]) return;
209 evas_object_geometry_get(box, NULL, NULL, &w, &h);
210 EINA_LIST_FOREACH(wd->items, l, it)
213 const char *stacking;
215 if (it->level != level) continue;
216 o = edje_object_add(evas_object_evas_get(obj));
219 _elm_theme_object_set(obj, o, "index", "item_odd/vertical", elm_widget_style_get(obj));
221 _elm_theme_object_set(obj, o, "index", "item/vertical", elm_widget_style_get(obj));
222 edje_object_part_text_set(o, "elm.text", it->letter);
223 edje_object_size_min_restricted_calc(o, &mw, &mh, 0, 0);
224 evas_object_size_hint_min_set(o, mw, mh);
225 evas_object_size_hint_weight_set(o, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
226 evas_object_size_hint_align_set(o, EVAS_HINT_FILL, EVAS_HINT_FILL);
227 elm_widget_sub_object_add(obj, o);
228 evas_object_box_append(box, o);
229 stacking = edje_object_data_get(o, "stacking");
232 if (!strcmp(stacking, "below")) evas_object_lower(o);
233 else if (!strcmp(stacking, "above")) evas_object_raise(o);
237 evas_object_smart_calculate(box); // force a calc so we know the size
238 evas_object_size_hint_min_get(box, &mw, &mh);
241 _index_box_clear(obj, box, level);
244 // FIXME: only i objects fit! try again. overflows right now
248 evas_object_smart_calculate(box);
249 wd->level_active[level] = 1;
253 _index_box_clear(Evas_Object *obj, Evas_Object *box __UNUSED__, int level)
255 Widget_Data *wd = elm_widget_data_get(obj);
259 if (!wd->level_active[level]) return;
260 EINA_LIST_FOREACH(wd->items, l, it)
262 if (!it->base.view) continue;
263 if (it->level != level) continue;
264 evas_object_del(it->base.view);
265 it->base.view = NULL;
267 wd->level_active[level] = 0;
271 _delay_change(void *data)
273 Widget_Data *wd = elm_widget_data_get(data);
275 if (!wd) return ECORE_CALLBACK_CANCEL;
277 d = (void *)elm_index_item_selected_get(data, wd->level);
278 if (d) evas_object_smart_callback_call(data, "delay,changed", d);
279 return ECORE_CALLBACK_CANCEL;
283 _sel_eval(Evas_Object *obj, Evas_Coord evx, Evas_Coord evy)
285 Widget_Data *wd = elm_widget_data_get(obj);
286 Elm_Index_Item *it, *it_closest, *it_last;
288 Evas_Coord x, y, w, h, bx, by, bw, bh, xx, yy;
291 char *label = NULL, *last = NULL;
294 for (i = 0; i <= wd->level; i++)
299 evas_object_geometry_get(wd->bx[i], &bx, &by, &bw, &bh);
300 EINA_LIST_FOREACH(wd->items, l, it)
302 if (!((it->level == i) && (it->base.view))) continue;
303 if ((it->base.view) && (it->level != wd->level))
317 evas_object_geometry_get(it->base.view, &x, &y, &w, &h);
322 x = (x * x) + (y * y);
323 if ((x < dist) || (!it_closest))
326 cdv = (double)(xx - bx) / (double)bw;
328 cdv = (double)(yy - by) / (double)bh;
333 if ((!i) && (!wd->level))
334 edje_object_part_drag_value_set(wd->base, "elm.dragable.index.1",
336 if (it_closest) it_closest->selected = 1;
337 if (it_closest != it_last)
341 const char *stacking, *selectraise;
344 edje_object_signal_emit(it->base.view, "elm,state,inactive", "elm");
345 stacking = edje_object_data_get(it->base.view, "stacking");
346 selectraise = edje_object_data_get(it->base.view, "selectraise");
347 if ((selectraise) && (!strcmp(selectraise, "on")))
349 if ((stacking) && (!strcmp(stacking, "below")))
350 evas_object_lower(it->base.view);
355 const char *selectraise;
358 edje_object_signal_emit(it->base.view, "elm,state,active", "elm");
359 selectraise = edje_object_data_get(it->base.view, "selectraise");
360 if ((selectraise) && (!strcmp(selectraise, "on")))
361 evas_object_raise(it->base.view);
362 evas_object_smart_callback_call((void *)obj, "changed", (void *)it->base.data);
363 if (wd->delay) ecore_timer_del(wd->delay);
364 wd->delay = ecore_timer_add(0.2, _delay_change, obj);
371 last = strdup(it->letter);
374 if (!label) label = strdup(last);
377 /* FIXME: realloc return NULL if the request fails */
378 label = realloc(label, strlen(label) + strlen(last) + 1);
382 last = strdup(it->letter);
386 if (!label) label = strdup("");
387 if (!last) last = strdup("");
388 edje_object_part_text_set(wd->base, "elm.text.body", label);
389 edje_object_part_text_set(wd->base, "elm.text", last);
395 _wheel(void *data, Evas *e __UNUSED__, Evas_Object *o __UNUSED__, void *event_info __UNUSED__)
397 Widget_Data *wd = elm_widget_data_get(data);
398 // Evas_Event_Mouse_Wheel *ev = event_info;
399 // Evas_Object *obj = o;
404 _mouse_down(void *data, Evas *e __UNUSED__, Evas_Object *o __UNUSED__, void *event_info)
406 Widget_Data *wd = elm_widget_data_get(data);
407 Evas_Event_Mouse_Down *ev = event_info;
410 if (ev->button != 1) return;
412 evas_object_geometry_get(wd->base, &x, &y, NULL, NULL);
413 wd->dx = ev->canvas.x - x;
414 wd->dy = ev->canvas.y - y;
415 elm_index_active_set(data, 1);
416 _sel_eval(data, ev->canvas.x, ev->canvas.y);
417 edje_object_part_drag_value_set(wd->base, "elm.dragable.pointer",
422 _mouse_up(void *data, Evas *e __UNUSED__, Evas_Object *o __UNUSED__, void *event_info)
424 Widget_Data *wd = elm_widget_data_get(data);
425 Evas_Event_Mouse_Up *ev = event_info;
428 if (ev->button != 1) return;
430 d = (void *)elm_index_item_selected_get(data, wd->level);
431 if (d) evas_object_smart_callback_call(data, "selected", d);
432 elm_index_active_set(data, 0);
433 edje_object_signal_emit(wd->base, "elm,state,level,0", "elm");
437 _mouse_move(void *data, Evas *e __UNUSED__, Evas_Object *o __UNUSED__, void *event_info)
439 Widget_Data *wd = elm_widget_data_get(data);
440 Evas_Event_Mouse_Move *ev = event_info;
441 Evas_Coord minw = 0, minh = 0, x, y, dx, adx;
444 if (!wd->down) return;
445 elm_coords_finger_size_adjust(1, &minw, 1, &minh);
446 evas_object_geometry_get(wd->base, &x, &y, NULL, NULL);
447 x = ev->cur.canvas.x - x;
448 y = ev->cur.canvas.y - y;
451 if (adx < 0) adx = -dx;
452 edje_object_part_drag_value_set(wd->base, "elm.dragable.pointer", x, y);
460 snprintf(buf, sizeof(buf), "elm,state,level,%i", wd->level);
461 edje_object_signal_emit(wd->base, buf, "elm");
462 evas_object_smart_callback_call(data, "level,up", NULL);
470 snprintf(buf, sizeof(buf), "elm,state,level,%i", wd->level);
471 edje_object_signal_emit(wd->base, buf, "elm");
472 evas_object_smart_callback_call(data, "level,down", NULL);
476 _sel_eval(data, ev->cur.canvas.x, ev->cur.canvas.y);
480 * Add a new index to the parent
482 * @param parent The parent object
483 * @return The new object or NULL if it cannot be created
488 elm_index_add(Evas_Object *parent)
494 Evas_Coord minw, minh;
496 EINA_SAFETY_ON_NULL_RETURN_VAL(parent, NULL);
498 wd = ELM_NEW(Widget_Data);
499 e = evas_object_evas_get(parent);
501 obj = elm_widget_add(e);
502 ELM_SET_WIDTYPE(widtype, "index");
503 elm_widget_type_set(obj, "index");
504 elm_widget_sub_object_add(parent, obj);
505 elm_widget_data_set(obj, wd);
506 elm_widget_del_hook_set(obj, _del_hook);
507 elm_widget_del_pre_hook_set(obj, _del_pre_hook);
508 elm_widget_theme_hook_set(obj, _theme_hook);
509 elm_widget_signal_emit_hook_set(obj, _signal_emit_hook);
510 elm_widget_signal_callback_add_hook_set(obj, _signal_callback_add_hook);
511 elm_widget_signal_callback_del_hook_set(obj, _signal_callback_del_hook);
512 elm_widget_can_focus_set(obj, EINA_FALSE);
514 wd->horizontal = EINA_FALSE;
516 wd->base = edje_object_add(e);
517 _elm_theme_object_set(obj, wd->base, "index", "base/vertical", "default");
518 elm_widget_resize_object_set(obj, wd->base);
520 o = evas_object_rectangle_add(e);
522 evas_object_color_set(o, 0, 0, 0, 0);
524 elm_coords_finger_size_adjust(1, &minw, 1, &minh);
525 evas_object_size_hint_min_set(o, minw, minh);
526 edje_object_part_swallow(wd->base, "elm.swallow.event.0", o);
527 elm_widget_sub_object_add(obj, o);
528 evas_object_event_callback_add(o, EVAS_CALLBACK_MOUSE_WHEEL, _wheel, obj);
529 evas_object_event_callback_add(o, EVAS_CALLBACK_MOUSE_DOWN, _mouse_down, obj);
530 evas_object_event_callback_add(o, EVAS_CALLBACK_MOUSE_UP, _mouse_up, obj);
531 evas_object_event_callback_add(o, EVAS_CALLBACK_MOUSE_MOVE, _mouse_move, obj);
533 if (edje_object_part_exists(wd->base, "elm.swallow.event.1"))
535 o = evas_object_rectangle_add(e);
537 evas_object_color_set(o, 0, 0, 0, 0);
538 evas_object_size_hint_min_set(o, minw, minh);
539 edje_object_part_swallow(wd->base, "elm.swallow.event.1", o);
540 elm_widget_sub_object_add(obj, o);
543 wd->bx[0] = evas_object_box_add(e);
544 evas_object_box_layout_set(wd->bx[0], _layout, wd, NULL);
545 elm_widget_sub_object_add(obj, wd->bx[0]);
546 edje_object_part_swallow(wd->base, "elm.swallow.index.0", wd->bx[0]);
547 evas_object_show(wd->bx[0]);
549 if (edje_object_part_exists(wd->base, "elm.swallow.index.1"))
551 wd->bx[1] = evas_object_box_add(e);
552 evas_object_box_layout_set(wd->bx[1], _layout, wd, NULL);
553 elm_widget_sub_object_add(obj, wd->bx[1]);
554 edje_object_part_swallow(wd->base, "elm.swallow.index.1", wd->bx[1]);
555 evas_object_show(wd->bx[1]);
563 * Set the active state of the index programatically
565 * @param obj The index object
566 * @param active The active starte
571 elm_index_active_set(Evas_Object *obj, Eina_Bool active)
573 ELM_CHECK_WIDTYPE(obj, widtype);
574 Widget_Data *wd = elm_widget_data_get(obj);
576 if (wd->active == active) return;
581 _index_box_clear(obj, wd->bx[1], 1);
582 _index_box_auto_fill(obj, wd->bx[0], 0);
583 edje_object_signal_emit(wd->base, "elm,state,active", "elm");
586 edje_object_signal_emit(wd->base, "elm,state,inactive", "elm");
590 * Sets the level of the item.
592 * @param obj The index object.
593 * @param level To be documented.
598 elm_index_item_level_set(Evas_Object *obj, int level)
600 ELM_CHECK_WIDTYPE(obj, widtype);
601 Widget_Data *wd = elm_widget_data_get(obj);
603 if (wd->level == level) return;
608 * Gets the level of the item.
610 * @param obj The index object
615 elm_index_item_level_get(const Evas_Object *obj)
617 ELM_CHECK_WIDTYPE(obj, widtype) 0;
618 Widget_Data *wd = elm_widget_data_get(obj);
624 * Returns the selected item.
626 * @param obj The index object.
627 * @param level to be documented.
632 elm_index_item_selected_get(const Evas_Object *obj, int level)
634 ELM_CHECK_WIDTYPE(obj, widtype) NULL;
635 Widget_Data *wd = elm_widget_data_get(obj);
638 if (!wd) return NULL;
639 EINA_LIST_FOREACH(wd->items, l, it)
640 if ((it->selected) && (it->level == level))
641 return elm_widget_item_data_get(it);
646 * Appends a new item.
648 * @param obj The index object.
649 * @param letter Letter under which the item should be indexed
650 * @param item The item to put in the index
655 elm_index_item_append(Evas_Object *obj, const char *letter, const void *item)
657 ELM_CHECK_WIDTYPE(obj, widtype);
658 Widget_Data *wd = elm_widget_data_get(obj);
661 it = _item_new(obj, letter, item);
663 wd->items = eina_list_append(wd->items, it);
664 _index_box_clear(obj, wd->bx[wd->level], wd->level);
668 * Prepends a new item.
670 * @param obj The index object.
671 * @param letter Letter under which the item should be indexed
672 * @param item The item to put in the index
677 elm_index_item_prepend(Evas_Object *obj, const char *letter, const void *item)
679 ELM_CHECK_WIDTYPE(obj, widtype);
680 Widget_Data *wd = elm_widget_data_get(obj);
684 it = _item_new(obj, letter, item);
686 wd->items = eina_list_prepend(wd->items, it);
687 _index_box_clear(obj, wd->bx[wd->level], wd->level);
691 * Append an item after @p relative in letter @p letter.
693 * @param obj The index object
694 * @param letter Letter under which the item should be indexed
695 * @param item The item to put in the index
696 * @param relative The item to put @p item after
701 elm_index_item_append_relative(Evas_Object *obj, const char *letter, const void *item, const void *relative)
703 ELM_CHECK_WIDTYPE(obj, widtype);
704 Widget_Data *wd = elm_widget_data_get(obj);
705 Elm_Index_Item *it, *it_rel;
709 elm_index_item_append(obj, letter, item);
712 it = _item_new(obj, letter, item);
713 it_rel = _item_find(obj, relative);
716 elm_index_item_append(obj, letter, item);
720 wd->items = eina_list_append_relative(wd->items, it, it_rel);
721 _index_box_clear(obj, wd->bx[wd->level], wd->level);
725 * Prepend an item before @p relative in letter @p letter.
727 * @param obj The index object
728 * @param letter Letter under which the item should be indexed
729 * @param item The item to put in the index
730 * @param relative The item to put @p item before
735 elm_index_item_prepend_relative(Evas_Object *obj, const char *letter, const void *item, const void *relative)
737 ELM_CHECK_WIDTYPE(obj, widtype);
738 Widget_Data *wd = elm_widget_data_get(obj);
739 Elm_Index_Item *it, *it_rel;
743 elm_index_item_prepend(obj, letter, item);
746 it = _item_new(obj, letter, item);
747 it_rel = _item_find(obj, relative);
750 elm_index_item_append(obj, letter, item);
754 wd->items = eina_list_prepend_relative(wd->items, it, it_rel);
755 _index_box_clear(obj, wd->bx[wd->level], wd->level);
759 * Insert a new @p item into the sorted index @p obj in @p letter.
761 * @param obj The index object
762 * @param letter Letter under which the item should be indexed
763 * @param item The item to put in the index
764 * @param cmp_func The function called for the sort of index items.
765 * @param cmp_data_func The function called for the sort of the data. It will
766 * be used when cmp_func return 0. It means the index item already exists.
767 * So, to decide which data item should be pointed by the index item, a function
768 * to compare them is needed. If this function is not provided, index items
769 * will be duplicated. If cmp_data_func returns a non-negative value, the
770 * previous index item data will be replaced by the inserted @p item. So
771 * if the previous data need to be free, it should be done in this function,
772 * because the reference will be lost.
777 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)
779 ELM_CHECK_WIDTYPE(obj, widtype);
780 Widget_Data *wd = elm_widget_data_get(obj);
788 elm_index_item_append(obj, letter, item);
792 it = _item_new(obj, letter, item);
795 lnear = eina_list_search_sorted_near_list(wd->items, cmp_func, it, &cmp);
797 wd->items = eina_list_append_relative_list(wd->items, it, lnear);
799 wd->items = eina_list_prepend_relative_list(wd->items, it, lnear);
802 /* If cmp_data_func is not provided, append a duplicated item */
804 wd->items = eina_list_append_relative_list(wd->items, it, lnear);
807 Elm_Index_Item *p_it = eina_list_data_get(lnear);
808 if (cmp_data_func(p_it->base.data, it->base.data) >= 0)
809 p_it->base.data = it->base.data;
814 _index_box_clear(obj, wd->bx[wd->level], wd->level);
818 * Remove an item from the index.
820 * @param obj The index object
821 * @param item The item to remove from the index
826 elm_index_item_del(Evas_Object *obj, const void *item)
828 ELM_CHECK_WIDTYPE(obj, widtype);
829 Widget_Data *wd = elm_widget_data_get(obj);
832 it = _item_find(obj, item);
835 _index_box_clear(obj, wd->bx[wd->level], wd->level);
839 * Find an index item using item data.
841 * @param obj The index object
842 * @param item The item pointed by index item
843 * @return The index item pointing to @p item
847 EAPI Elm_Index_Item *
848 elm_index_item_find(Evas_Object *obj, const void *item)
850 ELM_CHECK_WIDTYPE(obj, widtype) NULL;
851 Widget_Data *wd = elm_widget_data_get(obj);
852 if (!wd) return NULL;
853 return _item_find(obj, item);
857 * Clears an index of its items.
859 * @param obj The index object.
864 elm_index_item_clear(Evas_Object *obj)
866 ELM_CHECK_WIDTYPE(obj, widtype);
867 Widget_Data *wd = elm_widget_data_get(obj);
869 Eina_List *l, *clear = NULL;
871 _index_box_clear(obj, wd->bx[wd->level], wd->level);
872 EINA_LIST_FOREACH(wd->items, l, it)
874 if (it->level != wd->level) continue;
875 clear = eina_list_append(clear, it);
877 EINA_LIST_FREE(clear, it) _item_free(it);
881 * Go to item at @p level
883 * @param obj The index object
884 * @param level The index level
889 elm_index_item_go(Evas_Object *obj, int level __UNUSED__)
891 ELM_CHECK_WIDTYPE(obj, widtype);
892 Widget_Data *wd = elm_widget_data_get(obj);
894 _index_box_auto_fill(obj, wd->bx[0], 0);
895 if (wd->level == 1) _index_box_auto_fill(obj, wd->bx[1], 1);
899 * Returns the data associated with the item.
901 * @param it The list item
902 * @return The data associated with @p it
907 elm_index_item_data_get(const Elm_Index_Item *it)
909 ELM_WIDGET_ITEM_WIDTYPE_CHECK_OR_RETURN(it, NULL);
910 return elm_widget_item_data_get(it);
914 * Set the data item from the index item
916 * This set a new data value.
919 * @param data The new data pointer to set
924 elm_index_item_data_set(Elm_Index_Item *it, const void *data)
926 ELM_WIDGET_ITEM_WIDTYPE_CHECK_OR_RETURN(it);
927 elm_widget_item_data_set(it, data);
931 * Set the function called when a index item is freed.
933 * @param it The item to set the callback on
934 * @param func The function called
939 elm_index_item_del_cb_set(Elm_Index_Item *it, Evas_Smart_Cb func)
941 ELM_WIDGET_ITEM_WIDTYPE_CHECK_OR_RETURN(it);
942 elm_widget_item_del_cb_set(it, func);
946 * Gets the letter of the item.
948 * @param it The list item
949 * @return The letter of @p it
954 elm_index_item_letter_get(const Elm_Index_Item *it)
956 ELM_WIDGET_ITEM_WIDTYPE_CHECK_OR_RETURN(it, NULL);