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 *deco_it_texts, *deco_it_contents, *deco_it_states, *deco_it_content_objs;
56 Eina_List *deco_all_textss, *deco_all_contents, *deco_all_states, *deco_all_content_objs;
57 Eina_List *flip_contents, *flip_content_objs;
58 Ecore_Timer *swipe_timer;
59 Evas_Coord scrl_x, scrl_y, old_scrl_y;
62 Evas_Object *deco_it_view;
68 Eina_Bool want_realize : 1;
69 Eina_Bool expanded : 1;
70 Eina_Bool mincalcd : 1;
73 Eina_Bool updateme : 1;
74 Eina_Bool nocache : 1; /* do not use cache for this item */
75 Eina_Bool nocache_once : 1; /* do not use cache for this item only once */
76 Eina_Bool stacking_even : 1;
77 Eina_Bool nostacking : 1;
78 Eina_Bool move_effect_enabled : 1;
79 Eina_Bool decorate_all_item_realized : 1;
80 Eina_Bool tree_effect_finished : 1; /* tree effect */
81 Eina_Bool tree_effect_hideme : 1; /* item hide for tree effect */
92 Evas_Coord x, y, w, h, minw, minh;
94 int item_position_stamp;
96 Eina_Bool position_update : 1;
97 Eina_Bool want_unrealize : 1;
98 Eina_Bool realized : 1;
99 Eina_Bool changed : 1;
100 Eina_Bool updateme : 1;
101 Eina_Bool showme : 1;
102 Eina_Bool must_recalc : 1;
109 Evas_Object *base_view, *spacer;
111 const char *item_style; // it->itc->item_style
112 Eina_Bool tree : 1; // it->group
114 Eina_Bool selected : 1; // it->selected
115 Eina_Bool disabled : 1; // it->disabled
116 Eina_Bool expanded : 1; // it->item->expanded
119 static const char *widtype = NULL;
120 static void _item_cache_zero(Widget_Data *wd);
121 static void _del_hook(Evas_Object *obj);
122 static void _mirrored_set(Evas_Object *obj,
124 static void _theme_hook(Evas_Object *obj);
125 static void _show_region_hook(void *data,
127 static void _sizing_eval(Evas_Object *obj);
128 static void _item_realize(Elm_Gen_Item *it,
131 static void _item_unrealize_cb(Elm_Gen_Item *it);
132 static void _item_block_unrealize(Item_Block *itb);
133 static void _calc_job(void *data);
134 static void _on_focus_hook(void *data,
136 static Eina_Bool _item_multi_select_up(Widget_Data *wd);
137 static Eina_Bool _item_multi_select_down(Widget_Data *wd);
138 static Eina_Bool _item_single_select_up(Widget_Data *wd);
139 static Eina_Bool _item_single_select_down(Widget_Data *wd);
140 static Evas_Object * _item_content_unset_hook(Elm_Gen_Item *it, const char *part);
141 static Eina_Bool _event_hook(Evas_Object *obj,
143 Evas_Callback_Type type,
145 static void _signal_emit_hook(Evas_Object *obj,
146 const char *emission,
148 static Eina_Bool _deselect_all_items(Widget_Data *wd);
149 static void _pan_calculate(Evas_Object *obj);
150 static void _pan_max_get(Evas_Object *obj,
153 static void _item_position(Elm_Gen_Item *it,
157 static void _decorate_item_realize(Elm_Gen_Item *it);
158 static void _decorate_item_unrealize(Elm_Gen_Item *it);
159 static void _decorate_item_set(Elm_Gen_Item *it);
160 static void _decorate_item_unset(Widget_Data *wd);
161 static void _decorate_all_item_position(Elm_Gen_Item *it, int itx, int ity);
162 static void _decorate_all_item_realize(Elm_Gen_Item *it, Eina_Bool effect_on);
163 static void _decorate_all_item_unrealize(Elm_Gen_Item *it);
164 static void _group_items_recalc(void *data);
165 static void _item_move_after(Elm_Gen_Item *it,
166 Elm_Gen_Item *after);
167 static void _item_move_before(Elm_Gen_Item *it,
168 Elm_Gen_Item *before);
169 static void _item_auto_scroll(Widget_Data *wd);
170 static void _elm_genlist_clear(Evas_Object *obj,
172 static void _pan_child_size_get(Evas_Object *obj,
175 static Evas_Object* _create_tray_alpha_bg(const Evas_Object *obj);
176 static void _item_contract_emit(Elm_Gen_Item *it);
177 static int _item_tree_effect_before(Elm_Gen_Item *it);
178 static void _item_tree_effect(Widget_Data *wd, int y);
179 static void _item_tree_effect_finish(Widget_Data *wd);
180 static Eina_Bool _tree_effect_animator_cb(void *data);
182 static Evas_Smart_Class _pan_sc = EVAS_SMART_CLASS_INIT_VERSION;
184 static const char SIG_ACTIVATED[] = "activated";
185 static const char SIG_CLICKED_DOUBLE[] = "clicked,double";
186 static const char SIG_SELECTED[] = "selected";
187 static const char SIG_UNSELECTED[] = "unselected";
188 static const char SIG_EXPANDED[] = "expanded";
189 static const char SIG_CONTRACTED[] = "contracted";
190 static const char SIG_EXPAND_REQUEST[] = "expand,request";
191 static const char SIG_CONTRACT_REQUEST[] = "contract,request";
192 static const char SIG_REALIZED[] = "realized";
193 static const char SIG_UNREALIZED[] = "unrealized";
194 static const char SIG_DRAG_START_UP[] = "drag,start,up";
195 static const char SIG_DRAG_START_DOWN[] = "drag,start,down";
196 static const char SIG_DRAG_START_LEFT[] = "drag,start,left";
197 static const char SIG_DRAG_START_RIGHT[] = "drag,start,right";
198 static const char SIG_DRAG_STOP[] = "drag,stop";
199 static const char SIG_DRAG[] = "drag";
200 static const char SIG_LONGPRESSED[] = "longpressed";
201 static const char SIG_SCROLL_ANIM_START[] = "scroll,anim,start";
202 static const char SIG_SCROLL_ANIM_STOP[] = "scroll,anim,stop";
203 static const char SIG_SCROLL_DRAG_START[] = "scroll,drag,start";
204 static const char SIG_SCROLL_DRAG_STOP[] = "scroll,drag,stop";
205 static const char SIG_EDGE_TOP[] = "edge,top";
206 static const char SIG_EDGE_BOTTOM[] = "edge,bottom";
207 static const char SIG_EDGE_LEFT[] = "edge,left";
208 static const char SIG_EDGE_RIGHT[] = "edge,right";
209 static const char SIG_MULTI_SWIPE_LEFT[] = "multi,swipe,left";
210 static const char SIG_MULTI_SWIPE_RIGHT[] = "multi,swipe,right";
211 static const char SIG_MULTI_SWIPE_UP[] = "multi,swipe,up";
212 static const char SIG_MULTI_SWIPE_DOWN[] = "multi,swipe,down";
213 static const char SIG_MULTI_PINCH_OUT[] = "multi,pinch,out";
214 static const char SIG_MULTI_PINCH_IN[] = "multi,pinch,in";
215 static const char SIG_SWIPE[] = "swipe";
216 static const char SIG_MOVED[] = "moved";
217 static const char SIG_MOVED_AFTER[] = "moved,after";
218 static const char SIG_MOVED_BEFORE[] = "moved,before";
219 static const char SIG_INDEX_UPDATE[] = "index,update";
220 static const char SIG_TREE_EFFECT_FINISHED [] = "tree,effect,finished";
222 static const Evas_Smart_Cb_Description _signals[] = {
223 {SIG_CLICKED_DOUBLE, ""},
226 {SIG_UNSELECTED, ""},
228 {SIG_CONTRACTED, ""},
229 {SIG_EXPAND_REQUEST, ""},
230 {SIG_CONTRACT_REQUEST, ""},
232 {SIG_UNREALIZED, ""},
233 {SIG_DRAG_START_UP, ""},
234 {SIG_DRAG_START_DOWN, ""},
235 {SIG_DRAG_START_LEFT, ""},
236 {SIG_DRAG_START_RIGHT, ""},
239 {SIG_LONGPRESSED, ""},
240 {SIG_SCROLL_ANIM_START, ""},
241 {SIG_SCROLL_ANIM_STOP, ""},
242 {SIG_SCROLL_DRAG_START, ""},
243 {SIG_SCROLL_DRAG_STOP, ""},
245 {SIG_EDGE_BOTTOM, ""},
247 {SIG_EDGE_RIGHT, ""},
248 {SIG_MULTI_SWIPE_LEFT, ""},
249 {SIG_MULTI_SWIPE_RIGHT, ""},
250 {SIG_MULTI_SWIPE_UP, ""},
251 {SIG_MULTI_SWIPE_DOWN, ""},
252 {SIG_MULTI_PINCH_OUT, ""},
253 {SIG_MULTI_PINCH_IN, ""},
256 {SIG_MOVED_AFTER, ""},
257 {SIG_MOVED_BEFORE, ""},
258 {SIG_TREE_EFFECT_FINISHED, ""},
263 #undef ELM_CHECK_WIDTYPE
264 #define ELM_CHECK_WIDTYPE(obj, widtype) \
265 if ((!obj) || (!elm_genlist_type_check((obj), __func__))) return
266 #undef ELM_WIDGET_ITEM_WIDTYPE_CHECK_OR_RETURN
267 #define ELM_WIDGET_ITEM_WIDTYPE_CHECK_OR_RETURN(it, ...) \
268 ELM_WIDGET_ITEM_CHECK_OR_RETURN((Elm_Widget_Item *)it, __VA_ARGS__); \
269 ELM_CHECK_WIDTYPE(WIDGET((it)), widtype) __VA_ARGS__;
271 static const char *_gengrid = NULL;
272 static const char *_genlist = NULL;
274 /* THIS FUNCTION IS HACKY AND TEMPORARY!!! */
276 elm_genlist_type_check(const Evas_Object *obj,
279 const char *provided, *expected = "(unknown)";
280 static int abort_on_warn = -1;
281 provided = elm_widget_type_get(obj);
282 if (!_genlist) _genlist = eina_stringshare_add("genlist");
283 if (!_gengrid) _gengrid = eina_stringshare_add("gengrid");
284 if (EINA_LIKELY(provided == _genlist) || EINA_LIKELY(provided == _gengrid))
286 if ((!provided) || (!provided[0]))
288 provided = evas_object_type_get(obj);
289 if ((!provided) || (!provided[0]))
290 provided = "(unknown)";
292 ERR("Passing Object: %p in function: %s, of type: '%s' when expecting type: '%s'", obj, func, provided, expected);
293 if (abort_on_warn == -1)
295 if (getenv("ELM_ERROR_ABORT")) abort_on_warn = 1;
296 else abort_on_warn = 0;
298 if (abort_on_warn == 1) abort();
303 _event_hook(Evas_Object *obj,
304 Evas_Object *src __UNUSED__,
305 Evas_Callback_Type type,
308 if (type != EVAS_CALLBACK_KEY_DOWN) return EINA_FALSE;
309 Evas_Event_Key_Down *ev = event_info;
310 Widget_Data *wd = elm_widget_data_get(obj);
311 Evas_Coord pan_max_x = 0, pan_max_y = 0;
312 if (!wd) return EINA_FALSE;
313 if (!wd->items) return EINA_FALSE;
314 if (ev->event_flags & EVAS_EVENT_FLAG_ON_HOLD) return EINA_FALSE;
315 if (elm_widget_disabled_get(obj)) return EINA_FALSE;
317 Elm_Object_Item *it = NULL;
320 Evas_Coord step_x = 0;
321 Evas_Coord step_y = 0;
324 Evas_Coord page_x = 0;
325 Evas_Coord page_y = 0;
327 elm_smart_scroller_child_pos_get(wd->scr, &x, &y);
328 elm_smart_scroller_step_size_get(wd->scr, &step_x, &step_y);
329 elm_smart_scroller_page_size_get(wd->scr, &page_x, &page_y);
330 elm_smart_scroller_child_viewport_size_get(wd->scr, &v_w, &v_h);
332 if ((!strcmp(ev->keyname, "Left")) ||
333 ((!strcmp(ev->keyname, "KP_Left")) && (!ev->string)))
337 else if ((!strcmp(ev->keyname, "Right")) ||
338 ((!strcmp(ev->keyname, "KP_Right")) && (!ev->string)))
342 else if ((!strcmp(ev->keyname, "Up")) ||
343 ((!strcmp(ev->keyname, "KP_Up")) && (!ev->string)))
345 if (((evas_key_modifier_is_set(ev->modifiers, "Shift")) &&
346 (_item_multi_select_up(wd)))
347 || (_item_single_select_up(wd)))
349 ev->event_flags |= EVAS_EVENT_FLAG_ON_HOLD;
355 else if ((!strcmp(ev->keyname, "Down")) ||
356 ((!strcmp(ev->keyname, "KP_Down")) && (!ev->string)))
358 if (((evas_key_modifier_is_set(ev->modifiers, "Shift")) &&
359 (_item_multi_select_down(wd)))
360 || (_item_single_select_down(wd)))
362 ev->event_flags |= EVAS_EVENT_FLAG_ON_HOLD;
368 else if ((!strcmp(ev->keyname, "Home")) ||
369 ((!strcmp(ev->keyname, "KP_Home")) && (!ev->string)))
371 it = elm_genlist_first_item_get(obj);
372 elm_genlist_item_bring_in(it, ELM_GENLIST_ITEM_SCROLLTO_IN);
373 elm_genlist_item_selected_set(it, EINA_TRUE);
374 ev->event_flags |= EVAS_EVENT_FLAG_ON_HOLD;
377 else if ((!strcmp(ev->keyname, "End")) ||
378 ((!strcmp(ev->keyname, "KP_End")) && (!ev->string)))
380 it = elm_genlist_last_item_get(obj);
381 elm_genlist_item_bring_in(it, ELM_GENLIST_ITEM_SCROLLTO_IN);
382 elm_genlist_item_selected_set(it, EINA_TRUE);
383 ev->event_flags |= EVAS_EVENT_FLAG_ON_HOLD;
386 else if ((!strcmp(ev->keyname, "Prior")) ||
387 ((!strcmp(ev->keyname, "KP_Prior")) && (!ev->string)))
390 y -= -(page_y * v_h) / 100;
394 else if ((!strcmp(ev->keyname, "Next")) ||
395 ((!strcmp(ev->keyname, "KP_Next")) && (!ev->string)))
398 y += -(page_y * v_h) / 100;
402 else if (!strcmp(ev->keyname, "Escape"))
404 if (!_deselect_all_items(wd)) return EINA_FALSE;
405 ev->event_flags |= EVAS_EVENT_FLAG_ON_HOLD;
408 else if (((!strcmp(ev->keyname, "Return")) ||
409 (!strcmp(ev->keyname, "KP_Enter")) ||
410 (!strcmp(ev->keyname, "space")))
411 && (!wd->multi) && (wd->selected))
413 it = elm_genlist_selected_item_get(obj);
414 elm_genlist_item_expanded_set(it,
415 !elm_genlist_item_expanded_get(it));
416 evas_object_smart_callback_call(WIDGET(it), SIG_ACTIVATED, it);
418 else return EINA_FALSE;
420 ev->event_flags |= EVAS_EVENT_FLAG_ON_HOLD;
421 _pan_max_get(wd->pan_smart, &pan_max_x, &pan_max_y);
423 if (x > pan_max_x) x = pan_max_x;
425 if (y > pan_max_y) y = pan_max_y;
426 elm_smart_scroller_child_pos_set(wd->scr, x, y);
431 _deselect_all_items(Widget_Data *wd)
433 if (!wd->selected) return EINA_FALSE;
435 elm_genlist_item_selected_set(wd->selected->data, EINA_FALSE);
441 _item_multi_select_up(Widget_Data *wd)
443 if (!wd->selected) return EINA_FALSE;
444 if (!wd->multi) return EINA_FALSE;
446 Elm_Object_Item *prev = elm_genlist_item_prev_get(wd->last_selected_item);
447 if (!prev) return EINA_TRUE;
449 if (elm_genlist_item_selected_get(prev))
451 elm_genlist_item_selected_set(wd->last_selected_item, EINA_FALSE);
452 wd->last_selected_item = prev;
453 elm_genlist_item_show(wd->last_selected_item, ELM_GENLIST_ITEM_SCROLLTO_IN);
457 elm_genlist_item_selected_set(prev, EINA_TRUE);
458 elm_genlist_item_show(prev, ELM_GENLIST_ITEM_SCROLLTO_IN);
464 _item_multi_select_down(Widget_Data *wd)
466 if (!wd->selected) return EINA_FALSE;
467 if (!wd->multi) return EINA_FALSE;
469 Elm_Object_Item *next;
470 next = elm_genlist_item_next_get(wd->last_selected_item);
471 if (!next) return EINA_TRUE;
473 if (elm_genlist_item_selected_get(next))
475 elm_genlist_item_selected_set(wd->last_selected_item, EINA_FALSE);
476 wd->last_selected_item = next;
477 elm_genlist_item_show(wd->last_selected_item, ELM_GENLIST_ITEM_SCROLLTO_IN);
481 elm_genlist_item_selected_set(next, EINA_TRUE);
482 elm_genlist_item_show(next, ELM_GENLIST_ITEM_SCROLLTO_IN);
488 _item_single_select_up(Widget_Data *wd)
493 prev = ELM_GEN_ITEM_FROM_INLIST(wd->items->last);
494 while ((prev) && (prev->generation < wd->generation))
495 prev = ELM_GEN_ITEM_FROM_INLIST(EINA_INLIST_GET(prev)->prev);
497 else prev = (Elm_Gen_Item *) elm_genlist_item_prev_get(wd->last_selected_item);
499 if (!prev) return EINA_FALSE;
501 _deselect_all_items(wd);
503 elm_genlist_item_selected_set((Elm_Object_Item *) prev, EINA_TRUE);
504 elm_genlist_item_show((Elm_Object_Item *) prev, ELM_GENLIST_ITEM_SCROLLTO_IN);
509 _item_single_select_down(Widget_Data *wd)
514 next = ELM_GEN_ITEM_FROM_INLIST(wd->items);
515 while ((next) && (next->generation < wd->generation))
516 next = ELM_GEN_ITEM_FROM_INLIST(EINA_INLIST_GET(next)->next);
518 else next = (Elm_Gen_Item *) elm_genlist_item_next_get(wd->last_selected_item);
520 if (!next) return EINA_FALSE;
522 _deselect_all_items(wd);
524 elm_genlist_item_selected_set((Elm_Object_Item *) next, EINA_TRUE);
525 elm_genlist_item_show((Elm_Object_Item *) next, ELM_GENLIST_ITEM_SCROLLTO_IN);
530 _on_focus_hook(void *data __UNUSED__,
533 Widget_Data *wd = elm_widget_data_get(obj);
535 if (elm_widget_focus_get(obj))
537 elm_object_signal_emit(wd->obj, "elm,action,focus", "elm");
538 evas_object_focus_set(wd->obj, EINA_TRUE);
539 if ((wd->selected) && (!wd->last_selected_item))
540 wd->last_selected_item = eina_list_data_get(wd->selected);
544 elm_object_signal_emit(wd->obj, "elm,action,unfocus", "elm");
545 evas_object_focus_set(wd->obj, EINA_FALSE);
550 _del_hook(Evas_Object *obj)
552 Widget_Data *wd = elm_widget_data_get(obj);
554 _item_cache_zero(wd);
555 if (wd->calc_job) ecore_job_del(wd->calc_job);
556 if (wd->update_job) ecore_job_del(wd->update_job);
557 if (wd->queue_idle_enterer) ecore_idle_enterer_del(wd->queue_idle_enterer);
558 if (wd->must_recalc_idler) ecore_idler_del(wd->must_recalc_idler);
559 if (wd->multi_timer) ecore_timer_del(wd->multi_timer);
560 if (wd->decorate_it_type) eina_stringshare_del(wd->decorate_it_type);
561 if (wd->scr_hold_timer) ecore_timer_del(wd->scr_hold_timer);
562 if (wd->tree_effect_animator) ecore_animator_del(wd->tree_effect_animator);
567 _del_pre_hook(Evas_Object *obj)
569 Widget_Data *wd = elm_widget_data_get(obj);
571 if (wd->decorate_all_mode) elm_genlist_decorate_mode_set(wd->obj, EINA_FALSE);
572 elm_genlist_clear(obj);
573 evas_object_del(wd->pan_smart);
574 wd->pan_smart = NULL;
578 _mirrored_set(Evas_Object *obj,
581 Widget_Data *wd = elm_widget_data_get(obj);
583 _item_cache_zero(wd);
584 elm_smart_scroller_mirrored_set(wd->scr, rtl);
588 _theme_hook(Evas_Object *obj)
590 Widget_Data *wd = elm_widget_data_get(obj);
593 evas_event_freeze(evas_object_evas_get(wd->obj));
594 _item_cache_zero(wd);
595 _elm_widget_mirrored_reload(obj);
596 _mirrored_set(obj, elm_widget_mirrored_get(obj));
597 elm_smart_scroller_object_theme_set(obj, wd->scr, "genlist", "base",
598 elm_widget_style_get(obj));
599 edje_object_scale_set(wd->scr, elm_widget_scale_get(obj) * _elm_config->scale);
600 wd->item_width = wd->item_height = 0;
601 wd->group_item_width = wd->group_item_height = 0;
602 wd->minw = wd->minh = wd->realminw = 0;
603 EINA_INLIST_FOREACH(wd->blocks, itb)
608 if (itb->realized) _item_block_unrealize(itb);
609 EINA_LIST_FOREACH(itb->items, l, it)
610 it->item->mincalcd = EINA_FALSE;
612 itb->changed = EINA_TRUE;
614 if (wd->calc_job) ecore_job_del(wd->calc_job);
615 wd->calc_job = ecore_job_add(_calc_job, wd);
617 evas_event_thaw(evas_object_evas_get(wd->obj));
618 evas_event_thaw_eval(evas_object_evas_get(wd->obj));
622 _show_region_hook(void *data,
625 Widget_Data *wd = elm_widget_data_get(data);
626 Evas_Coord x, y, w, h;
628 elm_widget_show_region_get(obj, &x, &y, &w, &h);
629 //x & y are screen coordinates, Add with pan coordinates
632 elm_smart_scroller_child_region_show(wd->scr, x, y, w, h);
636 _translate_hook(Evas_Object *obj)
638 evas_object_smart_callback_call(obj, "language,changed", NULL);
642 _sizing_eval(Evas_Object *obj)
644 Widget_Data *wd = elm_widget_data_get(obj);
645 Evas_Coord minw = -1, minh = -1, maxw = -1, maxh = -1;
646 Evas_Coord vmw = 0, vmh = 0;
649 evas_object_size_hint_min_get(wd->scr, &minw, NULL);
650 evas_object_size_hint_max_get(wd->scr, &maxw, &maxh);
652 edje_object_size_min_calc
653 (elm_smart_scroller_edje_object_get(wd->scr), &vmw, &vmh);
655 if (wd->mode == ELM_LIST_COMPRESS)
659 elm_smart_scroller_child_viewport_size_get(wd->scr, &vw, &vh);
660 if ((vw != 0) && (vw != wd->prev_viewport_w))
664 wd->prev_viewport_w = vw;
665 EINA_INLIST_FOREACH(wd->blocks, itb)
667 itb->must_recalc = EINA_TRUE;
669 if (wd->calc_job) ecore_job_del(wd->calc_job);
670 wd->calc_job = ecore_job_add(_calc_job, wd);
675 else if (wd->mode == ELM_LIST_LIMIT)
686 evas_object_size_hint_min_set(obj, minw, minh);
687 evas_object_size_hint_max_set(obj, maxw, maxh);
691 _signal_emit_hook(Evas_Object *obj,
692 const char *emission,
695 Widget_Data *wd = elm_widget_data_get(obj);
696 edje_object_signal_emit(elm_smart_scroller_edje_object_get(wd->scr),
701 _item_highlight(Elm_Gen_Item *it)
703 const char *selectraise;
704 if ((it->wd->select_mode == ELM_OBJECT_SELECT_MODE_NONE) ||
705 (!it->wd->highlight) ||
706 (it->generation < it->wd->generation) ||
707 (it->highlighted) || elm_widget_item_disabled_get(it) ||
708 (it->select_mode == ELM_OBJECT_SELECT_MODE_NONE) || (it->item->deco_it_view) ||
709 (it->select_mode == ELM_OBJECT_SELECT_MODE_DISPLAY_ONLY))
711 edje_object_signal_emit(VIEW(it), "elm,state,selected", "elm");
712 if (it->deco_all_obj) edje_object_signal_emit(it->deco_all_obj, "elm,state,selected", "elm");
713 selectraise = edje_object_data_get(VIEW(it), "selectraise");
714 if ((selectraise) && (!strcmp(selectraise, "on")))
716 if (it->deco_all_obj) evas_object_raise(it->deco_all_obj);
717 else evas_object_raise(VIEW(it));
718 if ((it->item->group_item) && (it->item->group_item->realized))
719 evas_object_raise(it->item->VIEW(group_item));
721 it->highlighted = EINA_TRUE;
725 _item_unhighlight(Elm_Gen_Item *it)
727 if ((it->generation < it->wd->generation) || (!it->highlighted)) return;
728 edje_object_signal_emit(VIEW(it), "elm,state,unselected", "elm");
729 if (it->deco_all_obj) edje_object_signal_emit(it->deco_all_obj, "elm,state,unselected", "elm");
730 if (!it->item->nostacking)
732 if ((it->item->order_num_in & 0x1) ^ it->item->stacking_even)
734 if (it->deco_all_obj) evas_object_lower(it->deco_all_obj);
735 else evas_object_lower(VIEW(it));
739 if (it->deco_all_obj) evas_object_raise(it->deco_all_obj);
740 else evas_object_raise(VIEW(it));
743 it->highlighted = EINA_FALSE;
747 _item_block_position_update(Eina_Inlist *list, int idx)
751 EINA_INLIST_FOREACH(list, tmp)
753 tmp->position = idx++;
754 tmp->position_update = EINA_TRUE;
759 _item_position_update(Eina_List *list, int idx)
764 EINA_LIST_FOREACH(list, l, it)
766 it->position = idx++;
767 it->position_update = EINA_TRUE;
772 _item_block_del(Elm_Gen_Item *it)
775 Item_Block *itb = it->item->block;
777 itb->items = eina_list_remove(itb->items, it);
779 itb->changed = EINA_TRUE;
780 if (it->wd->calc_job) ecore_job_del(it->wd->calc_job);
781 it->wd->calc_job = ecore_job_add(_calc_job, it->wd);
784 il = EINA_INLIST_GET(itb);
785 Item_Block *itbn = (Item_Block *)(il->next);
787 it->parent->item->items = eina_list_remove(it->parent->item->items, it);
790 _item_block_position_update(il->next, itb->position);
791 it->wd->blocks = eina_inlist_remove(it->wd->blocks, il);
794 if (itbn) itbn->changed = EINA_TRUE;
798 if (itb->count < itb->wd->max_items_per_block/2)
800 il = EINA_INLIST_GET(itb);
801 Item_Block *itbp = (Item_Block *)(il->prev);
802 Item_Block *itbn = (Item_Block *)(il->next);
803 if ((itbp) && ((itbp->count + itb->count) < itb->wd->max_items_per_block + itb->wd->max_items_per_block/2))
807 EINA_LIST_FREE(itb->items, it2)
809 it2->item->block = itbp;
810 itbp->items = eina_list_append(itbp->items, it2);
812 itbp->changed = EINA_TRUE;
814 _item_block_position_update(EINA_INLIST_GET(itb)->next,
816 it->wd->blocks = eina_inlist_remove(it->wd->blocks,
817 EINA_INLIST_GET(itb));
820 else if ((itbn) && ((itbn->count + itb->count) < itb->wd->max_items_per_block + itb->wd->max_items_per_block/2))
824 Eina_List *last = eina_list_last(itb->items);
825 Elm_Gen_Item *it2 = last->data;
827 it2->item->block = itbn;
828 itb->items = eina_list_remove_list(itb->items, last);
829 itbn->items = eina_list_prepend(itbn->items, it2);
831 itbn->changed = EINA_TRUE;
833 _item_block_position_update(EINA_INLIST_GET(itb)->next,
836 eina_inlist_remove(it->wd->blocks, EINA_INLIST_GET(itb));
844 _item_subitems_clear(Elm_Gen_Item *it)
846 ELM_OBJ_ITEM_CHECK_OR_RETURN(it);
847 Eina_List *tl = NULL, *l;
848 Elm_Object_Item *it2;
850 EINA_LIST_FOREACH(it->item->items, l, it2)
851 tl = eina_list_append(tl, it2);
852 EINA_LIST_FREE(tl, it2)
853 elm_object_item_del(it2);
857 _item_del(Elm_Gen_Item *it)
859 Evas_Object *obj = WIDGET(it);
861 evas_event_freeze(evas_object_evas_get(obj));
862 elm_genlist_item_subitems_clear((Elm_Object_Item *)it);
863 if (it->wd->show_item == it) it->wd->show_item = NULL;
864 if (it->realized) _elm_genlist_item_unrealize(it, EINA_FALSE);
865 if (it->item->decorate_all_item_realized) _decorate_all_item_unrealize(it);
866 if (it->item->block) _item_block_del(it);
867 if (it->item->queued)
868 it->wd->queue = eina_list_remove(it->wd->queue, it);
869 if (it->wd->anchor_item == it)
871 it->wd->anchor_item = ELM_GEN_ITEM_FROM_INLIST(EINA_INLIST_GET(it)->next);
872 if (!it->wd->anchor_item)
873 it->wd->anchor_item = ELM_GEN_ITEM_FROM_INLIST(EINA_INLIST_GET(it)->prev);
875 if (it->wd->expanded_item == it) it->wd->expanded_item = NULL;
876 if (it->wd->expanded_next_item == it) it->wd->expanded_next_item = NULL;
878 it->parent->item->items = eina_list_remove(it->parent->item->items, it);
879 if (it->item->swipe_timer)
881 ecore_timer_del(it->item->swipe_timer);
882 it->item->swipe_timer = NULL;
884 _elm_genlist_item_del_serious(it);
885 elm_genlist_item_class_unref((Elm_Genlist_Item_Class *)it->itc);
886 evas_event_thaw(evas_object_evas_get(obj));
887 evas_event_thaw_eval(evas_object_evas_get(obj));
891 _clear_cb(Widget_Data *wd)
893 wd->anchor_item = NULL;
894 if (wd->queue_idle_enterer)
896 ecore_idle_enterer_del(wd->queue_idle_enterer);
897 wd->queue_idle_enterer = NULL;
899 if (wd->must_recalc_idler)
901 ecore_idler_del(wd->must_recalc_idler);
902 wd->must_recalc_idler = NULL;
904 if (wd->queue) wd->queue = eina_list_free(wd->queue);
905 if (wd->reorder_move_animator)
907 ecore_animator_del(wd->reorder_move_animator);
908 wd->reorder_move_animator = NULL;
910 wd->show_item = NULL;
911 wd->reorder_old_pan_y = 0;
915 _item_unselect(Elm_Gen_Item *it)
917 if ((it->generation < it->wd->generation) || (!it->selected)) return;
918 it->selected = EINA_FALSE;
919 it->wd->selected = eina_list_remove(it->wd->selected, it);
920 evas_object_smart_callback_call(WIDGET(it), SIG_UNSELECTED, it);
924 _mouse_move(void *data,
925 Evas *evas __UNUSED__,
929 Elm_Gen_Item *it = data;
930 Evas_Event_Mouse_Move *ev = event_info;
931 Evas_Coord minw = 0, minh = 0, x, y, dx, dy, adx, ady;
932 Evas_Coord ox, oy, ow, oh, it_scrl_y, y_pos;
934 if (ev->event_flags & EVAS_EVENT_FLAG_ON_HOLD)
936 if (!it->wd->on_hold)
938 it->wd->on_hold = EINA_TRUE;
939 if ((!it->wd->wasselected) && (!it->flipped))
941 _item_unhighlight(it);
946 if (it->wd->multitouched)
948 it->wd->cur_x = ev->cur.canvas.x;
949 it->wd->cur_y = ev->cur.canvas.y;
952 if ((it->dragging) && (it->down))
954 if (it->wd->movements == SWIPE_MOVES) it->wd->swipe = EINA_TRUE;
957 it->wd->history[it->wd->movements].x = ev->cur.canvas.x;
958 it->wd->history[it->wd->movements].y = ev->cur.canvas.y;
959 if (abs((it->wd->history[it->wd->movements].x -
960 it->wd->history[0].x)) > 40)
961 it->wd->swipe = EINA_TRUE;
967 ecore_timer_del(it->long_timer);
968 it->long_timer = NULL;
970 evas_object_smart_callback_call(WIDGET(it), SIG_DRAG, it);
973 if ((!it->down) /* || (it->wd->on_hold)*/ || (it->wd->longpressed))
977 ecore_timer_del(it->long_timer);
978 it->long_timer = NULL;
980 if ((it->wd->reorder_mode) && (it->wd->reorder_it))
982 evas_object_geometry_get(it->wd->pan_smart, &ox, &oy, &ow, &oh);
983 it_scrl_y = ev->cur.canvas.y - it->wd->reorder_it->dy;
985 if (!it->wd->reorder_start_y)
986 it->wd->reorder_start_y = it->item->block->y + it->y;
990 else if (it_scrl_y + it->wd->reorder_it->item->h > oy + oh)
991 y_pos = oy + oh - it->wd->reorder_it->item->h;
995 if (it->deco_all_obj)
996 _item_position(it, it->deco_all_obj, it->item->scrl_x, y_pos);
998 _item_position(it, VIEW(it), it->item->scrl_x, y_pos);
1000 if (it->wd->calc_job) ecore_job_del(it->wd->calc_job);
1001 it->wd->calc_job = ecore_job_add(_calc_job, it->wd);
1005 if (it->select_mode != ELM_OBJECT_SELECT_MODE_DISPLAY_ONLY)
1006 elm_coords_finger_size_adjust(1, &minw, 1, &minh);
1007 evas_object_geometry_get(obj, &x, &y, NULL, NULL);
1008 x = ev->cur.canvas.x - x;
1009 y = ev->cur.canvas.y - y;
1012 if (adx < 0) adx = -dx;
1015 if (ady < 0) ady = -dy;
1018 if ((adx > minw) || (ady > minh))
1020 it->dragging = EINA_TRUE;
1023 ecore_timer_del(it->long_timer);
1024 it->long_timer = NULL;
1026 if (!it->wd->wasselected)
1028 _item_unhighlight(it);
1034 evas_object_smart_callback_call(WIDGET(it),
1035 SIG_DRAG_START_UP, it);
1039 evas_object_smart_callback_call(WIDGET(it),
1040 SIG_DRAG_START_LEFT, it);
1042 evas_object_smart_callback_call(WIDGET(it),
1043 SIG_DRAG_START_RIGHT, it);
1049 evas_object_smart_callback_call(WIDGET(it),
1050 SIG_DRAG_START_DOWN, it);
1054 evas_object_smart_callback_call(WIDGET(it),
1055 SIG_DRAG_START_LEFT, it);
1057 evas_object_smart_callback_call(WIDGET(it),
1058 SIG_DRAG_START_RIGHT, it);
1065 _long_press(void *data)
1067 Elm_Gen_Item *it = data, *it_tmp;
1068 Eina_List *list, *l;
1070 it->long_timer = NULL;
1071 if (elm_widget_item_disabled_get(it) || (it->dragging) ||
1072 (it->select_mode == ELM_OBJECT_SELECT_MODE_DISPLAY_ONLY))
1073 return ECORE_CALLBACK_CANCEL;
1074 it->wd->longpressed = EINA_TRUE;
1075 evas_object_smart_callback_call(WIDGET(it), SIG_LONGPRESSED, it);
1076 if ((it->wd->reorder_mode) && (!it->group))
1078 it->wd->reorder_it = it;
1079 it->wd->reorder_start_y = 0;
1080 if (it->deco_all_obj)
1081 evas_object_raise(it->deco_all_obj);
1083 evas_object_raise(VIEW(it));
1085 elm_smart_scroller_hold_set(it->wd->scr, EINA_TRUE);
1086 elm_smart_scroller_bounce_allow_set(it->wd->scr, EINA_FALSE, EINA_FALSE);
1088 list = elm_genlist_realized_items_get(it->wd->obj);
1089 EINA_LIST_FOREACH(list, l, it_tmp)
1091 if (it != it_tmp) _item_unselect(it_tmp);
1093 if (elm_genlist_item_expanded_get((Elm_Object_Item *)it))
1095 elm_genlist_item_expanded_set((Elm_Object_Item *)it, EINA_FALSE);
1096 return ECORE_CALLBACK_RENEW;
1099 if (!it->wd->decorate_all_mode)
1100 edje_object_signal_emit(VIEW(it), "elm,state,reorder,enabled", "elm");
1102 return ECORE_CALLBACK_CANCEL;
1106 _swipe(Elm_Gen_Item *it)
1111 if ((it->select_mode == ELM_OBJECT_SELECT_MODE_DISPLAY_ONLY) ||
1112 elm_widget_item_disabled_get(it)) return;
1113 it->wd->swipe = EINA_FALSE;
1114 for (i = 0; i < it->wd->movements; i++)
1116 sum += it->wd->history[i].x;
1117 if (abs(it->wd->history[0].y - it->wd->history[i].y) > 10) return;
1120 sum /= it->wd->movements;
1121 if (abs(sum - it->wd->history[0].x) <= 10) return;
1122 evas_object_smart_callback_call(WIDGET(it), SIG_SWIPE, it);
1126 _swipe_cancel(void *data)
1128 Elm_Gen_Item *it = data;
1130 if (!it) return ECORE_CALLBACK_CANCEL;
1131 it->wd->swipe = EINA_FALSE;
1132 it->wd->movements = 0;
1133 return ECORE_CALLBACK_RENEW;
1137 _multi_cancel(void *data)
1139 Widget_Data *wd = data;
1141 if (!wd) return ECORE_CALLBACK_CANCEL;
1142 wd->multi_timeout = EINA_TRUE;
1143 return ECORE_CALLBACK_RENEW;
1147 _multi_touch_gesture_eval(void *data)
1149 Elm_Gen_Item *it = data;
1151 it->wd->multitouched = EINA_FALSE;
1152 if (it->wd->multi_timer)
1154 ecore_timer_del(it->wd->multi_timer);
1155 it->wd->multi_timer = NULL;
1157 if (it->wd->multi_timeout)
1159 it->wd->multi_timeout = EINA_FALSE;
1163 Evas_Coord minw = 0, minh = 0;
1164 Evas_Coord off_x, off_y, off_mx, off_my;
1166 elm_coords_finger_size_adjust(1, &minw, 1, &minh);
1167 off_x = abs(it->wd->cur_x - it->wd->prev_x);
1168 off_y = abs(it->wd->cur_y - it->wd->prev_y);
1169 off_mx = abs(it->wd->cur_mx - it->wd->prev_mx);
1170 off_my = abs(it->wd->cur_my - it->wd->prev_my);
1172 if (((off_x > minw) || (off_y > minh)) && ((off_mx > minw) || (off_my > minh)))
1174 if ((off_x + off_mx) > (off_y + off_my))
1176 if ((it->wd->cur_x > it->wd->prev_x) && (it->wd->cur_mx > it->wd->prev_mx))
1177 evas_object_smart_callback_call(WIDGET(it),
1178 SIG_MULTI_SWIPE_RIGHT, it);
1179 else if ((it->wd->cur_x < it->wd->prev_x) && (it->wd->cur_mx < it->wd->prev_mx))
1180 evas_object_smart_callback_call(WIDGET(it),
1181 SIG_MULTI_SWIPE_LEFT, it);
1182 else if (abs(it->wd->cur_x - it->wd->cur_mx) > abs(it->wd->prev_x - it->wd->prev_mx))
1183 evas_object_smart_callback_call(WIDGET(it),
1184 SIG_MULTI_PINCH_OUT, it);
1186 evas_object_smart_callback_call(WIDGET(it),
1187 SIG_MULTI_PINCH_IN, it);
1191 if ((it->wd->cur_y > it->wd->prev_y) && (it->wd->cur_my > it->wd->prev_my))
1192 evas_object_smart_callback_call(WIDGET(it),
1193 SIG_MULTI_SWIPE_DOWN, it);
1194 else if ((it->wd->cur_y < it->wd->prev_y) && (it->wd->cur_my < it->wd->prev_my))
1195 evas_object_smart_callback_call(WIDGET(it),
1196 SIG_MULTI_SWIPE_UP, it);
1197 else if (abs(it->wd->cur_y - it->wd->cur_my) > abs(it->wd->prev_y - it->wd->prev_my))
1198 evas_object_smart_callback_call(WIDGET(it),
1199 SIG_MULTI_PINCH_OUT, it);
1201 evas_object_smart_callback_call(WIDGET(it),
1202 SIG_MULTI_PINCH_IN, it);
1205 it->wd->multi_timeout = EINA_FALSE;
1209 _multi_down(void *data,
1210 Evas *evas __UNUSED__,
1211 Evas_Object *obj __UNUSED__,
1214 Elm_Gen_Item *it = data;
1215 Evas_Event_Multi_Down *ev = event_info;
1217 if ((it->wd->multi_device != 0) || (it->wd->multitouched) || (it->wd->multi_timeout)) return;
1218 it->wd->multi_device = ev->device;
1219 it->wd->multi_down = EINA_TRUE;
1220 it->wd->multitouched = EINA_TRUE;
1221 it->wd->prev_mx = ev->canvas.x;
1222 it->wd->prev_my = ev->canvas.y;
1223 if (!it->wd->wasselected)
1225 _item_unhighlight(it);
1228 it->wd->wasselected = EINA_FALSE;
1229 it->wd->longpressed = EINA_FALSE;
1232 ecore_timer_del(it->long_timer);
1233 it->long_timer = NULL;
1237 it->dragging = EINA_FALSE;
1238 evas_object_smart_callback_call(WIDGET(it), SIG_DRAG_STOP, it);
1240 if (it->item->swipe_timer)
1242 ecore_timer_del(it->item->swipe_timer);
1243 it->item->swipe_timer = NULL;
1245 if (it->wd->on_hold)
1247 it->wd->swipe = EINA_FALSE;
1248 it->wd->movements = 0;
1249 it->wd->on_hold = EINA_FALSE;
1254 _multi_up(void *data,
1255 Evas *evas __UNUSED__,
1256 Evas_Object *obj __UNUSED__,
1259 Elm_Gen_Item *it = data;
1260 Evas_Event_Multi_Up *ev = event_info;
1262 if (it->wd->multi_device != ev->device) return;
1263 it->wd->multi_device = 0;
1264 it->wd->multi_down = EINA_FALSE;
1265 if (it->wd->mouse_down) return;
1266 _multi_touch_gesture_eval(data);
1270 _multi_move(void *data,
1271 Evas *evas __UNUSED__,
1272 Evas_Object *obj __UNUSED__,
1275 Elm_Gen_Item *it = data;
1276 Evas_Event_Multi_Move *ev = event_info;
1278 if (it->wd->multi_device != ev->device) return;
1279 it->wd->cur_mx = ev->cur.canvas.x;
1280 it->wd->cur_my = ev->cur.canvas.y;
1284 _mouse_down(void *data,
1285 Evas *evas __UNUSED__,
1289 Elm_Gen_Item *it = data;
1290 Evas_Event_Mouse_Down *ev = event_info;
1293 if (ev->button != 1) return;
1294 if (ev->event_flags & EVAS_EVENT_FLAG_ON_HOLD)
1296 it->wd->on_hold = EINA_TRUE;
1299 it->down = EINA_TRUE;
1300 it->dragging = EINA_FALSE;
1301 evas_object_geometry_get(obj, &x, &y, NULL, NULL);
1302 it->dx = ev->canvas.x - x;
1303 it->dy = ev->canvas.y - y;
1304 it->wd->mouse_down = EINA_TRUE;
1305 if (!it->wd->multitouched)
1307 it->wd->prev_x = ev->canvas.x;
1308 it->wd->prev_y = ev->canvas.y;
1309 it->wd->multi_timeout = EINA_FALSE;
1310 if (it->wd->multi_timer) ecore_timer_del(it->wd->multi_timer);
1311 it->wd->multi_timer = ecore_timer_add(1, _multi_cancel, it->wd);
1313 it->wd->longpressed = EINA_FALSE;
1314 if (ev->event_flags & EVAS_EVENT_FLAG_ON_HOLD) it->wd->on_hold = EINA_TRUE;
1315 else it->wd->on_hold = EINA_FALSE;
1316 if (it->wd->on_hold) return;
1317 it->wd->wasselected = it->selected;
1318 _item_highlight(it);
1319 if (ev->flags & EVAS_BUTTON_DOUBLE_CLICK)
1320 if ((!elm_widget_item_disabled_get(it)) &&
1321 (it->select_mode != ELM_OBJECT_SELECT_MODE_DISPLAY_ONLY))
1323 evas_object_smart_callback_call(WIDGET(it), SIG_CLICKED_DOUBLE, it);
1324 evas_object_smart_callback_call(WIDGET(it), SIG_ACTIVATED, it);
1326 if (it->item->swipe_timer) ecore_timer_del(it->item->swipe_timer);
1327 it->item->swipe_timer = ecore_timer_add(0.4, _swipe_cancel, it);
1328 if (it->long_timer) ecore_timer_del(it->long_timer);
1330 it->long_timer = ecore_timer_add(it->wd->longpress_timeout, _long_press,
1333 it->long_timer = NULL;
1334 it->wd->swipe = EINA_FALSE;
1335 it->wd->movements = 0;
1339 _mouse_up(void *data,
1340 Evas *evas __UNUSED__,
1341 Evas_Object *obj __UNUSED__,
1344 Elm_Gen_Item *it = data;
1345 Evas_Event_Mouse_Up *ev = event_info;
1346 Eina_Bool dragged = EINA_FALSE;
1348 if (ev->button != 1) return;
1349 it->down = EINA_FALSE;
1350 it->wd->mouse_down = EINA_FALSE;
1351 if (it->wd->multitouched)
1353 if ((!it->wd->multi) && (!it->selected) && (it->highlighted)) _item_unhighlight(it);
1354 if (it->wd->multi_down) return;
1355 _multi_touch_gesture_eval(data);
1358 if (ev->event_flags & EVAS_EVENT_FLAG_ON_HOLD) it->wd->on_hold = EINA_TRUE;
1359 else it->wd->on_hold = EINA_FALSE;
1362 ecore_timer_del(it->long_timer);
1363 it->long_timer = NULL;
1367 it->dragging = EINA_FALSE;
1368 evas_object_smart_callback_call(WIDGET(it), SIG_DRAG_STOP, it);
1371 if (it->item->swipe_timer)
1373 ecore_timer_del(it->item->swipe_timer);
1374 it->item->swipe_timer = NULL;
1376 if (it->wd->multi_timer)
1378 ecore_timer_del(it->wd->multi_timer);
1379 it->wd->multi_timer = NULL;
1380 it->wd->multi_timeout = EINA_FALSE;
1382 if (it->wd->on_hold)
1384 if (it->wd->swipe) _swipe(data);
1385 it->wd->longpressed = EINA_FALSE;
1386 it->wd->on_hold = EINA_FALSE;
1389 if ((it->wd->reorder_mode) && (it->wd->reorder_it))
1391 Evas_Coord it_scrl_y = ev->canvas.y - it->wd->reorder_it->dy;
1393 if (it->wd->reorder_rel && (it->wd->reorder_it->parent == it->wd->reorder_rel->parent))
1395 if (it_scrl_y <= it->wd->reorder_rel->item->scrl_y)
1396 _item_move_before(it->wd->reorder_it, it->wd->reorder_rel);
1398 _item_move_after(it->wd->reorder_it, it->wd->reorder_rel);
1399 evas_object_smart_callback_call(WIDGET(it), SIG_MOVED, it);
1403 if (it->wd->calc_job) ecore_job_del(it->wd->calc_job);
1404 it->wd->calc_job = ecore_job_add(_calc_job, it->wd);
1406 edje_object_signal_emit(VIEW(it), "elm,state,reorder,disabled", "elm");
1407 it->wd->reorder_it = it->wd->reorder_rel = NULL;
1408 elm_smart_scroller_hold_set(it->wd->scr, EINA_FALSE);
1409 elm_smart_scroller_bounce_allow_set(it->wd->scr, it->wd->h_bounce, it->wd->v_bounce);
1411 if (it->wd->longpressed)
1413 it->wd->longpressed = EINA_FALSE;
1414 if ((!it->wd->wasselected) && (!it->flipped))
1416 _item_unhighlight(it);
1419 it->wd->wasselected = EINA_FALSE;
1424 if (it->want_unrealize)
1426 _elm_genlist_item_unrealize(it, EINA_FALSE);
1427 if (it->item->block->want_unrealize)
1428 _item_block_unrealize(it->item->block);
1431 if (elm_widget_item_disabled_get(it) || (dragged) ||
1432 (it->select_mode == ELM_OBJECT_SELECT_MODE_DISPLAY_ONLY))
1434 if (ev->event_flags & EVAS_EVENT_FLAG_ON_HOLD) return;
1439 _item_highlight(it);
1444 _item_unhighlight(it);
1452 Widget_Data *wd = it->wd;
1455 while (wd->selected)
1457 _item_unhighlight(wd->selected->data);
1458 _item_unselect(wd->selected->data);
1464 const Eina_List *l, *l_next;
1467 EINA_LIST_FOREACH_SAFE(it->wd->selected, l, l_next, it2)
1470 _item_unhighlight(it2);
1471 _item_unselect(it2);
1473 //_item_highlight(it);
1476 _item_highlight(it);
1482 _item_mouse_callbacks_add(Elm_Gen_Item *it, Evas_Object *view)
1484 evas_object_event_callback_add(view, EVAS_CALLBACK_MOUSE_DOWN,
1486 evas_object_event_callback_add(view, EVAS_CALLBACK_MOUSE_UP,
1488 evas_object_event_callback_add(view, EVAS_CALLBACK_MOUSE_MOVE,
1490 evas_object_event_callback_add(view, EVAS_CALLBACK_MULTI_DOWN,
1492 evas_object_event_callback_add(view, EVAS_CALLBACK_MULTI_UP,
1494 evas_object_event_callback_add(view, EVAS_CALLBACK_MULTI_MOVE,
1499 _item_mouse_callbacks_del(Elm_Gen_Item *it, Evas_Object *view)
1501 evas_object_event_callback_del_full(view, EVAS_CALLBACK_MOUSE_DOWN,
1503 evas_object_event_callback_del_full(view, EVAS_CALLBACK_MOUSE_UP,
1505 evas_object_event_callback_del_full(view, EVAS_CALLBACK_MOUSE_MOVE,
1507 evas_object_event_callback_del_full(view, EVAS_CALLBACK_MULTI_DOWN,
1509 evas_object_event_callback_del_full(view, EVAS_CALLBACK_MULTI_UP,
1511 evas_object_event_callback_del_full(view, EVAS_CALLBACK_MULTI_MOVE,
1516 _signal_expand_toggle(void *data,
1517 Evas_Object *obj __UNUSED__,
1518 const char *emission __UNUSED__,
1519 const char *source __UNUSED__)
1521 Elm_Gen_Item *it = data;
1523 if (it->item->expanded)
1524 evas_object_smart_callback_call(WIDGET(it), SIG_CONTRACT_REQUEST, it);
1526 evas_object_smart_callback_call(WIDGET(it), SIG_EXPAND_REQUEST, it);
1530 _signal_expand(void *data,
1531 Evas_Object *obj __UNUSED__,
1532 const char *emission __UNUSED__,
1533 const char *source __UNUSED__)
1535 Elm_Gen_Item *it = data;
1537 if (!it->item->expanded)
1538 evas_object_smart_callback_call(WIDGET(it), SIG_EXPAND_REQUEST, it);
1542 _signal_contract(void *data,
1543 Evas_Object *obj __UNUSED__,
1544 const char *emission __UNUSED__,
1545 const char *source __UNUSED__)
1547 Elm_Gen_Item *it = data;
1549 if (it->item->expanded)
1550 evas_object_smart_callback_call(WIDGET(it), SIG_CONTRACT_REQUEST, it);
1554 _scr_hold_timer_cb(void *data)
1556 if (!data) return ECORE_CALLBACK_CANCEL;
1557 Widget_Data *wd = data;
1558 elm_smart_scroller_hold_set(wd->scr, EINA_FALSE);
1559 wd->scr_hold_timer = NULL;
1560 return ECORE_CALLBACK_CANCEL;
1564 _decorate_item_finished_signal_cb(void *data,
1566 const char *emission __UNUSED__,
1567 const char *source __UNUSED__)
1571 Elm_Gen_Item *it = data;
1572 if ((it->generation < it->wd->generation) || (!it->realized) || (!it->item->deco_it_view)) return;
1574 Evas *te = evas_object_evas_get(obj);
1576 evas_event_freeze(te);
1577 it->item->nocache_once = EINA_FALSE;
1578 _decorate_item_unrealize(it);
1579 if (it->item->group_item)
1580 evas_object_raise(it->item->VIEW(group_item));
1581 snprintf(buf, sizeof(buf), "elm,state,%s,passive,finished", it->wd->decorate_it_type);
1582 edje_object_signal_callback_del_full(obj, buf, "elm", _decorate_item_finished_signal_cb, it);
1583 evas_event_thaw(te);
1584 evas_event_thaw_eval(te);
1588 _item_cache_clean(Widget_Data *wd)
1590 evas_event_freeze(evas_object_evas_get(wd->obj));
1591 while ((wd->item_cache) && (wd->item_cache_count > wd->item_cache_max))
1595 itc = EINA_INLIST_CONTAINER_GET(wd->item_cache->last, Item_Cache);
1596 wd->item_cache = eina_inlist_remove(wd->item_cache,
1597 wd->item_cache->last);
1598 wd->item_cache_count--;
1599 if (itc->spacer) evas_object_del(itc->spacer);
1600 if (itc->base_view) evas_object_del(itc->base_view);
1601 eina_stringshare_del(itc->item_style);
1604 evas_event_thaw(evas_object_evas_get(wd->obj));
1605 evas_event_thaw_eval(evas_object_evas_get(wd->obj));
1609 _item_cache_zero(Widget_Data *wd)
1611 int pmax = wd->item_cache_max;
1612 wd->item_cache_max = 0;
1613 _item_cache_clean(wd);
1614 wd->item_cache_max = pmax;
1618 _item_cache_add(Elm_Gen_Item *it)
1622 evas_event_freeze(evas_object_evas_get(it->wd->obj));
1623 if (it->wd->item_cache_max <= 0)
1625 evas_object_del(VIEW(it));
1629 evas_object_del(it->spacer);
1632 evas_event_thaw(evas_object_evas_get(it->wd->obj));
1633 evas_event_thaw_eval(evas_object_evas_get(it->wd->obj));
1637 it->wd->item_cache_count++;
1638 itc = calloc(1, sizeof(Item_Cache));
1641 evas_event_thaw(evas_object_evas_get(it->wd->obj));
1642 evas_event_thaw_eval(evas_object_evas_get(it->wd->obj));
1645 it->wd->item_cache = eina_inlist_prepend(it->wd->item_cache,
1646 EINA_INLIST_GET(itc));
1647 itc->spacer = it->spacer;
1649 itc->base_view = VIEW(it);
1651 edje_object_signal_emit(itc->base_view, "elm,state,unselected", "elm");
1652 evas_object_hide(itc->base_view);
1653 evas_object_move(itc->base_view, -9999, -9999);
1654 itc->item_style = eina_stringshare_add(it->itc->item_style);
1655 if (it->item->type & ELM_GENLIST_ITEM_TREE) itc->tree = 1;
1656 itc->selected = it->selected;
1657 itc->disabled = elm_widget_item_disabled_get(it);
1658 itc->expanded = it->item->expanded;
1661 ecore_timer_del(it->long_timer);
1662 it->long_timer = NULL;
1664 if (it->item->swipe_timer)
1666 ecore_timer_del(it->item->swipe_timer);
1667 it->item->swipe_timer = NULL;
1669 // FIXME: other callbacks?
1670 edje_object_signal_callback_del_full(itc->base_view,
1671 "elm,action,expand,toggle",
1672 "elm", _signal_expand_toggle, it);
1673 edje_object_signal_callback_del_full(itc->base_view, "elm,action,expand",
1675 _signal_expand, it);
1676 edje_object_signal_callback_del_full(itc->base_view, "elm,action,contract",
1677 "elm", _signal_contract, it);
1678 _item_mouse_callbacks_del(it, itc->base_view);
1679 _item_cache_clean(it->wd);
1680 evas_event_thaw(evas_object_evas_get(it->wd->obj));
1681 evas_event_thaw_eval(evas_object_evas_get(it->wd->obj));
1685 _item_cache_find(Elm_Gen_Item *it)
1690 if (it->item->type & ELM_GENLIST_ITEM_TREE) tree = 1;
1691 EINA_INLIST_FOREACH(it->wd->item_cache, itc)
1693 if ((itc->selected) || (itc->disabled) || (itc->expanded))
1695 if ((itc->tree == tree) &&
1696 (((!it->itc->item_style) && (!itc->item_style)) ||
1697 (it->itc->item_style && itc->item_style &&
1698 (!strcmp(it->itc->item_style, itc->item_style)))))
1700 it->wd->item_cache = eina_inlist_remove(it->wd->item_cache,
1701 EINA_INLIST_GET(itc));
1702 it->wd->item_cache_count--;
1710 _elm_genlist_item_index_update(Elm_Gen_Item *it)
1712 if (it->position_update || it->item->block->position_update)
1714 evas_object_smart_callback_call(WIDGET(it), SIG_INDEX_UPDATE, it);
1715 it->position_update = EINA_FALSE;
1720 _elm_genlist_item_odd_even_update(Elm_Gen_Item *it)
1722 if (!it->item->nostacking)
1724 if ((it->item->order_num_in & 0x1) ^ it->item->stacking_even)
1726 if (it->deco_all_obj) evas_object_lower(it->deco_all_obj);
1727 else evas_object_lower(VIEW(it));
1731 if (it->deco_all_obj) evas_object_raise(it->deco_all_obj);
1732 else evas_object_raise(VIEW(it));
1736 if (it->item->order_num_in & 0x1)
1738 edje_object_signal_emit(VIEW(it), "elm,state,odd", "elm");
1739 if (it->deco_all_obj) edje_object_signal_emit(it->deco_all_obj, "elm,state,odd", "elm");
1743 edje_object_signal_emit(VIEW(it), "elm,state,even", "elm");
1744 if (it->deco_all_obj) edje_object_signal_emit(it->deco_all_obj, "elm,state,even", "elm");
1749 _elm_genlist_item_state_update(Elm_Gen_Item *it, Item_Cache *itc)
1753 if (it->selected != itc->selected)
1757 edje_object_signal_emit(VIEW(it),
1758 "elm,state,selected", "elm");
1760 if (it->deco_all_obj)
1761 edje_object_signal_emit(it->deco_all_obj,
1762 "elm,state,selected", "elm");
1765 if (elm_widget_item_disabled_get(it) != itc->disabled)
1767 if (elm_widget_item_disabled_get(it))
1768 edje_object_signal_emit(VIEW(it),
1769 "elm,state,disabled", "elm");
1770 if (it->deco_all_obj)
1771 edje_object_signal_emit(it->deco_all_obj,
1772 "elm,state,disabled", "elm");
1774 if (it->item->expanded != itc->expanded)
1776 if (it->item->expanded)
1777 edje_object_signal_emit(VIEW(it),
1778 "elm,state,expanded", "elm");
1779 if (it->deco_all_obj)
1780 edje_object_signal_emit(it->deco_all_obj,
1781 "elm,state,expanded", "elm");
1788 edje_object_signal_emit(VIEW(it),
1789 "elm,state,selected", "elm");
1790 if (it->deco_all_obj)
1791 edje_object_signal_emit(it->deco_all_obj,
1792 "elm,state,selected", "elm");
1795 if (elm_widget_item_disabled_get(it))
1797 edje_object_signal_emit(VIEW(it),
1798 "elm,state,disabled", "elm");
1799 if (it->deco_all_obj)
1800 edje_object_signal_emit(it->deco_all_obj,
1801 "elm,state,disabled", "elm");
1803 if (it->item->expanded)
1805 edje_object_signal_emit(VIEW(it),
1806 "elm,state,expanded", "elm");
1807 if (it->deco_all_obj)
1808 edje_object_signal_emit(it->deco_all_obj,
1809 "elm,state,expanded", "elm");
1815 _item_cache_free(Item_Cache *itc)
1817 if (itc->spacer) evas_object_del(itc->spacer);
1818 if (itc->base_view) evas_object_del(itc->base_view);
1819 eina_stringshare_del(itc->item_style);
1824 _item_text_realize(Elm_Gen_Item *it,
1825 Evas_Object *target,
1829 if (it->itc->func.text_get)
1834 *source = elm_widget_stringlist_get(edje_object_data_get(target, "texts"));
1835 EINA_LIST_FOREACH(*source, l, key)
1837 if (parts && fnmatch(parts, key, FNM_PERIOD))
1840 char *s = it->itc->func.text_get
1841 ((void *)it->base.data, WIDGET(it), key);
1845 edje_object_part_text_set(target, key, s);
1850 edje_object_part_text_set(target, key, "");
1857 _item_content_unrealize(Elm_Gen_Item *it,
1858 Evas_Object *target,
1862 Eina_List *res = it->content_objs;
1864 if (it->itc->func.content_get)
1868 Evas_Object *ic = NULL;
1870 EINA_LIST_FOREACH(*source, l, key)
1872 if (parts && fnmatch(parts, key, FNM_PERIOD))
1875 ic = edje_object_part_swallow_get(target, key);
1878 res = eina_list_remove(res, ic);
1879 edje_object_part_unswallow(target, ic);
1880 evas_object_del(ic);
1889 _item_content_realize(Elm_Gen_Item *it,
1890 Evas_Object *target,
1894 Eina_List *res = NULL;
1896 if (it->itc->func.content_get)
1900 Evas_Object *ic = NULL;
1901 Eina_List *cons = NULL;
1903 cons = elm_widget_stringlist_get(edje_object_data_get(target, "contents"));
1905 if (parts && (eina_list_count(*source) != eina_list_count(it->content_objs)))
1906 res = it->content_objs;
1908 EINA_LIST_FOREACH(cons, l, key)
1910 if (parts && fnmatch(parts, key, FNM_PERIOD))
1913 if (it->itc->func.content_get)
1914 ic = it->itc->func.content_get
1915 ((void *)it->base.data, WIDGET(it), key);
1918 res = eina_list_append(res, ic);
1919 edje_object_part_swallow(target, key, ic);
1920 evas_object_show(ic);
1921 elm_widget_sub_object_add(WIDGET(it), ic);
1922 if (elm_widget_item_disabled_get(it))
1923 elm_widget_disabled_set(ic, EINA_TRUE);
1926 *source = eina_list_merge(*source, cons);
1933 _item_state_realize(Elm_Gen_Item *it,
1934 Evas_Object *target,
1938 if (it->itc->func.state_get)
1944 *source = elm_widget_stringlist_get(edje_object_data_get(target, "states"));
1945 EINA_LIST_FOREACH(*source, l, key)
1947 if (parts && fnmatch(parts, key, FNM_PERIOD))
1950 Eina_Bool on = it->itc->func.state_get
1951 ((void *)it->base.data, WIDGET(it), key);
1955 snprintf(buf, sizeof(buf), "elm,state,%s,active", key);
1956 edje_object_signal_emit(target, buf, "elm");
1960 snprintf(buf, sizeof(buf), "elm,state,%s,passive", key);
1961 edje_object_signal_emit(target, buf, "elm");
1968 _item_flips_realize(Elm_Gen_Item *it,
1969 Evas_Object *target,
1972 Eina_List *res = it->content_objs;
1974 if (it->itc->func.content_get)
1978 Evas_Object *ic = NULL;
1979 Eina_List *cons = NULL;
1981 cons = elm_widget_stringlist_get(edje_object_data_get(target, "flips"));
1983 EINA_LIST_FOREACH(cons, l, key)
1985 if (it->itc->func.content_get)
1986 ic = it->itc->func.content_get
1987 ((void *)it->base.data, WIDGET(it), key);
1990 res = eina_list_append(res, ic);
1991 edje_object_part_swallow(target, key, ic);
1992 evas_object_show(ic);
1993 elm_widget_sub_object_add(WIDGET(it), ic);
1994 if (elm_widget_item_disabled_get(it))
1995 elm_widget_disabled_set(ic, EINA_TRUE);
1998 *source = eina_list_merge(*source, cons);
2005 _item_realize(Elm_Gen_Item *it,
2009 const char *treesize;
2012 Item_Cache *itc = NULL;
2014 if (it->generation < it->wd->generation) return;
2015 //evas_event_freeze(evas_object_evas_get(it->wd->obj));
2018 if (it->item->order_num_in != in)
2020 it->item->order_num_in = in;
2021 _elm_genlist_item_odd_even_update(it);
2022 _elm_genlist_item_state_update(it, NULL);
2023 _elm_genlist_item_index_update(it);
2025 //evas_event_thaw(evas_object_evas_get(it->wd->obj));
2026 //evas_event_thaw_eval(evas_object_evas_get(it->wd->obj));
2029 it->item->order_num_in = in;
2031 if (it->item->nocache_once)
2032 it->item->nocache_once = EINA_FALSE;
2033 else if (!it->item->nocache)
2034 itc = _item_cache_find(it);
2035 if (itc && (!it->wd->tree_effect_enabled))
2037 VIEW(it) = itc->base_view;
2038 itc->base_view = NULL;
2039 it->spacer = itc->spacer;
2044 const char *stacking_even;
2045 const char *stacking;
2047 VIEW(it) = edje_object_add(evas_object_evas_get(WIDGET(it)));
2048 edje_object_scale_set(VIEW(it),
2049 elm_widget_scale_get(WIDGET(it)) *
2050 _elm_config->scale);
2051 evas_object_smart_member_add(VIEW(it), it->wd->pan_smart);
2052 elm_widget_sub_object_add(WIDGET(it), VIEW(it));
2054 if (it->item->type & ELM_GENLIST_ITEM_TREE)
2055 snprintf(buf, sizeof(buf), "tree%s/%s", it->wd->mode == ELM_LIST_COMPRESS ? "_compress" : "", it->itc->item_style ?: "default");
2057 snprintf(buf, sizeof(buf), "item%s/%s", it->wd->mode == ELM_LIST_COMPRESS ? "_compress" : "", it->itc->item_style ?: "default");
2059 _elm_theme_object_set(WIDGET(it), VIEW(it), "genlist", buf,
2060 elm_widget_style_get(WIDGET(it)));
2062 stacking_even = edje_object_data_get(VIEW(it), "stacking_even");
2063 if (!stacking_even) stacking_even = "above";
2064 it->item->stacking_even = !!strcmp("above", stacking_even);
2066 stacking = edje_object_data_get(VIEW(it), "stacking");
2067 if (!stacking) stacking = "yes";
2068 it->item->nostacking = !!strcmp("yes", stacking);
2070 edje_object_mirrored_set(VIEW(it),
2071 elm_widget_mirrored_get(WIDGET(it)));
2074 _elm_genlist_item_odd_even_update(it);
2076 treesize = edje_object_data_get(VIEW(it), "treesize");
2077 if (treesize) tsize = atoi(treesize);
2078 if (!it->spacer && treesize)
2081 evas_object_rectangle_add(evas_object_evas_get(WIDGET(it)));
2082 evas_object_color_set(it->spacer, 0, 0, 0, 0);
2083 elm_widget_sub_object_add(WIDGET(it), it->spacer);
2087 evas_object_size_hint_min_set(it->spacer,
2088 (it->item->expanded_depth * tsize) * _elm_config->scale, 1);
2089 edje_object_part_swallow(VIEW(it), "elm.swallow.pad", it->spacer);
2093 edje_object_signal_callback_add(VIEW(it),
2094 "elm,action,expand,toggle",
2095 "elm", _signal_expand_toggle, it);
2096 edje_object_signal_callback_add(VIEW(it), "elm,action,expand",
2097 "elm", _signal_expand, it);
2098 edje_object_signal_callback_add(VIEW(it), "elm,action,contract",
2099 "elm", _signal_contract, it);
2100 _item_mouse_callbacks_add(it, VIEW(it));
2102 if ((it->wd->decorate_all_mode) && (!it->deco_all_obj) &&
2103 (it->item->type != ELM_GENLIST_ITEM_GROUP) && (it->itc->decorate_all_item_style))
2104 _decorate_all_item_realize(it, EINA_FALSE);
2106 _elm_genlist_item_state_update(it, itc);
2107 _elm_genlist_item_index_update(it);
2110 if ((calc) && (it->wd->homogeneous) &&
2111 ((it->wd->item_width) ||
2112 ((it->wd->item_width) && (it->wd->group_item_width))))
2114 /* homogenous genlist shortcut */
2115 if (!it->item->mincalcd)
2119 it->item->w = it->item->minw = it->wd->group_item_width;
2120 it->item->h = it->item->minh = it->wd->group_item_height;
2124 it->item->w = it->item->minw = it->wd->item_width;
2125 it->item->h = it->item->minh = it->wd->item_height;
2127 it->item->mincalcd = EINA_TRUE;
2132 /* FIXME: If you see that assert, please notify us and we
2133 will clean our mess */
2134 assert(eina_list_count(it->content_objs) == 0);
2136 _item_text_realize(it, VIEW(it), &it->texts, NULL);
2137 it->content_objs = _item_content_realize(it, VIEW(it), &it->contents, NULL);
2138 _item_state_realize(it, VIEW(it), &it->states, NULL);
2141 edje_object_signal_emit(VIEW(it), "elm,state,flip,enabled", "elm");
2142 it->item->flip_content_objs =
2143 _item_flips_realize(it, VIEW(it), &it->item->flip_contents);
2146 if (!it->item->mincalcd)
2148 Evas_Coord mw = -1, mh = -1;
2150 if (it->select_mode != ELM_OBJECT_SELECT_MODE_DISPLAY_ONLY)
2151 elm_coords_finger_size_adjust(1, &mw, 1, &mh);
2152 if (it->wd->mode == ELM_LIST_COMPRESS) mw = it->wd->prev_viewport_w;
2153 edje_object_size_min_restricted_calc(VIEW(it), &mw, &mh, mw,
2155 if (it->select_mode != ELM_OBJECT_SELECT_MODE_DISPLAY_ONLY)
2156 elm_coords_finger_size_adjust(1, &mw, 1, &mh);
2157 it->item->w = it->item->minw = mw;
2158 it->item->h = it->item->minh = mh;
2159 it->item->mincalcd = EINA_TRUE;
2161 if ((!it->wd->group_item_width) && (it->group))
2163 it->wd->group_item_width = mw;
2164 it->wd->group_item_height = mh;
2166 else if ((!it->wd->item_width) && (it->item->type == ELM_GENLIST_ITEM_NONE))
2168 it->wd->item_width = mw;
2169 it->wd->item_height = mh;
2172 if (!calc) evas_object_show(VIEW(it));
2175 if (it->tooltip.content_cb)
2177 elm_widget_item_tooltip_content_cb_set(it,
2178 it->tooltip.content_cb,
2179 it->tooltip.data, NULL);
2180 elm_widget_item_tooltip_style_set(it, it->tooltip.style);
2181 elm_widget_item_tooltip_window_mode_set(it, it->tooltip.free_size);
2184 if (it->mouse_cursor)
2185 elm_widget_item_cursor_set(it, it->mouse_cursor);
2187 it->realized = EINA_TRUE;
2188 it->want_unrealize = EINA_FALSE;
2190 if (itc) _item_cache_free(itc);
2191 //evas_event_thaw(evas_object_evas_get(it->wd->obj));
2192 //evas_event_thaw_eval(evas_object_evas_get(it->wd->obj));
2195 if (it->item->tree_effect_hideme)
2197 if (it->wd->move_effect_mode != ELM_GENLIST_TREE_EFFECT_NONE)
2198 edje_object_signal_emit(VIEW(it), "elm,state,hide", "");
2199 it->item->tree_effect_hideme = EINA_FALSE;
2201 evas_object_smart_callback_call(WIDGET(it), SIG_REALIZED, it);
2204 if ((!calc) && (it->wd->decorate_all_mode) && (it->item->type != ELM_GENLIST_ITEM_GROUP))
2206 if (it->itc->decorate_all_item_style)
2208 if (!it->deco_all_obj) _decorate_all_item_realize(it, EINA_FALSE);
2209 edje_object_message_signal_process(it->deco_all_obj);
2212 edje_object_message_signal_process(VIEW(it));
2216 _item_unrealize_cb(Elm_Gen_Item *it)
2218 if (it->item->nocache_once || it->item->nocache)
2220 evas_object_del(VIEW(it));
2224 evas_object_del(it->spacer);
2230 edje_object_mirrored_set(VIEW(it),
2231 elm_widget_mirrored_get(WIDGET(it)));
2232 edje_object_scale_set(VIEW(it),
2233 elm_widget_scale_get(WIDGET(it))
2234 * _elm_config->scale);
2235 _item_cache_add(it);
2238 _decorate_item_unrealize(it);
2240 it->realized = EINA_FALSE;
2241 it->want_unrealize = EINA_FALSE;
2242 if (it->wd->decorate_all_mode) _decorate_all_item_unrealize(it);
2246 _item_block_recalc(Item_Block *itb,
2252 Evas_Coord minw = 0, minh = 0;
2253 Eina_Bool showme = EINA_FALSE, changed = EINA_FALSE;
2256 //evas_event_freeze(evas_object_evas_get(itb->wd->obj));
2258 EINA_LIST_FOREACH(itb->items, l, it)
2260 if (it->generation < it->wd->generation) continue;
2261 showme |= it->item->showme;
2266 if (!it->item->mincalcd) changed = EINA_TRUE;
2269 _item_realize(it, in, EINA_TRUE);
2270 _elm_genlist_item_unrealize(it, EINA_TRUE);
2275 _item_realize(it, in, EINA_TRUE);
2276 _elm_genlist_item_unrealize(it, EINA_TRUE);
2281 if (!it->item->mincalcd) changed = EINA_TRUE;
2282 _item_realize(it, in, EINA_FALSE);
2284 minh += it->item->minh;
2285 if (minw < it->item->minw) minw = it->item->minw;
2291 if (changed) itb->wd->pan_changed = changed;
2294 itb->changed = EINA_FALSE;
2295 itb->position_update = EINA_FALSE;
2296 //evas_event_thaw(evas_object_evas_get(itb->wd->obj));
2297 //evas_event_thaw_eval(evas_object_evas_get(itb->wd->obj));
2302 _item_block_realize(Item_Block *itb)
2304 if (itb->realized) return;
2305 itb->realized = EINA_TRUE;
2306 itb->want_unrealize = EINA_FALSE;
2310 _item_block_unrealize(Item_Block *itb)
2314 Eina_Bool dragging = EINA_FALSE;
2316 if (!itb->realized) return;
2317 evas_event_freeze(evas_object_evas_get(itb->wd->obj));
2318 EINA_LIST_FOREACH(itb->items, l, it)
2320 if (itb->must_recalc || !it->group)
2324 dragging = EINA_TRUE;
2325 it->want_unrealize = EINA_TRUE;
2328 _elm_genlist_item_unrealize(it, EINA_FALSE);
2333 itb->realized = EINA_FALSE;
2334 itb->want_unrealize = EINA_TRUE;
2337 itb->want_unrealize = EINA_FALSE;
2338 evas_event_thaw(evas_object_evas_get(itb->wd->obj));
2339 evas_event_thaw_eval(evas_object_evas_get(itb->wd->obj));
2343 _get_space_for_reorder_item(Elm_Gen_Item *it)
2345 Evas_Coord rox, roy, row, roh, oy, oh;
2346 Eina_Bool top = EINA_FALSE;
2347 Elm_Gen_Item *reorder_it = it->wd->reorder_it;
2348 if (!reorder_it) return 0;
2350 evas_object_geometry_get(it->wd->pan_smart, NULL, &oy, NULL, &oh);
2351 evas_object_geometry_get(it->wd->VIEW(reorder_it), &rox, &roy, &row, &roh);
2353 if ((it->wd->reorder_start_y < it->item->block->y) &&
2354 (roy - oy + (roh / 2) >= it->item->block->y - it->wd->pan_y))
2356 it->item->block->reorder_offset = it->wd->reorder_it->item->h * -1;
2357 if (it->item->block->count == 1)
2358 it->wd->reorder_rel = it;
2360 else if ((it->wd->reorder_start_y >= it->item->block->y) &&
2361 (roy - oy + (roh / 2) <= it->item->block->y - it->wd->pan_y))
2363 it->item->block->reorder_offset = it->wd->reorder_it->item->h;
2366 it->item->block->reorder_offset = 0;
2368 it->item->scrl_y += it->item->block->reorder_offset;
2370 top = (ELM_RECTS_INTERSECT(it->item->scrl_x, it->item->scrl_y, it->item->w, it->item->h,
2371 rox, roy + (roh / 2), row, 1));
2374 it->wd->reorder_rel = it;
2375 it->item->scrl_y += it->wd->reorder_it->item->h;
2376 return it->wd->reorder_it->item->h;
2383 _reorder_move_animator_cb(void *data)
2385 Elm_Gen_Item *it = data;
2386 Eina_Bool down = EINA_FALSE;
2388 int y, dy = it->item->h / 10 * _elm_config->scale, diff;
2390 t = ((0.0 > (t = ecore_loop_time_get()-it->wd->start_time)) ? 0.0 : t);
2392 if (t <= REORDER_EFFECT_TIME) y = (1 * sin((t / REORDER_EFFECT_TIME) * (M_PI / 2)) * dy);
2395 diff = abs(it->item->old_scrl_y - it->item->scrl_y);
2396 if (diff > it->item->h) y = diff / 2;
2398 if (it->item->old_scrl_y < it->item->scrl_y)
2400 it->item->old_scrl_y += y;
2403 else if (it->item->old_scrl_y > it->item->scrl_y)
2405 it->item->old_scrl_y -= y;
2409 if (it->deco_all_obj)
2410 _item_position(it, it->deco_all_obj, it->item->scrl_x, it->item->old_scrl_y);
2412 _item_position(it, VIEW(it), it->item->scrl_x, it->item->old_scrl_y);
2413 _group_items_recalc(it->wd);
2415 if ((it->wd->reorder_pan_move) ||
2416 (down && it->item->old_scrl_y >= it->item->scrl_y) ||
2417 (!down && it->item->old_scrl_y <= it->item->scrl_y))
2419 it->item->old_scrl_y = it->item->scrl_y;
2420 it->item->move_effect_enabled = EINA_FALSE;
2421 it->wd->reorder_move_animator = NULL;
2422 return ECORE_CALLBACK_CANCEL;
2424 return ECORE_CALLBACK_RENEW;
2428 _item_position(Elm_Gen_Item *it,
2436 evas_event_freeze(evas_object_evas_get(it->wd->obj));
2437 evas_object_resize(view, it->item->w, it->item->h);
2438 evas_object_move(view, it_x, it_y);
2439 evas_object_show(view);
2440 evas_event_thaw(evas_object_evas_get(it->wd->obj));
2441 evas_event_thaw_eval(evas_object_evas_get(it->wd->obj));
2445 _item_block_position(Item_Block *itb,
2451 Evas_Coord y = 0, ox, oy, ow, oh, cvx, cvy, cvw, cvh;
2452 Eina_Bool vis = EINA_FALSE;
2454 evas_event_freeze(evas_object_evas_get(itb->wd->obj));
2455 evas_object_geometry_get(itb->wd->pan_smart, &ox, &oy, &ow, &oh);
2456 evas_output_viewport_get(evas_object_evas_get(itb->wd->obj), &cvx, &cvy,
2458 EINA_LIST_FOREACH(itb->items, l, it)
2460 if (it->generation < it->wd->generation) continue;
2461 else if (it->wd->reorder_it == it) continue;
2464 it->item->w = itb->w;
2465 it->item->scrl_x = itb->x + it->x - it->wd->pan_x + ox;
2466 it->item->scrl_y = itb->y + it->y - it->wd->pan_y + oy;
2468 vis = (ELM_RECTS_INTERSECT(it->item->scrl_x, it->item->scrl_y, it->item->w, it->item->h,
2469 cvx, cvy, cvw, cvh));
2472 if ((itb->realized) && (!it->realized))
2474 if (vis) _item_realize(it, in, EINA_FALSE);
2478 if (vis || it->dragging)
2480 if (it->wd->reorder_mode)
2481 y += _get_space_for_reorder_item(it);
2482 git = it->item->group_item;
2485 if (git->item->scrl_y < oy)
2486 git->item->scrl_y = oy;
2487 if ((git->item->scrl_y + git->item->h) > (it->item->scrl_y + it->item->h))
2488 git->item->scrl_y = (it->item->scrl_y + it->item->h) - git->item->h;
2489 git->item->want_realize = EINA_TRUE;
2491 if ((it->wd->reorder_it) && (it->item->old_scrl_y != it->item->scrl_y))
2493 if (!it->item->move_effect_enabled)
2495 it->item->move_effect_enabled = EINA_TRUE;
2496 it->wd->reorder_move_animator =
2498 _reorder_move_animator_cb, it);
2501 if (!it->item->move_effect_enabled)
2503 if ((it->wd->decorate_all_mode) && (it->itc->decorate_all_item_style))
2504 _decorate_all_item_position(it, it->item->scrl_x,
2508 if (!it->wd->tree_effect_enabled ||
2509 (it->wd->move_effect_mode == ELM_GENLIST_TREE_EFFECT_NONE) ||
2510 ((it->wd->move_effect_mode != ELM_GENLIST_TREE_EFFECT_NONE) &&
2511 (it->item->old_scrl_y == it->item->scrl_y)))
2513 if (it->item->deco_it_view)
2514 _item_position(it, it->item->deco_it_view,
2518 _item_position(it, VIEW(it), it->item->scrl_x,
2522 it->item->old_scrl_y = it->item->scrl_y;
2527 if (!it->wd->tree_effect_animator)
2528 _elm_genlist_item_unrealize(it, EINA_FALSE);
2535 if (vis) it->item->want_realize = EINA_TRUE;
2539 evas_event_thaw(evas_object_evas_get(itb->wd->obj));
2540 evas_event_thaw_eval(evas_object_evas_get(itb->wd->obj));
2544 _group_items_recalc(void *data)
2546 Widget_Data *wd = data;
2550 evas_event_freeze(evas_object_evas_get(wd->obj));
2551 EINA_LIST_FOREACH(wd->group_items, l, git)
2553 if (git->item->want_realize)
2556 _item_realize(git, 0, EINA_FALSE);
2557 evas_object_resize(VIEW(git), wd->minw, git->item->h);
2558 evas_object_move(VIEW(git), git->item->scrl_x, git->item->scrl_y);
2559 evas_object_show(VIEW(git));
2560 evas_object_raise(VIEW(git));
2562 else if (!git->item->want_realize && git->realized)
2565 _elm_genlist_item_unrealize(git, EINA_FALSE);
2568 evas_event_thaw(evas_object_evas_get(wd->obj));
2569 evas_event_thaw_eval(evas_object_evas_get(wd->obj));
2573 _must_recalc_idler(void *data)
2575 Widget_Data *wd = data;
2576 if (wd->calc_job) ecore_job_del(wd->calc_job);
2577 wd->calc_job = ecore_job_add(_calc_job, wd);
2578 wd->must_recalc_idler = NULL;
2579 return ECORE_CALLBACK_CANCEL;
2583 _scroll_item(Widget_Data *wd)
2585 Elm_Gen_Item *it = NULL;
2586 Evas_Coord gith = 0;
2587 Evas_Coord ow, oh, dx = 0, dy = 0, dw = 0, dh = 0;
2588 if (!wd->show_item) return;
2590 evas_object_geometry_get(wd->pan_smart, NULL, NULL, &ow, &oh);
2592 dx = it->x + it->item->block->x;
2593 dy = it->y + it->item->block->y;
2594 dw = it->item->block->w;
2596 switch (wd->scrollto_type)
2598 case ELM_GENLIST_ITEM_SCROLLTO_TOP:
2599 if (it->item->group_item) gith = it->item->group_item->item->h;
2602 case ELM_GENLIST_ITEM_SCROLLTO_MIDDLE:
2603 dy += ((it->item->h / 2) - (oh / 2));
2605 case ELM_GENLIST_ITEM_SCROLLTO_IN:
2607 if ((wd->expanded_item) &&
2608 ((wd->show_item->y + wd->show_item->item->block->y + wd->show_item->item->h)
2609 - (wd->expanded_item->y + wd->expanded_item->item->block->y) > oh))
2611 it = wd->expanded_item;
2612 if (it->item->group_item) gith = it->item->group_item->item->h;
2613 dx = it->x + it->item->block->x;
2614 dy = it->y + it->item->block->y - gith;
2615 dw = it->item->block->w;
2619 if ((it->item->group_item) && (wd->pan_y > (it->y + it->item->block->y)))
2620 gith = it->item->group_item->item->h;
2627 elm_smart_scroller_region_bring_in(wd->scr, dx, dy, dw, dh);
2629 elm_smart_scroller_child_region_show(wd->scr, dx, dy, dw, dh);
2631 it->item->showme = EINA_FALSE;
2632 wd->show_item = NULL;
2633 wd->auto_scroll_enabled = EINA_FALSE;
2634 wd->check_scroll = EINA_FALSE;
2638 _calc_job(void *data)
2640 Widget_Data *wd = data;
2641 Item_Block *itb, *chb = NULL;
2642 Evas_Coord minw = -1, minh = 0, y = 0, ow, dy = 0, vw;
2643 Evas_Coord pan_w = 0, pan_h = 0;
2645 Eina_Bool minw_change = EINA_FALSE;
2646 Eina_Bool did_must_recalc = EINA_FALSE;
2649 evas_object_geometry_get(wd->pan_smart, NULL, NULL, &ow, &wd->h);
2650 elm_smart_scroller_child_viewport_size_get(wd->scr, &vw, NULL);
2655 evas_event_freeze(evas_object_evas_get(wd->obj));
2656 EINA_INLIST_FOREACH(wd->blocks, itb)
2658 Eina_Bool showme = EINA_FALSE;
2661 showme = itb->showme;
2662 itb->showme = EINA_FALSE;
2665 if (itb->realized) _item_block_unrealize(itb);
2667 if ((itb->changed) || ((itb->must_recalc) && (!did_must_recalc)))
2669 if (itb->must_recalc)
2673 EINA_LIST_FOREACH(itb->items, l, it)
2674 if (it->item->mincalcd) it->item->mincalcd = EINA_FALSE;
2675 itb->changed = EINA_TRUE;
2676 if (itb->must_recalc) did_must_recalc = EINA_TRUE;
2677 if (itb->realized) _item_block_unrealize(itb);
2678 itb->must_recalc = EINA_FALSE;
2680 showme = _item_block_recalc(itb, in, EINA_FALSE);
2686 if (minw == -1) minw = itb->minw;
2687 else if ((!itb->must_recalc) && (minw < itb->minw))
2690 minw_change = EINA_TRUE;
2695 minw_change = EINA_TRUE;
2701 if ((showme) && (wd->show_item) && (!wd->show_item->item->queued))
2702 wd->check_scroll = EINA_TRUE;
2706 EINA_INLIST_FOREACH(wd->blocks, itb)
2712 if ((chb) && (EINA_INLIST_GET(chb)->next))
2714 EINA_INLIST_FOREACH(EINA_INLIST_GET(chb)->next, itb)
2716 if (itb->realized) _item_block_unrealize(itb);
2719 wd->realminw = minw;
2720 if (minw < wd->w) minw = wd->w;
2721 if ((minw != wd->minw) || (minh != wd->minh))
2725 evas_object_smart_callback_call(wd->pan_smart, "changed", NULL);
2726 _sizing_eval(wd->obj);
2727 if ((wd->anchor_item) && (wd->anchor_item->item->block) && (!wd->auto_scroll_enabled))
2732 it = wd->anchor_item;
2733 it_y = wd->anchor_y;
2734 elm_smart_scroller_child_pos_set(wd->scr, wd->pan_x,
2735 it->item->block->y + it->y + it_y);
2736 wd->anchor_item = it;
2737 wd->anchor_y = it_y;
2740 if (did_must_recalc)
2742 if (!wd->must_recalc_idler)
2743 wd->must_recalc_idler = ecore_idler_add(_must_recalc_idler, wd);
2745 if (wd->check_scroll)
2747 _pan_child_size_get(wd->pan_smart, &pan_w, &pan_h);
2748 if (EINA_INLIST_GET(wd->show_item) == wd->items->last)
2749 wd->scrollto_type = ELM_GENLIST_ITEM_SCROLLTO_IN;
2750 switch (wd->scrollto_type)
2752 case ELM_GENLIST_ITEM_SCROLLTO_TOP:
2755 case ELM_GENLIST_ITEM_SCROLLTO_MIDDLE:
2758 case ELM_GENLIST_ITEM_SCROLLTO_IN:
2765 if ((pan_w > (wd->show_item->x + wd->show_item->item->block->x)) &&
2766 (pan_h > (wd->show_item->y + wd->show_item->item->block->y + dy)))
2772 wd->calc_job = NULL;
2773 evas_object_smart_changed(wd->pan_smart);
2774 evas_event_thaw(evas_object_evas_get(wd->obj));
2775 evas_event_thaw_eval(evas_object_evas_get(wd->obj));
2779 _update_job(void *data)
2781 Widget_Data *wd = data;
2785 Eina_Bool position = EINA_FALSE, recalc = EINA_FALSE;
2787 wd->update_job = NULL;
2790 evas_event_freeze(evas_object_evas_get(wd->obj));
2791 EINA_INLIST_FOREACH(wd->blocks, itb)
2793 Evas_Coord itminw, itminh;
2800 _item_block_position(itb, num);
2804 recalc = EINA_FALSE;
2805 EINA_LIST_FOREACH(itb->items, l2, it)
2807 if (it->item->updateme)
2809 itminw = it->item->minw;
2810 itminh = it->item->minh;
2812 it->item->updateme = EINA_FALSE;
2815 _elm_genlist_item_unrealize(it, EINA_FALSE);
2816 _item_realize(it, num, EINA_FALSE);
2817 position = EINA_TRUE;
2821 _item_realize(it, num, EINA_TRUE);
2822 _elm_genlist_item_unrealize(it, EINA_TRUE);
2824 if ((it->item->minw != itminw) || (it->item->minh != itminh))
2829 itb->updateme = EINA_FALSE;
2832 position = EINA_TRUE;
2833 itb->changed = EINA_TRUE;
2834 _item_block_recalc(itb, num0, EINA_FALSE);
2835 _item_block_position(itb, num0);
2840 if (wd->calc_job) ecore_job_del(wd->calc_job);
2841 wd->calc_job = ecore_job_add(_calc_job, wd);
2843 evas_event_thaw(evas_object_evas_get(wd->obj));
2844 evas_event_thaw_eval(evas_object_evas_get(wd->obj));
2848 _pan_set(Evas_Object *obj,
2852 Pan *sd = evas_object_smart_data_get(obj);
2856 if ((x == sd->wd->pan_x) && (y == sd->wd->pan_y)) return;
2860 EINA_INLIST_FOREACH(sd->wd->blocks, itb)
2862 if ((itb->y + itb->h) > y)
2867 EINA_LIST_FOREACH(itb->items, l2, it)
2869 if ((itb->y + it->y) >= y)
2871 sd->wd->anchor_item = it;
2872 sd->wd->anchor_y = -(itb->y + it->y - y);
2879 if (!sd->wd->reorder_move_animator) evas_object_smart_changed(obj);
2883 _pan_get(Evas_Object *obj,
2887 Pan *sd = evas_object_smart_data_get(obj);
2890 if (x) *x = sd->wd->pan_x;
2891 if (y) *y = sd->wd->pan_y;
2895 _pan_max_get(Evas_Object *obj,
2899 Pan *sd = evas_object_smart_data_get(obj);
2903 evas_object_geometry_get(obj, NULL, NULL, &ow, &oh);
2904 ow = sd->wd->minw - ow;
2906 oh = sd->wd->minh - oh;
2913 _pan_min_get(Evas_Object *obj __UNUSED__,
2922 _pan_child_size_get(Evas_Object *obj,
2926 Pan *sd = evas_object_smart_data_get(obj);
2929 if (w) *w = sd->wd->minw;
2930 if (h) *h = sd->wd->minh;
2934 _pan_add(Evas_Object *obj)
2937 Evas_Object_Smart_Clipped_Data *cd;
2940 cd = evas_object_smart_data_get(obj);
2943 sd->__clipped_data = *cd;
2945 evas_object_smart_data_set(obj, sd);
2949 _pan_del(Evas_Object *obj)
2951 Pan *sd = evas_object_smart_data_get(obj);
2956 ecore_job_del(sd->resize_job);
2957 sd->resize_job = NULL;
2963 _pan_resize_job(void *data)
2967 _sizing_eval(sd->wd->obj);
2968 sd->resize_job = NULL;
2972 _pan_resize(Evas_Object *obj,
2976 Pan *sd = evas_object_smart_data_get(obj);
2980 evas_object_geometry_get(obj, NULL, NULL, &ow, &oh);
2981 if ((ow == w) && (oh == h)) return;
2982 if ((sd->wd->mode == ELM_LIST_COMPRESS) && (ow != w))
2985 if (sd->resize_job) ecore_job_del(sd->resize_job);
2986 sd->resize_job = ecore_job_add(_pan_resize_job, sd);
2988 sd->wd->pan_changed = EINA_TRUE;
2989 evas_object_smart_changed(obj);
2990 if (sd->wd->calc_job) ecore_job_del(sd->wd->calc_job);
2991 sd->wd->calc_job = NULL;
2993 if (sd->wd->calc_job) ecore_job_del(sd->wd->calc_job);
2994 sd->wd->calc_job = ecore_job_add(_calc_job, sd->wd);
2999 _pan_calculate(Evas_Object *obj)
3001 Pan *sd = evas_object_smart_data_get(obj);
3003 Evas_Coord ox, oy, ow, oh, cvx, cvy, cvw, cvh;
3009 evas_event_freeze(evas_object_evas_get(obj));
3011 if (sd->wd->pan_changed)
3014 sd->wd->pan_changed = EINA_FALSE;
3017 evas_object_geometry_get(obj, &ox, &oy, &ow, &oh);
3018 evas_output_viewport_get(evas_object_evas_get(obj), &cvx, &cvy, &cvw, &cvh);
3019 EINA_LIST_FOREACH(sd->wd->group_items, l, git)
3021 git->item->want_realize = EINA_FALSE;
3024 if (sd->wd->tree_effect_enabled && (sd->wd->move_effect_mode != ELM_GENLIST_TREE_EFFECT_NONE))
3026 if (!sd->wd->tree_effect_animator)
3028 _item_tree_effect_before(sd->wd->expanded_item);
3029 evas_object_raise(sd->wd->alpha_bg);
3030 evas_object_show(sd->wd->alpha_bg);
3031 sd->wd->start_time = ecore_time_get();
3032 sd->wd->tree_effect_animator = ecore_animator_add(_tree_effect_animator_cb, sd->wd);
3036 EINA_INLIST_FOREACH(sd->wd->blocks, itb)
3038 itb->w = sd->wd->minw;
3039 if (ELM_RECTS_INTERSECT(itb->x - sd->wd->pan_x + ox,
3040 itb->y - sd->wd->pan_y + oy,
3042 cvx, cvy, cvw, cvh))
3044 if ((!itb->realized) || (itb->changed))
3045 _item_block_realize(itb);
3046 _item_block_position(itb, in);
3050 if (itb->realized) _item_block_unrealize(itb);
3054 if ((!sd->wd->reorder_it) || (sd->wd->reorder_pan_move))
3055 _group_items_recalc(sd->wd);
3056 if ((sd->wd->reorder_mode) && (sd->wd->reorder_it))
3058 if (sd->wd->pan_y != sd->wd->reorder_old_pan_y)
3059 sd->wd->reorder_pan_move = EINA_TRUE;
3060 else sd->wd->reorder_pan_move = EINA_FALSE;
3061 evas_object_raise(sd->wd->VIEW(reorder_it));
3062 sd->wd->reorder_old_pan_y = sd->wd->pan_y;
3063 sd->wd->start_time = ecore_loop_time_get();
3066 if (!sd->wd->tree_effect_enabled || (sd->wd->move_effect_mode == ELM_GENLIST_TREE_EFFECT_NONE))
3067 _item_auto_scroll(sd->wd);
3069 evas_event_thaw(evas_object_evas_get(obj));
3070 evas_event_thaw_eval(evas_object_evas_get(obj));
3074 _pan_move(Evas_Object *obj,
3075 Evas_Coord x __UNUSED__,
3076 Evas_Coord y __UNUSED__)
3078 Pan *sd = evas_object_smart_data_get(obj);
3082 sd->wd->pan_changed = EINA_TRUE;
3083 evas_object_smart_changed(obj);
3084 if (sd->wd->calc_job) ecore_job_del(sd->wd->calc_job);
3085 sd->wd->calc_job = NULL;
3089 _hold_on(void *data __UNUSED__,
3091 void *event_info __UNUSED__)
3093 Widget_Data *wd = elm_widget_data_get(obj);
3095 elm_smart_scroller_hold_set(wd->scr, 1);
3099 _hold_off(void *data __UNUSED__,
3101 void *event_info __UNUSED__)
3103 Widget_Data *wd = elm_widget_data_get(obj);
3105 elm_smart_scroller_hold_set(wd->scr, 0);
3109 _freeze_on(void *data __UNUSED__,
3111 void *event_info __UNUSED__)
3113 Widget_Data *wd = elm_widget_data_get(obj);
3115 elm_smart_scroller_freeze_set(wd->scr, 1);
3119 _freeze_off(void *data __UNUSED__,
3121 void *event_info __UNUSED__)
3123 Widget_Data *wd = elm_widget_data_get(obj);
3125 elm_smart_scroller_freeze_set(wd->scr, 0);
3129 _scr_anim_start(void *data,
3130 Evas_Object *obj __UNUSED__,
3131 void *event_info __UNUSED__)
3133 evas_object_smart_callback_call(data, SIG_SCROLL_ANIM_START, NULL);
3137 _scr_anim_stop(void *data,
3138 Evas_Object *obj __UNUSED__,
3139 void *event_info __UNUSED__)
3141 evas_object_smart_callback_call(data, SIG_SCROLL_ANIM_STOP, NULL);
3145 _scr_drag_start(void *data,
3146 Evas_Object *obj __UNUSED__,
3147 void *event_info __UNUSED__)
3149 evas_object_smart_callback_call(data, SIG_SCROLL_DRAG_START, NULL);
3153 _scr_drag_stop(void *data,
3154 Evas_Object *obj __UNUSED__,
3155 void *event_info __UNUSED__)
3157 evas_object_smart_callback_call(data, SIG_SCROLL_DRAG_STOP, NULL);
3161 _edge_left(void *data,
3162 Evas_Object *scr __UNUSED__,
3163 void *event_info __UNUSED__)
3165 Evas_Object *obj = data;
3166 evas_object_smart_callback_call(obj, SIG_EDGE_LEFT, NULL);
3170 _edge_right(void *data,
3171 Evas_Object *scr __UNUSED__,
3172 void *event_info __UNUSED__)
3174 Evas_Object *obj = data;
3175 evas_object_smart_callback_call(obj, SIG_EDGE_RIGHT, NULL);
3179 _edge_top(void *data,
3180 Evas_Object *scr __UNUSED__,
3181 void *event_info __UNUSED__)
3183 Evas_Object *obj = data;
3184 evas_object_smart_callback_call(obj, SIG_EDGE_TOP, NULL);
3188 _edge_bottom(void *data,
3189 Evas_Object *scr __UNUSED__,
3190 void *event_info __UNUSED__)
3192 Evas_Object *obj = data;
3193 evas_object_smart_callback_call(obj, SIG_EDGE_BOTTOM, NULL);
3197 _decorate_item_realize(Elm_Gen_Item *it)
3201 if ((it->item->deco_it_view) || (it->generation < it->wd->generation)) return;
3203 evas_event_freeze(evas_object_evas_get(it->wd->obj));
3204 it->item->deco_it_view = edje_object_add(evas_object_evas_get(WIDGET(it)));
3205 edje_object_scale_set(it->item->deco_it_view,
3206 elm_widget_scale_get(WIDGET(it)) *
3207 _elm_config->scale);
3208 evas_object_smart_member_add(it->item->deco_it_view, it->wd->pan_smart);
3209 elm_widget_sub_object_add(WIDGET(it), it->item->deco_it_view);
3211 strncpy(buf, "item", sizeof(buf));
3212 if (it->wd->mode == ELM_LIST_COMPRESS)
3213 strncat(buf, "_compress", sizeof(buf) - strlen(buf));
3215 if (it->item->order_num_in & 0x1) strncat(buf, "_odd", sizeof(buf) - strlen(buf));
3216 strncat(buf, "/", sizeof(buf) - strlen(buf));
3217 strncat(buf, it->itc->decorate_item_style, sizeof(buf) - strlen(buf));
3219 _elm_theme_object_set(WIDGET(it), it->item->deco_it_view, "genlist", buf,
3220 elm_widget_style_get(WIDGET(it)));
3221 edje_object_mirrored_set(it->item->deco_it_view,
3222 elm_widget_mirrored_get(WIDGET(it)));
3224 /* signal callback add */
3225 evas_object_event_callback_add(it->item->deco_it_view, EVAS_CALLBACK_MOUSE_DOWN,
3227 evas_object_event_callback_add(it->item->deco_it_view, EVAS_CALLBACK_MOUSE_UP,
3229 evas_object_event_callback_add(it->item->deco_it_view, EVAS_CALLBACK_MOUSE_MOVE,
3232 /* text_get, content_get, state_get */
3233 /* FIXME: If you see that assert, please notify us and we
3234 will clean our mess */
3235 assert(eina_list_count(it->item->deco_it_content_objs) == 0);
3237 _item_text_realize(it, it->item->deco_it_view, &it->item->deco_it_texts, NULL);
3238 it->item->deco_it_content_objs =
3239 _item_content_realize(it, it->item->deco_it_view,
3240 &it->item->deco_it_contents, NULL);
3241 _item_state_realize(it, it->item->deco_it_view, &it->item->deco_it_states, NULL);
3243 edje_object_part_swallow(it->item->deco_it_view,
3244 edje_object_data_get(it->item->deco_it_view, "mode_part"),
3247 it->want_unrealize = EINA_FALSE;
3248 evas_event_thaw(evas_object_evas_get(it->wd->obj));
3249 evas_event_thaw_eval(evas_object_evas_get(it->wd->obj));
3253 _decorate_item_unrealize(Elm_Gen_Item *it)
3255 Widget_Data *wd = it->wd;
3256 Evas_Object *content;
3257 if (!it->item->deco_it_view) return;
3259 evas_event_freeze(evas_object_evas_get(it->wd->obj));
3260 elm_widget_stringlist_free(it->item->deco_it_texts);
3261 it->item->deco_it_texts = NULL;
3262 elm_widget_stringlist_free(it->item->deco_it_contents);
3263 it->item->deco_it_contents = NULL;
3264 elm_widget_stringlist_free(it->item->deco_it_states);
3266 EINA_LIST_FREE(it->item->deco_it_content_objs, content)
3267 evas_object_del(content);
3269 edje_object_part_unswallow(it->item->deco_it_view, VIEW(it));
3270 evas_object_smart_member_add(VIEW(it), wd->pan_smart);
3271 evas_object_del(it->item->deco_it_view);
3272 it->item->deco_it_view = NULL;
3274 if (wd->mode_item == it)
3275 wd->mode_item = NULL;
3276 evas_event_thaw(evas_object_evas_get(it->wd->obj));
3277 evas_event_thaw_eval(evas_object_evas_get(it->wd->obj));
3281 _decorate_item_set(Elm_Gen_Item *it)
3284 Widget_Data *wd = it->wd;
3289 it->item->nocache_once = EINA_TRUE;
3291 if (wd->scr_hold_timer)
3293 ecore_timer_del(wd->scr_hold_timer);
3294 wd->scr_hold_timer = NULL;
3296 elm_smart_scroller_hold_set(wd->scr, EINA_TRUE);
3297 wd->scr_hold_timer = ecore_timer_add(0.1, _scr_hold_timer_cb, wd);
3299 evas_event_freeze(evas_object_evas_get(it->wd->obj));
3300 _decorate_item_realize(it);
3301 if (it->item->group_item)
3302 evas_object_raise(it->item->VIEW(group_item));
3303 _item_position(it, it->item->deco_it_view, it->item->scrl_x, it->item->scrl_y);
3304 evas_event_thaw(evas_object_evas_get(it->wd->obj));
3305 evas_event_thaw_eval(evas_object_evas_get(it->wd->obj));
3307 snprintf(buf, sizeof(buf), "elm,state,%s,active", wd->decorate_it_type);
3308 edje_object_signal_emit(it->item->deco_it_view, buf, "elm");
3312 _decorate_item_unset(Widget_Data *wd)
3315 if (!wd->mode_item) return;
3316 char buf[1024], buf2[1024];
3320 it->item->nocache_once = EINA_TRUE;
3322 snprintf(buf, sizeof(buf), "elm,state,%s,passive", wd->decorate_it_type);
3323 snprintf(buf2, sizeof(buf2), "elm,state,%s,passive,finished", wd->decorate_it_type);
3325 edje_object_signal_emit(it->item->deco_it_view, buf, "elm");
3326 edje_object_signal_callback_add(it->item->deco_it_view, buf2, "elm", _decorate_item_finished_signal_cb, it);
3328 wd->mode_item = NULL;
3332 _decorate_all_item_position(Elm_Gen_Item *it, int itx, int ity)
3334 if ((!it) || (!it->wd->decorate_all_mode)) return;
3335 evas_object_resize(it->deco_all_obj, it->item->w, it->item->h);
3336 evas_object_move(it->deco_all_obj, itx, ity);
3340 _decorate_all_item_realize(Elm_Gen_Item *it, Eina_Bool effect_on)
3343 const char *stacking_even;
3344 const char *stacking;
3346 if ((!it) || (it->item->decorate_all_item_realized) ||
3347 (it->generation < it->wd->generation))
3350 it->deco_all_obj = edje_object_add(evas_object_evas_get(WIDGET(it)));
3351 edje_object_scale_set(it->deco_all_obj, elm_widget_scale_get(WIDGET(it)) *
3352 _elm_config->scale);
3353 evas_object_smart_member_add(it->deco_all_obj, it->wd->pan_smart);
3354 elm_widget_sub_object_add(WIDGET(it), it->deco_all_obj);
3356 if (it->item->type & ELM_GENLIST_ITEM_TREE)
3357 strncpy(buf, "tree", sizeof(buf));
3358 else strncpy(buf, "item", sizeof(buf));
3359 if (it->wd->mode == ELM_LIST_COMPRESS)
3360 strncat(buf, "_compress", sizeof(buf) - strlen(buf));
3362 strncat(buf, "/", sizeof(buf) - strlen(buf));
3363 strncat(buf, it->itc->decorate_all_item_style, sizeof(buf) - strlen(buf));
3365 _elm_theme_object_set(WIDGET(it), it->deco_all_obj, "genlist", buf,
3366 elm_widget_style_get(WIDGET(it)));
3368 stacking_even = edje_object_data_get(VIEW(it), "stacking_even");
3369 if (!stacking_even) stacking_even = "above";
3370 it->item->stacking_even = !!strcmp("above", stacking_even);
3372 stacking = edje_object_data_get(VIEW(it), "stacking");
3373 if (!stacking) stacking = "yes";
3374 it->item->nostacking = !!strcmp("yes", stacking);
3376 edje_object_mirrored_set(it->deco_all_obj,
3377 elm_widget_mirrored_get(WIDGET(it)));
3379 _elm_genlist_item_odd_even_update(it);
3380 _elm_genlist_item_state_update(it, NULL);
3382 if (effect_on) edje_object_signal_emit(it->deco_all_obj, "elm,state,decorate,enabled,effect", "elm");
3383 else edje_object_signal_emit(it->deco_all_obj, "elm,state,decorate,enabled", "elm");
3385 _item_mouse_callbacks_del(it, VIEW(it));
3386 _item_mouse_callbacks_add(it, it->deco_all_obj);
3388 _item_text_realize(it, it->deco_all_obj, &it->item->deco_all_textss, NULL);
3389 if (it->flipped) edje_object_signal_emit(it->deco_all_obj, "elm,state,flip,enabled", "elm");
3390 it->item->deco_all_content_objs =
3391 _item_content_realize(it, it->deco_all_obj, &it->item->deco_all_contents, NULL);
3392 _item_state_realize(it, it->deco_all_obj, &it->item->deco_all_states, NULL);
3393 edje_object_part_swallow(it->deco_all_obj, "elm.swallow.decorate.content", VIEW(it));
3395 _decorate_all_item_position(it, it->item->scrl_x, it->item->scrl_y);
3396 evas_object_show(it->deco_all_obj);
3398 it->item->decorate_all_item_realized = EINA_TRUE;
3399 it->want_unrealize = EINA_FALSE;
3403 _decorate_all_item_unrealize(Elm_Gen_Item *it)
3406 if ((!it) || (!it->item->decorate_all_item_realized)) return;
3408 edje_object_part_unswallow(it->deco_all_obj, VIEW(it));
3409 evas_object_smart_member_add(VIEW(it), it->wd->pan_smart);
3410 elm_widget_sub_object_add(WIDGET(it), VIEW(it));
3411 _elm_genlist_item_odd_even_update(it);
3412 _elm_genlist_item_state_update(it, NULL);
3414 evas_object_del(it->deco_all_obj);
3415 it->deco_all_obj = NULL;
3416 elm_widget_stringlist_free(it->item->deco_all_textss);
3417 it->item->deco_all_textss = NULL;
3418 elm_widget_stringlist_free(it->item->deco_all_contents);
3419 it->item->deco_all_contents = NULL;
3420 elm_widget_stringlist_free(it->item->deco_all_states);
3421 it->item->deco_all_states = NULL;
3422 EINA_LIST_FREE(it->item->deco_all_content_objs, icon)
3423 evas_object_del(icon);
3424 edje_object_message_signal_process(it->deco_all_obj);
3425 _item_mouse_callbacks_del(it, it->deco_all_obj);
3426 _item_mouse_callbacks_add(it, VIEW(it));
3428 it->item->decorate_all_item_realized = EINA_FALSE;
3432 _item_auto_scroll(Widget_Data *wd)
3435 Elm_Gen_Item *tmp_item = NULL;
3437 if ((wd->expanded_item) && (wd->auto_scroll_enabled))
3439 tmp_item = eina_list_data_get(eina_list_last(wd->expanded_item->item->items));
3440 if (!tmp_item) return;
3441 wd->show_item = tmp_item;
3442 wd->bring_in = EINA_TRUE;
3443 wd->scrollto_type = ELM_GENLIST_ITEM_SCROLLTO_IN;
3444 if ((wd->show_item->item->queued) || (!wd->show_item->item->mincalcd))
3446 wd->show_item->item->showme = EINA_TRUE;
3447 wd->auto_scroll_enabled = EINA_FALSE;
3455 elm_genlist_add(Evas_Object *parent)
3460 Evas_Coord minw, minh;
3461 static Evas_Smart *smart = NULL;
3465 static Evas_Smart_Class sc;
3467 evas_object_smart_clipped_smart_set(&_pan_sc);
3469 sc.name = "elm_genlist_pan";
3470 sc.version = EVAS_SMART_CLASS_VERSION;
3473 sc.resize = _pan_resize;
3474 sc.move = _pan_move;
3475 sc.calculate = _pan_calculate;
3476 if (!(smart = evas_smart_class_new(&sc))) return NULL;
3479 ELM_WIDGET_STANDARD_SETUP(wd, Widget_Data, parent, e, obj, NULL);
3481 ELM_SET_WIDTYPE(widtype, "genlist");
3483 elm_widget_type_set(obj, "genlist");
3484 elm_widget_sub_object_add(parent, obj);
3485 elm_widget_on_focus_hook_set(obj, _on_focus_hook, NULL);
3486 elm_widget_signal_emit_hook_set(obj, _signal_emit_hook);
3487 elm_widget_data_set(obj, wd);
3488 elm_widget_del_hook_set(obj, _del_hook);
3489 elm_widget_del_pre_hook_set(obj, _del_pre_hook);
3490 elm_widget_theme_hook_set(obj, _theme_hook);
3491 elm_widget_can_focus_set(obj, EINA_TRUE);
3492 elm_widget_event_hook_set(obj, _event_hook);
3493 elm_widget_on_show_region_hook_set(obj, _show_region_hook, obj);
3494 elm_widget_translate_hook_set(obj, _translate_hook);
3497 wd->scr = elm_smart_scroller_add(e);
3498 elm_smart_scroller_widget_set(wd->scr, obj);
3499 elm_smart_scroller_object_theme_set(obj, wd->scr, "genlist", "base",
3500 elm_widget_style_get(obj));
3501 elm_smart_scroller_bounce_allow_set(wd->scr, EINA_FALSE,
3502 _elm_config->thumbscroll_bounce_enable);
3503 elm_widget_resize_object_set(obj, wd->scr);
3505 evas_object_smart_callback_add(wd->scr, "animate,start", _scr_anim_start, obj);
3506 evas_object_smart_callback_add(wd->scr, "animate,stop", _scr_anim_stop, obj);
3507 evas_object_smart_callback_add(wd->scr, "drag,start", _scr_drag_start, obj);
3508 evas_object_smart_callback_add(wd->scr, "drag,stop", _scr_drag_stop, obj);
3509 evas_object_smart_callback_add(wd->scr, "edge,left", _edge_left, obj);
3510 evas_object_smart_callback_add(wd->scr, "edge,right", _edge_right, obj);
3511 evas_object_smart_callback_add(wd->scr, "edge,top", _edge_top, obj);
3512 evas_object_smart_callback_add(wd->scr, "edge,bottom", _edge_bottom, obj);
3515 wd->mode = ELM_LIST_SCROLL;
3516 wd->max_items_per_block = MAX_ITEMS_PER_BLOCK;
3517 wd->item_cache_max = wd->max_items_per_block * 2;
3518 wd->longpress_timeout = _elm_config->longpress_timeout;
3519 wd->highlight = EINA_TRUE;
3521 evas_object_smart_callback_add(obj, "scroll-hold-on", _hold_on, obj);
3522 evas_object_smart_callback_add(obj, "scroll-hold-off", _hold_off, obj);
3523 evas_object_smart_callback_add(obj, "scroll-freeze-on", _freeze_on, obj);
3524 evas_object_smart_callback_add(obj, "scroll-freeze-off", _freeze_off, obj);
3526 wd->pan_smart = evas_object_smart_add(e, smart);
3527 wd->pan = evas_object_smart_data_get(wd->pan_smart);
3530 elm_smart_scroller_extern_pan_set(wd->scr, wd->pan_smart,
3531 _pan_set, _pan_get, _pan_max_get,
3532 _pan_min_get, _pan_child_size_get);
3534 edje_object_size_min_calc(elm_smart_scroller_edje_object_get(wd->scr),
3536 evas_object_size_hint_min_set(obj, minw, minh);
3538 evas_object_smart_callbacks_descriptions_set(obj, _signals);
3540 _mirrored_set(obj, elm_widget_mirrored_get(obj));
3546 _item_select(Elm_Gen_Item *it)
3548 Evas_Object *obj = WIDGET(it);
3550 if ((it->generation < it->wd->generation) || (it->decorate_it_set) ||
3551 (it->select_mode == ELM_OBJECT_SELECT_MODE_NONE) ||
3552 (it->wd->select_mode == ELM_OBJECT_SELECT_MODE_NONE))
3556 it->selected = EINA_TRUE;
3557 it->wd->selected = eina_list_append(it->wd->selected, it);
3559 else if (it->wd->select_mode != ELM_OBJECT_SELECT_MODE_ALWAYS) return;
3561 evas_object_ref(obj);
3564 if (it->func.func) it->func.func((void *)it->func.data, WIDGET(it), it);
3565 if (it->generation == it->wd->generation)
3566 evas_object_smart_callback_call(WIDGET(it), SIG_SELECTED, it);
3569 if ((it->wd->clear_me) && (!it->wd->walking))
3570 _elm_genlist_clear(WIDGET(it), EINA_TRUE);
3573 if ((!it->walking) && (it->generation < it->wd->generation))
3578 elm_widget_item_free(it);
3582 it->wd->last_selected_item = (Elm_Object_Item *)it;
3584 evas_object_unref(obj);
3587 static Evas_Object *
3588 _item_content_get_hook(Elm_Gen_Item *it, const char *part)
3590 return edje_object_part_swallow_get(VIEW(it), part);
3594 _item_content_set_hook(Elm_Gen_Item *it, const char *part, Evas_Object *content)
3596 Evas_Object *prev_obj;
3598 if (content && part)
3600 if (eina_list_data_find(it->content_objs, content)) return;
3601 prev_obj = _item_content_unset_hook(it, part);
3602 if (prev_obj) evas_object_del(prev_obj);
3603 it->content_objs = eina_list_append(it->content_objs, content);
3604 edje_object_part_swallow(VIEW(it), part, content);
3608 static Evas_Object *
3609 _item_content_unset_hook(Elm_Gen_Item *it, const char *part)
3612 obj = edje_object_part_swallow_get(VIEW(it), part);
3613 if (!obj) return NULL;
3614 it->content_objs = eina_list_remove(it->content_objs, obj);
3615 edje_object_part_unswallow(VIEW(it), obj);
3620 _item_text_hook(Elm_Gen_Item *it, const char *part)
3622 if (!it->itc->func.text_get) return NULL;
3623 return edje_object_part_text_get(VIEW(it), part);
3627 _item_disable_hook(Elm_Object_Item *it)
3631 Elm_Gen_Item *_it = (Elm_Gen_Item *)it;
3633 if (_it->generation < _it->wd->generation) return;
3636 elm_genlist_item_selected_set(it, EINA_FALSE);
3640 if (elm_widget_item_disabled_get(it))
3642 edje_object_signal_emit(VIEW(_it), "elm,state,disabled", "elm");
3643 if (_it->deco_all_obj)
3644 edje_object_signal_emit(_it->deco_all_obj, "elm,state,disabled", "elm");
3648 edje_object_signal_emit(VIEW(_it), "elm,state,enabled", "elm");
3649 if (_it->deco_all_obj)
3650 edje_object_signal_emit(_it->deco_all_obj, "elm,state,enabled", "elm");
3652 EINA_LIST_FOREACH(_it->content_objs, l, obj)
3653 elm_widget_disabled_set(obj, elm_widget_item_disabled_get(_it));
3658 _item_del_pre_hook(Elm_Object_Item *it)
3660 Elm_Gen_Item *_it = (Elm_Gen_Item *)it;
3662 if ((_it->relcount > 0) || (_it->walking > 0))
3664 elm_genlist_item_subitems_clear(it);
3665 if (_it->wd->show_item == _it) _it->wd->show_item = NULL;
3666 _elm_genlist_item_del_notserious(_it);
3667 if (_it->item->block)
3669 if (_it->realized) _elm_genlist_item_unrealize(_it, EINA_FALSE);
3670 _it->item->block->changed = EINA_TRUE;
3671 if (_it->wd->calc_job) ecore_job_del(_it->wd->calc_job);
3672 _it->wd->calc_job = ecore_job_add(_calc_job, _it->wd);
3676 _it->parent->item->items =
3677 eina_list_remove(_it->parent->item->items, it);
3687 _item_signal_emit_hook(Elm_Object_Item *it,
3688 const char *emission,
3691 edje_object_signal_emit(VIEW(it), emission, source);
3695 _elm_genlist_item_new(Widget_Data *wd,
3696 const Elm_Gen_Item_Class *itc,
3698 Elm_Gen_Item *parent,
3700 const void *func_data)
3704 it = elm_widget_item_new(wd->obj, Elm_Gen_Item);
3705 if (!it) return NULL;
3707 it->generation = wd->generation;
3709 elm_genlist_item_class_ref((Elm_Genlist_Item_Class *)itc);
3710 it->base.data = data;
3711 it->parent = parent;
3712 it->func.func = func;
3713 it->func.data = func_data;
3714 elm_widget_item_content_get_hook_set(it, _item_content_get_hook);
3715 elm_widget_item_content_set_hook_set(it, _item_content_set_hook);
3716 elm_widget_item_content_unset_hook_set(it, _item_content_unset_hook);
3717 elm_widget_item_text_get_hook_set(it, _item_text_hook);
3718 elm_widget_item_disable_hook_set(it, _item_disable_hook);
3719 elm_widget_item_del_pre_hook_set(it, _item_del_pre_hook);
3720 elm_widget_item_signal_emit_hook_set(it, _item_signal_emit_hook);
3723 it->sel_cb = (Ecore_Cb)_item_select;
3728 static Elm_Gen_Item *
3729 _item_new(Widget_Data *wd,
3730 const Elm_Genlist_Item_Class *itc,
3732 Elm_Gen_Item *parent,
3733 Elm_Genlist_Item_Type type,
3735 const void *func_data)
3737 Elm_Gen_Item *it, *it2;
3740 it = _elm_genlist_item_new(wd, itc, data, parent, func, func_data);
3741 if (!it) return NULL;
3742 it->item = ELM_NEW(Elm_Gen_Item_Type);
3743 it->item->type = type;
3744 if (type & ELM_GENLIST_ITEM_GROUP) it->group++;
3745 it->item->expanded_depth = 0;
3746 ELM_GEN_ITEM_SETUP(it);
3749 if (it->parent->group)
3750 it->item->group_item = parent;
3751 else if (it->parent->item->group_item)
3752 it->item->group_item = it->parent->item->group_item;
3754 for (it2 = it, depth = 0; it2->parent; it2 = it2->parent)
3756 if (!it2->parent->group) depth += 1;
3758 it->item->expanded_depth = depth;
3764 _item_block_new(Widget_Data *wd, Eina_Bool prepend)
3768 itb = calloc(1, sizeof(Item_Block));
3769 if (!itb) return NULL;
3773 wd->blocks = eina_inlist_prepend(wd->blocks, EINA_INLIST_GET(itb));
3774 _item_block_position_update(wd->blocks, 0);
3778 wd->blocks = eina_inlist_append(wd->blocks, EINA_INLIST_GET(itb));
3779 itb->position_update = EINA_TRUE;
3780 if (wd->blocks != EINA_INLIST_GET(itb))
3782 itb->position = ((Item_Block *) (EINA_INLIST_GET(itb)->prev))->position + 1;
3793 _item_block_add(Widget_Data *wd,
3796 Item_Block *itb = NULL;
3803 itb = calloc(1, sizeof(Item_Block));
3804 if (!itb) return EINA_FALSE;
3806 if (!it->item->rel->item->block)
3809 eina_inlist_append(wd->blocks, EINA_INLIST_GET(itb));
3810 itb->items = eina_list_append(itb->items, it);
3811 itb->position_update = EINA_TRUE;
3812 it->position = eina_list_count(itb->items);
3813 it->position_update = EINA_TRUE;
3815 if (wd->blocks != EINA_INLIST_GET(itb))
3817 itb->position = ((Item_Block *) (EINA_INLIST_GET(itb)->prev))->position + 1;
3828 tmp = eina_list_data_find_list(itb->items, it->item->rel);
3829 if (it->item->before)
3831 wd->blocks = eina_inlist_prepend_relative
3832 (wd->blocks, EINA_INLIST_GET(itb),
3833 EINA_INLIST_GET(it->item->rel->item->block));
3835 eina_list_prepend_relative_list(itb->items, it, tmp);
3837 /* Update index from where we prepended */
3838 _item_position_update(eina_list_prev(tmp), it->item->rel->position);
3839 _item_block_position_update(EINA_INLIST_GET(itb),
3840 it->item->rel->item->block->position);
3844 wd->blocks = eina_inlist_append_relative
3845 (wd->blocks, EINA_INLIST_GET(itb),
3846 EINA_INLIST_GET(it->item->rel->item->block));
3848 eina_list_append_relative_list(itb->items, it, tmp);
3850 /* Update block index from where we appended */
3851 _item_position_update(eina_list_next(tmp), it->item->rel->position + 1);
3852 _item_block_position_update(EINA_INLIST_GET(itb),
3853 it->item->rel->item->block->position + 1);
3859 if (it->item->before)
3863 itb = (Item_Block *)(wd->blocks);
3864 if (itb->count >= wd->max_items_per_block)
3866 itb = _item_block_new(wd, EINA_TRUE);
3867 if (!itb) return EINA_FALSE;
3872 itb = _item_block_new(wd, EINA_TRUE);
3873 if (!itb) return EINA_FALSE;
3875 itb->items = eina_list_prepend(itb->items, it);
3877 _item_position_update(itb->items, 0);
3883 itb = (Item_Block *)(wd->blocks->last);
3884 if (itb->count >= wd->max_items_per_block)
3886 itb = _item_block_new(wd, EINA_FALSE);
3887 if (!itb) return EINA_FALSE;
3892 itb = _item_block_new(wd, EINA_FALSE);
3893 if (!itb) return EINA_FALSE;
3895 itb->items = eina_list_append(itb->items, it);
3896 it->position = eina_list_count(itb->items);
3904 if (it->item->rel->item->queued)
3906 /* NOTE: for a strange reason eina_list and eina_inlist don't have the same property
3907 on sorted insertion order, so the queue is not always ordered like the item list.
3908 This lead to issue where we depend on an item that is not yet created. As a quick
3909 work around, we reschedule the calc of the item and stop reordering the list to
3910 prevent any nasty issue to show up here.
3912 wd->queue = eina_list_append(wd->queue, it);
3913 wd->requeued = EINA_TRUE;
3914 it->item->queued = EINA_TRUE;
3917 itb = it->item->rel->item->block;
3918 if (!itb) goto newblock;
3919 tmp = eina_list_data_find_list(itb->items, it->item->rel);
3920 if (it->item->before)
3922 itb->items = eina_list_prepend_relative_list(itb->items, it, tmp);
3923 _item_position_update(eina_list_prev(tmp), it->item->rel->position);
3927 itb->items = eina_list_append_relative_list(itb->items, it, tmp);
3928 _item_position_update(eina_list_next(tmp), it->item->rel->position + 1);
3932 itb->changed = EINA_TRUE;
3933 it->item->block = itb;
3934 if (itb->wd->calc_job) ecore_job_del(itb->wd->calc_job);
3935 itb->wd->calc_job = ecore_job_add(_calc_job, itb->wd);
3938 it->item->rel->relcount--;
3939 if ((it->item->rel->generation < it->wd->generation) && (!it->item->rel->relcount))
3941 _item_del(it->item->rel);
3942 elm_widget_item_free(it->item->rel);
3944 it->item->rel = NULL;
3946 if (itb->count > itb->wd->max_items_per_block)
3951 Eina_Bool done = EINA_FALSE;
3953 newc = itb->count / 2;
3955 if (EINA_INLIST_GET(itb)->prev)
3957 Item_Block *itbp = (Item_Block *)(EINA_INLIST_GET(itb)->prev);
3959 if (itbp->count + newc < wd->max_items_per_block / 2)
3961 /* moving items to previous block */
3962 while ((itb->count > newc) && (itb->items))
3964 it2 = eina_list_data_get(itb->items);
3965 itb->items = eina_list_remove_list(itb->items, itb->items);
3968 itbp->items = eina_list_append(itbp->items, it2);
3969 it2->item->block = itbp;
3977 if (!done && EINA_INLIST_GET(itb)->next)
3979 Item_Block *itbn = (Item_Block *)(EINA_INLIST_GET(itb)->next);
3981 if (itbn->count + newc < wd->max_items_per_block / 2)
3983 /* moving items to next block */
3984 while ((itb->count > newc) && (itb->items))
3988 l = eina_list_last(itb->items);
3989 it2 = eina_list_data_get(l);
3990 itb->items = eina_list_remove_list(itb->items, l);
3993 itbn->items = eina_list_prepend(itbn->items, it2);
3994 it2->item->block = itbn;
4004 /* moving items to new block */
4005 itb2 = calloc(1, sizeof(Item_Block));
4006 if (!itb2) return EINA_FALSE;
4009 eina_inlist_append_relative(wd->blocks, EINA_INLIST_GET(itb2),
4010 EINA_INLIST_GET(itb));
4011 itb2->changed = EINA_TRUE;
4012 while ((itb->count > newc) && (itb->items))
4016 l = eina_list_last(itb->items);
4018 itb->items = eina_list_remove_list(itb->items, l);
4021 itb2->items = eina_list_prepend(itb2->items, it2);
4022 it2->item->block = itb2;
4032 _queue_process(Widget_Data *wd)
4035 Eina_Bool showme = EINA_FALSE;
4038 t0 = ecore_loop_time_get();
4039 //evas_event_freeze(evas_object_evas_get(wd->obj));
4040 for (n = 0; (wd->queue) && (n < 128); n++)
4044 it = eina_list_data_get(wd->queue);
4045 wd->queue = eina_list_remove_list(wd->queue, wd->queue);
4046 it->item->queued = EINA_FALSE;
4047 if (!_item_block_add(wd, it)) continue;
4049 _item_block_realize(it->item->block);
4050 t = ecore_time_get();
4051 if (it->item->block->changed)
4053 showme = _item_block_recalc(it->item->block, it->item->block->num, EINA_TRUE);
4054 it->item->block->changed = 0;
4055 if (wd->pan_changed)
4057 if (wd->calc_job) ecore_job_del(wd->calc_job);
4058 wd->calc_job = NULL;
4060 wd->pan_changed = EINA_FALSE;
4063 if (showme) it->item->block->showme = EINA_TRUE;
4064 /* same as eina_inlist_count > 1 */
4065 if (wd->blocks && wd->blocks->next)
4067 if ((t - t0) > (ecore_animator_frametime_get())) break;
4070 //evas_event_thaw(evas_object_evas_get(wd->obj));
4071 //evas_event_thaw_eval(evas_object_evas_get(wd->obj));
4076 _idle_process(void *data, Eina_Bool *wakeup)
4078 Widget_Data *wd = data;
4081 //static double q_start = 0.0;
4082 //if (q_start == 0.0) q_start = ecore_time_get();
4084 if (_queue_process(wd) > 0) *wakeup = EINA_TRUE;
4088 //printf("PROCESS TIME: %3.3f\n", ecore_time_get() - q_start);
4090 return ECORE_CALLBACK_CANCEL;
4092 return ECORE_CALLBACK_RENEW;
4096 _item_idle_enterer(void *data)
4098 Widget_Data *wd = data;
4099 Eina_Bool wakeup = EINA_FALSE;
4100 Eina_Bool ok = _idle_process(data, &wakeup);
4105 if (wd->calc_job) ecore_job_del(wd->calc_job);
4106 wd->calc_job = ecore_job_add(_calc_job, wd);
4108 if (ok == ECORE_CALLBACK_CANCEL) wd->queue_idle_enterer = NULL;
4113 _item_queue(Widget_Data *wd,
4117 if (it->item->queued) return;
4118 it->item->queued = EINA_TRUE;
4119 if (cb && !wd->requeued)
4120 wd->queue = eina_list_sorted_insert(wd->queue, cb, it);
4122 wd->queue = eina_list_append(wd->queue, it);
4123 // FIXME: why does a freeze then thaw here cause some genlist
4124 // elm_genlist_item_append() to be much much slower?
4125 // evas_event_freeze(evas_object_evas_get(wd->obj));
4126 while ((wd->queue) && ((!wd->blocks) || (!wd->blocks->next)))
4128 if (wd->queue_idle_enterer)
4130 ecore_idle_enterer_del(wd->queue_idle_enterer);
4131 wd->queue_idle_enterer = NULL;
4135 // evas_event_thaw(evas_object_evas_get(wd->obj));
4136 // evas_event_thaw_eval(evas_object_evas_get(wd->obj));
4137 if (!wd->queue_idle_enterer)
4138 wd->queue_idle_enterer = ecore_idle_enterer_add(_item_idle_enterer, wd);
4142 _elm_genlist_item_compare(const void *data, const void *data1)
4144 const Elm_Gen_Item *it, *item1;
4145 it = ELM_GEN_ITEM_FROM_INLIST(data);
4146 item1 = ELM_GEN_ITEM_FROM_INLIST(data1);
4147 return it->wd->item_compare_cb(it, item1);
4151 _elm_genlist_item_list_compare(const void *data, const void *data1)
4153 const Elm_Gen_Item *it = data;
4154 const Elm_Gen_Item *item1 = data1;
4155 return it->wd->item_compare_cb(it, item1);
4158 /*If application want to know the relative item, use elm_genlist_item_prev_get(it)*/
4160 _item_move_after(Elm_Gen_Item *it, Elm_Gen_Item *after)
4165 it->wd->items = eina_inlist_remove(it->wd->items, EINA_INLIST_GET(it));
4166 _item_block_del(it);
4168 it->wd->items = eina_inlist_append_relative(it->wd->items, EINA_INLIST_GET(it), EINA_INLIST_GET(after));
4169 it->item->rel = after;
4170 it->item->rel->relcount++;
4171 it->item->before = EINA_FALSE;
4172 if (after->item->group_item) it->item->group_item = after->item->group_item;
4173 _item_queue(it->wd, it, NULL);
4175 evas_object_smart_callback_call(WIDGET(it), SIG_MOVED_AFTER, it);
4178 /*If application want to know the relative item, use elm_genlist_item_next_get(it)*/
4180 _item_move_before(Elm_Gen_Item *it, Elm_Gen_Item *before)
4183 if (!before) return;
4185 it->wd->items = eina_inlist_remove(it->wd->items, EINA_INLIST_GET(it));
4186 _item_block_del(it);
4187 it->wd->items = eina_inlist_prepend_relative(it->wd->items, EINA_INLIST_GET(it), EINA_INLIST_GET(before));
4188 it->item->rel = before;
4189 it->item->rel->relcount++;
4190 it->item->before = EINA_TRUE;
4191 if (before->item->group_item) it->item->group_item = before->item->group_item;
4192 _item_queue(it->wd, it, NULL);
4194 evas_object_smart_callback_call(WIDGET(it), SIG_MOVED_BEFORE, it);
4198 elm_genlist_items_count(const Evas_Object *obj)
4200 ELM_CHECK_WIDTYPE(obj, widtype) 0;
4201 Widget_Data *wd = elm_widget_data_get(obj);
4203 return wd->item_count;
4206 EAPI Elm_Object_Item *
4207 elm_genlist_item_append(Evas_Object *obj,
4208 const Elm_Genlist_Item_Class *itc,
4210 Elm_Object_Item *parent,
4211 Elm_Genlist_Item_Type type,
4213 const void *func_data)
4215 ELM_CHECK_WIDTYPE(obj, widtype) NULL;
4216 Widget_Data *wd = elm_widget_data_get(obj);
4217 if (!wd) return NULL;
4218 Elm_Gen_Item *it = _item_new(wd, itc, data, (Elm_Gen_Item *) parent, type,
4220 if (!it) return NULL;
4224 wd->group_items = eina_list_append(wd->group_items, it);
4225 wd->items = eina_inlist_append(wd->items, EINA_INLIST_GET(it));
4226 it->item->rel = NULL;
4230 Elm_Gen_Item *it2 = NULL;
4231 Eina_List *ll = eina_list_last(it->parent->item->items);
4232 if (ll) it2 = ll->data;
4233 it->parent->item->items = eina_list_append(it->parent->item->items, it);
4234 if (!it2) it2 = it->parent;
4236 eina_inlist_append_relative(wd->items, EINA_INLIST_GET(it),
4237 EINA_INLIST_GET(it2));
4238 it->item->rel = it2;
4239 it->item->rel->relcount++;
4241 it->item->before = EINA_FALSE;
4242 _item_queue(wd, it, NULL);
4243 return (Elm_Object_Item *)it;
4246 EAPI Elm_Object_Item *
4247 elm_genlist_item_prepend(Evas_Object *obj,
4248 const Elm_Genlist_Item_Class *itc,
4250 Elm_Object_Item *parent,
4251 Elm_Genlist_Item_Type type,
4253 const void *func_data)
4255 ELM_CHECK_WIDTYPE(obj, widtype) NULL;
4256 Widget_Data *wd = elm_widget_data_get(obj);
4257 if (!wd) return NULL;
4258 Elm_Gen_Item *it = _item_new(wd, itc, data, (Elm_Gen_Item *) parent, type,
4260 if (!it) return NULL;
4264 wd->group_items = eina_list_prepend(wd->group_items, it);
4265 wd->items = eina_inlist_prepend(wd->items, EINA_INLIST_GET(it));
4266 it->item->rel = NULL;
4270 Elm_Gen_Item *it2 = NULL;
4271 Eina_List *ll = it->parent->item->items;
4272 if (ll) it2 = ll->data;
4273 it->parent->item->items = eina_list_prepend(it->parent->item->items, it);
4274 if (!it2) it2 = it->parent;
4276 eina_inlist_prepend_relative(wd->items, EINA_INLIST_GET(it),
4277 EINA_INLIST_GET(it2));
4278 it->item->rel = it2;
4279 it->item->rel->relcount++;
4281 it->item->before = EINA_TRUE;
4282 _item_queue(wd, it, NULL);
4283 return (Elm_Object_Item *)it;
4286 EAPI Elm_Object_Item *
4287 elm_genlist_item_insert_after(Evas_Object *obj,
4288 const Elm_Genlist_Item_Class *itc,
4290 Elm_Object_Item *parent,
4291 Elm_Object_Item *after,
4292 Elm_Genlist_Item_Type type,
4294 const void *func_data)
4296 ELM_CHECK_WIDTYPE(obj, widtype) NULL;
4297 ELM_OBJ_ITEM_CHECK_OR_RETURN(after, NULL);
4298 Widget_Data *wd = elm_widget_data_get(obj);
4299 Elm_Gen_Item *_after = (Elm_Gen_Item *) after;
4300 if (!wd) return NULL;
4301 /* It makes no sense to insert after in an empty list with after != NULL, something really bad is happening in your app. */
4302 EINA_SAFETY_ON_NULL_RETURN_VAL(wd->items, NULL);
4304 Elm_Gen_Item *it = _item_new(wd, itc, data, (Elm_Gen_Item *) parent, type,
4306 if (!it) return NULL;
4309 if ((it->group) && (_after->group))
4310 wd->group_items = eina_list_append_relative(wd->group_items, it,
4315 it->parent->item->items =
4316 eina_list_append_relative(it->parent->item->items, it, _after);
4318 wd->items = eina_inlist_append_relative(wd->items, EINA_INLIST_GET(it),
4319 EINA_INLIST_GET(_after));
4320 it->item->rel = _after;
4321 it->item->rel->relcount++;
4322 it->item->before = EINA_FALSE;
4323 _item_queue(wd, it, NULL);
4324 return (Elm_Object_Item *)it;
4327 EAPI Elm_Object_Item *
4328 elm_genlist_item_insert_before(Evas_Object *obj,
4329 const Elm_Genlist_Item_Class *itc,
4331 Elm_Object_Item *parent,
4332 Elm_Object_Item *before,
4333 Elm_Genlist_Item_Type type,
4335 const void *func_data)
4337 ELM_CHECK_WIDTYPE(obj, widtype) NULL;
4338 ELM_OBJ_ITEM_CHECK_OR_RETURN(before, NULL);
4339 Widget_Data *wd = elm_widget_data_get(obj);
4340 Elm_Gen_Item *_before = (Elm_Gen_Item *) before;
4341 if (!wd) return NULL;
4342 /* It makes no sense to insert before in an empty list with before != NULL, something really bad is happening in your app. */
4343 EINA_SAFETY_ON_NULL_RETURN_VAL(wd->items, NULL);
4345 Elm_Gen_Item *it = _item_new(wd, itc, data, (Elm_Gen_Item *) parent, type,
4347 if (!it) return NULL;
4350 if (it->group && _before->group)
4351 wd->group_items = eina_list_prepend_relative(wd->group_items, it,
4356 it->parent->item->items =
4357 eina_list_prepend_relative(it->parent->item->items, it, _before);
4359 wd->items = eina_inlist_prepend_relative(wd->items, EINA_INLIST_GET(it),
4360 EINA_INLIST_GET(_before));
4361 it->item->rel = _before;
4362 it->item->rel->relcount++;
4363 it->item->before = EINA_TRUE;
4364 _item_queue(wd, it, NULL);
4365 return (Elm_Object_Item *)it;
4368 EAPI Elm_Object_Item *
4369 elm_genlist_item_sorted_insert(Evas_Object *obj,
4370 const Elm_Genlist_Item_Class *itc,
4372 Elm_Object_Item *parent,
4373 Elm_Genlist_Item_Type type,
4374 Eina_Compare_Cb comp,
4376 const void *func_data)
4378 ELM_CHECK_WIDTYPE(obj, widtype) NULL;
4379 Widget_Data *wd = elm_widget_data_get(obj);
4380 if (!wd) return NULL;
4381 Elm_Gen_Item *rel = NULL;
4382 Elm_Gen_Item *it = _item_new(wd, itc, data, (Elm_Gen_Item *) parent, type,
4384 if (!it) return NULL;
4386 wd->item_compare_cb = comp;
4393 l = eina_list_search_sorted_near_list(it->parent->item->items,
4394 _elm_genlist_item_list_compare,
4398 rel = eina_list_data_get(l);
4402 if (cmp_result >= 0)
4404 it->parent->item->items = eina_list_prepend_relative_list(it->parent->item->items, it, l);
4405 wd->items = eina_inlist_prepend_relative(wd->items, EINA_INLIST_GET(it), EINA_INLIST_GET(rel));
4406 it->item->before = EINA_FALSE;
4408 else if (cmp_result < 0)
4410 it->parent->item->items = eina_list_append_relative_list(it->parent->item->items, it, l);
4411 wd->items = eina_inlist_append_relative(wd->items, EINA_INLIST_GET(it), EINA_INLIST_GET(rel));
4412 it->item->before = EINA_TRUE;
4419 wd->state = eina_inlist_sorted_state_new();
4420 eina_inlist_sorted_state_init(wd->state, wd->items);
4421 wd->requeued = EINA_FALSE;
4425 wd->group_items = eina_list_append(wd->group_items, it);
4427 wd->items = eina_inlist_sorted_state_insert(wd->items, EINA_INLIST_GET(it),
4428 _elm_genlist_item_compare, wd->state);
4430 if (EINA_INLIST_GET(it)->next)
4432 rel = ELM_GEN_ITEM_FROM_INLIST(EINA_INLIST_GET(it)->next);
4433 it->item->before = EINA_TRUE;
4435 else if (EINA_INLIST_GET(it)->prev)
4437 rel = ELM_GEN_ITEM_FROM_INLIST(EINA_INLIST_GET(it)->prev);
4438 it->item->before = EINA_FALSE;
4444 it->item->rel = rel;
4445 it->item->rel->relcount++;
4448 _item_queue(wd, it, _elm_genlist_item_list_compare);
4450 return (Elm_Object_Item *)it;
4454 _elm_genlist_clear(Evas_Object *obj, Eina_Bool standby)
4456 Eina_Inlist *next, *l;
4457 Widget_Data *wd = elm_widget_data_get(obj);
4460 if (!standby) wd->generation++;
4464 eina_inlist_sorted_state_free(wd->state);
4468 if (wd->walking > 0)
4470 wd->clear_me = EINA_TRUE;
4473 evas_event_freeze(evas_object_evas_get(wd->obj));
4474 for (l = wd->items, next = l ? l->next : NULL;
4476 l = next, next = next ? next->next : NULL)
4478 Elm_Gen_Item *it = ELM_GEN_ITEM_FROM_INLIST(l);
4480 if (it->generation < wd->generation)
4482 Elm_Gen_Item *itn = NULL;
4484 if (next) itn = ELM_GEN_ITEM_FROM_INLIST(next);
4485 if (itn) itn->walking++; /* prevent early death of subitem */
4487 elm_widget_item_free(it);
4488 if (itn) itn->walking--;
4491 wd->clear_me = EINA_FALSE;
4492 wd->pan_changed = EINA_TRUE;
4495 ecore_job_del(wd->calc_job);
4496 wd->calc_job = NULL;
4498 if (wd->selected) wd->selected = eina_list_free(wd->selected);
4499 if (wd->clear_cb) wd->clear_cb(wd);
4505 if (wd->alpha_bg) evas_object_del(wd->alpha_bg);
4506 wd->alpha_bg = NULL;
4510 evas_object_size_hint_min_set(wd->pan_smart, wd->minw, wd->minh);
4511 evas_object_smart_callback_call(wd->pan_smart, "changed", NULL);
4513 if (wd->sizing_cb) wd->sizing_cb(wd->obj);
4514 elm_smart_scroller_child_region_show(wd->scr, 0, 0, 0, 0);
4515 evas_event_thaw(evas_object_evas_get(wd->obj));
4516 evas_event_thaw_eval(evas_object_evas_get(wd->obj));
4520 elm_genlist_clear(Evas_Object *obj)
4522 ELM_CHECK_WIDTYPE(obj, widtype);
4523 _elm_genlist_clear(obj, EINA_FALSE);
4527 elm_genlist_multi_select_set(Evas_Object *obj,
4530 ELM_CHECK_WIDTYPE(obj, widtype);
4531 Widget_Data *wd = elm_widget_data_get(obj);
4533 wd->multi = !!multi;
4537 elm_genlist_multi_select_get(const Evas_Object *obj)
4539 ELM_CHECK_WIDTYPE(obj, widtype) EINA_FALSE;
4540 Widget_Data *wd = elm_widget_data_get(obj);
4541 if (!wd) return EINA_FALSE;
4545 EAPI Elm_Object_Item *
4546 elm_genlist_selected_item_get(const Evas_Object *obj)
4548 ELM_CHECK_WIDTYPE(obj, widtype) NULL;
4549 Widget_Data *wd = elm_widget_data_get(obj);
4550 if (!wd) return NULL;
4551 if (wd->selected) return wd->selected->data;
4555 EAPI const Eina_List *
4556 elm_genlist_selected_items_get(const Evas_Object *obj)
4558 ELM_CHECK_WIDTYPE(obj, widtype) NULL;
4559 Widget_Data *wd = elm_widget_data_get(obj);
4560 if (!wd) return NULL;
4561 return wd->selected;
4565 elm_genlist_realized_items_get(const Evas_Object *obj)
4567 ELM_CHECK_WIDTYPE(obj, widtype) NULL;
4568 Widget_Data *wd = elm_widget_data_get(obj);
4569 Eina_List *list = NULL;
4571 Eina_Bool done = EINA_FALSE;
4572 if (!wd) return NULL;
4573 EINA_INLIST_FOREACH(wd->blocks, itb)
4581 EINA_LIST_FOREACH(itb->items, l, it)
4583 if (it->realized) list = eina_list_append(list, it);
4594 EAPI Elm_Object_Item *
4595 elm_genlist_at_xy_item_get(const Evas_Object *obj,
4600 ELM_CHECK_WIDTYPE(obj, widtype) NULL;
4601 Widget_Data *wd = elm_widget_data_get(obj);
4602 Evas_Coord ox, oy, ow, oh;
4605 if (!wd) return NULL;
4606 evas_object_geometry_get(wd->pan_smart, &ox, &oy, &ow, &oh);
4608 EINA_INLIST_FOREACH(wd->blocks, itb)
4613 if (!ELM_RECTS_INTERSECT(ox + itb->x - itb->wd->pan_x,
4614 oy + itb->y - itb->wd->pan_y,
4615 itb->w, itb->h, x, y, 1, 1))
4617 EINA_LIST_FOREACH(itb->items, l, it)
4619 Evas_Coord itx, ity;
4621 itx = ox + itb->x + it->x - itb->wd->pan_x;
4622 ity = oy + itb->y + it->y - itb->wd->pan_y;
4623 if (ELM_RECTS_INTERSECT(itx, ity, it->item->w, it->item->h, x, y, 1, 1))
4627 if (y <= (ity + (it->item->h / 4))) *posret = -1;
4628 else if (y >= (ity + it->item->h - (it->item->h / 4)))
4632 return (Elm_Object_Item *)it;
4634 lasty = ity + it->item->h;
4639 if (y > lasty) *posret = 1;
4645 EAPI Elm_Object_Item *
4646 elm_genlist_first_item_get(const Evas_Object *obj)
4648 ELM_CHECK_WIDTYPE(obj, widtype) NULL;
4649 Widget_Data *wd = elm_widget_data_get(obj);
4650 if (!wd) return NULL;
4651 if (!wd->items) return NULL;
4652 Elm_Gen_Item *it = ELM_GEN_ITEM_FROM_INLIST(wd->items);
4653 while ((it) && (it->generation < wd->generation))
4654 it = ELM_GEN_ITEM_FROM_INLIST(EINA_INLIST_GET(it)->next);
4655 return (Elm_Object_Item *)it;
4658 EAPI Elm_Object_Item *
4659 elm_genlist_last_item_get(const Evas_Object *obj)
4661 ELM_CHECK_WIDTYPE(obj, widtype) NULL;
4662 Widget_Data *wd = elm_widget_data_get(obj);
4663 if (!wd) return NULL;
4664 if (!wd->items) return NULL;
4665 Elm_Gen_Item *it = ELM_GEN_ITEM_FROM_INLIST(wd->items->last);
4666 while ((it) && (it->generation < wd->generation))
4667 it = ELM_GEN_ITEM_FROM_INLIST(EINA_INLIST_GET(it)->prev);
4668 return (Elm_Object_Item *)it;
4671 EAPI Elm_Object_Item *
4672 elm_genlist_item_next_get(const Elm_Object_Item *it)
4674 ELM_OBJ_ITEM_CHECK_OR_RETURN(it, NULL);
4675 Elm_Gen_Item *_it = (Elm_Gen_Item *)it;
4678 _it = ELM_GEN_ITEM_FROM_INLIST(EINA_INLIST_GET(_it)->next);
4679 if ((_it) && (_it->generation == _it->wd->generation)) break;
4681 return (Elm_Object_Item *) _it;
4684 EAPI Elm_Object_Item *
4685 elm_genlist_item_prev_get(const Elm_Object_Item *it)
4687 ELM_OBJ_ITEM_CHECK_OR_RETURN(it, NULL);
4688 Elm_Gen_Item *_it = (Elm_Gen_Item *)it;
4691 _it = ELM_GEN_ITEM_FROM_INLIST(EINA_INLIST_GET(_it)->prev);
4692 if ((_it) && (_it->generation == _it->wd->generation)) break;
4694 return (Elm_Object_Item *) _it;
4697 EAPI Elm_Object_Item *
4698 elm_genlist_item_parent_get(const Elm_Object_Item *it)
4700 ELM_OBJ_ITEM_CHECK_OR_RETURN(it, NULL);
4701 return (Elm_Object_Item *) ((Elm_Gen_Item *)it)->parent;
4705 elm_genlist_item_subitems_clear(Elm_Object_Item *it)
4707 ELM_OBJ_ITEM_CHECK_OR_RETURN(it);
4708 Widget_Data *wd = elm_widget_data_get(WIDGET(it));
4710 Elm_Gen_Item *_it = (Elm_Gen_Item *) it;
4712 if (!wd->tree_effect_enabled || !wd->move_effect_mode)
4713 _item_subitems_clear(_it);
4716 if (!wd->tree_effect_animator)
4718 wd->expanded_item = _it;
4719 _item_tree_effect_before(_it);
4720 evas_object_raise(wd->alpha_bg);
4721 evas_object_show(wd->alpha_bg);
4722 wd->start_time = ecore_time_get();
4723 wd->tree_effect_animator = ecore_animator_add(_tree_effect_animator_cb, wd);
4726 _item_subitems_clear(_it);
4731 elm_genlist_item_selected_set(Elm_Object_Item *it,
4734 ELM_OBJ_ITEM_CHECK_OR_RETURN(it);
4735 Elm_Gen_Item *_it = (Elm_Gen_Item *)it;
4736 Widget_Data *wd = _it->wd;
4738 if ((_it->generation < wd->generation) || elm_widget_item_disabled_get(_it))
4740 selected = !!selected;
4741 if (_it->selected == selected) return;
4747 while (wd->selected)
4749 if (_it->unhighlight_cb) _it->unhighlight_cb(wd->selected->data);
4750 _it->unsel_cb(wd->selected->data);
4753 _it->highlight_cb(_it);
4757 if (_it->unhighlight_cb) _it->unhighlight_cb(_it);
4762 elm_genlist_item_selected_get(const Elm_Object_Item *it)
4764 ELM_OBJ_ITEM_CHECK_OR_RETURN(it, EINA_FALSE);
4765 return ((Elm_Gen_Item *)it)->selected;
4769 _elm_genlist_expanded_next_item_get(Elm_Gen_Item *it)
4772 if (it->item->expanded)
4774 it2 = (Elm_Gen_Item *) elm_genlist_item_next_get((Elm_Object_Item *) it);
4778 it2 = (Elm_Gen_Item *) elm_genlist_item_next_get((Elm_Object_Item *) it);
4781 if (it->item->expanded_depth >= it2->item->expanded_depth) break;
4782 it2 = (Elm_Gen_Item *) elm_genlist_item_next_get((Elm_Object_Item *) it2);
4789 _elm_genlist_move_items_set(Elm_Gen_Item *it)
4792 Elm_Gen_Item *it2 = NULL;
4793 Evas_Coord ox, oy, ow, oh, dh = 0;
4795 it->wd->expanded_next_item = _elm_genlist_expanded_next_item_get(it);
4797 if (it->item->expanded)
4799 it->wd->move_items = elm_genlist_realized_items_get(it->wd->obj);
4800 EINA_LIST_FOREACH(it->wd->move_items, l, it2)
4802 if (it2 == it->wd->expanded_next_item) break;
4803 it->wd->move_items = eina_list_remove(it->wd->move_items, it2);
4808 evas_object_geometry_get(it->wd->pan_smart, &ox, &oy, &ow, &oh);
4809 it2 = it->wd->expanded_next_item;
4810 while (it2 && (dh < oy + oh))
4813 it->wd->move_items = eina_list_append(it->wd->move_items, it2);
4814 it2 = (Elm_Gen_Item *) elm_genlist_item_next_get((Elm_Object_Item *) it2);
4820 elm_genlist_item_expanded_set(Elm_Object_Item *it,
4823 ELM_OBJ_ITEM_CHECK_OR_RETURN(it);
4824 Elm_Gen_Item *_it = (Elm_Gen_Item *)it;
4825 expanded = !!expanded;
4826 if (_it->item->expanded == expanded) return;
4827 _it->item->expanded = expanded;
4828 _it->wd->expanded_item = _it;
4829 _elm_genlist_move_items_set(_it);
4831 if (_it->wd->tree_effect_enabled && !_it->wd->alpha_bg)
4832 _it->wd->alpha_bg = _create_tray_alpha_bg(WIDGET(_it));
4834 if (_it->item->expanded)
4836 _it->wd->move_effect_mode = ELM_GENLIST_TREE_EFFECT_EXPAND;
4838 edje_object_signal_emit(VIEW(_it), "elm,state,expanded", "elm");
4839 evas_object_smart_callback_call(WIDGET(_it), SIG_EXPANDED, _it);
4840 _it->wd->auto_scroll_enabled = EINA_TRUE;
4844 _it->wd->move_effect_mode = ELM_GENLIST_TREE_EFFECT_CONTRACT;
4846 edje_object_signal_emit(VIEW(_it), "elm,state,contracted", "elm");
4847 evas_object_smart_callback_call(WIDGET(_it), SIG_CONTRACTED, _it);
4848 _it->wd->auto_scroll_enabled = EINA_FALSE;
4853 elm_genlist_item_expanded_get(const Elm_Object_Item *it)
4855 ELM_OBJ_ITEM_CHECK_OR_RETURN(it, EINA_FALSE);
4856 return ((Elm_Gen_Item *)it)->item->expanded;
4860 elm_genlist_item_expanded_depth_get(const Elm_Object_Item *it)
4862 ELM_OBJ_ITEM_CHECK_OR_RETURN(it, 0);
4863 return ((Elm_Gen_Item *)it)->item->expanded_depth;
4867 _elm_genlist_item_compute_coordinates(Elm_Object_Item *it,
4868 Elm_Genlist_Item_Scrollto_Type type,
4875 Elm_Gen_Item *_it = (Elm_Gen_Item *)it;
4876 Evas_Coord gith = 0;
4877 if (_it->generation < _it->wd->generation) return EINA_FALSE;
4878 if ((_it->item->queued) || (!_it->item->mincalcd))
4880 _it->wd->show_item = _it;
4881 _it->wd->bring_in = bring_in;
4882 _it->wd->scrollto_type = type;
4883 _it->item->showme = EINA_TRUE;
4886 if (_it->wd->show_item)
4888 _it->wd->show_item->item->showme = EINA_FALSE;
4889 _it->wd->show_item = NULL;
4892 evas_object_geometry_get(_it->wd->pan_smart, NULL, NULL, w, h);
4895 case ELM_GENLIST_ITEM_SCROLLTO_IN:
4896 if ((_it->item->group_item) &&
4897 (_it->wd->pan_y > (_it->y + _it->item->block->y)))
4898 gith = _it->item->group_item->item->h;
4900 *y = _it->y + _it->item->block->y - gith;
4902 case ELM_GENLIST_ITEM_SCROLLTO_TOP:
4903 if (_it->item->group_item) gith = _it->item->group_item->item->h;
4904 *y = _it->y + _it->item->block->y - gith;
4906 case ELM_GENLIST_ITEM_SCROLLTO_MIDDLE:
4907 *y = _it->y + _it->item->block->y - (*h / 2) + (_it->item->h / 2);
4913 *x = _it->x + _it->item->block->x;
4914 *w = _it->item->block->w;
4919 elm_genlist_item_promote(Elm_Object_Item *it)
4921 ELM_OBJ_ITEM_CHECK_OR_RETURN(it);
4922 Elm_Gen_Item *_it = (Elm_Gen_Item *)it;
4923 if (_it->generation < _it->wd->generation) return;
4924 _item_move_before(_it,
4925 (Elm_Gen_Item *) elm_genlist_first_item_get(WIDGET(_it)));
4929 elm_genlist_item_demote(Elm_Object_Item *it)
4931 ELM_OBJ_ITEM_CHECK_OR_RETURN(it);
4932 Elm_Gen_Item *_it = (Elm_Gen_Item *)it;
4933 if (_it->generation < _it->wd->generation) return;
4934 _item_move_after(_it,
4935 (Elm_Gen_Item *) elm_genlist_last_item_get(WIDGET(_it)));
4939 elm_genlist_item_show(Elm_Object_Item *it, Elm_Genlist_Item_Scrollto_Type type)
4941 ELM_OBJ_ITEM_CHECK_OR_RETURN(it);
4942 Evas_Coord x, y, w, h;
4943 Elm_Gen_Item *_it = (Elm_Gen_Item *)it;
4945 if (_elm_genlist_item_compute_coordinates(it, type, EINA_FALSE, &x, &y, &w, &h))
4946 elm_smart_scroller_child_region_show(_it->wd->scr, x, y, w, h);
4950 elm_genlist_item_bring_in(Elm_Object_Item *it, Elm_Genlist_Item_Scrollto_Type type)
4953 ELM_OBJ_ITEM_CHECK_OR_RETURN(it);
4954 Evas_Coord x, y, w, h;
4955 Elm_Gen_Item *_it = (Elm_Gen_Item *)it;
4957 if (_elm_genlist_item_compute_coordinates(it, type, EINA_TRUE, &x, &y, &w, &h))
4958 elm_smart_scroller_region_bring_in(_it->wd->scr, x, y, w, h);
4962 elm_genlist_item_all_contents_unset(Elm_Object_Item *it, Eina_List **l)
4964 ELM_OBJ_ITEM_CHECK_OR_RETURN(it);
4966 Evas_Object *content;
4967 EINA_LIST_FREE(((Elm_Gen_Item *)it)->content_objs, content)
4969 elm_widget_sub_object_del(WIDGET(it), content);
4970 evas_object_smart_member_del(content);
4971 evas_object_hide(content);
4972 if (l) *l = eina_list_append(*l, content);
4977 elm_genlist_item_update(Elm_Object_Item *it)
4979 ELM_OBJ_ITEM_CHECK_OR_RETURN(it);
4980 Elm_Gen_Item *_it = (Elm_Gen_Item *)it;
4982 if (!_it->item->block) return;
4983 if (_it->generation < _it->wd->generation) return;
4984 _it->item->mincalcd = EINA_FALSE;
4985 _it->item->updateme = EINA_TRUE;
4986 _it->item->block->updateme = EINA_TRUE;
4987 if (_it->wd->update_job) ecore_job_del(_it->wd->update_job);
4988 _it->wd->update_job = ecore_job_add(_update_job, _it->wd);
4992 elm_genlist_item_fields_update(Elm_Object_Item *it,
4994 Elm_Genlist_Item_Field_Type itf)
4996 ELM_OBJ_ITEM_CHECK_OR_RETURN(it);
4997 Elm_Gen_Item *_it = (Elm_Gen_Item *)it;
4999 if (!_it->item->block) return;
5000 if (_it->generation < _it->wd->generation) return;
5002 if ((!itf) || (itf & ELM_GENLIST_ITEM_FIELD_TEXT))
5003 _item_text_realize(_it, VIEW(_it), &_it->texts, parts);
5004 if ((!itf) || (itf & ELM_GENLIST_ITEM_FIELD_CONTENT))
5006 _it->content_objs = _item_content_unrealize(_it, VIEW(_it),
5007 &_it->contents, parts);
5008 _it->content_objs = _item_content_realize(_it, VIEW(_it),
5009 &_it->contents, parts);
5011 if ((!itf) || (itf & ELM_GENLIST_ITEM_FIELD_STATE))
5012 _item_state_realize(_it, VIEW(_it), &_it->states, parts);
5016 elm_genlist_item_item_class_update(Elm_Object_Item *it,
5017 const Elm_Genlist_Item_Class *itc)
5019 ELM_OBJ_ITEM_CHECK_OR_RETURN(it);
5020 Elm_Gen_Item *_it = (Elm_Gen_Item *)it;
5022 if (!_it->item->block) return;
5023 EINA_SAFETY_ON_NULL_RETURN(itc);
5024 if (_it->generation < _it->wd->generation) return;
5026 _it->item->nocache_once = EINA_TRUE;
5027 elm_genlist_item_update(it);
5030 EAPI const Elm_Genlist_Item_Class *
5031 elm_genlist_item_item_class_get(const Elm_Object_Item *it)
5033 ELM_OBJ_ITEM_CHECK_OR_RETURN(it, NULL);
5034 Elm_Gen_Item *_it = (Elm_Gen_Item *)it;
5035 if (_it->generation < _it->wd->generation) return NULL;
5039 static Evas_Object *
5040 _elm_genlist_item_label_create(void *data,
5041 Evas_Object *obj __UNUSED__,
5042 Evas_Object *tooltip,
5043 void *it __UNUSED__)
5045 Evas_Object *label = elm_label_add(tooltip);
5048 elm_object_style_set(label, "tooltip");
5049 elm_object_text_set(label, data);
5054 _elm_genlist_item_label_del_cb(void *data,
5055 Evas_Object *obj __UNUSED__,
5056 void *event_info __UNUSED__)
5058 eina_stringshare_del(data);
5062 elm_genlist_item_tooltip_text_set(Elm_Object_Item *it,
5065 ELM_OBJ_ITEM_CHECK_OR_RETURN(it);
5066 text = eina_stringshare_add(text);
5067 elm_genlist_item_tooltip_content_cb_set(it, _elm_genlist_item_label_create,
5069 _elm_genlist_item_label_del_cb);
5073 elm_genlist_item_tooltip_content_cb_set(Elm_Object_Item *it,
5074 Elm_Tooltip_Item_Content_Cb func,
5076 Evas_Smart_Cb del_cb)
5078 ELM_OBJ_ITEM_CHECK_OR_GOTO(it, error);
5079 Elm_Gen_Item *_it = (Elm_Gen_Item *)it;
5081 if ((_it->tooltip.content_cb == func) && (_it->tooltip.data == data))
5084 if (_it->tooltip.del_cb)
5085 _it->tooltip.del_cb((void *) _it->tooltip.data, WIDGET(it), it);
5087 _it->tooltip.content_cb = func;
5088 _it->tooltip.data = data;
5089 _it->tooltip.del_cb = del_cb;
5093 elm_widget_item_tooltip_content_cb_set(_it,
5094 _it->tooltip.content_cb,
5095 _it->tooltip.data, NULL);
5096 elm_widget_item_tooltip_style_set(_it, _it->tooltip.style);
5097 elm_widget_item_tooltip_window_mode_set(_it, _it->tooltip.free_size);
5103 if (del_cb) del_cb((void *)data, NULL, NULL);
5107 elm_genlist_item_tooltip_unset(Elm_Object_Item *it)
5109 ELM_OBJ_ITEM_CHECK_OR_RETURN(it);
5110 Elm_Gen_Item *_it = (Elm_Gen_Item *)it;
5112 if ((VIEW(_it)) && (_it->tooltip.content_cb))
5113 elm_widget_item_tooltip_unset(_it);
5115 if (_it->tooltip.del_cb)
5116 _it->tooltip.del_cb((void *) _it->tooltip.data, WIDGET(_it), _it);
5117 _it->tooltip.del_cb = NULL;
5118 _it->tooltip.content_cb = NULL;
5119 _it->tooltip.data = NULL;
5120 _it->tooltip.free_size = EINA_FALSE;
5121 if (_it->tooltip.style)
5122 elm_genlist_item_tooltip_style_set(it, NULL);
5126 elm_genlist_item_tooltip_style_set(Elm_Object_Item *it,
5129 ELM_OBJ_ITEM_CHECK_OR_RETURN(it);
5130 Elm_Gen_Item *_it = (Elm_Gen_Item *)it;
5132 eina_stringshare_replace(&_it->tooltip.style, style);
5133 if (VIEW(_it)) elm_widget_item_tooltip_style_set(_it, style);
5137 elm_genlist_item_tooltip_style_get(const Elm_Object_Item *it)
5139 return elm_object_item_tooltip_style_get(it);
5143 elm_genlist_item_tooltip_window_mode_set(Elm_Object_Item *it,
5146 ELM_OBJ_ITEM_CHECK_OR_RETURN(it, EINA_FALSE);
5147 Elm_Gen_Item *_it = (Elm_Gen_Item *)it;
5149 _it->tooltip.free_size = disable;
5150 if (VIEW(_it)) return elm_widget_item_tooltip_window_mode_set(_it, disable);
5155 elm_genlist_item_tooltip_window_mode_get(const Elm_Object_Item *it)
5157 return elm_object_tooltip_window_mode_get(VIEW(it));
5161 elm_genlist_item_cursor_set(Elm_Object_Item *it,
5164 ELM_OBJ_ITEM_CHECK_OR_RETURN(it);
5165 Elm_Gen_Item *_it = (Elm_Gen_Item *)it;
5166 eina_stringshare_replace(&_it->mouse_cursor, cursor);
5167 if (VIEW(_it)) elm_widget_item_cursor_set(_it, cursor);
5171 elm_genlist_item_cursor_get(const Elm_Object_Item *it)
5173 return elm_widget_item_cursor_get(it);
5177 elm_genlist_item_cursor_unset(Elm_Object_Item *it)
5179 ELM_OBJ_ITEM_CHECK_OR_RETURN(it);
5180 Elm_Gen_Item *_it = (Elm_Gen_Item *)it;
5182 if (!_it->mouse_cursor) return;
5184 if (VIEW(_it)) elm_widget_item_cursor_unset(_it);
5186 eina_stringshare_del(_it->mouse_cursor);
5187 _it->mouse_cursor = NULL;
5191 elm_genlist_item_cursor_style_set(Elm_Object_Item *it,
5194 elm_widget_item_cursor_style_set(it, style);
5198 elm_genlist_item_cursor_style_get(const Elm_Object_Item *it)
5200 return elm_widget_item_cursor_style_get(it);
5204 elm_genlist_item_cursor_engine_only_set(Elm_Object_Item *it,
5205 Eina_Bool engine_only)
5207 elm_widget_item_cursor_engine_only_set(it, engine_only);
5211 elm_genlist_item_cursor_engine_only_get(const Elm_Object_Item *it)
5213 return elm_widget_item_cursor_engine_only_get(it);
5217 elm_genlist_item_index_get(const Elm_Object_Item *it)
5219 ELM_OBJ_ITEM_CHECK_OR_RETURN(it, -1);
5220 Elm_Gen_Item *_it = (Elm_Gen_Item *)it;
5222 if (_it->item->block)
5223 return _it->position + (_it->item->block->position * _it->wd->max_items_per_block);
5228 elm_genlist_mode_set(Evas_Object *obj,
5231 ELM_CHECK_WIDTYPE(obj, widtype);
5232 Widget_Data *wd = elm_widget_data_get(obj);
5234 if (wd->mode == mode) return;
5236 if (wd->mode == ELM_LIST_COMPRESS)
5237 elm_genlist_homogeneous_set(obj, EINA_FALSE);
5243 elm_genlist_mode_get(const Evas_Object *obj)
5245 ELM_CHECK_WIDTYPE(obj, widtype) ELM_LIST_LAST;
5246 Widget_Data *wd = elm_widget_data_get(obj);
5247 if (!wd) return ELM_LIST_LAST;
5252 elm_genlist_bounce_set(Evas_Object *obj,
5256 ELM_CHECK_WIDTYPE(obj, widtype);
5257 Widget_Data *wd = elm_widget_data_get(obj);
5259 wd->h_bounce = !!h_bounce;
5260 wd->v_bounce = !!v_bounce;
5261 elm_smart_scroller_bounce_allow_set(wd->scr, wd->h_bounce, wd->v_bounce);
5265 elm_genlist_bounce_get(const Evas_Object *obj,
5266 Eina_Bool *h_bounce,
5267 Eina_Bool *v_bounce)
5269 ELM_CHECK_WIDTYPE(obj, widtype);
5270 Widget_Data *wd = elm_widget_data_get(obj);
5272 if (h_bounce) *h_bounce = wd->h_bounce;
5273 if (v_bounce) *v_bounce = wd->v_bounce;
5277 elm_genlist_homogeneous_set(Evas_Object *obj,
5278 Eina_Bool homogeneous)
5280 ELM_CHECK_WIDTYPE(obj, widtype);
5281 Widget_Data *wd = elm_widget_data_get(obj);
5283 wd->homogeneous = !!homogeneous;
5287 elm_genlist_homogeneous_get(const Evas_Object *obj)
5289 ELM_CHECK_WIDTYPE(obj, widtype) EINA_FALSE;
5290 Widget_Data *wd = elm_widget_data_get(obj);
5291 if (!wd) return EINA_FALSE;
5292 return wd->homogeneous;
5296 elm_genlist_block_count_set(Evas_Object *obj,
5299 ELM_CHECK_WIDTYPE(obj, widtype);
5300 Widget_Data *wd = elm_widget_data_get(obj);
5302 wd->max_items_per_block = count;
5303 wd->item_cache_max = wd->max_items_per_block * 2;
5304 _item_cache_clean(wd);
5308 elm_genlist_block_count_get(const Evas_Object *obj)
5310 ELM_CHECK_WIDTYPE(obj, widtype) 0;
5311 Widget_Data *wd = elm_widget_data_get(obj);
5313 return wd->max_items_per_block;
5317 elm_genlist_longpress_timeout_set(Evas_Object *obj,
5320 ELM_CHECK_WIDTYPE(obj, widtype);
5321 Widget_Data *wd = elm_widget_data_get(obj);
5323 wd->longpress_timeout = timeout;
5327 elm_genlist_longpress_timeout_get(const Evas_Object *obj)
5329 ELM_CHECK_WIDTYPE(obj, widtype) 0;
5330 Widget_Data *wd = elm_widget_data_get(obj);
5332 return wd->longpress_timeout;
5336 elm_genlist_scroller_policy_set(Evas_Object *obj,
5337 Elm_Scroller_Policy policy_h,
5338 Elm_Scroller_Policy policy_v)
5340 ELM_CHECK_WIDTYPE(obj, widtype);
5341 Widget_Data *wd = elm_widget_data_get(obj);
5342 if ((!wd) || (!wd->scr)) return;
5343 if ((policy_h >= ELM_SCROLLER_POLICY_LAST) ||
5344 (policy_v >= ELM_SCROLLER_POLICY_LAST))
5346 elm_smart_scroller_policy_set(wd->scr, policy_h, policy_v);
5350 elm_genlist_scroller_policy_get(const Evas_Object *obj,
5351 Elm_Scroller_Policy *policy_h,
5352 Elm_Scroller_Policy *policy_v)
5354 ELM_CHECK_WIDTYPE(obj, widtype);
5355 Widget_Data *wd = elm_widget_data_get(obj);
5356 Elm_Smart_Scroller_Policy s_policy_h, s_policy_v;
5357 if ((!wd) || (!wd->scr)) return;
5358 elm_smart_scroller_policy_get(wd->scr, &s_policy_h, &s_policy_v);
5359 if (policy_h) *policy_h = (Elm_Scroller_Policy)s_policy_h;
5360 if (policy_v) *policy_v = (Elm_Scroller_Policy)s_policy_v;
5364 elm_genlist_realized_items_update(Evas_Object *obj)
5366 ELM_CHECK_WIDTYPE(obj, widtype);
5368 Eina_List *list, *l;
5369 Elm_Object_Item *it;
5371 list = elm_genlist_realized_items_get(obj);
5372 EINA_LIST_FOREACH(list, l, it)
5373 elm_genlist_item_update(it);
5377 elm_genlist_item_decorate_mode_set(Elm_Object_Item *it,
5378 const char *decorate_it_type,
5379 Eina_Bool decorate_it_set)
5381 ELM_OBJ_ITEM_CHECK_OR_RETURN(it);
5382 Elm_Gen_Item *_it = (Elm_Gen_Item *)it;
5384 Widget_Data *wd = _it->wd;
5386 Elm_Object_Item *it2;
5389 if (!decorate_it_type) return;
5390 if ((_it->generation < _it->wd->generation) ||
5391 elm_widget_item_disabled_get(_it)) return;
5392 if (wd->decorate_all_mode) return;
5394 if ((wd->mode_item == _it) &&
5395 (!strcmp(decorate_it_type, wd->decorate_it_type)) &&
5398 if (!_it->itc->decorate_item_style) return;
5399 _it->decorate_it_set = decorate_it_set;
5403 EINA_LIST_FOREACH(wd->selected, l, it2)
5404 if (((Elm_Gen_Item *)it2)->realized)
5405 elm_genlist_item_selected_set(it2, EINA_FALSE);
5409 it2 = elm_genlist_selected_item_get(wd->obj);
5410 if ((it2) && (((Elm_Gen_Item *)it2)->realized))
5411 elm_genlist_item_selected_set(it2, EINA_FALSE);
5414 if (((wd->decorate_it_type) && (strcmp(decorate_it_type, wd->decorate_it_type))) ||
5415 (decorate_it_set) || ((_it == wd->mode_item) && (!decorate_it_set)))
5416 _decorate_item_unset(wd);
5418 eina_stringshare_replace(&wd->decorate_it_type, decorate_it_type);
5419 if (decorate_it_set) _decorate_item_set(_it);
5423 elm_genlist_item_decorate_mode_get(const Elm_Object_Item *it)
5425 ELM_OBJ_ITEM_CHECK_OR_RETURN(it, NULL);
5426 Elm_Gen_Item *_it = (Elm_Gen_Item *)it;
5427 return _it->wd->decorate_it_type;
5430 EAPI const Elm_Object_Item *
5431 elm_genlist_decorated_item_get(const Evas_Object *obj)
5433 ELM_CHECK_WIDTYPE(obj, widtype) NULL;
5434 Widget_Data *wd = elm_widget_data_get(obj);
5435 if (!wd) return NULL;
5436 return (Elm_Object_Item *) wd->mode_item;
5440 elm_genlist_decorate_mode_get(const Evas_Object *obj)
5442 ELM_CHECK_WIDTYPE(obj, widtype) EINA_FALSE;
5443 Widget_Data *wd = elm_widget_data_get(obj);
5444 if (!wd) return EINA_FALSE;
5446 return wd->decorate_all_mode;
5450 elm_genlist_decorate_mode_set(Evas_Object *obj, Eina_Bool decorated)
5452 ELM_CHECK_WIDTYPE(obj, widtype);
5453 Eina_List *list, *l;
5456 Widget_Data *wd = elm_widget_data_get(obj);
5458 decorated = !!decorated;
5459 if (wd->decorate_all_mode == decorated) return;
5460 wd->decorate_all_mode = decorated;
5462 list = elm_genlist_realized_items_get(obj);
5463 if (!wd->decorate_all_mode)
5465 EINA_LIST_FOREACH(list, l, it)
5467 if (it->item->type != ELM_GENLIST_ITEM_GROUP)
5468 _decorate_all_item_unrealize(it);
5470 _item_cache_zero(wd);
5474 EINA_LIST_FOREACH(list, l, it)
5476 if (it->item->type != ELM_GENLIST_ITEM_GROUP)
5478 if (it->selected) _item_unselect(it);
5479 if (it->itc->decorate_all_item_style)
5480 _decorate_all_item_realize(it, EINA_TRUE);
5484 if (wd->calc_job) ecore_job_del(wd->calc_job);
5485 wd->calc_job = ecore_job_add(_calc_job, wd);
5489 elm_genlist_reorder_mode_set(Evas_Object *obj,
5490 Eina_Bool reorder_mode)
5492 ELM_CHECK_WIDTYPE(obj, widtype);
5493 Widget_Data *wd = elm_widget_data_get(obj);
5495 wd->reorder_mode = !!reorder_mode;
5499 elm_genlist_reorder_mode_get(const Evas_Object *obj)
5501 ELM_CHECK_WIDTYPE(obj, widtype) EINA_FALSE;
5502 Widget_Data *wd = elm_widget_data_get(obj);
5503 if (!wd) return EINA_FALSE;
5504 return wd->reorder_mode;
5507 EAPI Elm_Genlist_Item_Type
5508 elm_genlist_item_type_get(const Elm_Object_Item *it)
5510 ELM_OBJ_ITEM_CHECK_OR_RETURN(it, ELM_GENLIST_ITEM_MAX);
5511 Elm_Gen_Item *_it = (Elm_Gen_Item *)it;
5512 return _it->item->type;
5515 EAPI Elm_Genlist_Item_Class *
5516 elm_genlist_item_class_new(void)
5518 Elm_Genlist_Item_Class *itc;
5520 itc = calloc(1, sizeof(Elm_Genlist_Item_Class));
5523 itc->version = CLASS_ALLOCATED;
5525 itc->delete_me = EINA_FALSE;
5531 elm_genlist_item_class_free(Elm_Genlist_Item_Class *itc)
5533 if (itc && (itc->version == CLASS_ALLOCATED))
5535 if (!itc->delete_me) itc->delete_me = EINA_TRUE;
5536 if (itc->refcount > 0) elm_genlist_item_class_unref(itc);
5546 elm_genlist_item_class_ref(Elm_Genlist_Item_Class *itc)
5548 if (itc && (itc->version == CLASS_ALLOCATED))
5551 if (itc->refcount == 0) itc->refcount--;
5556 elm_genlist_item_class_unref(Elm_Genlist_Item_Class *itc)
5558 if (itc && (itc->version == CLASS_ALLOCATED))
5560 if (itc->refcount > 0) itc->refcount--;
5561 if (itc->delete_me && (!itc->refcount))
5562 elm_genlist_item_class_free(itc);
5566 void _flip_job(void *data)
5568 Elm_Gen_Item *it = (Elm_Gen_Item *) data;
5569 _elm_genlist_item_unrealize(it, EINA_FALSE);
5570 if (it->selected) _item_unselect(it);
5571 it->flipped = EINA_TRUE;
5572 it->item->nocache = EINA_TRUE;
5576 elm_genlist_item_flip_set(Elm_Object_Item *it,
5579 ELM_OBJ_ITEM_CHECK_OR_RETURN(it);
5580 Elm_Gen_Item *_it = (Elm_Gen_Item *)it;
5583 if (_it->flipped == flip) return;
5587 ecore_job_add(_flip_job, _it);
5588 if (_it->wd->calc_job) ecore_job_del(_it->wd->calc_job);
5589 _it->wd->calc_job = ecore_job_add(_calc_job, _it->wd);
5593 _it->flipped = flip;
5594 _item_cache_zero(_it->wd);
5595 elm_genlist_item_update(it);
5596 _it->item->nocache = EINA_FALSE;
5601 elm_genlist_item_flip_get(const Elm_Object_Item *it)
5603 ELM_OBJ_ITEM_CHECK_OR_RETURN(it, EINA_FALSE);
5604 Elm_Gen_Item *_it = (Elm_Gen_Item *)it;
5605 return _it->flipped;
5609 elm_genlist_select_mode_set(Evas_Object *obj, Elm_Object_Select_Mode mode)
5611 ELM_CHECK_WIDTYPE(obj, widtype);
5612 Widget_Data *wd = elm_widget_data_get(obj);
5614 if (mode >= ELM_OBJECT_SELECT_MODE_MAX)
5616 if (wd->select_mode != mode)
5617 wd->select_mode = mode;
5620 EAPI Elm_Object_Select_Mode
5621 elm_genlist_select_mode_get(const Evas_Object *obj)
5623 ELM_CHECK_WIDTYPE(obj, widtype) ELM_OBJECT_SELECT_MODE_MAX;
5624 Widget_Data *wd = elm_widget_data_get(obj);
5625 if (!wd) return ELM_OBJECT_SELECT_MODE_MAX;
5626 return wd->select_mode;
5630 elm_genlist_highlight_mode_set(Evas_Object *obj,
5631 Eina_Bool highlight)
5633 ELM_CHECK_WIDTYPE(obj, widtype);
5634 Widget_Data *wd = elm_widget_data_get(obj);
5636 wd->highlight = !!highlight;
5640 elm_genlist_highlight_mode_get(const Evas_Object *obj)
5642 ELM_CHECK_WIDTYPE(obj, widtype) EINA_FALSE;
5643 Widget_Data *wd = elm_widget_data_get(obj);
5644 if (!wd) return EINA_FALSE;
5645 return wd->highlight;
5649 elm_genlist_item_select_mode_set(Elm_Object_Item *it,
5650 Elm_Object_Select_Mode mode)
5652 ELM_OBJ_ITEM_CHECK_OR_RETURN(it);
5653 Elm_Gen_Item *_it = (Elm_Gen_Item *)it;
5655 if (_it->generation < _it->wd->generation) return;
5656 if (mode >= ELM_OBJECT_SELECT_MODE_MAX)
5658 if (_it->select_mode != mode)
5659 _it->select_mode = mode;
5661 if (_it->select_mode == ELM_OBJECT_SELECT_MODE_DISPLAY_ONLY)
5663 _it->item->mincalcd = EINA_FALSE;
5664 _it->item->updateme = EINA_TRUE;
5665 if (_it->item->block) _it->item->block->updateme = EINA_TRUE;
5666 if (_it->wd->update_job) ecore_job_del(_it->wd->update_job);
5667 _it->wd->update_job = ecore_job_add(_update_job, _it->wd);
5671 EAPI Elm_Object_Select_Mode
5672 elm_genlist_item_select_mode_get(const Elm_Object_Item *it)
5674 ELM_OBJ_ITEM_CHECK_OR_RETURN(it, ELM_OBJECT_SELECT_MODE_MAX);
5675 Elm_Gen_Item *_it = (Elm_Gen_Item *)it;
5676 if (!_it) return ELM_OBJECT_SELECT_MODE_MAX;
5677 return _it->select_mode;
5680 /* for gengrid as of now */
5682 _elm_genlist_page_relative_set(Evas_Object *obj,
5686 Evas_Coord pagesize_h;
5687 Evas_Coord pagesize_v;
5689 ELM_CHECK_WIDTYPE(obj, widtype);
5690 Widget_Data *wd = elm_widget_data_get(obj);
5693 elm_smart_scroller_paging_get(wd->scr, NULL, NULL, &pagesize_h, &pagesize_v);
5694 elm_smart_scroller_paging_set(wd->scr, h_pagerel, v_pagerel, pagesize_h,
5698 /* for gengrid as of now */
5700 _elm_genlist_page_relative_get(const Evas_Object *obj,
5704 ELM_CHECK_WIDTYPE(obj, widtype);
5705 Widget_Data *wd = elm_widget_data_get(obj);
5708 elm_smart_scroller_paging_get(wd->scr, h_pagerel, v_pagerel, NULL, NULL);
5711 /* for gengrid as of now */
5713 _elm_genlist_page_size_set(Evas_Object *obj,
5714 Evas_Coord h_pagesize,
5715 Evas_Coord v_pagesize)
5720 ELM_CHECK_WIDTYPE(obj, widtype);
5721 Widget_Data *wd = elm_widget_data_get(obj);
5723 elm_smart_scroller_paging_get(wd->scr, &pagerel_h, &pagerel_v, NULL, NULL);
5724 elm_smart_scroller_paging_set(wd->scr, pagerel_h, pagerel_v, h_pagesize,
5728 /* for gengrid as of now */
5730 _elm_genlist_current_page_get(const Evas_Object *obj,
5734 ELM_CHECK_WIDTYPE(obj, widtype);
5735 Widget_Data *wd = elm_widget_data_get(obj);
5737 elm_smart_scroller_current_page_get(wd->scr, h_pagenumber, v_pagenumber);
5740 /* for gengrid as of now */
5742 _elm_genlist_last_page_get(const Evas_Object *obj,
5746 ELM_CHECK_WIDTYPE(obj, widtype);
5747 Widget_Data *wd = elm_widget_data_get(obj);
5749 elm_smart_scroller_last_page_get(wd->scr, h_pagenumber, v_pagenumber);
5752 /* for gengrid as of now */
5754 _elm_genlist_page_show(const Evas_Object *obj,
5758 ELM_CHECK_WIDTYPE(obj, widtype);
5759 Widget_Data *wd = elm_widget_data_get(obj);
5761 elm_smart_scroller_page_show(wd->scr, h_pagenumber, v_pagenumber);
5764 /* for gengrid as of now */
5766 _elm_genlist_page_bring_in(const Evas_Object *obj,
5770 ELM_CHECK_WIDTYPE(obj, widtype);
5771 Widget_Data *wd = elm_widget_data_get(obj);
5773 elm_smart_scroller_page_bring_in(wd->scr, h_pagenumber, v_pagenumber);
5777 _elm_genlist_item_unrealize(Elm_Gen_Item *it,
5780 Evas_Object *content;
5782 if (!it->realized) return;
5783 if (it->wd->reorder_it == it) return;
5785 evas_event_freeze(evas_object_evas_get(WIDGET(it)));
5787 evas_object_smart_callback_call(WIDGET(it), SIG_UNREALIZED, it);
5790 ecore_timer_del(it->long_timer);
5791 it->long_timer = NULL;
5794 elm_widget_stringlist_free(it->texts);
5796 elm_widget_stringlist_free(it->contents);
5797 it->contents = NULL;
5798 elm_widget_stringlist_free(it->states);
5800 EINA_LIST_FREE(it->content_objs, content)
5801 evas_object_del(content);
5805 elm_widget_stringlist_free(it->item->flip_contents);
5806 it->item->flip_contents = NULL;
5807 EINA_LIST_FREE(it->item->flip_content_objs, content)
5808 evas_object_del(content);
5811 it->unrealize_cb(it);
5813 it->realized = EINA_FALSE;
5814 it->want_unrealize = EINA_FALSE;
5815 evas_event_thaw(evas_object_evas_get(WIDGET(it)));
5816 evas_event_thaw_eval(evas_object_evas_get(WIDGET(it)));
5820 _elm_genlist_item_del_notserious(Elm_Gen_Item *it)
5822 elm_widget_item_pre_notify_del(it);
5823 it->generation = it->wd->generation - 1; /* This means that the item is deleted */
5824 if (it->selected) it->wd->selected = eina_list_remove(it->wd->selected, it);
5826 if (it->itc->func.del)
5827 it->itc->func.del((void *)it->base.data, WIDGET(it));
5831 _elm_genlist_item_del_serious(Elm_Gen_Item *it)
5833 _elm_genlist_item_del_notserious(it);
5834 it->wd->items = eina_inlist_remove(it->wd->items, EINA_INLIST_GET(it));
5835 if (it->tooltip.del_cb)
5836 it->tooltip.del_cb((void *)it->tooltip.data, WIDGET(it), it);
5837 it->wd->walking -= it->walking;
5840 ecore_timer_del(it->long_timer);
5841 it->long_timer = NULL;
5844 it->wd->group_items = eina_list_remove(it->wd->group_items, it);
5848 eina_inlist_sorted_state_free(it->wd->state);
5849 it->wd->state = NULL;
5851 if (it->wd->calc_job) ecore_job_del(it->wd->calc_job);
5852 it->wd->calc_job = ecore_job_add(it->wd->calc_cb, it->wd);
5856 if (it->wd->last_selected_item == (Elm_Object_Item *)it)
5857 it->wd->last_selected_item = NULL;
5858 it->wd->item_count--;
5862 elm_genlist_tree_effect_enabled_set(Evas_Object *obj, Eina_Bool enabled)
5864 ELM_CHECK_WIDTYPE(obj, widtype);
5865 Widget_Data *wd = elm_widget_data_get(obj);
5867 wd->tree_effect_enabled = !!enabled;
5871 elm_genlist_tree_effect_enabled_get(const Evas_Object *obj)
5873 ELM_CHECK_WIDTYPE(obj, widtype) EINA_FALSE;
5874 Widget_Data *wd = elm_widget_data_get(obj);
5875 if (!wd) return EINA_FALSE;
5876 return wd->tree_effect_enabled;
5880 _create_tray_alpha_bg(const Evas_Object *obj)
5882 ELM_CHECK_WIDTYPE(obj, widtype) NULL;
5883 Widget_Data *wd = elm_widget_data_get(obj);
5884 if (!wd) return NULL;
5886 Evas_Object *bg = NULL;
5887 Evas_Coord ox, oy, ow, oh;
5889 evas_object_geometry_get(wd->pan_smart, &ox, &oy, &ow, &oh);
5890 bg = evas_object_rectangle_add(evas_object_evas_get(wd->obj));
5891 evas_object_color_set(bg,0,0,0,0);
5892 evas_object_resize(bg , ow, oh);
5893 evas_object_move(bg , ox, oy);
5898 _item_contract_emit(Elm_Gen_Item *it)
5903 edje_object_signal_emit(VIEW(it), "elm,state,contract_flip", "");
5904 it->item->tree_effect_finished = EINA_FALSE;
5906 EINA_LIST_FOREACH(it->item->items, l, it2)
5907 if (it2) _item_contract_emit(it2);
5911 _item_tree_effect_before(Elm_Gen_Item *it)
5916 EINA_LIST_FOREACH(it->item->items, l, it2)
5918 if (it2->parent && (it == it2->parent))
5921 it2->item->tree_effect_hideme = EINA_TRUE;
5922 if (it->wd->move_effect_mode == ELM_GENLIST_TREE_EFFECT_EXPAND)
5923 edje_object_signal_emit(VIEW(it2), "elm,state,hide", "");
5924 else if (it->wd->move_effect_mode == ELM_GENLIST_TREE_EFFECT_CONTRACT)
5925 _item_contract_emit(it2);
5928 return ECORE_CALLBACK_CANCEL;
5932 _item_tree_effect(Widget_Data *wd, int y)
5934 Elm_Gen_Item *it = NULL, *expanded_next_it;
5936 expanded_next_it = wd->expanded_next_item;
5938 if (wd->move_effect_mode == ELM_GENLIST_TREE_EFFECT_EXPAND)
5940 it = (Elm_Gen_Item *) elm_genlist_item_prev_get((Elm_Object_Item *) expanded_next_it);
5943 if (it->item->expanded_depth <= expanded_next_it->item->expanded_depth) break;
5944 if (it->item->scrl_y && (it->item->scrl_y <= expanded_next_it->item->old_scrl_y + y) &&
5945 (it->item->expanded_depth > expanded_next_it->item->expanded_depth))
5947 if (!it->item->tree_effect_finished)
5949 edje_object_signal_emit(VIEW(it), "flip_item", "");
5950 _item_position(it, VIEW(it), it->item->scrl_x, it->item->scrl_y);
5951 it->item->tree_effect_finished = EINA_TRUE;
5954 it = (Elm_Gen_Item *) elm_genlist_item_prev_get((Elm_Object_Item *) it);
5957 else if (wd->move_effect_mode == ELM_GENLIST_TREE_EFFECT_CONTRACT)
5959 it = (Elm_Gen_Item *) elm_genlist_item_prev_get((Elm_Object_Item *) expanded_next_it);
5962 if ((it->item->scrl_y > expanded_next_it->item->old_scrl_y + y) &&
5963 (it->item->expanded_depth > expanded_next_it->item->expanded_depth))
5965 if (!it->item->tree_effect_finished)
5967 edje_object_signal_emit(VIEW(it), "elm,state,hide", "");
5968 it->item->tree_effect_finished = EINA_TRUE;
5973 it = (Elm_Gen_Item *) elm_genlist_item_prev_get((Elm_Object_Item *) it);
5979 _item_tree_effect_finish(Widget_Data *wd)
5981 Elm_Gen_Item *it = NULL;
5984 if (wd->tree_effect_animator)
5986 if (wd->move_effect_mode == ELM_GENLIST_TREE_EFFECT_CONTRACT)
5987 _item_subitems_clear(wd->expanded_item);
5988 EINA_LIST_FOREACH(wd->expanded_item->item->items, l, it)
5990 it->item->tree_effect_finished = EINA_TRUE;
5991 it->item->old_scrl_y = it->item->scrl_y;
5992 if (it->wd->move_effect_mode == ELM_GENLIST_TREE_EFFECT_EXPAND)
5993 edje_object_signal_emit(VIEW(it), "elm,state,show", "");
5996 _item_auto_scroll(wd);
5997 evas_object_lower(wd->alpha_bg);
5998 evas_object_hide(wd->alpha_bg);
5999 wd->move_effect_mode = ELM_GENLIST_TREE_EFFECT_NONE;
6000 if (wd->move_items) wd->move_items = eina_list_free(wd->move_items);
6002 evas_object_smart_callback_call(wd->pan_smart, "changed", NULL);
6003 evas_object_smart_callback_call(wd->obj, SIG_TREE_EFFECT_FINISHED, NULL);
6004 evas_object_smart_changed(wd->pan_smart);
6006 wd->tree_effect_animator = NULL;
6010 _tree_effect_animator_cb(void *data)
6012 Widget_Data *wd = data;
6013 if (!wd) return EINA_FALSE;
6014 Evas_Coord ox, oy, ow, oh, cvx, cvy, cvw, cvh;
6015 Elm_Gen_Item *it = NULL, *it2, *expanded_next_it;
6017 double effect_duration = 0.3, t;
6018 int y = 0, dy = 0, dh = 0;
6019 Eina_Bool end = EINA_FALSE, vis = EINA_TRUE;
6022 t = ((0.0 > (t = ecore_time_get() - wd->start_time)) ? 0.0 : t);
6023 evas_object_geometry_get(wd->pan_smart, &ox, &oy, &ow, &oh);
6024 evas_output_viewport_get(evas_object_evas_get(wd->pan_smart), &cvx, &cvy, &cvw, &cvh);
6025 if (t > effect_duration) end = EINA_TRUE;
6027 // Below while statement is needed, when the genlist is resized.
6028 it2 = wd->expanded_item;
6031 evas_object_move(VIEW(it2), it2->item->scrl_x, it2->item->scrl_y);
6032 vis = (ELM_RECTS_INTERSECT(it2->item->scrl_x, it2->item->scrl_y, it2->item->w, it2->item->h,
6033 cvx, cvy, cvw, cvh));
6034 it2 = (Elm_Gen_Item *) elm_genlist_item_prev_get((Elm_Object_Item *) it2);
6037 if (wd->expanded_next_item)
6039 expanded_next_it = wd->expanded_next_item;
6042 EINA_LIST_FOREACH(wd->move_items, l, it)
6044 if (wd->move_effect_mode == ELM_GENLIST_TREE_EFFECT_EXPAND)
6046 expanded_next_it->item->old_scrl_y = wd->expanded_item->item->old_scrl_y + wd->expanded_item->item->h;
6047 if (expanded_next_it->item->scrl_y <= expanded_next_it->item->old_scrl_y) //did not calculate next item position
6048 expanded_next_it->item->scrl_y = cvy + cvh;
6050 dy = ((expanded_next_it->item->scrl_y >= (cvy + cvh)) ?
6051 cvy + cvh : expanded_next_it->item->scrl_y) -
6052 expanded_next_it->item->old_scrl_y;
6054 else if (wd->move_effect_mode == ELM_GENLIST_TREE_EFFECT_CONTRACT)
6056 if (expanded_next_it->item->scrl_y >= expanded_next_it->item->old_scrl_y) //did not calculate next item position
6057 expanded_next_it->item->old_scrl_y = cvy + cvh;
6059 if (expanded_next_it->item->old_scrl_y > (cvy + cvh))
6061 dy = (wd->expanded_item->item->scrl_y + wd->expanded_item->item->h) -
6063 expanded_next_it->item->old_scrl_y = cvy + cvh;
6067 dy = (wd->expanded_item->item->scrl_y + wd->expanded_item->item->h) -
6068 expanded_next_it->item->old_scrl_y;
6072 if (t <= effect_duration)
6074 y = ((1 - (1 - (t / effect_duration)) * (1 - (t /effect_duration))) * dy);
6084 _item_realize(it, in, 0);
6088 if (it != expanded_next_it)
6090 it->item->old_scrl_y = expanded_next_it->item->old_scrl_y + expanded_next_it->item->h + dh;
6094 if ((it->item->old_scrl_y + y) < (cvy + cvh))
6095 _item_position(it, VIEW(it),it->item->scrl_x, it->item->old_scrl_y + y);
6098 _item_tree_effect(wd, y);
6102 int expanded_item_num = 0;
6105 if (wd->expanded_item)
6106 it = (Elm_Gen_Item *) elm_genlist_item_next_get((Elm_Object_Item *) wd->expanded_item);
6111 expanded_item_num++;
6112 it2 = (Elm_Gen_Item *) elm_genlist_item_next_get((Elm_Object_Item *) it2);
6118 if (wd->expanded_item->item->expanded_depth >= it->item->expanded_depth) break;
6119 if (wd->move_effect_mode == ELM_GENLIST_TREE_EFFECT_EXPAND)
6121 if (!it->item->tree_effect_finished)
6123 if (t >= (((num - 1) * effect_duration) / expanded_item_num))
6125 edje_object_signal_emit(VIEW(it), "flip_item", "");
6126 _item_position(it, VIEW(it), it->item->scrl_x, it->item->scrl_y);
6127 it->item->tree_effect_finished = EINA_TRUE;
6131 it = (Elm_Gen_Item *) elm_genlist_item_next_get((Elm_Object_Item *) it);
6137 _item_tree_effect_finish(wd);
6138 return ECORE_CALLBACK_CANCEL;
6140 return ECORE_CALLBACK_RENEW;