3 #include <Elementary.h>
4 #include <Elementary_Cursor.h>
6 #include "els_scroller.h"
7 #include "elm_gen_common.h"
9 // internally allocated
10 #define CLASS_ALLOCATED 0x3a70f11f
12 #define MAX_ITEMS_PER_BLOCK 32
13 #define REORDER_EFFECT_TIME 0.5
15 #define ELM_GEN_SETUP(wd) \
16 (wd)->calc_cb = (Ecore_Cb)_calc_job; \
17 (wd)->clear_cb = (Ecore_Cb)_clear_cb; \
18 (wd)->sizing_cb = (Ecore_Cb)_sizing_eval
20 #define ELM_GEN_ITEM_SETUP(it) \
21 (it)->del_cb = (Ecore_Cb)_item_del; \
22 (it)->highlight_cb = (Ecore_Cb)_item_highlight; \
23 (it)->unsel_cb = (Ecore_Cb)_item_unselect; \
24 (it)->unhighlight_cb = (Ecore_Cb)_item_unhighlight; \
25 (it)->unrealize_cb = (Ecore_Cb)_item_unrealize_cb
27 #define ELM_GENLIST_CHECK_ITC_VER(itc) \
32 ERR("Genlist_Item_Class(itc) is NULL"); \
35 if ((itc->version != ELM_GENLIST_ITEM_CLASS_VERSION) && \
36 (itc->version != CLASS_ALLOCATED)) \
38 ERR("Genlist_Item_Class version mismatched! current = (%d), required = (%d) or (%d)", itc->version, ELM_GENLIST_ITEM_CLASS_VERSION, CLASS_ALLOCATED); \
44 typedef struct _Item_Block Item_Block;
45 typedef struct _Item_Cache Item_Cache;
47 struct Elm_Gen_Item_Type
52 Evas_Coord w, h, minw, minh;
53 Elm_Gen_Item *group_item;
54 Elm_Genlist_Item_Type type;
55 Eina_List *mode_texts, *mode_contents, *mode_states, *mode_content_objs;
56 Eina_List *deco_texts, *deco_contents, *deco_states, *deco_content_objs;
57 Ecore_Timer *swipe_timer;
58 Evas_Coord scrl_x, scrl_y, old_scrl_y;
61 Evas_Object *mode_view;
67 Eina_Bool want_realize : 1;
68 Eina_Bool expanded : 1;
69 Eina_Bool mincalcd : 1;
72 Eina_Bool updateme : 1;
73 Eina_Bool nocache : 1; /* do not use cache for this item */
74 Eina_Bool nocache_once : 1; /* do not use cache for this item only once */
75 Eina_Bool stacking_even : 1;
76 Eina_Bool nostacking : 1;
77 Eina_Bool move_effect_enabled : 1;
78 Eina_Bool decorate_mode_item_realized : 1;
79 Eina_Bool tree_effect_finished : 1; /* tree effect */
80 Eina_Bool tree_effect_hideme : 1; /* item hide for tree effect */
91 Evas_Coord x, y, w, h, minw, minh;
93 int item_position_stamp;
95 Eina_Bool position_update : 1;
96 Eina_Bool want_unrealize : 1;
97 Eina_Bool realized : 1;
98 Eina_Bool changed : 1;
99 Eina_Bool updateme : 1;
100 Eina_Bool showme : 1;
101 Eina_Bool must_recalc : 1;
108 Evas_Object *base_view, *spacer;
110 const char *item_style; // it->itc->item_style
111 Eina_Bool tree : 1; // it->group
113 Eina_Bool selected : 1; // it->selected
114 Eina_Bool disabled : 1; // it->disabled
115 Eina_Bool expanded : 1; // it->item->expanded
118 static const char *widtype = NULL;
119 static void _item_cache_zero(Widget_Data *wd);
120 static void _del_hook(Evas_Object *obj);
121 static void _mirrored_set(Evas_Object *obj,
123 static void _theme_hook(Evas_Object *obj);
124 static void _show_region_hook(void *data,
126 static void _sizing_eval(Evas_Object *obj);
127 static void _item_realize(Elm_Gen_Item *it,
130 static void _item_unrealize_cb(Elm_Gen_Item *it);
131 static void _item_block_unrealize(Item_Block *itb);
132 static void _calc_job(void *data);
133 static void _on_focus_hook(void *data,
135 static Eina_Bool _item_multi_select_up(Widget_Data *wd);
136 static Eina_Bool _item_multi_select_down(Widget_Data *wd);
137 static Eina_Bool _item_single_select_up(Widget_Data *wd);
138 static Eina_Bool _item_single_select_down(Widget_Data *wd);
139 static Evas_Object * _item_content_unset_hook(Elm_Gen_Item *it, const char *part);
140 static Eina_Bool _event_hook(Evas_Object *obj,
142 Evas_Callback_Type type,
144 static void _signal_emit_hook(Evas_Object *obj,
145 const char *emission,
147 static Eina_Bool _deselect_all_items(Widget_Data *wd);
148 static void _pan_calculate(Evas_Object *obj);
149 static void _pan_max_get(Evas_Object *obj,
152 static void _item_position(Elm_Gen_Item *it,
156 static void _mode_item_realize(Elm_Gen_Item *it);
157 static void _mode_item_unrealize(Elm_Gen_Item *it);
158 static void _item_mode_set(Elm_Gen_Item *it);
159 static void _item_mode_unset(Widget_Data *wd);
160 static void _decorate_mode_item_position(Elm_Gen_Item *it, int itx, int ity);
161 static void _decorate_mode_item_realize(Elm_Gen_Item *it, Eina_Bool effect_on);
162 static void _decorate_mode_item_unrealize(Elm_Gen_Item *it);
163 static void _group_items_recalc(void *data);
164 static void _item_move_after(Elm_Gen_Item *it,
165 Elm_Gen_Item *after);
166 static void _item_move_before(Elm_Gen_Item *it,
167 Elm_Gen_Item *before);
168 static void _item_auto_scroll(Widget_Data *wd);
169 static void _elm_genlist_clear(Evas_Object *obj,
171 static void _pan_child_size_get(Evas_Object *obj,
174 static Evas_Object* _create_tray_alpha_bg(const Evas_Object *obj);
175 static void _item_contract_emit(Elm_Gen_Item *it);
176 static int _item_tree_effect_before(Elm_Gen_Item *it);
177 static void _item_tree_effect(Widget_Data *wd, int y);
178 static void _item_tree_effect_finish(Widget_Data *wd);
179 static Eina_Bool _tree_effect_animator_cb(void *data);
181 static Evas_Smart_Class _pan_sc = EVAS_SMART_CLASS_INIT_VERSION;
183 static const char SIG_ACTIVATED[] = "activated";
184 static const char SIG_CLICKED_DOUBLE[] = "clicked,double";
185 static const char SIG_SELECTED[] = "selected";
186 static const char SIG_UNSELECTED[] = "unselected";
187 static const char SIG_EXPANDED[] = "expanded";
188 static const char SIG_CONTRACTED[] = "contracted";
189 static const char SIG_EXPAND_REQUEST[] = "expand,request";
190 static const char SIG_CONTRACT_REQUEST[] = "contract,request";
191 static const char SIG_REALIZED[] = "realized";
192 static const char SIG_UNREALIZED[] = "unrealized";
193 static const char SIG_DRAG_START_UP[] = "drag,start,up";
194 static const char SIG_DRAG_START_DOWN[] = "drag,start,down";
195 static const char SIG_DRAG_START_LEFT[] = "drag,start,left";
196 static const char SIG_DRAG_START_RIGHT[] = "drag,start,right";
197 static const char SIG_DRAG_STOP[] = "drag,stop";
198 static const char SIG_DRAG[] = "drag";
199 static const char SIG_LONGPRESSED[] = "longpressed";
200 static const char SIG_SCROLL_ANIM_START[] = "scroll,anim,start";
201 static const char SIG_SCROLL_ANIM_STOP[] = "scroll,anim,stop";
202 static const char SIG_SCROLL_DRAG_START[] = "scroll,drag,start";
203 static const char SIG_SCROLL_DRAG_STOP[] = "scroll,drag,stop";
204 static const char SIG_EDGE_TOP[] = "edge,top";
205 static const char SIG_EDGE_BOTTOM[] = "edge,bottom";
206 static const char SIG_EDGE_LEFT[] = "edge,left";
207 static const char SIG_EDGE_RIGHT[] = "edge,right";
208 static const char SIG_MULTI_SWIPE_LEFT[] = "multi,swipe,left";
209 static const char SIG_MULTI_SWIPE_RIGHT[] = "multi,swipe,right";
210 static const char SIG_MULTI_SWIPE_UP[] = "multi,swipe,up";
211 static const char SIG_MULTI_SWIPE_DOWN[] = "multi,swipe,down";
212 static const char SIG_MULTI_PINCH_OUT[] = "multi,pinch,out";
213 static const char SIG_MULTI_PINCH_IN[] = "multi,pinch,in";
214 static const char SIG_SWIPE[] = "swipe";
215 static const char SIG_MOVED[] = "moved";
216 static const char SIG_MOVED_AFTER[] = "moved,after";
217 static const char SIG_MOVED_BEFORE[] = "moved,before";
218 static const char SIG_INDEX_UPDATE[] = "index,update";
219 static const char SIG_TREE_EFFECT_FINISHED [] = "tree,effect,finished";
221 static const Evas_Smart_Cb_Description _signals[] = {
222 {SIG_CLICKED_DOUBLE, ""},
225 {SIG_UNSELECTED, ""},
227 {SIG_CONTRACTED, ""},
228 {SIG_EXPAND_REQUEST, ""},
229 {SIG_CONTRACT_REQUEST, ""},
231 {SIG_UNREALIZED, ""},
232 {SIG_DRAG_START_UP, ""},
233 {SIG_DRAG_START_DOWN, ""},
234 {SIG_DRAG_START_LEFT, ""},
235 {SIG_DRAG_START_RIGHT, ""},
238 {SIG_LONGPRESSED, ""},
239 {SIG_SCROLL_ANIM_START, ""},
240 {SIG_SCROLL_ANIM_STOP, ""},
241 {SIG_SCROLL_DRAG_START, ""},
242 {SIG_SCROLL_DRAG_STOP, ""},
244 {SIG_EDGE_BOTTOM, ""},
246 {SIG_EDGE_RIGHT, ""},
247 {SIG_MULTI_SWIPE_LEFT, ""},
248 {SIG_MULTI_SWIPE_RIGHT, ""},
249 {SIG_MULTI_SWIPE_UP, ""},
250 {SIG_MULTI_SWIPE_DOWN, ""},
251 {SIG_MULTI_PINCH_OUT, ""},
252 {SIG_MULTI_PINCH_IN, ""},
255 {SIG_MOVED_AFTER, ""},
256 {SIG_MOVED_BEFORE, ""},
257 {SIG_TREE_EFFECT_FINISHED, ""},
262 #undef ELM_CHECK_WIDTYPE
263 #define ELM_CHECK_WIDTYPE(obj, widtype) \
264 if ((!obj) || (!elm_genlist_type_check((obj), __func__))) return
265 #undef ELM_WIDGET_ITEM_WIDTYPE_CHECK_OR_RETURN
266 #define ELM_WIDGET_ITEM_WIDTYPE_CHECK_OR_RETURN(it, ...) \
267 ELM_WIDGET_ITEM_CHECK_OR_RETURN((Elm_Widget_Item *)it, __VA_ARGS__); \
268 ELM_CHECK_WIDTYPE(WIDGET((it)), widtype) __VA_ARGS__;
270 static const char *_gengrid = NULL;
271 static const char *_genlist = NULL;
273 /* THIS FUNCTION IS HACKY AND TEMPORARY!!! */
275 elm_genlist_type_check(const Evas_Object *obj,
278 const char *provided, *expected = "(unknown)";
279 static int abort_on_warn = -1;
280 provided = elm_widget_type_get(obj);
281 if (!_genlist) _genlist = eina_stringshare_add("genlist");
282 if (!_gengrid) _gengrid = eina_stringshare_add("gengrid");
283 if (EINA_LIKELY(provided == _genlist) || EINA_LIKELY(provided == _gengrid))
285 if ((!provided) || (!provided[0]))
287 provided = evas_object_type_get(obj);
288 if ((!provided) || (!provided[0]))
289 provided = "(unknown)";
291 ERR("Passing Object: %p in function: %s, of type: '%s' when expecting type: '%s'", obj, func, provided, expected);
292 if (abort_on_warn == -1)
294 if (getenv("ELM_ERROR_ABORT")) abort_on_warn = 1;
295 else abort_on_warn = 0;
297 if (abort_on_warn == 1) abort();
302 _event_hook(Evas_Object *obj,
303 Evas_Object *src __UNUSED__,
304 Evas_Callback_Type type,
307 if (type != EVAS_CALLBACK_KEY_DOWN) return EINA_FALSE;
308 Evas_Event_Key_Down *ev = event_info;
309 Widget_Data *wd = elm_widget_data_get(obj);
310 Evas_Coord pan_max_x = 0, pan_max_y = 0;
311 if (!wd) return EINA_FALSE;
312 if (!wd->items) return EINA_FALSE;
313 if (ev->event_flags & EVAS_EVENT_FLAG_ON_HOLD) return EINA_FALSE;
314 if (elm_widget_disabled_get(obj)) return EINA_FALSE;
316 Elm_Object_Item *it = NULL;
319 Evas_Coord step_x = 0;
320 Evas_Coord step_y = 0;
323 Evas_Coord page_x = 0;
324 Evas_Coord page_y = 0;
326 elm_smart_scroller_child_pos_get(wd->scr, &x, &y);
327 elm_smart_scroller_step_size_get(wd->scr, &step_x, &step_y);
328 elm_smart_scroller_page_size_get(wd->scr, &page_x, &page_y);
329 elm_smart_scroller_child_viewport_size_get(wd->scr, &v_w, &v_h);
331 if ((!strcmp(ev->keyname, "Left")) || (!strcmp(ev->keyname, "KP_Left")))
335 else if ((!strcmp(ev->keyname, "Right")) || (!strcmp(ev->keyname, "KP_Right")))
339 else if ((!strcmp(ev->keyname, "Up")) || (!strcmp(ev->keyname, "KP_Up")))
341 if (((evas_key_modifier_is_set(ev->modifiers, "Shift")) &&
342 (_item_multi_select_up(wd)))
343 || (_item_single_select_up(wd)))
345 ev->event_flags |= EVAS_EVENT_FLAG_ON_HOLD;
351 else if ((!strcmp(ev->keyname, "Down")) || (!strcmp(ev->keyname, "KP_Down")))
353 if (((evas_key_modifier_is_set(ev->modifiers, "Shift")) &&
354 (_item_multi_select_down(wd)))
355 || (_item_single_select_down(wd)))
357 ev->event_flags |= EVAS_EVENT_FLAG_ON_HOLD;
363 else if ((!strcmp(ev->keyname, "Home")) || (!strcmp(ev->keyname, "KP_Home")))
365 it = elm_genlist_first_item_get(obj);
366 elm_genlist_item_bring_in(it, ELM_GENLIST_ITEM_SCROLLTO_IN);
367 elm_genlist_item_selected_set(it, EINA_TRUE);
368 ev->event_flags |= EVAS_EVENT_FLAG_ON_HOLD;
371 else if ((!strcmp(ev->keyname, "End")) || (!strcmp(ev->keyname, "KP_End")))
373 it = elm_genlist_last_item_get(obj);
374 elm_genlist_item_bring_in(it, ELM_GENLIST_ITEM_SCROLLTO_IN);
375 elm_genlist_item_selected_set(it, EINA_TRUE);
376 ev->event_flags |= EVAS_EVENT_FLAG_ON_HOLD;
379 else if ((!strcmp(ev->keyname, "Prior")) || (!strcmp(ev->keyname, "KP_Prior")))
382 y -= -(page_y * v_h) / 100;
386 else if ((!strcmp(ev->keyname, "Next")) || (!strcmp(ev->keyname, "KP_Next")))
389 y += -(page_y * v_h) / 100;
393 else if (!strcmp(ev->keyname, "Escape"))
395 if (!_deselect_all_items(wd)) return EINA_FALSE;
396 ev->event_flags |= EVAS_EVENT_FLAG_ON_HOLD;
399 else if (((!strcmp(ev->keyname, "Return")) ||
400 (!strcmp(ev->keyname, "KP_Enter")) ||
401 (!strcmp(ev->keyname, "space")))
402 && (!wd->multi) && (wd->selected))
404 it = elm_genlist_selected_item_get(obj);
405 elm_genlist_item_expanded_set(it,
406 !elm_genlist_item_expanded_get(it));
407 evas_object_smart_callback_call(WIDGET(it), SIG_ACTIVATED, it);
409 else return EINA_FALSE;
411 ev->event_flags |= EVAS_EVENT_FLAG_ON_HOLD;
412 _pan_max_get(wd->pan_smart, &pan_max_x, &pan_max_y);
414 if (x > pan_max_x) x = pan_max_x;
416 if (y > pan_max_y) y = pan_max_y;
417 elm_smart_scroller_child_pos_set(wd->scr, x, y);
422 _deselect_all_items(Widget_Data *wd)
424 if (!wd->selected) return EINA_FALSE;
426 elm_genlist_item_selected_set(wd->selected->data, EINA_FALSE);
432 _item_multi_select_up(Widget_Data *wd)
434 if (!wd->selected) return EINA_FALSE;
435 if (!wd->multi) return EINA_FALSE;
437 Elm_Object_Item *prev = elm_genlist_item_prev_get(wd->last_selected_item);
438 if (!prev) return EINA_TRUE;
440 if (elm_genlist_item_selected_get(prev))
442 elm_genlist_item_selected_set(wd->last_selected_item, EINA_FALSE);
443 wd->last_selected_item = prev;
444 elm_genlist_item_show(wd->last_selected_item, ELM_GENLIST_ITEM_SCROLLTO_IN);
448 elm_genlist_item_selected_set(prev, EINA_TRUE);
449 elm_genlist_item_show(prev, ELM_GENLIST_ITEM_SCROLLTO_IN);
455 _item_multi_select_down(Widget_Data *wd)
457 if (!wd->selected) return EINA_FALSE;
458 if (!wd->multi) return EINA_FALSE;
460 Elm_Object_Item *next;
461 next = elm_genlist_item_next_get(wd->last_selected_item);
462 if (!next) return EINA_TRUE;
464 if (elm_genlist_item_selected_get(next))
466 elm_genlist_item_selected_set(wd->last_selected_item, EINA_FALSE);
467 wd->last_selected_item = next;
468 elm_genlist_item_show(wd->last_selected_item, ELM_GENLIST_ITEM_SCROLLTO_IN);
472 elm_genlist_item_selected_set(next, EINA_TRUE);
473 elm_genlist_item_show(next, ELM_GENLIST_ITEM_SCROLLTO_IN);
479 _item_single_select_up(Widget_Data *wd)
484 prev = ELM_GEN_ITEM_FROM_INLIST(wd->items->last);
485 while ((prev) && (prev->generation < wd->generation))
486 prev = ELM_GEN_ITEM_FROM_INLIST(EINA_INLIST_GET(prev)->prev);
488 else prev = (Elm_Gen_Item *) elm_genlist_item_prev_get(wd->last_selected_item);
490 if (!prev) return EINA_FALSE;
492 _deselect_all_items(wd);
494 elm_genlist_item_selected_set((Elm_Object_Item *) prev, EINA_TRUE);
495 elm_genlist_item_show((Elm_Object_Item *) prev, ELM_GENLIST_ITEM_SCROLLTO_IN);
500 _item_single_select_down(Widget_Data *wd)
505 next = ELM_GEN_ITEM_FROM_INLIST(wd->items);
506 while ((next) && (next->generation < wd->generation))
507 next = ELM_GEN_ITEM_FROM_INLIST(EINA_INLIST_GET(next)->next);
509 else next = (Elm_Gen_Item *) elm_genlist_item_next_get(wd->last_selected_item);
511 if (!next) return EINA_FALSE;
513 _deselect_all_items(wd);
515 elm_genlist_item_selected_set((Elm_Object_Item *) next, EINA_TRUE);
516 elm_genlist_item_show((Elm_Object_Item *) next, ELM_GENLIST_ITEM_SCROLLTO_IN);
521 _on_focus_hook(void *data __UNUSED__,
524 Widget_Data *wd = elm_widget_data_get(obj);
526 if (elm_widget_focus_get(obj))
528 elm_object_signal_emit(wd->obj, "elm,action,focus", "elm");
529 evas_object_focus_set(wd->obj, EINA_TRUE);
530 if ((wd->selected) && (!wd->last_selected_item))
531 wd->last_selected_item = eina_list_data_get(wd->selected);
535 elm_object_signal_emit(wd->obj, "elm,action,unfocus", "elm");
536 evas_object_focus_set(wd->obj, EINA_FALSE);
541 _del_hook(Evas_Object *obj)
543 Widget_Data *wd = elm_widget_data_get(obj);
545 _item_cache_zero(wd);
546 if (wd->calc_job) ecore_job_del(wd->calc_job);
547 if (wd->update_job) ecore_job_del(wd->update_job);
548 if (wd->queue_idle_enterer) ecore_idle_enterer_del(wd->queue_idle_enterer);
549 if (wd->must_recalc_idler) ecore_idler_del(wd->must_recalc_idler);
550 if (wd->multi_timer) ecore_timer_del(wd->multi_timer);
551 if (wd->decorate_type) eina_stringshare_del(wd->decorate_type);
552 if (wd->scr_hold_timer) ecore_timer_del(wd->scr_hold_timer);
553 if (wd->tree_effect_animator) ecore_animator_del(wd->tree_effect_animator);
558 _del_pre_hook(Evas_Object *obj)
560 Widget_Data *wd = elm_widget_data_get(obj);
562 if (wd->decorate_mode) elm_genlist_decorate_mode_set(wd->obj, EINA_FALSE);
563 elm_genlist_clear(obj);
564 evas_object_del(wd->pan_smart);
565 wd->pan_smart = NULL;
569 _mirrored_set(Evas_Object *obj,
572 Widget_Data *wd = elm_widget_data_get(obj);
574 _item_cache_zero(wd);
575 elm_smart_scroller_mirrored_set(wd->scr, rtl);
579 _theme_hook(Evas_Object *obj)
581 Widget_Data *wd = elm_widget_data_get(obj);
584 evas_event_freeze(evas_object_evas_get(wd->obj));
585 _item_cache_zero(wd);
586 _elm_widget_mirrored_reload(obj);
587 _mirrored_set(obj, elm_widget_mirrored_get(obj));
588 elm_smart_scroller_object_theme_set(obj, wd->scr, "genlist", "base",
589 elm_widget_style_get(obj));
590 edje_object_scale_set(wd->scr, elm_widget_scale_get(obj) * _elm_config->scale);
591 wd->item_width = wd->item_height = 0;
592 wd->group_item_width = wd->group_item_height = 0;
593 wd->minw = wd->minh = wd->realminw = 0;
594 EINA_INLIST_FOREACH(wd->blocks, itb)
599 if (itb->realized) _item_block_unrealize(itb);
600 EINA_LIST_FOREACH(itb->items, l, it)
601 it->item->mincalcd = EINA_FALSE;
603 itb->changed = EINA_TRUE;
605 if (wd->calc_job) ecore_job_del(wd->calc_job);
606 wd->calc_job = ecore_job_add(_calc_job, wd);
608 evas_event_thaw(evas_object_evas_get(wd->obj));
609 evas_event_thaw_eval(evas_object_evas_get(wd->obj));
613 _show_region_hook(void *data,
616 Widget_Data *wd = elm_widget_data_get(data);
617 Evas_Coord x, y, w, h;
619 elm_widget_show_region_get(obj, &x, &y, &w, &h);
620 //x & y are screen coordinates, Add with pan coordinates
623 elm_smart_scroller_child_region_show(wd->scr, x, y, w, h);
627 _translate_hook(Evas_Object *obj)
629 evas_object_smart_callback_call(obj, "language,changed", NULL);
633 _sizing_eval(Evas_Object *obj)
635 Widget_Data *wd = elm_widget_data_get(obj);
636 Evas_Coord minw = -1, minh = -1, maxw = -1, maxh = -1;
637 Evas_Coord vmw = 0, vmh = 0;
640 evas_object_size_hint_min_get(wd->scr, &minw, NULL);
641 evas_object_size_hint_max_get(wd->scr, &maxw, &maxh);
643 edje_object_size_min_calc
644 (elm_smart_scroller_edje_object_get(wd->scr), &vmw, &vmh);
646 if (wd->mode == ELM_LIST_COMPRESS)
650 elm_smart_scroller_child_viewport_size_get(wd->scr, &vw, &vh);
651 if ((vw != 0) && (vw != wd->prev_viewport_w))
655 wd->prev_viewport_w = vw;
656 EINA_INLIST_FOREACH(wd->blocks, itb)
658 itb->must_recalc = EINA_TRUE;
660 if (wd->calc_job) ecore_job_del(wd->calc_job);
661 wd->calc_job = ecore_job_add(_calc_job, wd);
666 else if (wd->mode == ELM_LIST_LIMIT)
677 evas_object_size_hint_min_set(obj, minw, minh);
678 evas_object_size_hint_max_set(obj, maxw, maxh);
682 _signal_emit_hook(Evas_Object *obj,
683 const char *emission,
686 Widget_Data *wd = elm_widget_data_get(obj);
687 edje_object_signal_emit(elm_smart_scroller_edje_object_get(wd->scr),
692 _item_highlight(Elm_Gen_Item *it)
694 const char *selectraise;
695 if ((it->wd->select_mode == ELM_OBJECT_SELECT_MODE_NONE) ||
696 (!it->wd->highlight) ||
697 (it->generation < it->wd->generation) ||
698 (it->highlighted) || elm_widget_item_disabled_get(it) ||
699 (it->select_mode == ELM_OBJECT_SELECT_MODE_NONE) || (it->item->mode_view) ||
700 (it->select_mode == ELM_OBJECT_SELECT_MODE_DISPLAY_ONLY))
702 edje_object_signal_emit(VIEW(it), "elm,state,selected", "elm");
703 if (it->deco_obj) edje_object_signal_emit(it->deco_obj, "elm,state,selected", "elm");
704 selectraise = edje_object_data_get(VIEW(it), "selectraise");
705 if ((selectraise) && (!strcmp(selectraise, "on")))
707 if (it->deco_obj) evas_object_raise(it->deco_obj);
708 else evas_object_raise(VIEW(it));
709 if ((it->item->group_item) && (it->item->group_item->realized))
710 evas_object_raise(it->item->VIEW(group_item));
712 it->highlighted = EINA_TRUE;
716 _item_unhighlight(Elm_Gen_Item *it)
718 if ((it->generation < it->wd->generation) || (!it->highlighted)) return;
719 edje_object_signal_emit(VIEW(it), "elm,state,unselected", "elm");
720 if (it->deco_obj) edje_object_signal_emit(it->deco_obj, "elm,state,unselected", "elm");
721 if (!it->item->nostacking)
723 if ((it->item->order_num_in & 0x1) ^ it->item->stacking_even)
725 if (it->deco_obj) evas_object_lower(it->deco_obj);
726 else evas_object_lower(VIEW(it));
730 if (it->deco_obj) evas_object_raise(it->deco_obj);
731 else evas_object_raise(VIEW(it));
734 it->highlighted = EINA_FALSE;
738 _item_block_position_update(Eina_Inlist *list, int idx)
742 EINA_INLIST_FOREACH(list, tmp)
744 tmp->position = idx++;
745 tmp->position_update = EINA_TRUE;
750 _item_position_update(Eina_List *list, int idx)
755 EINA_LIST_FOREACH(list, l, it)
757 it->position = idx++;
758 it->position_update = EINA_TRUE;
763 _item_block_del(Elm_Gen_Item *it)
766 Item_Block *itb = it->item->block;
768 itb->items = eina_list_remove(itb->items, it);
770 itb->changed = EINA_TRUE;
771 if (it->wd->calc_job) ecore_job_del(it->wd->calc_job);
772 it->wd->calc_job = ecore_job_add(_calc_job, it->wd);
775 il = EINA_INLIST_GET(itb);
776 Item_Block *itbn = (Item_Block *)(il->next);
778 it->parent->item->items = eina_list_remove(it->parent->item->items, it);
781 _item_block_position_update(il->next, itb->position);
782 it->wd->blocks = eina_inlist_remove(it->wd->blocks, il);
785 if (itbn) itbn->changed = EINA_TRUE;
789 if (itb->count < itb->wd->max_items_per_block/2)
791 il = EINA_INLIST_GET(itb);
792 Item_Block *itbp = (Item_Block *)(il->prev);
793 Item_Block *itbn = (Item_Block *)(il->next);
794 if ((itbp) && ((itbp->count + itb->count) < itb->wd->max_items_per_block + itb->wd->max_items_per_block/2))
798 EINA_LIST_FREE(itb->items, it2)
800 it2->item->block = itbp;
801 itbp->items = eina_list_append(itbp->items, it2);
803 itbp->changed = EINA_TRUE;
805 _item_block_position_update(EINA_INLIST_GET(itb)->next,
807 it->wd->blocks = eina_inlist_remove(it->wd->blocks,
808 EINA_INLIST_GET(itb));
811 else if ((itbn) && ((itbn->count + itb->count) < itb->wd->max_items_per_block + itb->wd->max_items_per_block/2))
815 Eina_List *last = eina_list_last(itb->items);
816 Elm_Gen_Item *it2 = last->data;
818 it2->item->block = itbn;
819 itb->items = eina_list_remove_list(itb->items, last);
820 itbn->items = eina_list_prepend(itbn->items, it2);
822 itbn->changed = EINA_TRUE;
824 _item_block_position_update(EINA_INLIST_GET(itb)->next,
827 eina_inlist_remove(it->wd->blocks, EINA_INLIST_GET(itb));
835 _item_subitems_clear(Elm_Gen_Item *it)
837 ELM_OBJ_ITEM_CHECK_OR_RETURN(it);
838 Eina_List *tl = NULL, *l;
839 Elm_Object_Item *it2;
841 EINA_LIST_FOREACH(it->item->items, l, it2)
842 tl = eina_list_append(tl, it2);
843 EINA_LIST_FREE(tl, it2)
844 elm_object_item_del(it2);
848 _item_del(Elm_Gen_Item *it)
850 Evas_Object *obj = WIDGET(it);
852 evas_event_freeze(evas_object_evas_get(obj));
853 elm_genlist_item_subitems_clear((Elm_Object_Item *)it);
854 if (it->wd->show_item == it) it->wd->show_item = NULL;
855 if (it->realized) _elm_genlist_item_unrealize(it, EINA_FALSE);
856 if (it->item->decorate_mode_item_realized) _decorate_mode_item_unrealize(it);
857 if (it->item->block) _item_block_del(it);
858 if (it->item->queued)
859 it->wd->queue = eina_list_remove(it->wd->queue, it);
860 if (it->wd->anchor_item == it)
862 it->wd->anchor_item = ELM_GEN_ITEM_FROM_INLIST(EINA_INLIST_GET(it)->next);
863 if (!it->wd->anchor_item)
864 it->wd->anchor_item = ELM_GEN_ITEM_FROM_INLIST(EINA_INLIST_GET(it)->prev);
866 if (it->wd->expanded_item == it) it->wd->expanded_item = NULL;
867 if (it->wd->expanded_next_item == it) it->wd->expanded_next_item = NULL;
869 it->parent->item->items = eina_list_remove(it->parent->item->items, it);
870 if (it->item->swipe_timer)
872 ecore_timer_del(it->item->swipe_timer);
873 it->item->swipe_timer = NULL;
875 _elm_genlist_item_del_serious(it);
876 elm_genlist_item_class_unref((Elm_Genlist_Item_Class *)it->itc);
877 evas_event_thaw(evas_object_evas_get(obj));
878 evas_event_thaw_eval(evas_object_evas_get(obj));
882 _clear_cb(Widget_Data *wd)
884 wd->anchor_item = NULL;
887 Item_Block *itb = (Item_Block *)(wd->blocks);
889 wd->blocks = eina_inlist_remove(wd->blocks, wd->blocks);
890 if (itb->items) eina_list_free(itb->items);
893 if (wd->queue_idle_enterer)
895 ecore_idle_enterer_del(wd->queue_idle_enterer);
896 wd->queue_idle_enterer = NULL;
898 if (wd->must_recalc_idler)
900 ecore_idler_del(wd->must_recalc_idler);
901 wd->must_recalc_idler = NULL;
903 if (wd->queue) wd->queue = eina_list_free(wd->queue);
904 if (wd->reorder_move_animator)
906 ecore_animator_del(wd->reorder_move_animator);
907 wd->reorder_move_animator = NULL;
909 wd->show_item = NULL;
910 wd->reorder_old_pan_y = 0;
914 _item_unselect(Elm_Gen_Item *it)
916 if ((it->generation < it->wd->generation) || (!it->selected)) return;
917 it->selected = EINA_FALSE;
918 it->wd->selected = eina_list_remove(it->wd->selected, it);
919 evas_object_smart_callback_call(WIDGET(it), SIG_UNSELECTED, it);
923 _mouse_move(void *data,
924 Evas *evas __UNUSED__,
928 Elm_Gen_Item *it = data;
929 Evas_Event_Mouse_Move *ev = event_info;
930 Evas_Coord minw = 0, minh = 0, x, y, dx, dy, adx, ady;
931 Evas_Coord ox, oy, ow, oh, it_scrl_y, y_pos;
933 if (ev->event_flags & EVAS_EVENT_FLAG_ON_HOLD)
935 if (!it->wd->on_hold)
937 it->wd->on_hold = EINA_TRUE;
938 if ((!it->wd->wasselected) && (!it->flipped))
940 _item_unhighlight(it);
945 if (it->wd->multitouched)
947 it->wd->cur_x = ev->cur.canvas.x;
948 it->wd->cur_y = ev->cur.canvas.y;
951 if ((it->dragging) && (it->down))
953 if (it->wd->movements == SWIPE_MOVES) it->wd->swipe = EINA_TRUE;
956 it->wd->history[it->wd->movements].x = ev->cur.canvas.x;
957 it->wd->history[it->wd->movements].y = ev->cur.canvas.y;
958 if (abs((it->wd->history[it->wd->movements].x -
959 it->wd->history[0].x)) > 40)
960 it->wd->swipe = EINA_TRUE;
966 ecore_timer_del(it->long_timer);
967 it->long_timer = NULL;
969 evas_object_smart_callback_call(WIDGET(it), SIG_DRAG, it);
972 if ((!it->down) /* || (it->wd->on_hold)*/ || (it->wd->longpressed))
976 ecore_timer_del(it->long_timer);
977 it->long_timer = NULL;
979 if ((it->wd->reorder_mode) && (it->wd->reorder_it))
981 evas_object_geometry_get(it->wd->pan_smart, &ox, &oy, &ow, &oh);
982 it_scrl_y = ev->cur.canvas.y - it->wd->reorder_it->dy;
984 if (!it->wd->reorder_start_y)
985 it->wd->reorder_start_y = it->item->block->y + it->y;
989 else if (it_scrl_y + it->wd->reorder_it->item->h > oy + oh)
990 y_pos = oy + oh - it->wd->reorder_it->item->h;
995 _item_position(it, it->deco_obj, it->item->scrl_x, y_pos);
997 _item_position(it, VIEW(it), it->item->scrl_x, y_pos);
999 if (it->wd->calc_job) ecore_job_del(it->wd->calc_job);
1000 it->wd->calc_job = ecore_job_add(_calc_job, it->wd);
1004 if (it->select_mode != ELM_OBJECT_SELECT_MODE_DISPLAY_ONLY)
1005 elm_coords_finger_size_adjust(1, &minw, 1, &minh);
1006 evas_object_geometry_get(obj, &x, &y, NULL, NULL);
1007 x = ev->cur.canvas.x - x;
1008 y = ev->cur.canvas.y - y;
1011 if (adx < 0) adx = -dx;
1014 if (ady < 0) ady = -dy;
1017 if ((adx > minw) || (ady > minh))
1019 it->dragging = EINA_TRUE;
1022 ecore_timer_del(it->long_timer);
1023 it->long_timer = NULL;
1025 if (!it->wd->wasselected)
1027 _item_unhighlight(it);
1033 evas_object_smart_callback_call(WIDGET(it),
1034 SIG_DRAG_START_UP, it);
1038 evas_object_smart_callback_call(WIDGET(it),
1039 SIG_DRAG_START_LEFT, it);
1041 evas_object_smart_callback_call(WIDGET(it),
1042 SIG_DRAG_START_RIGHT, it);
1048 evas_object_smart_callback_call(WIDGET(it),
1049 SIG_DRAG_START_DOWN, it);
1053 evas_object_smart_callback_call(WIDGET(it),
1054 SIG_DRAG_START_LEFT, it);
1056 evas_object_smart_callback_call(WIDGET(it),
1057 SIG_DRAG_START_RIGHT, it);
1064 _long_press(void *data)
1066 Elm_Gen_Item *it = data, *it_tmp;
1067 Eina_List *list, *l;
1069 it->long_timer = NULL;
1070 if (elm_widget_item_disabled_get(it) || (it->dragging) ||
1071 (it->select_mode == ELM_OBJECT_SELECT_MODE_DISPLAY_ONLY))
1072 return ECORE_CALLBACK_CANCEL;
1073 it->wd->longpressed = EINA_TRUE;
1074 evas_object_smart_callback_call(WIDGET(it), SIG_LONGPRESSED, it);
1075 if ((it->wd->reorder_mode) && (!it->group))
1077 it->wd->reorder_it = it;
1078 it->wd->reorder_start_y = 0;
1080 evas_object_raise(it->deco_obj);
1082 evas_object_raise(VIEW(it));
1084 elm_smart_scroller_hold_set(it->wd->scr, EINA_TRUE);
1085 elm_smart_scroller_bounce_allow_set(it->wd->scr, EINA_FALSE, EINA_FALSE);
1087 list = elm_genlist_realized_items_get(it->wd->obj);
1088 EINA_LIST_FOREACH(list, l, it_tmp)
1090 if (it != it_tmp) _item_unselect(it_tmp);
1092 if (elm_genlist_item_expanded_get((Elm_Object_Item *)it))
1094 elm_genlist_item_expanded_set((Elm_Object_Item *)it, EINA_FALSE);
1095 return ECORE_CALLBACK_RENEW;
1098 if (!it->wd->decorate_mode)
1099 edje_object_signal_emit(VIEW(it), "elm,state,reorder,enabled", "elm");
1101 return ECORE_CALLBACK_CANCEL;
1105 _swipe(Elm_Gen_Item *it)
1110 if ((it->select_mode == ELM_OBJECT_SELECT_MODE_DISPLAY_ONLY) ||
1111 elm_widget_item_disabled_get(it)) return;
1112 it->wd->swipe = EINA_FALSE;
1113 for (i = 0; i < it->wd->movements; i++)
1115 sum += it->wd->history[i].x;
1116 if (abs(it->wd->history[0].y - it->wd->history[i].y) > 10) return;
1119 sum /= it->wd->movements;
1120 if (abs(sum - it->wd->history[0].x) <= 10) return;
1121 evas_object_smart_callback_call(WIDGET(it), SIG_SWIPE, it);
1125 _swipe_cancel(void *data)
1127 Elm_Gen_Item *it = data;
1129 if (!it) return ECORE_CALLBACK_CANCEL;
1130 it->wd->swipe = EINA_FALSE;
1131 it->wd->movements = 0;
1132 return ECORE_CALLBACK_RENEW;
1136 _multi_cancel(void *data)
1138 Widget_Data *wd = data;
1140 if (!wd) return ECORE_CALLBACK_CANCEL;
1141 wd->multi_timeout = EINA_TRUE;
1142 return ECORE_CALLBACK_RENEW;
1146 _multi_touch_gesture_eval(void *data)
1148 Elm_Gen_Item *it = data;
1150 it->wd->multitouched = EINA_FALSE;
1151 if (it->wd->multi_timer)
1153 ecore_timer_del(it->wd->multi_timer);
1154 it->wd->multi_timer = NULL;
1156 if (it->wd->multi_timeout)
1158 it->wd->multi_timeout = EINA_FALSE;
1162 Evas_Coord minw = 0, minh = 0;
1163 Evas_Coord off_x, off_y, off_mx, off_my;
1165 elm_coords_finger_size_adjust(1, &minw, 1, &minh);
1166 off_x = abs(it->wd->cur_x - it->wd->prev_x);
1167 off_y = abs(it->wd->cur_y - it->wd->prev_y);
1168 off_mx = abs(it->wd->cur_mx - it->wd->prev_mx);
1169 off_my = abs(it->wd->cur_my - it->wd->prev_my);
1171 if (((off_x > minw) || (off_y > minh)) && ((off_mx > minw) || (off_my > minh)))
1173 if ((off_x + off_mx) > (off_y + off_my))
1175 if ((it->wd->cur_x > it->wd->prev_x) && (it->wd->cur_mx > it->wd->prev_mx))
1176 evas_object_smart_callback_call(WIDGET(it),
1177 SIG_MULTI_SWIPE_RIGHT, it);
1178 else if ((it->wd->cur_x < it->wd->prev_x) && (it->wd->cur_mx < it->wd->prev_mx))
1179 evas_object_smart_callback_call(WIDGET(it),
1180 SIG_MULTI_SWIPE_LEFT, it);
1181 else if (abs(it->wd->cur_x - it->wd->cur_mx) > abs(it->wd->prev_x - it->wd->prev_mx))
1182 evas_object_smart_callback_call(WIDGET(it),
1183 SIG_MULTI_PINCH_OUT, it);
1185 evas_object_smart_callback_call(WIDGET(it),
1186 SIG_MULTI_PINCH_IN, it);
1190 if ((it->wd->cur_y > it->wd->prev_y) && (it->wd->cur_my > it->wd->prev_my))
1191 evas_object_smart_callback_call(WIDGET(it),
1192 SIG_MULTI_SWIPE_DOWN, it);
1193 else if ((it->wd->cur_y < it->wd->prev_y) && (it->wd->cur_my < it->wd->prev_my))
1194 evas_object_smart_callback_call(WIDGET(it),
1195 SIG_MULTI_SWIPE_UP, it);
1196 else if (abs(it->wd->cur_y - it->wd->cur_my) > abs(it->wd->prev_y - it->wd->prev_my))
1197 evas_object_smart_callback_call(WIDGET(it),
1198 SIG_MULTI_PINCH_OUT, it);
1200 evas_object_smart_callback_call(WIDGET(it),
1201 SIG_MULTI_PINCH_IN, it);
1204 it->wd->multi_timeout = EINA_FALSE;
1208 _multi_down(void *data,
1209 Evas *evas __UNUSED__,
1210 Evas_Object *obj __UNUSED__,
1213 Elm_Gen_Item *it = data;
1214 Evas_Event_Multi_Down *ev = event_info;
1216 if ((it->wd->multi_device != 0) || (it->wd->multitouched) || (it->wd->multi_timeout)) return;
1217 it->wd->multi_device = ev->device;
1218 it->wd->multi_down = EINA_TRUE;
1219 it->wd->multitouched = EINA_TRUE;
1220 it->wd->prev_mx = ev->canvas.x;
1221 it->wd->prev_my = ev->canvas.y;
1222 if (!it->wd->wasselected)
1224 _item_unhighlight(it);
1227 it->wd->wasselected = EINA_FALSE;
1228 it->wd->longpressed = EINA_FALSE;
1231 ecore_timer_del(it->long_timer);
1232 it->long_timer = NULL;
1236 it->dragging = EINA_FALSE;
1237 evas_object_smart_callback_call(WIDGET(it), SIG_DRAG_STOP, it);
1239 if (it->item->swipe_timer)
1241 ecore_timer_del(it->item->swipe_timer);
1242 it->item->swipe_timer = NULL;
1244 if (it->wd->on_hold)
1246 it->wd->swipe = EINA_FALSE;
1247 it->wd->movements = 0;
1248 it->wd->on_hold = EINA_FALSE;
1253 _multi_up(void *data,
1254 Evas *evas __UNUSED__,
1255 Evas_Object *obj __UNUSED__,
1258 Elm_Gen_Item *it = data;
1259 Evas_Event_Multi_Up *ev = event_info;
1261 if (it->wd->multi_device != ev->device) return;
1262 it->wd->multi_device = 0;
1263 it->wd->multi_down = EINA_FALSE;
1264 if (it->wd->mouse_down) return;
1265 _multi_touch_gesture_eval(data);
1269 _multi_move(void *data,
1270 Evas *evas __UNUSED__,
1271 Evas_Object *obj __UNUSED__,
1274 Elm_Gen_Item *it = data;
1275 Evas_Event_Multi_Move *ev = event_info;
1277 if (it->wd->multi_device != ev->device) return;
1278 it->wd->cur_mx = ev->cur.canvas.x;
1279 it->wd->cur_my = ev->cur.canvas.y;
1283 _mouse_down(void *data,
1284 Evas *evas __UNUSED__,
1288 Elm_Gen_Item *it = data;
1289 Evas_Event_Mouse_Down *ev = event_info;
1292 if (ev->button != 1) return;
1293 if (ev->event_flags & EVAS_EVENT_FLAG_ON_HOLD)
1295 it->wd->on_hold = EINA_TRUE;
1298 it->down = EINA_TRUE;
1299 it->dragging = EINA_FALSE;
1300 evas_object_geometry_get(obj, &x, &y, NULL, NULL);
1301 it->dx = ev->canvas.x - x;
1302 it->dy = ev->canvas.y - y;
1303 it->wd->mouse_down = EINA_TRUE;
1304 if (!it->wd->multitouched)
1306 it->wd->prev_x = ev->canvas.x;
1307 it->wd->prev_y = ev->canvas.y;
1308 it->wd->multi_timeout = EINA_FALSE;
1309 if (it->wd->multi_timer) ecore_timer_del(it->wd->multi_timer);
1310 it->wd->multi_timer = ecore_timer_add(1, _multi_cancel, it->wd);
1312 it->wd->longpressed = EINA_FALSE;
1313 if (ev->event_flags & EVAS_EVENT_FLAG_ON_HOLD) it->wd->on_hold = EINA_TRUE;
1314 else it->wd->on_hold = EINA_FALSE;
1315 if (it->wd->on_hold) return;
1316 it->wd->wasselected = it->selected;
1317 _item_highlight(it);
1318 if (ev->flags & EVAS_BUTTON_DOUBLE_CLICK)
1319 if ((!elm_widget_item_disabled_get(it)) &&
1320 (it->select_mode != ELM_OBJECT_SELECT_MODE_DISPLAY_ONLY))
1322 evas_object_smart_callback_call(WIDGET(it), SIG_CLICKED_DOUBLE, it);
1323 evas_object_smart_callback_call(WIDGET(it), SIG_ACTIVATED, it);
1325 if (it->item->swipe_timer) ecore_timer_del(it->item->swipe_timer);
1326 it->item->swipe_timer = ecore_timer_add(0.4, _swipe_cancel, it);
1327 if (it->long_timer) ecore_timer_del(it->long_timer);
1329 it->long_timer = ecore_timer_add(it->wd->longpress_timeout, _long_press,
1332 it->long_timer = NULL;
1333 it->wd->swipe = EINA_FALSE;
1334 it->wd->movements = 0;
1338 _mouse_up(void *data,
1339 Evas *evas __UNUSED__,
1340 Evas_Object *obj __UNUSED__,
1343 Elm_Gen_Item *it = data;
1344 Evas_Event_Mouse_Up *ev = event_info;
1345 Eina_Bool dragged = EINA_FALSE;
1347 if (ev->button != 1) return;
1348 it->down = EINA_FALSE;
1349 it->wd->mouse_down = EINA_FALSE;
1350 if (it->wd->multitouched)
1352 if ((!it->wd->multi) && (!it->selected) && (it->highlighted)) _item_unhighlight(it);
1353 if (it->wd->multi_down) return;
1354 _multi_touch_gesture_eval(data);
1357 if (ev->event_flags & EVAS_EVENT_FLAG_ON_HOLD) it->wd->on_hold = EINA_TRUE;
1358 else it->wd->on_hold = EINA_FALSE;
1361 ecore_timer_del(it->long_timer);
1362 it->long_timer = NULL;
1366 it->dragging = EINA_FALSE;
1367 evas_object_smart_callback_call(WIDGET(it), SIG_DRAG_STOP, it);
1370 if (it->item->swipe_timer)
1372 ecore_timer_del(it->item->swipe_timer);
1373 it->item->swipe_timer = NULL;
1375 if (it->wd->multi_timer)
1377 ecore_timer_del(it->wd->multi_timer);
1378 it->wd->multi_timer = NULL;
1379 it->wd->multi_timeout = EINA_FALSE;
1381 if (it->wd->on_hold)
1383 if (it->wd->swipe) _swipe(data);
1384 it->wd->longpressed = EINA_FALSE;
1385 it->wd->on_hold = EINA_FALSE;
1388 if ((it->wd->reorder_mode) && (it->wd->reorder_it))
1390 Evas_Coord it_scrl_y = ev->canvas.y - it->wd->reorder_it->dy;
1392 if (it->wd->reorder_rel && (it->wd->reorder_it->parent == it->wd->reorder_rel->parent))
1394 if (it_scrl_y <= it->wd->reorder_rel->item->scrl_y)
1395 _item_move_before(it->wd->reorder_it, it->wd->reorder_rel);
1397 _item_move_after(it->wd->reorder_it, it->wd->reorder_rel);
1398 evas_object_smart_callback_call(WIDGET(it), SIG_MOVED, it);
1402 if (it->wd->calc_job) ecore_job_del(it->wd->calc_job);
1403 it->wd->calc_job = ecore_job_add(_calc_job, it->wd);
1405 edje_object_signal_emit(VIEW(it), "elm,state,reorder,disabled", "elm");
1406 it->wd->reorder_it = it->wd->reorder_rel = NULL;
1407 elm_smart_scroller_hold_set(it->wd->scr, EINA_FALSE);
1408 elm_smart_scroller_bounce_allow_set(it->wd->scr, it->wd->h_bounce, it->wd->v_bounce);
1410 if (it->wd->longpressed)
1412 it->wd->longpressed = EINA_FALSE;
1413 if ((!it->wd->wasselected) && (!it->flipped))
1415 _item_unhighlight(it);
1418 it->wd->wasselected = EINA_FALSE;
1423 if (it->want_unrealize)
1425 _elm_genlist_item_unrealize(it, EINA_FALSE);
1426 if (it->item->block->want_unrealize)
1427 _item_block_unrealize(it->item->block);
1430 if (elm_widget_item_disabled_get(it) || (dragged) ||
1431 (it->select_mode == ELM_OBJECT_SELECT_MODE_DISPLAY_ONLY))
1433 if (ev->event_flags & EVAS_EVENT_FLAG_ON_HOLD) return;
1438 _item_highlight(it);
1443 _item_unhighlight(it);
1451 Widget_Data *wd = it->wd;
1454 while (wd->selected)
1456 _item_unhighlight(wd->selected->data);
1457 _item_unselect(wd->selected->data);
1463 const Eina_List *l, *l_next;
1466 EINA_LIST_FOREACH_SAFE(it->wd->selected, l, l_next, it2)
1469 _item_unhighlight(it2);
1470 _item_unselect(it2);
1472 //_item_highlight(it);
1475 _item_highlight(it);
1481 _item_mouse_callbacks_add(Elm_Gen_Item *it, Evas_Object *view)
1483 evas_object_event_callback_add(view, EVAS_CALLBACK_MOUSE_DOWN,
1485 evas_object_event_callback_add(view, EVAS_CALLBACK_MOUSE_UP,
1487 evas_object_event_callback_add(view, EVAS_CALLBACK_MOUSE_MOVE,
1489 evas_object_event_callback_add(view, EVAS_CALLBACK_MULTI_DOWN,
1491 evas_object_event_callback_add(view, EVAS_CALLBACK_MULTI_UP,
1493 evas_object_event_callback_add(view, EVAS_CALLBACK_MULTI_MOVE,
1498 _item_mouse_callbacks_del(Elm_Gen_Item *it, Evas_Object *view)
1500 evas_object_event_callback_del_full(view, EVAS_CALLBACK_MOUSE_DOWN,
1502 evas_object_event_callback_del_full(view, EVAS_CALLBACK_MOUSE_UP,
1504 evas_object_event_callback_del_full(view, EVAS_CALLBACK_MOUSE_MOVE,
1506 evas_object_event_callback_del_full(view, EVAS_CALLBACK_MULTI_DOWN,
1508 evas_object_event_callback_del_full(view, EVAS_CALLBACK_MULTI_UP,
1510 evas_object_event_callback_del_full(view, EVAS_CALLBACK_MULTI_MOVE,
1515 _signal_expand_toggle(void *data,
1516 Evas_Object *obj __UNUSED__,
1517 const char *emission __UNUSED__,
1518 const char *source __UNUSED__)
1520 Elm_Gen_Item *it = data;
1522 if (it->item->expanded)
1523 evas_object_smart_callback_call(WIDGET(it), SIG_CONTRACT_REQUEST, it);
1525 evas_object_smart_callback_call(WIDGET(it), SIG_EXPAND_REQUEST, it);
1529 _signal_expand(void *data,
1530 Evas_Object *obj __UNUSED__,
1531 const char *emission __UNUSED__,
1532 const char *source __UNUSED__)
1534 Elm_Gen_Item *it = data;
1536 if (!it->item->expanded)
1537 evas_object_smart_callback_call(WIDGET(it), SIG_EXPAND_REQUEST, it);
1541 _signal_contract(void *data,
1542 Evas_Object *obj __UNUSED__,
1543 const char *emission __UNUSED__,
1544 const char *source __UNUSED__)
1546 Elm_Gen_Item *it = data;
1548 if (it->item->expanded)
1549 evas_object_smart_callback_call(WIDGET(it), SIG_CONTRACT_REQUEST, it);
1553 _scr_hold_timer_cb(void *data)
1555 if (!data) return ECORE_CALLBACK_CANCEL;
1556 Widget_Data *wd = data;
1557 elm_smart_scroller_hold_set(wd->scr, EINA_FALSE);
1558 wd->scr_hold_timer = NULL;
1559 return ECORE_CALLBACK_CANCEL;
1563 _mode_finished_signal_cb(void *data,
1565 const char *emission __UNUSED__,
1566 const char *source __UNUSED__)
1570 Elm_Gen_Item *it = data;
1571 if ((it->generation < it->wd->generation) || (!it->realized) || (!it->item->mode_view)) return;
1573 Evas *te = evas_object_evas_get(obj);
1575 evas_event_freeze(te);
1576 it->item->nocache_once = EINA_FALSE;
1577 _mode_item_unrealize(it);
1578 if (it->item->group_item)
1579 evas_object_raise(it->item->VIEW(group_item));
1580 snprintf(buf, sizeof(buf), "elm,state,%s,passive,finished", it->wd->decorate_type);
1581 edje_object_signal_callback_del_full(obj, buf, "elm", _mode_finished_signal_cb, it);
1582 evas_event_thaw(te);
1583 evas_event_thaw_eval(te);
1587 _item_cache_clean(Widget_Data *wd)
1589 evas_event_freeze(evas_object_evas_get(wd->obj));
1590 while ((wd->item_cache) && (wd->item_cache_count > wd->item_cache_max))
1594 itc = EINA_INLIST_CONTAINER_GET(wd->item_cache->last, Item_Cache);
1595 wd->item_cache = eina_inlist_remove(wd->item_cache,
1596 wd->item_cache->last);
1597 wd->item_cache_count--;
1598 if (itc->spacer) evas_object_del(itc->spacer);
1599 if (itc->base_view) evas_object_del(itc->base_view);
1600 eina_stringshare_del(itc->item_style);
1603 evas_event_thaw(evas_object_evas_get(wd->obj));
1604 evas_event_thaw_eval(evas_object_evas_get(wd->obj));
1608 _item_cache_zero(Widget_Data *wd)
1610 int pmax = wd->item_cache_max;
1611 wd->item_cache_max = 0;
1612 _item_cache_clean(wd);
1613 wd->item_cache_max = pmax;
1617 _item_cache_add(Elm_Gen_Item *it)
1621 evas_event_freeze(evas_object_evas_get(it->wd->obj));
1622 if (it->wd->item_cache_max <= 0)
1624 evas_object_del(VIEW(it));
1628 evas_object_del(it->spacer);
1631 evas_event_thaw(evas_object_evas_get(it->wd->obj));
1632 evas_event_thaw_eval(evas_object_evas_get(it->wd->obj));
1636 it->wd->item_cache_count++;
1637 itc = calloc(1, sizeof(Item_Cache));
1640 evas_event_thaw(evas_object_evas_get(it->wd->obj));
1641 evas_event_thaw_eval(evas_object_evas_get(it->wd->obj));
1644 it->wd->item_cache = eina_inlist_prepend(it->wd->item_cache,
1645 EINA_INLIST_GET(itc));
1646 itc->spacer = it->spacer;
1648 itc->base_view = VIEW(it);
1650 edje_object_signal_emit(itc->base_view, "elm,state,unselected", "elm");
1651 evas_object_hide(itc->base_view);
1652 evas_object_move(itc->base_view, -9999, -9999);
1653 itc->item_style = eina_stringshare_add(it->itc->item_style);
1654 if (it->item->type & ELM_GENLIST_ITEM_TREE) itc->tree = 1;
1655 itc->selected = it->selected;
1656 itc->disabled = elm_widget_item_disabled_get(it);
1657 itc->expanded = it->item->expanded;
1660 ecore_timer_del(it->long_timer);
1661 it->long_timer = NULL;
1663 if (it->item->swipe_timer)
1665 ecore_timer_del(it->item->swipe_timer);
1666 it->item->swipe_timer = NULL;
1668 // FIXME: other callbacks?
1669 edje_object_signal_callback_del_full(itc->base_view,
1670 "elm,action,expand,toggle",
1671 "elm", _signal_expand_toggle, it);
1672 edje_object_signal_callback_del_full(itc->base_view, "elm,action,expand",
1674 _signal_expand, it);
1675 edje_object_signal_callback_del_full(itc->base_view, "elm,action,contract",
1676 "elm", _signal_contract, it);
1677 _item_mouse_callbacks_del(it, itc->base_view);
1678 _item_cache_clean(it->wd);
1679 evas_event_thaw(evas_object_evas_get(it->wd->obj));
1680 evas_event_thaw_eval(evas_object_evas_get(it->wd->obj));
1684 _item_cache_find(Elm_Gen_Item *it)
1689 if (it->item->type & ELM_GENLIST_ITEM_TREE) tree = 1;
1690 EINA_INLIST_FOREACH(it->wd->item_cache, itc)
1692 if ((itc->selected) || (itc->disabled) || (itc->expanded))
1694 if ((itc->tree == tree) &&
1695 (((!it->itc->item_style) && (!itc->item_style)) ||
1696 (it->itc->item_style && itc->item_style &&
1697 (!strcmp(it->itc->item_style, itc->item_style)))))
1699 it->wd->item_cache = eina_inlist_remove(it->wd->item_cache,
1700 EINA_INLIST_GET(itc));
1701 it->wd->item_cache_count--;
1709 _elm_genlist_item_index_update(Elm_Gen_Item *it)
1711 if (it->position_update || it->item->block->position_update)
1713 evas_object_smart_callback_call(WIDGET(it), SIG_INDEX_UPDATE, it);
1714 it->position_update = EINA_FALSE;
1719 _elm_genlist_item_odd_even_update(Elm_Gen_Item *it)
1721 if (!it->item->nostacking)
1723 if ((it->item->order_num_in & 0x1) ^ it->item->stacking_even)
1725 if (it->deco_obj) evas_object_lower(it->deco_obj);
1726 else evas_object_lower(VIEW(it));
1730 if (it->deco_obj) evas_object_raise(it->deco_obj);
1731 else evas_object_raise(VIEW(it));
1735 if (it->item->order_num_in & 0x1)
1737 edje_object_signal_emit(VIEW(it), "elm,state,odd", "elm");
1738 if (it->deco_obj) edje_object_signal_emit(it->deco_obj, "elm,state,odd", "elm");
1742 edje_object_signal_emit(VIEW(it), "elm,state,even", "elm");
1743 if (it->deco_obj) edje_object_signal_emit(it->deco_obj, "elm,state,even", "elm");
1748 _elm_genlist_item_state_update(Elm_Gen_Item *it, Item_Cache *itc)
1752 if (it->selected != itc->selected)
1756 edje_object_signal_emit(VIEW(it),
1757 "elm,state,selected", "elm");
1760 edje_object_signal_emit(it->deco_obj,
1761 "elm,state,selected", "elm");
1764 if (elm_widget_item_disabled_get(it) != itc->disabled)
1766 if (elm_widget_item_disabled_get(it))
1767 edje_object_signal_emit(VIEW(it),
1768 "elm,state,disabled", "elm");
1770 edje_object_signal_emit(it->deco_obj,
1771 "elm,state,disabled", "elm");
1773 if (it->item->expanded != itc->expanded)
1775 if (it->item->expanded)
1776 edje_object_signal_emit(VIEW(it),
1777 "elm,state,expanded", "elm");
1779 edje_object_signal_emit(it->deco_obj,
1780 "elm,state,expanded", "elm");
1787 edje_object_signal_emit(VIEW(it),
1788 "elm,state,selected", "elm");
1790 edje_object_signal_emit(it->deco_obj,
1791 "elm,state,selected", "elm");
1794 if (elm_widget_item_disabled_get(it))
1796 edje_object_signal_emit(VIEW(it),
1797 "elm,state,disabled", "elm");
1799 edje_object_signal_emit(it->deco_obj,
1800 "elm,state,disabled", "elm");
1802 if (it->item->expanded)
1804 edje_object_signal_emit(VIEW(it),
1805 "elm,state,expanded", "elm");
1807 edje_object_signal_emit(it->deco_obj,
1808 "elm,state,expanded", "elm");
1814 _item_cache_free(Item_Cache *itc)
1816 if (itc->spacer) evas_object_del(itc->spacer);
1817 if (itc->base_view) evas_object_del(itc->base_view);
1818 eina_stringshare_del(itc->item_style);
1823 _item_text_realize(Elm_Gen_Item *it,
1824 Evas_Object *target,
1828 if (it->itc->func.text_get)
1833 *source = elm_widget_stringlist_get(edje_object_data_get(target, "texts"));
1834 EINA_LIST_FOREACH(*source, l, key)
1836 if (parts && fnmatch(parts, key, FNM_PERIOD))
1839 char *s = it->itc->func.text_get
1840 ((void *)it->base.data, WIDGET(it), key);
1844 edje_object_part_text_set(target, key, s);
1849 edje_object_part_text_set(target, key, "");
1856 _item_content_unrealize(Elm_Gen_Item *it,
1857 Evas_Object *target,
1861 Eina_List *res = it->content_objs;
1863 if (it->itc->func.content_get)
1867 Evas_Object *ic = NULL;
1869 EINA_LIST_FOREACH(*source, l, key)
1871 if (parts && fnmatch(parts, key, FNM_PERIOD))
1874 ic = edje_object_part_swallow_get(target, key);
1877 res = eina_list_remove(res, ic);
1878 edje_object_part_unswallow(target, ic);
1879 evas_object_del(ic);
1888 _item_content_realize(Elm_Gen_Item *it,
1889 Evas_Object *target,
1893 Eina_List *res = NULL;
1895 if (it->itc->func.content_get)
1899 Evas_Object *ic = NULL;
1900 Eina_List *cons = NULL;
1902 cons = elm_widget_stringlist_get(edje_object_data_get(target, "contents"));
1904 if (parts && (eina_list_count(*source) != eina_list_count(it->content_objs)))
1905 res = it->content_objs;
1907 EINA_LIST_FOREACH(cons, l, key)
1909 if (parts && fnmatch(parts, key, FNM_PERIOD))
1912 if (it->itc->func.content_get)
1913 ic = it->itc->func.content_get
1914 ((void *)it->base.data, WIDGET(it), key);
1917 res = eina_list_append(res, ic);
1918 edje_object_part_swallow(target, key, ic);
1919 evas_object_show(ic);
1920 elm_widget_sub_object_add(WIDGET(it), ic);
1921 if (elm_widget_item_disabled_get(it))
1922 elm_widget_disabled_set(ic, EINA_TRUE);
1925 *source = eina_list_merge(*source, cons);
1932 _item_state_realize(Elm_Gen_Item *it,
1933 Evas_Object *target,
1937 if (it->itc->func.state_get)
1943 *source = elm_widget_stringlist_get(edje_object_data_get(target, "states"));
1944 EINA_LIST_FOREACH(*source, l, key)
1946 if (parts && fnmatch(parts, key, FNM_PERIOD))
1949 Eina_Bool on = it->itc->func.state_get
1950 ((void *)it->base.data, WIDGET(it), key);
1954 snprintf(buf, sizeof(buf), "elm,state,%s,active", key);
1955 edje_object_signal_emit(target, buf, "elm");
1959 snprintf(buf, sizeof(buf), "elm,state,%s,passive", key);
1960 edje_object_signal_emit(target, buf, "elm");
1967 _item_flips_realize(Elm_Gen_Item *it,
1968 Evas_Object *target,
1971 Eina_List *res = it->content_objs;
1973 if (it->itc->func.content_get)
1977 Evas_Object *ic = NULL;
1978 Eina_List *cons = NULL;
1980 cons = elm_widget_stringlist_get(edje_object_data_get(target, "flips"));
1982 EINA_LIST_FOREACH(cons, l, key)
1984 if (it->itc->func.content_get)
1985 ic = it->itc->func.content_get
1986 ((void *)it->base.data, WIDGET(it), key);
1989 res = eina_list_append(res, ic);
1990 edje_object_part_swallow(target, key, ic);
1991 evas_object_show(ic);
1992 elm_widget_sub_object_add(WIDGET(it), ic);
1993 if (elm_widget_item_disabled_get(it))
1994 elm_widget_disabled_set(ic, EINA_TRUE);
1997 *source = eina_list_merge(*source, cons);
2004 _item_realize(Elm_Gen_Item *it,
2008 const char *treesize;
2011 Item_Cache *itc = NULL;
2013 if (it->generation < it->wd->generation) return;
2014 //evas_event_freeze(evas_object_evas_get(it->wd->obj));
2017 if (it->item->order_num_in != in)
2019 it->item->order_num_in = in;
2020 _elm_genlist_item_odd_even_update(it);
2021 _elm_genlist_item_state_update(it, NULL);
2022 _elm_genlist_item_index_update(it);
2024 //evas_event_thaw(evas_object_evas_get(it->wd->obj));
2025 //evas_event_thaw_eval(evas_object_evas_get(it->wd->obj));
2028 it->item->order_num_in = in;
2030 if (it->item->nocache_once)
2031 it->item->nocache_once = EINA_FALSE;
2032 else if (!it->item->nocache)
2033 itc = _item_cache_find(it);
2034 if (itc && (!it->wd->tree_effect_enabled))
2036 VIEW(it) = itc->base_view;
2037 itc->base_view = NULL;
2038 it->spacer = itc->spacer;
2043 const char *stacking_even;
2044 const char *stacking;
2046 VIEW(it) = edje_object_add(evas_object_evas_get(WIDGET(it)));
2047 edje_object_scale_set(VIEW(it),
2048 elm_widget_scale_get(WIDGET(it)) *
2049 _elm_config->scale);
2050 evas_object_smart_member_add(VIEW(it), it->wd->pan_smart);
2051 elm_widget_sub_object_add(WIDGET(it), VIEW(it));
2053 if (it->item->type & ELM_GENLIST_ITEM_TREE)
2054 snprintf(buf, sizeof(buf), "tree%s/%s", it->wd->mode == ELM_LIST_COMPRESS ? "_compress" : "", it->itc->item_style ?: "default");
2056 snprintf(buf, sizeof(buf), "item%s/%s", it->wd->mode == ELM_LIST_COMPRESS ? "_compress" : "", it->itc->item_style ?: "default");
2058 _elm_theme_object_set(WIDGET(it), VIEW(it), "genlist", buf,
2059 elm_widget_style_get(WIDGET(it)));
2061 stacking_even = edje_object_data_get(VIEW(it), "stacking_even");
2062 if (!stacking_even) stacking_even = "above";
2063 it->item->stacking_even = !!strcmp("above", stacking_even);
2065 stacking = edje_object_data_get(VIEW(it), "stacking");
2066 if (!stacking) stacking = "yes";
2067 it->item->nostacking = !!strcmp("yes", stacking);
2069 edje_object_mirrored_set(VIEW(it),
2070 elm_widget_mirrored_get(WIDGET(it)));
2073 _elm_genlist_item_odd_even_update(it);
2075 treesize = edje_object_data_get(VIEW(it), "treesize");
2076 if (treesize) tsize = atoi(treesize);
2077 if (!it->spacer && treesize)
2080 evas_object_rectangle_add(evas_object_evas_get(WIDGET(it)));
2081 evas_object_color_set(it->spacer, 0, 0, 0, 0);
2082 elm_widget_sub_object_add(WIDGET(it), it->spacer);
2086 evas_object_size_hint_min_set(it->spacer,
2087 (it->item->expanded_depth * tsize) * _elm_config->scale, 1);
2088 edje_object_part_swallow(VIEW(it), "elm.swallow.pad", it->spacer);
2092 edje_object_signal_callback_add(VIEW(it),
2093 "elm,action,expand,toggle",
2094 "elm", _signal_expand_toggle, it);
2095 edje_object_signal_callback_add(VIEW(it), "elm,action,expand",
2096 "elm", _signal_expand, it);
2097 edje_object_signal_callback_add(VIEW(it), "elm,action,contract",
2098 "elm", _signal_contract, it);
2099 _item_mouse_callbacks_add(it, VIEW(it));
2101 if ((it->wd->decorate_mode) && (!it->deco_obj) &&
2102 (it->item->type != ELM_GENLIST_ITEM_GROUP) && (it->itc->decorate_all_item_style))
2103 _decorate_mode_item_realize(it, EINA_FALSE);
2105 _elm_genlist_item_state_update(it, itc);
2106 _elm_genlist_item_index_update(it);
2109 if ((calc) && (it->wd->homogeneous) &&
2110 ((it->wd->item_width) ||
2111 ((it->wd->item_width) && (it->wd->group_item_width))))
2113 /* homogenous genlist shortcut */
2114 if (!it->item->mincalcd)
2118 it->item->w = it->item->minw = it->wd->group_item_width;
2119 it->item->h = it->item->minh = it->wd->group_item_height;
2123 it->item->w = it->item->minw = it->wd->item_width;
2124 it->item->h = it->item->minh = it->wd->item_height;
2126 it->item->mincalcd = EINA_TRUE;
2131 /* FIXME: If you see that assert, please notify us and we
2132 will clean our mess */
2133 assert(eina_list_count(it->content_objs) == 0);
2135 _item_text_realize(it, VIEW(it), &it->texts, NULL);
2136 it->content_objs = _item_content_realize(it, VIEW(it), &it->contents, NULL);
2137 _item_state_realize(it, VIEW(it), &it->states, NULL);
2140 edje_object_signal_emit(VIEW(it), "elm,state,flip,enabled", "elm");
2141 it->content_objs = _item_flips_realize(it, VIEW(it), &it->contents);
2144 if (!it->item->mincalcd)
2146 Evas_Coord mw = -1, mh = -1;
2148 if (it->select_mode != ELM_OBJECT_SELECT_MODE_DISPLAY_ONLY)
2149 elm_coords_finger_size_adjust(1, &mw, 1, &mh);
2150 if (it->wd->mode == ELM_LIST_COMPRESS) mw = it->wd->prev_viewport_w;
2151 edje_object_size_min_restricted_calc(VIEW(it), &mw, &mh, mw,
2153 if (it->select_mode != ELM_OBJECT_SELECT_MODE_DISPLAY_ONLY)
2154 elm_coords_finger_size_adjust(1, &mw, 1, &mh);
2155 it->item->w = it->item->minw = mw;
2156 it->item->h = it->item->minh = mh;
2157 it->item->mincalcd = EINA_TRUE;
2159 if ((!it->wd->group_item_width) && (it->group))
2161 it->wd->group_item_width = mw;
2162 it->wd->group_item_height = mh;
2164 else if ((!it->wd->item_width) && (it->item->type == ELM_GENLIST_ITEM_NONE))
2166 it->wd->item_width = mw;
2167 it->wd->item_height = mh;
2170 if (!calc) evas_object_show(VIEW(it));
2173 if (it->tooltip.content_cb)
2175 elm_widget_item_tooltip_content_cb_set(it,
2176 it->tooltip.content_cb,
2177 it->tooltip.data, NULL);
2178 elm_widget_item_tooltip_style_set(it, it->tooltip.style);
2179 elm_widget_item_tooltip_window_mode_set(it, it->tooltip.free_size);
2182 if (it->mouse_cursor)
2183 elm_widget_item_cursor_set(it, it->mouse_cursor);
2185 it->realized = EINA_TRUE;
2186 it->want_unrealize = EINA_FALSE;
2188 if (itc) _item_cache_free(itc);
2189 //evas_event_thaw(evas_object_evas_get(it->wd->obj));
2190 //evas_event_thaw_eval(evas_object_evas_get(it->wd->obj));
2193 if (it->item->tree_effect_hideme)
2195 if (it->wd->move_effect_mode != ELM_GENLIST_TREE_EFFECT_NONE)
2196 edje_object_signal_emit(VIEW(it), "elm,state,hide", "");
2197 it->item->tree_effect_hideme = EINA_FALSE;
2199 evas_object_smart_callback_call(WIDGET(it), SIG_REALIZED, it);
2202 if ((!calc) && (it->wd->decorate_mode) && (it->item->type != ELM_GENLIST_ITEM_GROUP))
2204 if (it->itc->decorate_all_item_style)
2206 if (!it->deco_obj) _decorate_mode_item_realize(it, EINA_FALSE);
2207 edje_object_message_signal_process(it->deco_obj);
2210 edje_object_message_signal_process(VIEW(it));
2214 _item_unrealize_cb(Elm_Gen_Item *it)
2216 if (it->item->nocache_once || it->item->nocache)
2218 evas_object_del(VIEW(it));
2222 evas_object_del(it->spacer);
2228 edje_object_mirrored_set(VIEW(it),
2229 elm_widget_mirrored_get(WIDGET(it)));
2230 edje_object_scale_set(VIEW(it),
2231 elm_widget_scale_get(WIDGET(it))
2232 * _elm_config->scale);
2233 _item_cache_add(it);
2236 _mode_item_unrealize(it);
2238 it->realized = EINA_FALSE;
2239 it->want_unrealize = EINA_FALSE;
2240 if (it->wd->decorate_mode) _decorate_mode_item_unrealize(it);
2244 _item_block_recalc(Item_Block *itb,
2250 Evas_Coord minw = 0, minh = 0;
2251 Eina_Bool showme = EINA_FALSE, changed = EINA_FALSE;
2254 //evas_event_freeze(evas_object_evas_get(itb->wd->obj));
2256 EINA_LIST_FOREACH(itb->items, l, it)
2258 if (it->generation < it->wd->generation) continue;
2259 showme |= it->item->showme;
2264 if (!it->item->mincalcd) changed = EINA_TRUE;
2267 _item_realize(it, in, EINA_TRUE);
2268 _elm_genlist_item_unrealize(it, EINA_TRUE);
2273 _item_realize(it, in, EINA_TRUE);
2274 _elm_genlist_item_unrealize(it, EINA_TRUE);
2279 if (!it->item->mincalcd) changed = EINA_TRUE;
2280 _item_realize(it, in, EINA_FALSE);
2282 minh += it->item->minh;
2283 if (minw < it->item->minw) minw = it->item->minw;
2289 if (changed) itb->wd->pan_changed = changed;
2292 itb->changed = EINA_FALSE;
2293 itb->position_update = EINA_FALSE;
2294 //evas_event_thaw(evas_object_evas_get(itb->wd->obj));
2295 //evas_event_thaw_eval(evas_object_evas_get(itb->wd->obj));
2300 _item_block_realize(Item_Block *itb)
2302 if (itb->realized) return;
2303 itb->realized = EINA_TRUE;
2304 itb->want_unrealize = EINA_FALSE;
2308 _item_block_unrealize(Item_Block *itb)
2312 Eina_Bool dragging = EINA_FALSE;
2314 if (!itb->realized) return;
2315 evas_event_freeze(evas_object_evas_get(itb->wd->obj));
2316 EINA_LIST_FOREACH(itb->items, l, it)
2318 if (itb->must_recalc || !it->group)
2322 dragging = EINA_TRUE;
2323 it->want_unrealize = EINA_TRUE;
2326 _elm_genlist_item_unrealize(it, EINA_FALSE);
2331 itb->realized = EINA_FALSE;
2332 itb->want_unrealize = EINA_TRUE;
2335 itb->want_unrealize = EINA_FALSE;
2336 evas_event_thaw(evas_object_evas_get(itb->wd->obj));
2337 evas_event_thaw_eval(evas_object_evas_get(itb->wd->obj));
2341 _get_space_for_reorder_item(Elm_Gen_Item *it)
2343 Evas_Coord rox, roy, row, roh, oy, oh;
2344 Eina_Bool top = EINA_FALSE;
2345 Elm_Gen_Item *reorder_it = it->wd->reorder_it;
2346 if (!reorder_it) return 0;
2348 evas_object_geometry_get(it->wd->pan_smart, NULL, &oy, NULL, &oh);
2349 evas_object_geometry_get(it->wd->VIEW(reorder_it), &rox, &roy, &row, &roh);
2351 if ((it->wd->reorder_start_y < it->item->block->y) &&
2352 (roy - oy + (roh / 2) >= it->item->block->y - it->wd->pan_y))
2354 it->item->block->reorder_offset = it->wd->reorder_it->item->h * -1;
2355 if (it->item->block->count == 1)
2356 it->wd->reorder_rel = it;
2358 else if ((it->wd->reorder_start_y >= it->item->block->y) &&
2359 (roy - oy + (roh / 2) <= it->item->block->y - it->wd->pan_y))
2361 it->item->block->reorder_offset = it->wd->reorder_it->item->h;
2364 it->item->block->reorder_offset = 0;
2366 it->item->scrl_y += it->item->block->reorder_offset;
2368 top = (ELM_RECTS_INTERSECT(it->item->scrl_x, it->item->scrl_y, it->item->w, it->item->h,
2369 rox, roy + (roh / 2), row, 1));
2372 it->wd->reorder_rel = it;
2373 it->item->scrl_y += it->wd->reorder_it->item->h;
2374 return it->wd->reorder_it->item->h;
2381 _reorder_move_animator_cb(void *data)
2383 Elm_Gen_Item *it = data;
2384 Eina_Bool down = EINA_FALSE;
2386 int y, dy = it->item->h / 10 * _elm_config->scale, diff;
2388 t = ((0.0 > (t = ecore_loop_time_get()-it->wd->start_time)) ? 0.0 : t);
2390 if (t <= REORDER_EFFECT_TIME) y = (1 * sin((t / REORDER_EFFECT_TIME) * (M_PI / 2)) * dy);
2393 diff = abs(it->item->old_scrl_y - it->item->scrl_y);
2394 if (diff > it->item->h) y = diff / 2;
2396 if (it->item->old_scrl_y < it->item->scrl_y)
2398 it->item->old_scrl_y += y;
2401 else if (it->item->old_scrl_y > it->item->scrl_y)
2403 it->item->old_scrl_y -= y;
2408 _item_position(it, it->deco_obj, it->item->scrl_x, it->item->old_scrl_y);
2410 _item_position(it, VIEW(it), it->item->scrl_x, it->item->old_scrl_y);
2411 _group_items_recalc(it->wd);
2413 if ((it->wd->reorder_pan_move) ||
2414 (down && it->item->old_scrl_y >= it->item->scrl_y) ||
2415 (!down && it->item->old_scrl_y <= it->item->scrl_y))
2417 it->item->old_scrl_y = it->item->scrl_y;
2418 it->item->move_effect_enabled = EINA_FALSE;
2419 it->wd->reorder_move_animator = NULL;
2420 return ECORE_CALLBACK_CANCEL;
2422 return ECORE_CALLBACK_RENEW;
2426 _item_position(Elm_Gen_Item *it,
2434 evas_event_freeze(evas_object_evas_get(it->wd->obj));
2435 evas_object_resize(view, it->item->w, it->item->h);
2436 evas_object_move(view, it_x, it_y);
2437 evas_object_show(view);
2438 evas_event_thaw(evas_object_evas_get(it->wd->obj));
2439 evas_event_thaw_eval(evas_object_evas_get(it->wd->obj));
2443 _item_block_position(Item_Block *itb,
2449 Evas_Coord y = 0, ox, oy, ow, oh, cvx, cvy, cvw, cvh;
2450 Eina_Bool vis = EINA_FALSE;
2452 evas_event_freeze(evas_object_evas_get(itb->wd->obj));
2453 evas_object_geometry_get(itb->wd->pan_smart, &ox, &oy, &ow, &oh);
2454 evas_output_viewport_get(evas_object_evas_get(itb->wd->obj), &cvx, &cvy,
2456 EINA_LIST_FOREACH(itb->items, l, it)
2458 if (it->generation < it->wd->generation) continue;
2459 else if (it->wd->reorder_it == it) continue;
2462 it->item->w = itb->w;
2463 it->item->scrl_x = itb->x + it->x - it->wd->pan_x + ox;
2464 it->item->scrl_y = itb->y + it->y - it->wd->pan_y + oy;
2466 vis = (ELM_RECTS_INTERSECT(it->item->scrl_x, it->item->scrl_y, it->item->w, it->item->h,
2467 cvx, cvy, cvw, cvh));
2470 if ((itb->realized) && (!it->realized))
2472 if (vis) _item_realize(it, in, EINA_FALSE);
2476 if (vis || it->dragging)
2478 if (it->wd->reorder_mode)
2479 y += _get_space_for_reorder_item(it);
2480 git = it->item->group_item;
2483 if (git->item->scrl_y < oy)
2484 git->item->scrl_y = oy;
2485 if ((git->item->scrl_y + git->item->h) > (it->item->scrl_y + it->item->h))
2486 git->item->scrl_y = (it->item->scrl_y + it->item->h) - git->item->h;
2487 git->item->want_realize = EINA_TRUE;
2489 if ((it->wd->reorder_it) && (it->item->old_scrl_y != it->item->scrl_y))
2491 if (!it->item->move_effect_enabled)
2493 it->item->move_effect_enabled = EINA_TRUE;
2494 it->wd->reorder_move_animator =
2496 _reorder_move_animator_cb, it);
2499 if (!it->item->move_effect_enabled)
2501 if ((it->wd->decorate_mode) && (it->itc->decorate_all_item_style))
2502 _decorate_mode_item_position(it, it->item->scrl_x,
2506 if (!it->wd->tree_effect_enabled ||
2507 (it->wd->move_effect_mode == ELM_GENLIST_TREE_EFFECT_NONE) ||
2508 ((it->wd->move_effect_mode != ELM_GENLIST_TREE_EFFECT_NONE) &&
2509 (it->item->old_scrl_y == it->item->scrl_y)))
2511 if (it->item->mode_view)
2512 _item_position(it, it->item->mode_view,
2516 _item_position(it, VIEW(it), it->item->scrl_x,
2520 it->item->old_scrl_y = it->item->scrl_y;
2525 if (!it->wd->tree_effect_animator)
2526 _elm_genlist_item_unrealize(it, EINA_FALSE);
2533 if (vis) it->item->want_realize = EINA_TRUE;
2537 evas_event_thaw(evas_object_evas_get(itb->wd->obj));
2538 evas_event_thaw_eval(evas_object_evas_get(itb->wd->obj));
2542 _group_items_recalc(void *data)
2544 Widget_Data *wd = data;
2548 evas_event_freeze(evas_object_evas_get(wd->obj));
2549 EINA_LIST_FOREACH(wd->group_items, l, git)
2551 if (git->item->want_realize)
2554 _item_realize(git, 0, EINA_FALSE);
2555 evas_object_resize(VIEW(git), wd->minw, git->item->h);
2556 evas_object_move(VIEW(git), git->item->scrl_x, git->item->scrl_y);
2557 evas_object_show(VIEW(git));
2558 evas_object_raise(VIEW(git));
2560 else if (!git->item->want_realize && git->realized)
2563 _elm_genlist_item_unrealize(git, EINA_FALSE);
2566 evas_event_thaw(evas_object_evas_get(wd->obj));
2567 evas_event_thaw_eval(evas_object_evas_get(wd->obj));
2571 _must_recalc_idler(void *data)
2573 Widget_Data *wd = data;
2574 if (wd->calc_job) ecore_job_del(wd->calc_job);
2575 wd->calc_job = ecore_job_add(_calc_job, wd);
2576 wd->must_recalc_idler = NULL;
2577 return ECORE_CALLBACK_CANCEL;
2581 _scroll_item(Widget_Data *wd)
2583 Elm_Gen_Item *it = NULL;
2584 Evas_Coord gith = 0;
2585 Evas_Coord ow, oh, dx = 0, dy = 0, dw = 0, dh = 0;
2586 if (!wd->show_item) return;
2588 evas_object_geometry_get(wd->pan_smart, NULL, NULL, &ow, &oh);
2590 dx = it->x + it->item->block->x;
2591 dy = it->y + it->item->block->y;
2592 dw = it->item->block->w;
2594 switch (wd->scrollto_type)
2596 case ELM_GENLIST_ITEM_SCROLLTO_TOP:
2597 if (it->item->group_item) gith = it->item->group_item->item->h;
2600 case ELM_GENLIST_ITEM_SCROLLTO_MIDDLE:
2601 dy += ((it->item->h / 2) - (oh / 2));
2603 case ELM_GENLIST_ITEM_SCROLLTO_IN:
2605 if ((wd->expanded_item) &&
2606 ((wd->show_item->y + wd->show_item->item->block->y + wd->show_item->item->h)
2607 - (wd->expanded_item->y + wd->expanded_item->item->block->y) > oh))
2609 it = wd->expanded_item;
2610 if (it->item->group_item) gith = it->item->group_item->item->h;
2611 dx = it->x + it->item->block->x;
2612 dy = it->y + it->item->block->y - gith;
2613 dw = it->item->block->w;
2617 if ((it->item->group_item) && (wd->pan_y > (it->y + it->item->block->y)))
2618 gith = it->item->group_item->item->h;
2625 elm_smart_scroller_region_bring_in(wd->scr, dx, dy, dw, dh);
2627 elm_smart_scroller_child_region_show(wd->scr, dx, dy, dw, dh);
2629 it->item->showme = EINA_FALSE;
2630 wd->show_item = NULL;
2631 wd->auto_scroll_enabled = EINA_FALSE;
2632 wd->check_scroll = EINA_FALSE;
2636 _calc_job(void *data)
2638 Widget_Data *wd = data;
2639 Item_Block *itb, *chb = NULL;
2640 Evas_Coord minw = -1, minh = 0, y = 0, ow, dy = 0, vw;
2641 Evas_Coord pan_w = 0, pan_h = 0;
2643 Eina_Bool minw_change = EINA_FALSE;
2644 Eina_Bool did_must_recalc = EINA_FALSE;
2647 evas_object_geometry_get(wd->pan_smart, NULL, NULL, &ow, &wd->h);
2648 elm_smart_scroller_child_viewport_size_get(wd->scr, &vw, NULL);
2653 evas_event_freeze(evas_object_evas_get(wd->obj));
2654 EINA_INLIST_FOREACH(wd->blocks, itb)
2656 Eina_Bool showme = EINA_FALSE;
2659 showme = itb->showme;
2660 itb->showme = EINA_FALSE;
2663 if (itb->realized) _item_block_unrealize(itb);
2665 if ((itb->changed) || ((itb->must_recalc) && (!did_must_recalc)))
2667 if (itb->must_recalc)
2671 EINA_LIST_FOREACH(itb->items, l, it)
2672 if (it->item->mincalcd) it->item->mincalcd = EINA_FALSE;
2673 itb->changed = EINA_TRUE;
2674 if (itb->must_recalc) did_must_recalc = EINA_TRUE;
2675 if (itb->realized) _item_block_unrealize(itb);
2676 itb->must_recalc = EINA_FALSE;
2678 showme = _item_block_recalc(itb, in, EINA_FALSE);
2684 if (minw == -1) minw = itb->minw;
2685 else if ((!itb->must_recalc) && (minw < itb->minw))
2688 minw_change = EINA_TRUE;
2693 minw_change = EINA_TRUE;
2699 if ((showme) && (wd->show_item) && (!wd->show_item->item->queued))
2700 wd->check_scroll = EINA_TRUE;
2704 EINA_INLIST_FOREACH(wd->blocks, itb)
2710 if ((chb) && (EINA_INLIST_GET(chb)->next))
2712 EINA_INLIST_FOREACH(EINA_INLIST_GET(chb)->next, itb)
2714 if (itb->realized) _item_block_unrealize(itb);
2717 wd->realminw = minw;
2718 if (minw < wd->w) minw = wd->w;
2719 if ((minw != wd->minw) || (minh != wd->minh))
2723 evas_object_smart_callback_call(wd->pan_smart, "changed", NULL);
2724 _sizing_eval(wd->obj);
2725 if ((wd->anchor_item) && (wd->anchor_item->item->block) && (!wd->auto_scroll_enabled))
2730 it = wd->anchor_item;
2731 it_y = wd->anchor_y;
2732 elm_smart_scroller_child_pos_set(wd->scr, wd->pan_x,
2733 it->item->block->y + it->y + it_y);
2734 wd->anchor_item = it;
2735 wd->anchor_y = it_y;
2738 if (did_must_recalc)
2740 if (!wd->must_recalc_idler)
2741 wd->must_recalc_idler = ecore_idler_add(_must_recalc_idler, wd);
2743 if (wd->check_scroll)
2745 _pan_child_size_get(wd->pan_smart, &pan_w, &pan_h);
2746 if (EINA_INLIST_GET(wd->show_item) == wd->items->last)
2747 wd->scrollto_type = ELM_GENLIST_ITEM_SCROLLTO_IN;
2748 switch (wd->scrollto_type)
2750 case ELM_GENLIST_ITEM_SCROLLTO_TOP:
2753 case ELM_GENLIST_ITEM_SCROLLTO_MIDDLE:
2756 case ELM_GENLIST_ITEM_SCROLLTO_IN:
2763 if ((pan_w > (wd->show_item->x + wd->show_item->item->block->x)) &&
2764 (pan_h > (wd->show_item->y + wd->show_item->item->block->y + dy)))
2770 wd->calc_job = NULL;
2771 evas_object_smart_changed(wd->pan_smart);
2772 evas_event_thaw(evas_object_evas_get(wd->obj));
2773 evas_event_thaw_eval(evas_object_evas_get(wd->obj));
2777 _update_job(void *data)
2779 Widget_Data *wd = data;
2783 Eina_Bool position = EINA_FALSE, recalc = EINA_FALSE;
2785 wd->update_job = NULL;
2788 evas_event_freeze(evas_object_evas_get(wd->obj));
2789 EINA_INLIST_FOREACH(wd->blocks, itb)
2791 Evas_Coord itminw, itminh;
2798 _item_block_position(itb, num);
2802 recalc = EINA_FALSE;
2803 EINA_LIST_FOREACH(itb->items, l2, it)
2805 if (it->item->updateme)
2807 itminw = it->item->minw;
2808 itminh = it->item->minh;
2810 it->item->updateme = EINA_FALSE;
2813 _elm_genlist_item_unrealize(it, EINA_FALSE);
2814 _item_realize(it, num, EINA_FALSE);
2815 position = EINA_TRUE;
2819 _item_realize(it, num, EINA_TRUE);
2820 _elm_genlist_item_unrealize(it, EINA_TRUE);
2822 if ((it->item->minw != itminw) || (it->item->minh != itminh))
2827 itb->updateme = EINA_FALSE;
2830 position = EINA_TRUE;
2831 itb->changed = EINA_TRUE;
2832 _item_block_recalc(itb, num0, EINA_FALSE);
2833 _item_block_position(itb, num0);
2838 if (wd->calc_job) ecore_job_del(wd->calc_job);
2839 wd->calc_job = ecore_job_add(_calc_job, wd);
2841 evas_event_thaw(evas_object_evas_get(wd->obj));
2842 evas_event_thaw_eval(evas_object_evas_get(wd->obj));
2846 _pan_set(Evas_Object *obj,
2850 Pan *sd = evas_object_smart_data_get(obj);
2854 if ((x == sd->wd->pan_x) && (y == sd->wd->pan_y)) return;
2858 EINA_INLIST_FOREACH(sd->wd->blocks, itb)
2860 if ((itb->y + itb->h) > y)
2865 EINA_LIST_FOREACH(itb->items, l2, it)
2867 if ((itb->y + it->y) >= y)
2869 sd->wd->anchor_item = it;
2870 sd->wd->anchor_y = -(itb->y + it->y - y);
2877 if (!sd->wd->reorder_move_animator) evas_object_smart_changed(obj);
2881 _pan_get(Evas_Object *obj,
2885 Pan *sd = evas_object_smart_data_get(obj);
2888 if (x) *x = sd->wd->pan_x;
2889 if (y) *y = sd->wd->pan_y;
2893 _pan_max_get(Evas_Object *obj,
2897 Pan *sd = evas_object_smart_data_get(obj);
2901 evas_object_geometry_get(obj, NULL, NULL, &ow, &oh);
2902 ow = sd->wd->minw - ow;
2904 oh = sd->wd->minh - oh;
2911 _pan_min_get(Evas_Object *obj __UNUSED__,
2920 _pan_child_size_get(Evas_Object *obj,
2924 Pan *sd = evas_object_smart_data_get(obj);
2927 if (w) *w = sd->wd->minw;
2928 if (h) *h = sd->wd->minh;
2932 _pan_add(Evas_Object *obj)
2935 Evas_Object_Smart_Clipped_Data *cd;
2938 cd = evas_object_smart_data_get(obj);
2941 sd->__clipped_data = *cd;
2943 evas_object_smart_data_set(obj, sd);
2947 _pan_del(Evas_Object *obj)
2949 Pan *sd = evas_object_smart_data_get(obj);
2954 ecore_job_del(sd->resize_job);
2955 sd->resize_job = NULL;
2961 _pan_resize_job(void *data)
2965 _sizing_eval(sd->wd->obj);
2966 sd->resize_job = NULL;
2970 _pan_resize(Evas_Object *obj,
2974 Pan *sd = evas_object_smart_data_get(obj);
2978 evas_object_geometry_get(obj, NULL, NULL, &ow, &oh);
2979 if ((ow == w) && (oh == h)) return;
2980 if ((sd->wd->mode == ELM_LIST_COMPRESS) && (ow != w))
2983 if (sd->resize_job) ecore_job_del(sd->resize_job);
2984 sd->resize_job = ecore_job_add(_pan_resize_job, sd);
2986 sd->wd->pan_changed = EINA_TRUE;
2987 evas_object_smart_changed(obj);
2988 if (sd->wd->calc_job) ecore_job_del(sd->wd->calc_job);
2989 sd->wd->calc_job = NULL;
2991 if (sd->wd->calc_job) ecore_job_del(sd->wd->calc_job);
2992 sd->wd->calc_job = ecore_job_add(_calc_job, sd->wd);
2997 _pan_calculate(Evas_Object *obj)
2999 Pan *sd = evas_object_smart_data_get(obj);
3001 Evas_Coord ox, oy, ow, oh, cvx, cvy, cvw, cvh;
3007 evas_event_freeze(evas_object_evas_get(obj));
3009 if (sd->wd->pan_changed)
3012 sd->wd->pan_changed = EINA_FALSE;
3015 evas_object_geometry_get(obj, &ox, &oy, &ow, &oh);
3016 evas_output_viewport_get(evas_object_evas_get(obj), &cvx, &cvy, &cvw, &cvh);
3017 EINA_LIST_FOREACH(sd->wd->group_items, l, git)
3019 git->item->want_realize = EINA_FALSE;
3022 if (sd->wd->tree_effect_enabled && (sd->wd->move_effect_mode != ELM_GENLIST_TREE_EFFECT_NONE))
3024 if (!sd->wd->tree_effect_animator)
3026 _item_tree_effect_before(sd->wd->expanded_item);
3027 evas_object_raise(sd->wd->alpha_bg);
3028 evas_object_show(sd->wd->alpha_bg);
3029 sd->wd->start_time = ecore_time_get();
3030 sd->wd->tree_effect_animator = ecore_animator_add(_tree_effect_animator_cb, sd->wd);
3034 EINA_INLIST_FOREACH(sd->wd->blocks, itb)
3036 itb->w = sd->wd->minw;
3037 if (ELM_RECTS_INTERSECT(itb->x - sd->wd->pan_x + ox,
3038 itb->y - sd->wd->pan_y + oy,
3040 cvx, cvy, cvw, cvh))
3042 if ((!itb->realized) || (itb->changed))
3043 _item_block_realize(itb);
3044 _item_block_position(itb, in);
3048 if (itb->realized) _item_block_unrealize(itb);
3052 if ((!sd->wd->reorder_it) || (sd->wd->reorder_pan_move))
3053 _group_items_recalc(sd->wd);
3054 if ((sd->wd->reorder_mode) && (sd->wd->reorder_it))
3056 if (sd->wd->pan_y != sd->wd->reorder_old_pan_y)
3057 sd->wd->reorder_pan_move = EINA_TRUE;
3058 else sd->wd->reorder_pan_move = EINA_FALSE;
3059 evas_object_raise(sd->wd->VIEW(reorder_it));
3060 sd->wd->reorder_old_pan_y = sd->wd->pan_y;
3061 sd->wd->start_time = ecore_loop_time_get();
3064 if (!sd->wd->tree_effect_enabled || (sd->wd->move_effect_mode == ELM_GENLIST_TREE_EFFECT_NONE))
3065 _item_auto_scroll(sd->wd);
3067 evas_event_thaw(evas_object_evas_get(obj));
3068 evas_event_thaw_eval(evas_object_evas_get(obj));
3072 _pan_move(Evas_Object *obj,
3073 Evas_Coord x __UNUSED__,
3074 Evas_Coord y __UNUSED__)
3076 Pan *sd = evas_object_smart_data_get(obj);
3080 sd->wd->pan_changed = EINA_TRUE;
3081 evas_object_smart_changed(obj);
3082 if (sd->wd->calc_job) ecore_job_del(sd->wd->calc_job);
3083 sd->wd->calc_job = NULL;
3087 _hold_on(void *data __UNUSED__,
3089 void *event_info __UNUSED__)
3091 Widget_Data *wd = elm_widget_data_get(obj);
3093 elm_smart_scroller_hold_set(wd->scr, 1);
3097 _hold_off(void *data __UNUSED__,
3099 void *event_info __UNUSED__)
3101 Widget_Data *wd = elm_widget_data_get(obj);
3103 elm_smart_scroller_hold_set(wd->scr, 0);
3107 _freeze_on(void *data __UNUSED__,
3109 void *event_info __UNUSED__)
3111 Widget_Data *wd = elm_widget_data_get(obj);
3113 elm_smart_scroller_freeze_set(wd->scr, 1);
3117 _freeze_off(void *data __UNUSED__,
3119 void *event_info __UNUSED__)
3121 Widget_Data *wd = elm_widget_data_get(obj);
3123 elm_smart_scroller_freeze_set(wd->scr, 0);
3127 _scr_anim_start(void *data,
3128 Evas_Object *obj __UNUSED__,
3129 void *event_info __UNUSED__)
3131 evas_object_smart_callback_call(data, SIG_SCROLL_ANIM_START, NULL);
3135 _scr_anim_stop(void *data,
3136 Evas_Object *obj __UNUSED__,
3137 void *event_info __UNUSED__)
3139 evas_object_smart_callback_call(data, SIG_SCROLL_ANIM_STOP, NULL);
3143 _scr_drag_start(void *data,
3144 Evas_Object *obj __UNUSED__,
3145 void *event_info __UNUSED__)
3147 evas_object_smart_callback_call(data, SIG_SCROLL_DRAG_START, NULL);
3151 _scr_drag_stop(void *data,
3152 Evas_Object *obj __UNUSED__,
3153 void *event_info __UNUSED__)
3155 evas_object_smart_callback_call(data, SIG_SCROLL_DRAG_STOP, NULL);
3159 _edge_left(void *data,
3160 Evas_Object *scr __UNUSED__,
3161 void *event_info __UNUSED__)
3163 Evas_Object *obj = data;
3164 evas_object_smart_callback_call(obj, SIG_EDGE_LEFT, NULL);
3168 _edge_right(void *data,
3169 Evas_Object *scr __UNUSED__,
3170 void *event_info __UNUSED__)
3172 Evas_Object *obj = data;
3173 evas_object_smart_callback_call(obj, SIG_EDGE_RIGHT, NULL);
3177 _edge_top(void *data,
3178 Evas_Object *scr __UNUSED__,
3179 void *event_info __UNUSED__)
3181 Evas_Object *obj = data;
3182 evas_object_smart_callback_call(obj, SIG_EDGE_TOP, NULL);
3186 _edge_bottom(void *data,
3187 Evas_Object *scr __UNUSED__,
3188 void *event_info __UNUSED__)
3190 Evas_Object *obj = data;
3191 evas_object_smart_callback_call(obj, SIG_EDGE_BOTTOM, NULL);
3195 _mode_item_realize(Elm_Gen_Item *it)
3199 if ((it->item->mode_view) || (it->generation < it->wd->generation)) return;
3201 evas_event_freeze(evas_object_evas_get(it->wd->obj));
3202 it->item->mode_view = edje_object_add(evas_object_evas_get(WIDGET(it)));
3203 edje_object_scale_set(it->item->mode_view,
3204 elm_widget_scale_get(WIDGET(it)) *
3205 _elm_config->scale);
3206 evas_object_smart_member_add(it->item->mode_view, it->wd->pan_smart);
3207 elm_widget_sub_object_add(WIDGET(it), it->item->mode_view);
3209 strncpy(buf, "item", sizeof(buf));
3210 if (it->wd->mode == ELM_LIST_COMPRESS)
3211 strncat(buf, "_compress", sizeof(buf) - strlen(buf));
3213 if (it->item->order_num_in & 0x1) strncat(buf, "_odd", sizeof(buf) - strlen(buf));
3214 strncat(buf, "/", sizeof(buf) - strlen(buf));
3215 strncat(buf, it->itc->decorate_item_style, sizeof(buf) - strlen(buf));
3217 _elm_theme_object_set(WIDGET(it), it->item->mode_view, "genlist", buf,
3218 elm_widget_style_get(WIDGET(it)));
3219 edje_object_mirrored_set(it->item->mode_view,
3220 elm_widget_mirrored_get(WIDGET(it)));
3222 /* signal callback add */
3223 evas_object_event_callback_add(it->item->mode_view, EVAS_CALLBACK_MOUSE_DOWN,
3225 evas_object_event_callback_add(it->item->mode_view, EVAS_CALLBACK_MOUSE_UP,
3227 evas_object_event_callback_add(it->item->mode_view, EVAS_CALLBACK_MOUSE_MOVE,
3230 /* text_get, content_get, state_get */
3231 /* FIXME: If you see that assert, please notify us and we
3232 will clean our mess */
3233 assert(eina_list_count(it->item->mode_content_objs) == 0);
3235 _item_text_realize(it, it->item->mode_view, &it->item->mode_texts, NULL);
3236 it->item->mode_content_objs =
3237 _item_content_realize(it, it->item->mode_view,
3238 &it->item->mode_contents, NULL);
3239 _item_state_realize(it, it->item->mode_view, &it->item->mode_states, NULL);
3241 edje_object_part_swallow(it->item->mode_view,
3242 edje_object_data_get(it->item->mode_view, "mode_part"),
3245 it->want_unrealize = EINA_FALSE;
3246 evas_event_thaw(evas_object_evas_get(it->wd->obj));
3247 evas_event_thaw_eval(evas_object_evas_get(it->wd->obj));
3251 _mode_item_unrealize(Elm_Gen_Item *it)
3253 Widget_Data *wd = it->wd;
3254 Evas_Object *content;
3255 if (!it->item->mode_view) return;
3257 evas_event_freeze(evas_object_evas_get(it->wd->obj));
3258 elm_widget_stringlist_free(it->item->mode_texts);
3259 it->item->mode_texts = NULL;
3260 elm_widget_stringlist_free(it->item->mode_contents);
3261 it->item->mode_contents = NULL;
3262 elm_widget_stringlist_free(it->item->mode_states);
3264 EINA_LIST_FREE(it->item->mode_content_objs, content)
3265 evas_object_del(content);
3267 edje_object_part_unswallow(it->item->mode_view, VIEW(it));
3268 evas_object_smart_member_add(VIEW(it), wd->pan_smart);
3269 evas_object_del(it->item->mode_view);
3270 it->item->mode_view = NULL;
3272 if (wd->mode_item == it)
3273 wd->mode_item = NULL;
3274 evas_event_thaw(evas_object_evas_get(it->wd->obj));
3275 evas_event_thaw_eval(evas_object_evas_get(it->wd->obj));
3279 _item_mode_set(Elm_Gen_Item *it)
3282 Widget_Data *wd = it->wd;
3287 it->item->nocache_once = EINA_TRUE;
3289 if (wd->scr_hold_timer)
3291 ecore_timer_del(wd->scr_hold_timer);
3292 wd->scr_hold_timer = NULL;
3294 elm_smart_scroller_hold_set(wd->scr, EINA_TRUE);
3295 wd->scr_hold_timer = ecore_timer_add(0.1, _scr_hold_timer_cb, wd);
3297 evas_event_freeze(evas_object_evas_get(it->wd->obj));
3298 _mode_item_realize(it);
3299 if (it->item->group_item)
3300 evas_object_raise(it->item->VIEW(group_item));
3301 _item_position(it, it->item->mode_view, it->item->scrl_x, it->item->scrl_y);
3302 evas_event_thaw(evas_object_evas_get(it->wd->obj));
3303 evas_event_thaw_eval(evas_object_evas_get(it->wd->obj));
3305 snprintf(buf, sizeof(buf), "elm,state,%s,active", wd->decorate_type);
3306 edje_object_signal_emit(it->item->mode_view, buf, "elm");
3310 _item_mode_unset(Widget_Data *wd)
3313 if (!wd->mode_item) return;
3314 char buf[1024], buf2[1024];
3318 it->item->nocache_once = EINA_TRUE;
3320 snprintf(buf, sizeof(buf), "elm,state,%s,passive", wd->decorate_type);
3321 snprintf(buf2, sizeof(buf2), "elm,state,%s,passive,finished", wd->decorate_type);
3323 edje_object_signal_emit(it->item->mode_view, buf, "elm");
3324 edje_object_signal_callback_add(it->item->mode_view, buf2, "elm", _mode_finished_signal_cb, it);
3326 wd->mode_item = NULL;
3330 _decorate_mode_item_position(Elm_Gen_Item *it, int itx, int ity)
3332 if ((!it) || (!it->wd->decorate_mode)) return;
3333 evas_object_resize(it->deco_obj, it->item->w, it->item->h);
3334 evas_object_move(it->deco_obj, itx, ity);
3338 _decorate_mode_item_realize(Elm_Gen_Item *it, Eina_Bool effect_on)
3341 const char *stacking_even;
3342 const char *stacking;
3344 if ((!it) || (it->item->decorate_mode_item_realized) ||
3345 (it->generation < it->wd->generation))
3348 it->deco_obj = edje_object_add(evas_object_evas_get(WIDGET(it)));
3349 edje_object_scale_set(it->deco_obj, elm_widget_scale_get(WIDGET(it)) *
3350 _elm_config->scale);
3351 evas_object_smart_member_add(it->deco_obj, it->wd->pan_smart);
3352 elm_widget_sub_object_add(WIDGET(it), it->deco_obj);
3354 if (it->item->type & ELM_GENLIST_ITEM_TREE)
3355 strncpy(buf, "tree", sizeof(buf));
3356 else strncpy(buf, "item", sizeof(buf));
3357 if (it->wd->mode == ELM_LIST_COMPRESS)
3358 strncat(buf, "_compress", sizeof(buf) - strlen(buf));
3360 strncat(buf, "/", sizeof(buf) - strlen(buf));
3361 strncat(buf, it->itc->decorate_all_item_style, sizeof(buf) - strlen(buf));
3363 _elm_theme_object_set(WIDGET(it), it->deco_obj, "genlist", buf,
3364 elm_widget_style_get(WIDGET(it)));
3366 stacking_even = edje_object_data_get(VIEW(it), "stacking_even");
3367 if (!stacking_even) stacking_even = "above";
3368 it->item->stacking_even = !!strcmp("above", stacking_even);
3370 stacking = edje_object_data_get(VIEW(it), "stacking");
3371 if (!stacking) stacking = "yes";
3372 it->item->nostacking = !!strcmp("yes", stacking);
3374 edje_object_mirrored_set(it->deco_obj,
3375 elm_widget_mirrored_get(WIDGET(it)));
3377 _elm_genlist_item_odd_even_update(it);
3378 _elm_genlist_item_state_update(it, NULL);
3380 if (effect_on) edje_object_signal_emit(it->deco_obj, "elm,state,decorate,enabled,effect", "elm");
3381 else edje_object_signal_emit(it->deco_obj, "elm,state,decorate,enabled", "elm");
3383 _item_mouse_callbacks_del(it, VIEW(it));
3384 _item_mouse_callbacks_add(it, it->deco_obj);
3386 _item_text_realize(it, it->deco_obj, &it->item->deco_texts, NULL);
3387 if (it->flipped) edje_object_signal_emit(it->deco_obj, "elm,state,flip,enabled", "elm");
3388 it->item->deco_content_objs =
3389 _item_content_realize(it, it->deco_obj, &it->item->deco_contents, NULL);
3390 _item_state_realize(it, it->deco_obj, &it->item->deco_states, NULL);
3391 edje_object_part_swallow(it->deco_obj, "elm.swallow.decorate.content", VIEW(it));
3393 _decorate_mode_item_position(it, it->item->scrl_x, it->item->scrl_y);
3394 evas_object_show(it->deco_obj);
3396 it->item->decorate_mode_item_realized = EINA_TRUE;
3397 it->want_unrealize = EINA_FALSE;
3401 _decorate_mode_item_unrealize(Elm_Gen_Item *it)
3404 if ((!it) || (!it->item->decorate_mode_item_realized)) return;
3406 edje_object_part_unswallow(it->deco_obj, VIEW(it));
3407 evas_object_smart_member_add(VIEW(it), it->wd->pan_smart);
3408 elm_widget_sub_object_add(WIDGET(it), VIEW(it));
3409 _elm_genlist_item_odd_even_update(it);
3410 _elm_genlist_item_state_update(it, NULL);
3412 evas_object_del(it->deco_obj);
3413 it->deco_obj = NULL;
3414 elm_widget_stringlist_free(it->item->deco_texts);
3415 it->item->deco_texts = NULL;
3416 elm_widget_stringlist_free(it->item->deco_contents);
3417 it->item->deco_contents = NULL;
3418 elm_widget_stringlist_free(it->item->deco_states);
3419 it->item->deco_states = NULL;
3420 EINA_LIST_FREE(it->item->deco_content_objs, icon)
3421 evas_object_del(icon);
3422 edje_object_message_signal_process(it->deco_obj);
3423 _item_mouse_callbacks_del(it, it->deco_obj);
3424 _item_mouse_callbacks_add(it, VIEW(it));
3426 it->item->decorate_mode_item_realized = EINA_FALSE;
3430 _item_auto_scroll(Widget_Data *wd)
3433 Elm_Gen_Item *tmp_item = NULL;
3435 if ((wd->expanded_item) && (wd->auto_scroll_enabled))
3437 tmp_item = eina_list_data_get(eina_list_last(wd->expanded_item->item->items));
3438 if (!tmp_item) return;
3439 wd->show_item = tmp_item;
3440 wd->bring_in = EINA_TRUE;
3441 wd->scrollto_type = ELM_GENLIST_ITEM_SCROLLTO_IN;
3442 if ((wd->show_item->item->queued) || (!wd->show_item->item->mincalcd))
3444 wd->show_item->item->showme = EINA_TRUE;
3445 wd->auto_scroll_enabled = EINA_FALSE;
3453 elm_genlist_add(Evas_Object *parent)
3458 Evas_Coord minw, minh;
3459 static Evas_Smart *smart = NULL;
3463 static Evas_Smart_Class sc;
3465 evas_object_smart_clipped_smart_set(&_pan_sc);
3467 sc.name = "elm_genlist_pan";
3468 sc.version = EVAS_SMART_CLASS_VERSION;
3471 sc.resize = _pan_resize;
3472 sc.move = _pan_move;
3473 sc.calculate = _pan_calculate;
3474 if (!(smart = evas_smart_class_new(&sc))) return NULL;
3477 ELM_WIDGET_STANDARD_SETUP(wd, Widget_Data, parent, e, obj, NULL);
3479 ELM_SET_WIDTYPE(widtype, "genlist");
3481 elm_widget_type_set(obj, "genlist");
3482 elm_widget_sub_object_add(parent, obj);
3483 elm_widget_on_focus_hook_set(obj, _on_focus_hook, NULL);
3484 elm_widget_signal_emit_hook_set(obj, _signal_emit_hook);
3485 elm_widget_data_set(obj, wd);
3486 elm_widget_del_hook_set(obj, _del_hook);
3487 elm_widget_del_pre_hook_set(obj, _del_pre_hook);
3488 elm_widget_theme_hook_set(obj, _theme_hook);
3489 elm_widget_can_focus_set(obj, EINA_TRUE);
3490 elm_widget_event_hook_set(obj, _event_hook);
3491 elm_widget_on_show_region_hook_set(obj, _show_region_hook, obj);
3492 elm_widget_translate_hook_set(obj, _translate_hook);
3495 wd->scr = elm_smart_scroller_add(e);
3496 elm_smart_scroller_widget_set(wd->scr, obj);
3497 elm_smart_scroller_object_theme_set(obj, wd->scr, "genlist", "base",
3498 elm_widget_style_get(obj));
3499 elm_smart_scroller_bounce_allow_set(wd->scr, EINA_FALSE,
3500 _elm_config->thumbscroll_bounce_enable);
3501 elm_widget_resize_object_set(obj, wd->scr);
3503 evas_object_smart_callback_add(wd->scr, "animate,start", _scr_anim_start, obj);
3504 evas_object_smart_callback_add(wd->scr, "animate,stop", _scr_anim_stop, obj);
3505 evas_object_smart_callback_add(wd->scr, "drag,start", _scr_drag_start, obj);
3506 evas_object_smart_callback_add(wd->scr, "drag,stop", _scr_drag_stop, obj);
3507 evas_object_smart_callback_add(wd->scr, "edge,left", _edge_left, obj);
3508 evas_object_smart_callback_add(wd->scr, "edge,right", _edge_right, obj);
3509 evas_object_smart_callback_add(wd->scr, "edge,top", _edge_top, obj);
3510 evas_object_smart_callback_add(wd->scr, "edge,bottom", _edge_bottom, obj);
3513 wd->mode = ELM_LIST_SCROLL;
3514 wd->max_items_per_block = MAX_ITEMS_PER_BLOCK;
3515 wd->item_cache_max = wd->max_items_per_block * 2;
3516 wd->longpress_timeout = _elm_config->longpress_timeout;
3517 wd->highlight = EINA_TRUE;
3519 evas_object_smart_callback_add(obj, "scroll-hold-on", _hold_on, obj);
3520 evas_object_smart_callback_add(obj, "scroll-hold-off", _hold_off, obj);
3521 evas_object_smart_callback_add(obj, "scroll-freeze-on", _freeze_on, obj);
3522 evas_object_smart_callback_add(obj, "scroll-freeze-off", _freeze_off, obj);
3524 wd->pan_smart = evas_object_smart_add(e, smart);
3525 wd->pan = evas_object_smart_data_get(wd->pan_smart);
3528 elm_smart_scroller_extern_pan_set(wd->scr, wd->pan_smart,
3529 _pan_set, _pan_get, _pan_max_get,
3530 _pan_min_get, _pan_child_size_get);
3532 edje_object_size_min_calc(elm_smart_scroller_edje_object_get(wd->scr),
3534 evas_object_size_hint_min_set(obj, minw, minh);
3536 evas_object_smart_callbacks_descriptions_set(obj, _signals);
3538 _mirrored_set(obj, elm_widget_mirrored_get(obj));
3544 _item_select(Elm_Gen_Item *it)
3546 Evas_Object *obj = WIDGET(it);
3548 if ((it->generation < it->wd->generation) || (it->mode_set) ||
3549 (it->select_mode == ELM_OBJECT_SELECT_MODE_NONE) ||
3550 (it->wd->select_mode == ELM_OBJECT_SELECT_MODE_NONE))
3554 it->selected = EINA_TRUE;
3555 it->wd->selected = eina_list_append(it->wd->selected, it);
3557 else if (it->wd->select_mode != ELM_OBJECT_SELECT_MODE_ALWAYS) return;
3559 evas_object_ref(obj);
3562 if (it->func.func) it->func.func((void *)it->func.data, WIDGET(it), it);
3563 if (it->generation == it->wd->generation)
3564 evas_object_smart_callback_call(WIDGET(it), SIG_SELECTED, it);
3567 if ((it->wd->clear_me) && (!it->wd->walking))
3568 _elm_genlist_clear(WIDGET(it), EINA_TRUE);
3571 if ((!it->walking) && (it->generation < it->wd->generation))
3576 elm_widget_item_free(it);
3580 it->wd->last_selected_item = (Elm_Object_Item *)it;
3582 evas_object_unref(obj);
3585 static Evas_Object *
3586 _item_content_get_hook(Elm_Gen_Item *it, const char *part)
3588 return edje_object_part_swallow_get(VIEW(it), part);
3592 _item_content_set_hook(Elm_Gen_Item *it, const char *part, Evas_Object *content)
3594 Evas_Object *prev_obj;
3596 if (content && part)
3598 if (eina_list_data_find(it->content_objs, content)) return;
3599 prev_obj = _item_content_unset_hook(it, part);
3600 if (prev_obj) evas_object_del(prev_obj);
3601 it->content_objs = eina_list_append(it->content_objs, content);
3602 edje_object_part_swallow(VIEW(it), part, content);
3606 static Evas_Object *
3607 _item_content_unset_hook(Elm_Gen_Item *it, const char *part)
3610 obj = edje_object_part_swallow_get(VIEW(it), part);
3611 if (!obj) return NULL;
3612 it->content_objs = eina_list_remove(it->content_objs, obj);
3613 edje_object_part_unswallow(VIEW(it), obj);
3618 _item_text_hook(Elm_Gen_Item *it, const char *part)
3620 if (!it->itc->func.text_get) return NULL;
3621 return edje_object_part_text_get(VIEW(it), part);
3625 _item_disable_hook(Elm_Object_Item *it)
3629 Elm_Gen_Item *_it = (Elm_Gen_Item *)it;
3631 if (_it->generation < _it->wd->generation) return;
3634 elm_genlist_item_selected_set(it, EINA_FALSE);
3638 if (elm_widget_item_disabled_get(it))
3640 edje_object_signal_emit(VIEW(_it), "elm,state,disabled", "elm");
3642 edje_object_signal_emit(_it->deco_obj, "elm,state,disabled", "elm");
3646 edje_object_signal_emit(VIEW(_it), "elm,state,enabled", "elm");
3648 edje_object_signal_emit(_it->deco_obj, "elm,state,enabled", "elm");
3650 EINA_LIST_FOREACH(_it->content_objs, l, obj)
3651 elm_widget_disabled_set(obj, elm_widget_item_disabled_get(_it));
3656 _item_del_pre_hook(Elm_Object_Item *it)
3658 Elm_Gen_Item *_it = (Elm_Gen_Item *)it;
3660 if ((_it->relcount > 0) || (_it->walking > 0))
3662 elm_genlist_item_subitems_clear(it);
3663 if (_it->wd->show_item == _it) _it->wd->show_item = NULL;
3664 _elm_genlist_item_del_notserious(_it);
3665 if (_it->item->block)
3667 if (_it->realized) _elm_genlist_item_unrealize(_it, EINA_FALSE);
3668 _it->item->block->changed = EINA_TRUE;
3669 if (_it->wd->calc_job) ecore_job_del(_it->wd->calc_job);
3670 _it->wd->calc_job = ecore_job_add(_calc_job, _it->wd);
3674 _it->parent->item->items =
3675 eina_list_remove(_it->parent->item->items, it);
3685 _item_signal_emit_hook(Elm_Object_Item *it,
3686 const char *emission,
3689 edje_object_signal_emit(VIEW(it), emission, source);
3693 _elm_genlist_item_new(Widget_Data *wd,
3694 const Elm_Gen_Item_Class *itc,
3696 Elm_Gen_Item *parent,
3698 const void *func_data)
3702 it = elm_widget_item_new(wd->obj, Elm_Gen_Item);
3703 if (!it) return NULL;
3705 it->generation = wd->generation;
3707 elm_genlist_item_class_ref((Elm_Genlist_Item_Class *)itc);
3708 it->base.data = data;
3709 it->parent = parent;
3710 it->func.func = func;
3711 it->func.data = func_data;
3712 elm_widget_item_content_get_hook_set(it, _item_content_get_hook);
3713 elm_widget_item_content_set_hook_set(it, _item_content_set_hook);
3714 elm_widget_item_content_unset_hook_set(it, _item_content_unset_hook);
3715 elm_widget_item_text_get_hook_set(it, _item_text_hook);
3716 elm_widget_item_disable_hook_set(it, _item_disable_hook);
3717 elm_widget_item_del_pre_hook_set(it, _item_del_pre_hook);
3718 elm_widget_item_signal_emit_hook_set(it, _item_signal_emit_hook);
3721 it->sel_cb = (Ecore_Cb)_item_select;
3726 static Elm_Gen_Item *
3727 _item_new(Widget_Data *wd,
3728 const Elm_Genlist_Item_Class *itc,
3730 Elm_Gen_Item *parent,
3731 Elm_Genlist_Item_Type type,
3733 const void *func_data)
3735 Elm_Gen_Item *it, *it2;
3738 it = _elm_genlist_item_new(wd, itc, data, parent, func, func_data);
3739 if (!it) return NULL;
3740 it->item = ELM_NEW(Elm_Gen_Item_Type);
3741 it->item->type = type;
3742 if (type & ELM_GENLIST_ITEM_GROUP) it->group++;
3743 it->item->expanded_depth = 0;
3744 ELM_GEN_ITEM_SETUP(it);
3747 if (it->parent->group)
3748 it->item->group_item = parent;
3749 else if (it->parent->item->group_item)
3750 it->item->group_item = it->parent->item->group_item;
3752 for (it2 = it, depth = 0; it2->parent; it2 = it2->parent)
3754 if (!it2->parent->group) depth += 1;
3756 it->item->expanded_depth = depth;
3762 _item_block_new(Widget_Data *wd, Eina_Bool prepend)
3766 itb = calloc(1, sizeof(Item_Block));
3767 if (!itb) return NULL;
3771 wd->blocks = eina_inlist_prepend(wd->blocks, EINA_INLIST_GET(itb));
3772 _item_block_position_update(wd->blocks, 0);
3776 wd->blocks = eina_inlist_append(wd->blocks, EINA_INLIST_GET(itb));
3777 itb->position_update = EINA_TRUE;
3778 if (wd->blocks != EINA_INLIST_GET(itb))
3780 itb->position = ((Item_Block *) (EINA_INLIST_GET(itb)->prev))->position + 1;
3791 _item_block_add(Widget_Data *wd,
3794 Item_Block *itb = NULL;
3801 itb = calloc(1, sizeof(Item_Block));
3802 if (!itb) return EINA_FALSE;
3804 if (!it->item->rel->item->block)
3807 eina_inlist_append(wd->blocks, EINA_INLIST_GET(itb));
3808 itb->items = eina_list_append(itb->items, it);
3809 itb->position_update = EINA_TRUE;
3810 it->position = eina_list_count(itb->items);
3811 it->position_update = EINA_TRUE;
3813 if (wd->blocks != EINA_INLIST_GET(itb))
3815 itb->position = ((Item_Block *) (EINA_INLIST_GET(itb)->prev))->position + 1;
3826 tmp = eina_list_data_find_list(itb->items, it->item->rel);
3827 if (it->item->before)
3829 wd->blocks = eina_inlist_prepend_relative
3830 (wd->blocks, EINA_INLIST_GET(itb),
3831 EINA_INLIST_GET(it->item->rel->item->block));
3833 eina_list_prepend_relative_list(itb->items, it, tmp);
3835 /* Update index from where we prepended */
3836 _item_position_update(eina_list_prev(tmp), it->item->rel->position);
3837 _item_block_position_update(EINA_INLIST_GET(itb),
3838 it->item->rel->item->block->position);
3842 wd->blocks = eina_inlist_append_relative
3843 (wd->blocks, EINA_INLIST_GET(itb),
3844 EINA_INLIST_GET(it->item->rel->item->block));
3846 eina_list_append_relative_list(itb->items, it, tmp);
3848 /* Update block index from where we appended */
3849 _item_position_update(eina_list_next(tmp), it->item->rel->position + 1);
3850 _item_block_position_update(EINA_INLIST_GET(itb),
3851 it->item->rel->item->block->position + 1);
3857 if (it->item->before)
3861 itb = (Item_Block *)(wd->blocks);
3862 if (itb->count >= wd->max_items_per_block)
3864 itb = _item_block_new(wd, EINA_TRUE);
3865 if (!itb) return EINA_FALSE;
3870 itb = _item_block_new(wd, EINA_TRUE);
3871 if (!itb) return EINA_FALSE;
3873 itb->items = eina_list_prepend(itb->items, it);
3875 _item_position_update(itb->items, 0);
3881 itb = (Item_Block *)(wd->blocks->last);
3882 if (itb->count >= wd->max_items_per_block)
3884 itb = _item_block_new(wd, EINA_FALSE);
3885 if (!itb) return EINA_FALSE;
3890 itb = _item_block_new(wd, EINA_FALSE);
3891 if (!itb) return EINA_FALSE;
3893 itb->items = eina_list_append(itb->items, it);
3894 it->position = eina_list_count(itb->items);
3902 if (it->item->rel->item->queued)
3904 /* NOTE: for a strange reason eina_list and eina_inlist don't have the same property
3905 on sorted insertion order, so the queue is not always ordered like the item list.
3906 This lead to issue where we depend on an item that is not yet created. As a quick
3907 work around, we reschedule the calc of the item and stop reordering the list to
3908 prevent any nasty issue to show up here.
3910 wd->queue = eina_list_append(wd->queue, it);
3911 wd->requeued = EINA_TRUE;
3912 it->item->queued = EINA_TRUE;
3915 itb = it->item->rel->item->block;
3916 if (!itb) goto newblock;
3917 tmp = eina_list_data_find_list(itb->items, it->item->rel);
3918 if (it->item->before)
3920 itb->items = eina_list_prepend_relative_list(itb->items, it, tmp);
3921 _item_position_update(eina_list_prev(tmp), it->item->rel->position);
3925 itb->items = eina_list_append_relative_list(itb->items, it, tmp);
3926 _item_position_update(eina_list_next(tmp), it->item->rel->position + 1);
3930 itb->changed = EINA_TRUE;
3931 it->item->block = itb;
3932 if (itb->wd->calc_job) ecore_job_del(itb->wd->calc_job);
3933 itb->wd->calc_job = ecore_job_add(_calc_job, itb->wd);
3936 it->item->rel->relcount--;
3937 if ((it->item->rel->generation < it->wd->generation) && (!it->item->rel->relcount))
3939 _item_del(it->item->rel);
3940 elm_widget_item_free(it->item->rel);
3942 it->item->rel = NULL;
3944 if (itb->count > itb->wd->max_items_per_block)
3949 Eina_Bool done = EINA_FALSE;
3951 newc = itb->count / 2;
3953 if (EINA_INLIST_GET(itb)->prev)
3955 Item_Block *itbp = (Item_Block *)(EINA_INLIST_GET(itb)->prev);
3957 if (itbp->count + newc < wd->max_items_per_block / 2)
3959 /* moving items to previous block */
3960 while ((itb->count > newc) && (itb->items))
3962 it2 = eina_list_data_get(itb->items);
3963 itb->items = eina_list_remove_list(itb->items, itb->items);
3966 itbp->items = eina_list_append(itbp->items, it2);
3967 it2->item->block = itbp;
3975 if (!done && EINA_INLIST_GET(itb)->next)
3977 Item_Block *itbn = (Item_Block *)(EINA_INLIST_GET(itb)->next);
3979 if (itbn->count + newc < wd->max_items_per_block / 2)
3981 /* moving items to next block */
3982 while ((itb->count > newc) && (itb->items))
3986 l = eina_list_last(itb->items);
3987 it2 = eina_list_data_get(l);
3988 itb->items = eina_list_remove_list(itb->items, l);
3991 itbn->items = eina_list_prepend(itbn->items, it2);
3992 it2->item->block = itbn;
4002 /* moving items to new block */
4003 itb2 = calloc(1, sizeof(Item_Block));
4004 if (!itb2) return EINA_FALSE;
4007 eina_inlist_append_relative(wd->blocks, EINA_INLIST_GET(itb2),
4008 EINA_INLIST_GET(itb));
4009 itb2->changed = EINA_TRUE;
4010 while ((itb->count > newc) && (itb->items))
4014 l = eina_list_last(itb->items);
4016 itb->items = eina_list_remove_list(itb->items, l);
4019 itb2->items = eina_list_prepend(itb2->items, it2);
4020 it2->item->block = itb2;
4030 _queue_process(Widget_Data *wd)
4033 Eina_Bool showme = EINA_FALSE;
4036 t0 = ecore_loop_time_get();
4037 //evas_event_freeze(evas_object_evas_get(wd->obj));
4038 for (n = 0; (wd->queue) && (n < 128); n++)
4042 it = eina_list_data_get(wd->queue);
4043 wd->queue = eina_list_remove_list(wd->queue, wd->queue);
4044 it->item->queued = EINA_FALSE;
4045 if (!_item_block_add(wd, it)) continue;
4047 _item_block_realize(it->item->block);
4048 t = ecore_time_get();
4049 if (it->item->block->changed)
4051 showme = _item_block_recalc(it->item->block, it->item->block->num, EINA_TRUE);
4052 it->item->block->changed = 0;
4053 if (wd->pan_changed)
4055 if (wd->calc_job) ecore_job_del(wd->calc_job);
4056 wd->calc_job = NULL;
4058 wd->pan_changed = EINA_FALSE;
4061 if (showme) it->item->block->showme = EINA_TRUE;
4062 /* same as eina_inlist_count > 1 */
4063 if (wd->blocks && wd->blocks->next)
4065 if ((t - t0) > (ecore_animator_frametime_get())) break;
4068 //evas_event_thaw(evas_object_evas_get(wd->obj));
4069 //evas_event_thaw_eval(evas_object_evas_get(wd->obj));
4074 _idle_process(void *data, Eina_Bool *wakeup)
4076 Widget_Data *wd = data;
4079 //static double q_start = 0.0;
4080 //if (q_start == 0.0) q_start = ecore_time_get();
4082 if (_queue_process(wd) > 0) *wakeup = EINA_TRUE;
4086 //printf("PROCESS TIME: %3.3f\n", ecore_time_get() - q_start);
4088 return ECORE_CALLBACK_CANCEL;
4090 return ECORE_CALLBACK_RENEW;
4094 _item_idle_enterer(void *data)
4096 Widget_Data *wd = data;
4097 Eina_Bool wakeup = EINA_FALSE;
4098 Eina_Bool ok = _idle_process(data, &wakeup);
4103 if (wd->calc_job) ecore_job_del(wd->calc_job);
4104 wd->calc_job = ecore_job_add(_calc_job, wd);
4106 if (ok == ECORE_CALLBACK_CANCEL) wd->queue_idle_enterer = NULL;
4111 _item_queue(Widget_Data *wd,
4115 if (it->item->queued) return;
4116 it->item->queued = EINA_TRUE;
4117 if (cb && !wd->requeued)
4118 wd->queue = eina_list_sorted_insert(wd->queue, cb, it);
4120 wd->queue = eina_list_append(wd->queue, it);
4121 // FIXME: why does a freeze then thaw here cause some genlist
4122 // elm_genlist_item_append() to be much much slower?
4123 // evas_event_freeze(evas_object_evas_get(wd->obj));
4124 while ((wd->queue) && ((!wd->blocks) || (!wd->blocks->next)))
4126 if (wd->queue_idle_enterer)
4128 ecore_idle_enterer_del(wd->queue_idle_enterer);
4129 wd->queue_idle_enterer = NULL;
4133 // evas_event_thaw(evas_object_evas_get(wd->obj));
4134 // evas_event_thaw_eval(evas_object_evas_get(wd->obj));
4135 if (!wd->queue_idle_enterer)
4136 wd->queue_idle_enterer = ecore_idle_enterer_add(_item_idle_enterer, wd);
4140 _elm_genlist_item_compare(const void *data, const void *data1)
4142 const Elm_Gen_Item *it, *item1;
4143 it = ELM_GEN_ITEM_FROM_INLIST(data);
4144 item1 = ELM_GEN_ITEM_FROM_INLIST(data1);
4145 return it->wd->item_compare_cb(it, item1);
4149 _elm_genlist_item_list_compare(const void *data, const void *data1)
4151 const Elm_Gen_Item *it = data;
4152 const Elm_Gen_Item *item1 = data1;
4153 return it->wd->item_compare_cb(it, item1);
4156 /*If application want to know the relative item, use elm_genlist_item_prev_get(it)*/
4158 _item_move_after(Elm_Gen_Item *it, Elm_Gen_Item *after)
4163 it->wd->items = eina_inlist_remove(it->wd->items, EINA_INLIST_GET(it));
4164 _item_block_del(it);
4166 it->wd->items = eina_inlist_append_relative(it->wd->items, EINA_INLIST_GET(it), EINA_INLIST_GET(after));
4167 it->item->rel = after;
4168 it->item->rel->relcount++;
4169 it->item->before = EINA_FALSE;
4170 if (after->item->group_item) it->item->group_item = after->item->group_item;
4171 _item_queue(it->wd, it, NULL);
4173 evas_object_smart_callback_call(WIDGET(it), SIG_MOVED_AFTER, it);
4176 /*If application want to know the relative item, use elm_genlist_item_next_get(it)*/
4178 _item_move_before(Elm_Gen_Item *it, Elm_Gen_Item *before)
4181 if (!before) return;
4183 it->wd->items = eina_inlist_remove(it->wd->items, EINA_INLIST_GET(it));
4184 _item_block_del(it);
4185 it->wd->items = eina_inlist_prepend_relative(it->wd->items, EINA_INLIST_GET(it), EINA_INLIST_GET(before));
4186 it->item->rel = before;
4187 it->item->rel->relcount++;
4188 it->item->before = EINA_TRUE;
4189 if (before->item->group_item) it->item->group_item = before->item->group_item;
4190 _item_queue(it->wd, it, NULL);
4192 evas_object_smart_callback_call(WIDGET(it), SIG_MOVED_BEFORE, it);
4196 elm_genlist_items_count(const Evas_Object *obj)
4198 ELM_CHECK_WIDTYPE(obj, widtype) 0;
4199 Widget_Data *wd = elm_widget_data_get(obj);
4201 return wd->item_count;
4204 EAPI Elm_Object_Item *
4205 elm_genlist_item_append(Evas_Object *obj,
4206 const Elm_Genlist_Item_Class *itc,
4208 Elm_Object_Item *parent,
4209 Elm_Genlist_Item_Type type,
4211 const void *func_data)
4213 ELM_CHECK_WIDTYPE(obj, widtype) NULL;
4214 Widget_Data *wd = elm_widget_data_get(obj);
4215 if (!wd) return NULL;
4216 Elm_Gen_Item *it = _item_new(wd, itc, data, (Elm_Gen_Item *) parent, type,
4218 if (!it) return NULL;
4222 wd->group_items = eina_list_append(wd->group_items, it);
4223 wd->items = eina_inlist_append(wd->items, EINA_INLIST_GET(it));
4224 it->item->rel = NULL;
4228 Elm_Gen_Item *it2 = NULL;
4229 Eina_List *ll = eina_list_last(it->parent->item->items);
4230 if (ll) it2 = ll->data;
4231 it->parent->item->items = eina_list_append(it->parent->item->items, it);
4232 if (!it2) it2 = it->parent;
4234 eina_inlist_append_relative(wd->items, EINA_INLIST_GET(it),
4235 EINA_INLIST_GET(it2));
4236 it->item->rel = it2;
4237 it->item->rel->relcount++;
4239 it->item->before = EINA_FALSE;
4240 _item_queue(wd, it, NULL);
4241 return (Elm_Object_Item *)it;
4244 EAPI Elm_Object_Item *
4245 elm_genlist_item_prepend(Evas_Object *obj,
4246 const Elm_Genlist_Item_Class *itc,
4248 Elm_Object_Item *parent,
4249 Elm_Genlist_Item_Type type,
4251 const void *func_data)
4253 ELM_CHECK_WIDTYPE(obj, widtype) NULL;
4254 Widget_Data *wd = elm_widget_data_get(obj);
4255 if (!wd) return NULL;
4256 Elm_Gen_Item *it = _item_new(wd, itc, data, (Elm_Gen_Item *) parent, type,
4258 if (!it) return NULL;
4262 wd->group_items = eina_list_prepend(wd->group_items, it);
4263 wd->items = eina_inlist_prepend(wd->items, EINA_INLIST_GET(it));
4264 it->item->rel = NULL;
4268 Elm_Gen_Item *it2 = NULL;
4269 Eina_List *ll = it->parent->item->items;
4270 if (ll) it2 = ll->data;
4271 it->parent->item->items = eina_list_prepend(it->parent->item->items, it);
4272 if (!it2) it2 = it->parent;
4274 eina_inlist_prepend_relative(wd->items, EINA_INLIST_GET(it),
4275 EINA_INLIST_GET(it2));
4276 it->item->rel = it2;
4277 it->item->rel->relcount++;
4279 it->item->before = EINA_TRUE;
4280 _item_queue(wd, it, NULL);
4281 return (Elm_Object_Item *)it;
4284 EAPI Elm_Object_Item *
4285 elm_genlist_item_insert_after(Evas_Object *obj,
4286 const Elm_Genlist_Item_Class *itc,
4288 Elm_Object_Item *parent,
4289 Elm_Object_Item *after,
4290 Elm_Genlist_Item_Type type,
4292 const void *func_data)
4294 ELM_CHECK_WIDTYPE(obj, widtype) NULL;
4295 ELM_OBJ_ITEM_CHECK_OR_RETURN(after, NULL);
4296 Widget_Data *wd = elm_widget_data_get(obj);
4297 Elm_Gen_Item *_after = (Elm_Gen_Item *) after;
4298 if (!wd) return NULL;
4299 /* It makes no sense to insert after in an empty list with after != NULL, something really bad is happening in your app. */
4300 EINA_SAFETY_ON_NULL_RETURN_VAL(wd->items, NULL);
4302 Elm_Gen_Item *it = _item_new(wd, itc, data, (Elm_Gen_Item *) parent, type,
4304 if (!it) return NULL;
4307 if ((it->group) && (_after->group))
4308 wd->group_items = eina_list_append_relative(wd->group_items, it,
4313 it->parent->item->items =
4314 eina_list_append_relative(it->parent->item->items, it, _after);
4316 wd->items = eina_inlist_append_relative(wd->items, EINA_INLIST_GET(it),
4317 EINA_INLIST_GET(_after));
4318 it->item->rel = _after;
4319 it->item->rel->relcount++;
4320 it->item->before = EINA_FALSE;
4321 _item_queue(wd, it, NULL);
4322 return (Elm_Object_Item *)it;
4325 EAPI Elm_Object_Item *
4326 elm_genlist_item_insert_before(Evas_Object *obj,
4327 const Elm_Genlist_Item_Class *itc,
4329 Elm_Object_Item *parent,
4330 Elm_Object_Item *before,
4331 Elm_Genlist_Item_Type type,
4333 const void *func_data)
4335 ELM_CHECK_WIDTYPE(obj, widtype) NULL;
4336 ELM_OBJ_ITEM_CHECK_OR_RETURN(before, NULL);
4337 Widget_Data *wd = elm_widget_data_get(obj);
4338 Elm_Gen_Item *_before = (Elm_Gen_Item *) before;
4339 if (!wd) return NULL;
4340 /* It makes no sense to insert before in an empty list with before != NULL, something really bad is happening in your app. */
4341 EINA_SAFETY_ON_NULL_RETURN_VAL(wd->items, NULL);
4343 Elm_Gen_Item *it = _item_new(wd, itc, data, (Elm_Gen_Item *) parent, type,
4345 if (!it) return NULL;
4348 if (it->group && _before->group)
4349 wd->group_items = eina_list_prepend_relative(wd->group_items, it,
4354 it->parent->item->items =
4355 eina_list_prepend_relative(it->parent->item->items, it, _before);
4357 wd->items = eina_inlist_prepend_relative(wd->items, EINA_INLIST_GET(it),
4358 EINA_INLIST_GET(_before));
4359 it->item->rel = _before;
4360 it->item->rel->relcount++;
4361 it->item->before = EINA_TRUE;
4362 _item_queue(wd, it, NULL);
4363 return (Elm_Object_Item *)it;
4366 EAPI Elm_Object_Item *
4367 elm_genlist_item_sorted_insert(Evas_Object *obj,
4368 const Elm_Genlist_Item_Class *itc,
4370 Elm_Object_Item *parent,
4371 Elm_Genlist_Item_Type type,
4372 Eina_Compare_Cb comp,
4374 const void *func_data)
4376 ELM_CHECK_WIDTYPE(obj, widtype) NULL;
4377 Widget_Data *wd = elm_widget_data_get(obj);
4378 if (!wd) return NULL;
4379 Elm_Gen_Item *rel = NULL;
4380 Elm_Gen_Item *it = _item_new(wd, itc, data, (Elm_Gen_Item *) parent, type,
4382 if (!it) return NULL;
4384 wd->item_compare_cb = comp;
4391 l = eina_list_search_sorted_near_list(it->parent->item->items,
4392 _elm_genlist_item_list_compare,
4396 rel = eina_list_data_get(l);
4400 if (cmp_result >= 0)
4402 it->parent->item->items = eina_list_prepend_relative_list(it->parent->item->items, it, l);
4403 wd->items = eina_inlist_prepend_relative(wd->items, EINA_INLIST_GET(it), EINA_INLIST_GET(rel));
4404 it->item->before = EINA_FALSE;
4406 else if (cmp_result < 0)
4408 it->parent->item->items = eina_list_append_relative_list(it->parent->item->items, it, l);
4409 wd->items = eina_inlist_append_relative(wd->items, EINA_INLIST_GET(it), EINA_INLIST_GET(rel));
4410 it->item->before = EINA_TRUE;
4417 wd->state = eina_inlist_sorted_state_new();
4418 eina_inlist_sorted_state_init(wd->state, wd->items);
4419 wd->requeued = EINA_FALSE;
4423 wd->group_items = eina_list_append(wd->group_items, it);
4425 wd->items = eina_inlist_sorted_state_insert(wd->items, EINA_INLIST_GET(it),
4426 _elm_genlist_item_compare, wd->state);
4428 if (EINA_INLIST_GET(it)->next)
4430 rel = ELM_GEN_ITEM_FROM_INLIST(EINA_INLIST_GET(it)->next);
4431 it->item->before = EINA_TRUE;
4433 else if (EINA_INLIST_GET(it)->prev)
4435 rel = ELM_GEN_ITEM_FROM_INLIST(EINA_INLIST_GET(it)->prev);
4436 it->item->before = EINA_FALSE;
4442 it->item->rel = rel;
4443 it->item->rel->relcount++;
4446 _item_queue(wd, it, _elm_genlist_item_list_compare);
4448 return (Elm_Object_Item *)it;
4452 _elm_genlist_clear(Evas_Object *obj, Eina_Bool standby)
4454 Eina_Inlist *next, *l;
4455 Widget_Data *wd = elm_widget_data_get(obj);
4458 if (!standby) wd->generation++;
4462 eina_inlist_sorted_state_free(wd->state);
4466 if (wd->walking > 0)
4468 wd->clear_me = EINA_TRUE;
4471 evas_event_freeze(evas_object_evas_get(wd->obj));
4472 for (l = wd->items, next = l ? l->next : NULL;
4474 l = next, next = next ? next->next : NULL)
4476 Elm_Gen_Item *it = ELM_GEN_ITEM_FROM_INLIST(l);
4478 if (it->generation < wd->generation)
4480 Elm_Gen_Item *itn = NULL;
4482 if (next) itn = ELM_GEN_ITEM_FROM_INLIST(next);
4483 if (itn) itn->walking++; /* prevent early death of subitem */
4485 elm_widget_item_free(it);
4486 if (itn) itn->walking--;
4489 wd->clear_me = EINA_FALSE;
4490 wd->pan_changed = EINA_TRUE;
4493 ecore_job_del(wd->calc_job);
4494 wd->calc_job = NULL;
4496 if (wd->selected) wd->selected = eina_list_free(wd->selected);
4497 if (wd->clear_cb) wd->clear_cb(wd);
4503 if (wd->alpha_bg) evas_object_del(wd->alpha_bg);
4504 wd->alpha_bg = NULL;
4508 evas_object_size_hint_min_set(wd->pan_smart, wd->minw, wd->minh);
4509 evas_object_smart_callback_call(wd->pan_smart, "changed", NULL);
4511 if (wd->sizing_cb) wd->sizing_cb(wd->obj);
4512 elm_smart_scroller_child_region_show(wd->scr, 0, 0, 0, 0);
4513 evas_event_thaw(evas_object_evas_get(wd->obj));
4514 evas_event_thaw_eval(evas_object_evas_get(wd->obj));
4518 elm_genlist_clear(Evas_Object *obj)
4520 ELM_CHECK_WIDTYPE(obj, widtype);
4521 _elm_genlist_clear(obj, EINA_FALSE);
4525 elm_genlist_multi_select_set(Evas_Object *obj,
4528 ELM_CHECK_WIDTYPE(obj, widtype);
4529 Widget_Data *wd = elm_widget_data_get(obj);
4531 wd->multi = !!multi;
4535 elm_genlist_multi_select_get(const Evas_Object *obj)
4537 ELM_CHECK_WIDTYPE(obj, widtype) EINA_FALSE;
4538 Widget_Data *wd = elm_widget_data_get(obj);
4539 if (!wd) return EINA_FALSE;
4543 EAPI Elm_Object_Item *
4544 elm_genlist_selected_item_get(const Evas_Object *obj)
4546 ELM_CHECK_WIDTYPE(obj, widtype) NULL;
4547 Widget_Data *wd = elm_widget_data_get(obj);
4548 if (!wd) return NULL;
4549 if (wd->selected) return wd->selected->data;
4553 EAPI const Eina_List *
4554 elm_genlist_selected_items_get(const Evas_Object *obj)
4556 ELM_CHECK_WIDTYPE(obj, widtype) NULL;
4557 Widget_Data *wd = elm_widget_data_get(obj);
4558 if (!wd) return NULL;
4559 return wd->selected;
4563 elm_genlist_realized_items_get(const Evas_Object *obj)
4565 ELM_CHECK_WIDTYPE(obj, widtype) NULL;
4566 Widget_Data *wd = elm_widget_data_get(obj);
4567 Eina_List *list = NULL;
4569 Eina_Bool done = EINA_FALSE;
4570 if (!wd) return NULL;
4571 EINA_INLIST_FOREACH(wd->blocks, itb)
4579 EINA_LIST_FOREACH(itb->items, l, it)
4581 if (it->realized) list = eina_list_append(list, it);
4592 EAPI Elm_Object_Item *
4593 elm_genlist_at_xy_item_get(const Evas_Object *obj,
4598 ELM_CHECK_WIDTYPE(obj, widtype) NULL;
4599 Widget_Data *wd = elm_widget_data_get(obj);
4600 Evas_Coord ox, oy, ow, oh;
4603 if (!wd) return NULL;
4604 evas_object_geometry_get(wd->pan_smart, &ox, &oy, &ow, &oh);
4606 EINA_INLIST_FOREACH(wd->blocks, itb)
4611 if (!ELM_RECTS_INTERSECT(ox + itb->x - itb->wd->pan_x,
4612 oy + itb->y - itb->wd->pan_y,
4613 itb->w, itb->h, x, y, 1, 1))
4615 EINA_LIST_FOREACH(itb->items, l, it)
4617 Evas_Coord itx, ity;
4619 itx = ox + itb->x + it->x - itb->wd->pan_x;
4620 ity = oy + itb->y + it->y - itb->wd->pan_y;
4621 if (ELM_RECTS_INTERSECT(itx, ity, it->item->w, it->item->h, x, y, 1, 1))
4625 if (y <= (ity + (it->item->h / 4))) *posret = -1;
4626 else if (y >= (ity + it->item->h - (it->item->h / 4)))
4630 return (Elm_Object_Item *)it;
4632 lasty = ity + it->item->h;
4637 if (y > lasty) *posret = 1;
4643 EAPI Elm_Object_Item *
4644 elm_genlist_first_item_get(const Evas_Object *obj)
4646 ELM_CHECK_WIDTYPE(obj, widtype) NULL;
4647 Widget_Data *wd = elm_widget_data_get(obj);
4648 if (!wd) return NULL;
4649 if (!wd->items) return NULL;
4650 Elm_Gen_Item *it = ELM_GEN_ITEM_FROM_INLIST(wd->items);
4651 while ((it) && (it->generation < wd->generation))
4652 it = ELM_GEN_ITEM_FROM_INLIST(EINA_INLIST_GET(it)->next);
4653 return (Elm_Object_Item *)it;
4656 EAPI Elm_Object_Item *
4657 elm_genlist_last_item_get(const Evas_Object *obj)
4659 ELM_CHECK_WIDTYPE(obj, widtype) NULL;
4660 Widget_Data *wd = elm_widget_data_get(obj);
4661 if (!wd) return NULL;
4662 if (!wd->items) return NULL;
4663 Elm_Gen_Item *it = ELM_GEN_ITEM_FROM_INLIST(wd->items->last);
4664 while ((it) && (it->generation < wd->generation))
4665 it = ELM_GEN_ITEM_FROM_INLIST(EINA_INLIST_GET(it)->prev);
4666 return (Elm_Object_Item *)it;
4669 EAPI Elm_Object_Item *
4670 elm_genlist_item_next_get(const Elm_Object_Item *it)
4672 ELM_OBJ_ITEM_CHECK_OR_RETURN(it, NULL);
4673 Elm_Gen_Item *_it = (Elm_Gen_Item *)it;
4676 _it = ELM_GEN_ITEM_FROM_INLIST(EINA_INLIST_GET(_it)->next);
4677 if ((_it) && (_it->generation == _it->wd->generation)) break;
4679 return (Elm_Object_Item *) _it;
4682 EAPI Elm_Object_Item *
4683 elm_genlist_item_prev_get(const Elm_Object_Item *it)
4685 ELM_OBJ_ITEM_CHECK_OR_RETURN(it, NULL);
4686 Elm_Gen_Item *_it = (Elm_Gen_Item *)it;
4689 _it = ELM_GEN_ITEM_FROM_INLIST(EINA_INLIST_GET(_it)->prev);
4690 if ((_it) && (_it->generation == _it->wd->generation)) break;
4692 return (Elm_Object_Item *) _it;
4695 EAPI Elm_Object_Item *
4696 elm_genlist_item_parent_get(const Elm_Object_Item *it)
4698 ELM_OBJ_ITEM_CHECK_OR_RETURN(it, NULL);
4699 return (Elm_Object_Item *) ((Elm_Gen_Item *)it)->parent;
4703 elm_genlist_item_subitems_clear(Elm_Object_Item *it)
4705 ELM_OBJ_ITEM_CHECK_OR_RETURN(it);
4706 Widget_Data *wd = elm_widget_data_get(WIDGET(it));
4708 Elm_Gen_Item *_it = (Elm_Gen_Item *) it;
4710 if (!wd->tree_effect_enabled || !wd->move_effect_mode)
4711 _item_subitems_clear(_it);
4714 if (!wd->tree_effect_animator)
4716 wd->expanded_item = _it;
4717 _item_tree_effect_before(_it);
4718 evas_object_raise(wd->alpha_bg);
4719 evas_object_show(wd->alpha_bg);
4720 wd->start_time = ecore_time_get();
4721 wd->tree_effect_animator = ecore_animator_add(_tree_effect_animator_cb, wd);
4724 _item_subitems_clear(_it);
4729 elm_genlist_item_selected_set(Elm_Object_Item *it,
4732 ELM_OBJ_ITEM_CHECK_OR_RETURN(it);
4733 Elm_Gen_Item *_it = (Elm_Gen_Item *)it;
4734 Widget_Data *wd = _it->wd;
4736 if ((_it->generation < wd->generation) || elm_widget_item_disabled_get(_it))
4738 selected = !!selected;
4739 if (_it->selected == selected) return;
4745 while (wd->selected)
4747 if (_it->unhighlight_cb) _it->unhighlight_cb(wd->selected->data);
4748 _it->unsel_cb(wd->selected->data);
4751 _it->highlight_cb(_it);
4755 if (_it->unhighlight_cb) _it->unhighlight_cb(_it);
4760 elm_genlist_item_selected_get(const Elm_Object_Item *it)
4762 ELM_OBJ_ITEM_CHECK_OR_RETURN(it, EINA_FALSE);
4763 return ((Elm_Gen_Item *)it)->selected;
4767 _elm_genlist_expanded_next_item_get(Elm_Gen_Item *it)
4770 if (it->item->expanded)
4772 it2 = (Elm_Gen_Item *) elm_genlist_item_next_get((Elm_Object_Item *) it);
4776 it2 = (Elm_Gen_Item *) elm_genlist_item_next_get((Elm_Object_Item *) it);
4779 if (it->item->expanded_depth >= it2->item->expanded_depth) break;
4780 it2 = (Elm_Gen_Item *) elm_genlist_item_next_get((Elm_Object_Item *) it2);
4787 _elm_genlist_move_items_set(Elm_Gen_Item *it)
4790 Elm_Gen_Item *it2 = NULL;
4791 Evas_Coord ox, oy, ow, oh, dh = 0;
4793 it->wd->expanded_next_item = _elm_genlist_expanded_next_item_get(it);
4795 if (it->item->expanded)
4797 it->wd->move_items = elm_genlist_realized_items_get(it->wd->obj);
4798 EINA_LIST_FOREACH(it->wd->move_items, l, it2)
4800 if (it2 == it->wd->expanded_next_item) break;
4801 it->wd->move_items = eina_list_remove(it->wd->move_items, it2);
4806 evas_object_geometry_get(it->wd->pan_smart, &ox, &oy, &ow, &oh);
4807 it2 = it->wd->expanded_next_item;
4808 while (it2 && (dh < oy + oh))
4811 it->wd->move_items = eina_list_append(it->wd->move_items, it2);
4812 it2 = (Elm_Gen_Item *) elm_genlist_item_next_get((Elm_Object_Item *) it2);
4818 elm_genlist_item_expanded_set(Elm_Object_Item *it,
4821 ELM_OBJ_ITEM_CHECK_OR_RETURN(it);
4822 Elm_Gen_Item *_it = (Elm_Gen_Item *)it;
4823 expanded = !!expanded;
4824 if (_it->item->expanded == expanded) return;
4825 _it->item->expanded = expanded;
4826 _it->wd->expanded_item = _it;
4827 _elm_genlist_move_items_set(_it);
4829 if (_it->wd->tree_effect_enabled && !_it->wd->alpha_bg)
4830 _it->wd->alpha_bg = _create_tray_alpha_bg(WIDGET(_it));
4832 if (_it->item->expanded)
4834 _it->wd->move_effect_mode = ELM_GENLIST_TREE_EFFECT_EXPAND;
4836 edje_object_signal_emit(VIEW(_it), "elm,state,expanded", "elm");
4837 evas_object_smart_callback_call(WIDGET(_it), SIG_EXPANDED, _it);
4838 _it->wd->auto_scroll_enabled = EINA_TRUE;
4842 _it->wd->move_effect_mode = ELM_GENLIST_TREE_EFFECT_CONTRACT;
4844 edje_object_signal_emit(VIEW(_it), "elm,state,contracted", "elm");
4845 evas_object_smart_callback_call(WIDGET(_it), SIG_CONTRACTED, _it);
4846 _it->wd->auto_scroll_enabled = EINA_FALSE;
4851 elm_genlist_item_expanded_get(const Elm_Object_Item *it)
4853 ELM_OBJ_ITEM_CHECK_OR_RETURN(it, EINA_FALSE);
4854 return ((Elm_Gen_Item *)it)->item->expanded;
4858 elm_genlist_item_expanded_depth_get(const Elm_Object_Item *it)
4860 ELM_OBJ_ITEM_CHECK_OR_RETURN(it, 0);
4861 return ((Elm_Gen_Item *)it)->item->expanded_depth;
4865 _elm_genlist_item_compute_coordinates(Elm_Object_Item *it,
4866 Elm_Genlist_Item_Scrollto_Type type,
4873 Elm_Gen_Item *_it = (Elm_Gen_Item *)it;
4874 Evas_Coord gith = 0;
4875 if (_it->generation < _it->wd->generation) return EINA_FALSE;
4876 if ((_it->item->queued) || (!_it->item->mincalcd))
4878 _it->wd->show_item = _it;
4879 _it->wd->bring_in = bring_in;
4880 _it->wd->scrollto_type = type;
4881 _it->item->showme = EINA_TRUE;
4884 if (_it->wd->show_item)
4886 _it->wd->show_item->item->showme = EINA_FALSE;
4887 _it->wd->show_item = NULL;
4890 evas_object_geometry_get(_it->wd->pan_smart, NULL, NULL, w, h);
4893 case ELM_GENLIST_ITEM_SCROLLTO_IN:
4894 if ((_it->item->group_item) &&
4895 (_it->wd->pan_y > (_it->y + _it->item->block->y)))
4896 gith = _it->item->group_item->item->h;
4898 *y = _it->y + _it->item->block->y - gith;
4900 case ELM_GENLIST_ITEM_SCROLLTO_TOP:
4901 if (_it->item->group_item) gith = _it->item->group_item->item->h;
4902 *y = _it->y + _it->item->block->y - gith;
4904 case ELM_GENLIST_ITEM_SCROLLTO_MIDDLE:
4905 *y = _it->y + _it->item->block->y - (*h / 2) + (_it->item->h / 2);
4911 *x = _it->x + _it->item->block->x;
4912 *w = _it->item->block->w;
4917 elm_genlist_item_promote(Elm_Object_Item *it)
4919 ELM_OBJ_ITEM_CHECK_OR_RETURN(it);
4920 Elm_Gen_Item *_it = (Elm_Gen_Item *)it;
4921 if (_it->generation < _it->wd->generation) return;
4922 _item_move_before(_it,
4923 (Elm_Gen_Item *) elm_genlist_first_item_get(WIDGET(_it)));
4927 elm_genlist_item_demote(Elm_Object_Item *it)
4929 ELM_OBJ_ITEM_CHECK_OR_RETURN(it);
4930 Elm_Gen_Item *_it = (Elm_Gen_Item *)it;
4931 if (_it->generation < _it->wd->generation) return;
4932 _item_move_after(_it,
4933 (Elm_Gen_Item *) elm_genlist_last_item_get(WIDGET(_it)));
4937 elm_genlist_item_show(Elm_Object_Item *it, Elm_Genlist_Item_Scrollto_Type type)
4939 ELM_OBJ_ITEM_CHECK_OR_RETURN(it);
4940 Evas_Coord x, y, w, h;
4941 Elm_Gen_Item *_it = (Elm_Gen_Item *)it;
4943 if (_elm_genlist_item_compute_coordinates(it, type, EINA_FALSE, &x, &y, &w, &h))
4944 elm_smart_scroller_child_region_show(_it->wd->scr, x, y, w, h);
4948 elm_genlist_item_bring_in(Elm_Object_Item *it, Elm_Genlist_Item_Scrollto_Type type)
4951 ELM_OBJ_ITEM_CHECK_OR_RETURN(it);
4952 Evas_Coord x, y, w, h;
4953 Elm_Gen_Item *_it = (Elm_Gen_Item *)it;
4955 if (_elm_genlist_item_compute_coordinates(it, type, EINA_TRUE, &x, &y, &w, &h))
4956 elm_smart_scroller_region_bring_in(_it->wd->scr, x, y, w, h);
4960 elm_genlist_item_all_contents_unset(Elm_Object_Item *it, Eina_List **l)
4962 ELM_OBJ_ITEM_CHECK_OR_RETURN(it);
4964 Evas_Object *content;
4965 EINA_LIST_FREE(((Elm_Gen_Item *)it)->content_objs, content)
4967 elm_widget_sub_object_del(WIDGET(it), content);
4968 evas_object_smart_member_del(content);
4969 evas_object_hide(content);
4970 if (l) *l = eina_list_append(*l, content);
4975 elm_genlist_item_update(Elm_Object_Item *it)
4977 ELM_OBJ_ITEM_CHECK_OR_RETURN(it);
4978 Elm_Gen_Item *_it = (Elm_Gen_Item *)it;
4980 if (!_it->item->block) return;
4981 if (_it->generation < _it->wd->generation) return;
4982 _it->item->mincalcd = EINA_FALSE;
4983 _it->item->updateme = EINA_TRUE;
4984 _it->item->block->updateme = EINA_TRUE;
4985 if (_it->wd->update_job) ecore_job_del(_it->wd->update_job);
4986 _it->wd->update_job = ecore_job_add(_update_job, _it->wd);
4990 elm_genlist_item_fields_update(Elm_Object_Item *it,
4992 Elm_Genlist_Item_Field_Type itf)
4994 ELM_OBJ_ITEM_CHECK_OR_RETURN(it);
4995 Elm_Gen_Item *_it = (Elm_Gen_Item *)it;
4997 if (!_it->item->block) return;
4998 if (_it->generation < _it->wd->generation) return;
5000 if ((!itf) || (itf & ELM_GENLIST_ITEM_FIELD_TEXT))
5001 _item_text_realize(_it, VIEW(_it), &_it->texts, parts);
5002 if ((!itf) || (itf & ELM_GENLIST_ITEM_FIELD_CONTENT))
5004 _it->content_objs = _item_content_unrealize(_it, VIEW(_it),
5005 &_it->contents, parts);
5006 _it->content_objs = _item_content_realize(_it, VIEW(_it),
5007 &_it->contents, parts);
5009 if ((!itf) || (itf & ELM_GENLIST_ITEM_FIELD_STATE))
5010 _item_state_realize(_it, VIEW(_it), &_it->states, parts);
5014 elm_genlist_item_item_class_update(Elm_Object_Item *it,
5015 const Elm_Genlist_Item_Class *itc)
5017 ELM_OBJ_ITEM_CHECK_OR_RETURN(it);
5018 Elm_Gen_Item *_it = (Elm_Gen_Item *)it;
5020 if (!_it->item->block) return;
5021 EINA_SAFETY_ON_NULL_RETURN(itc);
5022 if (_it->generation < _it->wd->generation) return;
5024 _it->item->nocache_once = EINA_TRUE;
5025 elm_genlist_item_update(it);
5028 EAPI const Elm_Genlist_Item_Class *
5029 elm_genlist_item_item_class_get(const Elm_Object_Item *it)
5031 ELM_OBJ_ITEM_CHECK_OR_RETURN(it, NULL);
5032 Elm_Gen_Item *_it = (Elm_Gen_Item *)it;
5033 if (_it->generation < _it->wd->generation) return NULL;
5037 static Evas_Object *
5038 _elm_genlist_item_label_create(void *data,
5039 Evas_Object *obj __UNUSED__,
5040 Evas_Object *tooltip,
5041 void *it __UNUSED__)
5043 Evas_Object *label = elm_label_add(tooltip);
5046 elm_object_style_set(label, "tooltip");
5047 elm_object_text_set(label, data);
5052 _elm_genlist_item_label_del_cb(void *data,
5053 Evas_Object *obj __UNUSED__,
5054 void *event_info __UNUSED__)
5056 eina_stringshare_del(data);
5060 elm_genlist_item_tooltip_text_set(Elm_Object_Item *it,
5063 ELM_OBJ_ITEM_CHECK_OR_RETURN(it);
5064 text = eina_stringshare_add(text);
5065 elm_genlist_item_tooltip_content_cb_set(it, _elm_genlist_item_label_create,
5067 _elm_genlist_item_label_del_cb);
5071 elm_genlist_item_tooltip_content_cb_set(Elm_Object_Item *it,
5072 Elm_Tooltip_Item_Content_Cb func,
5074 Evas_Smart_Cb del_cb)
5076 ELM_OBJ_ITEM_CHECK_OR_GOTO(it, error);
5077 Elm_Gen_Item *_it = (Elm_Gen_Item *)it;
5079 if ((_it->tooltip.content_cb == func) && (_it->tooltip.data == data))
5082 if (_it->tooltip.del_cb)
5083 _it->tooltip.del_cb((void *) _it->tooltip.data, WIDGET(it), it);
5085 _it->tooltip.content_cb = func;
5086 _it->tooltip.data = data;
5087 _it->tooltip.del_cb = del_cb;
5091 elm_widget_item_tooltip_content_cb_set(_it,
5092 _it->tooltip.content_cb,
5093 _it->tooltip.data, NULL);
5094 elm_widget_item_tooltip_style_set(_it, _it->tooltip.style);
5095 elm_widget_item_tooltip_window_mode_set(_it, _it->tooltip.free_size);
5101 if (del_cb) del_cb((void *)data, NULL, NULL);
5105 elm_genlist_item_tooltip_unset(Elm_Object_Item *it)
5107 ELM_OBJ_ITEM_CHECK_OR_RETURN(it);
5108 Elm_Gen_Item *_it = (Elm_Gen_Item *)it;
5110 if ((VIEW(_it)) && (_it->tooltip.content_cb))
5111 elm_widget_item_tooltip_unset(_it);
5113 if (_it->tooltip.del_cb)
5114 _it->tooltip.del_cb((void *) _it->tooltip.data, WIDGET(_it), _it);
5115 _it->tooltip.del_cb = NULL;
5116 _it->tooltip.content_cb = NULL;
5117 _it->tooltip.data = NULL;
5118 _it->tooltip.free_size = EINA_FALSE;
5119 if (_it->tooltip.style)
5120 elm_genlist_item_tooltip_style_set(it, NULL);
5124 elm_genlist_item_tooltip_style_set(Elm_Object_Item *it,
5127 ELM_OBJ_ITEM_CHECK_OR_RETURN(it);
5128 Elm_Gen_Item *_it = (Elm_Gen_Item *)it;
5130 eina_stringshare_replace(&_it->tooltip.style, style);
5131 if (VIEW(_it)) elm_widget_item_tooltip_style_set(_it, style);
5135 elm_genlist_item_tooltip_style_get(const Elm_Object_Item *it)
5137 return elm_object_item_tooltip_style_get(it);
5141 elm_genlist_item_tooltip_window_mode_set(Elm_Object_Item *it,
5144 ELM_OBJ_ITEM_CHECK_OR_RETURN(it, EINA_FALSE);
5145 Elm_Gen_Item *_it = (Elm_Gen_Item *)it;
5147 _it->tooltip.free_size = disable;
5148 if (VIEW(_it)) return elm_widget_item_tooltip_window_mode_set(_it, disable);
5153 elm_genlist_item_tooltip_window_mode_get(const Elm_Object_Item *it)
5155 return elm_object_tooltip_window_mode_get(VIEW(it));
5159 elm_genlist_item_cursor_set(Elm_Object_Item *it,
5162 ELM_OBJ_ITEM_CHECK_OR_RETURN(it);
5163 Elm_Gen_Item *_it = (Elm_Gen_Item *)it;
5164 eina_stringshare_replace(&_it->mouse_cursor, cursor);
5165 if (VIEW(_it)) elm_widget_item_cursor_set(_it, cursor);
5169 elm_genlist_item_cursor_get(const Elm_Object_Item *it)
5171 return elm_widget_item_cursor_get(it);
5175 elm_genlist_item_cursor_unset(Elm_Object_Item *it)
5177 ELM_OBJ_ITEM_CHECK_OR_RETURN(it);
5178 Elm_Gen_Item *_it = (Elm_Gen_Item *)it;
5180 if (!_it->mouse_cursor) return;
5182 if (VIEW(_it)) elm_widget_item_cursor_unset(_it);
5184 eina_stringshare_del(_it->mouse_cursor);
5185 _it->mouse_cursor = NULL;
5189 elm_genlist_item_cursor_style_set(Elm_Object_Item *it,
5192 elm_widget_item_cursor_style_set(it, style);
5196 elm_genlist_item_cursor_style_get(const Elm_Object_Item *it)
5198 return elm_widget_item_cursor_style_get(it);
5202 elm_genlist_item_cursor_engine_only_set(Elm_Object_Item *it,
5203 Eina_Bool engine_only)
5205 elm_widget_item_cursor_engine_only_set(it, engine_only);
5209 elm_genlist_item_cursor_engine_only_get(const Elm_Object_Item *it)
5211 return elm_widget_item_cursor_engine_only_get(it);
5215 elm_genlist_item_index_get(const Elm_Object_Item *it)
5217 ELM_OBJ_ITEM_CHECK_OR_RETURN(it, -1);
5218 Elm_Gen_Item *_it = (Elm_Gen_Item *)it;
5220 if (_it->item->block)
5221 return _it->position + (_it->item->block->position * _it->wd->max_items_per_block);
5226 elm_genlist_mode_set(Evas_Object *obj,
5229 ELM_CHECK_WIDTYPE(obj, widtype);
5230 Widget_Data *wd = elm_widget_data_get(obj);
5232 if (wd->mode == mode) return;
5234 if (wd->mode == ELM_LIST_COMPRESS)
5235 elm_genlist_homogeneous_set(obj, EINA_FALSE);
5241 elm_genlist_mode_get(const Evas_Object *obj)
5243 ELM_CHECK_WIDTYPE(obj, widtype) ELM_LIST_LAST;
5244 Widget_Data *wd = elm_widget_data_get(obj);
5245 if (!wd) return ELM_LIST_LAST;
5250 elm_genlist_bounce_set(Evas_Object *obj,
5254 ELM_CHECK_WIDTYPE(obj, widtype);
5255 Widget_Data *wd = elm_widget_data_get(obj);
5257 wd->h_bounce = !!h_bounce;
5258 wd->v_bounce = !!v_bounce;
5259 elm_smart_scroller_bounce_allow_set(wd->scr, wd->h_bounce, wd->v_bounce);
5263 elm_genlist_bounce_get(const Evas_Object *obj,
5264 Eina_Bool *h_bounce,
5265 Eina_Bool *v_bounce)
5267 ELM_CHECK_WIDTYPE(obj, widtype);
5268 Widget_Data *wd = elm_widget_data_get(obj);
5270 if (h_bounce) *h_bounce = wd->h_bounce;
5271 if (v_bounce) *v_bounce = wd->v_bounce;
5275 elm_genlist_homogeneous_set(Evas_Object *obj,
5276 Eina_Bool homogeneous)
5278 ELM_CHECK_WIDTYPE(obj, widtype);
5279 Widget_Data *wd = elm_widget_data_get(obj);
5281 wd->homogeneous = !!homogeneous;
5285 elm_genlist_homogeneous_get(const Evas_Object *obj)
5287 ELM_CHECK_WIDTYPE(obj, widtype) EINA_FALSE;
5288 Widget_Data *wd = elm_widget_data_get(obj);
5289 if (!wd) return EINA_FALSE;
5290 return wd->homogeneous;
5294 elm_genlist_block_count_set(Evas_Object *obj,
5297 ELM_CHECK_WIDTYPE(obj, widtype);
5298 Widget_Data *wd = elm_widget_data_get(obj);
5300 wd->max_items_per_block = count;
5301 wd->item_cache_max = wd->max_items_per_block * 2;
5302 _item_cache_clean(wd);
5306 elm_genlist_block_count_get(const Evas_Object *obj)
5308 ELM_CHECK_WIDTYPE(obj, widtype) 0;
5309 Widget_Data *wd = elm_widget_data_get(obj);
5311 return wd->max_items_per_block;
5315 elm_genlist_longpress_timeout_set(Evas_Object *obj,
5318 ELM_CHECK_WIDTYPE(obj, widtype);
5319 Widget_Data *wd = elm_widget_data_get(obj);
5321 wd->longpress_timeout = timeout;
5325 elm_genlist_longpress_timeout_get(const Evas_Object *obj)
5327 ELM_CHECK_WIDTYPE(obj, widtype) 0;
5328 Widget_Data *wd = elm_widget_data_get(obj);
5330 return wd->longpress_timeout;
5334 elm_genlist_scroller_policy_set(Evas_Object *obj,
5335 Elm_Scroller_Policy policy_h,
5336 Elm_Scroller_Policy policy_v)
5338 ELM_CHECK_WIDTYPE(obj, widtype);
5339 Widget_Data *wd = elm_widget_data_get(obj);
5340 if ((!wd) || (!wd->scr)) return;
5341 if ((policy_h >= ELM_SCROLLER_POLICY_LAST) ||
5342 (policy_v >= ELM_SCROLLER_POLICY_LAST))
5344 elm_smart_scroller_policy_set(wd->scr, policy_h, policy_v);
5348 elm_genlist_scroller_policy_get(const Evas_Object *obj,
5349 Elm_Scroller_Policy *policy_h,
5350 Elm_Scroller_Policy *policy_v)
5352 ELM_CHECK_WIDTYPE(obj, widtype);
5353 Widget_Data *wd = elm_widget_data_get(obj);
5354 Elm_Smart_Scroller_Policy s_policy_h, s_policy_v;
5355 if ((!wd) || (!wd->scr)) return;
5356 elm_smart_scroller_policy_get(wd->scr, &s_policy_h, &s_policy_v);
5357 if (policy_h) *policy_h = (Elm_Scroller_Policy)s_policy_h;
5358 if (policy_v) *policy_v = (Elm_Scroller_Policy)s_policy_v;
5362 elm_genlist_realized_items_update(Evas_Object *obj)
5364 ELM_CHECK_WIDTYPE(obj, widtype);
5366 Eina_List *list, *l;
5367 Elm_Object_Item *it;
5369 list = elm_genlist_realized_items_get(obj);
5370 EINA_LIST_FOREACH(list, l, it)
5371 elm_genlist_item_update(it);
5375 elm_genlist_item_decorate_mode_set(Elm_Object_Item *it,
5376 const char *decorate_type,
5379 ELM_OBJ_ITEM_CHECK_OR_RETURN(it);
5380 Elm_Gen_Item *_it = (Elm_Gen_Item *)it;
5382 Widget_Data *wd = _it->wd;
5384 Elm_Object_Item *it2;
5387 if (!decorate_type) return;
5388 if ((_it->generation < _it->wd->generation) ||
5389 elm_widget_item_disabled_get(_it)) return;
5390 if (wd->decorate_mode) return;
5392 if ((wd->mode_item == _it) &&
5393 (!strcmp(decorate_type, wd->decorate_type)) &&
5396 if (!_it->itc->decorate_item_style) return;
5397 _it->mode_set = mode_set;
5401 EINA_LIST_FOREACH(wd->selected, l, it2)
5402 if (((Elm_Gen_Item *)it2)->realized)
5403 elm_genlist_item_selected_set(it2, EINA_FALSE);
5407 it2 = elm_genlist_selected_item_get(wd->obj);
5408 if ((it2) && (((Elm_Gen_Item *)it2)->realized))
5409 elm_genlist_item_selected_set(it2, EINA_FALSE);
5412 if (((wd->decorate_type) && (strcmp(decorate_type, wd->decorate_type))) ||
5414 ((_it == wd->mode_item) && (!mode_set)))
5415 _item_mode_unset(wd);
5417 eina_stringshare_replace(&wd->decorate_type, decorate_type);
5418 if (mode_set) _item_mode_set(_it);
5422 elm_genlist_item_decorate_mode_get(const Elm_Object_Item *it)
5424 ELM_OBJ_ITEM_CHECK_OR_RETURN(it, NULL);
5425 Elm_Gen_Item *_it = (Elm_Gen_Item *)it;
5426 return _it->wd->decorate_type;
5429 EAPI const Elm_Object_Item *
5430 elm_genlist_decorated_item_get(const Evas_Object *obj)
5432 ELM_CHECK_WIDTYPE(obj, widtype) NULL;
5433 Widget_Data *wd = elm_widget_data_get(obj);
5434 if (!wd) return NULL;
5435 return (Elm_Object_Item *) wd->mode_item;
5439 elm_genlist_decorate_mode_get(const Evas_Object *obj)
5441 ELM_CHECK_WIDTYPE(obj, widtype) EINA_FALSE;
5442 Widget_Data *wd = elm_widget_data_get(obj);
5443 if (!wd) return EINA_FALSE;
5445 return wd->decorate_mode;
5449 elm_genlist_decorate_mode_set(Evas_Object *obj, Eina_Bool decorated)
5451 ELM_CHECK_WIDTYPE(obj, widtype);
5452 Eina_List *list, *l;
5455 Widget_Data *wd = elm_widget_data_get(obj);
5457 decorated = !!decorated;
5458 if (wd->decorate_mode == decorated) return;
5459 wd->decorate_mode = decorated;
5461 list = elm_genlist_realized_items_get(obj);
5462 if (!wd->decorate_mode)
5464 EINA_LIST_FOREACH(list, l, it)
5466 if (it->item->type != ELM_GENLIST_ITEM_GROUP)
5467 _decorate_mode_item_unrealize(it);
5469 _item_cache_zero(wd);
5473 EINA_LIST_FOREACH(list, l, it)
5475 if (it->item->type != ELM_GENLIST_ITEM_GROUP)
5477 if (it->selected) _item_unselect(it);
5478 if (it->itc->decorate_all_item_style)
5479 _decorate_mode_item_realize(it, EINA_TRUE);
5483 if (wd->calc_job) ecore_job_del(wd->calc_job);
5484 wd->calc_job = ecore_job_add(_calc_job, wd);
5488 elm_genlist_reorder_mode_set(Evas_Object *obj,
5489 Eina_Bool reorder_mode)
5491 ELM_CHECK_WIDTYPE(obj, widtype);
5492 Widget_Data *wd = elm_widget_data_get(obj);
5494 wd->reorder_mode = !!reorder_mode;
5498 elm_genlist_reorder_mode_get(const Evas_Object *obj)
5500 ELM_CHECK_WIDTYPE(obj, widtype) EINA_FALSE;
5501 Widget_Data *wd = elm_widget_data_get(obj);
5502 if (!wd) return EINA_FALSE;
5503 return wd->reorder_mode;
5506 EAPI Elm_Genlist_Item_Type
5507 elm_genlist_item_type_get(const Elm_Object_Item *it)
5509 ELM_OBJ_ITEM_CHECK_OR_RETURN(it, ELM_GENLIST_ITEM_MAX);
5510 Elm_Gen_Item *_it = (Elm_Gen_Item *)it;
5511 return _it->item->type;
5514 EAPI Elm_Genlist_Item_Class *
5515 elm_genlist_item_class_new(void)
5517 Elm_Genlist_Item_Class *itc;
5519 itc = calloc(1, sizeof(Elm_Genlist_Item_Class));
5522 itc->version = CLASS_ALLOCATED;
5524 itc->delete_me = EINA_FALSE;
5530 elm_genlist_item_class_free(Elm_Genlist_Item_Class *itc)
5532 if (itc && (itc->version == CLASS_ALLOCATED))
5534 if (!itc->delete_me) itc->delete_me = EINA_TRUE;
5535 if (itc->refcount > 0) elm_genlist_item_class_unref(itc);
5545 elm_genlist_item_class_ref(Elm_Genlist_Item_Class *itc)
5547 if (itc && (itc->version == CLASS_ALLOCATED))
5550 if (itc->refcount == 0) itc->refcount--;
5555 elm_genlist_item_class_unref(Elm_Genlist_Item_Class *itc)
5557 if (itc && (itc->version == CLASS_ALLOCATED))
5559 if (itc->refcount > 0) itc->refcount--;
5560 if (itc->delete_me && (!itc->refcount))
5561 elm_genlist_item_class_free(itc);
5565 void _flip_job(void *data)
5567 Elm_Gen_Item *it = (Elm_Gen_Item *) data;
5568 _elm_genlist_item_unrealize(it, EINA_FALSE);
5569 if (it->selected) _item_unselect(it);
5570 it->flipped = EINA_TRUE;
5571 it->item->nocache = EINA_TRUE;
5575 elm_genlist_item_flip_set(Elm_Object_Item *it,
5578 ELM_OBJ_ITEM_CHECK_OR_RETURN(it);
5579 Elm_Gen_Item *_it = (Elm_Gen_Item *)it;
5582 if (_it->flipped == flip) return;
5586 ecore_job_add(_flip_job, _it);
5587 if (_it->wd->calc_job) ecore_job_del(_it->wd->calc_job);
5588 _it->wd->calc_job = ecore_job_add(_calc_job, _it->wd);
5592 _it->flipped = flip;
5593 _item_cache_zero(_it->wd);
5594 elm_genlist_item_update(it);
5595 _it->item->nocache = EINA_FALSE;
5600 elm_genlist_item_flip_get(const Elm_Object_Item *it)
5602 ELM_OBJ_ITEM_CHECK_OR_RETURN(it, EINA_FALSE);
5603 Elm_Gen_Item *_it = (Elm_Gen_Item *)it;
5604 return _it->flipped;
5608 elm_genlist_select_mode_set(Evas_Object *obj, Elm_Object_Select_Mode mode)
5610 ELM_CHECK_WIDTYPE(obj, widtype);
5611 Widget_Data *wd = elm_widget_data_get(obj);
5613 if (mode >= ELM_OBJECT_SELECT_MODE_MAX)
5615 if (wd->select_mode != mode)
5616 wd->select_mode = mode;
5619 EAPI Elm_Object_Select_Mode
5620 elm_genlist_select_mode_get(const Evas_Object *obj)
5622 ELM_CHECK_WIDTYPE(obj, widtype) ELM_OBJECT_SELECT_MODE_MAX;
5623 Widget_Data *wd = elm_widget_data_get(obj);
5624 if (!wd) return ELM_OBJECT_SELECT_MODE_MAX;
5625 return wd->select_mode;
5629 elm_genlist_highlight_mode_set(Evas_Object *obj,
5630 Eina_Bool highlight)
5632 ELM_CHECK_WIDTYPE(obj, widtype);
5633 Widget_Data *wd = elm_widget_data_get(obj);
5635 wd->highlight = !!highlight;
5639 elm_genlist_highlight_mode_get(const Evas_Object *obj)
5641 ELM_CHECK_WIDTYPE(obj, widtype) EINA_FALSE;
5642 Widget_Data *wd = elm_widget_data_get(obj);
5643 if (!wd) return EINA_FALSE;
5644 return wd->highlight;
5648 elm_genlist_item_select_mode_set(Elm_Object_Item *it,
5649 Elm_Object_Select_Mode mode)
5651 ELM_OBJ_ITEM_CHECK_OR_RETURN(it);
5652 Elm_Gen_Item *_it = (Elm_Gen_Item *)it;
5654 if (_it->generation < _it->wd->generation) return;
5655 if (mode >= ELM_OBJECT_SELECT_MODE_MAX)
5657 if (_it->select_mode != mode)
5658 _it->select_mode = mode;
5660 if (_it->select_mode == ELM_OBJECT_SELECT_MODE_DISPLAY_ONLY)
5662 _it->item->mincalcd = EINA_FALSE;
5663 _it->item->updateme = EINA_TRUE;
5664 if (_it->item->block) _it->item->block->updateme = EINA_TRUE;
5665 if (_it->wd->update_job) ecore_job_del(_it->wd->update_job);
5666 _it->wd->update_job = ecore_job_add(_update_job, _it->wd);
5670 EAPI Elm_Object_Select_Mode
5671 elm_genlist_item_select_mode_get(const Elm_Object_Item *it)
5673 ELM_OBJ_ITEM_CHECK_OR_RETURN(it, ELM_OBJECT_SELECT_MODE_MAX);
5674 Elm_Gen_Item *_it = (Elm_Gen_Item *)it;
5675 if (!_it) return ELM_OBJECT_SELECT_MODE_MAX;
5676 return _it->select_mode;
5679 /* for gengrid as of now */
5681 _elm_genlist_page_relative_set(Evas_Object *obj,
5685 Evas_Coord pagesize_h;
5686 Evas_Coord pagesize_v;
5688 ELM_CHECK_WIDTYPE(obj, widtype);
5689 Widget_Data *wd = elm_widget_data_get(obj);
5692 elm_smart_scroller_paging_get(wd->scr, NULL, NULL, &pagesize_h, &pagesize_v);
5693 elm_smart_scroller_paging_set(wd->scr, h_pagerel, v_pagerel, pagesize_h,
5697 /* for gengrid as of now */
5699 _elm_genlist_page_relative_get(const Evas_Object *obj,
5703 ELM_CHECK_WIDTYPE(obj, widtype);
5704 Widget_Data *wd = elm_widget_data_get(obj);
5707 elm_smart_scroller_paging_get(wd->scr, h_pagerel, v_pagerel, NULL, NULL);
5710 /* for gengrid as of now */
5712 _elm_genlist_page_size_set(Evas_Object *obj,
5713 Evas_Coord h_pagesize,
5714 Evas_Coord v_pagesize)
5719 ELM_CHECK_WIDTYPE(obj, widtype);
5720 Widget_Data *wd = elm_widget_data_get(obj);
5722 elm_smart_scroller_paging_get(wd->scr, &pagerel_h, &pagerel_v, NULL, NULL);
5723 elm_smart_scroller_paging_set(wd->scr, pagerel_h, pagerel_v, h_pagesize,
5727 /* for gengrid as of now */
5729 _elm_genlist_current_page_get(const Evas_Object *obj,
5733 ELM_CHECK_WIDTYPE(obj, widtype);
5734 Widget_Data *wd = elm_widget_data_get(obj);
5736 elm_smart_scroller_current_page_get(wd->scr, h_pagenumber, v_pagenumber);
5739 /* for gengrid as of now */
5741 _elm_genlist_last_page_get(const Evas_Object *obj,
5745 ELM_CHECK_WIDTYPE(obj, widtype);
5746 Widget_Data *wd = elm_widget_data_get(obj);
5748 elm_smart_scroller_last_page_get(wd->scr, h_pagenumber, v_pagenumber);
5751 /* for gengrid as of now */
5753 _elm_genlist_page_show(const Evas_Object *obj,
5757 ELM_CHECK_WIDTYPE(obj, widtype);
5758 Widget_Data *wd = elm_widget_data_get(obj);
5760 elm_smart_scroller_page_show(wd->scr, h_pagenumber, v_pagenumber);
5763 /* for gengrid as of now */
5765 _elm_genlist_page_bring_in(const Evas_Object *obj,
5769 ELM_CHECK_WIDTYPE(obj, widtype);
5770 Widget_Data *wd = elm_widget_data_get(obj);
5772 elm_smart_scroller_page_bring_in(wd->scr, h_pagenumber, v_pagenumber);
5776 _elm_genlist_item_unrealize(Elm_Gen_Item *it,
5779 Evas_Object *content;
5781 if (!it->realized) return;
5782 if (it->wd->reorder_it == it) return;
5784 evas_event_freeze(evas_object_evas_get(WIDGET(it)));
5786 evas_object_smart_callback_call(WIDGET(it), SIG_UNREALIZED, it);
5789 ecore_timer_del(it->long_timer);
5790 it->long_timer = NULL;
5793 elm_widget_stringlist_free(it->texts);
5795 elm_widget_stringlist_free(it->contents);
5796 it->contents = NULL;
5797 elm_widget_stringlist_free(it->states);
5800 EINA_LIST_FREE(it->content_objs, content)
5801 evas_object_del(content);
5803 it->unrealize_cb(it);
5805 it->realized = EINA_FALSE;
5806 it->want_unrealize = EINA_FALSE;
5807 evas_event_thaw(evas_object_evas_get(WIDGET(it)));
5808 evas_event_thaw_eval(evas_object_evas_get(WIDGET(it)));
5812 _elm_genlist_item_del_notserious(Elm_Gen_Item *it)
5814 elm_widget_item_pre_notify_del(it);
5815 it->generation = it->wd->generation - 1; /* This means that the item is deleted */
5816 if (it->selected) it->wd->selected = eina_list_remove(it->wd->selected, it);
5818 if (it->itc->func.del)
5819 it->itc->func.del((void *)it->base.data, WIDGET(it));
5823 _elm_genlist_item_del_serious(Elm_Gen_Item *it)
5825 _elm_genlist_item_del_notserious(it);
5826 it->wd->items = eina_inlist_remove(it->wd->items, EINA_INLIST_GET(it));
5827 if (it->tooltip.del_cb)
5828 it->tooltip.del_cb((void *)it->tooltip.data, WIDGET(it), it);
5829 it->wd->walking -= it->walking;
5832 ecore_timer_del(it->long_timer);
5833 it->long_timer = NULL;
5836 it->wd->group_items = eina_list_remove(it->wd->group_items, it);
5840 eina_inlist_sorted_state_free(it->wd->state);
5841 it->wd->state = NULL;
5843 if (it->wd->calc_job) ecore_job_del(it->wd->calc_job);
5844 it->wd->calc_job = ecore_job_add(it->wd->calc_cb, it->wd);
5848 if (it->wd->last_selected_item == (Elm_Object_Item *)it)
5849 it->wd->last_selected_item = NULL;
5850 it->wd->item_count--;
5854 elm_genlist_tree_effect_enabled_set(Evas_Object *obj, Eina_Bool enabled)
5856 ELM_CHECK_WIDTYPE(obj, widtype);
5857 Widget_Data *wd = elm_widget_data_get(obj);
5859 wd->tree_effect_enabled = !!enabled;
5863 elm_genlist_tree_effect_enabled_get(const Evas_Object *obj)
5865 ELM_CHECK_WIDTYPE(obj, widtype) EINA_FALSE;
5866 Widget_Data *wd = elm_widget_data_get(obj);
5867 if (!wd) return EINA_FALSE;
5868 return wd->tree_effect_enabled;
5872 _create_tray_alpha_bg(const Evas_Object *obj)
5874 ELM_CHECK_WIDTYPE(obj, widtype) NULL;
5875 Widget_Data *wd = elm_widget_data_get(obj);
5876 if (!wd) return NULL;
5878 Evas_Object *bg = NULL;
5879 Evas_Coord ox, oy, ow, oh;
5881 evas_object_geometry_get(wd->pan_smart, &ox, &oy, &ow, &oh);
5882 bg = evas_object_rectangle_add(evas_object_evas_get(wd->obj));
5883 evas_object_color_set(bg,0,0,0,0);
5884 evas_object_resize(bg , ow, oh);
5885 evas_object_move(bg , ox, oy);
5890 _item_contract_emit(Elm_Gen_Item *it)
5895 edje_object_signal_emit(VIEW(it), "elm,state,contract_flip", "");
5896 it->item->tree_effect_finished = EINA_FALSE;
5898 EINA_LIST_FOREACH(it->item->items, l, it2)
5899 if (it2) _item_contract_emit(it2);
5903 _item_tree_effect_before(Elm_Gen_Item *it)
5908 EINA_LIST_FOREACH(it->item->items, l, it2)
5910 if (it2->parent && (it == it2->parent))
5913 it2->item->tree_effect_hideme = EINA_TRUE;
5914 if (it->wd->move_effect_mode == ELM_GENLIST_TREE_EFFECT_EXPAND)
5915 edje_object_signal_emit(VIEW(it2), "elm,state,hide", "");
5916 else if (it->wd->move_effect_mode == ELM_GENLIST_TREE_EFFECT_CONTRACT)
5917 _item_contract_emit(it2);
5920 return ECORE_CALLBACK_CANCEL;
5924 _item_tree_effect(Widget_Data *wd, int y)
5926 Elm_Gen_Item *it = NULL, *expanded_next_it;
5928 expanded_next_it = wd->expanded_next_item;
5930 if (wd->move_effect_mode == ELM_GENLIST_TREE_EFFECT_EXPAND)
5932 it = (Elm_Gen_Item *) elm_genlist_item_prev_get((Elm_Object_Item *) expanded_next_it);
5935 if (it->item->expanded_depth <= expanded_next_it->item->expanded_depth) break;
5936 if (it->item->scrl_y && (it->item->scrl_y <= expanded_next_it->item->old_scrl_y + y) &&
5937 (it->item->expanded_depth > expanded_next_it->item->expanded_depth))
5939 if (!it->item->tree_effect_finished)
5941 edje_object_signal_emit(VIEW(it), "flip_item", "");
5942 _item_position(it, VIEW(it), it->item->scrl_x, it->item->scrl_y);
5943 it->item->tree_effect_finished = EINA_TRUE;
5946 it = (Elm_Gen_Item *) elm_genlist_item_prev_get((Elm_Object_Item *) it);
5949 else if (wd->move_effect_mode == ELM_GENLIST_TREE_EFFECT_CONTRACT)
5951 it = (Elm_Gen_Item *) elm_genlist_item_prev_get((Elm_Object_Item *) expanded_next_it);
5954 if ((it->item->scrl_y > expanded_next_it->item->old_scrl_y + y) &&
5955 (it->item->expanded_depth > expanded_next_it->item->expanded_depth))
5957 if (!it->item->tree_effect_finished)
5959 edje_object_signal_emit(VIEW(it), "elm,state,hide", "");
5960 it->item->tree_effect_finished = EINA_TRUE;
5965 it = (Elm_Gen_Item *) elm_genlist_item_prev_get((Elm_Object_Item *) it);
5971 _item_tree_effect_finish(Widget_Data *wd)
5973 Elm_Gen_Item *it = NULL;
5976 if (wd->tree_effect_animator)
5978 if (wd->move_effect_mode == ELM_GENLIST_TREE_EFFECT_CONTRACT)
5979 _item_subitems_clear(wd->expanded_item);
5980 EINA_LIST_FOREACH(wd->expanded_item->item->items, l, it)
5982 it->item->tree_effect_finished = EINA_TRUE;
5983 it->item->old_scrl_y = it->item->scrl_y;
5984 if (it->wd->move_effect_mode == ELM_GENLIST_TREE_EFFECT_EXPAND)
5985 edje_object_signal_emit(VIEW(it), "elm,state,show", "");
5988 _item_auto_scroll(wd);
5989 evas_object_lower(wd->alpha_bg);
5990 evas_object_hide(wd->alpha_bg);
5991 wd->move_effect_mode = ELM_GENLIST_TREE_EFFECT_NONE;
5992 if (wd->move_items) wd->move_items = eina_list_free(wd->move_items);
5994 evas_object_smart_callback_call(wd->pan_smart, "changed", NULL);
5995 evas_object_smart_callback_call(wd->obj, SIG_TREE_EFFECT_FINISHED, NULL);
5996 evas_object_smart_changed(wd->pan_smart);
5998 wd->tree_effect_animator = NULL;
6002 _tree_effect_animator_cb(void *data)
6004 Widget_Data *wd = data;
6005 if (!wd) return EINA_FALSE;
6006 Evas_Coord ox, oy, ow, oh, cvx, cvy, cvw, cvh;
6007 Elm_Gen_Item *it = NULL, *it2, *expanded_next_it;
6009 double effect_duration = 0.3, t;
6010 int y = 0, dy = 0, dh = 0;
6011 Eina_Bool end = EINA_FALSE, vis = EINA_TRUE;
6014 t = ((0.0 > (t = ecore_time_get() - wd->start_time)) ? 0.0 : t);
6015 evas_object_geometry_get(wd->pan_smart, &ox, &oy, &ow, &oh);
6016 evas_output_viewport_get(evas_object_evas_get(wd->pan_smart), &cvx, &cvy, &cvw, &cvh);
6017 if (t > effect_duration) end = EINA_TRUE;
6019 // Below while statement is needed, when the genlist is resized.
6020 it2 = wd->expanded_item;
6023 evas_object_move(VIEW(it2), it2->item->scrl_x, it2->item->scrl_y);
6024 vis = (ELM_RECTS_INTERSECT(it2->item->scrl_x, it2->item->scrl_y, it2->item->w, it2->item->h,
6025 cvx, cvy, cvw, cvh));
6026 it2 = (Elm_Gen_Item *) elm_genlist_item_prev_get((Elm_Object_Item *) it2);
6029 if (wd->expanded_next_item)
6031 expanded_next_it = wd->expanded_next_item;
6034 EINA_LIST_FOREACH(wd->move_items, l, it)
6036 if (wd->move_effect_mode == ELM_GENLIST_TREE_EFFECT_EXPAND)
6038 expanded_next_it->item->old_scrl_y = wd->expanded_item->item->old_scrl_y + wd->expanded_item->item->h;
6039 if (expanded_next_it->item->scrl_y <= expanded_next_it->item->old_scrl_y) //did not calculate next item position
6040 expanded_next_it->item->scrl_y = cvy + cvh;
6042 dy = ((expanded_next_it->item->scrl_y >= (cvy + cvh)) ?
6043 cvy + cvh : expanded_next_it->item->scrl_y) -
6044 expanded_next_it->item->old_scrl_y;
6046 else if (wd->move_effect_mode == ELM_GENLIST_TREE_EFFECT_CONTRACT)
6048 if (expanded_next_it->item->scrl_y >= expanded_next_it->item->old_scrl_y) //did not calculate next item position
6049 expanded_next_it->item->old_scrl_y = cvy + cvh;
6051 if (expanded_next_it->item->old_scrl_y > (cvy + cvh))
6053 dy = (wd->expanded_item->item->scrl_y + wd->expanded_item->item->h) -
6055 expanded_next_it->item->old_scrl_y = cvy + cvh;
6059 dy = (wd->expanded_item->item->scrl_y + wd->expanded_item->item->h) -
6060 expanded_next_it->item->old_scrl_y;
6064 if (t <= effect_duration)
6066 y = ((1 - (1 - (t / effect_duration)) * (1 - (t /effect_duration))) * dy);
6076 _item_realize(it, in, 0);
6080 if (it != expanded_next_it)
6082 it->item->old_scrl_y = expanded_next_it->item->old_scrl_y + expanded_next_it->item->h + dh;
6086 if ((it->item->old_scrl_y + y) < (cvy + cvh))
6087 _item_position(it, VIEW(it),it->item->scrl_x, it->item->old_scrl_y + y);
6090 _item_tree_effect(wd, y);
6094 int expanded_item_num = 0;
6097 if (wd->expanded_item)
6098 it = (Elm_Gen_Item *) elm_genlist_item_next_get((Elm_Object_Item *) wd->expanded_item);
6103 expanded_item_num++;
6104 it2 = (Elm_Gen_Item *) elm_genlist_item_next_get((Elm_Object_Item *) it2);
6110 if (wd->expanded_item->item->expanded_depth >= it->item->expanded_depth) break;
6111 if (wd->move_effect_mode == ELM_GENLIST_TREE_EFFECT_EXPAND)
6113 if (!it->item->tree_effect_finished)
6115 if (t >= (((num - 1) * effect_duration) / expanded_item_num))
6117 edje_object_signal_emit(VIEW(it), "flip_item", "");
6118 _item_position(it, VIEW(it), it->item->scrl_x, it->item->scrl_y);
6119 it->item->tree_effect_finished = EINA_TRUE;
6123 it = (Elm_Gen_Item *) elm_genlist_item_next_get((Elm_Object_Item *) it);
6129 _item_tree_effect_finish(wd);
6130 return ECORE_CALLBACK_CANCEL;
6132 return ECORE_CALLBACK_RENEW;