3 #include <Elementary.h>
4 #include <Elementary_Cursor.h>
6 #include "els_scroller.h"
7 #include "elm_gen_common.h"
9 #define MAX_ITEMS_PER_BLOCK 32
10 #define REORDER_EFFECT_TIME 0.5
12 #define ELM_GEN_SETUP(wd) \
13 (wd)->calc_cb = (Ecore_Cb)_calc_job; \
14 (wd)->clear_cb = (Ecore_Cb)_clear_cb; \
15 (wd)->sizing_cb = (Ecore_Cb)_sizing_eval
17 #define ELM_GEN_ITEM_SETUP(it) \
18 (it)->del_cb = (Ecore_Cb)_item_del; \
19 (it)->highlight_cb = (Ecore_Cb)_item_highlight; \
20 (it)->unsel_cb = (Ecore_Cb)_item_unselect; \
21 (it)->unhighlight_cb = (Ecore_Cb)_item_unhighlight; \
22 (it)->unrealize_cb = (Ecore_Cb)_item_unrealize_cb
24 typedef struct _Item_Block Item_Block;
25 typedef struct _Item_Cache Item_Cache;
27 struct Elm_Gen_Item_Type
32 Evas_Coord w, h, minw, minh;
33 Elm_Gen_Item *group_item;
34 Elm_Genlist_Item_Flags flags;
35 Eina_List *mode_texts, *mode_contents, *mode_states, *mode_content_objs;
36 Eina_List *edit_texts, *edit_contents, *edit_states, *edit_content_objs;
37 Ecore_Timer *swipe_timer;
38 Evas_Coord scrl_x, scrl_y, old_scrl_y;
41 Evas_Object *mode_view;
47 Eina_Bool want_realize : 1;
48 Eina_Bool expanded : 1;
49 Eina_Bool mincalcd : 1;
52 Eina_Bool updateme : 1;
53 Eina_Bool nocache : 1;
54 Eina_Bool stacking_even : 1;
55 Eina_Bool nostacking : 1;
56 Eina_Bool move_effect_enabled : 1;
57 Eina_Bool edit_mode_item_realized : 1;
68 Evas_Coord x, y, w, h, minw, minh;
70 int item_position_stamp;
72 Eina_Bool position_update : 1;
73 Eina_Bool want_unrealize : 1;
74 Eina_Bool realized : 1;
75 Eina_Bool changed : 1;
76 Eina_Bool updateme : 1;
78 Eina_Bool must_recalc : 1;
85 Evas_Object *base_view, *spacer;
87 const char *item_style; // it->itc->item_style
88 Eina_Bool tree : 1; // it->group
89 Eina_Bool compress : 1; // it->wd->compress
91 Eina_Bool selected : 1; // it->selected
92 Eina_Bool disabled : 1; // it->disabled
93 Eina_Bool expanded : 1; // it->item->expanded
96 static const char *widtype = NULL;
97 static void _item_cache_zero(Widget_Data *wd);
98 static void _del_hook(Evas_Object *obj);
99 static void _mirrored_set(Evas_Object *obj,
101 static void _theme_hook(Evas_Object *obj);
102 static void _show_region_hook(void *data,
104 static void _sizing_eval(Evas_Object *obj);
105 static void _item_realize(Elm_Gen_Item *it,
108 static void _item_unrealize_cb(Elm_Gen_Item *it);
109 static void _item_block_unrealize(Item_Block *itb);
110 static void _calc_job(void *data);
111 static void _on_focus_hook(void *data,
113 static Eina_Bool _item_multi_select_up(Widget_Data *wd);
114 static Eina_Bool _item_multi_select_down(Widget_Data *wd);
115 static Eina_Bool _item_single_select_up(Widget_Data *wd);
116 static Eina_Bool _item_single_select_down(Widget_Data *wd);
117 static Eina_Bool _event_hook(Evas_Object *obj,
119 Evas_Callback_Type type,
121 static void _signal_emit_hook(Evas_Object *obj,
122 const char *emission,
124 static Eina_Bool _deselect_all_items(Widget_Data *wd);
125 static void _pan_calculate(Evas_Object *obj);
126 static void _pan_max_get(Evas_Object *obj,
129 static void _item_position(Elm_Gen_Item *it,
133 static void _mode_item_realize(Elm_Gen_Item *it);
134 static void _mode_item_unrealize(Elm_Gen_Item *it);
135 static void _item_mode_set(Elm_Gen_Item *it);
136 static void _item_mode_unset(Widget_Data *wd);
137 static void _edit_mode_item_position(Elm_Gen_Item *it, int itx, int ity);
138 static void _edit_mode_item_realize(Elm_Gen_Item *it, Eina_Bool effect_on);
139 static void _edit_mode_item_unrealize(Elm_Gen_Item *it);
140 static void _group_items_recalc(void *data);
141 static void _item_move_after(Elm_Gen_Item *it,
142 Elm_Gen_Item *after);
143 static void _item_move_before(Elm_Gen_Item *it,
144 Elm_Gen_Item *before);
145 static void _item_auto_scroll(Widget_Data *wd);
146 static void _elm_genlist_clear(Evas_Object *obj,
148 static void _pan_child_size_get(Evas_Object *obj,
152 static Evas_Smart_Class _pan_sc = EVAS_SMART_CLASS_INIT_VERSION;
154 static const char SIG_ACTIVATED[] = "activated";
155 static const char SIG_CLICKED_DOUBLE[] = "clicked,double";
156 static const char SIG_SELECTED[] = "selected";
157 static const char SIG_UNSELECTED[] = "unselected";
158 static const char SIG_EXPANDED[] = "expanded";
159 static const char SIG_CONTRACTED[] = "contracted";
160 static const char SIG_EXPAND_REQUEST[] = "expand,request";
161 static const char SIG_CONTRACT_REQUEST[] = "contract,request";
162 static const char SIG_REALIZED[] = "realized";
163 static const char SIG_UNREALIZED[] = "unrealized";
164 static const char SIG_DRAG_START_UP[] = "drag,start,up";
165 static const char SIG_DRAG_START_DOWN[] = "drag,start,down";
166 static const char SIG_DRAG_START_LEFT[] = "drag,start,left";
167 static const char SIG_DRAG_START_RIGHT[] = "drag,start,right";
168 static const char SIG_DRAG_STOP[] = "drag,stop";
169 static const char SIG_DRAG[] = "drag";
170 static const char SIG_LONGPRESSED[] = "longpressed";
171 static const char SIG_SCROLL_ANIM_START[] = "scroll,anim,start";
172 static const char SIG_SCROLL_ANIM_STOP[] = "scroll,anim,stop";
173 static const char SIG_SCROLL_DRAG_START[] = "scroll,drag,start";
174 static const char SIG_SCROLL_DRAG_STOP[] = "scroll,drag,stop";
175 static const char SIG_EDGE_TOP[] = "edge,top";
176 static const char SIG_EDGE_BOTTOM[] = "edge,bottom";
177 static const char SIG_EDGE_LEFT[] = "edge,left";
178 static const char SIG_EDGE_RIGHT[] = "edge,right";
179 static const char SIG_MULTI_SWIPE_LEFT[] = "multi,swipe,left";
180 static const char SIG_MULTI_SWIPE_RIGHT[] = "multi,swipe,right";
181 static const char SIG_MULTI_SWIPE_UP[] = "multi,swipe,up";
182 static const char SIG_MULTI_SWIPE_DOWN[] = "multi,swipe,down";
183 static const char SIG_MULTI_PINCH_OUT[] = "multi,pinch,out";
184 static const char SIG_MULTI_PINCH_IN[] = "multi,pinch,in";
185 static const char SIG_SWIPE[] = "swipe";
186 static const char SIG_MOVED[] = "moved";
187 static const char SIG_INDEX_UPDATE[] = "index,update";
189 static const Evas_Smart_Cb_Description _signals[] = {
190 {SIG_CLICKED_DOUBLE, ""},
193 {SIG_UNSELECTED, ""},
195 {SIG_CONTRACTED, ""},
196 {SIG_EXPAND_REQUEST, ""},
197 {SIG_CONTRACT_REQUEST, ""},
199 {SIG_UNREALIZED, ""},
200 {SIG_DRAG_START_UP, ""},
201 {SIG_DRAG_START_DOWN, ""},
202 {SIG_DRAG_START_LEFT, ""},
203 {SIG_DRAG_START_RIGHT, ""},
206 {SIG_LONGPRESSED, ""},
207 {SIG_SCROLL_ANIM_START, ""},
208 {SIG_SCROLL_ANIM_STOP, ""},
209 {SIG_SCROLL_DRAG_START, ""},
210 {SIG_SCROLL_DRAG_STOP, ""},
212 {SIG_EDGE_BOTTOM, ""},
214 {SIG_EDGE_RIGHT, ""},
215 {SIG_MULTI_SWIPE_LEFT, ""},
216 {SIG_MULTI_SWIPE_RIGHT, ""},
217 {SIG_MULTI_SWIPE_UP, ""},
218 {SIG_MULTI_SWIPE_DOWN, ""},
219 {SIG_MULTI_PINCH_OUT, ""},
220 {SIG_MULTI_PINCH_IN, ""},
227 #undef ELM_CHECK_WIDTYPE
228 #define ELM_CHECK_WIDTYPE(obj, widtype) \
229 if ((!obj) || (!elm_genlist_type_check((obj), __func__))) return
230 #undef ELM_WIDGET_ITEM_WIDTYPE_CHECK_OR_RETURN
231 #define ELM_WIDGET_ITEM_WIDTYPE_CHECK_OR_RETURN(it, ...) \
232 ELM_WIDGET_ITEM_CHECK_OR_RETURN((Elm_Widget_Item *)it, __VA_ARGS__); \
233 ELM_CHECK_WIDTYPE(WIDGET((it)), widtype) __VA_ARGS__;
235 static const char *_gengrid = NULL;
236 static const char *_genlist = NULL;
238 /* THIS FUNCTION IS HACKY AND TEMPORARY!!! */
240 elm_genlist_type_check(const Evas_Object *obj,
243 const char *provided, *expected = "(unknown)";
244 static int abort_on_warn = -1;
245 provided = elm_widget_type_get(obj);
246 if (!_genlist) _genlist = eina_stringshare_add("genlist");
247 if (!_gengrid) _gengrid = eina_stringshare_add("gengrid");
248 if (EINA_LIKELY(provided == _genlist) || EINA_LIKELY(provided == _gengrid))
250 if ((!provided) || (!provided[0]))
252 provided = evas_object_type_get(obj);
253 if ((!provided) || (!provided[0]))
254 provided = "(unknown)";
256 ERR("Passing Object: %p in function: %s, of type: '%s' when expecting type: '%s'", obj, func, provided, expected);
257 if (abort_on_warn == -1)
259 if (getenv("ELM_ERROR_ABORT")) abort_on_warn = 1;
260 else abort_on_warn = 0;
262 if (abort_on_warn == 1) abort();
267 _event_hook(Evas_Object *obj,
268 Evas_Object *src __UNUSED__,
269 Evas_Callback_Type type,
272 if (type != EVAS_CALLBACK_KEY_DOWN) return EINA_FALSE;
273 Evas_Event_Key_Down *ev = event_info;
274 Widget_Data *wd = elm_widget_data_get(obj);
275 Evas_Coord pan_max_x = 0, pan_max_y = 0;
276 if (!wd) return EINA_FALSE;
277 if (!wd->items) return EINA_FALSE;
278 if (ev->event_flags & EVAS_EVENT_FLAG_ON_HOLD) return EINA_FALSE;
279 if (elm_widget_disabled_get(obj)) return EINA_FALSE;
281 Elm_Object_Item *it = NULL;
284 Evas_Coord step_x = 0;
285 Evas_Coord step_y = 0;
288 Evas_Coord page_x = 0;
289 Evas_Coord page_y = 0;
291 elm_smart_scroller_child_pos_get(wd->scr, &x, &y);
292 elm_smart_scroller_step_size_get(wd->scr, &step_x, &step_y);
293 elm_smart_scroller_page_size_get(wd->scr, &page_x, &page_y);
294 elm_smart_scroller_child_viewport_size_get(wd->scr, &v_w, &v_h);
296 if ((!strcmp(ev->keyname, "Left")) || (!strcmp(ev->keyname, "KP_Left")))
300 else if ((!strcmp(ev->keyname, "Right")) || (!strcmp(ev->keyname, "KP_Right")))
304 else if ((!strcmp(ev->keyname, "Up")) || (!strcmp(ev->keyname, "KP_Up")))
306 if (((evas_key_modifier_is_set(ev->modifiers, "Shift")) &&
307 (_item_multi_select_up(wd)))
308 || (_item_single_select_up(wd)))
310 ev->event_flags |= EVAS_EVENT_FLAG_ON_HOLD;
316 else if ((!strcmp(ev->keyname, "Down")) || (!strcmp(ev->keyname, "KP_Down")))
318 if (((evas_key_modifier_is_set(ev->modifiers, "Shift")) &&
319 (_item_multi_select_down(wd)))
320 || (_item_single_select_down(wd)))
322 ev->event_flags |= EVAS_EVENT_FLAG_ON_HOLD;
328 else if ((!strcmp(ev->keyname, "Home")) || (!strcmp(ev->keyname, "KP_Home")))
330 it = elm_genlist_first_item_get(obj);
331 elm_genlist_item_bring_in(it);
332 elm_genlist_item_selected_set(it, EINA_TRUE);
333 ev->event_flags |= EVAS_EVENT_FLAG_ON_HOLD;
336 else if ((!strcmp(ev->keyname, "End")) || (!strcmp(ev->keyname, "KP_End")))
338 it = elm_genlist_last_item_get(obj);
339 elm_genlist_item_bring_in(it);
340 elm_genlist_item_selected_set(it, EINA_TRUE);
341 ev->event_flags |= EVAS_EVENT_FLAG_ON_HOLD;
344 else if ((!strcmp(ev->keyname, "Prior")) || (!strcmp(ev->keyname, "KP_Prior")))
347 y -= -(page_y * v_h) / 100;
351 else if ((!strcmp(ev->keyname, "Next")) || (!strcmp(ev->keyname, "KP_Next")))
354 y += -(page_y * v_h) / 100;
358 else if (!strcmp(ev->keyname, "Escape"))
360 if (!_deselect_all_items(wd)) return EINA_FALSE;
361 ev->event_flags |= EVAS_EVENT_FLAG_ON_HOLD;
364 else if (((!strcmp(ev->keyname, "Return")) ||
365 (!strcmp(ev->keyname, "KP_Enter")) ||
366 (!strcmp(ev->keyname, "space")))
367 && (!wd->multi) && (wd->selected))
369 it = elm_genlist_selected_item_get(obj);
370 elm_genlist_item_expanded_set(it,
371 !elm_genlist_item_expanded_get(it));
372 evas_object_smart_callback_call(WIDGET(it), SIG_ACTIVATED, it);
374 else return EINA_FALSE;
376 ev->event_flags |= EVAS_EVENT_FLAG_ON_HOLD;
377 _pan_max_get(wd->pan_smart, &pan_max_x, &pan_max_y);
379 if (x > pan_max_x) x = pan_max_x;
381 if (y > pan_max_y) y = pan_max_y;
382 elm_smart_scroller_child_pos_set(wd->scr, x, y);
387 _deselect_all_items(Widget_Data *wd)
389 if (!wd->selected) return EINA_FALSE;
391 elm_genlist_item_selected_set(wd->selected->data, EINA_FALSE);
397 _item_multi_select_up(Widget_Data *wd)
399 if (!wd->selected) return EINA_FALSE;
400 if (!wd->multi) return EINA_FALSE;
402 Elm_Object_Item *prev = elm_genlist_item_prev_get(wd->last_selected_item);
403 if (!prev) return EINA_TRUE;
405 if (elm_genlist_item_selected_get(prev))
407 elm_genlist_item_selected_set(wd->last_selected_item, EINA_FALSE);
408 wd->last_selected_item = prev;
409 elm_genlist_item_show(wd->last_selected_item);
413 elm_genlist_item_selected_set(prev, EINA_TRUE);
414 elm_genlist_item_show(prev);
420 _item_multi_select_down(Widget_Data *wd)
422 if (!wd->selected) return EINA_FALSE;
423 if (!wd->multi) return EINA_FALSE;
425 Elm_Object_Item *next;
426 next = elm_genlist_item_next_get(wd->last_selected_item);
427 if (!next) return EINA_TRUE;
429 if (elm_genlist_item_selected_get(next))
431 elm_genlist_item_selected_set(wd->last_selected_item, EINA_FALSE);
432 wd->last_selected_item = next;
433 elm_genlist_item_show(wd->last_selected_item);
437 elm_genlist_item_selected_set(next, EINA_TRUE);
438 elm_genlist_item_show(next);
444 _item_single_select_up(Widget_Data *wd)
449 prev = ELM_GEN_ITEM_FROM_INLIST(wd->items->last);
450 while ((prev) && (prev->generation < wd->generation))
451 prev = ELM_GEN_ITEM_FROM_INLIST(EINA_INLIST_GET(prev)->prev);
453 else prev = (Elm_Gen_Item *) elm_genlist_item_prev_get(wd->last_selected_item);
455 if (!prev) return EINA_FALSE;
457 _deselect_all_items(wd);
459 elm_genlist_item_selected_set((Elm_Object_Item *) prev, EINA_TRUE);
460 elm_genlist_item_show((Elm_Object_Item *) prev);
465 _item_single_select_down(Widget_Data *wd)
470 next = ELM_GEN_ITEM_FROM_INLIST(wd->items);
471 while ((next) && (next->generation < wd->generation))
472 next = ELM_GEN_ITEM_FROM_INLIST(EINA_INLIST_GET(next)->next);
474 else next = (Elm_Gen_Item *) elm_genlist_item_next_get(wd->last_selected_item);
476 if (!next) return EINA_FALSE;
478 _deselect_all_items(wd);
480 elm_genlist_item_selected_set((Elm_Object_Item *) next, EINA_TRUE);
481 elm_genlist_item_show((Elm_Object_Item *) next);
486 _on_focus_hook(void *data __UNUSED__,
489 Widget_Data *wd = elm_widget_data_get(obj);
491 if (elm_widget_focus_get(obj))
493 elm_object_signal_emit(wd->obj, "elm,action,focus", "elm");
494 evas_object_focus_set(wd->obj, EINA_TRUE);
495 if ((wd->selected) && (!wd->last_selected_item))
496 wd->last_selected_item = eina_list_data_get(wd->selected);
500 elm_object_signal_emit(wd->obj, "elm,action,unfocus", "elm");
501 evas_object_focus_set(wd->obj, EINA_FALSE);
506 _del_hook(Evas_Object *obj)
508 Widget_Data *wd = elm_widget_data_get(obj);
510 _item_cache_zero(wd);
511 if (wd->calc_job) ecore_job_del(wd->calc_job);
512 if (wd->update_job) ecore_job_del(wd->update_job);
513 if (wd->queue_idle_enterer) ecore_idle_enterer_del(wd->queue_idle_enterer);
514 if (wd->must_recalc_idler) ecore_idler_del(wd->must_recalc_idler);
515 if (wd->multi_timer) ecore_timer_del(wd->multi_timer);
516 if (wd->mode_type) eina_stringshare_del(wd->mode_type);
517 if (wd->scr_hold_timer) ecore_timer_del(wd->scr_hold_timer);
522 _del_pre_hook(Evas_Object *obj)
524 Widget_Data *wd = elm_widget_data_get(obj);
526 if (wd->edit_mode) elm_genlist_edit_mode_set(wd->obj, EINA_FALSE);
527 elm_genlist_clear(obj);
528 evas_object_del(wd->pan_smart);
529 wd->pan_smart = NULL;
533 _mirrored_set(Evas_Object *obj,
536 Widget_Data *wd = elm_widget_data_get(obj);
538 _item_cache_zero(wd);
539 elm_smart_scroller_mirrored_set(wd->scr, rtl);
543 _theme_hook(Evas_Object *obj)
545 Widget_Data *wd = elm_widget_data_get(obj);
548 evas_event_freeze(evas_object_evas_get(wd->obj));
549 _item_cache_zero(wd);
550 _elm_widget_mirrored_reload(obj);
551 _mirrored_set(obj, elm_widget_mirrored_get(obj));
552 elm_smart_scroller_object_theme_set(obj, wd->scr, "genlist", "base",
553 elm_widget_style_get(obj));
554 edje_object_scale_set(wd->scr, elm_widget_scale_get(obj) * _elm_config->scale);
555 wd->item_width = wd->item_height = 0;
556 wd->group_item_width = wd->group_item_height = 0;
557 wd->minw = wd->minh = wd->realminw = 0;
558 EINA_INLIST_FOREACH(wd->blocks, itb)
563 if (itb->realized) _item_block_unrealize(itb);
564 EINA_LIST_FOREACH(itb->items, l, it)
565 it->item->mincalcd = EINA_FALSE;
567 itb->changed = EINA_TRUE;
569 if (wd->calc_job) ecore_job_del(wd->calc_job);
570 wd->calc_job = ecore_job_add(_calc_job, wd);
572 evas_event_thaw(evas_object_evas_get(wd->obj));
573 evas_event_thaw_eval(evas_object_evas_get(wd->obj));
577 _show_region_hook(void *data,
580 Widget_Data *wd = elm_widget_data_get(data);
581 Evas_Coord x, y, w, h;
583 elm_widget_show_region_get(obj, &x, &y, &w, &h);
584 //x & y are screen coordinates, Add with pan coordinates
587 elm_smart_scroller_child_region_show(wd->scr, x, y, w, h);
591 _translate_hook(Evas_Object *obj)
593 evas_object_smart_callback_call(obj, "language,changed", NULL);
597 _sizing_eval(Evas_Object *obj)
599 Widget_Data *wd = elm_widget_data_get(obj);
600 Evas_Coord minw = -1, minh = -1, maxw = -1, maxh = -1;
602 evas_object_size_hint_min_get(wd->scr, &minw, &minh);
603 evas_object_size_hint_max_get(wd->scr, &maxw, &maxh);
605 if (wd->height_for_width)
609 elm_smart_scroller_child_viewport_size_get(wd->scr, &vw, &vh);
610 if ((vw != 0) && (vw != wd->prev_viewport_w))
614 wd->prev_viewport_w = vw;
615 EINA_INLIST_FOREACH(wd->blocks, itb)
617 itb->must_recalc = EINA_TRUE;
619 if (wd->calc_job) ecore_job_del(wd->calc_job);
620 wd->calc_job = ecore_job_add(_calc_job, wd);
623 if (wd->mode == ELM_LIST_LIMIT)
629 elm_smart_scroller_child_viewport_size_get(wd->scr, &vmw, &vmh);
630 edje_object_size_min_calc
631 (elm_smart_scroller_edje_object_get(wd->scr), &vmw, &vmh);
638 edje_object_size_min_calc
639 (elm_smart_scroller_edje_object_get(wd->scr), &vmw, &vmh);
643 evas_object_size_hint_min_set(obj, minw, minh);
644 evas_object_size_hint_max_set(obj, maxw, maxh);
648 _signal_emit_hook(Evas_Object *obj,
649 const char *emission,
652 Widget_Data *wd = elm_widget_data_get(obj);
653 edje_object_signal_emit(elm_smart_scroller_edje_object_get(wd->scr),
658 _item_highlight(Elm_Gen_Item *it)
660 const char *selectraise;
661 if ((it->wd->no_select) || (it->generation < it->wd->generation) ||
662 (it->highlighted) || elm_widget_item_disabled_get(it) ||
663 (it->display_only) || (it->item->mode_view))
665 edje_object_signal_emit(VIEW(it), "elm,state,selected", "elm");
666 if (it->edit_obj) edje_object_signal_emit(it->edit_obj, "elm,state,selected", "elm");
667 selectraise = edje_object_data_get(VIEW(it), "selectraise");
668 if ((selectraise) && (!strcmp(selectraise, "on")))
670 if (it->edit_obj) evas_object_raise(it->edit_obj);
671 else evas_object_raise(VIEW(it));
672 if ((it->item->group_item) && (it->item->group_item->realized))
673 evas_object_raise(it->item->VIEW(group_item));
675 it->highlighted = EINA_TRUE;
679 _item_unhighlight(Elm_Gen_Item *it)
681 if ((it->generation < it->wd->generation) || (!it->highlighted)) return;
682 edje_object_signal_emit(VIEW(it), "elm,state,unselected", "elm");
683 if (it->edit_obj) edje_object_signal_emit(it->edit_obj, "elm,state,unselected", "elm");
684 if (!it->item->nostacking)
686 if ((it->item->order_num_in & 0x1) ^ it->item->stacking_even)
688 if (it->edit_obj) evas_object_lower(it->edit_obj);
689 else evas_object_lower(VIEW(it));
693 if (it->edit_obj) evas_object_raise(it->edit_obj);
694 else evas_object_raise(VIEW(it));
697 it->highlighted = EINA_FALSE;
701 _item_block_position_update(Eina_Inlist *list, int idx)
705 EINA_INLIST_FOREACH(list, tmp)
707 tmp->position = idx++;
708 tmp->position_update = EINA_TRUE;
713 _item_position_update(Eina_List *list, int idx)
718 EINA_LIST_FOREACH(list, l, it)
720 it->position = idx++;
721 it->position_update = EINA_TRUE;
726 _item_block_del(Elm_Gen_Item *it)
729 Item_Block *itb = it->item->block;
731 itb->items = eina_list_remove(itb->items, it);
733 itb->changed = EINA_TRUE;
734 if (it->wd->calc_job) ecore_job_del(it->wd->calc_job);
735 it->wd->calc_job = ecore_job_add(_calc_job, it->wd);
738 il = EINA_INLIST_GET(itb);
739 Item_Block *itbn = (Item_Block *)(il->next);
741 it->parent->item->items = eina_list_remove(it->parent->item->items, it);
744 _item_block_position_update(il->next, itb->position);
745 it->wd->blocks = eina_inlist_remove(it->wd->blocks, il);
748 if (itbn) itbn->changed = EINA_TRUE;
752 if (itb->count < itb->wd->max_items_per_block/2)
754 il = EINA_INLIST_GET(itb);
755 Item_Block *itbp = (Item_Block *)(il->prev);
756 Item_Block *itbn = (Item_Block *)(il->next);
757 if ((itbp) && ((itbp->count + itb->count) < itb->wd->max_items_per_block + itb->wd->max_items_per_block/2))
761 EINA_LIST_FREE(itb->items, it2)
763 it2->item->block = itbp;
764 itbp->items = eina_list_append(itbp->items, it2);
766 itbp->changed = EINA_TRUE;
768 _item_block_position_update(EINA_INLIST_GET(itb)->next,
770 it->wd->blocks = eina_inlist_remove(it->wd->blocks,
771 EINA_INLIST_GET(itb));
774 else if ((itbn) && ((itbn->count + itb->count) < itb->wd->max_items_per_block + itb->wd->max_items_per_block/2))
778 Eina_List *last = eina_list_last(itb->items);
779 Elm_Gen_Item *it2 = last->data;
781 it2->item->block = itbn;
782 itb->items = eina_list_remove_list(itb->items, last);
783 itbn->items = eina_list_prepend(itbn->items, it2);
785 itbn->changed = EINA_TRUE;
787 _item_block_position_update(EINA_INLIST_GET(itb)->next,
790 eina_inlist_remove(it->wd->blocks, EINA_INLIST_GET(itb));
798 _item_del(Elm_Gen_Item *it)
800 Evas_Object *obj = WIDGET(it);
802 evas_event_freeze(evas_object_evas_get(obj));
803 elm_genlist_item_subitems_clear((Elm_Object_Item *) it);
804 if (it->wd->show_item == it) it->wd->show_item = NULL;
805 if (it->realized) _elm_genlist_item_unrealize(it, EINA_FALSE);
806 if (it->item->edit_mode_item_realized) _edit_mode_item_unrealize(it);
807 if (it->item->block) _item_block_del(it);
808 if (it->item->queued)
809 it->wd->queue = eina_list_remove(it->wd->queue, it);
810 if (it->wd->anchor_item == it)
812 it->wd->anchor_item = ELM_GEN_ITEM_FROM_INLIST(EINA_INLIST_GET(it)->next);
813 if (!it->wd->anchor_item)
814 it->wd->anchor_item = ELM_GEN_ITEM_FROM_INLIST(EINA_INLIST_GET(it)->prev);
816 if (it->wd->expanded_item == it) it->wd->expanded_item = NULL;
818 it->parent->item->items = eina_list_remove(it->parent->item->items, it);
819 if (it->item->swipe_timer) ecore_timer_del(it->item->swipe_timer);
820 _elm_genlist_item_del_serious(it);
821 elm_genlist_item_class_unref((Elm_Genlist_Item_Class *)it->itc);
822 evas_event_thaw(evas_object_evas_get(obj));
823 evas_event_thaw_eval(evas_object_evas_get(obj));
827 _clear_cb(Widget_Data *wd)
829 wd->anchor_item = NULL;
832 Item_Block *itb = (Item_Block *)(wd->blocks);
834 wd->blocks = eina_inlist_remove(wd->blocks, wd->blocks);
835 if (itb->items) eina_list_free(itb->items);
838 if (wd->queue_idle_enterer)
840 ecore_idle_enterer_del(wd->queue_idle_enterer);
841 wd->queue_idle_enterer = NULL;
843 if (wd->must_recalc_idler)
845 ecore_idler_del(wd->must_recalc_idler);
846 wd->must_recalc_idler = NULL;
848 if (wd->queue) wd->queue = eina_list_free(wd->queue);
849 if (wd->reorder_move_animator)
851 ecore_animator_del(wd->reorder_move_animator);
852 wd->reorder_move_animator = NULL;
854 wd->show_item = NULL;
855 wd->reorder_old_pan_y = 0;
859 _item_unselect(Elm_Gen_Item *it)
861 if ((it->generation < it->wd->generation) || (!it->selected)) return;
862 it->selected = EINA_FALSE;
863 it->wd->selected = eina_list_remove(it->wd->selected, it);
864 evas_object_smart_callback_call(WIDGET(it), SIG_UNSELECTED, it);
868 _mouse_move(void *data,
869 Evas *evas __UNUSED__,
873 Elm_Gen_Item *it = data;
874 Evas_Event_Mouse_Move *ev = event_info;
875 Evas_Coord minw = 0, minh = 0, x, y, dx, dy, adx, ady;
876 Evas_Coord ox, oy, ow, oh, it_scrl_y, y_pos;
878 if (ev->event_flags & EVAS_EVENT_FLAG_ON_HOLD)
880 if (!it->wd->on_hold)
882 it->wd->on_hold = EINA_TRUE;
883 if (!it->wd->wasselected)
885 _item_unhighlight(it);
890 if (it->wd->multitouched)
892 it->wd->cur_x = ev->cur.canvas.x;
893 it->wd->cur_y = ev->cur.canvas.y;
896 if ((it->dragging) && (it->down))
898 if (it->wd->movements == SWIPE_MOVES) it->wd->swipe = EINA_TRUE;
901 it->wd->history[it->wd->movements].x = ev->cur.canvas.x;
902 it->wd->history[it->wd->movements].y = ev->cur.canvas.y;
903 if (abs((it->wd->history[it->wd->movements].x -
904 it->wd->history[0].x)) > 40)
905 it->wd->swipe = EINA_TRUE;
911 ecore_timer_del(it->long_timer);
912 it->long_timer = NULL;
914 evas_object_smart_callback_call(WIDGET(it), SIG_DRAG, it);
917 if ((!it->down) /* || (it->wd->on_hold)*/ || (it->wd->longpressed))
921 ecore_timer_del(it->long_timer);
922 it->long_timer = NULL;
924 if ((it->wd->reorder_mode) && (it->wd->reorder_it))
926 evas_object_geometry_get(it->wd->pan_smart, &ox, &oy, &ow, &oh);
927 it_scrl_y = ev->cur.canvas.y - it->wd->reorder_it->dy;
929 if (!it->wd->reorder_start_y)
930 it->wd->reorder_start_y = it->item->block->y + it->y;
934 else if (it_scrl_y + it->wd->reorder_it->item->h > oy + oh)
935 y_pos = oy + oh - it->wd->reorder_it->item->h;
940 _item_position(it, it->edit_obj, it->item->scrl_x, y_pos);
942 _item_position(it, VIEW(it), it->item->scrl_x, y_pos);
944 if (it->wd->calc_job) ecore_job_del(it->wd->calc_job);
945 it->wd->calc_job = ecore_job_add(_calc_job, it->wd);
949 if (!it->display_only)
950 elm_coords_finger_size_adjust(1, &minw, 1, &minh);
951 evas_object_geometry_get(obj, &x, &y, NULL, NULL);
952 x = ev->cur.canvas.x - x;
953 y = ev->cur.canvas.y - y;
956 if (adx < 0) adx = -dx;
959 if (ady < 0) ady = -dy;
962 if ((adx > minw) || (ady > minh))
964 it->dragging = EINA_TRUE;
967 ecore_timer_del(it->long_timer);
968 it->long_timer = NULL;
970 if (!it->wd->wasselected)
972 _item_unhighlight(it);
978 evas_object_smart_callback_call(WIDGET(it),
979 SIG_DRAG_START_UP, it);
983 evas_object_smart_callback_call(WIDGET(it),
984 SIG_DRAG_START_LEFT, it);
986 evas_object_smart_callback_call(WIDGET(it),
987 SIG_DRAG_START_RIGHT, it);
993 evas_object_smart_callback_call(WIDGET(it),
994 SIG_DRAG_START_DOWN, it);
998 evas_object_smart_callback_call(WIDGET(it),
999 SIG_DRAG_START_LEFT, it);
1001 evas_object_smart_callback_call(WIDGET(it),
1002 SIG_DRAG_START_RIGHT, it);
1009 _long_press(void *data)
1011 Elm_Gen_Item *it = data, *it_tmp;
1012 Eina_List *list, *l;
1014 it->long_timer = NULL;
1015 if (elm_widget_item_disabled_get(it) || (it->dragging) || (it->display_only))
1016 return ECORE_CALLBACK_CANCEL;
1017 it->wd->longpressed = EINA_TRUE;
1018 evas_object_smart_callback_call(WIDGET(it), SIG_LONGPRESSED, it);
1019 if ((it->wd->reorder_mode) && (!it->group))
1021 it->wd->reorder_it = it;
1022 it->wd->reorder_start_y = 0;
1024 evas_object_raise(it->edit_obj);
1026 evas_object_raise(VIEW(it));
1028 elm_smart_scroller_hold_set(it->wd->scr, EINA_TRUE);
1029 elm_smart_scroller_bounce_allow_set(it->wd->scr, EINA_FALSE, EINA_FALSE);
1031 list = elm_genlist_realized_items_get(it->wd->obj);
1032 EINA_LIST_FOREACH(list, l, it_tmp)
1034 if (it != it_tmp) _item_unselect(it_tmp);
1036 if (elm_genlist_item_expanded_get((Elm_Object_Item *) it))
1038 elm_genlist_item_expanded_set((Elm_Object_Item *) it, EINA_FALSE);
1039 return ECORE_CALLBACK_RENEW;
1042 if (!it->wd->edit_mode)
1043 edje_object_signal_emit(VIEW(it), "elm,state,reorder,enabled", "elm");
1045 return ECORE_CALLBACK_CANCEL;
1049 _swipe(Elm_Gen_Item *it)
1054 if ((it->display_only) || elm_widget_item_disabled_get(it)) return;
1055 it->wd->swipe = EINA_FALSE;
1056 for (i = 0; i < it->wd->movements; i++)
1058 sum += it->wd->history[i].x;
1059 if (abs(it->wd->history[0].y - it->wd->history[i].y) > 10) return;
1062 sum /= it->wd->movements;
1063 if (abs(sum - it->wd->history[0].x) <= 10) return;
1064 evas_object_smart_callback_call(WIDGET(it), SIG_SWIPE, it);
1068 _swipe_cancel(void *data)
1070 Elm_Gen_Item *it = data;
1072 if (!it) return ECORE_CALLBACK_CANCEL;
1073 it->wd->swipe = EINA_FALSE;
1074 it->wd->movements = 0;
1075 return ECORE_CALLBACK_RENEW;
1079 _multi_cancel(void *data)
1081 Widget_Data *wd = data;
1083 if (!wd) return ECORE_CALLBACK_CANCEL;
1084 wd->multi_timeout = EINA_TRUE;
1085 return ECORE_CALLBACK_RENEW;
1089 _multi_touch_gesture_eval(void *data)
1091 Elm_Gen_Item *it = data;
1093 it->wd->multitouched = EINA_FALSE;
1094 if (it->wd->multi_timer)
1096 ecore_timer_del(it->wd->multi_timer);
1097 it->wd->multi_timer = NULL;
1099 if (it->wd->multi_timeout)
1101 it->wd->multi_timeout = EINA_FALSE;
1105 Evas_Coord minw = 0, minh = 0;
1106 Evas_Coord off_x, off_y, off_mx, off_my;
1108 elm_coords_finger_size_adjust(1, &minw, 1, &minh);
1109 off_x = abs(it->wd->cur_x - it->wd->prev_x);
1110 off_y = abs(it->wd->cur_y - it->wd->prev_y);
1111 off_mx = abs(it->wd->cur_mx - it->wd->prev_mx);
1112 off_my = abs(it->wd->cur_my - it->wd->prev_my);
1114 if (((off_x > minw) || (off_y > minh)) && ((off_mx > minw) || (off_my > minh)))
1116 if ((off_x + off_mx) > (off_y + off_my))
1118 if ((it->wd->cur_x > it->wd->prev_x) && (it->wd->cur_mx > it->wd->prev_mx))
1119 evas_object_smart_callback_call(WIDGET(it),
1120 SIG_MULTI_SWIPE_RIGHT, it);
1121 else if ((it->wd->cur_x < it->wd->prev_x) && (it->wd->cur_mx < it->wd->prev_mx))
1122 evas_object_smart_callback_call(WIDGET(it),
1123 SIG_MULTI_SWIPE_LEFT, it);
1124 else if (abs(it->wd->cur_x - it->wd->cur_mx) > abs(it->wd->prev_x - it->wd->prev_mx))
1125 evas_object_smart_callback_call(WIDGET(it),
1126 SIG_MULTI_PINCH_OUT, it);
1128 evas_object_smart_callback_call(WIDGET(it),
1129 SIG_MULTI_PINCH_IN, it);
1133 if ((it->wd->cur_y > it->wd->prev_y) && (it->wd->cur_my > it->wd->prev_my))
1134 evas_object_smart_callback_call(WIDGET(it),
1135 SIG_MULTI_SWIPE_DOWN, it);
1136 else if ((it->wd->cur_y < it->wd->prev_y) && (it->wd->cur_my < it->wd->prev_my))
1137 evas_object_smart_callback_call(WIDGET(it),
1138 SIG_MULTI_SWIPE_UP, it);
1139 else if (abs(it->wd->cur_y - it->wd->cur_my) > abs(it->wd->prev_y - it->wd->prev_my))
1140 evas_object_smart_callback_call(WIDGET(it),
1141 SIG_MULTI_PINCH_OUT, it);
1143 evas_object_smart_callback_call(WIDGET(it),
1144 SIG_MULTI_PINCH_IN, it);
1147 it->wd->multi_timeout = EINA_FALSE;
1151 _multi_down(void *data,
1152 Evas *evas __UNUSED__,
1153 Evas_Object *obj __UNUSED__,
1156 Elm_Gen_Item *it = data;
1157 Evas_Event_Multi_Down *ev = event_info;
1159 if ((it->wd->multi_device != 0) || (it->wd->multitouched) || (it->wd->multi_timeout)) return;
1160 it->wd->multi_device = ev->device;
1161 it->wd->multi_down = EINA_TRUE;
1162 it->wd->multitouched = EINA_TRUE;
1163 it->wd->prev_mx = ev->canvas.x;
1164 it->wd->prev_my = ev->canvas.y;
1165 if (!it->wd->wasselected)
1167 _item_unhighlight(it);
1170 it->wd->wasselected = EINA_FALSE;
1171 it->wd->longpressed = EINA_FALSE;
1174 ecore_timer_del(it->long_timer);
1175 it->long_timer = NULL;
1179 it->dragging = EINA_FALSE;
1180 evas_object_smart_callback_call(WIDGET(it), SIG_DRAG_STOP, it);
1182 if (it->item->swipe_timer)
1184 ecore_timer_del(it->item->swipe_timer);
1185 it->item->swipe_timer = NULL;
1187 if (it->wd->on_hold)
1189 it->wd->swipe = EINA_FALSE;
1190 it->wd->movements = 0;
1191 it->wd->on_hold = EINA_FALSE;
1196 _multi_up(void *data,
1197 Evas *evas __UNUSED__,
1198 Evas_Object *obj __UNUSED__,
1201 Elm_Gen_Item *it = data;
1202 Evas_Event_Multi_Up *ev = event_info;
1204 if (it->wd->multi_device != ev->device) return;
1205 it->wd->multi_device = 0;
1206 it->wd->multi_down = EINA_FALSE;
1207 if (it->wd->mouse_down) return;
1208 _multi_touch_gesture_eval(data);
1212 _multi_move(void *data,
1213 Evas *evas __UNUSED__,
1214 Evas_Object *obj __UNUSED__,
1217 Elm_Gen_Item *it = data;
1218 Evas_Event_Multi_Move *ev = event_info;
1220 if (it->wd->multi_device != ev->device) return;
1221 it->wd->cur_mx = ev->cur.canvas.x;
1222 it->wd->cur_my = ev->cur.canvas.y;
1226 _mouse_down(void *data,
1227 Evas *evas __UNUSED__,
1231 Elm_Gen_Item *it = data;
1232 Evas_Event_Mouse_Down *ev = event_info;
1235 if (ev->button != 1) return;
1236 if (ev->event_flags & EVAS_EVENT_FLAG_ON_HOLD)
1238 it->wd->on_hold = EINA_TRUE;
1241 it->down = EINA_TRUE;
1242 it->dragging = EINA_FALSE;
1243 evas_object_geometry_get(obj, &x, &y, NULL, NULL);
1244 it->dx = ev->canvas.x - x;
1245 it->dy = ev->canvas.y - y;
1246 it->wd->mouse_down = EINA_TRUE;
1247 if (!it->wd->multitouched)
1249 it->wd->prev_x = ev->canvas.x;
1250 it->wd->prev_y = ev->canvas.y;
1251 it->wd->multi_timeout = EINA_FALSE;
1252 if (it->wd->multi_timer) ecore_timer_del(it->wd->multi_timer);
1253 it->wd->multi_timer = ecore_timer_add(1, _multi_cancel, it->wd);
1255 it->wd->longpressed = EINA_FALSE;
1256 if (ev->event_flags & EVAS_EVENT_FLAG_ON_HOLD) it->wd->on_hold = EINA_TRUE;
1257 else it->wd->on_hold = EINA_FALSE;
1258 if (it->wd->on_hold) return;
1259 it->wd->wasselected = it->selected;
1260 _item_highlight(it);
1261 if (ev->flags & EVAS_BUTTON_DOUBLE_CLICK)
1262 if ((!elm_widget_item_disabled_get(it)) && (!it->display_only))
1264 evas_object_smart_callback_call(WIDGET(it), SIG_CLICKED_DOUBLE, it);
1265 evas_object_smart_callback_call(WIDGET(it), SIG_ACTIVATED, it);
1267 if (it->long_timer) ecore_timer_del(it->long_timer);
1268 if (it->item->swipe_timer) ecore_timer_del(it->item->swipe_timer);
1269 it->item->swipe_timer = ecore_timer_add(0.4, _swipe_cancel, it);
1271 it->long_timer = ecore_timer_add(it->wd->longpress_timeout, _long_press,
1274 it->long_timer = NULL;
1275 it->wd->swipe = EINA_FALSE;
1276 it->wd->movements = 0;
1280 _mouse_up(void *data,
1281 Evas *evas __UNUSED__,
1282 Evas_Object *obj __UNUSED__,
1285 Elm_Gen_Item *it = data;
1286 Evas_Event_Mouse_Up *ev = event_info;
1287 Eina_Bool dragged = EINA_FALSE;
1289 if (ev->button != 1) return;
1290 it->down = EINA_FALSE;
1291 it->wd->mouse_down = EINA_FALSE;
1292 if (it->wd->multitouched)
1294 if ((!it->wd->multi) && (!it->selected) && (it->highlighted)) _item_unhighlight(it);
1295 if (it->wd->multi_down) return;
1296 _multi_touch_gesture_eval(data);
1299 if (ev->event_flags & EVAS_EVENT_FLAG_ON_HOLD) it->wd->on_hold = EINA_TRUE;
1300 else it->wd->on_hold = EINA_FALSE;
1303 ecore_timer_del(it->long_timer);
1304 it->long_timer = NULL;
1308 it->dragging = EINA_FALSE;
1309 evas_object_smart_callback_call(WIDGET(it), SIG_DRAG_STOP, it);
1312 if (it->item->swipe_timer)
1314 ecore_timer_del(it->item->swipe_timer);
1315 it->item->swipe_timer = NULL;
1317 if (it->wd->multi_timer)
1319 ecore_timer_del(it->wd->multi_timer);
1320 it->wd->multi_timer = NULL;
1321 it->wd->multi_timeout = EINA_FALSE;
1323 if (it->wd->on_hold)
1325 if (it->wd->swipe) _swipe(data);
1326 it->wd->longpressed = EINA_FALSE;
1327 it->wd->on_hold = EINA_FALSE;
1330 if ((it->wd->reorder_mode) && (it->wd->reorder_it))
1332 Evas_Coord it_scrl_y = ev->canvas.y - it->wd->reorder_it->dy;
1334 if (it->wd->reorder_rel && (it->wd->reorder_it->parent == it->wd->reorder_rel->parent))
1336 if (it_scrl_y <= it->wd->reorder_rel->item->scrl_y)
1337 _item_move_before(it->wd->reorder_it, it->wd->reorder_rel);
1339 _item_move_after(it->wd->reorder_it, it->wd->reorder_rel);
1343 if (it->wd->calc_job) ecore_job_del(it->wd->calc_job);
1344 it->wd->calc_job = ecore_job_add(_calc_job, it->wd);
1346 edje_object_signal_emit(VIEW(it), "elm,state,reorder,disabled", "elm");
1347 it->wd->reorder_it = it->wd->reorder_rel = NULL;
1348 elm_smart_scroller_hold_set(it->wd->scr, EINA_FALSE);
1349 elm_smart_scroller_bounce_allow_set(it->wd->scr, it->wd->h_bounce, it->wd->v_bounce);
1351 if (it->wd->longpressed)
1353 it->wd->longpressed = EINA_FALSE;
1354 if (!it->wd->wasselected)
1356 _item_unhighlight(it);
1359 it->wd->wasselected = EINA_FALSE;
1364 if (it->want_unrealize)
1366 _elm_genlist_item_unrealize(it, EINA_FALSE);
1367 if (it->item->block->want_unrealize)
1368 _item_block_unrealize(it->item->block);
1371 if (elm_widget_item_disabled_get(it) || (dragged) || (it->display_only))
1373 if (ev->event_flags & EVAS_EVENT_FLAG_ON_HOLD) return;
1378 _item_highlight(it);
1383 _item_unhighlight(it);
1391 Widget_Data *wd = it->wd;
1394 while (wd->selected)
1396 _item_unhighlight(wd->selected->data);
1397 _item_unselect(wd->selected->data);
1403 const Eina_List *l, *l_next;
1406 EINA_LIST_FOREACH_SAFE(it->wd->selected, l, l_next, it2)
1409 _item_unhighlight(it2);
1410 _item_unselect(it2);
1412 //_item_highlight(it);
1415 _item_highlight(it);
1421 _signal_expand_toggle(void *data,
1422 Evas_Object *obj __UNUSED__,
1423 const char *emission __UNUSED__,
1424 const char *source __UNUSED__)
1426 Elm_Gen_Item *it = data;
1428 if (it->item->expanded)
1429 evas_object_smart_callback_call(WIDGET(it), SIG_CONTRACT_REQUEST, it);
1431 evas_object_smart_callback_call(WIDGET(it), SIG_EXPAND_REQUEST, it);
1435 _signal_expand(void *data,
1436 Evas_Object *obj __UNUSED__,
1437 const char *emission __UNUSED__,
1438 const char *source __UNUSED__)
1440 Elm_Gen_Item *it = data;
1442 if (!it->item->expanded)
1443 evas_object_smart_callback_call(WIDGET(it), SIG_EXPAND_REQUEST, it);
1447 _signal_contract(void *data,
1448 Evas_Object *obj __UNUSED__,
1449 const char *emission __UNUSED__,
1450 const char *source __UNUSED__)
1452 Elm_Gen_Item *it = data;
1454 if (it->item->expanded)
1455 evas_object_smart_callback_call(WIDGET(it), SIG_CONTRACT_REQUEST, it);
1459 _scr_hold_timer_cb(void *data)
1461 if (!data) return ECORE_CALLBACK_CANCEL;
1462 Widget_Data *wd = data;
1463 elm_smart_scroller_hold_set(wd->scr, EINA_FALSE);
1464 wd->scr_hold_timer = NULL;
1465 return ECORE_CALLBACK_CANCEL;
1469 _mode_finished_signal_cb(void *data,
1471 const char *emission __UNUSED__,
1472 const char *source __UNUSED__)
1476 Elm_Gen_Item *it = data;
1477 if ((it->generation < it->wd->generation) || (!it->realized) || (!it->item->mode_view)) return;
1479 Evas *te = evas_object_evas_get(obj);
1481 evas_event_freeze(te);
1482 it->item->nocache = EINA_FALSE;
1483 _mode_item_unrealize(it);
1484 if (it->item->group_item)
1485 evas_object_raise(it->item->VIEW(group_item));
1486 snprintf(buf, sizeof(buf), "elm,state,%s,passive,finished", it->wd->mode_type);
1487 edje_object_signal_callback_del_full(obj, buf, "elm", _mode_finished_signal_cb, it);
1488 evas_event_thaw(te);
1489 evas_event_thaw_eval(te);
1493 _item_cache_clean(Widget_Data *wd)
1495 evas_event_freeze(evas_object_evas_get(wd->obj));
1496 while ((wd->item_cache) && (wd->item_cache_count > wd->item_cache_max))
1500 itc = EINA_INLIST_CONTAINER_GET(wd->item_cache->last, Item_Cache);
1501 wd->item_cache = eina_inlist_remove(wd->item_cache,
1502 wd->item_cache->last);
1503 wd->item_cache_count--;
1504 if (itc->spacer) evas_object_del(itc->spacer);
1505 if (itc->base_view) evas_object_del(itc->base_view);
1506 if (itc->item_style) eina_stringshare_del(itc->item_style);
1509 evas_event_thaw(evas_object_evas_get(wd->obj));
1510 evas_event_thaw_eval(evas_object_evas_get(wd->obj));
1514 _item_cache_zero(Widget_Data *wd)
1516 int pmax = wd->item_cache_max;
1517 wd->item_cache_max = 0;
1518 _item_cache_clean(wd);
1519 wd->item_cache_max = pmax;
1523 _item_cache_add(Elm_Gen_Item *it)
1527 evas_event_freeze(evas_object_evas_get(it->wd->obj));
1528 if (it->wd->item_cache_max <= 0)
1530 evas_object_del(VIEW(it));
1532 evas_object_del(it->spacer);
1534 evas_event_thaw(evas_object_evas_get(it->wd->obj));
1535 evas_event_thaw_eval(evas_object_evas_get(it->wd->obj));
1539 it->wd->item_cache_count++;
1540 itc = calloc(1, sizeof(Item_Cache));
1543 evas_event_thaw(evas_object_evas_get(it->wd->obj));
1544 evas_event_thaw_eval(evas_object_evas_get(it->wd->obj));
1547 it->wd->item_cache = eina_inlist_prepend(it->wd->item_cache,
1548 EINA_INLIST_GET(itc));
1549 itc->spacer = it->spacer;
1551 itc->base_view = VIEW(it);
1553 edje_object_signal_emit(itc->base_view, "elm,state,unselected", "elm");
1554 evas_object_hide(itc->base_view);
1555 evas_object_move(itc->base_view, -9999, -9999);
1556 itc->item_style = eina_stringshare_add(it->itc->item_style);
1557 if (it->item->flags & ELM_GENLIST_ITEM_SUBITEMS) itc->tree = 1;
1558 itc->compress = (it->wd->compress);
1559 itc->selected = it->selected;
1560 itc->disabled = elm_widget_item_disabled_get(it);
1561 itc->expanded = it->item->expanded;
1564 ecore_timer_del(it->long_timer);
1565 it->long_timer = NULL;
1567 if (it->item->swipe_timer)
1569 ecore_timer_del(it->item->swipe_timer);
1570 it->item->swipe_timer = NULL;
1572 // FIXME: other callbacks?
1573 edje_object_signal_callback_del_full(itc->base_view,
1574 "elm,action,expand,toggle",
1575 "elm", _signal_expand_toggle, it);
1576 edje_object_signal_callback_del_full(itc->base_view, "elm,action,expand",
1578 _signal_expand, it);
1579 edje_object_signal_callback_del_full(itc->base_view, "elm,action,contract",
1580 "elm", _signal_contract, it);
1581 evas_object_event_callback_del_full(itc->base_view, EVAS_CALLBACK_MOUSE_DOWN,
1583 evas_object_event_callback_del_full(itc->base_view, EVAS_CALLBACK_MOUSE_UP,
1585 evas_object_event_callback_del_full(itc->base_view, EVAS_CALLBACK_MOUSE_MOVE,
1587 evas_object_event_callback_del_full(itc->base_view, EVAS_CALLBACK_MULTI_DOWN,
1589 evas_object_event_callback_del_full(itc->base_view, EVAS_CALLBACK_MULTI_UP,
1591 evas_object_event_callback_del_full(itc->base_view, EVAS_CALLBACK_MULTI_MOVE,
1593 _item_cache_clean(it->wd);
1594 evas_event_thaw(evas_object_evas_get(it->wd->obj));
1595 evas_event_thaw_eval(evas_object_evas_get(it->wd->obj));
1599 _item_cache_find(Elm_Gen_Item *it)
1604 if (it->item->flags & ELM_GENLIST_ITEM_SUBITEMS) tree = 1;
1605 EINA_INLIST_FOREACH(it->wd->item_cache, itc)
1607 if ((itc->selected) || (itc->disabled) || (itc->expanded))
1609 if ((itc->tree == tree) &&
1610 (itc->compress == it->wd->compress) &&
1611 (!strcmp(it->itc->item_style, itc->item_style)))
1613 it->wd->item_cache = eina_inlist_remove(it->wd->item_cache,
1614 EINA_INLIST_GET(itc));
1615 it->wd->item_cache_count--;
1623 _elm_genlist_item_index_update(Elm_Gen_Item *it)
1625 if (it->position_update || it->item->block->position_update)
1627 evas_object_smart_callback_call(WIDGET(it), SIG_INDEX_UPDATE, it);
1628 it->position_update = EINA_FALSE;
1633 _elm_genlist_item_odd_even_update(Elm_Gen_Item *it)
1635 if (!it->item->nostacking)
1637 if ((it->item->order_num_in & 0x1) ^ it->item->stacking_even)
1639 if (it->edit_obj) evas_object_lower(it->edit_obj);
1640 else evas_object_lower(VIEW(it));
1644 if (it->edit_obj) evas_object_raise(it->edit_obj);
1645 else evas_object_raise(VIEW(it));
1649 if (it->item->order_num_in & 0x1)
1651 edje_object_signal_emit(VIEW(it), "elm,state,odd", "elm");
1652 if (it->edit_obj) edje_object_signal_emit(it->edit_obj, "elm,state,odd", "elm");
1656 edje_object_signal_emit(VIEW(it), "elm,state,even", "elm");
1657 if (it->edit_obj) edje_object_signal_emit(it->edit_obj, "elm,state,even", "elm");
1662 _elm_genlist_item_state_update(Elm_Gen_Item *it, Item_Cache *itc)
1666 if (it->selected != itc->selected)
1669 edje_object_signal_emit(VIEW(it),
1670 "elm,state,selected", "elm");
1673 edje_object_signal_emit(it->edit_obj,
1674 "elm,state,selected", "elm");
1676 if (elm_widget_item_disabled_get(it) != itc->disabled)
1678 if (elm_widget_item_disabled_get(it))
1679 edje_object_signal_emit(VIEW(it),
1680 "elm,state,disabled", "elm");
1682 edje_object_signal_emit(it->edit_obj,
1683 "elm,state,disabled", "elm");
1685 if (it->item->expanded != itc->expanded)
1687 if (it->item->expanded)
1688 edje_object_signal_emit(VIEW(it),
1689 "elm,state,expanded", "elm");
1691 edje_object_signal_emit(it->edit_obj,
1692 "elm,state,expanded", "elm");
1699 edje_object_signal_emit(VIEW(it),
1700 "elm,state,selected", "elm");
1702 edje_object_signal_emit(it->edit_obj,
1703 "elm,state,selected", "elm");
1706 if (elm_widget_item_disabled_get(it))
1708 edje_object_signal_emit(VIEW(it),
1709 "elm,state,disabled", "elm");
1711 edje_object_signal_emit(it->edit_obj,
1712 "elm,state,disabled", "elm");
1714 if (it->item->expanded)
1716 edje_object_signal_emit(VIEW(it),
1717 "elm,state,expanded", "elm");
1719 edje_object_signal_emit(it->edit_obj,
1720 "elm,state,expanded", "elm");
1726 _item_cache_free(Item_Cache *itc)
1728 if (itc->spacer) evas_object_del(itc->spacer);
1729 if (itc->base_view) evas_object_del(itc->base_view);
1730 if (itc->item_style) eina_stringshare_del(itc->item_style);
1735 _item_text_realize(Elm_Gen_Item *it,
1736 Evas_Object *target,
1740 if (it->itc->func.text_get)
1745 *source = elm_widget_stringlist_get(edje_object_data_get(target, "texts"));
1746 EINA_LIST_FOREACH(*source, l, key)
1748 if (parts && fnmatch(parts, key, FNM_PERIOD))
1751 char *s = it->itc->func.text_get
1752 ((void *)it->base.data, WIDGET(it), key);
1756 edje_object_part_text_set(target, key, s);
1761 edje_object_part_text_set(target, key, "");
1768 _item_content_unrealize(Elm_Gen_Item *it,
1769 Evas_Object *target,
1773 Eina_List *res = it->content_objs;
1775 if (it->itc->func.content_get)
1779 Evas_Object *ic = NULL;
1781 EINA_LIST_FOREACH(*source, l, key)
1783 if (parts && fnmatch(parts, key, FNM_PERIOD))
1786 ic = edje_object_part_swallow_get(target, key);
1789 res = eina_list_remove(res, ic);
1790 edje_object_part_unswallow(target, ic);
1791 evas_object_del(ic);
1800 _item_content_realize(Elm_Gen_Item *it,
1801 Evas_Object *target,
1805 Eina_List *res = NULL;
1807 if (it->itc->func.content_get)
1811 Evas_Object *ic = NULL;
1813 *source = elm_widget_stringlist_get(edje_object_data_get(target, "contents"));
1815 if (parts && (eina_list_count(*source) != eina_list_count(it->content_objs)))
1816 res = it->content_objs;
1818 EINA_LIST_FOREACH(*source, l, key)
1820 if (parts && fnmatch(parts, key, FNM_PERIOD))
1823 if (it->itc->func.content_get)
1824 ic = it->itc->func.content_get
1825 ((void *)it->base.data, WIDGET(it), key);
1828 res = eina_list_append(res, ic);
1829 edje_object_part_swallow(target, key, ic);
1830 evas_object_show(ic);
1831 elm_widget_sub_object_add(WIDGET(it), ic);
1832 if (elm_widget_item_disabled_get(it))
1833 elm_widget_disabled_set(ic, EINA_TRUE);
1842 _item_state_realize(Elm_Gen_Item *it,
1843 Evas_Object *target,
1847 if (it->itc->func.state_get)
1853 *source = elm_widget_stringlist_get(edje_object_data_get(target, "states"));
1854 EINA_LIST_FOREACH(*source, l, key)
1856 if (parts && fnmatch(parts, key, FNM_PERIOD))
1859 Eina_Bool on = it->itc->func.state_get
1860 ((void *)it->base.data, WIDGET(it), key);
1864 snprintf(buf, sizeof(buf), "elm,state,%s,active", key);
1865 edje_object_signal_emit(target, buf, "elm");
1869 snprintf(buf, sizeof(buf), "elm,state,%s,passive", key);
1870 edje_object_signal_emit(target, buf, "elm");
1877 _item_realize(Elm_Gen_Item *it,
1881 const char *treesize;
1884 Item_Cache *itc = NULL;
1886 if (it->generation < it->wd->generation) return;
1887 //evas_event_freeze(evas_object_evas_get(it->wd->obj));
1890 if (it->item->order_num_in != in)
1892 it->item->order_num_in = in;
1893 _elm_genlist_item_odd_even_update(it);
1894 _elm_genlist_item_state_update(it, NULL);
1895 _elm_genlist_item_index_update(it);
1897 //evas_event_thaw(evas_object_evas_get(it->wd->obj));
1898 //evas_event_thaw_eval(evas_object_evas_get(it->wd->obj));
1901 it->item->order_num_in = in;
1903 if (it->item->nocache)
1904 it->item->nocache = EINA_FALSE;
1906 itc = _item_cache_find(it);
1909 VIEW(it) = itc->base_view;
1910 itc->base_view = NULL;
1911 it->spacer = itc->spacer;
1916 const char *stacking_even;
1917 const char *stacking;
1919 VIEW(it) = edje_object_add(evas_object_evas_get(WIDGET(it)));
1920 edje_object_scale_set(VIEW(it),
1921 elm_widget_scale_get(WIDGET(it)) *
1922 _elm_config->scale);
1923 evas_object_smart_member_add(VIEW(it), it->wd->pan_smart);
1924 elm_widget_sub_object_add(WIDGET(it), VIEW(it));
1926 if (it->item->flags & ELM_GENLIST_ITEM_SUBITEMS)
1927 strncpy(buf, "tree", sizeof(buf));
1928 else strncpy(buf, "item", sizeof(buf));
1929 if (it->wd->compress)
1930 strncat(buf, "_compress", sizeof(buf) - strlen(buf));
1932 strncat(buf, "/", sizeof(buf) - strlen(buf));
1933 strncat(buf, it->itc->item_style, sizeof(buf) - strlen(buf));
1935 _elm_theme_object_set(WIDGET(it), VIEW(it), "genlist", buf,
1936 elm_widget_style_get(WIDGET(it)));
1938 stacking_even = edje_object_data_get(VIEW(it), "stacking_even");
1939 if (!stacking_even) stacking_even = "above";
1940 it->item->stacking_even = !!strcmp("above", stacking_even);
1942 stacking = edje_object_data_get(VIEW(it), "stacking");
1943 if (!stacking) stacking = "yes";
1944 it->item->nostacking = !!strcmp("yes", stacking);
1946 edje_object_mirrored_set(VIEW(it),
1947 elm_widget_mirrored_get(WIDGET(it)));
1949 evas_object_rectangle_add(evas_object_evas_get(WIDGET(it)));
1950 evas_object_color_set(it->spacer, 0, 0, 0, 0);
1951 elm_widget_sub_object_add(WIDGET(it), it->spacer);
1954 _elm_genlist_item_odd_even_update(it);
1956 treesize = edje_object_data_get(VIEW(it), "treesize");
1957 if (treesize) tsize = atoi(treesize);
1958 evas_object_size_hint_min_set(it->spacer,
1959 (it->item->expanded_depth * tsize) * _elm_config->scale, 1);
1960 edje_object_part_swallow(VIEW(it), "elm.swallow.pad", it->spacer);
1963 edje_object_signal_callback_add(VIEW(it),
1964 "elm,action,expand,toggle",
1965 "elm", _signal_expand_toggle, it);
1966 edje_object_signal_callback_add(VIEW(it), "elm,action,expand",
1967 "elm", _signal_expand, it);
1968 edje_object_signal_callback_add(VIEW(it), "elm,action,contract",
1969 "elm", _signal_contract, it);
1970 evas_object_event_callback_add(VIEW(it), EVAS_CALLBACK_MOUSE_DOWN,
1972 evas_object_event_callback_add(VIEW(it), EVAS_CALLBACK_MOUSE_UP,
1974 evas_object_event_callback_add(VIEW(it), EVAS_CALLBACK_MOUSE_MOVE,
1976 evas_object_event_callback_add(VIEW(it), EVAS_CALLBACK_MULTI_DOWN,
1978 evas_object_event_callback_add(VIEW(it), EVAS_CALLBACK_MULTI_UP,
1980 evas_object_event_callback_add(VIEW(it), EVAS_CALLBACK_MULTI_MOVE,
1983 if ((it->wd->edit_mode) && (!it->edit_obj) &&
1984 (it->item->flags != ELM_GENLIST_ITEM_GROUP) && (it->itc->edit_item_style))
1985 _edit_mode_item_realize(it, EINA_FALSE);
1987 _elm_genlist_item_state_update(it, itc);
1988 _elm_genlist_item_index_update(it);
1991 if ((calc) && (it->wd->homogeneous) &&
1992 ((it->wd->item_width) ||
1993 ((it->wd->item_width) && (it->wd->group_item_width))))
1995 /* homogenous genlist shortcut */
1996 if (!it->item->mincalcd)
2000 it->item->w = it->item->minw = it->wd->group_item_width;
2001 it->item->h = it->item->minh = it->wd->group_item_height;
2005 it->item->w = it->item->minw = it->wd->item_width;
2006 it->item->h = it->item->minh = it->wd->item_height;
2008 it->item->mincalcd = EINA_TRUE;
2013 /* FIXME: If you see that assert, please notify us and we
2014 will clean our mess */
2015 assert(eina_list_count(it->content_objs) == 0);
2017 _item_text_realize(it, VIEW(it), &it->texts, NULL);
2018 it->content_objs = _item_content_realize(it, VIEW(it), &it->contents, NULL);
2019 _item_state_realize(it, VIEW(it), &it->states, NULL);
2021 if (!it->item->mincalcd)
2023 Evas_Coord mw = -1, mh = -1;
2025 if (!it->display_only)
2026 elm_coords_finger_size_adjust(1, &mw, 1, &mh);
2027 if (it->wd->height_for_width) mw = it->wd->prev_viewport_w;
2028 edje_object_size_min_restricted_calc(VIEW(it), &mw, &mh, mw,
2030 if (!it->display_only)
2031 elm_coords_finger_size_adjust(1, &mw, 1, &mh);
2032 it->item->w = it->item->minw = mw;
2033 it->item->h = it->item->minh = mh;
2034 it->item->mincalcd = EINA_TRUE;
2036 if ((!it->wd->group_item_width) && (it->group))
2038 it->wd->group_item_width = mw;
2039 it->wd->group_item_height = mh;
2041 else if ((!it->wd->item_width) && (it->item->flags == ELM_GENLIST_ITEM_NONE))
2043 it->wd->item_width = mw;
2044 it->wd->item_height = mh;
2047 if (!calc) evas_object_show(VIEW(it));
2050 if (it->tooltip.content_cb)
2052 elm_widget_item_tooltip_content_cb_set(it,
2053 it->tooltip.content_cb,
2054 it->tooltip.data, NULL);
2055 elm_widget_item_tooltip_style_set(it, it->tooltip.style);
2056 elm_widget_item_tooltip_window_mode_set(it, it->tooltip.free_size);
2059 if (it->mouse_cursor)
2060 elm_widget_item_cursor_set(it, it->mouse_cursor);
2062 it->realized = EINA_TRUE;
2063 it->want_unrealize = EINA_FALSE;
2065 if (itc) _item_cache_free(itc);
2066 //evas_event_thaw(evas_object_evas_get(it->wd->obj));
2067 //evas_event_thaw_eval(evas_object_evas_get(it->wd->obj));
2069 evas_object_smart_callback_call(WIDGET(it), SIG_REALIZED, it);
2071 if ((!calc) && (it->wd->edit_mode) && (it->item->flags != ELM_GENLIST_ITEM_GROUP))
2073 if (it->itc->edit_item_style)
2075 if (!it->edit_obj) _edit_mode_item_realize(it, EINA_FALSE);
2076 edje_object_message_signal_process(it->edit_obj);
2079 edje_object_message_signal_process(VIEW(it));
2083 _item_unrealize_cb(Elm_Gen_Item *it)
2085 if (it->item->nocache)
2087 evas_object_del(VIEW(it));
2089 evas_object_del(it->spacer);
2094 edje_object_mirrored_set(VIEW(it),
2095 elm_widget_mirrored_get(WIDGET(it)));
2096 edje_object_scale_set(VIEW(it),
2097 elm_widget_scale_get(WIDGET(it))
2098 * _elm_config->scale);
2099 _item_cache_add(it);
2102 _mode_item_unrealize(it);
2104 it->realized = EINA_FALSE;
2105 it->want_unrealize = EINA_FALSE;
2106 if (it->wd->edit_mode) _edit_mode_item_unrealize(it);
2110 _item_block_recalc(Item_Block *itb,
2116 Evas_Coord minw = 0, minh = 0;
2117 Eina_Bool showme = EINA_FALSE, changed = EINA_FALSE;
2120 //evas_event_freeze(evas_object_evas_get(itb->wd->obj));
2122 EINA_LIST_FOREACH(itb->items, l, it)
2124 if (it->generation < it->wd->generation) continue;
2125 showme |= it->item->showme;
2130 if (!it->item->mincalcd) changed = EINA_TRUE;
2133 _item_realize(it, in, EINA_TRUE);
2134 _elm_genlist_item_unrealize(it, EINA_TRUE);
2139 _item_realize(it, in, EINA_TRUE);
2140 _elm_genlist_item_unrealize(it, EINA_TRUE);
2144 _item_realize(it, in, EINA_FALSE);
2145 minh += it->item->minh;
2146 if (minw < it->item->minw) minw = it->item->minw;
2154 itb->changed = EINA_FALSE;
2155 itb->position_update = EINA_FALSE;
2156 //evas_event_thaw(evas_object_evas_get(itb->wd->obj));
2157 //evas_event_thaw_eval(evas_object_evas_get(itb->wd->obj));
2162 _item_block_realize(Item_Block *itb)
2164 if (itb->realized) return;
2165 itb->realized = EINA_TRUE;
2166 itb->want_unrealize = EINA_FALSE;
2170 _item_block_unrealize(Item_Block *itb)
2174 Eina_Bool dragging = EINA_FALSE;
2176 if (!itb->realized) return;
2177 evas_event_freeze(evas_object_evas_get(itb->wd->obj));
2178 EINA_LIST_FOREACH(itb->items, l, it)
2180 if (itb->must_recalc || !it->group)
2184 dragging = EINA_TRUE;
2185 it->want_unrealize = EINA_TRUE;
2188 _elm_genlist_item_unrealize(it, EINA_FALSE);
2193 itb->realized = EINA_FALSE;
2194 itb->want_unrealize = EINA_TRUE;
2197 itb->want_unrealize = EINA_FALSE;
2198 evas_event_thaw(evas_object_evas_get(itb->wd->obj));
2199 evas_event_thaw_eval(evas_object_evas_get(itb->wd->obj));
2203 _get_space_for_reorder_item(Elm_Gen_Item *it)
2205 Evas_Coord rox, roy, row, roh, oy, oh;
2206 Eina_Bool top = EINA_FALSE;
2207 Elm_Gen_Item *reorder_it = it->wd->reorder_it;
2208 if (!reorder_it) return 0;
2210 evas_object_geometry_get(it->wd->pan_smart, NULL, &oy, NULL, &oh);
2211 evas_object_geometry_get(it->wd->VIEW(reorder_it), &rox, &roy, &row, &roh);
2213 if ((it->wd->reorder_start_y < it->item->block->y) &&
2214 (roy - oy + (roh / 2) >= it->item->block->y - it->wd->pan_y))
2216 it->item->block->reorder_offset = it->wd->reorder_it->item->h * -1;
2217 if (it->item->block->count == 1)
2218 it->wd->reorder_rel = it;
2220 else if ((it->wd->reorder_start_y >= it->item->block->y) &&
2221 (roy - oy + (roh / 2) <= it->item->block->y - it->wd->pan_y))
2223 it->item->block->reorder_offset = it->wd->reorder_it->item->h;
2226 it->item->block->reorder_offset = 0;
2228 it->item->scrl_y += it->item->block->reorder_offset;
2230 top = (ELM_RECTS_INTERSECT(it->item->scrl_x, it->item->scrl_y, it->item->w, it->item->h,
2231 rox, roy + (roh / 2), row, 1));
2234 it->wd->reorder_rel = it;
2235 it->item->scrl_y += it->wd->reorder_it->item->h;
2236 return it->wd->reorder_it->item->h;
2243 _reorder_move_animator_cb(void *data)
2245 Elm_Gen_Item *it = data;
2246 Eina_Bool down = EINA_FALSE;
2248 int y, dy = it->item->h / 10 * _elm_config->scale, diff;
2250 t = ((0.0 > (t = ecore_loop_time_get()-it->wd->start_time)) ? 0.0 : t);
2252 if (t <= REORDER_EFFECT_TIME) y = (1 * sin((t / REORDER_EFFECT_TIME) * (M_PI / 2)) * dy);
2255 diff = abs(it->item->old_scrl_y - it->item->scrl_y);
2256 if (diff > it->item->h) y = diff / 2;
2258 if (it->item->old_scrl_y < it->item->scrl_y)
2260 it->item->old_scrl_y += y;
2263 else if (it->item->old_scrl_y > it->item->scrl_y)
2265 it->item->old_scrl_y -= y;
2270 _item_position(it, it->edit_obj, it->item->scrl_x, it->item->old_scrl_y);
2272 _item_position(it, VIEW(it), it->item->scrl_x, it->item->old_scrl_y);
2273 _group_items_recalc(it->wd);
2275 if ((it->wd->reorder_pan_move) ||
2276 (down && it->item->old_scrl_y >= it->item->scrl_y) ||
2277 (!down && it->item->old_scrl_y <= it->item->scrl_y))
2279 it->item->old_scrl_y = it->item->scrl_y;
2280 it->item->move_effect_enabled = EINA_FALSE;
2281 it->wd->reorder_move_animator = NULL;
2282 return ECORE_CALLBACK_CANCEL;
2284 return ECORE_CALLBACK_RENEW;
2288 _item_position(Elm_Gen_Item *it,
2296 evas_event_freeze(evas_object_evas_get(it->wd->obj));
2297 evas_object_resize(view, it->item->w, it->item->h);
2298 evas_object_move(view, it_x, it_y);
2299 evas_object_show(view);
2300 evas_event_thaw(evas_object_evas_get(it->wd->obj));
2301 evas_event_thaw_eval(evas_object_evas_get(it->wd->obj));
2305 _item_block_position(Item_Block *itb,
2311 Evas_Coord y = 0, ox, oy, ow, oh, cvx, cvy, cvw, cvh;
2312 Eina_Bool vis = EINA_FALSE;
2314 evas_event_freeze(evas_object_evas_get(itb->wd->obj));
2315 evas_object_geometry_get(itb->wd->pan_smart, &ox, &oy, &ow, &oh);
2316 evas_output_viewport_get(evas_object_evas_get(itb->wd->obj), &cvx, &cvy,
2318 EINA_LIST_FOREACH(itb->items, l, it)
2320 if (it->generation < it->wd->generation) continue;
2321 else if (it->wd->reorder_it == it) continue;
2324 it->item->w = itb->w;
2325 it->item->scrl_x = itb->x + it->x - it->wd->pan_x + ox;
2326 it->item->scrl_y = itb->y + it->y - it->wd->pan_y + oy;
2328 vis = (ELM_RECTS_INTERSECT(it->item->scrl_x, it->item->scrl_y, it->item->w, it->item->h,
2329 cvx, cvy, cvw, cvh));
2332 if ((itb->realized) && (!it->realized))
2334 if (vis) _item_realize(it, in, EINA_FALSE);
2340 if (it->wd->reorder_mode)
2341 y += _get_space_for_reorder_item(it);
2342 git = it->item->group_item;
2345 if (git->item->scrl_y < oy)
2346 git->item->scrl_y = oy;
2347 if ((git->item->scrl_y + git->item->h) > (it->item->scrl_y + it->item->h))
2348 git->item->scrl_y = (it->item->scrl_y + it->item->h) - git->item->h;
2349 git->item->want_realize = EINA_TRUE;
2351 if ((it->wd->reorder_it) && (it->item->old_scrl_y != it->item->scrl_y))
2353 if (!it->item->move_effect_enabled)
2355 it->item->move_effect_enabled = EINA_TRUE;
2356 it->wd->reorder_move_animator =
2358 _reorder_move_animator_cb, it);
2361 if (!it->item->move_effect_enabled)
2363 if ((it->wd->edit_mode) && (it->itc->edit_item_style))
2364 _edit_mode_item_position(it, it->item->scrl_x,
2368 if (it->item->mode_view)
2369 _item_position(it, it->item->mode_view,
2373 _item_position(it, VIEW(it), it->item->scrl_x,
2376 it->item->old_scrl_y = it->item->scrl_y;
2381 if (!it->dragging) _elm_genlist_item_unrealize(it, EINA_FALSE);
2388 if (vis) it->item->want_realize = EINA_TRUE;
2392 evas_event_thaw(evas_object_evas_get(itb->wd->obj));
2393 evas_event_thaw_eval(evas_object_evas_get(itb->wd->obj));
2397 _group_items_recalc(void *data)
2399 Widget_Data *wd = data;
2403 evas_event_freeze(evas_object_evas_get(wd->obj));
2404 EINA_LIST_FOREACH(wd->group_items, l, git)
2406 if (git->item->want_realize)
2409 _item_realize(git, 0, EINA_FALSE);
2410 evas_object_resize(VIEW(git), wd->minw, git->item->h);
2411 evas_object_move(VIEW(git), git->item->scrl_x, git->item->scrl_y);
2412 evas_object_show(VIEW(git));
2413 evas_object_raise(VIEW(git));
2415 else if (!git->item->want_realize && git->realized)
2418 _elm_genlist_item_unrealize(git, EINA_FALSE);
2421 evas_event_thaw(evas_object_evas_get(wd->obj));
2422 evas_event_thaw_eval(evas_object_evas_get(wd->obj));
2426 _must_recalc_idler(void *data)
2428 Widget_Data *wd = data;
2429 if (wd->calc_job) ecore_job_del(wd->calc_job);
2430 wd->calc_job = ecore_job_add(_calc_job, wd);
2431 wd->must_recalc_idler = NULL;
2432 return ECORE_CALLBACK_CANCEL;
2436 _scroll_item(Widget_Data *wd)
2438 Elm_Gen_Item *it = NULL;
2439 Evas_Coord gith = 0;
2440 Evas_Coord ow, oh, dx = 0, dy = 0, dw = 0, dh = 0;
2442 evas_object_geometry_get(wd->pan_smart, NULL, NULL, &ow, &oh);
2444 dx = it->x + it->item->block->x;
2445 dy = it->y + it->item->block->y;
2446 dw = it->item->block->w;
2448 switch (wd->scrollto_type)
2450 case ELM_GENLIST_ITEM_SCROLLTO_TOP:
2451 if (it->item->group_item) gith = it->item->group_item->item->h;
2454 case ELM_GENLIST_ITEM_SCROLLTO_MIDDLE:
2455 dy += (it->item->h / 2 - oh / 2);
2457 case ELM_GENLIST_ITEM_SCROLLTO_IN:
2459 if ((wd->expanded_item) &&
2460 ((wd->show_item->y + wd->show_item->item->block->y + wd->show_item->item->h)
2461 - (wd->expanded_item->y + wd->expanded_item->item->block->y) > oh))
2463 it = wd->expanded_item;
2464 if (it->item->group_item) gith = it->item->group_item->item->h;
2465 dx = it->x + it->item->block->x;
2466 dy = it->y + it->item->block->y - gith;
2467 dw = it->item->block->w;
2471 if ((it->item->group_item) && (wd->pan_y > (it->y + it->item->block->y)))
2472 gith = it->item->group_item->item->h;
2479 elm_smart_scroller_region_bring_in(wd->scr, dx, dy, dw, dh);
2481 elm_smart_scroller_child_region_show(wd->scr, dx, dy, dw, dh);
2483 it->item->showme = EINA_FALSE;
2484 wd->show_item = NULL;
2485 wd->auto_scroll_enabled = EINA_FALSE;
2486 wd->check_scroll = EINA_FALSE;
2490 _calc_job(void *data)
2492 Widget_Data *wd = data;
2493 Item_Block *itb, *chb = NULL;
2494 Evas_Coord minw = -1, minh = 0, y = 0, ow, dy = 0, vw;
2495 Evas_Coord pan_w = 0, pan_h = 0;
2497 Eina_Bool minw_change = EINA_FALSE;
2498 Eina_Bool did_must_recalc = EINA_FALSE;
2501 evas_object_geometry_get(wd->pan_smart, NULL, NULL, &ow, &wd->h);
2502 elm_smart_scroller_child_viewport_size_get(wd->scr, &vw, NULL);
2507 evas_event_freeze(evas_object_evas_get(wd->obj));
2508 EINA_INLIST_FOREACH(wd->blocks, itb)
2510 Eina_Bool showme = EINA_FALSE;
2513 showme = itb->showme;
2514 itb->showme = EINA_FALSE;
2517 if (itb->realized) _item_block_unrealize(itb);
2519 if ((itb->changed) || ((itb->must_recalc) && (!did_must_recalc)))
2521 if (itb->must_recalc)
2525 EINA_LIST_FOREACH(itb->items, l, it)
2526 if (it->item->mincalcd) it->item->mincalcd = EINA_FALSE;
2527 itb->changed = EINA_TRUE;
2528 if (itb->must_recalc) did_must_recalc = EINA_TRUE;
2529 if (itb->realized) _item_block_unrealize(itb);
2530 itb->must_recalc = EINA_FALSE;
2532 showme = _item_block_recalc(itb, in, EINA_FALSE);
2538 if (minw == -1) minw = itb->minw;
2539 else if ((!itb->must_recalc) && (minw < itb->minw))
2542 minw_change = EINA_TRUE;
2547 minw_change = EINA_TRUE;
2553 if ((showme) && (wd->show_item) && (!wd->show_item->item->queued))
2554 wd->check_scroll = EINA_TRUE;
2558 EINA_INLIST_FOREACH(wd->blocks, itb)
2564 if ((chb) && (EINA_INLIST_GET(chb)->next))
2566 EINA_INLIST_FOREACH(EINA_INLIST_GET(chb)->next, itb)
2568 if (itb->realized) _item_block_unrealize(itb);
2571 wd->realminw = minw;
2572 if (minw < wd->w) minw = wd->w;
2573 if ((minw != wd->minw) || (minh != wd->minh))
2577 evas_object_smart_callback_call(wd->pan_smart, "changed", NULL);
2578 _sizing_eval(wd->obj);
2579 if ((wd->anchor_item) && (wd->anchor_item->item->block) && (!wd->auto_scroll_enabled))
2584 it = wd->anchor_item;
2585 it_y = wd->anchor_y;
2586 elm_smart_scroller_child_pos_set(wd->scr, wd->pan_x,
2587 it->item->block->y + it->y + it_y);
2588 wd->anchor_item = it;
2589 wd->anchor_y = it_y;
2592 if (did_must_recalc)
2594 if (!wd->must_recalc_idler)
2595 wd->must_recalc_idler = ecore_idler_add(_must_recalc_idler, wd);
2597 if (wd->check_scroll)
2599 _pan_child_size_get(wd->pan_smart, &pan_w, &pan_h);
2600 if (EINA_INLIST_GET(wd->show_item) == wd->items->last)
2601 wd->scrollto_type = ELM_GENLIST_ITEM_SCROLLTO_IN;
2602 switch (wd->scrollto_type)
2604 case ELM_GENLIST_ITEM_SCROLLTO_TOP:
2607 case ELM_GENLIST_ITEM_SCROLLTO_MIDDLE:
2610 case ELM_GENLIST_ITEM_SCROLLTO_IN:
2615 if ((pan_w > (wd->show_item->x + wd->show_item->item->block->x)) &&
2616 (pan_h > (wd->show_item->y + wd->show_item->item->block->y + dy)))
2621 wd->calc_job = NULL;
2622 evas_object_smart_changed(wd->pan_smart);
2623 evas_event_thaw(evas_object_evas_get(wd->obj));
2624 evas_event_thaw_eval(evas_object_evas_get(wd->obj));
2628 _update_job(void *data)
2630 Widget_Data *wd = data;
2634 Eina_Bool position = EINA_FALSE, recalc = EINA_FALSE;
2636 wd->update_job = NULL;
2639 evas_event_freeze(evas_object_evas_get(wd->obj));
2640 EINA_INLIST_FOREACH(wd->blocks, itb)
2642 Evas_Coord itminw, itminh;
2649 _item_block_position(itb, num);
2653 recalc = EINA_FALSE;
2654 EINA_LIST_FOREACH(itb->items, l2, it)
2656 if (it->item->updateme)
2658 itminw = it->item->minw;
2659 itminh = it->item->minh;
2661 it->item->updateme = EINA_FALSE;
2664 _elm_genlist_item_unrealize(it, EINA_FALSE);
2665 _item_realize(it, num, EINA_FALSE);
2666 position = EINA_TRUE;
2670 _item_realize(it, num, EINA_TRUE);
2671 _elm_genlist_item_unrealize(it, EINA_TRUE);
2673 if ((it->item->minw != itminw) || (it->item->minh != itminh))
2678 itb->updateme = EINA_FALSE;
2681 position = EINA_TRUE;
2682 itb->changed = EINA_TRUE;
2683 _item_block_recalc(itb, num0, EINA_FALSE);
2684 _item_block_position(itb, num0);
2689 if (wd->calc_job) ecore_job_del(wd->calc_job);
2690 wd->calc_job = ecore_job_add(_calc_job, wd);
2692 evas_event_thaw(evas_object_evas_get(wd->obj));
2693 evas_event_thaw_eval(evas_object_evas_get(wd->obj));
2697 _pan_set(Evas_Object *obj,
2701 Pan *sd = evas_object_smart_data_get(obj);
2705 // Evas_Coord ow, oh;
2706 // evas_object_geometry_get(obj, NULL, NULL, &ow, &oh);
2707 // ow = sd->wd->minw - ow;
2708 // if (ow < 0) ow = 0;
2709 // oh = sd->wd->minh - oh;
2710 // if (oh < 0) oh = 0;
2711 // if (x < 0) x = 0;
2712 // if (y < 0) y = 0;
2713 // if (x > ow) x = ow;
2714 // if (y > oh) y = oh;
2715 if ((x == sd->wd->pan_x) && (y == sd->wd->pan_y)) return;
2719 EINA_INLIST_FOREACH(sd->wd->blocks, itb)
2721 if ((itb->y + itb->h) > y)
2726 EINA_LIST_FOREACH(itb->items, l2, it)
2728 if ((itb->y + it->y) >= y)
2730 sd->wd->anchor_item = it;
2731 sd->wd->anchor_y = -(itb->y + it->y - y);
2738 if (!sd->wd->reorder_move_animator) evas_object_smart_changed(obj);
2742 _pan_get(Evas_Object *obj,
2746 Pan *sd = evas_object_smart_data_get(obj);
2749 if (x) *x = sd->wd->pan_x;
2750 if (y) *y = sd->wd->pan_y;
2754 _pan_max_get(Evas_Object *obj,
2758 Pan *sd = evas_object_smart_data_get(obj);
2762 evas_object_geometry_get(obj, NULL, NULL, &ow, &oh);
2763 ow = sd->wd->minw - ow;
2765 oh = sd->wd->minh - oh;
2772 _pan_min_get(Evas_Object *obj __UNUSED__,
2781 _pan_child_size_get(Evas_Object *obj,
2785 Pan *sd = evas_object_smart_data_get(obj);
2788 if (w) *w = sd->wd->minw;
2789 if (h) *h = sd->wd->minh;
2793 _pan_add(Evas_Object *obj)
2796 Evas_Object_Smart_Clipped_Data *cd;
2799 cd = evas_object_smart_data_get(obj);
2802 sd->__clipped_data = *cd;
2804 evas_object_smart_data_set(obj, sd);
2808 _pan_del(Evas_Object *obj)
2810 Pan *sd = evas_object_smart_data_get(obj);
2815 ecore_job_del(sd->resize_job);
2816 sd->resize_job = NULL;
2822 _pan_resize_job(void *data)
2826 _sizing_eval(sd->wd->obj);
2827 sd->resize_job = NULL;
2831 _pan_resize(Evas_Object *obj,
2835 Pan *sd = evas_object_smart_data_get(obj);
2839 evas_object_geometry_get(obj, NULL, NULL, &ow, &oh);
2840 if ((ow == w) && (oh == h)) return;
2841 if ((sd->wd->height_for_width) && (ow != w))
2844 if (sd->resize_job) ecore_job_del(sd->resize_job);
2845 sd->resize_job = ecore_job_add(_pan_resize_job, sd);
2847 sd->wd->pan_changed = EINA_TRUE;
2848 evas_object_smart_changed(obj);
2849 if (sd->wd->calc_job) ecore_job_del(sd->wd->calc_job);
2850 sd->wd->calc_job = NULL;
2852 if (sd->wd->calc_job) ecore_job_del(sd->wd->calc_job);
2853 sd->wd->calc_job = ecore_job_add(_calc_job, sd->wd);
2858 _pan_calculate(Evas_Object *obj)
2860 Pan *sd = evas_object_smart_data_get(obj);
2862 Evas_Coord ox, oy, ow, oh, cvx, cvy, cvw, cvh;
2868 evas_event_freeze(evas_object_evas_get(obj));
2870 if (sd->wd->pan_changed)
2873 sd->wd->pan_changed = EINA_FALSE;
2876 evas_object_geometry_get(obj, &ox, &oy, &ow, &oh);
2877 evas_output_viewport_get(evas_object_evas_get(obj), &cvx, &cvy, &cvw, &cvh);
2878 EINA_LIST_FOREACH(sd->wd->group_items, l, git)
2880 git->item->want_realize = EINA_FALSE;
2882 EINA_INLIST_FOREACH(sd->wd->blocks, itb)
2884 itb->w = sd->wd->minw;
2885 if (ELM_RECTS_INTERSECT(itb->x - sd->wd->pan_x + ox,
2886 itb->y - sd->wd->pan_y + oy,
2888 cvx, cvy, cvw, cvh))
2890 if ((!itb->realized) || (itb->changed))
2891 _item_block_realize(itb);
2892 _item_block_position(itb, in);
2896 if (itb->realized) _item_block_unrealize(itb);
2900 if ((!sd->wd->reorder_it) || (sd->wd->reorder_pan_move))
2901 _group_items_recalc(sd->wd);
2902 if ((sd->wd->reorder_mode) && (sd->wd->reorder_it))
2904 if (sd->wd->pan_y != sd->wd->reorder_old_pan_y)
2905 sd->wd->reorder_pan_move = EINA_TRUE;
2906 else sd->wd->reorder_pan_move = EINA_FALSE;
2907 evas_object_raise(sd->wd->VIEW(reorder_it));
2908 sd->wd->reorder_old_pan_y = sd->wd->pan_y;
2909 sd->wd->start_time = ecore_loop_time_get();
2911 _item_auto_scroll(sd->wd);
2912 evas_event_thaw(evas_object_evas_get(obj));
2913 evas_event_thaw_eval(evas_object_evas_get(obj));
2917 _pan_move(Evas_Object *obj,
2918 Evas_Coord x __UNUSED__,
2919 Evas_Coord y __UNUSED__)
2921 Pan *sd = evas_object_smart_data_get(obj);
2925 sd->wd->pan_changed = EINA_TRUE;
2926 evas_object_smart_changed(obj);
2927 if (sd->wd->calc_job) ecore_job_del(sd->wd->calc_job);
2928 sd->wd->calc_job = NULL;
2932 _hold_on(void *data __UNUSED__,
2934 void *event_info __UNUSED__)
2936 Widget_Data *wd = elm_widget_data_get(obj);
2938 elm_smart_scroller_hold_set(wd->scr, 1);
2942 _hold_off(void *data __UNUSED__,
2944 void *event_info __UNUSED__)
2946 Widget_Data *wd = elm_widget_data_get(obj);
2948 elm_smart_scroller_hold_set(wd->scr, 0);
2952 _freeze_on(void *data __UNUSED__,
2954 void *event_info __UNUSED__)
2956 Widget_Data *wd = elm_widget_data_get(obj);
2958 elm_smart_scroller_freeze_set(wd->scr, 1);
2962 _freeze_off(void *data __UNUSED__,
2964 void *event_info __UNUSED__)
2966 Widget_Data *wd = elm_widget_data_get(obj);
2968 elm_smart_scroller_freeze_set(wd->scr, 0);
2972 _scr_anim_start(void *data,
2973 Evas_Object *obj __UNUSED__,
2974 void *event_info __UNUSED__)
2976 evas_object_smart_callback_call(data, SIG_SCROLL_ANIM_START, NULL);
2980 _scr_anim_stop(void *data,
2981 Evas_Object *obj __UNUSED__,
2982 void *event_info __UNUSED__)
2984 evas_object_smart_callback_call(data, SIG_SCROLL_ANIM_STOP, NULL);
2988 _scr_drag_start(void *data,
2989 Evas_Object *obj __UNUSED__,
2990 void *event_info __UNUSED__)
2992 evas_object_smart_callback_call(data, SIG_SCROLL_DRAG_START, NULL);
2996 _scr_drag_stop(void *data,
2997 Evas_Object *obj __UNUSED__,
2998 void *event_info __UNUSED__)
3000 evas_object_smart_callback_call(data, SIG_SCROLL_DRAG_STOP, NULL);
3004 _edge_left(void *data,
3005 Evas_Object *scr __UNUSED__,
3006 void *event_info __UNUSED__)
3008 Evas_Object *obj = data;
3009 evas_object_smart_callback_call(obj, SIG_EDGE_LEFT, NULL);
3013 _edge_right(void *data,
3014 Evas_Object *scr __UNUSED__,
3015 void *event_info __UNUSED__)
3017 Evas_Object *obj = data;
3018 evas_object_smart_callback_call(obj, SIG_EDGE_RIGHT, NULL);
3022 _edge_top(void *data,
3023 Evas_Object *scr __UNUSED__,
3024 void *event_info __UNUSED__)
3026 Evas_Object *obj = data;
3027 evas_object_smart_callback_call(obj, SIG_EDGE_TOP, NULL);
3031 _edge_bottom(void *data,
3032 Evas_Object *scr __UNUSED__,
3033 void *event_info __UNUSED__)
3035 Evas_Object *obj = data;
3036 evas_object_smart_callback_call(obj, SIG_EDGE_BOTTOM, NULL);
3040 _mode_item_realize(Elm_Gen_Item *it)
3044 if ((it->item->mode_view) || (it->generation < it->wd->generation)) return;
3046 evas_event_freeze(evas_object_evas_get(it->wd->obj));
3047 it->item->mode_view = edje_object_add(evas_object_evas_get(WIDGET(it)));
3048 edje_object_scale_set(it->item->mode_view,
3049 elm_widget_scale_get(WIDGET(it)) *
3050 _elm_config->scale);
3051 evas_object_smart_member_add(it->item->mode_view, it->wd->pan_smart);
3052 elm_widget_sub_object_add(WIDGET(it), it->item->mode_view);
3054 strncpy(buf, "item", sizeof(buf));
3055 if (it->wd->compress)
3056 strncat(buf, "_compress", sizeof(buf) - strlen(buf));
3058 if (it->item->order_num_in & 0x1) strncat(buf, "_odd", sizeof(buf) - strlen(buf));
3059 strncat(buf, "/", sizeof(buf) - strlen(buf));
3060 strncat(buf, it->itc->mode_item_style, sizeof(buf) - strlen(buf));
3062 _elm_theme_object_set(WIDGET(it), it->item->mode_view, "genlist", buf,
3063 elm_widget_style_get(WIDGET(it)));
3064 edje_object_mirrored_set(it->item->mode_view,
3065 elm_widget_mirrored_get(WIDGET(it)));
3067 /* signal callback add */
3068 evas_object_event_callback_add(it->item->mode_view, EVAS_CALLBACK_MOUSE_DOWN,
3070 evas_object_event_callback_add(it->item->mode_view, EVAS_CALLBACK_MOUSE_UP,
3072 evas_object_event_callback_add(it->item->mode_view, EVAS_CALLBACK_MOUSE_MOVE,
3075 /* text_get, content_get, state_get */
3076 /* FIXME: If you see that assert, please notify us and we
3077 will clean our mess */
3078 assert(eina_list_count(it->item->mode_content_objs) == 0);
3080 _item_text_realize(it, it->item->mode_view, &it->item->mode_texts, NULL);
3081 it->item->mode_content_objs =
3082 _item_content_realize(it, it->item->mode_view,
3083 &it->item->mode_contents, NULL);
3084 _item_state_realize(it, it->item->mode_view, &it->item->mode_states, NULL);
3086 edje_object_part_swallow(it->item->mode_view,
3087 edje_object_data_get(it->item->mode_view, "mode_part"),
3090 it->want_unrealize = EINA_FALSE;
3091 evas_event_thaw(evas_object_evas_get(it->wd->obj));
3092 evas_event_thaw_eval(evas_object_evas_get(it->wd->obj));
3096 _mode_item_unrealize(Elm_Gen_Item *it)
3098 Widget_Data *wd = it->wd;
3099 Evas_Object *content;
3100 if (!it->item->mode_view) return;
3102 evas_event_freeze(evas_object_evas_get(it->wd->obj));
3103 elm_widget_stringlist_free(it->item->mode_texts);
3104 it->item->mode_texts = NULL;
3105 elm_widget_stringlist_free(it->item->mode_contents);
3106 it->item->mode_contents = NULL;
3107 elm_widget_stringlist_free(it->item->mode_states);
3109 EINA_LIST_FREE(it->item->mode_content_objs, content)
3110 evas_object_del(content);
3112 edje_object_part_unswallow(it->item->mode_view, VIEW(it));
3113 evas_object_smart_member_add(VIEW(it), wd->pan_smart);
3114 evas_object_del(it->item->mode_view);
3115 it->item->mode_view = NULL;
3117 if (wd->mode_item == it)
3118 wd->mode_item = NULL;
3119 evas_event_thaw(evas_object_evas_get(it->wd->obj));
3120 evas_event_thaw_eval(evas_object_evas_get(it->wd->obj));
3124 _item_mode_set(Elm_Gen_Item *it)
3127 Widget_Data *wd = it->wd;
3132 it->item->nocache = EINA_TRUE;
3134 if (wd->scr_hold_timer)
3136 ecore_timer_del(wd->scr_hold_timer);
3137 wd->scr_hold_timer = NULL;
3139 elm_smart_scroller_hold_set(wd->scr, EINA_TRUE);
3140 wd->scr_hold_timer = ecore_timer_add(0.1, _scr_hold_timer_cb, wd);
3142 evas_event_freeze(evas_object_evas_get(it->wd->obj));
3143 _mode_item_realize(it);
3144 if (it->item->group_item)
3145 evas_object_raise(it->item->VIEW(group_item));
3146 _item_position(it, it->item->mode_view, it->item->scrl_x, it->item->scrl_y);
3147 evas_event_thaw(evas_object_evas_get(it->wd->obj));
3148 evas_event_thaw_eval(evas_object_evas_get(it->wd->obj));
3150 snprintf(buf, sizeof(buf), "elm,state,%s,active", wd->mode_type);
3151 edje_object_signal_emit(it->item->mode_view, buf, "elm");
3155 _item_mode_unset(Widget_Data *wd)
3158 if (!wd->mode_item) return;
3159 char buf[1024], buf2[1024];
3163 it->item->nocache = EINA_TRUE;
3165 snprintf(buf, sizeof(buf), "elm,state,%s,passive", wd->mode_type);
3166 snprintf(buf2, sizeof(buf2), "elm,state,%s,passive,finished", wd->mode_type);
3168 edje_object_signal_emit(it->item->mode_view, buf, "elm");
3169 edje_object_signal_callback_add(it->item->mode_view, buf2, "elm", _mode_finished_signal_cb, it);
3171 wd->mode_item = NULL;
3175 _edit_mode_item_position(Elm_Gen_Item *it, int itx, int ity)
3177 if ((!it) || (!it->wd->edit_mode)) return;
3178 evas_object_resize(it->edit_obj, it->item->w, it->item->h);
3179 evas_object_move(it->edit_obj, itx, ity);
3183 _edit_mode_item_realize(Elm_Gen_Item *it, Eina_Bool effect_on)
3186 const char *stacking_even;
3187 const char *stacking;
3189 if ((!it) || (it->item->edit_mode_item_realized) ||
3190 (it->generation < it->wd->generation))
3193 it->edit_obj = edje_object_add(evas_object_evas_get(WIDGET(it)));
3194 edje_object_scale_set(it->edit_obj, elm_widget_scale_get(WIDGET(it)) *
3195 _elm_config->scale);
3196 evas_object_smart_member_add(it->edit_obj, it->wd->pan_smart);
3197 elm_widget_sub_object_add(WIDGET(it), it->edit_obj);
3199 if (it->item->flags & ELM_GENLIST_ITEM_SUBITEMS)
3200 strncpy(buf, "tree", sizeof(buf));
3201 else strncpy(buf, "item", sizeof(buf));
3202 if (it->wd->compress)
3203 strncat(buf, "_compress", sizeof(buf) - strlen(buf));
3205 strncat(buf, "/", sizeof(buf) - strlen(buf));
3206 strncat(buf, it->itc->edit_item_style, sizeof(buf) - strlen(buf));
3208 _elm_theme_object_set(WIDGET(it), it->edit_obj, "genlist", buf,
3209 elm_widget_style_get(WIDGET(it)));
3211 stacking_even = edje_object_data_get(VIEW(it), "stacking_even");
3212 if (!stacking_even) stacking_even = "above";
3213 it->item->stacking_even = !!strcmp("above", stacking_even);
3215 stacking = edje_object_data_get(VIEW(it), "stacking");
3216 if (!stacking) stacking = "yes";
3217 it->item->nostacking = !!strcmp("yes", stacking);
3219 edje_object_mirrored_set(it->edit_obj,
3220 elm_widget_mirrored_get(WIDGET(it)));
3222 _elm_genlist_item_odd_even_update(it);
3223 _elm_genlist_item_state_update(it, NULL);
3225 if (effect_on) edje_object_signal_emit(it->edit_obj, "elm,state,edit,enabled,effect", "elm");
3226 else edje_object_signal_emit(it->edit_obj, "elm,state,edit,enabled", "elm");
3228 evas_object_event_callback_add(it->edit_obj, EVAS_CALLBACK_MOUSE_DOWN,
3230 evas_object_event_callback_add(it->edit_obj, EVAS_CALLBACK_MOUSE_UP,
3232 evas_object_event_callback_add(it->edit_obj, EVAS_CALLBACK_MOUSE_MOVE,
3234 evas_object_event_callback_add(it->edit_obj, EVAS_CALLBACK_MULTI_DOWN,
3236 evas_object_event_callback_add(it->edit_obj, EVAS_CALLBACK_MULTI_UP,
3238 evas_object_event_callback_add(it->edit_obj, EVAS_CALLBACK_MULTI_MOVE,
3241 _item_text_realize(it, it->edit_obj, &it->item->edit_texts, NULL);
3242 it->item->edit_content_objs =
3243 _item_content_realize(it, it->edit_obj, &it->item->edit_contents, NULL);
3244 _item_state_realize(it, it->edit_obj, &it->item->edit_states, NULL);
3245 edje_object_part_swallow(it->edit_obj, "elm.swallow.edit.content", VIEW(it));
3247 _edit_mode_item_position(it, it->item->scrl_x, it->item->scrl_y);
3248 evas_object_show(it->edit_obj);
3250 it->item->edit_mode_item_realized = EINA_TRUE;
3251 it->want_unrealize = EINA_FALSE;
3255 _edit_mode_item_unrealize(Elm_Gen_Item *it)
3258 if ((!it) || (!it->item->edit_mode_item_realized)) return;
3260 edje_object_part_unswallow(it->edit_obj, VIEW(it));
3261 evas_object_smart_member_add(VIEW(it), it->wd->pan_smart);
3262 elm_widget_sub_object_add(WIDGET(it), VIEW(it));
3263 _elm_genlist_item_odd_even_update(it);
3264 _elm_genlist_item_state_update(it, NULL);
3266 evas_object_del(it->edit_obj);
3267 it->edit_obj = NULL;
3268 elm_widget_stringlist_free(it->item->edit_texts);
3269 it->item->edit_texts = NULL;
3270 elm_widget_stringlist_free(it->item->edit_contents);
3271 it->item->edit_contents = NULL;
3272 elm_widget_stringlist_free(it->item->edit_states);
3273 it->item->edit_states = NULL;
3274 EINA_LIST_FREE(it->item->edit_content_objs, icon)
3275 evas_object_del(icon);
3276 edje_object_message_signal_process(it->edit_obj);
3278 evas_object_event_callback_del_full(it->edit_obj, EVAS_CALLBACK_MOUSE_DOWN,
3280 evas_object_event_callback_del_full(it->edit_obj, EVAS_CALLBACK_MOUSE_UP,
3282 evas_object_event_callback_del_full(it->edit_obj, EVAS_CALLBACK_MOUSE_MOVE,
3284 evas_object_event_callback_del_full(it->edit_obj, EVAS_CALLBACK_MULTI_DOWN,
3286 evas_object_event_callback_del_full(it->edit_obj, EVAS_CALLBACK_MULTI_UP,
3288 evas_object_event_callback_del_full(it->edit_obj, EVAS_CALLBACK_MULTI_MOVE,
3290 it->item->edit_mode_item_realized = EINA_FALSE;
3294 _item_auto_scroll(Widget_Data *wd)
3297 Elm_Gen_Item *tmp_item = NULL;
3299 if ((wd->expanded_item) && (wd->auto_scroll_enabled))
3301 tmp_item = eina_list_data_get(eina_list_last(wd->expanded_item->item->items));
3302 if (!tmp_item) return;
3303 wd->show_item = tmp_item;
3304 wd->bring_in = EINA_TRUE;
3305 wd->scrollto_type = ELM_GENLIST_ITEM_SCROLLTO_IN;
3306 if ((wd->show_item->item->queued) || (!wd->show_item->item->mincalcd))
3308 wd->show_item->item->showme = EINA_TRUE;
3309 wd->auto_scroll_enabled = EINA_FALSE;
3317 elm_genlist_add(Evas_Object *parent)
3322 Evas_Coord minw, minh;
3323 static Evas_Smart *smart = NULL;
3327 static Evas_Smart_Class sc;
3329 evas_object_smart_clipped_smart_set(&_pan_sc);
3331 sc.name = "elm_genlist_pan";
3332 sc.version = EVAS_SMART_CLASS_VERSION;
3335 sc.resize = _pan_resize;
3336 sc.move = _pan_move;
3337 sc.calculate = _pan_calculate;
3338 if (!(smart = evas_smart_class_new(&sc))) return NULL;
3341 ELM_WIDGET_STANDARD_SETUP(wd, Widget_Data, parent, e, obj, NULL);
3343 ELM_SET_WIDTYPE(widtype, "genlist");
3345 elm_widget_type_set(obj, "genlist");
3346 elm_widget_sub_object_add(parent, obj);
3347 elm_widget_on_focus_hook_set(obj, _on_focus_hook, NULL);
3348 elm_widget_signal_emit_hook_set(obj, _signal_emit_hook);
3349 elm_widget_data_set(obj, wd);
3350 elm_widget_del_hook_set(obj, _del_hook);
3351 elm_widget_del_pre_hook_set(obj, _del_pre_hook);
3352 elm_widget_theme_hook_set(obj, _theme_hook);
3353 elm_widget_can_focus_set(obj, EINA_TRUE);
3354 elm_widget_event_hook_set(obj, _event_hook);
3355 elm_widget_on_show_region_hook_set(obj, _show_region_hook, obj);
3356 elm_widget_translate_hook_set(obj, _translate_hook);
3359 wd->scr = elm_smart_scroller_add(e);
3360 elm_smart_scroller_widget_set(wd->scr, obj);
3361 elm_smart_scroller_object_theme_set(obj, wd->scr, "genlist", "base",
3362 elm_widget_style_get(obj));
3363 elm_smart_scroller_bounce_allow_set(wd->scr, EINA_FALSE,
3364 _elm_config->thumbscroll_bounce_enable);
3365 elm_widget_resize_object_set(obj, wd->scr);
3367 evas_object_smart_callback_add(wd->scr, "animate,start", _scr_anim_start, obj);
3368 evas_object_smart_callback_add(wd->scr, "animate,stop", _scr_anim_stop, obj);
3369 evas_object_smart_callback_add(wd->scr, "drag,start", _scr_drag_start, obj);
3370 evas_object_smart_callback_add(wd->scr, "drag,stop", _scr_drag_stop, obj);
3371 evas_object_smart_callback_add(wd->scr, "edge,left", _edge_left, obj);
3372 evas_object_smart_callback_add(wd->scr, "edge,right", _edge_right, obj);
3373 evas_object_smart_callback_add(wd->scr, "edge,top", _edge_top, obj);
3374 evas_object_smart_callback_add(wd->scr, "edge,bottom", _edge_bottom, obj);
3377 wd->mode = ELM_LIST_SCROLL;
3378 wd->max_items_per_block = MAX_ITEMS_PER_BLOCK;
3379 wd->item_cache_max = wd->max_items_per_block * 2;
3380 wd->longpress_timeout = _elm_config->longpress_timeout;
3382 evas_object_smart_callback_add(obj, "scroll-hold-on", _hold_on, obj);
3383 evas_object_smart_callback_add(obj, "scroll-hold-off", _hold_off, obj);
3384 evas_object_smart_callback_add(obj, "scroll-freeze-on", _freeze_on, obj);
3385 evas_object_smart_callback_add(obj, "scroll-freeze-off", _freeze_off, obj);
3387 wd->pan_smart = evas_object_smart_add(e, smart);
3388 wd->pan = evas_object_smart_data_get(wd->pan_smart);
3391 elm_smart_scroller_extern_pan_set(wd->scr, wd->pan_smart,
3392 _pan_set, _pan_get, _pan_max_get,
3393 _pan_min_get, _pan_child_size_get);
3395 edje_object_size_min_calc(elm_smart_scroller_edje_object_get(wd->scr),
3397 evas_object_size_hint_min_set(obj, minw, minh);
3399 evas_object_smart_callbacks_descriptions_set(obj, _signals);
3401 _mirrored_set(obj, elm_widget_mirrored_get(obj));
3407 _item_select(Elm_Gen_Item *it)
3409 if ((it->wd->no_select) || (it->generation < it->wd->generation) || (it->mode_set)) return;
3412 it->selected = EINA_TRUE;
3413 it->wd->selected = eina_list_append(it->wd->selected, it);
3415 else if (!it->wd->always_select) return;
3417 evas_object_ref(WIDGET(it));
3420 if (it->func.func) it->func.func((void *)it->func.data, WIDGET(it), it);
3421 if (it->generation == it->wd->generation)
3422 evas_object_smart_callback_call(WIDGET(it), SIG_SELECTED, it);
3425 evas_object_unref(WIDGET(it));
3426 if ((it->wd->clear_me) && (!it->wd->walking))
3427 _elm_genlist_clear(WIDGET(it), EINA_TRUE);
3430 if ((!it->walking) && (it->generation < it->wd->generation))
3435 elm_widget_item_free(it);
3439 it->wd->last_selected_item = (Elm_Object_Item *) it;
3443 static Evas_Object *
3444 _item_content_get_hook(Elm_Gen_Item *it, const char *part)
3446 return edje_object_part_swallow_get(VIEW(it), part);
3450 _item_content_set_hook(Elm_Gen_Item *it, const char *part, Evas_Object *content)
3452 if (content && part)
3454 it->content_objs = eina_list_append(it->content_objs, content);
3455 edje_object_part_swallow(VIEW(it), part, content);
3459 static Evas_Object *
3460 _item_content_unset_hook(Elm_Gen_Item *it, const char *part)
3463 obj = edje_object_part_swallow_get(VIEW(it), part);
3464 if (!obj) return NULL;
3465 it->content_objs = eina_list_remove(it->content_objs, obj);
3466 edje_object_part_unswallow(VIEW(it), obj);
3471 _item_text_hook(Elm_Gen_Item *it, const char *part)
3473 if (!it->itc->func.text_get) return NULL;
3474 return edje_object_part_text_get(VIEW(it), part);
3478 _item_disable_hook(Elm_Object_Item *it)
3482 Elm_Gen_Item *_it = (Elm_Gen_Item *) it;
3484 if (_it->generation < _it->wd->generation) return;
3487 elm_genlist_item_selected_set(it, EINA_FALSE);
3491 if (elm_widget_item_disabled_get(it))
3493 edje_object_signal_emit(VIEW(_it), "elm,state,disabled", "elm");
3495 edje_object_signal_emit(_it->edit_obj, "elm,state,disabled", "elm");
3499 edje_object_signal_emit(VIEW(_it), "elm,state,enabled", "elm");
3501 edje_object_signal_emit(_it->edit_obj, "elm,state,enabled", "elm");
3503 EINA_LIST_FOREACH(_it->content_objs, l, obj)
3504 elm_widget_disabled_set(obj, elm_widget_item_disabled_get(_it));
3509 _item_del_pre_hook(Elm_Object_Item *it)
3511 Elm_Gen_Item *_it = (Elm_Gen_Item *) it;
3513 if ((_it->relcount > 0) || (_it->walking > 0))
3515 elm_genlist_item_subitems_clear(it);
3516 if (_it->wd->show_item == _it) _it->wd->show_item = NULL;
3517 _elm_genlist_item_del_notserious(_it);
3518 if (_it->item->block)
3520 if (_it->realized) _elm_genlist_item_unrealize(_it, EINA_FALSE);
3521 _it->item->block->changed = EINA_TRUE;
3522 if (_it->wd->calc_job) ecore_job_del(_it->wd->calc_job);
3523 _it->wd->calc_job = ecore_job_add(_calc_job, _it->wd);
3527 _it->parent->item->items =
3528 eina_list_remove(_it->parent->item->items, it);
3538 _elm_genlist_item_new(Widget_Data *wd,
3539 const Elm_Gen_Item_Class *itc,
3541 Elm_Gen_Item *parent,
3543 const void *func_data)
3547 it = elm_widget_item_new(wd->obj, Elm_Gen_Item);
3548 if (!it) return NULL;
3550 it->generation = wd->generation;
3552 elm_genlist_item_class_ref((Elm_Genlist_Item_Class *)itc);
3553 it->base.data = data;
3554 it->parent = parent;
3555 it->func.func = func;
3556 it->func.data = func_data;
3557 elm_widget_item_content_get_hook_set(it, _item_content_get_hook);
3558 elm_widget_item_content_set_hook_set(it, _item_content_set_hook);
3559 elm_widget_item_content_unset_hook_set(it, _item_content_unset_hook);
3560 elm_widget_item_text_get_hook_set(it, _item_text_hook);
3561 elm_widget_item_disable_hook_set(it, _item_disable_hook);
3562 elm_widget_item_del_pre_hook_set(it, _item_del_pre_hook);
3564 it->sel_cb = (Ecore_Cb)_item_select;
3569 static Elm_Gen_Item *
3570 _item_new(Widget_Data *wd,
3571 const Elm_Genlist_Item_Class *itc,
3573 Elm_Gen_Item *parent,
3574 Elm_Genlist_Item_Flags flags,
3576 const void *func_data)
3578 Elm_Gen_Item *it, *it2;
3581 it = _elm_genlist_item_new(wd, itc, data, parent, func, func_data);
3582 if (!it) return NULL;
3583 it->item = ELM_NEW(Elm_Gen_Item_Type);
3584 it->item->flags = flags;
3585 if (flags & ELM_GENLIST_ITEM_GROUP) it->group++;
3586 it->item->expanded_depth = 0;
3587 ELM_GEN_ITEM_SETUP(it);
3590 if (it->parent->group)
3591 it->item->group_item = parent;
3592 else if (it->parent->item->group_item)
3593 it->item->group_item = it->parent->item->group_item;
3595 for (it2 = it, depth = 0; it2->parent; it2 = it2->parent)
3597 if (!it2->parent->group) depth += 1;
3599 it->item->expanded_depth = depth;
3605 _item_block_new(Widget_Data *wd, Eina_Bool prepend)
3609 itb = calloc(1, sizeof(Item_Block));
3610 if (!itb) return NULL;
3614 wd->blocks = eina_inlist_prepend(wd->blocks, EINA_INLIST_GET(itb));
3615 _item_block_position_update(wd->blocks, 0);
3619 wd->blocks = eina_inlist_append(wd->blocks, EINA_INLIST_GET(itb));
3620 itb->position_update = EINA_TRUE;
3621 if (wd->blocks != EINA_INLIST_GET(itb))
3623 itb->position = ((Item_Block *) (EINA_INLIST_GET(itb)->prev))->position + 1;
3634 _item_block_add(Widget_Data *wd,
3637 Item_Block *itb = NULL;
3644 itb = calloc(1, sizeof(Item_Block));
3645 if (!itb) return EINA_FALSE;
3647 if (!it->item->rel->item->block)
3650 eina_inlist_append(wd->blocks, EINA_INLIST_GET(itb));
3651 itb->items = eina_list_append(itb->items, it);
3652 itb->position_update = EINA_TRUE;
3653 it->position = eina_list_count(itb->items);
3654 it->position_update = EINA_TRUE;
3656 if (wd->blocks != EINA_INLIST_GET(itb))
3658 itb->position = ((Item_Block *) (EINA_INLIST_GET(itb)->prev))->position + 1;
3669 tmp = eina_list_data_find_list(itb->items, it->item->rel);
3670 if (it->item->before)
3672 wd->blocks = eina_inlist_prepend_relative
3673 (wd->blocks, EINA_INLIST_GET(itb),
3674 EINA_INLIST_GET(it->item->rel->item->block));
3676 eina_list_prepend_relative_list(itb->items, it, tmp);
3678 /* Update index from where we prepended */
3679 _item_position_update(eina_list_prev(tmp), it->item->rel->position);
3680 _item_block_position_update(EINA_INLIST_GET(itb),
3681 it->item->rel->item->block->position);
3685 wd->blocks = eina_inlist_append_relative
3686 (wd->blocks, EINA_INLIST_GET(itb),
3687 EINA_INLIST_GET(it->item->rel->item->block));
3689 eina_list_append_relative_list(itb->items, it, tmp);
3691 /* Update block index from where we appended */
3692 _item_position_update(eina_list_next(tmp), it->item->rel->position + 1);
3693 _item_block_position_update(EINA_INLIST_GET(itb),
3694 it->item->rel->item->block->position + 1);
3700 if (it->item->before)
3704 itb = (Item_Block *)(wd->blocks);
3705 if (itb->count >= wd->max_items_per_block)
3707 itb = _item_block_new(wd, EINA_TRUE);
3708 if (!itb) return EINA_FALSE;
3713 itb = _item_block_new(wd, EINA_TRUE);
3714 if (!itb) return EINA_FALSE;
3716 itb->items = eina_list_prepend(itb->items, it);
3718 _item_position_update(itb->items, 0);
3724 itb = (Item_Block *)(wd->blocks->last);
3725 if (itb->count >= wd->max_items_per_block)
3727 itb = _item_block_new(wd, EINA_FALSE);
3728 if (!itb) return EINA_FALSE;
3733 itb = _item_block_new(wd, EINA_FALSE);
3734 if (!itb) return EINA_FALSE;
3736 itb->items = eina_list_append(itb->items, it);
3737 it->position = eina_list_count(itb->items);
3745 if (it->item->rel->item->queued)
3747 /* NOTE: for a strange reason eina_list and eina_inlist don't have the same property
3748 on sorted insertion order, so the queue is not always ordered like the item list.
3749 This lead to issue where we depend on an item that is not yet created. As a quick
3750 work around, we reschedule the calc of the item and stop reordering the list to
3751 prevent any nasty issue to show up here.
3753 wd->queue = eina_list_append(wd->queue, it);
3754 wd->requeued = EINA_TRUE;
3755 it->item->queued = EINA_TRUE;
3758 itb = it->item->rel->item->block;
3759 if (!itb) goto newblock;
3760 tmp = eina_list_data_find_list(itb->items, it->item->rel);
3761 if (it->item->before)
3763 itb->items = eina_list_prepend_relative_list(itb->items, it, tmp);
3764 _item_position_update(eina_list_prev(tmp), it->item->rel->position);
3768 itb->items = eina_list_append_relative_list(itb->items, it, tmp);
3769 _item_position_update(eina_list_next(tmp), it->item->rel->position + 1);
3773 itb->changed = EINA_TRUE;
3774 it->item->block = itb;
3775 if (itb->wd->calc_job) ecore_job_del(itb->wd->calc_job);
3776 itb->wd->calc_job = ecore_job_add(_calc_job, itb->wd);
3779 it->item->rel->relcount--;
3780 if ((it->item->rel->generation < it->wd->generation) && (!it->item->rel->relcount))
3782 _item_del(it->item->rel);
3783 elm_widget_item_free(it->item->rel);
3785 it->item->rel = NULL;
3787 if (itb->count > itb->wd->max_items_per_block)
3792 Eina_Bool done = EINA_FALSE;
3794 newc = itb->count / 2;
3796 if (EINA_INLIST_GET(itb)->prev)
3798 Item_Block *itbp = (Item_Block *)(EINA_INLIST_GET(itb)->prev);
3800 if (itbp->count + newc < wd->max_items_per_block / 2)
3802 /* moving items to previous block */
3803 while ((itb->count > newc) && (itb->items))
3805 it2 = eina_list_data_get(itb->items);
3806 itb->items = eina_list_remove_list(itb->items, itb->items);
3809 itbp->items = eina_list_append(itbp->items, it2);
3810 it2->item->block = itbp;
3818 if (!done && EINA_INLIST_GET(itb)->next)
3820 Item_Block *itbn = (Item_Block *)(EINA_INLIST_GET(itb)->next);
3822 if (itbn->count + newc < wd->max_items_per_block / 2)
3824 /* moving items to next block */
3825 while ((itb->count > newc) && (itb->items))
3829 l = eina_list_last(itb->items);
3830 it2 = eina_list_data_get(l);
3831 itb->items = eina_list_remove_list(itb->items, l);
3834 itbn->items = eina_list_prepend(itbn->items, it2);
3835 it2->item->block = itbn;
3845 /* moving items to new block */
3846 itb2 = calloc(1, sizeof(Item_Block));
3847 if (!itb2) return EINA_FALSE;
3850 eina_inlist_append_relative(wd->blocks, EINA_INLIST_GET(itb2),
3851 EINA_INLIST_GET(itb));
3852 itb2->changed = EINA_TRUE;
3853 while ((itb->count > newc) && (itb->items))
3857 l = eina_list_last(itb->items);
3859 itb->items = eina_list_remove_list(itb->items, l);
3862 itb2->items = eina_list_prepend(itb2->items, it2);
3863 it2->item->block = itb2;
3873 _queue_process(Widget_Data *wd)
3876 Eina_Bool showme = EINA_FALSE;
3879 t0 = ecore_loop_time_get();
3880 //evas_event_freeze(evas_object_evas_get(wd->obj));
3881 for (n = 0; (wd->queue) && (n < 128); n++)
3885 it = eina_list_data_get(wd->queue);
3886 wd->queue = eina_list_remove_list(wd->queue, wd->queue);
3887 it->item->queued = EINA_FALSE;
3888 if (!_item_block_add(wd, it)) continue;
3890 _item_block_realize(it->item->block);
3891 t = ecore_time_get();
3892 if (it->item->block->changed)
3894 showme = _item_block_recalc(it->item->block, it->item->block->num, EINA_TRUE);
3895 it->item->block->changed = 0;
3896 if (wd->pan_changed)
3898 if (wd->calc_job) ecore_job_del(wd->calc_job);
3899 wd->calc_job = NULL;
3901 wd->pan_changed = EINA_FALSE;
3904 if (showme) it->item->block->showme = EINA_TRUE;
3905 /* same as eina_inlist_count > 1 */
3906 if (wd->blocks && wd->blocks->next)
3908 if ((t - t0) > (ecore_animator_frametime_get())) break;
3911 //evas_event_thaw(evas_object_evas_get(wd->obj));
3912 //evas_event_thaw_eval(evas_object_evas_get(wd->obj));
3917 _idle_process(void *data, Eina_Bool *wakeup)
3919 Widget_Data *wd = data;
3922 //static double q_start = 0.0;
3923 //if (q_start == 0.0) q_start = ecore_time_get();
3925 if (_queue_process(wd) > 0) *wakeup = EINA_TRUE;
3929 //printf("PROCESS TIME: %3.3f\n", ecore_time_get() - q_start);
3931 return ECORE_CALLBACK_CANCEL;
3933 return ECORE_CALLBACK_RENEW;
3937 _item_idle_enterer(void *data)
3939 Widget_Data *wd = data;
3940 Eina_Bool wakeup = EINA_FALSE;
3941 Eina_Bool ok = _idle_process(data, &wakeup);
3946 if (wd->calc_job) ecore_job_del(wd->calc_job);
3947 wd->calc_job = ecore_job_add(_calc_job, wd);
3949 if (ok == ECORE_CALLBACK_CANCEL) wd->queue_idle_enterer = NULL;
3954 _item_queue(Widget_Data *wd,
3958 if (it->item->queued) return;
3959 it->item->queued = EINA_TRUE;
3960 if (cb && !wd->requeued)
3961 wd->queue = eina_list_sorted_insert(wd->queue, cb, it);
3963 wd->queue = eina_list_append(wd->queue, it);
3964 // FIXME: why does a freeze then thaw here cause some genlist
3965 // elm_genlist_item_append() to be much much slower?
3966 // evas_event_freeze(evas_object_evas_get(wd->obj));
3967 while ((wd->queue) && ((!wd->blocks) || (!wd->blocks->next)))
3969 if (wd->queue_idle_enterer)
3971 ecore_idle_enterer_del(wd->queue_idle_enterer);
3972 wd->queue_idle_enterer = NULL;
3976 // evas_event_thaw(evas_object_evas_get(wd->obj));
3977 // evas_event_thaw_eval(evas_object_evas_get(wd->obj));
3978 if (!wd->queue_idle_enterer)
3979 wd->queue_idle_enterer = ecore_idle_enterer_add(_item_idle_enterer, wd);
3983 _elm_genlist_item_compare_data(const void *data, const void *data1)
3985 const Elm_Gen_Item *it = data;
3986 const Elm_Gen_Item *item1 = data1;
3988 return it->wd->item_compare_data_cb(it->base.data, item1->base.data);
3992 _elm_genlist_item_compare(const void *data, const void *data1)
3994 const Elm_Gen_Item *it, *item1;
3995 it = ELM_GEN_ITEM_FROM_INLIST(data);
3996 item1 = ELM_GEN_ITEM_FROM_INLIST(data1);
3997 return it->wd->item_compare_cb(it, item1);
4001 _elm_genlist_item_list_compare(const void *data, const void *data1)
4003 const Elm_Gen_Item *it = data;
4004 const Elm_Gen_Item *item1 = data1;
4005 return it->wd->item_compare_cb(it, item1);
4009 _item_move_after(Elm_Gen_Item *it, Elm_Gen_Item *after)
4014 it->wd->items = eina_inlist_remove(it->wd->items, EINA_INLIST_GET(it));
4015 _item_block_del(it);
4017 it->wd->items = eina_inlist_append_relative(it->wd->items, EINA_INLIST_GET(it), EINA_INLIST_GET(after));
4018 it->item->rel = after;
4019 it->item->rel->relcount++;
4020 it->item->before = EINA_FALSE;
4021 if (after->item->group_item) it->item->group_item = after->item->group_item;
4022 _item_queue(it->wd, it, NULL);
4024 evas_object_smart_callback_call(WIDGET(it), SIG_MOVED, it);
4028 _item_move_before(Elm_Gen_Item *it, Elm_Gen_Item *before)
4031 if (!before) return;
4033 it->wd->items = eina_inlist_remove(it->wd->items, EINA_INLIST_GET(it));
4034 _item_block_del(it);
4035 it->wd->items = eina_inlist_prepend_relative(it->wd->items, EINA_INLIST_GET(it), EINA_INLIST_GET(before));
4036 it->item->rel = before;
4037 it->item->rel->relcount++;
4038 it->item->before = EINA_TRUE;
4039 if (before->item->group_item) it->item->group_item = before->item->group_item;
4040 _item_queue(it->wd, it, NULL);
4042 evas_object_smart_callback_call(WIDGET(it), SIG_MOVED, it);
4046 elm_genlist_items_count(const Evas_Object *obj)
4048 ELM_CHECK_WIDTYPE(obj, widtype) 0;
4049 Widget_Data *wd = elm_widget_data_get(obj);
4051 return wd->item_count;
4054 EAPI Elm_Object_Item *
4055 elm_genlist_item_append(Evas_Object *obj,
4056 const Elm_Genlist_Item_Class *itc,
4058 Elm_Object_Item *parent,
4059 Elm_Genlist_Item_Flags flags,
4061 const void *func_data)
4063 ELM_CHECK_WIDTYPE(obj, widtype) NULL;
4064 Widget_Data *wd = elm_widget_data_get(obj);
4065 if (!wd) return NULL;
4066 Elm_Gen_Item *it = _item_new(wd, itc, data, (Elm_Gen_Item *) parent, flags,
4068 if (!it) return NULL;
4072 wd->group_items = eina_list_append(wd->group_items, it);
4073 wd->items = eina_inlist_append(wd->items, EINA_INLIST_GET(it));
4074 it->item->rel = NULL;
4078 Elm_Gen_Item *it2 = NULL;
4079 Eina_List *ll = eina_list_last(it->parent->item->items);
4080 if (ll) it2 = ll->data;
4081 it->parent->item->items = eina_list_append(it->parent->item->items, it);
4082 if (!it2) it2 = it->parent;
4084 eina_inlist_append_relative(wd->items, EINA_INLIST_GET(it),
4085 EINA_INLIST_GET(it2));
4086 it->item->rel = it2;
4087 it->item->rel->relcount++;
4089 it->item->before = EINA_FALSE;
4090 _item_queue(wd, it, NULL);
4091 return (Elm_Object_Item *) it;
4094 EAPI Elm_Object_Item *
4095 elm_genlist_item_prepend(Evas_Object *obj,
4096 const Elm_Genlist_Item_Class *itc,
4098 Elm_Object_Item *parent,
4099 Elm_Genlist_Item_Flags flags,
4101 const void *func_data)
4103 ELM_CHECK_WIDTYPE(obj, widtype) NULL;
4104 Widget_Data *wd = elm_widget_data_get(obj);
4105 if (!wd) return NULL;
4106 Elm_Gen_Item *it = _item_new(wd, itc, data, (Elm_Gen_Item *) parent, flags,
4108 if (!it) return NULL;
4112 wd->group_items = eina_list_prepend(wd->group_items, it);
4113 wd->items = eina_inlist_prepend(wd->items, EINA_INLIST_GET(it));
4114 it->item->rel = NULL;
4118 Elm_Gen_Item *it2 = NULL;
4119 Eina_List *ll = it->parent->item->items;
4120 if (ll) it2 = ll->data;
4121 it->parent->item->items = eina_list_prepend(it->parent->item->items, it);
4122 if (!it2) it2 = it->parent;
4124 eina_inlist_prepend_relative(wd->items, EINA_INLIST_GET(it),
4125 EINA_INLIST_GET(it2));
4126 it->item->rel = it2;
4127 it->item->rel->relcount++;
4129 it->item->before = EINA_TRUE;
4130 _item_queue(wd, it, NULL);
4131 return (Elm_Object_Item *) it;
4134 EAPI Elm_Object_Item *
4135 elm_genlist_item_insert_after(Evas_Object *obj,
4136 const Elm_Genlist_Item_Class *itc,
4138 Elm_Object_Item *parent,
4139 Elm_Object_Item *after,
4140 Elm_Genlist_Item_Flags flags,
4142 const void *func_data)
4144 ELM_CHECK_WIDTYPE(obj, widtype) NULL;
4145 ELM_OBJ_ITEM_CHECK_OR_RETURN(after, NULL);
4146 Widget_Data *wd = elm_widget_data_get(obj);
4147 Elm_Gen_Item *_after = (Elm_Gen_Item *) after;
4148 if (!wd) return NULL;
4149 /* It makes no sense to insert after in an empty list with after != NULL, something really bad is happening in your app. */
4150 EINA_SAFETY_ON_NULL_RETURN_VAL(wd->items, NULL);
4152 Elm_Gen_Item *it = _item_new(wd, itc, data, (Elm_Gen_Item *) parent, flags,
4154 if (!it) return NULL;
4157 if ((it->group) && (_after->group))
4158 wd->group_items = eina_list_append_relative(wd->group_items, it,
4163 it->parent->item->items =
4164 eina_list_append_relative(it->parent->item->items, it, _after);
4166 wd->items = eina_inlist_append_relative(wd->items, EINA_INLIST_GET(it),
4167 EINA_INLIST_GET(_after));
4168 it->item->rel = _after;
4169 it->item->rel->relcount++;
4170 it->item->before = EINA_FALSE;
4171 _item_queue(wd, it, NULL);
4172 return (Elm_Object_Item *) it;
4175 EAPI Elm_Object_Item *
4176 elm_genlist_item_insert_before(Evas_Object *obj,
4177 const Elm_Genlist_Item_Class *itc,
4179 Elm_Object_Item *parent,
4180 Elm_Object_Item *before,
4181 Elm_Genlist_Item_Flags flags,
4183 const void *func_data)
4185 ELM_CHECK_WIDTYPE(obj, widtype) NULL;
4186 ELM_OBJ_ITEM_CHECK_OR_RETURN(before, NULL);
4187 Widget_Data *wd = elm_widget_data_get(obj);
4188 Elm_Gen_Item *_before = (Elm_Gen_Item *) before;
4189 if (!wd) return NULL;
4190 /* It makes no sense to insert before in an empty list with before != NULL, something really bad is happening in your app. */
4191 EINA_SAFETY_ON_NULL_RETURN_VAL(wd->items, NULL);
4193 Elm_Gen_Item *it = _item_new(wd, itc, data, (Elm_Gen_Item *) parent, flags,
4195 if (!it) return NULL;
4198 if (it->group && _before->group)
4199 wd->group_items = eina_list_prepend_relative(wd->group_items, it,
4204 it->parent->item->items =
4205 eina_list_prepend_relative(it->parent->item->items, it, _before);
4207 wd->items = eina_inlist_prepend_relative(wd->items, EINA_INLIST_GET(it),
4208 EINA_INLIST_GET(_before));
4209 it->item->rel = _before;
4210 it->item->rel->relcount++;
4211 it->item->before = EINA_TRUE;
4212 _item_queue(wd, it, NULL);
4213 return (Elm_Object_Item *) it;
4216 EAPI Elm_Object_Item *
4217 elm_genlist_item_direct_sorted_insert(Evas_Object *obj,
4218 const Elm_Genlist_Item_Class *itc,
4220 Elm_Object_Item *parent,
4221 Elm_Genlist_Item_Flags flags,
4222 Eina_Compare_Cb comp,
4224 const void *func_data)
4226 ELM_CHECK_WIDTYPE(obj, widtype) NULL;
4227 Widget_Data *wd = elm_widget_data_get(obj);
4228 if (!wd) return NULL;
4229 Elm_Gen_Item *rel = NULL;
4230 Elm_Gen_Item *it = _item_new(wd, itc, data, (Elm_Gen_Item *) parent, flags,
4232 if (!it) return NULL;
4234 wd->item_compare_cb = comp;
4241 l = eina_list_search_sorted_near_list(it->parent->item->items,
4242 _elm_genlist_item_list_compare,
4246 rel = eina_list_data_get(l);
4250 if (cmp_result >= 0)
4252 it->parent->item->items = eina_list_prepend_relative_list(it->parent->item->items, it, l);
4253 wd->items = eina_inlist_prepend_relative(wd->items, EINA_INLIST_GET(it), EINA_INLIST_GET(rel));
4254 it->item->before = EINA_FALSE;
4256 else if (cmp_result < 0)
4258 it->parent->item->items = eina_list_append_relative_list(it->parent->item->items, it, l);
4259 wd->items = eina_inlist_append_relative(wd->items, EINA_INLIST_GET(it), EINA_INLIST_GET(rel));
4260 it->item->before = EINA_TRUE;
4267 wd->state = eina_inlist_sorted_state_new();
4268 eina_inlist_sorted_state_init(wd->state, wd->items);
4269 wd->requeued = EINA_FALSE;
4273 wd->group_items = eina_list_append(wd->group_items, it);
4275 wd->items = eina_inlist_sorted_state_insert(wd->items, EINA_INLIST_GET(it),
4276 _elm_genlist_item_compare, wd->state);
4278 if (EINA_INLIST_GET(it)->next)
4280 rel = ELM_GEN_ITEM_FROM_INLIST(EINA_INLIST_GET(it)->next);
4281 it->item->before = EINA_TRUE;
4283 else if (EINA_INLIST_GET(it)->prev)
4285 rel = ELM_GEN_ITEM_FROM_INLIST(EINA_INLIST_GET(it)->prev);
4286 it->item->before = EINA_FALSE;
4292 it->item->rel = rel;
4293 it->item->rel->relcount++;
4296 _item_queue(wd, it, _elm_genlist_item_list_compare);
4298 return (Elm_Object_Item *) it;
4301 EAPI Elm_Object_Item *
4302 elm_genlist_item_sorted_insert(Evas_Object *obj,
4303 const Elm_Genlist_Item_Class *itc,
4305 Elm_Object_Item *parent,
4306 Elm_Genlist_Item_Flags flags,
4307 Eina_Compare_Cb comp,
4309 const void *func_data)
4311 ELM_CHECK_WIDTYPE(obj, widtype) NULL;
4312 Widget_Data *wd = elm_widget_data_get(obj);
4313 wd->item_compare_data_cb = comp;
4314 return elm_genlist_item_direct_sorted_insert(obj, itc, data, parent, flags,
4315 _elm_genlist_item_compare_data,
4320 _elm_genlist_clear(Evas_Object *obj, Eina_Bool standby)
4322 Eina_Inlist *next, *l;
4324 ELM_CHECK_WIDTYPE(obj, widtype);
4325 Widget_Data *wd = elm_widget_data_get(obj);
4328 if (!standby) wd->generation++;
4332 eina_inlist_sorted_state_free(wd->state);
4336 if (wd->walking > 0)
4338 wd->clear_me = EINA_TRUE;
4341 evas_event_freeze(evas_object_evas_get(wd->obj));
4342 for (l = wd->items, next = l ? l->next : NULL;
4344 l = next, next = next ? next->next : NULL)
4346 Elm_Gen_Item *it = ELM_GEN_ITEM_FROM_INLIST(l);
4348 if (it->generation < wd->generation)
4350 Elm_Gen_Item *itn = NULL;
4352 if (next) itn = ELM_GEN_ITEM_FROM_INLIST(next);
4353 if (itn) itn->walking++; /* prevent early death of subitem */
4355 elm_widget_item_free(it);
4356 if (itn) itn->walking--;
4359 wd->clear_me = EINA_FALSE;
4360 wd->pan_changed = EINA_TRUE;
4363 ecore_job_del(wd->calc_job);
4364 wd->calc_job = NULL;
4366 if (wd->selected) wd->selected = eina_list_free(wd->selected);
4367 if (wd->clear_cb) wd->clear_cb(wd);
4374 evas_object_size_hint_min_set(wd->pan_smart, wd->minw, wd->minh);
4375 evas_object_smart_callback_call(wd->pan_smart, "changed", NULL);
4377 if (wd->sizing_cb) wd->sizing_cb(wd->obj);
4378 elm_smart_scroller_child_region_show(wd->scr, 0, 0, 0, 0);
4379 evas_event_thaw(evas_object_evas_get(wd->obj));
4380 evas_event_thaw_eval(evas_object_evas_get(wd->obj));
4384 elm_genlist_clear(Evas_Object *obj)
4386 _elm_genlist_clear(obj, EINA_FALSE);
4390 elm_genlist_multi_select_set(Evas_Object *obj,
4393 ELM_CHECK_WIDTYPE(obj, widtype);
4394 Widget_Data *wd = elm_widget_data_get(obj);
4396 wd->multi = !!multi;
4400 elm_genlist_multi_select_get(const Evas_Object *obj)
4402 ELM_CHECK_WIDTYPE(obj, widtype) EINA_FALSE;
4403 Widget_Data *wd = elm_widget_data_get(obj);
4404 if (!wd) return EINA_FALSE;
4408 EAPI Elm_Object_Item *
4409 elm_genlist_selected_item_get(const Evas_Object *obj)
4411 ELM_CHECK_WIDTYPE(obj, widtype) NULL;
4412 Widget_Data *wd = elm_widget_data_get(obj);
4413 if (!wd) return NULL;
4414 if (wd->selected) return wd->selected->data;
4418 EAPI const Eina_List *
4419 elm_genlist_selected_items_get(const Evas_Object *obj)
4421 ELM_CHECK_WIDTYPE(obj, widtype) NULL;
4422 Widget_Data *wd = elm_widget_data_get(obj);
4423 if (!wd) return NULL;
4424 return wd->selected;
4428 elm_genlist_realized_items_get(const Evas_Object *obj)
4430 ELM_CHECK_WIDTYPE(obj, widtype) NULL;
4431 Widget_Data *wd = elm_widget_data_get(obj);
4432 Eina_List *list = NULL;
4434 Eina_Bool done = EINA_FALSE;
4435 if (!wd) return NULL;
4436 EINA_INLIST_FOREACH(wd->blocks, itb)
4444 EINA_LIST_FOREACH(itb->items, l, it)
4446 if (it->realized) list = eina_list_append(list, it);
4457 EAPI Elm_Object_Item *
4458 elm_genlist_at_xy_item_get(const Evas_Object *obj,
4463 ELM_CHECK_WIDTYPE(obj, widtype) NULL;
4464 Widget_Data *wd = elm_widget_data_get(obj);
4465 Evas_Coord ox, oy, ow, oh;
4468 if (!wd) return NULL;
4469 evas_object_geometry_get(wd->pan_smart, &ox, &oy, &ow, &oh);
4471 EINA_INLIST_FOREACH(wd->blocks, itb)
4476 if (!ELM_RECTS_INTERSECT(ox + itb->x - itb->wd->pan_x,
4477 oy + itb->y - itb->wd->pan_y,
4478 itb->w, itb->h, x, y, 1, 1))
4480 EINA_LIST_FOREACH(itb->items, l, it)
4482 Evas_Coord itx, ity;
4484 itx = ox + itb->x + it->x - itb->wd->pan_x;
4485 ity = oy + itb->y + it->y - itb->wd->pan_y;
4486 if (ELM_RECTS_INTERSECT(itx, ity, it->item->w, it->item->h, x, y, 1, 1))
4490 if (y <= (ity + (it->item->h / 4))) *posret = -1;
4491 else if (y >= (ity + it->item->h - (it->item->h / 4)))
4495 return (Elm_Object_Item *) it;
4497 lasty = ity + it->item->h;
4502 if (y > lasty) *posret = 1;
4508 EAPI Elm_Object_Item *
4509 elm_genlist_first_item_get(const Evas_Object *obj)
4511 ELM_CHECK_WIDTYPE(obj, widtype) NULL;
4512 Widget_Data *wd = elm_widget_data_get(obj);
4513 if (!wd) return NULL;
4514 if (!wd->items) return NULL;
4515 Elm_Gen_Item *it = ELM_GEN_ITEM_FROM_INLIST(wd->items);
4516 while ((it) && (it->generation < wd->generation))
4517 it = ELM_GEN_ITEM_FROM_INLIST(EINA_INLIST_GET(it)->next);
4518 return (Elm_Object_Item *) it;
4521 EAPI Elm_Object_Item *
4522 elm_genlist_last_item_get(const Evas_Object *obj)
4524 ELM_CHECK_WIDTYPE(obj, widtype) NULL;
4525 Widget_Data *wd = elm_widget_data_get(obj);
4526 if (!wd) return NULL;
4527 if (!wd->items) return NULL;
4528 Elm_Gen_Item *it = ELM_GEN_ITEM_FROM_INLIST(wd->items->last);
4529 while ((it) && (it->generation < wd->generation))
4530 it = ELM_GEN_ITEM_FROM_INLIST(EINA_INLIST_GET(it)->prev);
4531 return (Elm_Object_Item *) it;
4534 EAPI Elm_Object_Item *
4535 elm_genlist_item_next_get(const Elm_Object_Item *it)
4537 ELM_OBJ_ITEM_CHECK_OR_RETURN(it, NULL);
4538 Elm_Gen_Item *_it = (Elm_Gen_Item *) it;
4541 _it = ELM_GEN_ITEM_FROM_INLIST(EINA_INLIST_GET(_it)->next);
4542 if ((_it) && (_it->generation == _it->wd->generation)) break;
4544 return (Elm_Object_Item *) _it;
4547 EAPI Elm_Object_Item *
4548 elm_genlist_item_prev_get(const Elm_Object_Item *it)
4550 ELM_OBJ_ITEM_CHECK_OR_RETURN(it, NULL);
4551 Elm_Gen_Item *_it = (Elm_Gen_Item *) it;
4554 _it = ELM_GEN_ITEM_FROM_INLIST(EINA_INLIST_GET(_it)->prev);
4555 if ((_it) && (_it->generation == _it->wd->generation)) break;
4557 return (Elm_Object_Item *) _it;
4560 EINA_DEPRECATED EAPI Evas_Object *
4561 elm_genlist_item_genlist_get(const Elm_Object_Item *it)
4563 return elm_object_item_widget_get(it);
4566 EAPI Elm_Object_Item *
4567 elm_genlist_item_parent_get(const Elm_Object_Item *it)
4569 ELM_OBJ_ITEM_CHECK_OR_RETURN(it, NULL);
4570 return (Elm_Object_Item *) ((Elm_Gen_Item *) it)->parent;
4574 elm_genlist_item_subitems_clear(Elm_Object_Item *it)
4576 ELM_OBJ_ITEM_CHECK_OR_RETURN(it);
4577 Eina_List *tl = NULL, *l;
4579 Elm_Object_Item *it2;
4580 _it = (Elm_Gen_Item *) it;
4582 EINA_LIST_FOREACH(_it->item->items, l, it2)
4583 tl = eina_list_append(tl, it2);
4584 EINA_LIST_FREE(tl, it2)
4585 elm_object_item_del(it2);
4589 elm_genlist_item_selected_set(Elm_Object_Item *it,
4592 ELM_OBJ_ITEM_CHECK_OR_RETURN(it);
4593 Elm_Gen_Item *_it = (Elm_Gen_Item *) it;
4594 Widget_Data *wd = _it->wd;
4596 if ((_it->generation < wd->generation) || elm_widget_item_disabled_get(_it))
4598 selected = !!selected;
4599 if (_it->selected == selected) return;
4605 while (wd->selected)
4607 if (_it->unhighlight_cb) _it->unhighlight_cb(wd->selected->data);
4608 _it->unsel_cb(wd->selected->data);
4611 _it->highlight_cb(_it);
4615 if (_it->unhighlight_cb) _it->unhighlight_cb(_it);
4620 elm_genlist_item_selected_get(const Elm_Object_Item *it)
4622 ELM_OBJ_ITEM_CHECK_OR_RETURN(it, EINA_FALSE);
4623 return ((Elm_Gen_Item *) it)->selected;
4627 elm_genlist_item_expanded_set(Elm_Object_Item *it,
4630 ELM_OBJ_ITEM_CHECK_OR_RETURN(it);
4631 Elm_Gen_Item *_it = (Elm_Gen_Item *) it;
4632 expanded = !!expanded;
4633 if (_it->item->expanded == expanded) return;
4634 _it->item->expanded = expanded;
4635 if (_it->item->expanded)
4638 edje_object_signal_emit(VIEW(_it), "elm,state,expanded", "elm");
4639 evas_object_smart_callback_call(WIDGET(_it), SIG_EXPANDED, _it);
4640 _it->wd->auto_scroll_enabled = EINA_TRUE;
4641 _it->wd->expanded_item = _it;
4646 edje_object_signal_emit(VIEW(_it), "elm,state,contracted", "elm");
4647 evas_object_smart_callback_call(WIDGET(_it), SIG_CONTRACTED, _it);
4648 _it->wd->auto_scroll_enabled = EINA_FALSE;
4649 _it->wd->expanded_item = NULL;
4654 elm_genlist_item_expanded_get(const Elm_Object_Item *it)
4656 ELM_OBJ_ITEM_CHECK_OR_RETURN(it, EINA_FALSE);
4657 return ((Elm_Gen_Item *) it)->item->expanded;
4661 elm_genlist_item_expanded_depth_get(const Elm_Object_Item *it)
4663 ELM_OBJ_ITEM_CHECK_OR_RETURN(it, 0);
4664 return ((Elm_Gen_Item *) it)->item->expanded_depth;
4667 EINA_DEPRECATED EAPI void
4668 elm_genlist_item_disabled_set(Elm_Object_Item *it,
4671 elm_object_item_disabled_set(it, disabled);
4674 EINA_DEPRECATED EAPI Eina_Bool
4675 elm_genlist_item_disabled_get(const Elm_Object_Item *it)
4677 return elm_object_item_disabled_get(it);
4681 elm_genlist_item_display_only_set(Elm_Object_Item *it,
4682 Eina_Bool display_only)
4684 ELM_OBJ_ITEM_CHECK_OR_RETURN(it);
4685 Elm_Gen_Item *_it = (Elm_Gen_Item *) it;
4686 display_only = !!display_only;
4687 if (_it->display_only == display_only) return;
4688 if (_it->generation < _it->wd->generation) return;
4689 _it->display_only = display_only;
4690 _it->item->mincalcd = EINA_FALSE;
4691 _it->item->updateme = EINA_TRUE;
4692 if (_it->item->block) _it->item->block->updateme = EINA_TRUE;
4693 if (_it->wd->update_job) ecore_job_del(_it->wd->update_job);
4694 _it->wd->update_job = ecore_job_add(_update_job, _it->wd);
4698 elm_genlist_item_display_only_get(const Elm_Object_Item *it)
4700 ELM_OBJ_ITEM_CHECK_OR_RETURN(it, EINA_FALSE);
4701 Elm_Gen_Item *_it = (Elm_Gen_Item *) it;
4702 if (_it->generation < _it->wd->generation) return EINA_FALSE;
4703 return _it->display_only;
4707 elm_genlist_item_show(Elm_Object_Item *it)
4709 ELM_OBJ_ITEM_CHECK_OR_RETURN(it);
4710 Elm_Gen_Item *_it = (Elm_Gen_Item *) it;
4711 Evas_Coord gith = 0;
4712 if (_it->generation < _it->wd->generation) return;
4713 if ((_it->item->queued) || (!_it->item->mincalcd))
4715 _it->wd->show_item = _it;
4716 _it->wd->bring_in = EINA_FALSE;
4717 _it->wd->scrollto_type = ELM_GENLIST_ITEM_SCROLLTO_IN;
4718 _it->item->showme = EINA_TRUE;
4721 if (_it->wd->show_item)
4723 _it->wd->show_item->item->showme = EINA_FALSE;
4724 _it->wd->show_item = NULL;
4726 if ((_it->item->group_item) &&
4727 (_it->wd->pan_y > (_it->y + _it->item->block->y)))
4728 gith = _it->item->group_item->item->h;
4729 elm_smart_scroller_child_region_show(_it->wd->scr,
4730 _it->x + _it->item->block->x,
4731 _it->y + _it->item->block->y - gith,
4732 _it->item->block->w, _it->item->h);
4736 elm_genlist_item_promote(Elm_Object_Item *it)
4738 ELM_OBJ_ITEM_CHECK_OR_RETURN(it);
4739 Elm_Gen_Item *_it = (Elm_Gen_Item *) it;
4740 if (_it->generation < _it->wd->generation) return;
4741 _item_move_before(_it,
4742 (Elm_Gen_Item *) elm_genlist_first_item_get(WIDGET(_it)));
4746 elm_genlist_item_demote(Elm_Object_Item *it)
4748 ELM_OBJ_ITEM_CHECK_OR_RETURN(it);
4749 Elm_Gen_Item *_it = (Elm_Gen_Item *) it;
4750 if (_it->generation < _it->wd->generation) return;
4751 _item_move_after(_it,
4752 (Elm_Gen_Item *) elm_genlist_last_item_get(WIDGET(_it)));
4756 elm_genlist_item_bring_in(Elm_Object_Item *it)
4758 ELM_OBJ_ITEM_CHECK_OR_RETURN(it);
4759 Elm_Gen_Item *_it = (Elm_Gen_Item *) it;
4760 Evas_Coord gith = 0;
4761 if (_it->generation < _it->wd->generation) return;
4762 if ((_it->item->queued) || (!_it->item->mincalcd))
4764 _it->wd->show_item = _it;
4765 _it->wd->bring_in = EINA_TRUE;
4766 _it->wd->scrollto_type = ELM_GENLIST_ITEM_SCROLLTO_IN;
4767 _it->item->showme = EINA_TRUE;
4770 if (_it->wd->show_item)
4772 _it->wd->show_item->item->showme = EINA_FALSE;
4773 _it->wd->show_item = NULL;
4775 if ((_it->item->group_item) &&
4776 (_it->wd->pan_y > (_it->y + _it->item->block->y)))
4777 gith = _it->item->group_item->item->h;
4778 elm_smart_scroller_region_bring_in(_it->wd->scr,
4779 _it->x + _it->item->block->x,
4780 _it->y + _it->item->block->y - gith,
4781 _it->item->block->w, _it->item->h);
4785 elm_genlist_item_top_show(Elm_Object_Item *it)
4787 ELM_OBJ_ITEM_CHECK_OR_RETURN(it);
4788 Elm_Gen_Item *_it = (Elm_Gen_Item *) it;
4790 Evas_Coord gith = 0;
4792 if (_it->generation < _it->wd->generation) return;
4793 if ((_it->item->queued) || (!_it->item->mincalcd))
4795 _it->wd->show_item = _it;
4796 _it->wd->bring_in = EINA_FALSE;
4797 _it->wd->scrollto_type = ELM_GENLIST_ITEM_SCROLLTO_TOP;
4798 _it->item->showme = EINA_TRUE;
4801 if (_it->wd->show_item)
4803 _it->wd->show_item->item->showme = EINA_FALSE;
4804 _it->wd->show_item = NULL;
4806 evas_object_geometry_get(_it->wd->pan_smart, NULL, NULL, &ow, &oh);
4807 if (_it->item->group_item) gith = _it->item->group_item->item->h;
4808 elm_smart_scroller_child_region_show(_it->wd->scr,
4809 _it->x + _it->item->block->x,
4810 _it->y + _it->item->block->y - gith,
4811 _it->item->block->w, oh);
4815 elm_genlist_item_top_bring_in(Elm_Object_Item *it)
4817 ELM_OBJ_ITEM_CHECK_OR_RETURN(it);
4818 Elm_Gen_Item *_it = (Elm_Gen_Item *) it;
4820 Evas_Coord gith = 0;
4822 if (_it->generation < _it->wd->generation) return;
4823 if ((_it->item->queued) || (!_it->item->mincalcd))
4825 _it->wd->show_item = _it;
4826 _it->wd->bring_in = EINA_TRUE;
4827 _it->wd->scrollto_type = ELM_GENLIST_ITEM_SCROLLTO_TOP;
4828 _it->item->showme = EINA_TRUE;
4831 if (_it->wd->show_item)
4833 _it->wd->show_item->item->showme = EINA_FALSE;
4834 _it->wd->show_item = NULL;
4836 evas_object_geometry_get(_it->wd->pan_smart, NULL, NULL, &ow, &oh);
4837 if (_it->item->group_item) gith = _it->item->group_item->item->h;
4838 elm_smart_scroller_region_bring_in(_it->wd->scr,
4839 _it->x + _it->item->block->x,
4840 _it->y + _it->item->block->y - gith,
4841 _it->item->block->w, oh);
4845 elm_genlist_item_middle_show(Elm_Object_Item *it)
4847 ELM_OBJ_ITEM_CHECK_OR_RETURN(it);
4848 Elm_Gen_Item *_it = (Elm_Gen_Item *) it;
4851 if (_it->generation < _it->wd->generation) return;
4852 if ((_it->item->queued) || (!_it->item->mincalcd))
4854 _it->wd->show_item = _it;
4855 _it->wd->bring_in = EINA_FALSE;
4856 _it->wd->scrollto_type = ELM_GENLIST_ITEM_SCROLLTO_MIDDLE;
4857 _it->item->showme = EINA_TRUE;
4860 if (_it->wd->show_item)
4862 _it->wd->show_item->item->showme = EINA_FALSE;
4863 _it->wd->show_item = NULL;
4865 evas_object_geometry_get(_it->wd->pan_smart, NULL, NULL, &ow, &oh);
4866 elm_smart_scroller_child_region_show(_it->wd->scr,
4867 _it->x + _it->item->block->x,
4868 _it->y + _it->item->block->y - oh / 2 +
4869 _it->item->h / 2, _it->item->block->w,
4874 elm_genlist_item_middle_bring_in(Elm_Object_Item *it)
4876 ELM_OBJ_ITEM_CHECK_OR_RETURN(it);
4877 Elm_Gen_Item *_it = (Elm_Gen_Item *) it;
4880 if (_it->generation < _it->wd->generation) return;
4881 if ((_it->item->queued) || (!_it->item->mincalcd))
4883 _it->wd->show_item = _it;
4884 _it->wd->bring_in = EINA_TRUE;
4885 _it->wd->scrollto_type = ELM_GENLIST_ITEM_SCROLLTO_MIDDLE;
4886 _it->item->showme = EINA_TRUE;
4889 if (_it->wd->show_item)
4891 _it->wd->show_item->item->showme = EINA_FALSE;
4892 _it->wd->show_item = NULL;
4894 evas_object_geometry_get(_it->wd->pan_smart, NULL, NULL, &ow, &oh);
4895 elm_smart_scroller_region_bring_in(_it->wd->scr,
4896 _it->x + _it->item->block->x,
4897 _it->y + _it->item->block->y - oh / 2 +
4898 _it->item->h / 2, _it->item->block->w,
4903 elm_genlist_item_del(Elm_Object_Item *it)
4905 elm_object_item_del(it);
4909 elm_genlist_item_data_set(Elm_Object_Item *it,
4912 elm_object_item_data_set(it, (void *) data);
4916 elm_genlist_item_data_get(const Elm_Object_Item *it)
4918 return elm_object_item_data_get(it);
4922 elm_genlist_item_icons_orphan(Elm_Object_Item *it)
4924 elm_genlist_item_contents_orphan(it);
4928 elm_genlist_item_contents_orphan(Elm_Object_Item *it)
4930 ELM_OBJ_ITEM_CHECK_OR_RETURN(it);
4932 Evas_Object *content;
4933 EINA_LIST_FREE(((Elm_Gen_Item *) it)->content_objs, content)
4935 elm_widget_sub_object_del(WIDGET(it), content);
4936 evas_object_smart_member_del(content);
4937 evas_object_hide(content);
4941 EINA_DEPRECATED EAPI const Evas_Object *
4942 elm_genlist_item_object_get(const Elm_Object_Item *it)
4944 ELM_OBJ_ITEM_CHECK_OR_RETURN(it, NULL);
4949 elm_genlist_item_update(Elm_Object_Item *it)
4951 ELM_OBJ_ITEM_CHECK_OR_RETURN(it);
4952 Elm_Gen_Item *_it = (Elm_Gen_Item *) it;
4954 if (!_it->item->block) return;
4955 if (_it->generation < _it->wd->generation) return;
4956 _it->item->mincalcd = EINA_FALSE;
4957 _it->item->updateme = EINA_TRUE;
4958 _it->item->block->updateme = EINA_TRUE;
4959 if (_it->wd->update_job) ecore_job_del(_it->wd->update_job);
4960 _it->wd->update_job = ecore_job_add(_update_job, _it->wd);
4964 elm_genlist_item_fields_update(Elm_Object_Item *it,
4966 Elm_Genlist_Item_Field_Flags itf)
4968 ELM_OBJ_ITEM_CHECK_OR_RETURN(it);
4969 Elm_Gen_Item *_it = (Elm_Gen_Item *) it;
4971 if (!_it->item->block) return;
4972 if (_it->generation < _it->wd->generation) return;
4974 if ((!itf) || (itf & ELM_GENLIST_ITEM_FIELD_LABEL))
4975 _item_text_realize(_it, VIEW(_it), &_it->texts, parts);
4976 if ((!itf) || (itf & ELM_GENLIST_ITEM_FIELD_CONTENT))
4978 _it->content_objs = _item_content_unrealize(_it, VIEW(_it),
4979 &_it->contents, parts);
4980 _it->content_objs = _item_content_realize(_it, VIEW(_it),
4981 &_it->contents, parts);
4983 if ((!itf) || (itf & ELM_GENLIST_ITEM_FIELD_STATE))
4984 _item_state_realize(_it, VIEW(_it), &_it->states, parts);
4988 elm_genlist_item_item_class_update(Elm_Object_Item *it,
4989 const Elm_Genlist_Item_Class *itc)
4991 ELM_OBJ_ITEM_CHECK_OR_RETURN(it);
4992 Elm_Gen_Item *_it = (Elm_Gen_Item *) it;
4994 if (!_it->item->block) return;
4995 EINA_SAFETY_ON_NULL_RETURN(itc);
4996 if (_it->generation < _it->wd->generation) return;
4998 _it->item->nocache = EINA_TRUE;
4999 elm_genlist_item_update(it);
5002 EAPI const Elm_Genlist_Item_Class *
5003 elm_genlist_item_item_class_get(const Elm_Object_Item *it)
5005 ELM_OBJ_ITEM_CHECK_OR_RETURN(it, NULL);
5006 Elm_Gen_Item *_it = (Elm_Gen_Item *) it;
5007 if (_it->generation < _it->wd->generation) return NULL;
5011 static Evas_Object *
5012 _elm_genlist_item_label_create(void *data,
5013 Evas_Object *obj __UNUSED__,
5014 Evas_Object *tooltip,
5015 void *it __UNUSED__)
5017 Evas_Object *label = elm_label_add(tooltip);
5020 elm_object_style_set(label, "tooltip");
5021 elm_object_text_set(label, data);
5026 _elm_genlist_item_label_del_cb(void *data,
5027 Evas_Object *obj __UNUSED__,
5028 void *event_info __UNUSED__)
5030 eina_stringshare_del(data);
5034 elm_genlist_item_tooltip_text_set(Elm_Object_Item *it,
5037 ELM_OBJ_ITEM_CHECK_OR_RETURN(it);
5038 text = eina_stringshare_add(text);
5039 elm_genlist_item_tooltip_content_cb_set(it, _elm_genlist_item_label_create,
5041 _elm_genlist_item_label_del_cb);
5045 elm_genlist_item_tooltip_content_cb_set(Elm_Object_Item *it,
5046 Elm_Tooltip_Item_Content_Cb func,
5048 Evas_Smart_Cb del_cb)
5050 ELM_OBJ_ITEM_CHECK_OR_GOTO(it, error);
5051 Elm_Gen_Item *_it = (Elm_Gen_Item *) it;
5053 if ((_it->tooltip.content_cb == func) && (_it->tooltip.data == data))
5056 if (_it->tooltip.del_cb)
5057 _it->tooltip.del_cb((void *) _it->tooltip.data, WIDGET(it), it);
5059 _it->tooltip.content_cb = func;
5060 _it->tooltip.data = data;
5061 _it->tooltip.del_cb = del_cb;
5065 elm_widget_item_tooltip_content_cb_set(_it,
5066 _it->tooltip.content_cb,
5067 _it->tooltip.data, NULL);
5068 elm_widget_item_tooltip_style_set(_it, _it->tooltip.style);
5069 elm_widget_item_tooltip_window_mode_set(_it, _it->tooltip.free_size);
5075 if (del_cb) del_cb((void *)data, NULL, NULL);
5079 elm_genlist_item_tooltip_unset(Elm_Object_Item *it)
5081 ELM_OBJ_ITEM_CHECK_OR_RETURN(it);
5082 Elm_Gen_Item *_it = (Elm_Gen_Item *) it;
5084 if ((VIEW(_it)) && (_it->tooltip.content_cb))
5085 elm_widget_item_tooltip_unset(_it);
5087 if (_it->tooltip.del_cb)
5088 _it->tooltip.del_cb((void *) _it->tooltip.data, WIDGET(_it), _it);
5089 _it->tooltip.del_cb = NULL;
5090 _it->tooltip.content_cb = NULL;
5091 _it->tooltip.data = NULL;
5092 _it->tooltip.free_size = EINA_FALSE;
5093 if (_it->tooltip.style)
5094 elm_genlist_item_tooltip_style_set(it, NULL);
5098 elm_genlist_item_tooltip_style_set(Elm_Object_Item *it,
5101 ELM_OBJ_ITEM_CHECK_OR_RETURN(it);
5102 Elm_Gen_Item *_it = (Elm_Gen_Item *) it;
5104 eina_stringshare_replace(&_it->tooltip.style, style);
5105 if (VIEW(_it)) elm_widget_item_tooltip_style_set(_it, style);
5109 elm_genlist_item_tooltip_style_get(const Elm_Object_Item *it)
5111 return elm_object_item_tooltip_style_get(it);
5115 elm_genlist_item_tooltip_window_mode_set(Elm_Object_Item *it,
5118 ELM_OBJ_ITEM_CHECK_OR_RETURN(it, EINA_FALSE);
5119 Elm_Gen_Item *_it = (Elm_Gen_Item *) it;
5121 _it->tooltip.free_size = disable;
5122 if (VIEW(_it)) return elm_widget_item_tooltip_window_mode_set(_it, disable);
5127 elm_genlist_item_tooltip_window_mode_get(const Elm_Object_Item *it)
5129 return elm_object_tooltip_window_mode_get(VIEW(it));
5133 elm_genlist_item_cursor_set(Elm_Object_Item *it,
5136 ELM_OBJ_ITEM_CHECK_OR_RETURN(it);
5137 Elm_Gen_Item *_it = (Elm_Gen_Item *) it;
5138 eina_stringshare_replace(&_it->mouse_cursor, cursor);
5139 if (VIEW(_it)) elm_widget_item_cursor_set(_it, cursor);
5143 elm_genlist_item_cursor_get(const Elm_Object_Item *it)
5145 return elm_widget_item_cursor_get(it);
5149 elm_genlist_item_cursor_unset(Elm_Object_Item *it)
5151 ELM_OBJ_ITEM_CHECK_OR_RETURN(it);
5152 Elm_Gen_Item *_it = (Elm_Gen_Item *) it;
5154 if (!_it->mouse_cursor) return;
5156 if (VIEW(_it)) elm_widget_item_cursor_unset(_it);
5158 eina_stringshare_del(_it->mouse_cursor);
5159 _it->mouse_cursor = NULL;
5163 elm_genlist_item_cursor_style_set(Elm_Object_Item *it,
5166 elm_widget_item_cursor_style_set(it, style);
5170 elm_genlist_item_cursor_style_get(const Elm_Object_Item *it)
5172 return elm_widget_item_cursor_style_get(it);
5176 elm_genlist_item_cursor_engine_only_set(Elm_Object_Item *it,
5177 Eina_Bool engine_only)
5179 elm_widget_item_cursor_engine_only_set(it, engine_only);
5183 elm_genlist_item_cursor_engine_only_get(const Elm_Object_Item *it)
5185 return elm_widget_item_cursor_engine_only_get(it);
5189 elm_genlist_item_index_get(const Elm_Object_Item *it)
5191 ELM_OBJ_ITEM_CHECK_OR_RETURN(it, -1);
5192 Elm_Gen_Item *_it = (Elm_Gen_Item *) it;
5194 if (_it->item->block)
5195 return _it->position + _it->item->block->position;
5200 elm_genlist_mode_set(Evas_Object *obj,
5203 ELM_CHECK_WIDTYPE(obj, widtype);
5204 Widget_Data *wd = elm_widget_data_get(obj);
5206 if (wd->mode == mode) return;
5212 elm_genlist_horizontal_set(Evas_Object *obj,
5215 elm_genlist_mode_set(obj, mode);
5219 elm_genlist_horizontal_mode_set(Evas_Object *obj,
5222 elm_genlist_mode_set(obj, mode);
5226 elm_genlist_mode_get(const Evas_Object *obj)
5228 ELM_CHECK_WIDTYPE(obj, widtype) ELM_LIST_LAST;
5229 Widget_Data *wd = elm_widget_data_get(obj);
5230 if (!wd) return ELM_LIST_LAST;
5234 EINA_DEPRECATED EAPI Elm_List_Mode
5235 elm_genlist_horizontal_get(const Evas_Object *obj)
5237 return elm_genlist_mode_get(obj);
5240 EINA_DEPRECATED EAPI Elm_List_Mode
5241 elm_genlist_horizontal_mode_get(const Evas_Object *obj)
5243 return elm_genlist_mode_get(obj);
5247 elm_genlist_always_select_mode_set(Evas_Object *obj,
5248 Eina_Bool always_select)
5250 ELM_CHECK_WIDTYPE(obj, widtype);
5251 Widget_Data *wd = elm_widget_data_get(obj);
5253 wd->always_select = !!always_select;
5257 elm_genlist_always_select_mode_get(const Evas_Object *obj)
5259 ELM_CHECK_WIDTYPE(obj, widtype) EINA_FALSE;
5260 Widget_Data *wd = elm_widget_data_get(obj);
5261 if (!wd) return EINA_FALSE;
5262 return wd->always_select;
5266 elm_genlist_no_select_mode_set(Evas_Object *obj,
5267 Eina_Bool no_select)
5269 ELM_CHECK_WIDTYPE(obj, widtype);
5270 Widget_Data *wd = elm_widget_data_get(obj);
5272 wd->no_select = !!no_select;
5276 elm_genlist_no_select_mode_get(const Evas_Object *obj)
5278 ELM_CHECK_WIDTYPE(obj, widtype) EINA_FALSE;
5279 Widget_Data *wd = elm_widget_data_get(obj);
5280 if (!wd) return EINA_FALSE;
5281 return wd->no_select;
5285 elm_genlist_compress_mode_set(Evas_Object *obj,
5288 ELM_CHECK_WIDTYPE(obj, widtype);
5289 Widget_Data *wd = elm_widget_data_get(obj);
5291 wd->compress = !!compress;
5292 if (!compress) elm_genlist_homogeneous_set(obj, EINA_FALSE);
5296 elm_genlist_compress_mode_get(const Evas_Object *obj)
5298 ELM_CHECK_WIDTYPE(obj, widtype) EINA_FALSE;
5299 Widget_Data *wd = elm_widget_data_get(obj);
5300 if (!wd) return EINA_FALSE;
5301 return wd->compress;
5305 elm_genlist_height_for_width_mode_set(Evas_Object *obj,
5306 Eina_Bool height_for_width)
5308 ELM_CHECK_WIDTYPE(obj, widtype);
5309 Widget_Data *wd = elm_widget_data_get(obj);
5311 wd->height_for_width = !!height_for_width;
5312 if (wd->height_for_width)
5314 elm_genlist_homogeneous_set(obj, EINA_FALSE);
5315 elm_genlist_compress_mode_set(obj, EINA_TRUE);
5320 elm_genlist_height_for_width_mode_get(const Evas_Object *obj)
5322 ELM_CHECK_WIDTYPE(obj, widtype) EINA_FALSE;
5323 Widget_Data *wd = elm_widget_data_get(obj);
5324 if (!wd) return EINA_FALSE;
5325 return wd->height_for_width;
5329 elm_genlist_bounce_set(Evas_Object *obj,
5333 ELM_CHECK_WIDTYPE(obj, widtype);
5334 Widget_Data *wd = elm_widget_data_get(obj);
5336 wd->h_bounce = !!h_bounce;
5337 wd->v_bounce = !!v_bounce;
5338 elm_smart_scroller_bounce_allow_set(wd->scr, wd->h_bounce, wd->v_bounce);
5342 elm_genlist_bounce_get(const Evas_Object *obj,
5343 Eina_Bool *h_bounce,
5344 Eina_Bool *v_bounce)
5346 ELM_CHECK_WIDTYPE(obj, widtype);
5347 Widget_Data *wd = elm_widget_data_get(obj);
5349 if (h_bounce) *h_bounce = wd->h_bounce;
5350 if (v_bounce) *v_bounce = wd->v_bounce;
5354 elm_genlist_homogeneous_set(Evas_Object *obj,
5355 Eina_Bool homogeneous)
5357 ELM_CHECK_WIDTYPE(obj, widtype);
5358 Widget_Data *wd = elm_widget_data_get(obj);
5360 if (homogeneous) elm_genlist_compress_mode_set(obj, EINA_TRUE);
5361 wd->homogeneous = !!homogeneous;
5365 elm_genlist_homogeneous_get(const Evas_Object *obj)
5367 ELM_CHECK_WIDTYPE(obj, widtype) EINA_FALSE;
5368 Widget_Data *wd = elm_widget_data_get(obj);
5369 if (!wd) return EINA_FALSE;
5370 return wd->homogeneous;
5374 elm_genlist_block_count_set(Evas_Object *obj,
5377 ELM_CHECK_WIDTYPE(obj, widtype);
5378 Widget_Data *wd = elm_widget_data_get(obj);
5380 wd->max_items_per_block = count;
5381 wd->item_cache_max = wd->max_items_per_block * 2;
5382 _item_cache_clean(wd);
5386 elm_genlist_block_count_get(const Evas_Object *obj)
5388 ELM_CHECK_WIDTYPE(obj, widtype) 0;
5389 Widget_Data *wd = elm_widget_data_get(obj);
5391 return wd->max_items_per_block;
5395 elm_genlist_longpress_timeout_set(Evas_Object *obj,
5398 ELM_CHECK_WIDTYPE(obj, widtype);
5399 Widget_Data *wd = elm_widget_data_get(obj);
5401 wd->longpress_timeout = timeout;
5405 elm_genlist_longpress_timeout_get(const Evas_Object *obj)
5407 ELM_CHECK_WIDTYPE(obj, widtype) 0;
5408 Widget_Data *wd = elm_widget_data_get(obj);
5410 return wd->longpress_timeout;
5414 elm_genlist_scroller_policy_set(Evas_Object *obj,
5415 Elm_Scroller_Policy policy_h,
5416 Elm_Scroller_Policy policy_v)
5418 ELM_CHECK_WIDTYPE(obj, widtype);
5419 Widget_Data *wd = elm_widget_data_get(obj);
5420 if ((!wd) || (!wd->scr)) return;
5421 if ((policy_h >= ELM_SCROLLER_POLICY_LAST) ||
5422 (policy_v >= ELM_SCROLLER_POLICY_LAST))
5424 elm_smart_scroller_policy_set(wd->scr, policy_h, policy_v);
5428 elm_genlist_scroller_policy_get(const Evas_Object *obj,
5429 Elm_Scroller_Policy *policy_h,
5430 Elm_Scroller_Policy *policy_v)
5432 ELM_CHECK_WIDTYPE(obj, widtype);
5433 Widget_Data *wd = elm_widget_data_get(obj);
5434 Elm_Smart_Scroller_Policy s_policy_h, s_policy_v;
5435 if ((!wd) || (!wd->scr)) return;
5436 elm_smart_scroller_policy_get(wd->scr, &s_policy_h, &s_policy_v);
5437 if (policy_h) *policy_h = (Elm_Scroller_Policy)s_policy_h;
5438 if (policy_v) *policy_v = (Elm_Scroller_Policy)s_policy_v;
5442 elm_genlist_realized_items_update(Evas_Object *obj)
5444 ELM_CHECK_WIDTYPE(obj, widtype);
5446 Eina_List *list, *l;
5447 Elm_Object_Item *it;
5449 list = elm_genlist_realized_items_get(obj);
5450 EINA_LIST_FOREACH(list, l, it)
5451 elm_genlist_item_update(it);
5455 elm_genlist_item_mode_set(Elm_Object_Item *it,
5456 const char *mode_type,
5459 ELM_OBJ_ITEM_CHECK_OR_RETURN(it);
5460 Elm_Gen_Item *_it = (Elm_Gen_Item *) it;
5462 Widget_Data *wd = _it->wd;
5464 Elm_Object_Item *it2;
5467 if (!mode_type) return;
5468 if ((_it->generation < _it->wd->generation) ||
5469 elm_widget_item_disabled_get(_it)) return;
5470 if (wd->edit_mode) return;
5472 if ((wd->mode_item == _it) &&
5473 (!strcmp(mode_type, wd->mode_type)) &&
5476 if (!_it->itc->mode_item_style) return;
5477 _it->mode_set = mode_set;
5481 EINA_LIST_FOREACH(wd->selected, l, it2)
5482 if (((Elm_Gen_Item *) it2)->realized)
5483 elm_genlist_item_selected_set(it2, EINA_FALSE);
5487 it2 = elm_genlist_selected_item_get(wd->obj);
5488 if ((it2) && (((Elm_Gen_Item *) it2)->realized))
5489 elm_genlist_item_selected_set(it2, EINA_FALSE);
5492 if (((wd->mode_type) && (strcmp(mode_type, wd->mode_type))) ||
5494 ((_it == wd->mode_item) && (!mode_set)))
5495 _item_mode_unset(wd);
5497 eina_stringshare_replace(&wd->mode_type, mode_type);
5498 if (mode_set) _item_mode_set(_it);
5502 elm_genlist_mode_item_style_get(const Evas_Object *obj)
5504 ELM_CHECK_WIDTYPE(obj, widtype) NULL;
5505 Widget_Data *wd = elm_widget_data_get(obj);
5506 if (!wd) return NULL;
5507 return wd->mode_item->itc->mode_item_style;
5511 elm_genlist_mode_item_style_set(Evas_Object *obj, const char *style)
5513 ELM_CHECK_WIDTYPE(obj, widtype);
5514 Widget_Data *wd = elm_widget_data_get(obj);
5516 if ((style == wd->mode_item->itc->mode_item_style) ||
5517 (style && wd->mode_item->itc->mode_item_style &&
5518 (!strcmp(style, wd->mode_item->itc->mode_item_style))))
5520 eina_stringshare_replace((const char**)&wd->mode_item->itc->mode_item_style, style);
5521 elm_genlist_realized_items_update(obj);
5525 elm_genlist_mode_type_get(const Evas_Object *obj)
5527 ELM_CHECK_WIDTYPE(obj, widtype) NULL;
5528 Widget_Data *wd = elm_widget_data_get(obj);
5529 if (!wd) return NULL;
5530 return wd->mode_type;
5533 EAPI const Elm_Object_Item *
5534 elm_genlist_mode_item_get(const Evas_Object *obj)
5536 ELM_CHECK_WIDTYPE(obj, widtype) NULL;
5537 Widget_Data *wd = elm_widget_data_get(obj);
5538 if (!wd) return NULL;
5539 return (Elm_Object_Item *) wd->mode_item;
5543 elm_genlist_edit_mode_get(const Evas_Object *obj)
5545 ELM_CHECK_WIDTYPE(obj, widtype) EINA_FALSE;
5546 Widget_Data *wd = elm_widget_data_get(obj);
5547 if (!wd) return EINA_FALSE;
5549 return wd->edit_mode;
5553 elm_genlist_edit_mode_set(Evas_Object *obj, Eina_Bool edit_mode)
5555 ELM_CHECK_WIDTYPE(obj, widtype);
5556 Eina_List *list, *l;
5559 Widget_Data *wd = elm_widget_data_get(obj);
5561 edit_mode = !!edit_mode;
5562 if (wd->edit_mode == edit_mode) return;
5564 list = elm_genlist_realized_items_get(obj);
5567 EINA_LIST_FOREACH(list, l, it)
5569 if (it->item->flags != ELM_GENLIST_ITEM_GROUP)
5570 _edit_mode_item_unrealize(it);
5572 _item_cache_zero(wd);
5576 EINA_LIST_FOREACH(list, l, it)
5578 if (it->item->flags != ELM_GENLIST_ITEM_GROUP)
5580 if (it->selected) _item_unselect(it);
5581 if (it->itc->edit_item_style)
5582 _edit_mode_item_realize(it, EINA_TRUE);
5586 if (wd->calc_job) ecore_job_del(wd->calc_job);
5587 wd->calc_job = ecore_job_add(_calc_job, wd);
5591 elm_genlist_reorder_mode_set(Evas_Object *obj,
5592 Eina_Bool reorder_mode)
5594 ELM_CHECK_WIDTYPE(obj, widtype);
5595 Widget_Data *wd = elm_widget_data_get(obj);
5597 wd->reorder_mode = !!reorder_mode;
5601 elm_genlist_reorder_mode_get(const Evas_Object *obj)
5603 ELM_CHECK_WIDTYPE(obj, widtype) EINA_FALSE;
5604 Widget_Data *wd = elm_widget_data_get(obj);
5605 if (!wd) return EINA_FALSE;
5606 return wd->reorder_mode;
5609 EAPI Elm_Genlist_Item_Flags
5610 elm_genlist_item_flags_get(const Elm_Object_Item *it)
5612 ELM_OBJ_ITEM_CHECK_OR_RETURN(it, ELM_GENLIST_ITEM_MAX);
5613 Elm_Gen_Item *_it = (Elm_Gen_Item *) it;
5614 return _it->item->flags;
5617 EAPI Elm_Genlist_Item_Class *
5618 elm_genlist_item_class_new(void)
5620 Elm_Genlist_Item_Class *itc;
5622 itc = calloc(1, sizeof(Elm_Genlist_Item_Class));
5625 itc->version = ELM_GENLIST_ITEM_CLASS_VERSION;
5627 itc->delete_me = EINA_FALSE;
5633 elm_genlist_item_class_free(Elm_Genlist_Item_Class *itc)
5635 if (itc && (itc->version == ELM_GENLIST_ITEM_CLASS_VERSION))
5637 if (!itc->delete_me) itc->delete_me = EINA_TRUE;
5638 if (itc->refcount > 0) elm_genlist_item_class_unref(itc);
5648 elm_genlist_item_class_ref(Elm_Genlist_Item_Class *itc)
5650 if (itc && (itc->version == ELM_GENLIST_ITEM_CLASS_VERSION))
5653 if (itc->refcount == 0) itc->refcount--;
5658 elm_genlist_item_class_unref(Elm_Genlist_Item_Class *itc)
5660 if (itc && (itc->version == ELM_GENLIST_ITEM_CLASS_VERSION))
5662 if (itc->refcount > 0) itc->refcount--;
5663 if (itc->delete_me && (!itc->refcount))
5664 elm_genlist_item_class_free(itc);
5668 /* for gengrid as of now */
5670 _elm_genlist_page_relative_set(Evas_Object *obj,
5674 Evas_Coord pagesize_h;
5675 Evas_Coord pagesize_v;
5677 ELM_CHECK_WIDTYPE(obj, widtype);
5678 Widget_Data *wd = elm_widget_data_get(obj);
5681 elm_smart_scroller_paging_get(wd->scr, NULL, NULL, &pagesize_h, &pagesize_v);
5682 elm_smart_scroller_paging_set(wd->scr, h_pagerel, v_pagerel, pagesize_h,
5686 /* for gengrid as of now */
5688 _elm_genlist_page_relative_get(const Evas_Object *obj,
5692 ELM_CHECK_WIDTYPE(obj, widtype);
5693 Widget_Data *wd = elm_widget_data_get(obj);
5696 elm_smart_scroller_paging_get(wd->scr, h_pagerel, v_pagerel, NULL, NULL);
5699 /* for gengrid as of now */
5701 _elm_genlist_page_size_set(Evas_Object *obj,
5702 Evas_Coord h_pagesize,
5703 Evas_Coord v_pagesize)
5708 ELM_CHECK_WIDTYPE(obj, widtype);
5709 Widget_Data *wd = elm_widget_data_get(obj);
5711 elm_smart_scroller_paging_get(wd->scr, &pagerel_h, &pagerel_v, NULL, NULL);
5712 elm_smart_scroller_paging_set(wd->scr, pagerel_h, pagerel_v, h_pagesize,
5716 /* for gengrid as of now */
5718 _elm_genlist_current_page_get(const Evas_Object *obj,
5722 ELM_CHECK_WIDTYPE(obj, widtype);
5723 Widget_Data *wd = elm_widget_data_get(obj);
5726 elm_smart_scroller_current_page_get(wd->scr, h_pagenumber, v_pagenumber);
5729 /* for gengrid as of now */
5731 _elm_genlist_last_page_get(const Evas_Object *obj,
5735 ELM_CHECK_WIDTYPE(obj, widtype);
5736 Widget_Data *wd = elm_widget_data_get(obj);
5739 elm_smart_scroller_last_page_get(wd->scr, h_pagenumber, v_pagenumber);
5742 /* for gengrid as of now */
5744 _elm_genlist_page_show(const Evas_Object *obj,
5748 ELM_CHECK_WIDTYPE(obj, widtype);
5749 Widget_Data *wd = elm_widget_data_get(obj);
5752 elm_smart_scroller_page_show(wd->scr, h_pagenumber, v_pagenumber);
5755 /* for gengrid as of now */
5757 _elm_genlist_page_bring_in(const Evas_Object *obj,
5761 ELM_CHECK_WIDTYPE(obj, widtype);
5762 Widget_Data *wd = elm_widget_data_get(obj);
5765 elm_smart_scroller_page_bring_in(wd->scr, h_pagenumber, v_pagenumber);
5769 _elm_genlist_item_unrealize(Elm_Gen_Item *it,
5772 Evas_Object *content;
5774 if (!it->realized) return;
5775 if (it->wd->reorder_it == it) return;
5777 evas_event_freeze(evas_object_evas_get(WIDGET(it)));
5779 evas_object_smart_callback_call(WIDGET(it), SIG_UNREALIZED, it);
5782 ecore_timer_del(it->long_timer);
5783 it->long_timer = NULL;
5786 elm_widget_stringlist_free(it->texts);
5788 elm_widget_stringlist_free(it->contents);
5789 it->contents = NULL;
5790 elm_widget_stringlist_free(it->states);
5793 EINA_LIST_FREE(it->content_objs, content)
5794 evas_object_del(content);
5796 it->unrealize_cb(it);
5798 it->realized = EINA_FALSE;
5799 it->want_unrealize = EINA_FALSE;
5800 evas_event_thaw(evas_object_evas_get(WIDGET(it)));
5801 evas_event_thaw_eval(evas_object_evas_get(WIDGET(it)));
5805 _elm_genlist_item_del_notserious(Elm_Gen_Item *it)
5807 elm_widget_item_pre_notify_del(it);
5808 it->generation = it->wd->generation - 1; /* This means that the item is deleted */
5809 if (it->selected) it->wd->selected = eina_list_remove(it->wd->selected, it);
5811 if (it->itc->func.del)
5812 it->itc->func.del((void *)it->base.data, WIDGET(it));
5816 _elm_genlist_item_del_serious(Elm_Gen_Item *it)
5818 _elm_genlist_item_del_notserious(it);
5819 it->wd->items = eina_inlist_remove(it->wd->items, EINA_INLIST_GET(it));
5820 if (it->tooltip.del_cb)
5821 it->tooltip.del_cb((void *)it->tooltip.data, WIDGET(it), it);
5822 it->wd->walking -= it->walking;
5823 if (it->long_timer) ecore_timer_del(it->long_timer);
5825 it->wd->group_items = eina_list_remove(it->wd->group_items, it);
5829 eina_inlist_sorted_state_free(it->wd->state);
5830 it->wd->state = NULL;
5832 if (it->wd->calc_job) ecore_job_del(it->wd->calc_job);
5833 it->wd->calc_job = ecore_job_add(it->wd->calc_cb, it->wd);
5837 if (it->wd->last_selected_item == (Elm_Object_Item *) it)
5838 it->wd->last_selected_item = NULL;
5839 it->wd->item_count--;