3 typedef struct _E_Widget_Queue_Item E_Widget_Queue_Item;
4 typedef struct _E_Widget_Data E_Widget_Data;
5 typedef struct _E_Widget_Callback E_Widget_Callback;
9 Evas_Object *o_widget, *o_scrollframe, *o_ilist;
22 struct _E_Widget_Callback
24 void (*func)(void *data);
29 struct _E_Widget_Queue_Item
36 void (*func)(void *data);
39 int relative, use_relative;
43 static void _e_wid_del_hook(Evas_Object *obj);
44 static void _e_wid_focus_hook(Evas_Object *obj);
45 static void _e_wid_cb_scrollframe_resize(void *data, Evas *e, Evas_Object *obj, void *event_info);
46 static void _e_wid_cb_item_sel(void *data, void *data2);
47 static void _e_wid_cb_item_hilight(void *data, void *data2);
48 static void _e_wid_cb_selected(void *data, Evas_Object *obj, void *event_info);
49 static void _e_wid_focus_steal(void *data, Evas *e, Evas_Object *obj, void *event_info);
51 static Eina_Bool _queue_timer(void *data);
52 static void _queue_queue(Evas_Object *obj);
53 static void _queue_append(Evas_Object *obj, int command, Evas_Object *icon, Evas_Object *end, const char *label, int header, void (*func)(void *data), void *data, const char *val, int relative, int use_relative, int item);
54 static void _queue_remove(Evas_Object *obj, E_Widget_Queue_Item *qi, int del);
75 _queue_timer(void *data)
80 double start = ecore_time_get();
83 wd = e_widget_data_get(obj);
84 if (!wd) return EINA_FALSE;
85 wd->queue.timer = NULL;
86 e_widget_ilist_freeze(obj);
88 while (wd->queue.queue)
90 E_Widget_Queue_Item *qi;
92 qi = eina_list_data_get(wd->queue.queue);
93 if (qi->command == CMD_ADD)
95 E_Widget_Callback *wcb, *rcb;
97 wcb = E_NEW(E_Widget_Callback, 1);
100 wcb->data = qi->data;
101 if (qi->val) wcb->value = eina_stringshare_add(qi->val);
102 if (qi->use_relative == CMD_APPEND)
104 wd->callbacks = eina_list_append(wd->callbacks, wcb);
105 e_ilist_append(wd->o_ilist, qi->icon, qi->end, qi->label, qi->header,
106 _e_wid_cb_item_sel, _e_wid_cb_item_hilight, wd, wcb);
108 else if (qi->use_relative == CMD_PREPEND)
110 wd->callbacks = eina_list_prepend(wd->callbacks, wcb);
111 e_ilist_prepend(wd->o_ilist, qi->icon, qi->end, qi->label, qi->header,
112 _e_wid_cb_item_sel, _e_wid_cb_item_hilight, wd, wcb);
114 else if (qi->use_relative == CMD_APPEND_RELATIVE)
116 rcb = eina_list_nth(wd->callbacks, qi->relative);
119 wd->callbacks = eina_list_append_relative(wd->callbacks, wcb, rcb);
120 e_ilist_append_relative(wd->o_ilist, qi->icon, qi->end, qi->label, qi->header,
121 _e_wid_cb_item_sel, _e_wid_cb_item_hilight, wd, wcb, qi->relative);
125 wd->callbacks = eina_list_append(wd->callbacks, wcb);
126 e_ilist_append(wd->o_ilist, qi->icon, qi->end, qi->label, qi->header,
127 _e_wid_cb_item_sel, _e_wid_cb_item_hilight, wd, wcb);
130 else if (qi->use_relative == CMD_PREPEND_RELATIVE)
132 rcb = eina_list_nth(wd->callbacks, qi->relative);
135 wd->callbacks = eina_list_prepend_relative(wd->callbacks, wcb, rcb);
136 e_ilist_prepend_relative(wd->o_ilist, qi->icon, qi->end, qi->label, qi->header,
137 _e_wid_cb_item_sel, _e_wid_cb_item_hilight, wd, wcb, qi->relative);
141 wd->callbacks = eina_list_prepend(wd->callbacks, wcb);
142 e_ilist_prepend(wd->o_ilist, qi->icon, qi->end, qi->label, qi->header,
143 _e_wid_cb_item_sel, _e_wid_cb_item_hilight, wd, wcb);
150 if (qi->icon) evas_object_show(qi->icon);
151 if (qi->end) evas_object_show(qi->end);
153 else if (qi->command == CMD_LABEL_SET)
154 e_ilist_nth_label_set(wd->o_ilist, qi->item, qi->label);
155 else if (qi->command == CMD_ICON_SET)
156 e_ilist_nth_icon_set(wd->o_ilist, qi->item, qi->icon);
157 else if (qi->command == CMD_SHOW)
159 Evas_Coord x, y, w, h;
162 e_ilist_nth_geometry_get(wd->o_ilist, qi->item, &x, &y, &w, &h);
163 if (qi->use_relative)
164 e_scrollframe_child_pos_set(wd->o_scrollframe, x, y);
166 e_scrollframe_child_region_show(wd->o_scrollframe, x, y + h, w, h);
168 else if (qi->command == CMD_SELECT)
169 e_ilist_selected_set(wd->o_ilist, qi->item);
170 else if (qi->command == CMD_UNSELECT)
172 if ((wd->value) && *(wd->value))
174 eina_stringshare_del(*(wd->value));
177 e_ilist_unselect(wd->o_ilist);
180 else if (qi->command == CMD_REMOVE)
182 E_Widget_Callback *wcb;
185 e_ilist_remove_num(wd->o_ilist, qi->item);
186 item = eina_list_nth_list(wd->callbacks, qi->item);
189 wcb = eina_list_data_get(item);
190 if (wcb && wcb->value) eina_stringshare_del(wcb->value);
192 wd->callbacks = eina_list_remove_list(wd->callbacks, item);
196 else if (qi->command == CMD_MULTI_SELECT)
197 e_ilist_multi_select(wd->o_ilist, qi->item);
198 else if (qi->command == CMD_RANGE_SELECT)
199 e_ilist_range_select(wd->o_ilist, qi->item);
200 else if (qi->command == CMD_END_SET)
201 e_ilist_nth_end_set(wd->o_ilist, qi->item, qi->end);
202 _queue_remove(obj, qi, 0);
204 if ((num++ >= 10) && (ecore_time_get() - start > 0.01))
207 e_widget_ilist_thaw(obj);
208 e_widget_ilist_go(obj);
210 return ECORE_CALLBACK_CANCEL;
214 _queue_queue(Evas_Object *obj)
218 wd = e_widget_data_get(obj);
220 if (!wd->queue.queue) return;
221 if (wd->queue.timer) return;
222 wd->queue.timer = ecore_timer_add(0.00001, _queue_timer, obj);
226 _queue_append(Evas_Object *obj, int command, Evas_Object *icon, Evas_Object *end,
227 const char *label, int header, void (*func)(void *data), void *data,
228 const char *val, int relative, int use_relative, int item)
231 E_Widget_Queue_Item *qi;
233 wd = e_widget_data_get(obj);
235 qi = E_NEW(E_Widget_Queue_Item, 1);
237 qi->command = command;
240 qi->label = eina_stringshare_add(label);
244 qi->val = eina_stringshare_add(val);
245 qi->relative = relative;
246 qi->use_relative = use_relative;
248 wd->queue.queue = eina_list_append(wd->queue.queue, qi);
253 _queue_remove(Evas_Object *obj, E_Widget_Queue_Item *qi, int del)
257 wd = e_widget_data_get(obj);
259 wd->queue.queue = eina_list_remove(wd->queue.queue, qi);
262 if (qi->icon) evas_object_del(qi->icon);
263 if (qi->end) evas_object_del(qi->end);
265 eina_stringshare_del(qi->label);
266 eina_stringshare_del(qi->val);
271 _queue_clear(Evas_Object *obj)
275 wd = e_widget_data_get(obj);
277 while (wd->queue.queue)
278 _queue_remove(obj, eina_list_data_get(wd->queue.queue), 1);
279 if (wd->queue.timer) ecore_timer_del(wd->queue.timer);
280 wd->queue.timer = NULL;
284 _e_wid_disable_hook(Evas_Object *obj)
291 disabled = e_widget_disabled_get(obj);
292 wd = e_widget_data_get(obj);
295 EINA_LIST_FOREACH(e_widget_ilist_items_get(obj), l, ili)
298 edje_object_signal_emit(ili->o_base, "e,state,disabled", "e");
300 edje_object_signal_emit(ili->o_base, "e,state,enabled", "e");
302 evas_object_freeze_events_set(wd->o_scrollframe, disabled);
305 /* externally accessible functions */
307 e_widget_ilist_add(Evas *evas, int icon_w, int icon_h, const char **value)
309 Evas_Object *obj, *o;
312 wd = E_NEW(E_Widget_Data, 1);
313 if (!wd) return NULL;
315 obj = e_widget_add(evas);
317 e_widget_del_hook_set(obj, _e_wid_del_hook);
318 e_widget_focus_hook_set(obj, _e_wid_focus_hook);
319 e_widget_disable_hook_set(obj, _e_wid_disable_hook);
320 e_widget_data_set(obj, wd);
324 o = e_scrollframe_add(evas);
325 wd->o_scrollframe = o;
327 e_widget_sub_object_add(obj, o);
328 e_widget_resize_object_set(obj, o);
329 evas_object_event_callback_add(o, EVAS_CALLBACK_MOUSE_DOWN,
330 _e_wid_focus_steal, obj);
332 o = e_ilist_add(evas);
334 e_ilist_icon_size_set(o, icon_w, icon_h);
335 evas_object_event_callback_add(wd->o_scrollframe, EVAS_CALLBACK_RESIZE,
336 _e_wid_cb_scrollframe_resize, o);
337 e_scrollframe_child_set(wd->o_scrollframe, o);
338 e_widget_sub_object_add(obj, o);
340 evas_object_smart_callback_add(o, "selected", _e_wid_cb_selected, obj);
342 evas_object_resize(obj, 32, 32);
343 e_widget_size_min_set(obj, 32, 32);
348 e_widget_ilist_freeze(Evas_Object *obj)
352 wd = e_widget_data_get(obj);
354 e_ilist_freeze(wd->o_ilist);
358 e_widget_ilist_thaw(Evas_Object *obj)
362 wd = e_widget_data_get(obj);
364 e_ilist_thaw(wd->o_ilist);
368 e_widget_ilist_append(Evas_Object *obj, Evas_Object *icon, const char *label, void (*func)(void *data), void *data, const char *val)
370 _queue_append(obj, CMD_ADD, icon, NULL, label, 0, func, data, val, 0, CMD_APPEND, 0);
373 E_Widget_Callback *wcb;
375 wcb = E_NEW(E_Widget_Callback, 1);
378 wd = e_widget_data_get(obj);
381 if (val) wcb->value = strdup(val);
382 wd->callbacks = eina_list_append(wd->callbacks, wcb);
383 e_ilist_append(wd->o_ilist, icon, label, 0, _e_wid_cb_item_sel, _e_wid_cb_item_hilight, wd, wcb);
384 if (icon) evas_object_show(icon);
389 e_widget_ilist_append_full(Evas_Object *obj, Evas_Object *icon, Evas_Object *end, const char *label, void (*func)(void *data), void *data, const char *val)
391 _queue_append(obj, CMD_ADD, icon, end, label, 0, func, data, val, 0, CMD_APPEND, 0);
395 e_widget_ilist_header_append_relative(Evas_Object *obj, Evas_Object *icon, const char *label, int relative)
397 _queue_append(obj, CMD_ADD, icon, NULL, label, 1, NULL, NULL, NULL, relative, CMD_APPEND_RELATIVE, 0);
401 e_widget_ilist_header_prepend_relative(Evas_Object *obj, Evas_Object *icon, const char *label, int relative)
403 _queue_append(obj, CMD_ADD, icon, NULL, label, 1, NULL, NULL, NULL, relative, CMD_PREPEND_RELATIVE, 0);
407 e_widget_ilist_append_relative(Evas_Object *obj, Evas_Object *icon, const char *label, void (*func)(void *data), void *data, const char *val, int relative)
409 _queue_append(obj, CMD_ADD, icon, NULL, label, 0, func, data, val, relative, CMD_APPEND_RELATIVE, 0);
412 E_Widget_Callback *wcb, *rcb;
414 wcb = E_NEW(E_Widget_Callback, 1);
417 wd = e_widget_data_get(obj);
420 if (val) wcb->value = strdup(val);
422 rcb = eina_list_nth(wd->callbacks, relative);
425 wd->callbacks = eina_list_append_relative(wd->callbacks, wcb, rcb);
426 e_ilist_append_relative(wd->o_ilist, icon, label, 0, _e_wid_cb_item_sel, _e_wid_cb_item_hilight, wd, wcb, relative);
430 wd->callbacks = eina_list_append(wd->callbacks, wcb);
431 e_ilist_append(wd->o_ilist, icon, label, 0, _e_wid_cb_item_sel, _e_wid_cb_item_hilight, wd, wcb);
434 if (icon) evas_object_show(icon);
439 e_widget_ilist_append_relative_full(Evas_Object *obj, Evas_Object *icon, Evas_Object *end, const char *label, void (*func)(void *data), void *data, const char *val, int relative)
441 _queue_append(obj, CMD_ADD, icon, end, label, 0, func, data, val, relative, CMD_APPEND_RELATIVE, 0);
445 e_widget_ilist_prepend(Evas_Object *obj, Evas_Object *icon, const char *label, void (*func)(void *data), void *data, const char *val)
447 _queue_append(obj, CMD_ADD, icon, NULL, label, 0, func, data, val, 0, CMD_PREPEND, 0);
450 E_Widget_Callback *wcb;
452 wcb = E_NEW(E_Widget_Callback, 1);
455 wd = e_widget_data_get(obj);
458 if (val) wcb->value = strdup(val);
459 wd->callbacks = eina_list_prepend(wd->callbacks, wcb);
460 e_ilist_prepend(wd->o_ilist, icon, label, 0, _e_wid_cb_item_sel, _e_wid_cb_item_hilight, wd, wcb);
461 if (icon) evas_object_show(icon);
466 e_widget_ilist_header_prepend(Evas_Object *obj, Evas_Object *icon, const char *label)
468 _queue_append(obj, CMD_ADD, icon, NULL, label, 1, NULL, NULL, NULL, 0, CMD_PREPEND, 0);
472 e_widget_ilist_prepend_full(Evas_Object *obj, Evas_Object *icon, Evas_Object *end, const char *label, void (*func)(void *data), void *data, const char *val)
474 _queue_append(obj, CMD_ADD, icon, end, label, 0, func, data, val, 0, CMD_PREPEND, 0);
478 e_widget_ilist_prepend_relative(Evas_Object *obj, Evas_Object *icon, const char *label, void (*func)(void *data), void *data, const char *val, int relative)
480 _queue_append(obj, CMD_ADD, icon, NULL, label, 0, func, data, val, relative, CMD_PREPEND_RELATIVE, 0);
483 E_Widget_Callback *wcb, *rcb;
485 wcb = E_NEW(E_Widget_Callback, 1);
488 wd = e_widget_data_get(obj);
491 if (val) wcb->value = strdup(val);
493 rcb = eina_list_nth(wd->callbacks, relative);
496 wd->callbacks = eina_list_prepend_relative(wd->callbacks, wcb, rcb);
497 e_ilist_prepend_relative(wd->o_ilist, icon, label, 0, _e_wid_cb_item_sel, _e_wid_cb_item_hilight, wd, wcb, relative);
501 wd->callbacks = eina_list_prepend(wd->callbacks, wcb);
502 e_ilist_prepend(wd->o_ilist, icon, label, 0, _e_wid_cb_item_sel, _e_wid_cb_item_hilight, wd, wcb);
505 if (icon) evas_object_show(icon);
510 e_widget_ilist_prepend_relative_full(Evas_Object *obj, Evas_Object *icon, Evas_Object *end, const char *label, void (*func)(void *data), void *data, const char *val, int relative)
512 _queue_append(obj, CMD_ADD, icon, end, label, 0, func, data, val, relative, CMD_PREPEND_RELATIVE, 0);
516 e_widget_ilist_header_append(Evas_Object *obj, Evas_Object *icon, const char *label)
518 _queue_append(obj, CMD_ADD, icon, NULL, label, 1, NULL, NULL, NULL, 0, CMD_APPEND, 0);
521 E_Widget_Callback *wcb;
523 wcb = E_NEW(E_Widget_Callback, 1);
526 wd = e_widget_data_get(obj);
527 wd->callbacks = eina_list_append(wd->callbacks, wcb);
528 e_ilist_append(wd->o_ilist, icon, label, 1, NULL, NULL, NULL, NULL);
529 if (icon) evas_object_show(icon);
534 e_widget_ilist_selector_set(Evas_Object *obj, int selector)
538 wd = e_widget_data_get(obj);
540 e_ilist_selector_set(wd->o_ilist, selector);
544 e_widget_ilist_go(Evas_Object *obj)
547 Evas_Coord mw, mh, vw, vh, w, h;
549 wd = e_widget_data_get(obj);
552 e_ilist_size_min_get(wd->o_ilist, &mw, &mh);
553 evas_object_resize(wd->o_ilist, mw, mh);
554 e_scrollframe_child_viewport_size_get(wd->o_scrollframe, &vw, &vh);
555 evas_object_geometry_get(wd->o_scrollframe, NULL, NULL, &w, &h);
560 e_widget_size_min_get(obj, &wmw, &wmh);
561 e_widget_size_min_set(obj, mw + (w - vw), wmh);
564 evas_object_resize(wd->o_ilist, vw, mh);
568 e_widget_ilist_clear(Evas_Object *obj)
571 E_Widget_Callback *wcb;
573 wd = e_widget_data_get(obj);
576 e_ilist_clear(wd->o_ilist);
577 e_scrollframe_child_pos_set(wd->o_scrollframe, 0, 0);
578 EINA_LIST_FREE(wd->callbacks, wcb)
580 eina_stringshare_del(wcb->value);
586 e_widget_ilist_count(Evas_Object *obj)
590 wd = e_widget_data_get(obj);
595 E_Widget_Queue_Item *qi;
599 EINA_LIST_FOREACH(wd->queue.queue, l, qi)
600 if (qi->command == CMD_ADD) cnt++;
602 return cnt + e_ilist_count(wd->o_ilist);
605 return e_ilist_count(wd->o_ilist);
608 EAPI const Eina_List *
609 e_widget_ilist_items_get(Evas_Object *obj)
613 wd = e_widget_data_get(obj);
614 if (!wd) return NULL;
615 return e_ilist_items_get(wd->o_ilist);
619 e_widget_ilist_nth_is_header(Evas_Object *obj, int n)
623 wd = e_widget_data_get(obj);
624 if (!wd) return EINA_FALSE;
625 return e_ilist_nth_is_header(wd->o_ilist, n);
629 e_widget_ilist_nth_label_set(Evas_Object *obj, int n, const char *label)
631 _queue_append(obj, CMD_LABEL_SET, NULL, NULL, label, 0, NULL, NULL, NULL, 0, 0, n);
635 wd = e_widget_data_get(obj);
636 e_ilist_nth_label_set(wd->o_ilist, n, label);
641 e_widget_ilist_nth_label_get(Evas_Object *obj, int n)
645 wd = e_widget_data_get(obj);
646 if (!wd) return NULL;
647 return e_ilist_nth_label_get(wd->o_ilist, n);
651 e_widget_ilist_nth_icon_set(Evas_Object *obj, int n, Evas_Object *icon)
653 _queue_append(obj, CMD_ICON_SET, icon, NULL, NULL, 0, NULL, NULL, NULL, 0, 0, n);
657 wd = e_widget_data_get(obj);
658 e_ilist_nth_icon_set(wd->o_ilist, n, icon);
663 e_widget_ilist_nth_icon_get(Evas_Object *obj, int n)
667 wd = e_widget_data_get(obj);
668 if (!wd) return NULL;
669 return e_ilist_nth_icon_get(wd->o_ilist, n);
673 e_widget_ilist_nth_end_set(Evas_Object *obj, int n, Evas_Object *end)
675 _queue_append(obj, CMD_END_SET, NULL, end, NULL, 0, NULL, NULL, NULL, 0, 0, n);
679 e_widget_ilist_nth_end_get(Evas_Object *obj, int n)
683 wd = e_widget_data_get(obj);
684 if (!wd) return NULL;
685 return e_ilist_nth_end_get(wd->o_ilist, n);
689 e_widget_ilist_nth_data_get(Evas_Object *obj, int n)
692 E_Widget_Callback *wcb;
694 wd = e_widget_data_get(obj);
695 if (!wd) return NULL;
696 wcb = eina_list_nth(wd->callbacks, n);
705 e_widget_ilist_nth_value_get(Evas_Object *obj, int n)
708 E_Widget_Callback *wcb;
710 wd = e_widget_data_get(obj);
711 if (!wd) return NULL;
712 wcb = eina_list_nth(wd->callbacks, n);
721 * Return if the given item returned by e_widget_ilist_items_get()
724 * This avoid expensive lookups to the nth element, however it's not
725 * able to check any validity on the given pointer and may crash. Be
726 * sure to use only with valid return of e_widget_ilist_items_get().
729 e_widget_ilist_item_is_header(const E_Ilist_Item *it)
735 * Return the label of given item returned by e_widget_ilist_items_get().
737 * This avoid expensive lookups to the nth element, however it's not
738 * able to check any validity on the given pointer and may crash. Be
739 * sure to use only with valid return of e_widget_ilist_items_get().
742 e_widget_ilist_item_label_get(const E_Ilist_Item *it)
748 * Return the icon of given item returned by e_widget_ilist_items_get().
750 * This avoid expensive lookups to the nth element, however it's not
751 * able to check any validity on the given pointer and may crash. Be
752 * sure to use only with valid return of e_widget_ilist_items_get().
754 * Do not delete this object!
757 e_widget_ilist_item_icon_get(const E_Ilist_Item *it)
763 * Return the end of given item returned by e_widget_ilist_items_get().
765 * This avoid expensive lookups to the nth element, however it's not
766 * able to check any validity on the given pointer and may crash. Be
767 * sure to use only with valid return of e_widget_ilist_items_get().
769 * Do not delete this object!
772 e_widget_ilist_item_end_get(const E_Ilist_Item *it)
778 * Return the data of given item returned by e_widget_ilist_items_get().
780 * This avoid expensive lookups to the nth element, however it's not
781 * able to check any validity on the given pointer and may crash. Be
782 * sure to use only with valid return of e_widget_ilist_items_get().
784 * Do not delete this object!
787 e_widget_ilist_item_data_get(const E_Ilist_Item *it)
789 E_Widget_Callback *wcb = it->data2;
798 e_widget_ilist_item_value_get(const E_Ilist_Item *it)
800 E_Widget_Callback *wcb = it->data2;
809 * Show the nth element of an ilist
810 * @param obj the ilist
811 * @param n the number of the element to show
812 * @param top if true, place this item at the top, otherwise scroll just
813 * enough to show the element (from the current position).
816 e_widget_ilist_nth_show(Evas_Object *obj, int n, int top)
818 _queue_append(obj, CMD_SHOW, NULL, NULL, NULL, 0, NULL, NULL, NULL, 0, top, n);
821 Evas_Coord x, y, w, h;
823 wd = e_widget_data_get(obj);
824 e_ilist_nth_geometry_get(wd->o_ilist, n, &x, &y, &w, &h);
826 e_scrollframe_child_pos_set(wd->o_scrollframe, x, y);
828 e_scrollframe_child_region_show(wd->o_scrollframe, x, y, w, h);
833 e_widget_ilist_selected_set(Evas_Object *obj, int n)
835 _queue_append(obj, CMD_SELECT, NULL, NULL, NULL, 0, NULL, NULL, NULL, 0, 0, n);
839 wd = e_widget_data_get(obj);
840 e_ilist_selected_set(wd->o_ilist, n);
844 EAPI const Eina_List *
845 e_widget_ilist_selected_items_get(Evas_Object *obj)
849 wd = e_widget_data_get(obj);
850 if (!wd) return NULL;
851 return e_ilist_selected_items_get(wd->o_ilist);
855 e_widget_ilist_selected_get(Evas_Object *obj)
859 wd = e_widget_data_get(obj);
861 return e_ilist_selected_get(wd->o_ilist);
865 e_widget_ilist_selected_label_get(Evas_Object *obj)
869 wd = e_widget_data_get(obj);
870 if (!wd) return NULL;
871 return e_ilist_selected_label_get(wd->o_ilist);
875 e_widget_ilist_selected_icon_get(Evas_Object *obj)
879 wd = e_widget_data_get(obj);
880 if (!wd) return NULL;
881 return e_ilist_selected_icon_get(wd->o_ilist);
885 e_widget_ilist_selected_data_get(Evas_Object *obj)
888 E_Widget_Callback *wcb;
890 wd = e_widget_data_get(obj);
891 if (!wd) return NULL;
892 wcb = eina_list_nth(wd->callbacks, e_ilist_selected_get(wd->o_ilist));
894 return wcb ? wcb->data : NULL;
898 e_widget_ilist_selected_end_get(Evas_Object *obj)
902 wd = e_widget_data_get(obj);
903 if (!wd) return NULL;
904 return e_ilist_selected_end_get(wd->o_ilist);
908 e_widget_ilist_selected_count_get(Evas_Object *obj)
912 wd = e_widget_data_get(obj);
914 return e_ilist_selected_count_get(wd->o_ilist);
918 e_widget_ilist_selected_value_get(Evas_Object *obj)
921 E_Widget_Callback *wcb;
923 wd = e_widget_data_get(obj);
924 if (!wd) return NULL;
925 wcb = eina_list_nth(wd->callbacks, e_ilist_selected_get(wd->o_ilist));
934 e_widget_ilist_unselect(Evas_Object *obj)
936 _queue_append(obj, CMD_UNSELECT, NULL, NULL, NULL, 0, NULL, NULL, NULL, 0, 0, 0);
940 wd = e_widget_data_get(obj);
941 if ((wd->value) && *(wd->value))
946 e_ilist_unselect(wd->o_ilist);
951 e_widget_ilist_remove_num(Evas_Object *obj, int n)
953 /* _queue_append(obj, CMD_REMOVE, NULL, NULL, 0, NULL, NULL, NULL, 0, 0, n); */
954 E_Widget_Callback *wcb;
958 wd = e_widget_data_get(obj);
960 e_ilist_remove_num(wd->o_ilist, n);
961 item = eina_list_nth_list(wd->callbacks, n);
964 wcb = eina_list_data_get(item);
965 if (wcb) eina_stringshare_del(wcb->value);
967 wd->callbacks = eina_list_remove_list(wd->callbacks, item);
972 e_widget_ilist_multi_select_set(Evas_Object *obj, Eina_Bool multi)
976 wd = e_widget_data_get(obj);
978 e_ilist_multi_select_set(wd->o_ilist, multi);
982 e_widget_ilist_multi_select_get(Evas_Object *obj)
986 wd = e_widget_data_get(obj);
987 if (!wd) return EINA_FALSE;
988 return e_ilist_multi_select_get(wd->o_ilist);
992 e_widget_ilist_multi_select(Evas_Object *obj, int n)
994 _queue_append(obj, CMD_MULTI_SELECT, NULL, NULL, NULL, 0, NULL, NULL, NULL, 0, 0, n);
998 wd = e_widget_data_get(obj);
999 e_ilist_multi_select(wd->o_ilist, n);
1004 e_widget_ilist_range_select(Evas_Object *obj, int n)
1006 _queue_append(obj, CMD_RANGE_SELECT, NULL, NULL, NULL, 0, NULL, NULL, NULL, 0, 0, n);
1010 wd = e_widget_data_get(obj);
1011 e_ilist_range_select(wd->o_ilist, n);
1016 e_widget_ilist_custom_edje_file_set(Evas_Object *obj, const char *file, const char *group)
1021 wd = e_widget_data_get(obj);
1022 if (!wd) return EINA_FALSE;
1025 snprintf(buf, sizeof(buf), "%s/scrollframe", group);
1026 e_scrollframe_custom_edje_file_set(wd->o_scrollframe, file, group);
1028 return e_ilist_custom_edje_file_set(wd->o_ilist, file, group);
1032 e_widget_ilist_preferred_size_get(Evas_Object *obj, Evas_Coord *w, Evas_Coord *h)
1034 Evas_Coord ww, hh, mw, mh, vw, vh;
1037 wd = e_widget_data_get(obj);
1039 evas_object_geometry_get(wd->o_scrollframe, NULL, NULL, &ww, &hh);
1040 evas_object_resize(wd->o_scrollframe, 200, 200);
1041 e_scrollframe_child_viewport_size_get(wd->o_scrollframe, &vw, &vh);
1042 e_ilist_size_min_get(wd->o_ilist, &mw, &mh);
1043 evas_object_resize(wd->o_scrollframe, ww, hh);
1044 if (w) *w = 200 - vw + mw;
1045 if (h) *h = 200 - vh + mh;
1049 _e_wid_del_hook(Evas_Object *obj)
1052 E_Widget_Callback *wcb;
1054 wd = e_widget_data_get(obj);
1057 EINA_LIST_FREE(wd->callbacks, wcb)
1059 if (wcb) eina_stringshare_del(wcb->value);
1066 _e_wid_focus_hook(Evas_Object *obj)
1070 wd = e_widget_data_get(obj);
1072 if (e_widget_focus_get(obj))
1074 edje_object_signal_emit(e_scrollframe_edje_object_get(wd->o_scrollframe), "e,state,focused", "e");
1075 evas_object_focus_set(wd->o_ilist, 1);
1079 edje_object_signal_emit(e_scrollframe_edje_object_get(wd->o_scrollframe), "e,state,unfocused", "e");
1080 evas_object_focus_set(wd->o_ilist, 0);
1085 _e_wid_cb_scrollframe_resize(void *data, Evas *e __UNUSED__, Evas_Object *obj, void *event_info __UNUSED__)
1087 Evas_Coord mw, mh, vw, vh, w, h;
1089 e_scrollframe_child_viewport_size_get(obj, &vw, &vh);
1090 e_ilist_size_min_get(data, &mw, &mh);
1091 evas_object_geometry_get(data, NULL, NULL, &w, &h);
1094 if (w != vw) evas_object_resize(data, vw, h);
1095 evas_object_smart_callback_call(data, "changed", obj);
1100 _e_wid_cb_item_sel(void *data, void *data2)
1103 Evas_Coord x, y, w, h;
1104 E_Widget_Callback *wcb;
1108 e_ilist_selected_geometry_get(wd->o_ilist, &x, &y, &w, &h);
1109 e_scrollframe_child_region_show(wd->o_scrollframe, x, y, w, h);
1114 if (*(wd->value)) eina_stringshare_del(*(wd->value));
1116 *(wd->value) = eina_stringshare_ref(wcb->value);
1118 *(wd->value) = NULL;
1120 if (wcb->func) wcb->func(wcb->data);
1121 e_widget_change(wd->o_widget);
1126 _e_wid_cb_item_hilight(void *data, void *data2 __UNUSED__)
1129 Evas_Coord x, y, w, h;
1132 e_ilist_selected_geometry_get(wd->o_ilist, &x, &y, &w, &h);
1133 e_scrollframe_child_region_show(wd->o_scrollframe, x, y, w, h);
1137 _e_wid_cb_selected(void *data, Evas_Object *obj __UNUSED__, void *event_info)
1139 evas_object_smart_callback_call(data, "selected", event_info);
1143 _e_wid_focus_steal(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
1145 e_widget_focus_steal(data);