2 #include <Elementary.h>
3 #include <Elementary_Cursor.h>
5 #include "elm_widget_genlist.h"
7 #define GROUP_ITEMS_FEATURE 0
8 // internally allocated
9 #define CLASS_ALLOCATED 0x3a70f11f
11 #define MAX_ITEMS_PER_BLOCK 32
12 #define REORDER_EFFECT_TIME 0.1
13 #define FX_MOVE_TIME 0.5
15 EAPI const char ELM_GENLIST_SMART_NAME[] = "elm_genlist";
16 EAPI const char ELM_GENLIST_PAN_SMART_NAME[] = "elm_genlist_pan";
18 #define ERR_ABORT(_msg) \
20 if (getenv("ELM_ERROR_ABORT")) abort();
22 #define GL_IT(_it) (_it->item)
24 #define IS_ROOT_PARENT_IT(_it) \
25 ((_it->group) || (GL_IT(_it)->items && GL_IT(_it)->expanded_depth == 0)) \
27 static const Evas_Smart_Interface *_smart_interfaces[] =
29 (Evas_Smart_Interface *)&ELM_SCROLLABLE_IFACE, NULL
32 static const char SIG_ACTIVATED[] = "activated";
33 static const char SIG_CLICKED_DOUBLE[] = "clicked,double";
34 static const char SIG_SELECTED[] = "selected";
35 static const char SIG_UNSELECTED[] = "unselected";
36 static const char SIG_EXPANDED[] = "expanded";
37 static const char SIG_CONTRACTED[] = "contracted";
38 static const char SIG_EXPAND_REQUEST[] = "expand,request";
39 static const char SIG_CONTRACT_REQUEST[] = "contract,request";
40 static const char SIG_REALIZED[] = "realized";
41 static const char SIG_UNREALIZED[] = "unrealized";
42 static const char SIG_DRAG_START_UP[] = "drag,start,up";
43 static const char SIG_DRAG_START_DOWN[] = "drag,start,down";
44 static const char SIG_DRAG_START_LEFT[] = "drag,start,left";
45 static const char SIG_DRAG_START_RIGHT[] = "drag,start,right";
46 static const char SIG_DRAG_STOP[] = "drag,stop";
47 static const char SIG_DRAG[] = "drag";
48 static const char SIG_LONGPRESSED[] = "longpressed";
49 static const char SIG_SCROLL_ANIM_START[] = "scroll,anim,start";
50 static const char SIG_SCROLL_ANIM_STOP[] = "scroll,anim,stop";
51 static const char SIG_SCROLL_DRAG_START[] = "scroll,drag,start";
52 static const char SIG_SCROLL_DRAG_STOP[] = "scroll,drag,stop";
53 static const char SIG_EDGE_TOP[] = "edge,top";
54 static const char SIG_EDGE_BOTTOM[] = "edge,bottom";
55 static const char SIG_EDGE_LEFT[] = "edge,left";
56 static const char SIG_EDGE_RIGHT[] = "edge,right";
57 static const char SIG_VBAR_DRAG[] = "vbar,drag";
58 static const char SIG_VBAR_PRESS[] = "vbar,press";
59 static const char SIG_VBAR_UNPRESS[] = "vbar,unpress";
60 static const char SIG_HBAR_DRAG[] = "hbar,drag";
61 static const char SIG_HBAR_PRESS[] = "hbar,press";
62 static const char SIG_HBAR_UNPRESS[] = "hbar,unpress";
63 static const char SIG_MULTI_SWIPE_LEFT[] = "multi,swipe,left";
64 static const char SIG_MULTI_SWIPE_RIGHT[] = "multi,swipe,right";
65 static const char SIG_MULTI_SWIPE_UP[] = "multi,swipe,up";
66 static const char SIG_MULTI_SWIPE_DOWN[] = "multi,swipe,down";
67 static const char SIG_MULTI_PINCH_OUT[] = "multi,pinch,out";
68 static const char SIG_MULTI_PINCH_IN[] = "multi,pinch,in";
69 static const char SIG_SWIPE[] = "swipe";
70 static const char SIG_MOVED[] = "moved";
71 static const char SIG_MOVED_AFTER[] = "moved,after";
72 static const char SIG_MOVED_BEFORE[] = "moved,before";
73 static const char SIG_INDEX_UPDATE[] = "index,update";
74 static const char SIG_TREE_EFFECT_FINISHED [] = "tree,effect,finished";
75 static const char SIG_HIGHLIGHTED[] = "highlighted";
76 static const char SIG_UNHIGHLIGHTED[] = "unhighlighted";
78 static const Evas_Smart_Cb_Description _smart_callbacks[] = {
79 {SIG_CLICKED_DOUBLE, ""},
85 {SIG_EXPAND_REQUEST, ""},
86 {SIG_CONTRACT_REQUEST, ""},
89 {SIG_DRAG_START_UP, ""},
90 {SIG_DRAG_START_DOWN, ""},
91 {SIG_DRAG_START_LEFT, ""},
92 {SIG_DRAG_START_RIGHT, ""},
95 {SIG_LONGPRESSED, ""},
96 {SIG_SCROLL_ANIM_START, ""},
97 {SIG_SCROLL_ANIM_STOP, ""},
98 {SIG_SCROLL_DRAG_START, ""},
99 {SIG_SCROLL_DRAG_STOP, ""},
101 {SIG_EDGE_BOTTOM, ""},
103 {SIG_EDGE_RIGHT, ""},
105 {SIG_VBAR_PRESS, ""},
106 {SIG_VBAR_UNPRESS, ""},
108 {SIG_HBAR_PRESS, ""},
109 {SIG_HBAR_UNPRESS, ""},
110 {SIG_MULTI_SWIPE_LEFT, ""},
111 {SIG_MULTI_SWIPE_RIGHT, ""},
112 {SIG_MULTI_SWIPE_UP, ""},
113 {SIG_MULTI_SWIPE_DOWN, ""},
114 {SIG_MULTI_PINCH_OUT, ""},
115 {SIG_MULTI_PINCH_IN, ""},
118 {SIG_MOVED_AFTER, ""},
119 {SIG_MOVED_BEFORE, ""},
120 {SIG_TREE_EFFECT_FINISHED, ""},
121 {SIG_HIGHLIGHTED, ""},
122 {SIG_UNHIGHLIGHTED, ""},
126 EVAS_SMART_SUBCLASS_IFACE_NEW
127 (ELM_GENLIST_SMART_NAME, _elm_genlist, Elm_Genlist_Smart_Class,
128 Elm_Layout_Smart_Class, elm_layout_smart_class_get, _smart_callbacks,
131 ELM_INTERNAL_SMART_SUBCLASS_NEW
132 (ELM_GENLIST_PAN_SMART_NAME, _elm_genlist_pan, Elm_Genlist_Pan_Smart_Class,
133 Elm_Pan_Smart_Class, elm_pan_smart_class_get, NULL);
135 static void _calc_job(void *);
136 static Eina_Bool _item_block_recalc(Item_Block *, int, Eina_Bool);
137 static void _item_mouse_callbacks_add(Elm_Gen_Item *, Evas_Object *);
138 static void _item_mouse_callbacks_del(Elm_Gen_Item *, Evas_Object *);
139 static void _access_activate_cb(void *data __UNUSED__,
140 Evas_Object *part_obj __UNUSED__,
141 Elm_Object_Item *item);
142 static void _item_select(Elm_Gen_Item *it);
144 static void _expand_toggle_signal_cb(void *data, Evas_Object *obj __UNUSED__, const char *emission __UNUSED__, const char *source __UNUSED__);
145 static void _expand_signal_cb(void *data, Evas_Object *obj __UNUSED__, const char *emission __UNUSED__, const char *source __UNUSED__);
146 static void _contract_signal_cb(void *data, Evas_Object *obj __UNUSED__, const char *emission __UNUSED__, const char *source __UNUSED__);
147 static void _elm_genlist_item_state_update(Elm_Gen_Item *it, Item_Cache *ic);
148 static void _decorate_item_unrealize(Elm_Gen_Item *it);
149 static void _decorate_all_item_unrealize(Elm_Gen_Item *it);
150 static void _decorate_item_set(Elm_Gen_Item *it);
151 static void _changed_job(Elm_Genlist_Smart_Data *sd);
153 #if GENLIST_FX_SUPPORT
154 static Eina_Bool _elm_genlist_fx_capture(Evas_Object *obj, int level);
155 static void _elm_genlist_fx_play(Evas_Object *obj);
156 static void _elm_genlist_fx_clear(Evas_Object *obj);
157 static void _elm_genlist_proxy_item_del(const Elm_Object_Item *item);
160 #if GENLIST_PINCH_ZOOM_SUPPORT
161 EAPI Eina_Bool elm_genlist_pinch_zoom_mode_set(Evas_Object *obj, Elm_Gen_Pinch_Zoom_Mode mode);
165 _item_cache_all_free(Elm_Genlist_Smart_Data *sd)
167 // It would be better not to use
168 // EINA_INLIST_FOREACH or EINA_INLIST_FOREACH_SAFE
169 while (sd->item_cache)
171 Item_Cache *ic = EINA_INLIST_CONTAINER_GET(sd->item_cache->last, Item_Cache);
172 if (ic->spacer) evas_object_del(ic->spacer);
173 if (ic->base_view) evas_object_del(ic->base_view);
174 if (ic->item_style) eina_stringshare_del(ic->item_style);
175 sd->item_cache = eina_inlist_remove(sd->item_cache, EINA_INLIST_GET(ic));
176 // Free should be performed after inlist is poped
179 sd->item_cache = NULL;
180 sd->item_cache_count = 0;
184 _item_cache_push(Elm_Gen_Item *it)
186 Elm_Genlist_Smart_Data *sd = GL_IT(it)->wsd;
187 Item_Cache *ic = NULL;
189 if (sd->item_cache_count >= sd->item_cache_max)
191 ic = EINA_INLIST_CONTAINER_GET(sd->item_cache->last, Item_Cache);
192 if (ic->spacer) evas_object_del(ic->spacer);
193 if (ic->base_view) evas_object_del(ic->base_view);
194 eina_stringshare_del(ic->item_style);
195 sd->item_cache = eina_inlist_remove(sd->item_cache,
196 sd->item_cache->last);
197 sd->item_cache_count--;
198 // Free should be performed after inlist is poped
201 //evas_event_freeze(evas_object_evas_get(obj));
203 edje_object_mirrored_set(VIEW(it),
204 elm_widget_mirrored_get(WIDGET(it)));
205 edje_object_scale_set(VIEW(it),
206 elm_widget_scale_get(WIDGET(it))
207 * elm_config_scale_get());
209 // FIXME: other callbacks?
210 edje_object_signal_callback_del_full(VIEW(it), "elm,action,expand,toggle",
211 "elm", _expand_toggle_signal_cb, it);
212 edje_object_signal_callback_del_full(VIEW(it), "elm,action,expand", "elm",
213 _expand_signal_cb, it);
214 edje_object_signal_callback_del_full(VIEW(it), "elm,action,contract", "elm",
215 _contract_signal_cb, it);
216 _item_mouse_callbacks_del(it, VIEW(it));
218 #if GENLIST_FX_SUPPORT
219 if ((it->item->nocache_once) || (it->item->nocache) || (sd->pending_del_items))
221 if ((it->item->nocache_once) || (it->item->nocache))
224 if (VIEW(it)) evas_object_del(VIEW(it));
225 if (it->spacer) evas_object_del(it->spacer);
228 ic = ELM_NEW(Item_Cache);
231 if (VIEW(it)) evas_object_del(VIEW(it));
232 if (it->spacer) evas_object_del(it->spacer);
237 ecore_timer_del(it->long_timer);
238 it->long_timer = NULL;
240 if (it->item->swipe_timer)
242 ecore_timer_del(it->item->swipe_timer);
243 it->item->swipe_timer = NULL;
246 ic->base_view = VIEW(it);
247 ic->spacer = it->spacer;
248 ic->item_style = eina_stringshare_add(it->itc->item_style);
249 if (it->item->type & ELM_GENLIST_ITEM_TREE) ic->tree = 1;
251 ic->selected = it->selected;
252 ic->disabled = elm_widget_item_disabled_get(it);
253 ic->expanded = it->item->expanded;
254 if (it->item->type & ELM_GENLIST_ITEM_TREE) ic->tree = 1;
256 edje_object_signal_emit(ic->base_view, "elm,state,unselected", "elm");
257 evas_object_hide(ic->base_view);
259 sd->item_cache = eina_inlist_prepend(sd->item_cache, EINA_INLIST_GET(ic));
260 sd->item_cache_count++;
266 it->realized = EINA_FALSE;
267 it->want_unrealize = EINA_FALSE;
269 //evas_event_thaw(evas_object_evas_get(obj));
270 //evas_event_thaw_eval(evas_object_evas_get(obj));
274 _item_cache_pop(Elm_Gen_Item *it)
276 Item_Cache *ic = NULL;
279 Elm_Genlist_Smart_Data *sd = GL_IT(it)->wsd;
281 if (it->item->nocache_once) {
282 it->item->nocache_once = EINA_FALSE;
285 if (it->item->nocache) return EINA_FALSE;
287 if (it->item->type & ELM_GENLIST_ITEM_TREE) tree = 1;
288 EINA_INLIST_FOREACH_SAFE(sd->item_cache, l, ic)
290 if ((ic->selected) || (ic->disabled) || (ic->expanded))
293 if ((ic->tree == tree) &&
294 (((!it->itc->item_style) && (!ic->item_style)) ||
295 (it->itc->item_style && ic->item_style &&
296 (!strcmp(it->itc->item_style, ic->item_style)))))
299 eina_inlist_remove(sd->item_cache, EINA_INLIST_GET(ic));
300 sd->item_cache_count--;
302 VIEW(it) = ic->base_view;
303 it->spacer = ic->spacer;
305 #if 1 // FIXME: different from upstream
306 // Because of item cache, set state as default after cache item
308 edje_object_signal_emit(VIEW(it),"elm,state,default", "elm");
310 edje_object_signal_callback_add
311 (VIEW(it), "elm,action,expand,toggle", "elm",
312 _expand_toggle_signal_cb, it);
313 edje_object_signal_callback_add
314 (VIEW(it), "elm,action,expand", "elm", _expand_signal_cb, it);
315 edje_object_signal_callback_add
316 (VIEW(it), "elm,action,contract", "elm", _contract_signal_cb, it);
317 _item_mouse_callbacks_add(it, VIEW(it));
319 eina_stringshare_del(ic->item_style);
329 _elm_genlist_pan_smart_pos_set(Evas_Object *obj,
335 ELM_GENLIST_PAN_DATA_GET(obj, psd);
337 if ((x == psd->wsd->pan_x) && (y == psd->wsd->pan_y)) return;
341 EINA_INLIST_FOREACH(psd->wsd->blocks, itb)
343 if ((itb->y + itb->h) > y)
348 EINA_LIST_FOREACH(itb->items, l2, it)
350 if ((itb->y + it->y) >= y)
352 psd->wsd->anchor_item = it;
353 psd->wsd->anchor_y = -(itb->y + it->y - y);
360 if (!psd->wsd->reorder_move_animator) evas_object_smart_changed(obj);
364 _elm_genlist_pan_smart_pos_get(const Evas_Object *obj,
368 ELM_GENLIST_PAN_DATA_GET(obj, psd);
370 if (x) *x = psd->wsd->pan_x;
371 if (y) *y = psd->wsd->pan_y;
375 _elm_genlist_pan_smart_pos_max_get(const Evas_Object *obj,
381 ELM_GENLIST_PAN_DATA_GET(obj, psd);
383 evas_object_geometry_get(obj, NULL, NULL, &ow, &oh);
384 ow = psd->wsd->minw - ow;
386 oh = psd->wsd->minh - oh;
391 #if GENLIST_PINCH_ZOOM_SUPPORT
392 if (psd->wsd->pinch_zoom_mode == ELM_GEN_PINCH_ZOOM_CONTRACT)
394 evas_object_geometry_get(obj, NULL, NULL, &ow, &oh);
395 if (psd->wsd->pinch_zoom_h > oh)
396 *y = psd->wsd->pinch_zoom_h - oh;
403 _elm_genlist_pan_smart_pos_min_get(const Evas_Object *obj __UNUSED__,
412 _elm_genlist_pan_smart_content_size_get(const Evas_Object *obj,
416 ELM_GENLIST_PAN_DATA_GET(obj, psd);
418 if (w) *w = psd->wsd->minw;
419 if (h) *h = psd->wsd->minh;
423 _elm_genlist_pan_smart_add(Evas_Object *obj)
425 /* here just to allocate our extended data */
426 EVAS_SMART_DATA_ALLOC(obj, Elm_Genlist_Pan_Smart_Data);
428 ELM_PAN_CLASS(_elm_genlist_pan_parent_sc)->base.add(obj);
432 _elm_genlist_pan_smart_del(Evas_Object *obj)
434 ELM_GENLIST_PAN_DATA_GET(obj, psd);
438 ecore_job_del(psd->resize_job);
439 psd->resize_job = NULL;
442 _elm_genlist_pan_parent_sc->base.del(obj);
446 _elm_genlist_pan_smart_move(Evas_Object *obj,
447 Evas_Coord x __UNUSED__,
448 Evas_Coord y __UNUSED__)
450 ELM_GENLIST_PAN_DATA_GET(obj, psd);
452 psd->wsd->pan_changed = EINA_TRUE;
453 evas_object_smart_changed(obj);
454 if (psd->wsd->calc_job) ecore_job_del(psd->wsd->calc_job);
455 psd->wsd->calc_job = NULL;
459 _elm_genlist_pan_smart_resize(Evas_Object *obj,
463 Evas_Coord ow = 0, oh = 0, vw = 0;
465 ELM_GENLIST_PAN_DATA_GET(obj, psd);
467 evas_object_geometry_get(obj, NULL, NULL, &ow, &oh);
468 if ((ow == w) && (oh == h)) return;
470 psd->wsd->s_iface->content_viewport_size_get
471 (ELM_WIDGET_DATA(psd->wsd)->obj, &vw, NULL);
472 if (vw != 0) psd->wsd->prev_viewport_w = vw;
475 if (psd->wsd->mode == ELM_LIST_COMPRESS)
476 psd->wsd->size_changed = EINA_TRUE;
478 psd->wsd->pan_changed = EINA_TRUE;
479 if (psd->wsd->calc_job) ecore_job_del(psd->wsd->calc_job);
480 psd->wsd->calc_job = ecore_job_add(_calc_job, psd->wsd);
484 _item_scroll(Elm_Genlist_Smart_Data *sd)
487 Elm_Gen_Item *it = NULL;
488 Evas_Coord ow, oh, dx = 0, dy = 0, dw = 0, dh = 0;
490 if (!sd->show_item) return;
492 evas_object_geometry_get(sd->pan_obj, NULL, NULL, &ow, &oh);
494 dx = it->x + it->item->block->x;
495 dy = it->y + it->item->block->y;
496 dw = it->item->block->w;
499 switch (sd->scroll_to_type)
501 case ELM_GENLIST_ITEM_SCROLLTO_TOP:
502 if (it->item->group_item) gith = it->item->group_item->item->h;
506 case ELM_GENLIST_ITEM_SCROLLTO_MIDDLE:
507 dy += ((it->item->h / 2) - (oh / 2));
510 case ELM_GENLIST_ITEM_SCROLLTO_IN:
512 if ((sd->expanded_item) &&
513 ((sd->show_item->y + sd->show_item->item->block->y
514 + sd->show_item->item->h) -
515 (sd->expanded_item->y + sd->expanded_item->item->block->y) > oh))
517 it = sd->expanded_item;
518 if (it->item->group_item) gith = it->item->group_item->item->h;
519 dx = it->x + it->item->block->x;
520 dy = it->y + it->item->block->y - gith;
521 dw = it->item->block->w;
525 if ((it->item->group_item) &&
526 (sd->pan_y > (it->y + it->item->block->y)))
527 gith = it->item->group_item->item->h;
534 sd->s_iface->region_bring_in(ELM_WIDGET_DATA(sd)->obj, dx, dy, dw, dh);
536 sd->s_iface->content_region_show
537 (ELM_WIDGET_DATA(sd)->obj, dx, dy, dw, dh);
539 it->item->show_me = EINA_FALSE;
540 sd->show_item = NULL;
541 sd->auto_scroll_enabled = EINA_FALSE;
542 sd->check_scroll = EINA_FALSE;
546 _item_unrealize(Elm_Gen_Item *it,
549 Evas_Object *content;
553 if (!it->realized) return;
554 if (GL_IT(it)->wsd->reorder_it == it) return;
556 #if GENLIST_FX_SUPPORT
557 if ((GL_IT(it)->has_proxy_it) && (!GL_IT(it)->wsd->genlist_clearing))
559 if (!eina_list_data_find(GL_IT(it)->wsd->pending_unrealized_items, it))
560 GL_IT(it)->wsd->pending_unrealized_items =
561 eina_list_append(GL_IT(it)->wsd->pending_unrealized_items, it);
565 #if GENLIST_ENTRY_SUPPORT
566 if (it->item->unrealize_disabled)
568 evas_object_hide(VIEW(it));
573 //evas_event_freeze(evas_object_evas_get(WIDGET(it)));
575 evas_object_smart_callback_call(WIDGET(it), SIG_UNREALIZED, it);
578 ecore_timer_del(it->long_timer);
579 it->long_timer = NULL;
581 if (it->item->swipe_timer)
583 ecore_timer_del(it->item->swipe_timer);
584 it->item->swipe_timer = NULL;
588 EINA_LIST_FOREACH(it->texts, l, part)
589 edje_object_part_text_set(VIEW(it), part, NULL);
591 elm_widget_stringlist_free(it->texts);
593 elm_widget_stringlist_free(it->contents);
595 elm_widget_stringlist_free(it->states);
597 EINA_LIST_FREE(it->content_objs, content)
599 // FIXME: If parent-child relationship was broken before 'ic'
600 // is deleted, freeze_pop will not be called. ex) elm_slider
601 // If layout is used instead of edje, this problme can be
603 if (0 != elm_widget_scroll_freeze_get(content))
604 elm_widget_scroll_freeze_pop(content);
605 evas_object_del(content);
609 elm_widget_stringlist_free(it->item->flip_contents);
610 it->item->flip_contents = NULL;
611 EINA_LIST_FREE(it->item->flip_content_objs, content)
612 evas_object_del(content);
615 if (_elm_config->access_mode == ELM_ACCESS_MODE_ON)
616 _elm_access_widget_item_unregister((Elm_Widget_Item *)it);
618 // unswallow VIEW(it) first then manipulate VIEW(it)
619 _decorate_item_unrealize(it);
620 _decorate_all_item_unrealize(it);
622 it->realized = EINA_FALSE;
623 _item_cache_push(it);
625 #if GENLIST_ENTRY_SUPPORT
626 it->item->unrealize_disabled = EINA_FALSE;
628 it->want_unrealize = EINA_FALSE;
630 //evas_event_thaw(evas_object_evas_get(WIDGET(it)));
631 //evas_event_thaw_eval(evas_object_evas_get(WIDGET(it)));
635 _item_block_unrealize(Item_Block *itb)
639 Eina_Bool dragging = EINA_FALSE;
641 if (!itb->realized) return;
642 //evas_event_freeze(evas_object_evas_get(ELM_WIDGET_DATA(itb->sd)->obj));
644 EINA_LIST_FOREACH(itb->items, l, it)
646 if (itb->must_recalc || !it->group)
650 dragging = EINA_TRUE;
651 it->want_unrealize = EINA_TRUE;
654 _item_unrealize(it, EINA_FALSE);
659 itb->realized = EINA_FALSE;
660 itb->want_unrealize = EINA_TRUE;
663 itb->want_unrealize = EINA_FALSE;
664 //evas_event_thaw(evas_object_evas_get(ELM_WIDGET_DATA(itb->sd)->obj));
665 //evas_event_thaw_eval(evas_object_evas_get(ELM_WIDGET_DATA(itb->sd)->obj));
669 _must_recalc_idler(void *data)
671 Elm_Genlist_Smart_Data *sd = data;
673 if (sd->calc_job) ecore_job_del(sd->calc_job);
674 sd->calc_job = ecore_job_add(_calc_job, sd);
675 sd->must_recalc_idler = NULL;
676 return ECORE_CALLBACK_CANCEL;
680 _calc_job(void *data)
683 Item_Block *itb, *chb = NULL;
684 Evas_Coord pan_w = 0, pan_h = 0;
685 Elm_Genlist_Smart_Data *sd = data;
686 Eina_Bool minw_change = EINA_FALSE;
687 Eina_Bool did_must_recalc = EINA_FALSE;
688 Evas_Coord minw = -1, minh = 0, y = 0, dy = 0, vw = 0;
690 sd->s_iface->content_viewport_size_get(ELM_WIDGET_DATA(sd)->obj, &sd->w, &sd->h);
692 //evas_event_freeze(evas_object_evas_get(ELM_WIDGET_DATA(sd)->obj));
693 EINA_INLIST_FOREACH(sd->blocks, itb)
695 Eina_Bool show_me = EINA_FALSE;
698 show_me = itb->show_me;
699 itb->show_me = EINA_FALSE;
702 if (itb->realized) _item_block_unrealize(itb);
704 if ((itb->changed) || ((itb->must_recalc) && (!did_must_recalc)))
706 if (itb->must_recalc)
711 EINA_LIST_FOREACH(itb->items, l, it)
712 if (it->item->mincalcd) it->item->mincalcd = EINA_FALSE;
713 itb->changed = EINA_TRUE;
714 did_must_recalc = EINA_TRUE;
715 if (itb->realized) _item_block_unrealize(itb);
716 itb->must_recalc = EINA_FALSE;
718 show_me = _item_block_recalc(itb, in, EINA_FALSE);
724 if (minw == -1) minw = itb->minw;
725 else if ((!itb->must_recalc) && (minw < itb->minw))
728 minw_change = EINA_TRUE;
730 if ((sd->mode == ELM_LIST_COMPRESS) && (minw > vw))
733 minw_change = EINA_TRUE;
739 if ((show_me) && (sd->show_item) && (!sd->show_item->item->queued))
740 sd->check_scroll = EINA_TRUE;
744 EINA_INLIST_FOREACH(sd->blocks, itb)
750 if ((chb) && (EINA_INLIST_GET(chb)->next))
752 EINA_INLIST_FOREACH(EINA_INLIST_GET(chb)->next, itb)
754 if (itb->realized) _item_block_unrealize(itb);
758 if (minw < sd->w) minw = sd->w;
759 if ((minw != sd->minw) || (minh != sd->minh))
763 evas_object_smart_callback_call(sd->pan_obj, "changed", NULL);
764 elm_layout_sizing_eval(ELM_WIDGET_DATA(sd)->obj);
771 if ((sd->anchor_item) && (sd->anchor_item->item->block)
772 && (!sd->auto_scroll_enabled))
777 it = sd->anchor_item;
779 sd->s_iface->content_pos_set
780 (ELM_WIDGET_DATA(sd)->obj, sd->pan_x, it->item->block->y
781 + it->y + it_y, EINA_TRUE);
782 sd->anchor_item = it;
788 if (!sd->must_recalc_idler)
789 sd->must_recalc_idler = ecore_idler_add(_must_recalc_idler, sd);
791 if (sd->check_scroll)
793 _elm_genlist_pan_smart_content_size_get(sd->pan_obj, &pan_w, &pan_h);
794 if (EINA_INLIST_GET(sd->show_item) == sd->items->last)
795 sd->scroll_to_type = ELM_GENLIST_ITEM_SCROLLTO_IN;
797 switch (sd->scroll_to_type)
799 case ELM_GENLIST_ITEM_SCROLLTO_TOP:
803 case ELM_GENLIST_ITEM_SCROLLTO_MIDDLE:
807 case ELM_GENLIST_ITEM_SCROLLTO_IN:
812 if ((sd->show_item) && (sd->show_item->item->block))
814 if ((pan_w > (sd->show_item->x + sd->show_item->item->block->x))
815 && (pan_h > (sd->show_item->y + sd->show_item->item->block->y
824 evas_object_smart_changed(sd->pan_obj);
825 //evas_event_thaw(evas_object_evas_get(ELM_WIDGET_DATA(sd)->obj));
826 //evas_event_thaw_eval(evas_object_evas_get(ELM_WIDGET_DATA(sd)->obj));
830 _elm_genlist_smart_sizing_eval(Evas_Object *obj)
832 Evas_Coord minw = 0, minh = 0, maxw = -1, maxh = -1, vw = 0;
834 ELM_GENLIST_DATA_GET(obj, sd);
836 /* parent class' early call */
837 if (!sd->s_iface) return;
838 if (sd->on_sub_del) return;;
840 evas_object_size_hint_min_get(obj, &minw, NULL);
841 evas_object_size_hint_max_get(obj, &maxw, &maxh);
842 edje_object_size_min_calc(ELM_WIDGET_DATA(sd)->resize_obj, &minw, &minh);
844 sd->s_iface->content_viewport_size_get(obj, &vw, NULL);
845 if (vw != 0) sd->prev_viewport_w = vw;
847 if (sd->mode == ELM_LIST_LIMIT)
850 minw = minw + sd->realminw;
853 evas_object_size_hint_min_set(obj, minw, minh);
854 evas_object_size_hint_max_set(obj, maxw, maxh);
858 _item_position(Elm_Gen_Item *it,
866 //evas_event_freeze(evas_object_evas_get(ELM_WIDGET_DATA(GL_IT(it)->wsd)->obj));
867 evas_object_resize(view, it->item->w, it->item->h);
868 evas_object_move(view, it_x, it_y);
869 evas_object_show(view);
870 //evas_event_thaw(evas_object_evas_get(ELM_WIDGET_DATA(GL_IT(it)->wsd)->obj));
871 //evas_event_thaw_eval(evas_object_evas_get(ELM_WIDGET_DATA(GL_IT(it)->wsd)->obj));
875 _item_sub_items_clear(Elm_Gen_Item *it)
878 Elm_Object_Item *it2;
880 EINA_LIST_FOREACH_SAFE(it->item->items, l, ll, it2)
881 elm_widget_item_del(it2);
885 _item_auto_scroll(Elm_Genlist_Smart_Data *sd)
887 Elm_Gen_Item *tmp_item = NULL;
889 #if GENLIST_FX_SUPPORT
890 if (sd->fx_first_captured) return;
892 if ((sd->expanded_item) && (sd->auto_scroll_enabled))
894 tmp_item = eina_list_data_get
895 (eina_list_last(sd->expanded_item->item->items));
896 if (!tmp_item) return;
897 sd->show_item = tmp_item;
898 sd->bring_in = EINA_TRUE;
899 sd->scroll_to_type = ELM_GENLIST_ITEM_SCROLLTO_IN;
900 if ((sd->show_item->item->queued) || (!sd->show_item->item->mincalcd))
902 sd->show_item->item->show_me = EINA_TRUE;
903 sd->auto_scroll_enabled = EINA_FALSE;
911 _elm_genlist_item_odd_even_update(Elm_Gen_Item *it)
913 if (!it->item->nostacking)
915 if ((it->item->order_num_in & 0x1) ^ it->item->stacking_even)
917 if (it->deco_all_view) evas_object_lower(it->deco_all_view);
918 else evas_object_lower(VIEW(it));
922 if (it->deco_all_view) evas_object_raise(it->deco_all_view);
923 else evas_object_raise(VIEW(it));
927 if (it->item->order_num_in & 0x1)
929 edje_object_signal_emit(VIEW(it), "elm,state,odd", "elm");
930 if (it->deco_all_view)
931 edje_object_signal_emit(it->deco_all_view, "elm,state,odd", "elm");
935 edje_object_signal_emit(VIEW(it), "elm,state,even", "elm");
936 if (it->deco_all_view)
937 edje_object_signal_emit(it->deco_all_view, "elm,state,even", "elm");
942 _item_order_update(const Eina_Inlist *l,
945 Elm_Gen_Item *it, *it2;
947 for (it = ELM_GEN_ITEM_FROM_INLIST(l); l; l = l->next,
948 it = ELM_GEN_ITEM_FROM_INLIST(l))
950 it->item->order_num_in = start++;
951 _elm_genlist_item_odd_even_update(it);
952 it2 = ELM_GEN_ITEM_FROM_INLIST(l->next);
953 if (it2 && (it->item->order_num_in != it2->item->order_num_in))
959 _elm_genlist_item_state_update(Elm_Gen_Item *it,
964 if (it->selected != itc->selected)
968 if (it->deco_all_view)
969 edje_object_signal_emit
970 (it->deco_all_view, "elm,state,selected", "elm,nosound");
971 edje_object_signal_emit
972 (VIEW(it), "elm,state,selected", "elm,nosound");
973 evas_object_smart_callback_call(WIDGET(it), SIG_HIGHLIGHTED, it);
976 if (elm_widget_item_disabled_get(it) != itc->disabled)
978 if (elm_widget_item_disabled_get(it))
979 edje_object_signal_emit(VIEW(it), "elm,state,disabled", "elm");
980 if (it->deco_all_view)
981 edje_object_signal_emit
982 (it->deco_all_view, "elm,state,disabled", "elm");
984 if (it->item->expanded != itc->expanded)
986 if (it->item->expanded)
987 edje_object_signal_emit(VIEW(it), "elm,state,expanded", "elm");
988 if (it->deco_all_view)
989 edje_object_signal_emit
990 (it->deco_all_view, "elm,state,expanded", "elm");
997 if (it->deco_all_view)
998 edje_object_signal_emit
999 (it->deco_all_view, "elm,state,selected", "elm,nosound");
1000 edje_object_signal_emit
1001 (VIEW(it), "elm,state,selected", "elm,nosound");
1002 evas_object_smart_callback_call(WIDGET(it), SIG_HIGHLIGHTED, it);
1004 if (elm_widget_item_disabled_get(it))
1006 edje_object_signal_emit(VIEW(it), "elm,state,disabled", "elm");
1007 if (it->deco_all_view)
1008 edje_object_signal_emit
1009 (it->deco_all_view, "elm,state,disabled", "elm");
1011 if (it->item->expanded)
1013 edje_object_signal_emit(VIEW(it), "elm,state,expanded", "elm");
1014 if (it->deco_all_view)
1015 edje_object_signal_emit
1016 (it->deco_all_view, "elm,state,expanded", "elm");
1022 _elm_genlist_item_index_update(Elm_Gen_Item *it)
1024 if (it->position_update || it->item->block->position_update)
1026 evas_object_smart_callback_call(WIDGET(it), SIG_INDEX_UPDATE, it);
1027 it->position_update = EINA_FALSE;
1032 _item_text_realize(Elm_Gen_Item *it,
1033 Evas_Object *target,
1037 if (it->itc->func.text_get)
1043 *source = elm_widget_stringlist_get
1044 (edje_object_data_get(target, "texts"));
1045 EINA_LIST_FOREACH(*source, l, key)
1047 if (parts && fnmatch(parts, key, FNM_PERIOD))
1050 char *s = it->itc->func.text_get
1051 ((void *)it->base.data, WIDGET(it), key);
1055 edje_object_part_text_escaped_set(target, key, s);
1060 edje_object_part_text_set(target, key, "");
1067 // FIXME: difference from upstream
1069 _content_focused(void *data, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
1071 Elm_Gen_Item *it = data;
1072 if (it) it->defer_unrealize = EINA_TRUE;
1076 _content_unfocused(void *data, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
1078 Elm_Gen_Item *it = data;
1079 if (it) it->defer_unrealize = EINA_FALSE;
1084 _item_mode_content_realize(Elm_Gen_Item *it,
1085 Evas_Object *target,
1088 Eina_List **contents_list)
1090 Eina_List *res = *contents_list;
1092 if (it->itc->func.content_get)
1098 EINA_LIST_FOREACH(*source, l, key)
1100 if (parts && fnmatch(parts, key, FNM_PERIOD))
1103 ic = it->itc->func.content_get
1104 ((void *)it->base.data, WIDGET(it), key);
1108 res = eina_list_append(res, ic);
1109 edje_object_part_swallow(target, key, ic);
1110 evas_object_show(ic);
1111 #if GENLIST_ENTRY_SUPPORT
1114 // For entry or editfield
1115 // 1. Add resize callback for multiline entry.
1116 // 2. Do not unrealize it for focus issue
1117 // ps. Only for entry because of performnace
1118 if (!strcmp("elm_layout", evas_object_type_get(ic)))
1120 // If editfield style, it can have entry.
1122 edje_object_file_get(elm_layout_edje_get(ic), NULL, &group);
1123 if (group && !strncmp("elm/layout/editfield/", group, 20))
1124 it->item->unrealize_disabled = EINA_TRUE;
1126 else if (!strcmp("elm_entry", evas_object_type_get(ic)))
1127 it->item->unrealize_disabled = EINA_TRUE;
1131 // FIXME: difference from upstream
1134 // FIXME: if entry calcuates its cursor position correctly and conformant works,
1135 // genlist does not need to handle this focus thing.
1136 evas_object_smart_callback_add(ic, "focused", _content_focused, it);
1137 evas_object_smart_callback_add(ic, "unfocused", _content_unfocused, it);
1140 if (elm_widget_item_disabled_get(it))
1141 elm_widget_disabled_set(ic, EINA_TRUE);
1150 _item_state_realize(Elm_Gen_Item *it,
1151 Evas_Object *target,
1155 if (it->itc->func.state_get)
1162 *source = elm_widget_stringlist_get
1163 (edje_object_data_get(target, "states"));
1164 EINA_LIST_FOREACH(*source, l, key)
1166 if (parts && fnmatch(parts, key, FNM_PERIOD))
1169 Eina_Bool on = it->itc->func.state_get
1170 ((void *)it->base.data, WIDGET(it), key);
1174 snprintf(buf, sizeof(buf), "elm,state,%s,active", key);
1175 edje_object_signal_emit(target, buf, "elm");
1179 snprintf(buf, sizeof(buf), "elm,state,%s,passive", key);
1180 edje_object_signal_emit(target, buf, "elm");
1187 _decorate_item_unrealize(Elm_Gen_Item *it)
1189 Elm_Genlist_Smart_Data *sd = GL_IT(it)->wsd;
1190 Evas_Object *content;
1192 if (!it->item->deco_it_view) return;
1194 //evas_event_freeze(evas_object_evas_get(obj));
1195 elm_widget_stringlist_free(it->item->deco_it_texts);
1196 it->item->deco_it_texts = NULL;
1197 elm_widget_stringlist_free(it->item->deco_it_contents);
1198 it->item->deco_it_contents = NULL;
1199 elm_widget_stringlist_free(it->item->deco_it_states);
1201 EINA_LIST_FREE (it->item->deco_it_content_objs, content)
1202 evas_object_del(content);
1204 edje_object_part_unswallow(it->item->deco_it_view, VIEW(it));
1205 evas_object_smart_member_add(VIEW(it), sd->pan_obj);
1206 evas_object_del(it->item->deco_it_view);
1207 it->item->deco_it_view = NULL;
1209 if (sd->mode_item == it) sd->mode_item = NULL;
1210 //evas_event_thaw(evas_object_evas_get(obj));
1211 //evas_event_thaw_eval(evas_object_evas_get(obj));
1216 _decorate_all_item_position(Elm_Gen_Item *it,
1220 evas_object_resize(it->deco_all_view, it->item->w, it->item->h);
1221 evas_object_move(it->deco_all_view, itx, ity);
1225 _decorate_all_item_realize(Elm_Gen_Item *it,
1226 Eina_Bool effect_on)
1229 const char *stacking;
1230 const char *stacking_even;
1232 if ((!it) || (it->item->decorate_all_item_realized)) return;
1234 if (it->item->deco_it_view) _decorate_item_unrealize(it);
1236 it->deco_all_view = edje_object_add(evas_object_evas_get(WIDGET(it)));
1237 edje_object_scale_set(it->deco_all_view, elm_widget_scale_get(WIDGET(it)) *
1238 elm_config_scale_get());
1239 evas_object_smart_member_add(it->deco_all_view, GL_IT(it)->wsd->pan_obj);
1240 elm_widget_sub_object_add(WIDGET(it), it->deco_all_view);
1242 if (it->item->type & ELM_GENLIST_ITEM_TREE)
1243 strncpy(buf, "tree", sizeof(buf));
1244 else strncpy(buf, "item", sizeof(buf));
1245 if (GL_IT(it)->wsd->mode == ELM_LIST_COMPRESS)
1246 strncat(buf, "_compress", sizeof(buf) - strlen(buf));
1248 strncat(buf, "/", sizeof(buf) - strlen(buf));
1249 strncat(buf, it->itc->decorate_all_item_style, sizeof(buf) - strlen(buf));
1251 elm_widget_theme_object_set(WIDGET(it), it->deco_all_view, "genlist", buf,
1252 elm_widget_style_get(WIDGET(it)));
1254 stacking_even = edje_object_data_get(VIEW(it), "stacking_even");
1255 if (!stacking_even) stacking_even = "above";
1256 it->item->stacking_even = !!strcmp("above", stacking_even);
1258 stacking = edje_object_data_get(VIEW(it), "stacking");
1259 if (!stacking) stacking = "yes";
1260 it->item->nostacking = !!strcmp("yes", stacking);
1262 edje_object_mirrored_set
1263 (it->deco_all_view, elm_widget_mirrored_get(WIDGET(it)));
1265 _elm_genlist_item_odd_even_update(it);
1266 _elm_genlist_item_state_update(it, NULL);
1268 #if 1 // FIXME: difference from upstream
1269 if (GL_IT(it)->wsd->reorder_mode)
1271 edje_object_signal_emit
1272 (VIEW(it), "elm,state,reorder,mode_unset", "elm");
1273 edje_object_signal_emit
1274 (it->deco_all_view, "elm,state,reorder,mode_set", "elm");
1279 edje_object_signal_emit
1280 (it->deco_all_view, "elm,state,decorate,enabled,effect", "elm");
1281 edje_object_signal_emit
1282 (VIEW(it), "elm,state,decorate,enabled,effect", "elm");
1286 edje_object_signal_emit
1287 (it->deco_all_view, "elm,state,decorate,enabled", "elm");
1288 edje_object_signal_emit
1289 (VIEW(it), "elm,state,decorate,enabled", "elm");
1291 _item_mouse_callbacks_del(it, VIEW(it));
1292 _item_mouse_callbacks_add(it, it->deco_all_view);
1294 _item_text_realize(it, it->deco_all_view, &it->item->deco_all_texts, NULL);
1296 edje_object_signal_emit
1297 (it->deco_all_view, "elm,state,flip,enabled", "elm");
1298 if (!it->item->deco_all_contents)
1299 it->item->deco_all_contents = elm_widget_stringlist_get
1300 (edje_object_data_get(it->deco_all_view, "contents"));
1301 it->item->deco_all_content_objs =
1302 _item_mode_content_realize(it, it->deco_all_view,
1303 &it->item->deco_all_contents, NULL,
1304 &it->item->deco_all_content_objs);
1306 (it, it->deco_all_view, &it->item->deco_all_states, NULL);
1307 edje_object_part_swallow
1308 (it->deco_all_view, "elm.swallow.decorate.content", VIEW(it));
1310 _decorate_all_item_position(it, it->item->scrl_x, it->item->scrl_y);
1311 evas_object_show(it->deco_all_view);
1315 edje_object_signal_emit(it->deco_all_view, "elm,state,selected", "elm");
1316 evas_object_smart_callback_call(WIDGET(it), SIG_HIGHLIGHTED, it);
1319 it->item->decorate_all_item_realized = EINA_TRUE;
1320 it->want_unrealize = EINA_FALSE;
1324 _expand_toggle_signal_cb(void *data,
1325 Evas_Object *obj __UNUSED__,
1326 const char *emission __UNUSED__,
1327 const char *source __UNUSED__)
1329 Elm_Gen_Item *it = data;
1331 if (it->item->expanded)
1332 evas_object_smart_callback_call(WIDGET(it), SIG_CONTRACT_REQUEST, it);
1334 evas_object_smart_callback_call(WIDGET(it), SIG_EXPAND_REQUEST, it);
1338 _expand_signal_cb(void *data,
1339 Evas_Object *obj __UNUSED__,
1340 const char *emission __UNUSED__,
1341 const char *source __UNUSED__)
1343 Elm_Gen_Item *it = data;
1345 if (!it->item->expanded)
1346 evas_object_smart_callback_call(WIDGET(it), SIG_EXPAND_REQUEST, it);
1350 _contract_signal_cb(void *data,
1351 Evas_Object *obj __UNUSED__,
1352 const char *emission __UNUSED__,
1353 const char *source __UNUSED__)
1355 Elm_Gen_Item *it = data;
1357 if (it->item->expanded)
1358 evas_object_smart_callback_call(WIDGET(it), SIG_CONTRACT_REQUEST, it);
1361 #if GENLIST_ENTRY_SUPPORT
1363 _changed_size_hints(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
1365 Elm_Gen_Item *it = data;
1367 if (it->want_unrealize) return;
1368 GL_IT(it)->wsd->size_changed = EINA_TRUE;
1369 evas_object_smart_changed(GL_IT(it)->wsd->pan_obj);
1374 _item_content_realize(Elm_Gen_Item *it,
1375 Evas_Object *target,
1379 Eina_List *res = it->content_objs;
1381 if (it->itc->func.content_get)
1385 Evas_Object *ic = NULL;
1388 *source = elm_widget_stringlist_get
1389 (edje_object_data_get(target, "contents"));
1391 EINA_LIST_FOREACH(*source, l, key)
1393 if (parts && fnmatch(parts, key, FNM_PERIOD))
1396 if (it->itc->func.content_get)
1397 ic = it->itc->func.content_get
1398 ((void *)it->base.data, WIDGET(it), key);
1401 res = eina_list_append(res, ic);
1402 edje_object_part_swallow(target, key, ic);
1403 evas_object_show(ic);
1405 #if GENLIST_ENTRY_SUPPORT
1406 // For entry or editfield
1407 // 1. Add resize callback for multiline entry.
1408 // 2. Do not unrealize it for focus issue
1409 // ps. Only for entry because of performnace
1410 if (!strcmp("elm_layout", evas_object_type_get(ic)))
1412 // If editfield style, it can have entry.
1414 edje_object_file_get(elm_layout_edje_get(ic), NULL, &group);
1415 if (group && !strncmp("elm/layout/editfield/", group, 20))
1417 evas_object_event_callback_add
1418 (ic, EVAS_CALLBACK_CHANGED_SIZE_HINTS,
1419 _changed_size_hints, it);
1420 it->item->unrealize_disabled = EINA_TRUE;
1424 else if (!strcmp("elm_entry", evas_object_type_get(ic)))
1426 evas_object_event_callback_add
1427 (ic, EVAS_CALLBACK_CHANGED_SIZE_HINTS,
1428 _changed_size_hints, it);
1429 it->item->unrealize_disabled = EINA_TRUE;
1432 #if 0 // FIXME: difference from upstream
1435 // FIXME: if entry calcuates its cursor position correctly and conformant works,
1436 // genlist does not need to handle this focus thing.
1437 evas_object_smart_callback_add(ic, "focused", _content_focused, it);
1438 evas_object_smart_callback_add(ic, "unfocused", _content_unfocused, it);
1441 if (elm_widget_item_disabled_get(it))
1442 elm_widget_disabled_set(ic, EINA_TRUE);
1451 _access_info_cb(void *data, Evas_Object *obj __UNUSED__)
1456 Elm_Gen_Item *it = (Elm_Gen_Item *)data;
1457 ELM_GENLIST_ITEM_CHECK_OR_RETURN(it, NULL);
1459 buf = eina_strbuf_new();
1461 if (it->itc->func.text_get)
1466 if (!(it->texts)) it->texts =
1467 elm_widget_stringlist_get(edje_object_data_get(VIEW(it), "texts"));
1469 EINA_LIST_FOREACH(it->texts, l, key)
1471 char *s = it->itc->func.text_get
1472 ((void *)it->base.data, WIDGET(it), key);
1474 s = _elm_util_mkup_to_text(s);
1478 if (eina_strbuf_length_get(buf) > 0) eina_strbuf_append(buf, ", ");
1479 eina_strbuf_append(buf, s);
1485 ret = eina_strbuf_string_steal(buf);
1486 eina_strbuf_free(buf);
1491 _access_state_cb(void *data, Evas_Object *obj __UNUSED__)
1493 Elm_Gen_Item *it = (Elm_Gen_Item *)data;
1494 ELM_GENLIST_ITEM_CHECK_OR_RETURN(it, NULL);
1496 if (it->base.disabled)
1497 return strdup(E_("State: Disabled"));
1503 _access_on_highlight_cb(void *data)
1505 Evas_Coord x, y, w, h;
1506 Evas_Coord sx, sy, sw, sh;
1507 Elm_Gen_Item *it = (Elm_Gen_Item *)data;
1508 ELM_GENLIST_ITEM_CHECK_OR_RETURN(it);
1510 ELM_GENLIST_DATA_GET(it->base.widget, sd);
1512 evas_object_geometry_get(it->base.view, &x, &y, &w, &h);
1513 // XXX There would be a reason.
1514 if ((w == 0) && (h == 0)) return;
1516 evas_object_geometry_get(ELM_WIDGET_DATA(sd)->obj, &sx, &sy, &sw, &sh);
1517 if ((x < sx) || (y < sy) || ((x + w) > (sx + sw)) || ((y + h) > (sy + sh)))
1518 elm_genlist_item_bring_in((Elm_Object_Item *)it,
1519 ELM_GENLIST_ITEM_SCROLLTO_IN);
1523 _access_widget_item_register(Elm_Gen_Item *it)
1525 Elm_Access_Info *ai;
1527 _elm_access_widget_item_register((Elm_Widget_Item *)it);
1529 ai = _elm_access_object_get(it->base.access_obj);
1531 _elm_access_callback_set(ai, ELM_ACCESS_INFO, _access_info_cb, it);
1532 _elm_access_callback_set(ai, ELM_ACCESS_STATE, _access_state_cb, it);
1533 _elm_access_on_highlight_hook_set(ai, _access_on_highlight_cb, it);
1534 _elm_access_activate_callback_set(ai, _access_activate_cb, it);
1538 _item_realize(Elm_Gen_Item *it,
1542 Item_Cache *itc = NULL;
1543 const char *treesize;
1549 if (it->item->order_num_in != in)
1551 _item_order_update(EINA_INLIST_GET(it), in);
1552 _elm_genlist_item_state_update(it, NULL);
1553 _elm_genlist_item_index_update(it);
1557 it->item->order_num_in = in;
1559 if (it->item->nocache_once | it->item->nocache ||
1560 it->item->type == ELM_GENLIST_ITEM_TREE || it->parent ||
1561 !_item_cache_pop(it))
1563 const char *stacking_even;
1564 const char *stacking;
1566 it->item->nocache_once = EINA_FALSE;
1568 VIEW(it) = edje_object_add(evas_object_evas_get(WIDGET(it)));
1569 edje_object_scale_set(VIEW(it),
1570 elm_widget_scale_get(WIDGET(it)) *
1571 elm_config_scale_get());
1572 evas_object_smart_member_add(VIEW(it), GL_IT(it)->wsd->pan_obj);
1573 elm_widget_sub_object_add(WIDGET(it), VIEW(it));
1575 if (it->item->type & ELM_GENLIST_ITEM_TREE)
1576 snprintf(buf, sizeof(buf), "tree%s/%s",
1577 GL_IT(it)->wsd->mode == ELM_LIST_COMPRESS ? "_compress" :
1578 "", it->itc->item_style ? : "default");
1580 snprintf(buf, sizeof(buf), "item%s/%s",
1581 GL_IT(it)->wsd->mode == ELM_LIST_COMPRESS ? "_compress" :
1582 "", it->itc->item_style ? : "default");
1584 elm_widget_theme_object_set
1585 (WIDGET(it), VIEW(it), "genlist", buf,
1586 elm_widget_style_get(WIDGET(it)));
1588 #if 1 // FIXME: difference from upstream
1589 if (it->item->expanded_depth > 0)
1590 edje_object_signal_emit(VIEW(it), "bg_color_change", "elm");
1593 stacking_even = edje_object_data_get(VIEW(it), "stacking_even");
1594 if (!stacking_even) stacking_even = "above";
1595 it->item->stacking_even = !!strcmp("above", stacking_even);
1597 stacking = edje_object_data_get(VIEW(it), "stacking");
1598 if (!stacking) stacking = "yes";
1599 it->item->nostacking = !!strcmp("yes", stacking);
1601 edje_object_mirrored_set
1602 (VIEW(it), elm_widget_mirrored_get(WIDGET(it)));
1604 edje_object_signal_callback_add
1605 (VIEW(it), "elm,action,expand,toggle", "elm",
1606 _expand_toggle_signal_cb, it);
1607 edje_object_signal_callback_add
1608 (VIEW(it), "elm,action,expand", "elm", _expand_signal_cb, it);
1609 edje_object_signal_callback_add
1610 (VIEW(it), "elm,action,contract", "elm", _contract_signal_cb, it);
1611 _item_mouse_callbacks_add(it, VIEW(it));
1615 if (_elm_config->access_mode) _access_widget_item_register(it);
1617 _item_order_update(EINA_INLIST_GET(it), in);
1618 #if 1 // FIXME: difference from upstream
1619 if (!(it->deco_all_view) && (it->item->type != ELM_GENLIST_ITEM_GROUP))
1621 if (GL_IT(it)->wsd->reorder_mode)
1622 edje_object_signal_emit
1623 (VIEW(it), "elm,state,reorder,mode_set", "elm");
1625 edje_object_signal_emit
1626 (VIEW(it), "elm,state,reorder,mode_unset", "elm");
1629 treesize = edje_object_data_get(VIEW(it), "treesize");
1630 if (treesize) tsize = atoi(treesize);
1631 if (it->parent && GL_IT(it->parent)->type == ELM_GENLIST_ITEM_TREE &&
1632 !it->spacer && treesize)
1635 evas_object_rectangle_add(evas_object_evas_get(WIDGET(it)));
1636 evas_object_color_set(it->spacer, 0, 0, 0, 0);
1640 evas_object_size_hint_min_set
1641 (it->spacer, (it->item->expanded_depth * tsize) *
1642 elm_config_scale_get(), 1);
1643 edje_object_part_swallow(VIEW(it), "elm.swallow.pad", it->spacer);
1647 if ((GL_IT(it)->wsd->decorate_all_mode) && (!it->deco_all_view) &&
1648 (it->item->type != ELM_GENLIST_ITEM_GROUP) &&
1649 (it->itc->decorate_all_item_style))
1650 _decorate_all_item_realize(it, EINA_FALSE);
1652 _elm_genlist_item_state_update(it, itc);
1653 _elm_genlist_item_index_update(it);
1656 /* homogenous genlist shortcut */
1657 if ((calc) && (GL_IT(it)->wsd->homogeneous) && (!it->item->mincalcd) &&
1658 ((it->group && GL_IT(it)->wsd->group_item_width) ||
1659 (!it->group && GL_IT(it)->wsd->item_width)))
1663 it->item->w = it->item->minw = GL_IT(it)->wsd->group_item_width;
1664 it->item->h = it->item->minh = GL_IT(it)->wsd->group_item_height;
1668 it->item->w = it->item->minw = GL_IT(it)->wsd->item_width;
1669 it->item->h = it->item->minh = GL_IT(it)->wsd->item_height;
1671 it->item->mincalcd = EINA_TRUE;
1675 if (eina_list_count(it->content_objs) != 0)
1676 ERR_ABORT("If you see this error, please notify us and we"
1679 _item_text_realize(it, VIEW(it), &it->texts, NULL);
1681 _item_content_realize(it, VIEW(it), &it->contents, NULL);
1682 _item_state_realize(it, VIEW(it), &it->states, NULL);
1685 edje_object_signal_emit
1686 (VIEW(it), "elm,state,flip,enabled", "elm");
1687 // This is needed before contents are swallowed
1688 edje_object_message_signal_process(VIEW(it));
1690 if (!(it->item->flip_contents))
1691 it->item->flip_contents = elm_widget_stringlist_get
1692 (edje_object_data_get(VIEW(it), "flips"));
1693 it->item->flip_content_objs = _item_mode_content_realize
1694 (it, VIEW(it), &it->item->flip_contents, NULL,
1695 &it->item->flip_content_objs);
1698 /* access: unregister item which have no text and content */
1699 if (_elm_config->access_mode && !it->texts && !it->contents)
1700 _elm_access_widget_item_unregister((Elm_Widget_Item *)it);
1703 // FIXME: difference from upstream
1704 if (!it->item->mincalcd || ((GL_IT(it)->wsd->mode == ELM_LIST_COMPRESS) && (it->item->w != it->item->minw)))
1706 if (!it->item->mincalcd)
1709 Evas_Coord mw = 0, mh = 0;
1711 if (it->select_mode != ELM_OBJECT_SELECT_MODE_DISPLAY_ONLY)
1712 elm_coords_finger_size_adjust(1, &mw, 1, &mh);
1713 if (GL_IT(it)->wsd->mode == ELM_LIST_COMPRESS &&
1714 GL_IT(it)->wsd->prev_viewport_w != 0)
1715 mw = GL_IT(it)->wsd->prev_viewport_w;
1716 edje_object_size_min_restricted_calc(VIEW(it), &mw, &mh, mw, mh);
1718 it->item->w = it->item->minw = mw;
1719 it->item->h = it->item->minh = mh;
1720 it->item->mincalcd = EINA_TRUE;
1722 if ((!GL_IT(it)->wsd->group_item_width) && (it->group))
1724 GL_IT(it)->wsd->group_item_width = mw;
1725 GL_IT(it)->wsd->group_item_height = mh;
1727 else if ((!GL_IT(it)->wsd->item_width) &&
1728 (it->item->type == ELM_GENLIST_ITEM_NONE))
1730 GL_IT(it)->wsd->item_width = mw;
1731 GL_IT(it)->wsd->item_height = mh;
1734 if (!calc) evas_object_show(VIEW(it));
1737 if (it->tooltip.content_cb)
1739 elm_widget_item_tooltip_content_cb_set
1740 (it, it->tooltip.content_cb, it->tooltip.data, NULL);
1741 elm_widget_item_tooltip_style_set(it, it->tooltip.style);
1742 elm_widget_item_tooltip_window_mode_set(it, it->tooltip.free_size);
1745 if (it->mouse_cursor)
1746 elm_widget_item_cursor_set(it, it->mouse_cursor);
1748 it->realized = EINA_TRUE;
1749 it->want_unrealize = EINA_FALSE;
1751 if (!calc || it->item->unrealize_disabled)
1752 evas_object_smart_callback_call(WIDGET(it), SIG_REALIZED, it);
1754 if ((!calc) && (GL_IT(it)->wsd->decorate_all_mode) &&
1755 (it->item->type != ELM_GENLIST_ITEM_GROUP))
1757 if (it->itc->decorate_all_item_style)
1759 if (!it->deco_all_view)
1760 _decorate_all_item_realize(it, EINA_FALSE);
1761 edje_object_message_signal_process(it->deco_all_view);
1764 if ((!calc) && (it->decorate_it_set) &&
1765 (it->item->type != ELM_GENLIST_ITEM_GROUP))
1767 if (it->itc->decorate_item_style)
1769 if (!it->item->deco_it_view)
1770 _decorate_item_set(it);
1771 edje_object_message_signal_process(it->item->deco_it_view);
1774 edje_object_message_signal_process(VIEW(it));
1777 #if GENLIST_PINCH_ZOOM_SUPPORT
1779 _pinch_items_recalc(void *data)
1781 Elm_Genlist_Smart_Data *sd = data;
1786 Evas_Coord tot_y = 0, ox, oy;
1787 evas_object_geometry_get(sd->pan_obj, &ox, &oy, NULL, NULL);
1789 EINA_INLIST_FOREACH(sd->blocks, itb)
1791 EINA_LIST_FOREACH(itb->items, l, it)
1794 if (IS_ROOT_PARENT_IT(it))
1796 if (sd->pinch_zoom_mode == ELM_GEN_PINCH_ZOOM_CONTRACT)
1798 if (!it->realized) _item_realize(it, 0, EINA_FALSE);
1799 it->item->scrl_y = oy + tot_y - sd->pan_y;
1800 evas_object_resize(VIEW(it), sd->minw, it->item->h);
1801 evas_object_move(VIEW(it), it->item->scrl_x, it->item->scrl_y);
1802 evas_object_show(VIEW(it));
1803 evas_object_raise(VIEW(it));
1804 tot_y += it->item->h;
1805 sd->pinch_zoom_h = tot_y;
1808 else if (sd->pinch_zoom_mode == ELM_GEN_PINCH_ZOOM_EXPAND)
1810 evas_object_resize(VIEW(it), sd->minw, it->item->h);
1811 it->item->scrl_y = oy + it->item->pan_scrl_y - sd->pan_y;
1812 evas_object_move(VIEW(it), it->item->scrl_x, it->item->scrl_y);
1821 #if GROUP_ITEMS_FEATURE
1823 _group_items_recalc(void *data)
1827 Elm_Genlist_Smart_Data *sd = data;
1829 //evas_event_freeze(evas_object_evas_get(ELM_WIDGET_DATA(sd)->obj));
1830 EINA_LIST_FOREACH(sd->group_items, l, git)
1832 if (git->item->want_realize)
1834 if (!git->realized) _item_realize(git, 0, EINA_FALSE);
1835 evas_object_resize(VIEW(git), sd->minw, git->item->h);
1836 evas_object_move(VIEW(git), git->item->scrl_x, git->item->scrl_y);
1837 evas_object_show(VIEW(git));
1838 evas_object_raise(VIEW(git));
1840 else if (!git->item->want_realize)
1843 _item_unrealize(git, EINA_FALSE);
1846 //evas_event_thaw(evas_object_evas_get(ELM_WIDGET_DATA(sd)->obj));
1847 //evas_event_thaw_eval(evas_object_evas_get(ELM_WIDGET_DATA(sd)->obj));
1852 _reorder_move_animator_cb(void *data)
1855 Elm_Gen_Item *it = data;
1856 Eina_Bool down = EINA_FALSE;
1859 dy = 6 * elm_config_scale_get();
1860 t = ((0.0 > (t = ecore_loop_time_get()
1861 - GL_IT(it)->wsd->start_time)) ? 0.0 : t);
1863 if (t <= REORDER_EFFECT_TIME)
1864 y = (1 * sin((t / REORDER_EFFECT_TIME) * (M_PI / 2)) * dy);
1867 diff = abs(it->item->old_scrl_y - it->item->scrl_y);
1868 if (diff < dy) y = diff;
1870 if (it->item->old_scrl_y < it->item->scrl_y)
1872 it->item->old_scrl_y += y;
1875 else if (it->item->old_scrl_y > it->item->scrl_y)
1877 it->item->old_scrl_y -= y;
1881 if (it->deco_all_view)
1883 (it, it->deco_all_view, it->item->scrl_x, it->item->old_scrl_y);
1884 else if (it->item->deco_it_view)
1886 (it, it->item->deco_it_view, it->item->scrl_x, it->item->old_scrl_y);
1888 _item_position(it, VIEW(it), it->item->scrl_x, it->item->old_scrl_y);
1890 if ((GL_IT(it)->wsd->reorder_pan_move) ||
1891 (down && it->item->old_scrl_y >= it->item->scrl_y) ||
1892 (!down && it->item->old_scrl_y <= it->item->scrl_y))
1894 it->item->old_scrl_y = it->item->scrl_y;
1895 it->item->move_effect_enabled = EINA_FALSE;
1896 GL_IT(it)->wsd->reorder_move_animator = NULL;
1897 return ECORE_CALLBACK_CANCEL;
1900 return ECORE_CALLBACK_RENEW;
1904 _reorder_item_space_get(Elm_Gen_Item *it)
1906 Elm_Gen_Item *reorder_it = GL_IT(it)->wsd->reorder_it;
1907 Evas_Coord rox, roy, row, roh, oy, oh;
1908 Eina_Bool top = EINA_FALSE;
1910 if (!reorder_it) return 0;
1911 if(it->deco_all_view) evas_object_lower(it->deco_all_view);
1913 evas_object_geometry_get(GL_IT(it)->wsd->pan_obj, NULL, &oy, NULL, &oh);
1914 evas_object_geometry_get
1915 (GL_IT(it)->wsd->VIEW(reorder_it), &rox, &roy, &row, &roh);
1917 if ((GL_IT(it)->wsd->reorder_start_y < it->item->block->y) &&
1918 (roy - oy + (roh / 2) >= it->item->block->y - GL_IT(it)->wsd->pan_y))
1920 it->item->block->reorder_offset =
1921 GL_IT(it)->wsd->reorder_it->item->h * -1;
1922 if (it->item->block->count == 1)
1923 GL_IT(it)->wsd->reorder_rel = it;
1925 else if ((GL_IT(it)->wsd->reorder_start_y >= it->item->block->y) &&
1926 (roy - oy + (roh / 2) <= it->item->block->y -
1927 GL_IT(it)->wsd->pan_y))
1929 it->item->block->reorder_offset = GL_IT(it)->wsd->reorder_it->item->h;
1932 it->item->block->reorder_offset = 0;
1934 it->item->scrl_y += it->item->block->reorder_offset;
1936 top = (ELM_RECTS_INTERSECT
1937 (it->item->scrl_x, it->item->scrl_y, it->item->w, it->item->h,
1938 rox, roy + (roh / 2), row, 1));
1941 GL_IT(it)->wsd->reorder_rel = it;
1942 it->item->scrl_y += GL_IT(it)->wsd->reorder_it->item->h;
1943 return GL_IT(it)->wsd->reorder_it->item->h;
1950 _item_block_position(Item_Block *itb,
1956 Eina_Bool vis = EINA_FALSE;
1957 Evas_Coord y = 0, ox, oy, ow, oh, cvx, cvy, cvw, cvh;
1959 //evas_event_freeze(evas_object_evas_get(ELM_WIDGET_DATA(itb->sd)->obj));
1960 evas_object_geometry_get(itb->sd->pan_obj, &ox, &oy, &ow, &oh);
1961 evas_output_viewport_get
1962 (evas_object_evas_get(ELM_WIDGET_DATA(itb->sd)->obj),
1963 &cvx, &cvy, &cvw, &cvh);
1965 EINA_LIST_FOREACH(itb->items, l, it)
1967 if ((GL_IT(it)->wsd->reorder_it == it) && it->highlighted) continue;
1971 it->item->w = itb->w;
1972 it->item->scrl_x = itb->x + it->x - GL_IT(it)->wsd->pan_x + ox;
1973 it->item->scrl_y = itb->y + it->y - GL_IT(it)->wsd->pan_y + oy;
1975 vis = (ELM_RECTS_INTERSECT
1976 (it->item->scrl_x, it->item->scrl_y, it->item->w, it->item->h,
1977 cvx, cvy, cvw, cvh));
1980 if ((itb->realized) && (!it->realized))
1982 if (vis) _item_realize(it, in, EINA_FALSE);
1986 if (vis || it->dragging)
1988 #if GENLIST_ENTRY_SUPPORT
1989 evas_object_show(VIEW(it));
1991 if (GL_IT(it)->wsd->reorder_mode &&
1992 GL_IT(it)->wsd->reorder_it &&
1993 GL_IT(it)->wsd->reorder_it->highlighted)
1994 y += _reorder_item_space_get(it);
1995 git = it->item->group_item;
1998 if (git->item->scrl_y < oy)
1999 git->item->scrl_y = oy;
2000 if ((git->item->scrl_y + git->item->h) >
2001 (it->item->scrl_y + it->item->h))
2002 git->item->scrl_y = (it->item->scrl_y +
2003 it->item->h) - git->item->h;
2004 git->item->scrl_x = it->item->scrl_x;
2005 git->item->want_realize = EINA_TRUE;
2007 if ((GL_IT(it)->wsd->reorder_it) &&
2008 GL_IT(it)->wsd->reorder_it->highlighted &&
2009 (it->item->old_scrl_y != it->item->scrl_y))
2011 if (!it->item->move_effect_enabled)
2013 it->item->move_effect_enabled = EINA_TRUE;
2014 GL_IT(it)->wsd->reorder_move_animator =
2016 _reorder_move_animator_cb, it);
2019 if (!it->item->move_effect_enabled)
2021 if ((GL_IT(it)->wsd->decorate_all_mode) &&
2022 (it->itc->decorate_all_item_style))
2023 _decorate_all_item_position
2024 (it, it->item->scrl_x, it->item->scrl_y);
2027 if (it->item->deco_it_view)
2029 (it, it->item->deco_it_view,
2034 (it, VIEW(it), it->item->scrl_x,
2037 it->item->old_scrl_y = it->item->scrl_y;
2038 #if GENLIST_PINCH_ZOOM_SUPPORT
2039 if (((GL_IT(it)->wsd->pinch_zoom_mode == ELM_GEN_PINCH_ZOOM_CONTRACT)
2040 && (!IS_ROOT_PARENT_IT(it))) || (GL_IT(it)->wsd->sorting))
2042 if (it->deco_all_view) evas_object_hide(it->deco_all_view);
2043 else evas_object_hide(VIEW(it));
2051 if ((GL_IT(it)->wsd->pinch_zoom_mode == ELM_GEN_PINCH_ZOOM_CONTRACT)
2052 && (!IS_ROOT_PARENT_IT(it)))
2054 if (it->deco_all_view) evas_object_hide(it->deco_all_view);
2055 else evas_object_hide(VIEW(it));
2058 _item_unrealize(it, EINA_FALSE);
2065 if (vis) it->item->want_realize = EINA_TRUE;
2069 // FIXME: diffrence from upstream
2070 minh += it->item->minh;
2074 //evas_event_thaw(evas_object_evas_get(ELM_WIDGET_DATA(itb->sd)->obj));
2075 //evas_event_thaw_eval(evas_object_evas_get(ELM_WIDGET_DATA(itb->sd)->obj));
2079 _item_block_realize(Item_Block *itb)
2081 if (itb->realized) return;
2083 itb->realized = EINA_TRUE;
2084 itb->want_unrealize = EINA_FALSE;
2088 _changed_job(Elm_Genlist_Smart_Data *sd)
2094 Eina_Bool anything_changed = EINA_FALSE;
2095 Eina_Bool width_changed = EINA_FALSE;
2096 Eina_Bool height_changed = EINA_FALSE;
2098 EINA_INLIST_FOREACH(sd->blocks, itb)
2103 width_changed = height_changed = EINA_FALSE;
2104 EINA_LIST_FOREACH(itb->items, l2, it)
2108 Evas_Coord mw = 0, mh = 0;
2110 if (it->select_mode != ELM_OBJECT_SELECT_MODE_DISPLAY_ONLY)
2111 elm_coords_finger_size_adjust(1, &mw, 1, &mh);
2112 if (GL_IT(it)->wsd->mode == ELM_LIST_COMPRESS &&
2113 GL_IT(it)->wsd->prev_viewport_w != 0)
2114 mw = sd->prev_viewport_w;
2115 edje_object_size_min_restricted_calc(VIEW(it), &mw, &mh, mw, mh);
2117 if (it->item->w != mw)
2119 it->item->w = it->item->minw = mw;
2120 width_changed = EINA_TRUE;
2122 if (it->item->h != mh)
2124 it->item->h = it->item->minh = mh;
2125 height_changed = EINA_TRUE;
2132 if ((!sd->group_item_width) && (it->group))
2134 sd->group_item_width = mw;
2135 sd->group_item_height = mh;
2137 else if ((!sd->item_width) && (it->item->type == ELM_GENLIST_ITEM_NONE))
2139 sd->item_width = mw;
2140 sd->item_height = mh;
2147 anything_changed = EINA_TRUE;
2148 itb->changed = EINA_TRUE;
2149 _item_block_recalc(itb, num0, 0);
2150 _item_block_position(itb, num0);
2152 else if (width_changed)
2154 _item_block_position(itb, num0);
2157 if (anything_changed)
2159 if (sd->calc_job) ecore_job_del(sd->calc_job);
2160 sd->calc_job = ecore_job_add(_calc_job, sd);
2165 _elm_genlist_pan_smart_calculate(Evas_Object *obj)
2167 Evas_Coord ox, oy, ow, oh, cvx, cvy, cvw, cvh;
2168 Evas_Coord vx = 0, vy = 0, vw = 0, vh = 0;
2174 ELM_GENLIST_PAN_DATA_GET(obj, psd);
2176 //evas_event_freeze(evas_object_evas_get(obj));
2178 #if GENLIST_FX_SUPPORT
2179 if (psd->wsd->fx_playing) return;
2181 if (psd->wsd->pan_changed)
2183 _calc_job(psd->wsd);
2184 psd->wsd->pan_changed = EINA_FALSE;
2187 evas_object_geometry_get(obj, &ox, &oy, &ow, &oh);
2188 evas_output_viewport_get(evas_object_evas_get(obj), &cvx, &cvy, &cvw, &cvh);
2189 EINA_LIST_FOREACH(psd->wsd->group_items, l, git)
2191 #if GROUP_ITEMS_FEATURE
2192 git->item->want_realize = EINA_FALSE;
2194 _item_unrealize(git, EINA_TRUE);
2198 EINA_INLIST_FOREACH(psd->wsd->blocks, itb)
2200 itb->w = psd->wsd->minw;
2201 if (ELM_RECTS_INTERSECT(itb->x - psd->wsd->pan_x + ox,
2202 itb->y - psd->wsd->pan_y + oy,
2204 cvx, cvy, cvw, cvh))
2206 if ((!itb->realized) || (itb->changed))
2208 _item_block_realize(itb);
2210 // FIXME: difference from opensource
2211 if (sd->wd->calc_job) ecore_job_del(sd->wd->calc_job);
2212 sd->wd->calc_job = NULL;
2216 _item_block_position(itb, in);
2220 if (itb->realized) _item_block_unrealize(itb);
2224 #if GENLIST_PINCH_ZOOM_SUPPORT
2225 if (psd->wsd->pinch_zoom_mode) _pinch_items_recalc(psd->wsd);
2228 #if GROUP_ITEMS_FEATURE
2229 if ((!psd->wsd->reorder_it) || (psd->wsd->reorder_pan_move))
2230 _group_items_recalc(psd->wsd);
2232 if ((psd->wsd->reorder_mode) && (psd->wsd->reorder_it))
2234 if (psd->wsd->pan_y != psd->wsd->reorder_old_pan_y)
2235 psd->wsd->reorder_pan_move = EINA_TRUE;
2236 else psd->wsd->reorder_pan_move = EINA_FALSE;
2238 evas_object_raise(psd->wsd->VIEW(reorder_it));
2239 psd->wsd->reorder_old_pan_y = psd->wsd->pan_y;
2240 psd->wsd->start_time = ecore_loop_time_get();
2242 _item_auto_scroll(psd->wsd);
2244 psd->wsd->s_iface->content_pos_get(ELM_WIDGET_DATA(psd->wsd)->obj, &vx, &vy);
2245 psd->wsd->s_iface->content_viewport_size_get(ELM_WIDGET_DATA(psd->wsd)->obj,
2248 if (psd->wsd->reorder_fast == 1)
2249 psd->wsd->s_iface->content_region_show(ELM_WIDGET_DATA(psd->wsd)->obj,
2250 vx,vy - 10, vw, vh);
2251 else if (psd->wsd->reorder_fast == -1)
2252 psd->wsd->s_iface->content_region_show(ELM_WIDGET_DATA(psd->wsd)->obj,
2253 vx, vy + 10, vw, vh);
2255 if (psd->wsd->size_changed)
2257 _changed_job(psd->wsd);
2258 psd->wsd->size_changed = EINA_FALSE;
2261 #if GENLIST_FX_SUPPORT
2262 psd->wsd->rendered = EINA_TRUE;
2263 if ((psd->wsd->fx_mode) && (!psd->wsd->queue))
2265 if (_elm_genlist_fx_capture(ELM_WIDGET_DATA(psd->wsd)->obj, 1))
2266 _elm_genlist_fx_play(ELM_WIDGET_DATA(psd->wsd)->obj);
2269 #if GENLIST_PINCH_ZOOM_SUPPORT
2270 if (psd->wsd->pinch_zoom_mode == ELM_GEN_PINCH_ZOOM_EXPAND)
2271 psd->wsd->pinch_zoom_mode = ELM_GEN_PINCH_ZOOM_NONE;
2273 //evas_event_thaw(evas_object_evas_get(obj));
2274 //evas_event_thaw_eval(evas_object_evas_get(obj));
2278 _elm_genlist_pan_smart_set_user(Elm_Genlist_Pan_Smart_Class *sc)
2280 ELM_PAN_CLASS(sc)->base.add = _elm_genlist_pan_smart_add;
2281 ELM_PAN_CLASS(sc)->base.del = _elm_genlist_pan_smart_del;
2282 ELM_PAN_CLASS(sc)->base.move = _elm_genlist_pan_smart_move;
2283 ELM_PAN_CLASS(sc)->base.resize = _elm_genlist_pan_smart_resize;
2284 ELM_PAN_CLASS(sc)->base.calculate = _elm_genlist_pan_smart_calculate;
2286 ELM_PAN_CLASS(sc)->pos_set = _elm_genlist_pan_smart_pos_set;
2287 ELM_PAN_CLASS(sc)->pos_get = _elm_genlist_pan_smart_pos_get;
2288 ELM_PAN_CLASS(sc)->pos_max_get = _elm_genlist_pan_smart_pos_max_get;
2289 ELM_PAN_CLASS(sc)->pos_min_get = _elm_genlist_pan_smart_pos_min_get;
2290 ELM_PAN_CLASS(sc)->content_size_get =
2291 _elm_genlist_pan_smart_content_size_get;
2295 _item_multi_select_up(Elm_Genlist_Smart_Data *sd)
2297 Elm_Object_Item *prev;
2299 if (!sd->selected) return EINA_FALSE;
2300 if (!sd->multi) return EINA_FALSE;
2302 prev = elm_genlist_item_prev_get(sd->last_selected_item);
2303 if (!prev) return EINA_TRUE;
2305 if (elm_genlist_item_selected_get(prev))
2307 elm_genlist_item_selected_set(sd->last_selected_item, EINA_FALSE);
2308 sd->last_selected_item = prev;
2309 elm_genlist_item_show
2310 (sd->last_selected_item, ELM_GENLIST_ITEM_SCROLLTO_IN);
2314 elm_genlist_item_selected_set(prev, EINA_TRUE);
2315 elm_genlist_item_show(prev, ELM_GENLIST_ITEM_SCROLLTO_IN);
2321 _item_multi_select_down(Elm_Genlist_Smart_Data *sd)
2323 Elm_Object_Item *next;
2325 if (!sd->selected) return EINA_FALSE;
2326 if (!sd->multi) return EINA_FALSE;
2328 next = elm_genlist_item_next_get(sd->last_selected_item);
2329 if (!next) return EINA_TRUE;
2331 if (elm_genlist_item_selected_get(next))
2333 elm_genlist_item_selected_set(sd->last_selected_item, EINA_FALSE);
2334 sd->last_selected_item = next;
2335 elm_genlist_item_show
2336 (sd->last_selected_item, ELM_GENLIST_ITEM_SCROLLTO_IN);
2340 elm_genlist_item_selected_set(next, EINA_TRUE);
2341 elm_genlist_item_show(next, ELM_GENLIST_ITEM_SCROLLTO_IN);
2348 _all_items_deselect(Elm_Genlist_Smart_Data *sd)
2350 if (!sd->selected) return EINA_FALSE;
2352 while (sd->selected)
2353 elm_genlist_item_selected_set(sd->selected->data, EINA_FALSE);
2359 _item_single_select_up(Elm_Genlist_Smart_Data *sd)
2365 prev = ELM_GEN_ITEM_FROM_INLIST(sd->items->last);
2367 prev = ELM_GEN_ITEM_FROM_INLIST(EINA_INLIST_GET(prev)->prev);
2370 prev = (Elm_Gen_Item *)elm_genlist_item_prev_get
2371 (sd->last_selected_item);
2373 if (!prev) return EINA_FALSE;
2375 _all_items_deselect(sd);
2377 elm_genlist_item_selected_set((Elm_Object_Item *)prev, EINA_TRUE);
2378 elm_genlist_item_show((Elm_Object_Item *)prev, ELM_GENLIST_ITEM_SCROLLTO_IN);
2383 _item_single_select_down(Elm_Genlist_Smart_Data *sd)
2389 next = ELM_GEN_ITEM_FROM_INLIST(sd->items);
2391 next = ELM_GEN_ITEM_FROM_INLIST(EINA_INLIST_GET(next)->next);
2394 next = (Elm_Gen_Item *)elm_genlist_item_next_get
2395 (sd->last_selected_item);
2397 if (!next) return EINA_FALSE;
2399 _all_items_deselect(sd);
2401 elm_genlist_item_selected_set((Elm_Object_Item *)next, EINA_TRUE);
2402 elm_genlist_item_show
2403 ((Elm_Object_Item *)next, ELM_GENLIST_ITEM_SCROLLTO_IN);
2409 _elm_genlist_smart_event(Evas_Object *obj,
2410 Evas_Object *src __UNUSED__,
2411 Evas_Callback_Type type,
2418 Evas_Coord step_x = 0;
2419 Evas_Coord step_y = 0;
2420 Evas_Coord page_x = 0;
2421 Evas_Coord page_y = 0;
2422 Elm_Object_Item *it;
2423 Evas_Event_Key_Down *ev = event_info;
2424 Evas_Coord pan_max_x = 0, pan_max_y = 0;
2426 ELM_GENLIST_DATA_GET(obj, sd);
2428 if (type != EVAS_CALLBACK_KEY_DOWN) return EINA_FALSE;
2429 if (!sd->items) return EINA_FALSE;
2430 if (ev->event_flags & EVAS_EVENT_FLAG_ON_HOLD) return EINA_FALSE;
2431 if (elm_widget_disabled_get(obj)) return EINA_FALSE;
2433 sd->s_iface->content_pos_get(obj, &x, &y);
2434 sd->s_iface->step_size_get(obj, &step_x, &step_y);
2435 sd->s_iface->page_size_get(obj, &page_x, &page_y);
2436 sd->s_iface->content_viewport_size_get(obj, &v_w, &v_h);
2438 if ((!strcmp(ev->keyname, "Left")) ||
2439 ((!strcmp(ev->keyname, "KP_Left")) && (!ev->string)))
2443 else if ((!strcmp(ev->keyname, "Right")) ||
2444 ((!strcmp(ev->keyname, "KP_Right")) && (!ev->string)))
2448 else if ((!strcmp(ev->keyname, "Up")) ||
2449 ((!strcmp(ev->keyname, "KP_Up")) && (!ev->string)))
2451 if (((evas_key_modifier_is_set(ev->modifiers, "Shift")) &&
2452 (_item_multi_select_up(sd)))
2453 || (_item_single_select_up(sd)))
2455 ev->event_flags |= EVAS_EVENT_FLAG_ON_HOLD;
2461 else if ((!strcmp(ev->keyname, "Down")) ||
2462 ((!strcmp(ev->keyname, "KP_Down")) && (!ev->string)))
2464 if (((evas_key_modifier_is_set(ev->modifiers, "Shift")) &&
2465 (_item_multi_select_down(sd)))
2466 || (_item_single_select_down(sd)))
2468 ev->event_flags |= EVAS_EVENT_FLAG_ON_HOLD;
2474 else if ((!strcmp(ev->keyname, "Home")) ||
2475 ((!strcmp(ev->keyname, "KP_Home")) && (!ev->string)))
2477 it = elm_genlist_first_item_get(obj);
2478 elm_genlist_item_bring_in(it, ELM_GENLIST_ITEM_SCROLLTO_IN);
2479 elm_genlist_item_selected_set(it, EINA_TRUE);
2480 ev->event_flags |= EVAS_EVENT_FLAG_ON_HOLD;
2483 else if ((!strcmp(ev->keyname, "End")) ||
2484 ((!strcmp(ev->keyname, "KP_End")) && (!ev->string)))
2486 it = elm_genlist_last_item_get(obj);
2487 elm_genlist_item_bring_in(it, ELM_GENLIST_ITEM_SCROLLTO_IN);
2488 elm_genlist_item_selected_set(it, EINA_TRUE);
2489 ev->event_flags |= EVAS_EVENT_FLAG_ON_HOLD;
2492 else if ((!strcmp(ev->keyname, "Prior")) ||
2493 ((!strcmp(ev->keyname, "KP_Prior")) && (!ev->string)))
2496 y -= -(page_y * v_h) / 100;
2500 else if ((!strcmp(ev->keyname, "Next")) ||
2501 ((!strcmp(ev->keyname, "KP_Next")) && (!ev->string)))
2504 y += -(page_y * v_h) / 100;
2508 else if (!strcmp(ev->keyname, "Escape"))
2510 if (!_all_items_deselect(sd)) return EINA_FALSE;
2511 ev->event_flags |= EVAS_EVENT_FLAG_ON_HOLD;
2514 else if (((!strcmp(ev->keyname, "Return")) ||
2515 (!strcmp(ev->keyname, "KP_Enter")) ||
2516 (!strcmp(ev->keyname, "space")))
2517 && (!sd->multi) && (sd->selected))
2519 it = elm_genlist_selected_item_get(obj);
2520 elm_genlist_item_expanded_set(it, !elm_genlist_item_expanded_get(it));
2521 evas_object_smart_callback_call(WIDGET(it), SIG_ACTIVATED, it);
2523 else return EINA_FALSE;
2525 ev->event_flags |= EVAS_EVENT_FLAG_ON_HOLD;
2526 _elm_genlist_pan_smart_pos_max_get(sd->pan_obj, &pan_max_x, &pan_max_y);
2528 if (x > pan_max_x) x = pan_max_x;
2530 if (y > pan_max_y) y = pan_max_y;
2532 sd->s_iface->content_pos_set(obj, x, y, EINA_TRUE);
2538 _elm_genlist_smart_sub_object_add(Evas_Object *obj,
2541 Elm_Widget_Smart_Class *parent_parent;
2543 parent_parent = (Elm_Widget_Smart_Class *)((Evas_Smart_Class *)
2544 _elm_genlist_parent_sc)->parent;
2546 /* skipping layout's code, which registers size hint changing
2547 * callback on sub objects. this is here because items'
2548 * content_get() routines may change hints on the objects after
2549 * creation, thus issuing TOO MANY sizing_eval()'s here. they are
2550 * not needed at here anyway, so let's skip listening to those
2552 if (!parent_parent->sub_object_add(obj, sobj))
2559 _elm_genlist_smart_sub_object_del(Evas_Object *obj,
2562 ELM_GENLIST_DATA_GET(obj, sd);
2564 /* XXX: hack -- also skipping sizing recalculation on
2565 * sub-object-del. genlist's crazy code paths (like groups and
2566 * such) seem to issue a whole lot of deletions and Evas bitches
2567 * about too many recalculations */
2568 sd->on_sub_del = EINA_TRUE;
2570 if (!ELM_WIDGET_CLASS(_elm_genlist_parent_sc)->sub_object_del(obj, sobj))
2573 sd->on_sub_del = EINA_FALSE;
2579 _elm_genlist_smart_on_focus(Evas_Object *obj)
2581 ELM_GENLIST_DATA_GET(obj, sd);
2583 if (!ELM_WIDGET_CLASS(_elm_genlist_parent_sc)->on_focus(obj))
2586 if (elm_widget_focus_get(obj) && (sd->items) && (sd->selected) &&
2587 (!sd->last_selected_item))
2588 sd->last_selected_item = eina_list_data_get(sd->selected);
2594 _elm_genlist_smart_focus_next(const Evas_Object *obj,
2595 Elm_Focus_Direction dir,
2598 Evas_Coord x, y, w, h;
2599 Evas_Coord sx, sy, sw, sh;
2601 Eina_List *items = NULL;
2602 Eina_Bool done = EINA_FALSE;
2604 ELM_GENLIST_CHECK(obj) EINA_FALSE;
2605 ELM_GENLIST_DATA_GET(obj, sd);
2607 evas_object_geometry_get(ELM_WIDGET_DATA(sd)->obj, &sx, &sy, &sw, &sh);
2609 EINA_INLIST_FOREACH(sd->blocks, itb)
2617 EINA_LIST_FOREACH(itb->items, l, it)
2621 evas_object_geometry_get(it->base.view, &x, &y, &w, &h);
2623 /* check item which displays more than half of its size */
2624 if (ELM_RECTS_INTERSECT
2625 (x + (w / 2), y + (h / 2), 0, 0, sx, sy, sw, sh))
2626 items = eina_list_append(items, it->base.access_obj);
2628 if (!it->base.access_order) continue;
2632 EINA_LIST_FOREACH(it->base.access_order, subl, subo)
2633 items = eina_list_append(items, subo);
2637 else if (done) break;
2640 return elm_widget_focus_list_next_get
2641 (obj, items, eina_list_data_get, dir, next);
2645 _mirrored_set(Evas_Object *obj,
2648 ELM_GENLIST_DATA_GET(obj, sd);
2650 sd->s_iface->mirrored_set(obj, rtl);
2654 _elm_genlist_smart_theme(Evas_Object *obj)
2658 ELM_GENLIST_DATA_GET(obj, sd);
2660 if (!ELM_WIDGET_CLASS(_elm_genlist_parent_sc)->theme(obj))
2663 //evas_event_freeze(evas_object_evas_get(ELM_WIDGET_DATA(sd)->obj));
2664 _item_cache_all_free(sd);
2665 _mirrored_set(obj, elm_widget_mirrored_get(obj));
2668 // FIXME: difference from opensource
2669 elm_layout_theme_set(obj, "genlist", "base", elm_widget_style_get(obj));
2672 sd->item_width = sd->item_height = 0;
2673 sd->group_item_width = sd->group_item_height = 0;
2674 sd->minw = sd->minh = sd->realminw = 0;
2675 EINA_INLIST_FOREACH(sd->blocks, itb)
2680 if (itb->realized) _item_block_unrealize(itb);
2681 EINA_LIST_FOREACH(itb->items, l, it)
2682 it->item->mincalcd = EINA_FALSE;
2684 itb->changed = EINA_TRUE;
2686 if (sd->calc_job) ecore_job_del(sd->calc_job);
2687 sd->calc_job = NULL;
2688 elm_layout_sizing_eval(obj);
2689 sd->pan_changed = EINA_TRUE;
2690 evas_object_smart_changed(sd->pan_obj);
2691 //evas_event_thaw(evas_object_evas_get(ELM_WIDGET_DATA(sd)->obj));
2692 //evas_event_thaw_eval(evas_object_evas_get(ELM_WIDGET_DATA(sd)->obj));
2697 /* FIXME: take off later. maybe this show region coords belong in the
2698 * interface (new api functions, set/get)? */
2700 _show_region_hook(void *data,
2703 Evas_Coord x, y, w, h;
2705 ELM_GENLIST_DATA_GET(data, sd);
2707 elm_widget_show_region_get(obj, &x, &y, &w, &h);
2708 //x & y are screen coordinates, Add with pan coordinates
2711 sd->s_iface->content_region_show(obj, x, y, w, h);
2715 _elm_genlist_smart_translate(Evas_Object *obj)
2717 evas_object_smart_callback_call(obj, "language,changed", NULL);
2723 _item_highlight(Elm_Gen_Item *it)
2725 const char *selectraise;
2726 Elm_Genlist_Smart_Data *sd = GL_IT(it)->wsd;
2728 if (elm_widget_item_disabled_get(it)) return;
2729 if ((sd->select_mode == ELM_OBJECT_SELECT_MODE_NONE) ||
2730 (sd->select_mode == ELM_OBJECT_SELECT_MODE_DISPLAY_ONLY ) ||
2731 (it->select_mode == ELM_OBJECT_SELECT_MODE_NONE) ||
2732 (it->select_mode == ELM_OBJECT_SELECT_MODE_DISPLAY_ONLY ))
2735 if (!sd->highlight || it->highlighted) return;
2736 #if GENLIST_PINCH_ZOOM_SUPPORT
2737 if (sd->pinch_zoom_mode) return;
2740 selectraise = edje_object_data_get(VIEW(it), "selectraise");
2741 if ((selectraise) && (!strcmp(selectraise, "on")))
2743 if (it->deco_all_view) evas_object_raise(it->deco_all_view);
2744 else evas_object_raise(VIEW(it));
2745 if ((it->item->group_item) && (it->item->group_item->realized))
2746 evas_object_raise(it->item->VIEW(group_item));
2748 it->highlighted = EINA_TRUE;
2750 if (it->deco_all_view)
2751 edje_object_signal_emit(it->deco_all_view, "elm,state,selected", "elm");
2752 edje_object_signal_emit(VIEW(it), "elm,state,selected", "elm");
2753 evas_object_smart_callback_call(WIDGET(it), SIG_HIGHLIGHTED, it);
2757 _item_unhighlight(Elm_Gen_Item *it)
2759 if (!it->highlighted) return;
2761 if (!it->item->nostacking)
2763 if ((it->item->order_num_in & 0x1) ^ it->item->stacking_even)
2765 if (it->deco_all_view) evas_object_lower(it->deco_all_view);
2766 else evas_object_lower(VIEW(it));
2770 if (it->deco_all_view) evas_object_raise(it->deco_all_view);
2771 else evas_object_raise(VIEW(it));
2774 it->highlighted = EINA_FALSE;
2776 if (it->deco_all_view)
2777 edje_object_signal_emit(it->deco_all_view, "elm,state,unselected", "elm");
2778 edje_object_signal_emit(VIEW(it), "elm,state,unselected", "elm");
2779 evas_object_smart_callback_call(WIDGET(it), SIG_UNHIGHLIGHTED, it);
2783 _item_unselect(Elm_Gen_Item *it)
2785 Elm_Genlist_Smart_Data *sd = GL_IT(it)->wsd;
2786 _item_unhighlight(it);
2787 if (!it->selected) return;
2789 it->selected = EINA_FALSE;
2790 sd->selected = eina_list_remove(sd->selected, it);
2791 evas_object_smart_callback_call(WIDGET(it), SIG_UNSELECTED, it);
2795 _item_select(Elm_Gen_Item *it)
2797 Evas_Object *obj = WIDGET(it);
2798 Elm_Genlist_Smart_Data *sd = GL_IT(it)->wsd;
2799 if (elm_widget_item_disabled_get(it)) return;
2800 if ((sd->select_mode == ELM_OBJECT_SELECT_MODE_NONE) ||
2801 (sd->select_mode == ELM_OBJECT_SELECT_MODE_DISPLAY_ONLY) ||
2802 (it->select_mode == ELM_OBJECT_SELECT_MODE_NONE) ||
2803 (it->select_mode == ELM_OBJECT_SELECT_MODE_DISPLAY_ONLY))
2806 #if GENLIST_PINCH_ZOOM_SUPPORT
2807 if (IS_ROOT_PARENT_IT(it) && (sd->pinch_zoom_mode == ELM_GEN_PINCH_ZOOM_CONTRACT))
2809 elm_genlist_pinch_zoom_mode_set(obj, ELM_GEN_PINCH_ZOOM_EXPAND);
2810 elm_genlist_item_show((Elm_Object_Item *)it, ELM_GENLIST_ITEM_SCROLLTO_TOP);
2816 // FIXME: difference from upstream
2817 if ((GL_IT(it)->wsd->last_selected_item) &&
2818 (it != (Elm_Gen_Item *) GL_IT(it)->wsd->last_selected_item))
2819 _item_unfocusable_set
2820 ((Elm_Gen_Item *)GL_IT(it)->wsd->last_selected_item, EINA_TRUE);
2823 // Do not check selected because always select mode can be used
2824 _item_highlight(it);
2825 it->selected = EINA_TRUE;
2826 sd->selected = eina_list_append(sd->selected, it);
2827 sd->last_selected_item = (Elm_Object_Item *)it;
2829 if (it->func.func) it->func.func((void *)it->func.data, obj, it);
2830 if (!EINA_MAGIC_CHECK((Elm_Widget_Item *)it, ELM_WIDGET_ITEM_MAGIC))
2832 evas_object_smart_callback_call(WIDGET(it), SIG_SELECTED, it);
2836 _item_select_unselect(Elm_Gen_Item *it, Eina_Bool selected)
2838 Elm_Genlist_Smart_Data *sd = GL_IT(it)->wsd;
2839 Evas_Object *obj = ELM_WIDGET_DATA(sd)->obj;
2840 if (elm_widget_item_disabled_get(it)) return;
2842 evas_object_ref(obj);
2845 const Eina_List *l, *ll;
2847 EINA_LIST_FOREACH_SAFE(sd->selected, l, ll, it2)
2848 if (it2 != it) _item_unselect(it2);
2850 if (selected) _item_select(it);
2851 else _item_unselect(it);
2852 evas_object_unref(obj);
2856 _item_block_position_update(Eina_Inlist *list,
2861 EINA_INLIST_FOREACH(list, tmp)
2863 tmp->position = idx++;
2864 tmp->position_update = EINA_TRUE;
2869 _item_position_update(Eina_List *list,
2875 EINA_LIST_FOREACH(list, l, it)
2877 it->position = idx++;
2878 it->position_update = EINA_TRUE;
2883 _item_block_merge(Item_Block *left,
2889 EINA_LIST_FOREACH(right->items, l, it2)
2891 it2->item->block = left;
2893 left->changed = EINA_TRUE;
2895 left->items = eina_list_merge(left->items, right->items);
2899 _item_block_del(Elm_Gen_Item *it)
2902 Item_Block *itb = it->item->block;
2903 Eina_Bool block_changed = EINA_FALSE;
2905 itb->items = eina_list_remove(itb->items, it);
2907 itb->changed = EINA_TRUE;
2908 if (GL_IT(it)->wsd->calc_job) ecore_job_del(GL_IT(it)->wsd->calc_job);
2909 GL_IT(it)->wsd->calc_job = ecore_job_add(_calc_job, GL_IT(it)->wsd);
2914 il = EINA_INLIST_GET(itb);
2915 itbn = (Item_Block *)(il->next);
2917 it->parent->item->items =
2918 eina_list_remove(it->parent->item->items, it);
2921 _item_block_position_update(il->next, itb->position);
2923 GL_IT(it)->wsd->blocks =
2924 eina_inlist_remove(GL_IT(it)->wsd->blocks, il);
2927 if (itbn) itbn->changed = EINA_TRUE;
2931 if (itb->count < (itb->sd->max_items_per_block / 2))
2936 il = EINA_INLIST_GET(itb);
2937 itbp = (Item_Block *)(il->prev);
2938 itbn = (Item_Block *)(il->next);
2940 /* merge block with previous */
2942 ((itbp->count + itb->count) <
2943 (itb->sd->max_items_per_block +
2944 (itb->sd->max_items_per_block / 2))))
2946 _item_block_merge(itbp, itb);
2947 _item_block_position_update
2948 (EINA_INLIST_GET(itb)->next, itb->position);
2949 GL_IT(it)->wsd->blocks = eina_inlist_remove
2950 (GL_IT(it)->wsd->blocks, EINA_INLIST_GET(itb));
2952 block_changed = EINA_TRUE;
2954 /* merge block with next */
2956 ((itbn->count + itb->count) <
2957 (itb->sd->max_items_per_block +
2958 (itb->sd->max_items_per_block / 2))))
2960 _item_block_merge(itb, itbn);
2961 _item_block_position_update
2962 (EINA_INLIST_GET(itbn)->next, itbn->position);
2963 GL_IT(it)->wsd->blocks =
2964 eina_inlist_remove(GL_IT(it)->wsd->blocks,
2965 EINA_INLIST_GET(itbn));
2967 block_changed = EINA_TRUE;
2974 GL_IT(it)->wsd->pan_changed = EINA_TRUE;
2975 evas_object_smart_changed(GL_IT(it)->wsd->pan_obj);
2976 if (GL_IT(it)->wsd->calc_job) ecore_job_del(GL_IT(it)->wsd->calc_job);
2977 GL_IT(it)->wsd->calc_job = NULL;
2979 #if GENLIST_FX_SUPPORT
2980 it->item->block = NULL;
2985 _decorate_all_item_unrealize(Elm_Gen_Item *it)
2989 if ((!it) || (!it->item->decorate_all_item_realized)) return;
2991 #if GENLIST_FX_SUPPORT
2992 if ((GL_IT(it)->has_proxy_it) && (!GL_IT(it)->wsd->genlist_clearing))
2994 if (!eina_list_data_find(GL_IT(it)->wsd->pending_unrealized_decorate_all_items, it))
2995 GL_IT(it)->wsd->pending_unrealized_decorate_all_items =
2996 eina_list_append(GL_IT(it)->wsd->pending_unrealized_decorate_all_items, it);
3001 edje_object_part_unswallow(it->deco_all_view, VIEW(it));
3002 evas_object_smart_member_add(VIEW(it), GL_IT(it)->wsd->pan_obj);
3003 elm_widget_sub_object_add(WIDGET(it), VIEW(it));
3004 _elm_genlist_item_odd_even_update(it);
3005 _elm_genlist_item_state_update(it, NULL);
3007 edje_object_signal_emit
3008 (it->deco_all_view, "elm,state,decorate,disabled", "elm");
3009 edje_object_signal_emit
3010 (VIEW(it), "elm,state,decorate,disabled", "elm");
3011 if (it->item->wsd->reorder_mode)
3013 edje_object_signal_emit
3014 (VIEW(it), "elm,state,reorder,mode_set", "elm");
3015 edje_object_signal_emit
3016 (it->deco_all_view, "elm,state,reorder,mode_unset", "elm");
3019 edje_object_message_signal_process(VIEW(it));
3020 edje_object_message_signal_process(it->deco_all_view);
3022 evas_object_del(it->deco_all_view);
3023 it->deco_all_view = NULL;
3024 elm_widget_stringlist_free(it->item->deco_all_texts);
3025 it->item->deco_all_texts = NULL;
3026 elm_widget_stringlist_free(it->item->deco_all_contents);
3027 it->item->deco_all_contents = NULL;
3028 elm_widget_stringlist_free(it->item->deco_all_states);
3029 it->item->deco_all_states = NULL;
3030 EINA_LIST_FREE (it->item->deco_all_content_objs, icon)
3031 evas_object_del(icon);
3033 _item_mouse_callbacks_del(it, it->deco_all_view);
3034 _item_mouse_callbacks_add(it, VIEW(it));
3036 it->item->decorate_all_item_realized = EINA_FALSE;
3040 _item_free_common(Elm_Gen_Item *it)
3042 Elm_Genlist_Smart_Data *sd = GL_IT(it)->wsd;
3043 elm_widget_item_pre_notify_del(it);
3044 if (it->itc->func.del)
3045 it->itc->func.del((void *)it->base.data, WIDGET(it));
3046 if (it->tooltip.del_cb)
3047 it->tooltip.del_cb((void *)it->tooltip.data, WIDGET(it), it);
3048 if (it->item->block) _item_block_del(it);
3050 it->parent->item->items =
3051 eina_list_remove(it->parent->item->items, it);
3052 if (it->item->queued) sd->queue = eina_list_remove(sd->queue, it);
3053 if (it->group) sd->group_items = eina_list_remove(sd->group_items, it);
3055 // FIXME: relative will be better to be fixed. it is too harsh.
3057 it->item->rel->item->rel_revs =
3058 eina_list_remove(it->item->rel->item->rel_revs, it);
3059 if (it->item->rel_revs)
3062 EINA_LIST_FREE(it->item->rel_revs, tmp) tmp->item->rel = NULL;
3064 _item_sub_items_clear(it);
3066 #if GENLIST_ENTRY_SUPPORT
3067 it->item->unrealize_disabled = EINA_FALSE;
3070 if (it->selected) sd->selected = eina_list_remove(sd->selected, it);
3071 if (sd->show_item == it) sd->show_item = NULL;
3072 if (sd->anchor_item == it)
3075 ELM_GEN_ITEM_FROM_INLIST(EINA_INLIST_GET(it)->next);
3076 if (!sd->anchor_item) sd->anchor_item =
3077 ELM_GEN_ITEM_FROM_INLIST(EINA_INLIST_GET(it)->prev);
3079 if (sd->expanded_item == it) sd->expanded_item = NULL;
3080 if (sd->expanded_next_item == it) sd->expanded_next_item = NULL;
3081 if (sd->state) eina_inlist_sorted_state_free(sd->state);
3083 if (sd->last_selected_item == (Elm_Object_Item *)it)
3084 sd->last_selected_item = NULL;
3088 ecore_timer_del(it->long_timer);
3089 it->long_timer = NULL;
3091 if (it->item->swipe_timer) ecore_timer_del(it->item->swipe_timer);
3093 sd->items = eina_inlist_remove(sd->items, EINA_INLIST_GET(it));
3098 _item_mouse_move_cb(void *data,
3099 Evas *evas __UNUSED__,
3103 EINA_SAFETY_ON_NULL_RETURN(data);
3104 Elm_Gen_Item *it = data;
3105 Elm_Genlist_Smart_Data *sd;
3106 Evas_Event_Mouse_Move *ev = event_info;
3107 Evas_Coord ox, oy, ow, oh, it_scrl_y, y_pos;
3108 Evas_Coord minw = 0, minh = 0, x, y, dx, dy, adx, ady;
3110 sd = GL_IT(it)->wsd;
3112 if (ev->event_flags & EVAS_EVENT_FLAG_ON_HOLD)
3114 if (!sd->on_hold) _item_unselect(it);
3115 sd->on_hold = EINA_TRUE;
3117 if (sd->multi_touched)
3119 sd->cur_x = ev->cur.canvas.x;
3120 sd->cur_y = ev->cur.canvas.y;
3123 if ((it->dragging) && (it->down))
3125 if (sd->movements == SWIPE_MOVES)
3126 sd->swipe = EINA_TRUE;
3129 sd->history[sd->movements].x = ev->cur.canvas.x;
3130 sd->history[sd->movements].y = ev->cur.canvas.y;
3131 if (abs((sd->history[sd->movements].x -
3132 sd->history[0].x)) > 40)
3133 sd->swipe = EINA_TRUE;
3139 ecore_timer_del(it->long_timer);
3140 it->long_timer = NULL;
3142 evas_object_smart_callback_call(WIDGET(it), SIG_DRAG, it);
3145 if ((!it->down) || (sd->longpressed))
3149 ecore_timer_del(it->long_timer);
3150 it->long_timer = NULL;
3152 if ((sd->reorder_mode) && (sd->reorder_it))
3154 evas_object_geometry_get(sd->pan_obj, &ox, &oy, &ow, &oh);
3156 if (ev->cur.canvas.y < (oy + (sd->reorder_it->item->h / 2)))
3157 sd->reorder_fast = 1;
3158 else if (ev->cur.canvas.y > (oy + oh - (sd->reorder_it->item->h / 2)))
3159 sd->reorder_fast = -1;
3160 else sd->reorder_fast = 0;
3162 it_scrl_y = ev->cur.canvas.y - sd->reorder_it->dy;
3164 if (!sd->reorder_start_y)
3165 sd->reorder_start_y = it->item->block->y + it->y;
3169 else if (it_scrl_y + sd->reorder_it->item->h > oy + oh)
3170 y_pos = oy + oh - sd->reorder_it->item->h;
3174 if (it->deco_all_view)
3175 _item_position(it, it->deco_all_view, it->item->scrl_x, y_pos);
3176 else if (it->item->deco_it_view)
3178 (it, it->item->deco_it_view, it->item->scrl_x, y_pos);
3180 _item_position(it, VIEW(it), it->item->scrl_x, y_pos);
3182 if (sd->calc_job) ecore_job_del(sd->calc_job);
3183 sd->calc_job = ecore_job_add(_calc_job, sd);
3187 if (it->select_mode != ELM_OBJECT_SELECT_MODE_DISPLAY_ONLY)
3188 elm_coords_finger_size_adjust(1, &minw, 1, &minh);
3190 evas_object_geometry_get(obj, &x, &y, NULL, NULL);
3191 x = ev->cur.canvas.x - x;
3192 y = ev->cur.canvas.y - y;
3195 if (adx < 0) adx = -dx;
3199 if (ady < 0) ady = -dy;
3203 if ((adx > minw) || (ady > minh))
3205 it->dragging = EINA_TRUE;
3208 ecore_timer_del(it->long_timer);
3209 it->long_timer = NULL;
3214 evas_object_smart_callback_call
3215 (WIDGET(it), SIG_DRAG_START_UP, it);
3219 evas_object_smart_callback_call
3220 (WIDGET(it), SIG_DRAG_START_LEFT, it);
3222 evas_object_smart_callback_call
3223 (WIDGET(it), SIG_DRAG_START_RIGHT, it);
3229 evas_object_smart_callback_call
3230 (WIDGET(it), SIG_DRAG_START_DOWN, it);
3234 evas_object_smart_callback_call
3235 (WIDGET(it), SIG_DRAG_START_LEFT, it);
3237 evas_object_smart_callback_call
3238 (WIDGET(it), SIG_DRAG_START_RIGHT, it);
3245 _long_press_cb(void *data)
3247 Elm_Gen_Item *it = data, *it2;
3248 Elm_Genlist_Smart_Data *sd;
3251 sd = GL_IT(it)->wsd;
3253 it->long_timer = NULL;
3254 if (elm_widget_item_disabled_get(it) || (it->dragging) ||
3255 (it->select_mode == ELM_OBJECT_SELECT_MODE_DISPLAY_ONLY))
3256 return ECORE_CALLBACK_CANCEL;
3258 GL_IT(it)->wsd->longpressed = EINA_TRUE;
3259 evas_object_smart_callback_call(WIDGET(it), SIG_LONGPRESSED, it);
3260 if ((GL_IT(it)->wsd->reorder_mode) && (!it->group))
3262 GL_IT(it)->wsd->reorder_it = it;
3263 GL_IT(it)->wsd->reorder_start_y = 0;
3264 if (it->deco_all_view)
3265 evas_object_raise(it->deco_all_view);
3267 evas_object_raise(VIEW(it));
3269 sd->s_iface->hold_set(ELM_WIDGET_DATA(sd)->obj, EINA_TRUE);
3270 sd->s_iface->bounce_allow_set
3271 (ELM_WIDGET_DATA(sd)->obj, EINA_FALSE, EINA_FALSE);
3273 EINA_LIST_FOREACH_SAFE(sd->selected, l, ll, it2)
3275 if (it != it2) _item_unselect(it2);
3278 // FIXME: difference from opensource
3279 if (it->item->items)
3281 EINA_LIST_FOREACH(it->item->items, l, it_tmp)
3283 if (elm_genlist_item_expanded_get((Elm_Object_Item *) it_tmp))
3285 elm_genlist_item_expanded_set((Elm_Object_Item *)it_tmp,
3287 return ECORE_CALLBACK_RENEW;
3292 if (elm_genlist_item_expanded_get((Elm_Object_Item *)it))
3294 elm_genlist_item_expanded_set((Elm_Object_Item *)it, EINA_FALSE);
3295 return ECORE_CALLBACK_RENEW;
3298 if (!GL_IT(it)->wsd->decorate_all_mode)
3299 edje_object_signal_emit
3300 (VIEW(it), "elm,state,reorder,enabled", "elm");
3303 return ECORE_CALLBACK_CANCEL;
3307 _swipe_do(Elm_Gen_Item *it)
3312 if ((it->select_mode == ELM_OBJECT_SELECT_MODE_DISPLAY_ONLY) ||
3313 elm_widget_item_disabled_get(it)) return;
3315 GL_IT(it)->wsd->swipe = EINA_FALSE;
3316 for (i = 0; i < GL_IT(it)->wsd->movements; i++)
3318 sum += GL_IT(it)->wsd->history[i].x;
3319 if (abs(GL_IT(it)->wsd->history[0].y -
3320 GL_IT(it)->wsd->history[i].y) > 10) return;
3323 sum /= GL_IT(it)->wsd->movements;
3324 if (abs(sum - GL_IT(it)->wsd->history[0].x) <= 10) return;
3325 evas_object_smart_callback_call(WIDGET(it), SIG_SWIPE, it);
3329 _swipe_cancel(void *data)
3331 Elm_Gen_Item *it = data;
3333 if (!it) return ECORE_CALLBACK_CANCEL;
3334 GL_IT(it)->wsd->swipe = EINA_FALSE;
3335 GL_IT(it)->wsd->movements = 0;
3337 return ECORE_CALLBACK_RENEW;
3341 _multi_cancel(void *data)
3343 Elm_Genlist_Smart_Data *sd = data;
3345 if (!sd) return ECORE_CALLBACK_CANCEL;
3346 sd->multi_timeout = EINA_TRUE;
3348 return ECORE_CALLBACK_RENEW;
3352 _multi_touch_gesture_eval(void *data)
3354 Elm_Gen_Item *it = data;
3355 Evas_Coord minw = 0, minh = 0;
3356 Evas_Coord off_x, off_y, off_mx, off_my;
3358 GL_IT(it)->wsd->multi_touched = EINA_FALSE;
3359 if (GL_IT(it)->wsd->multi_timer)
3361 ecore_timer_del(GL_IT(it)->wsd->multi_timer);
3362 GL_IT(it)->wsd->multi_timer = NULL;
3364 if (GL_IT(it)->wsd->multi_timeout)
3366 GL_IT(it)->wsd->multi_timeout = EINA_FALSE;
3370 elm_coords_finger_size_adjust(1, &minw, 1, &minh);
3371 off_x = abs(GL_IT(it)->wsd->cur_x - GL_IT(it)->wsd->prev_x);
3372 off_y = abs(GL_IT(it)->wsd->cur_y - GL_IT(it)->wsd->prev_y);
3373 off_mx = abs(GL_IT(it)->wsd->cur_mx - GL_IT(it)->wsd->prev_mx);
3374 off_my = abs(GL_IT(it)->wsd->cur_my - GL_IT(it)->wsd->prev_my);
3376 if (((off_x > minw) || (off_y > minh)) && ((off_mx > minw)
3377 || (off_my > minh)))
3379 if ((off_x + off_mx) > (off_y + off_my))
3381 if ((GL_IT(it)->wsd->cur_x > GL_IT(it)->wsd->prev_x)
3382 && (GL_IT(it)->wsd->cur_mx > GL_IT(it)->wsd->prev_mx))
3383 evas_object_smart_callback_call
3384 (WIDGET(it), SIG_MULTI_SWIPE_RIGHT, it);
3385 else if ((GL_IT(it)->wsd->cur_x < GL_IT(it)->wsd->prev_x)
3386 && (GL_IT(it)->wsd->cur_mx < GL_IT(it)->wsd->prev_mx))
3387 evas_object_smart_callback_call
3388 (WIDGET(it), SIG_MULTI_SWIPE_LEFT, it);
3389 else if (abs(GL_IT(it)->wsd->cur_x - GL_IT(it)->wsd->cur_mx) >
3390 abs(GL_IT(it)->wsd->prev_x - GL_IT(it)->wsd->prev_mx))
3391 evas_object_smart_callback_call
3392 (WIDGET(it), SIG_MULTI_PINCH_OUT, it);
3394 evas_object_smart_callback_call
3395 (WIDGET(it), SIG_MULTI_PINCH_IN, it);
3399 if ((GL_IT(it)->wsd->cur_y > GL_IT(it)->wsd->prev_y)
3400 && (GL_IT(it)->wsd->cur_my > GL_IT(it)->wsd->prev_my))
3401 evas_object_smart_callback_call
3402 (WIDGET(it), SIG_MULTI_SWIPE_DOWN, it);
3403 else if ((GL_IT(it)->wsd->cur_y < GL_IT(it)->wsd->prev_y)
3404 && (GL_IT(it)->wsd->cur_my < GL_IT(it)->wsd->prev_my))
3405 evas_object_smart_callback_call
3406 (WIDGET(it), SIG_MULTI_SWIPE_UP, it);
3407 else if (abs(GL_IT(it)->wsd->cur_y - GL_IT(it)->wsd->cur_my) >
3408 abs(GL_IT(it)->wsd->prev_y - GL_IT(it)->wsd->prev_my))
3410 evas_object_smart_callback_call
3411 (WIDGET(it), SIG_MULTI_PINCH_OUT, it);
3412 #if GENLIST_PINCH_ZOOM_SUPPORT
3413 if (IS_ROOT_PARENT_IT(it) && (GL_IT(it)->wsd->pinch_zoom_mode == ELM_GEN_PINCH_ZOOM_CONTRACT))
3415 elm_genlist_pinch_zoom_mode_set(ELM_WIDGET_DATA(GL_IT(it)->wsd)->obj, ELM_GEN_PINCH_ZOOM_EXPAND);
3416 elm_genlist_item_show((Elm_Object_Item *)it, ELM_GENLIST_ITEM_SCROLLTO_TOP);
3422 evas_object_smart_callback_call
3423 (WIDGET(it), SIG_MULTI_PINCH_IN, it);
3424 #if GENLIST_PINCH_ZOOM_SUPPORT
3425 elm_genlist_pinch_zoom_mode_set(ELM_WIDGET_DATA(GL_IT(it)->wsd)->obj,
3426 ELM_GEN_PINCH_ZOOM_CONTRACT);
3432 GL_IT(it)->wsd->multi_timeout = EINA_FALSE;
3436 _item_multi_down_cb(void *data,
3437 Evas *evas __UNUSED__,
3438 Evas_Object *obj __UNUSED__,
3441 Elm_Gen_Item *it = data;
3442 Evas_Event_Multi_Down *ev = event_info;
3444 if ((GL_IT(it)->wsd->multi_device != 0) || (GL_IT(it)->wsd->multi_touched)
3445 || (GL_IT(it)->wsd->multi_timeout))
3448 GL_IT(it)->wsd->multi_device = ev->device;
3449 GL_IT(it)->wsd->multi_down = EINA_TRUE;
3450 GL_IT(it)->wsd->multi_touched = EINA_TRUE;
3451 GL_IT(it)->wsd->prev_mx = ev->canvas.x;
3452 GL_IT(it)->wsd->prev_my = ev->canvas.y;
3454 if (!GL_IT(it)->wsd->wasselected)
3456 GL_IT(it)->wsd->wasselected = EINA_FALSE;
3460 ecore_timer_del(it->long_timer);
3461 it->long_timer = NULL;
3465 it->dragging = EINA_FALSE;
3466 evas_object_smart_callback_call(WIDGET(it), SIG_DRAG_STOP, it);
3468 if (it->item->swipe_timer)
3470 ecore_timer_del(it->item->swipe_timer);
3471 it->item->swipe_timer = NULL;
3473 GL_IT(it)->wsd->longpressed = EINA_FALSE;
3474 if (GL_IT(it)->wsd->on_hold)
3476 GL_IT(it)->wsd->swipe = EINA_FALSE;
3477 GL_IT(it)->wsd->movements = 0;
3478 GL_IT(it)->wsd->on_hold = EINA_FALSE;
3483 _item_multi_up_cb(void *data,
3484 Evas *evas __UNUSED__,
3485 Evas_Object *obj __UNUSED__,
3488 Elm_Gen_Item *it = data;
3489 Evas_Event_Multi_Up *ev = event_info;
3491 if (GL_IT(it)->wsd->multi_device != ev->device) return;
3492 GL_IT(it)->wsd->multi_device = 0;
3493 GL_IT(it)->wsd->multi_down = EINA_FALSE;
3494 if (GL_IT(it)->wsd->mouse_down) return;
3495 _multi_touch_gesture_eval(data);
3499 _item_multi_move_cb(void *data,
3500 Evas *evas __UNUSED__,
3501 Evas_Object *obj __UNUSED__,
3504 Elm_Gen_Item *it = data;
3505 Evas_Event_Multi_Move *ev = event_info;
3507 if (GL_IT(it)->wsd->multi_device != ev->device) return;
3508 GL_IT(it)->wsd->cur_mx = ev->cur.canvas.x;
3509 GL_IT(it)->wsd->cur_my = ev->cur.canvas.y;
3513 // FIXME: difference from upstream
3515 _item_unfocusable_set(Elm_Gen_Item *it, Eina_Bool unfocus)
3518 Evas_Object *item_obj;
3519 Evas_Object *obj = WIDGET(it);
3523 EINA_LIST_FOREACH(it->content_objs, l, item_obj)
3525 if (unfocus) elm_widget_focused_object_clear(item_obj);
3526 elm_widget_tree_unfocusable_set(item_obj, unfocus);
3528 EINA_LIST_FOREACH(it->item->flip_content_objs, l, item_obj)
3530 if (unfocus) elm_widget_focused_object_clear(item_obj);
3531 elm_widget_tree_unfocusable_set(item_obj, unfocus);
3533 EINA_LIST_FOREACH(it->item->deco_all_content_objs, l, item_obj)
3535 if (unfocus) elm_widget_focused_object_clear(item_obj);
3536 elm_widget_tree_unfocusable_set(item_obj, unfocus);
3538 it->can_focus = !unfocus;
3544 _item_mouse_down_cb(void *data,
3545 Evas *evas __UNUSED__,
3549 Evas_Event_Mouse_Down *ev = event_info;
3550 Elm_Gen_Item *it = data;
3551 Elm_Genlist_Smart_Data *sd = GL_IT(it)->wsd;
3554 if (ev->button != 1) return;
3556 _item_unfocusable_set(it, EINA_FALSE);
3558 it->down = EINA_TRUE;
3559 it->dragging = EINA_FALSE;
3560 evas_object_geometry_get(obj, &x, &y, NULL, NULL);
3561 it->dx = ev->canvas.x - x;
3562 it->dy = ev->canvas.y - y;
3563 sd->mouse_down = EINA_TRUE;
3564 if (!sd->multi_touched)
3566 sd->prev_x = ev->canvas.x;
3567 sd->prev_y = ev->canvas.y;
3568 sd->multi_timeout = EINA_FALSE;
3569 if (sd->multi_timer) ecore_timer_del(sd->multi_timer);
3570 sd->multi_timer = ecore_timer_add(1, _multi_cancel, sd);
3572 sd->longpressed = EINA_FALSE;
3573 if (ev->event_flags & EVAS_EVENT_FLAG_ON_HOLD)
3575 sd->on_hold = EINA_TRUE;
3578 else sd->on_hold = EINA_FALSE;
3579 _item_highlight(it);
3580 if (ev->flags & EVAS_BUTTON_DOUBLE_CLICK)
3581 if ((!elm_widget_item_disabled_get(it)) &&
3582 (it->select_mode != ELM_OBJECT_SELECT_MODE_DISPLAY_ONLY))
3584 evas_object_smart_callback_call(WIDGET(it), SIG_CLICKED_DOUBLE, it);
3585 evas_object_smart_callback_call(WIDGET(it), SIG_ACTIVATED, it);
3587 if (it->item->swipe_timer) ecore_timer_del(it->item->swipe_timer);
3588 it->item->swipe_timer = ecore_timer_add(0.4, _swipe_cancel, it);
3589 if (it->long_timer) ecore_timer_del(it->long_timer);
3591 it->long_timer = ecore_timer_add
3592 (sd->longpress_timeout, _long_press_cb, it);
3594 it->long_timer = NULL;
3595 sd->swipe = EINA_FALSE;
3600 _item_block_new(Elm_Genlist_Smart_Data *sd,
3605 itb = calloc(1, sizeof(Item_Block));
3606 if (!itb) return NULL;
3610 sd->blocks = eina_inlist_prepend(sd->blocks, EINA_INLIST_GET(itb));
3611 _item_block_position_update(sd->blocks, 0);
3615 sd->blocks = eina_inlist_append(sd->blocks, EINA_INLIST_GET(itb));
3616 itb->position_update = EINA_TRUE;
3617 if (sd->blocks != EINA_INLIST_GET(itb))
3620 ((Item_Block *)(EINA_INLIST_GET(itb)->prev))->position + 1;
3632 _item_block_add(Elm_Genlist_Smart_Data *sd,
3635 Item_Block *itb = NULL;
3642 itb = calloc(1, sizeof(Item_Block));
3643 if (!itb) return EINA_FALSE;
3645 if (!it->item->rel->item->block)
3648 eina_inlist_append(sd->blocks, EINA_INLIST_GET(itb));
3649 itb->items = eina_list_append(itb->items, it);
3650 itb->position_update = EINA_TRUE;
3651 it->position = eina_list_count(itb->items);
3652 it->position_update = EINA_TRUE;
3654 if (sd->blocks != EINA_INLIST_GET(itb))
3658 (EINA_INLIST_GET(itb)->prev))->position + 1;
3669 tmp = eina_list_data_find_list(itb->items, it->item->rel);
3670 if (it->item->before)
3672 sd->blocks = eina_inlist_prepend_relative
3673 (sd->blocks, EINA_INLIST_GET(itb),
3674 EINA_INLIST_GET(it->item->rel->item->block));
3676 eina_list_prepend_relative_list(itb->items, it, tmp);
3678 /* Update index from where we prepended */
3679 _item_position_update
3680 (eina_list_prev(tmp), it->item->rel->position);
3681 _item_block_position_update
3682 (EINA_INLIST_GET(itb),
3683 it->item->rel->item->block->position);
3687 sd->blocks = eina_inlist_append_relative
3688 (sd->blocks, EINA_INLIST_GET(itb),
3689 EINA_INLIST_GET(it->item->rel->item->block));
3691 eina_list_append_relative_list(itb->items, it, tmp);
3693 /* Update block index from where we appended */
3694 _item_position_update
3695 (eina_list_next(tmp), it->item->rel->position + 1);
3696 _item_block_position_update
3697 (EINA_INLIST_GET(itb),
3698 it->item->rel->item->block->position + 1);
3704 if (it->item->before)
3708 itb = (Item_Block *)(sd->blocks);
3709 if (itb->count >= sd->max_items_per_block)
3711 itb = _item_block_new(sd, EINA_TRUE);
3712 if (!itb) return EINA_FALSE;
3717 itb = _item_block_new(sd, EINA_TRUE);
3718 if (!itb) return EINA_FALSE;
3720 itb->items = eina_list_prepend(itb->items, it);
3722 _item_position_update(itb->items, 0);
3728 itb = (Item_Block *)(sd->blocks->last);
3729 if (itb->count >= sd->max_items_per_block)
3731 itb = _item_block_new(sd, EINA_FALSE);
3732 if (!itb) return EINA_FALSE;
3737 itb = _item_block_new(sd, EINA_FALSE);
3738 if (!itb) return EINA_FALSE;
3740 itb->items = eina_list_append(itb->items, it);
3741 it->position = eina_list_count(itb->items);
3749 if (it->item->rel->item->queued)
3751 /* NOTE: for a strange reason eina_list and eina_inlist
3752 don't have the same property on sorted insertion
3753 order, so the queue is not always ordered like the
3754 item list. This lead to issue where we depend on an
3755 item that is not yet created. As a quick work around,
3756 we reschedule the calc of the item and stop reordering
3757 the list to prevent any nasty issue to show up here.
3759 sd->queue = eina_list_append(sd->queue, it);
3760 sd->requeued = EINA_TRUE;
3761 it->item->queued = EINA_TRUE;
3765 itb = it->item->rel->item->block;
3766 if (!itb) goto newblock;
3767 tmp = eina_list_data_find_list(itb->items, it->item->rel);
3768 if (it->item->before)
3770 itb->items = eina_list_prepend_relative_list(itb->items, it, tmp);
3771 _item_position_update
3772 (eina_list_prev(tmp), it->item->rel->position);
3776 itb->items = eina_list_append_relative_list(itb->items, it, tmp);
3777 _item_position_update
3778 (eina_list_next(tmp), it->item->rel->position + 1);
3783 itb->changed = EINA_TRUE;
3784 it->item->block = itb;
3785 if (itb->sd->calc_job) ecore_job_del(itb->sd->calc_job);
3786 itb->sd->calc_job = ecore_job_add(_calc_job, itb->sd);
3788 if (itb->count > itb->sd->max_items_per_block)
3793 Eina_Bool done = EINA_FALSE;
3795 newc = itb->count / 2;
3797 if (EINA_INLIST_GET(itb)->prev)
3799 Item_Block *itbp = (Item_Block *)(EINA_INLIST_GET(itb)->prev);
3801 if (itbp->count + newc < sd->max_items_per_block / 2)
3803 /* moving items to previous block */
3804 while ((itb->count > newc) && (itb->items))
3806 it2 = eina_list_data_get(itb->items);
3807 itb->items = eina_list_remove_list
3808 (itb->items, itb->items);
3811 itbp->items = eina_list_append(itbp->items, it2);
3812 it2->item->block = itbp;
3820 if (!done && EINA_INLIST_GET(itb)->next)
3822 Item_Block *itbn = (Item_Block *)(EINA_INLIST_GET(itb)->next);
3824 if (itbn->count + newc < sd->max_items_per_block / 2)
3826 /* moving items to next block */
3827 while ((itb->count > newc) && (itb->items))
3831 l = eina_list_last(itb->items);
3832 it2 = eina_list_data_get(l);
3833 itb->items = eina_list_remove_list(itb->items, l);
3836 itbn->items = eina_list_prepend(itbn->items, it2);
3837 it2->item->block = itbn;
3847 /* moving items to new block */
3848 itb2 = calloc(1, sizeof(Item_Block));
3849 if (!itb2) return EINA_FALSE;
3852 eina_inlist_append_relative(sd->blocks, EINA_INLIST_GET(itb2),
3853 EINA_INLIST_GET(itb));
3854 itb2->changed = EINA_TRUE;
3855 while ((itb->count > newc) && (itb->items))
3859 l = eina_list_last(itb->items);
3861 itb->items = eina_list_remove_list(itb->items, l);
3864 itb2->items = eina_list_prepend(itb2->items, it2);
3865 it2->item->block = itb2;
3875 _item_process(Elm_Genlist_Smart_Data *sd,
3878 if (!_item_block_add(sd, it)) return 1;
3880 _item_block_realize(it->item->block);
3886 _item_process_post(Elm_Genlist_Smart_Data *sd,
3890 Eina_Bool show_me = EINA_FALSE;
3892 if (it->item->block->changed)
3894 show_me = _item_block_recalc
3895 (it->item->block, it->item->block->num, qadd);
3896 it->item->block->changed = 0;
3897 if (sd->pan_changed)
3899 if (sd->calc_job) ecore_job_del(sd->calc_job);
3900 sd->calc_job = NULL;
3902 sd->pan_changed = EINA_FALSE;
3905 if (show_me) it->item->block->show_me = EINA_TRUE;
3907 /* when prepending, move the scroller along with the first selected
3908 * item to create the illusion that we're watching the selected
3909 * item this prevents the selected item being scrolled off the
3912 if (sd->selected && it->item->before)
3917 it2 = sd->selected->data;
3918 if (!it2->item->block) return;
3919 sd->s_iface->content_pos_get(ELM_WIDGET_DATA(sd)->obj, NULL, &y);
3920 evas_object_geometry_get(sd->pan_obj, NULL, NULL, NULL, &h);
3921 if ((it->y + it->item->block->y > y + h) ||
3922 (it->y + it->item->block->y + it->item->h < y))
3923 /* offscreen, just update */
3924 sd->s_iface->content_region_show
3925 (ELM_WIDGET_DATA(sd)->obj, it2->x + it2->item->block->x, y,
3926 it2->item->block->w, h);
3928 sd->s_iface->content_region_show
3929 (ELM_WIDGET_DATA(sd)->obj, it->x + it->item->block->x,
3930 y + it->item->h, it->item->block->w, h);
3935 _queue_process(Elm_Genlist_Smart_Data *sd)
3940 t0 = ecore_loop_time_get();
3941 for (n = 0; (sd->queue) && (n < 128); n++)
3945 it = eina_list_data_get(sd->queue);
3946 sd->queue = eina_list_remove_list(sd->queue, sd->queue);
3947 it->item->queued = EINA_FALSE;
3948 if (_item_process(sd, it)) continue;
3949 t = ecore_time_get();
3950 _item_process_post(sd, it, EINA_TRUE);
3951 /* same as eina_inlist_count > 1 */
3952 if (sd->blocks && sd->blocks->next)
3954 if ((t - t0) > (ecore_animator_frametime_get())) break;
3961 _idle_process(void *data,
3964 Elm_Genlist_Smart_Data *sd = data;
3966 if (_queue_process(sd) > 0) *wakeup = EINA_TRUE;
3969 return ECORE_CALLBACK_CANCEL;
3971 #if GENLIST_FX_SUPPORT
3972 if (sd->fx_first_captured)
3973 _elm_genlist_fx_clear(ELM_WIDGET_DATA(sd)->obj);
3975 return ECORE_CALLBACK_RENEW;
3979 _item_idle_enterer(void *data)
3981 Eina_Bool wakeup = EINA_FALSE;
3982 Elm_Genlist_Smart_Data *sd = data;
3983 Eina_Bool ok = _idle_process(data, &wakeup);
3988 if (sd->calc_job) ecore_job_del(sd->calc_job);
3989 sd->calc_job = ecore_job_add(_calc_job, sd);
3991 if (ok == ECORE_CALLBACK_CANCEL) sd->queue_idle_enterer = NULL;
3997 _item_queue(Elm_Genlist_Smart_Data *sd,
4001 if (it->item->queued) return;
4003 it->item->queued = EINA_TRUE;
4004 if (cb && !sd->requeued)
4005 sd->queue = eina_list_sorted_insert(sd->queue, cb, it);
4007 sd->queue = eina_list_append(sd->queue, it);
4009 if (sd->queue_idle_enterer)
4010 ecore_idle_enterer_del(sd->queue_idle_enterer);
4011 sd->queue_idle_enterer = ecore_idle_enterer_add(_item_idle_enterer, sd);
4013 if (sd->prev_viewport_w != 0)
4015 while ((sd->queue) && ((!sd->blocks) || (!sd->blocks->next)))
4018 while ((sd->queue) && (sd->blocks) &&
4019 (sd->homogeneous) && (sd->mode == ELM_LIST_COMPRESS))
4024 /* If the application wants to know the relative item, use
4025 * elm_genlist_item_prev_get(it)*/
4027 _item_move_after(Elm_Gen_Item *it,
4028 Elm_Gen_Item *after)
4032 if (it == after) return;
4034 GL_IT(it)->wsd->items =
4035 eina_inlist_remove(GL_IT(it)->wsd->items, EINA_INLIST_GET(it));
4036 if (it->item->block) _item_block_del(it);
4038 GL_IT(it)->wsd->items = eina_inlist_append_relative
4039 (GL_IT(it)->wsd->items, EINA_INLIST_GET(it), EINA_INLIST_GET(after));
4040 it->item->rel = after;
4041 after->item->rel_revs = eina_list_append(after->item->rel_revs, it);
4042 it->item->before = EINA_FALSE;
4043 if (after->item->group_item) it->item->group_item = after->item->group_item;
4044 _item_queue(GL_IT(it)->wsd, it, NULL);
4046 evas_object_smart_callback_call(WIDGET(it), SIG_MOVED_AFTER, it);
4050 _access_activate_cb(void *data __UNUSED__,
4051 Evas_Object *part_obj __UNUSED__,
4052 Elm_Object_Item *item)
4054 _item_select_unselect((Elm_Gen_Item *)item, EINA_TRUE);
4057 /* If the application wants to know the relative item, use
4058 * elm_genlist_item_next_get(it)*/
4060 _item_move_before(Elm_Gen_Item *it,
4061 Elm_Gen_Item *before)
4064 if (!before) return;
4065 if (it == before) return;
4067 GL_IT(it)->wsd->items =
4068 eina_inlist_remove(GL_IT(it)->wsd->items, EINA_INLIST_GET(it));
4069 if (it->item->block) _item_block_del(it);
4070 GL_IT(it)->wsd->items = eina_inlist_prepend_relative
4071 (GL_IT(it)->wsd->items, EINA_INLIST_GET(it), EINA_INLIST_GET(before));
4072 it->item->rel = before;
4073 before->item->rel_revs = eina_list_append(before->item->rel_revs, it);
4074 it->item->before = EINA_TRUE;
4075 if (before->item->group_item)
4076 it->item->group_item = before->item->group_item;
4077 _item_queue(GL_IT(it)->wsd, it, NULL);
4079 evas_object_smart_callback_call(WIDGET(it), SIG_MOVED_BEFORE, it);
4083 _item_mouse_up_cb(void *data,
4084 Evas *evas __UNUSED__,
4085 Evas_Object *obj __UNUSED__,
4088 Evas_Event_Mouse_Up *ev = event_info;
4089 Eina_Bool dragged = EINA_FALSE;
4090 Elm_Genlist_Smart_Data *sd;
4091 Elm_Gen_Item *it = data;
4093 if (ev->button != 1) return;
4094 it->down = EINA_FALSE;
4095 sd = GL_IT(it)->wsd;
4097 sd->mouse_down = EINA_FALSE;
4098 if (sd->multi_touched)
4100 if ((!sd->multi) && (!it->selected) && (it->highlighted))
4101 _item_unhighlight(it);
4102 if (sd->multi_down) return;
4103 _multi_touch_gesture_eval(data);
4108 ecore_timer_del(it->long_timer);
4109 it->long_timer = NULL;
4113 it->dragging = EINA_FALSE;
4114 evas_object_smart_callback_call(WIDGET(it), SIG_DRAG_STOP, it);
4117 if (it->item->swipe_timer)
4119 ecore_timer_del(it->item->swipe_timer);
4120 it->item->swipe_timer = NULL;
4122 if (sd->multi_timer)
4124 ecore_timer_del(sd->multi_timer);
4125 sd->multi_timer = NULL;
4126 sd->multi_timeout = EINA_FALSE;
4128 sd->on_hold = EINA_FALSE;
4129 if (ev->event_flags & EVAS_EVENT_FLAG_ON_HOLD)
4131 if (sd->swipe) _swipe_do(data);
4132 sd->longpressed = EINA_FALSE;
4135 if ((sd->reorder_mode) && (sd->reorder_it))
4137 Evas_Coord it_scrl_y = ev->canvas.y - sd->reorder_it->dy;
4138 sd->reorder_fast = 0;
4140 if (sd->reorder_rel &&
4141 (sd->reorder_it->parent == sd->reorder_rel->parent))
4143 if (it_scrl_y <= sd->reorder_rel->item->scrl_y)
4144 _item_move_before(sd->reorder_it, sd->reorder_rel);
4146 _item_move_after(sd->reorder_it, sd->reorder_rel);
4147 evas_object_smart_callback_call(WIDGET(it), SIG_MOVED, it);
4151 if (sd->calc_job) ecore_job_del(sd->calc_job);
4152 sd->calc_job = ecore_job_add(_calc_job, sd);
4154 edje_object_signal_emit(VIEW(it), "elm,state,reorder,disabled", "elm");
4155 sd->reorder_it = sd->reorder_rel = NULL;
4156 sd->s_iface->hold_set(ELM_WIDGET_DATA(sd)->obj, EINA_FALSE);
4157 sd->s_iface->bounce_allow_set
4158 (ELM_WIDGET_DATA(sd)->obj, sd->h_bounce, sd->v_bounce);
4162 if (it->want_unrealize && !(it->item->unrealize_disabled))
4164 _item_unrealize(it, EINA_FALSE);
4165 if (it->item->block->want_unrealize)
4166 _item_block_unrealize(it->item->block);
4171 if (!sd->longpressed)
4172 if ((sd->select_mode == ELM_OBJECT_SELECT_MODE_ALWAYS) ||
4173 (it->select_mode == ELM_OBJECT_SELECT_MODE_ALWAYS))
4174 _item_select_unselect(it, EINA_TRUE);
4175 else _item_select_unselect(it, !it->selected);
4177 _item_unhighlight(it);
4181 _item_mouse_callbacks_add(Elm_Gen_Item *it,
4184 evas_object_event_callback_add
4185 (view, EVAS_CALLBACK_MOUSE_DOWN, _item_mouse_down_cb, it);
4186 evas_object_event_callback_add
4187 (view, EVAS_CALLBACK_MOUSE_UP, _item_mouse_up_cb, it);
4188 evas_object_event_callback_add
4189 (view, EVAS_CALLBACK_MOUSE_MOVE, _item_mouse_move_cb, it);
4190 evas_object_event_callback_add
4191 (view, EVAS_CALLBACK_MULTI_DOWN, _item_multi_down_cb, it);
4192 evas_object_event_callback_add
4193 (view, EVAS_CALLBACK_MULTI_UP, _item_multi_up_cb, it);
4194 evas_object_event_callback_add
4195 (view, EVAS_CALLBACK_MULTI_MOVE, _item_multi_move_cb, it);
4199 _item_mouse_callbacks_del(Elm_Gen_Item *it,
4202 evas_object_event_callback_del_full
4203 (view, EVAS_CALLBACK_MOUSE_DOWN, _item_mouse_down_cb, it);
4204 evas_object_event_callback_del_full
4205 (view, EVAS_CALLBACK_MOUSE_UP, _item_mouse_up_cb, it);
4206 evas_object_event_callback_del_full
4207 (view, EVAS_CALLBACK_MOUSE_MOVE, _item_mouse_move_cb, it);
4208 evas_object_event_callback_del_full
4209 (view, EVAS_CALLBACK_MULTI_DOWN, _item_multi_down_cb, it);
4210 evas_object_event_callback_del_full
4211 (view, EVAS_CALLBACK_MULTI_UP, _item_multi_up_cb, it);
4212 evas_object_event_callback_del_full
4213 (view, EVAS_CALLBACK_MULTI_MOVE, _item_multi_move_cb, it);
4217 _scroll_hold_timer_cb(void *data)
4219 Elm_Genlist_Smart_Data *sd = data;
4221 if (!data) return ECORE_CALLBACK_CANCEL;
4223 sd->s_iface->hold_set(ELM_WIDGET_DATA(sd)->obj, EINA_FALSE);
4224 sd->scr_hold_timer = NULL;
4226 return ECORE_CALLBACK_CANCEL;
4230 _decorate_item_finished_signal_cb(void *data,
4232 const char *emission __UNUSED__,
4233 const char *source __UNUSED__)
4235 Elm_Gen_Item *it = data;
4238 if (!data || !obj) return;
4239 if ((!it->realized) || (!it->item->deco_it_view)) return;
4241 it->item->nocache_once = EINA_FALSE;
4242 _decorate_item_unrealize(it);
4243 if (it->item->group_item)
4244 evas_object_raise(it->item->VIEW(group_item));
4246 snprintf(buf, sizeof(buf), "elm,state,%s,passive,finished",
4247 GL_IT(it)->wsd->decorate_it_type);
4248 edje_object_signal_callback_del_full
4249 (obj, buf, "elm", _decorate_item_finished_signal_cb, it);
4253 _item_mode_content_unrealize(Elm_Gen_Item *it,
4254 Evas_Object *target,
4257 Eina_List **contents_list)
4259 Eina_List *res = *contents_list;
4261 if (it->itc->func.content_get)
4265 Evas_Object *ic = NULL;
4267 EINA_LIST_FOREACH(*source, l, key)
4269 if (parts && fnmatch(parts, key, FNM_PERIOD))
4272 ic = edje_object_part_swallow_get(target, key);
4275 res = eina_list_remove(res, ic);
4276 edje_object_part_unswallow(target, ic);
4277 evas_object_del(ic);
4286 _item_content_unrealize(Elm_Gen_Item *it,
4287 Evas_Object *target,
4291 Eina_List *res = it->content_objs;
4293 if (it->itc->func.content_get)
4297 Evas_Object *ic = NULL;
4299 EINA_LIST_FOREACH(*source, l, key)
4301 if (parts && fnmatch(parts, key, FNM_PERIOD))
4304 ic = edje_object_part_swallow_get(target, key);
4307 res = eina_list_remove(res, ic);
4308 edje_object_part_unswallow(target, ic);
4309 // FIXME: If parent-child relationship was broken before 'ic'
4310 // is deleted, freeze_pop will not be called. ex) elm_slider
4311 // If layout is used instead of edje, this problme can be
4313 if (0 != elm_widget_scroll_freeze_get(ic))
4314 elm_widget_scroll_freeze_pop(ic);
4315 evas_object_del(ic);
4324 _item_block_recalc(Item_Block *itb,
4328 const Eina_List *l, *ll;
4330 Evas_Coord minw = 0, minh = 0;
4331 Eina_Bool show_me = EINA_FALSE, changed = EINA_FALSE;
4335 EINA_LIST_FOREACH_SAFE(itb->items, l, ll, it)
4337 show_me |= it->item->show_me;
4342 if (!it->item->mincalcd) changed = EINA_TRUE;
4345 _item_realize(it, in, EINA_TRUE);
4346 _item_unrealize(it, EINA_TRUE);
4351 if ((itb->sd->homogeneous) &&
4352 (itb->sd->mode == ELM_LIST_COMPRESS))
4356 it->item->w = it->item->minw =
4357 GL_IT(it)->wsd->group_item_width;
4358 it->item->h = it->item->minh =
4359 GL_IT(it)->wsd->group_item_height;
4363 it->item->w = it->item->minw =
4364 GL_IT(it)->wsd->item_width;
4365 it->item->h = it->item->minh =
4366 GL_IT(it)->wsd->item_height;
4371 _item_realize(it, in, EINA_TRUE);
4372 _item_unrealize(it, EINA_TRUE);
4378 if (!it->item->mincalcd) changed = EINA_TRUE;
4379 _item_realize(it, in, EINA_FALSE);
4381 minh += it->item->minh;
4382 if (minw < it->item->minw) minw = it->item->minw;
4386 #if GENLIST_PINCH_ZOOM_SUPPORT
4387 if (IS_ROOT_PARENT_IT(it))
4388 it->item->pan_scrl_y = itb->y + it->y;
4392 if (changed) itb->sd->pan_changed = changed;
4395 itb->changed = EINA_FALSE;
4396 itb->position_update = EINA_FALSE;
4402 _update_job(void *data)
4404 Eina_Bool position = EINA_FALSE, recalc = EINA_FALSE;
4405 Elm_Genlist_Smart_Data *sd = data;
4410 sd->update_job = NULL;
4413 //evas_event_freeze(evas_object_evas_get(ELM_WIDGET_DATA(sd)->obj));
4414 EINA_INLIST_FOREACH(sd->blocks, itb)
4416 Evas_Coord itminw, itminh;
4423 _item_block_position(itb, num);
4427 recalc = EINA_FALSE;
4428 EINA_LIST_FOREACH(itb->items, l2, it)
4430 if (it->item->updateme)
4432 itminw = it->item->minw;
4433 itminh = it->item->minh;
4435 it->item->updateme = EINA_FALSE;
4438 _item_unrealize(it, EINA_FALSE);
4439 _item_realize(it, num, EINA_FALSE);
4440 position = EINA_TRUE;
4444 _item_realize(it, num, EINA_TRUE);
4445 _item_unrealize(it, EINA_TRUE);
4447 if ((it->item->minw != itminw) || (it->item->minh != itminh))
4452 itb->updateme = EINA_FALSE;
4455 position = EINA_TRUE;
4456 itb->changed = EINA_TRUE;
4457 _item_block_recalc(itb, num0, EINA_FALSE);
4458 _item_block_position(itb, num0);
4463 if (sd->calc_job) ecore_job_del(sd->calc_job);
4464 sd->calc_job = ecore_job_add(_calc_job, sd);
4466 //evas_event_thaw(evas_object_evas_get(ELM_WIDGET_DATA(sd)->obj));
4467 //evas_event_thaw_eval(evas_object_evas_get(ELM_WIDGET_DATA(sd)->obj));
4471 _scroll_animate_start_cb(Evas_Object *obj,
4472 void *data __UNUSED__)
4474 evas_object_smart_callback_call(obj, SIG_SCROLL_ANIM_START, NULL);
4478 _scroll_animate_stop_cb(Evas_Object *obj,
4479 void *data __UNUSED__)
4481 evas_object_smart_callback_call(obj, SIG_SCROLL_ANIM_STOP, NULL);
4485 _scroll_drag_start_cb(Evas_Object *obj,
4486 void *data __UNUSED__)
4488 evas_object_smart_callback_call(obj, SIG_SCROLL_DRAG_START, NULL);
4492 _scroll_drag_stop_cb(Evas_Object *obj,
4493 void *data __UNUSED__)
4495 evas_object_smart_callback_call(obj, SIG_SCROLL_DRAG_STOP, NULL);
4499 _edge_left_cb(Evas_Object *obj,
4500 void *data __UNUSED__)
4502 evas_object_smart_callback_call(obj, SIG_EDGE_LEFT, NULL);
4506 _edge_right_cb(Evas_Object *obj,
4507 void *data __UNUSED__)
4509 evas_object_smart_callback_call(obj, SIG_EDGE_RIGHT, NULL);
4513 _edge_top_cb(Evas_Object *obj,
4514 void *data __UNUSED__)
4516 evas_object_smart_callback_call(obj, SIG_EDGE_TOP, NULL);
4520 _edge_bottom_cb(Evas_Object *obj,
4521 void *data __UNUSED__)
4523 evas_object_smart_callback_call(obj, SIG_EDGE_BOTTOM, NULL);
4527 _vbar_drag_cb(Evas_Object *obj,
4528 void *data __UNUSED__)
4530 evas_object_smart_callback_call(obj, SIG_VBAR_DRAG, NULL);
4534 _vbar_press_cb(Evas_Object *obj,
4535 void *data __UNUSED__)
4537 evas_object_smart_callback_call(obj, SIG_VBAR_PRESS, NULL);
4541 _vbar_unpress_cb(Evas_Object *obj,
4542 void *data __UNUSED__)
4544 evas_object_smart_callback_call(obj, SIG_VBAR_UNPRESS, NULL);
4548 _hbar_drag_cb(Evas_Object *obj,
4549 void *data __UNUSED__)
4551 evas_object_smart_callback_call(obj, SIG_HBAR_DRAG, NULL);
4555 _hbar_press_cb(Evas_Object *obj,
4556 void *data __UNUSED__)
4558 evas_object_smart_callback_call(obj, SIG_HBAR_PRESS, NULL);
4562 _hbar_unpress_cb(Evas_Object *obj,
4563 void *data __UNUSED__)
4565 evas_object_smart_callback_call(obj, SIG_HBAR_UNPRESS, NULL);
4569 _decorate_item_realize(Elm_Gen_Item *it)
4572 if (it->item->deco_it_view) return;
4574 //evas_event_freeze(evas_object_evas_get(obj));
4575 it->item->deco_it_view = edje_object_add(evas_object_evas_get(WIDGET(it)));
4576 edje_object_scale_set
4577 (it->item->deco_it_view, elm_widget_scale_get(WIDGET(it)) *
4578 elm_config_scale_get());
4579 evas_object_smart_member_add
4580 (it->item->deco_it_view, GL_IT(it)->wsd->pan_obj);
4581 elm_widget_sub_object_add(WIDGET(it), it->item->deco_it_view);
4583 strncpy(buf, "item", sizeof(buf));
4584 if (GL_IT(it)->wsd->mode == ELM_LIST_COMPRESS)
4585 strncat(buf, "_compress", sizeof(buf) - strlen(buf));
4587 if (it->item->order_num_in & 0x1)
4588 strncat(buf, "_odd", sizeof(buf) - strlen(buf));
4589 strncat(buf, "/", sizeof(buf) - strlen(buf));
4590 strncat(buf, it->itc->decorate_item_style, sizeof(buf) - strlen(buf));
4592 elm_widget_theme_object_set
4593 (WIDGET(it), it->item->deco_it_view, "genlist", buf,
4594 elm_widget_style_get(WIDGET(it)));
4595 edje_object_mirrored_set
4596 (it->item->deco_it_view, elm_widget_mirrored_get(WIDGET(it)));
4598 /* signal callback add */
4599 evas_object_event_callback_add
4600 (it->item->deco_it_view, EVAS_CALLBACK_MOUSE_DOWN, _item_mouse_down_cb,
4602 evas_object_event_callback_add
4603 (it->item->deco_it_view, EVAS_CALLBACK_MOUSE_UP, _item_mouse_up_cb, it);
4604 evas_object_event_callback_add
4605 (it->item->deco_it_view, EVAS_CALLBACK_MOUSE_MOVE, _item_mouse_move_cb,
4608 if (eina_list_count(it->item->deco_it_content_objs) != 0)
4609 ERR_ABORT("If you see this error, please notify us and we"
4612 /* text_get, content_get, state_get */
4614 (it, it->item->deco_it_view, &it->item->deco_it_texts, NULL);
4615 if (!it->item->deco_it_contents)
4616 it->item->deco_it_contents =
4617 elm_widget_stringlist_get
4618 (edje_object_data_get(it->item->deco_it_view, "contents"));
4619 it->item->deco_it_content_objs =
4620 _item_mode_content_realize
4621 (it, it->item->deco_it_view, &it->item->deco_it_contents, NULL,
4622 &it->item->deco_it_content_objs);
4624 (it, it->item->deco_it_view, &it->item->deco_it_states, NULL);
4625 edje_object_part_swallow
4626 (it->item->deco_it_view,
4627 edje_object_data_get(it->item->deco_it_view, "mode_part"), VIEW(it));
4629 it->want_unrealize = EINA_FALSE;
4630 //evas_event_thaw(evas_object_evas_get(obj));
4631 //evas_event_thaw_eval(evas_object_evas_get(obj));
4635 _decorate_item_set(Elm_Gen_Item *it)
4637 Elm_Genlist_Smart_Data *sd;
4642 sd = GL_IT(it)->wsd;
4645 it->item->nocache_once = EINA_TRUE;
4647 if (sd->scr_hold_timer)
4649 ecore_timer_del(sd->scr_hold_timer);
4650 sd->scr_hold_timer = NULL;
4652 sd->s_iface->hold_set(ELM_WIDGET_DATA(sd)->obj, EINA_TRUE);
4653 sd->scr_hold_timer = ecore_timer_add(0.1, _scroll_hold_timer_cb, sd);
4655 //evas_event_freeze(evas_object_evas_get(ELM_WIDGET_DATA(sd)->obj));
4656 _decorate_item_realize(it);
4657 if (it->item->group_item)
4658 evas_object_raise(it->item->VIEW(group_item));
4660 (it, it->item->deco_it_view, it->item->scrl_x, it->item->scrl_y);
4661 //evas_event_thaw(evas_object_evas_get(ELM_WIDGET_DATA(sd)->obj));
4662 //evas_event_thaw_eval(evas_object_evas_get(ELM_WIDGET_DATA(sd)->obj));
4664 snprintf(buf, sizeof(buf), "elm,state,%s,active", sd->decorate_it_type);
4665 edje_object_signal_emit(it->item->deco_it_view, buf, "elm");
4669 _decorate_item_unset(Elm_Genlist_Smart_Data *sd)
4671 char buf[1024], buf2[1024];
4674 if (!sd->mode_item) return;
4677 it->item->nocache_once = EINA_TRUE;
4679 snprintf(buf, sizeof(buf), "elm,state,%s,passive", sd->decorate_it_type);
4680 snprintf(buf2, sizeof(buf2), "elm,state,%s,passive,finished",
4681 sd->decorate_it_type);
4682 edje_object_signal_emit(it->item->deco_it_view, buf, "elm");
4683 edje_object_signal_callback_add
4684 (it->item->deco_it_view, buf2, "elm", _decorate_item_finished_signal_cb,
4686 sd->mode_item = NULL;
4690 // FIXME: difference from upstream
4692 _mouse_down_scroller(void *data,
4693 Evas *evas __UNUSED__,
4694 Evas_Object *obj __UNUSED__,
4695 void *event_info __UNUSED__)
4697 Widget_Data *wd = elm_widget_data_get(data);
4700 wd->drag_started = EINA_FALSE;
4704 _mouse_up_scroller(void *data,
4705 Evas *evas __UNUSED__,
4706 Evas_Object *obj __UNUSED__,
4707 void *event_info __UNUSED__)
4709 Widget_Data *wd = elm_widget_data_get(data);
4712 wd->drag_started = EINA_FALSE;
4716 _mouse_move_scroller(void *data,
4717 Evas *evas __UNUSED__,
4718 Evas_Object *obj __UNUSED__,
4721 Widget_Data *wd = elm_widget_data_get(data);
4722 Evas_Event_Mouse_Move *ev = event_info;
4723 Evas_Coord minw = 0, minh = 0, dx, dy, adx, ady;
4726 if (wd->drag_started) return;
4728 elm_coords_finger_size_adjust(1, &minw, 1, &minh);
4729 dx = ev->cur.canvas.x - ev->prev.canvas.x;
4730 dy = ev->cur.canvas.y - ev->prev.canvas.y;
4733 if (adx < 0) adx = -dx;
4734 if (ady < 0) ady = -dy;
4735 if (((ady < minh) && (ady > minh / 2)) && (ady > adx))
4739 evas_object_smart_callback_call(data, SIG_DRAG_START_UP, NULL);
4740 wd->drag_started = EINA_TRUE;
4744 evas_object_smart_callback_call(data, SIG_DRAG_START_DOWN, NULL);
4745 wd->drag_started = EINA_TRUE;
4752 _elm_genlist_smart_add(Evas_Object *obj)
4754 Evas_Coord minw, minh;
4755 Elm_Genlist_Pan_Smart_Data *pan_data;
4757 EVAS_SMART_DATA_ALLOC(obj, Elm_Genlist_Smart_Data);
4759 ELM_WIDGET_CLASS(_elm_genlist_parent_sc)->base.add(obj);
4761 priv->hit_rect = evas_object_rectangle_add(evas_object_evas_get(obj));
4762 evas_object_smart_member_add(priv->hit_rect, obj);
4763 elm_widget_sub_object_add(obj, priv->hit_rect);
4765 /* common scroller hit rectangle setup */
4766 evas_object_color_set(priv->hit_rect, 0, 0, 0, 0);
4767 evas_object_show(priv->hit_rect);
4768 evas_object_repeat_events_set(priv->hit_rect, EINA_TRUE);
4770 elm_widget_can_focus_set(obj, EINA_TRUE);
4771 elm_widget_on_show_region_hook_set(obj, _show_region_hook, obj);
4773 elm_layout_theme_set(obj, "genlist", "base", elm_widget_style_get(obj));
4775 /* interface's add() routine issued AFTER the object's smart_add() */
4776 priv->s_iface = evas_object_smart_interface_get
4777 (obj, ELM_SCROLLABLE_IFACE_NAME);
4779 priv->s_iface->objects_set
4780 (obj, ELM_WIDGET_DATA(priv)->resize_obj, priv->hit_rect);
4782 priv->s_iface->bounce_allow_set
4783 (obj, EINA_FALSE, _elm_config->thumbscroll_bounce_enable);
4784 priv->v_bounce = _elm_config->thumbscroll_bounce_enable;
4786 priv->s_iface->animate_start_cb_set(obj, _scroll_animate_start_cb);
4787 priv->s_iface->animate_stop_cb_set(obj, _scroll_animate_stop_cb);
4788 priv->s_iface->drag_start_cb_set(obj, _scroll_drag_start_cb);
4789 priv->s_iface->drag_stop_cb_set(obj, _scroll_drag_stop_cb);
4790 priv->s_iface->edge_left_cb_set(obj, _edge_left_cb);
4791 priv->s_iface->edge_right_cb_set(obj, _edge_right_cb);
4792 priv->s_iface->edge_top_cb_set(obj, _edge_top_cb);
4793 priv->s_iface->edge_bottom_cb_set(obj, _edge_bottom_cb);
4794 priv->s_iface->vbar_drag_cb_set(obj, _vbar_drag_cb);
4795 priv->s_iface->vbar_press_cb_set(obj, _vbar_press_cb);
4796 priv->s_iface->vbar_unpress_cb_set(obj, _vbar_unpress_cb);
4797 priv->s_iface->hbar_drag_cb_set(obj, _hbar_drag_cb);
4798 priv->s_iface->hbar_press_cb_set(obj, _hbar_press_cb);
4799 priv->s_iface->hbar_unpress_cb_set(obj, _hbar_unpress_cb);
4801 priv->mode = ELM_LIST_SCROLL;
4802 priv->max_items_per_block = MAX_ITEMS_PER_BLOCK;
4803 priv->item_cache_max = priv->max_items_per_block * 2;
4804 priv->longpress_timeout = _elm_config->longpress_timeout;
4805 priv->highlight = EINA_TRUE;
4807 #if GENLIST_FX_SUPPORT
4808 priv->fx_mode = EINA_FALSE;
4809 priv->rendered = EINA_FALSE;
4810 priv->fx_first_captured = EINA_FALSE;
4811 priv->fx_playing = EINA_FALSE;
4812 priv->fx_items_deleted = EINA_FALSE;
4813 priv->genlist_clearing = EINA_FALSE;
4816 priv->pan_obj = evas_object_smart_add
4817 (evas_object_evas_get(obj), _elm_genlist_pan_smart_class_new());
4818 pan_data = evas_object_smart_data_get(priv->pan_obj);
4819 pan_data->wsd = priv;
4822 // FIXME: difference from upstream
4823 evas_object_event_callback_add(pan_obj, EVAS_CALLBACK_MOUSE_DOWN,
4824 _mouse_down_scroller, obj);
4825 evas_object_event_callback_add(pan_obj, EVAS_CALLBACK_MOUSE_UP,
4826 _mouse_up_scroller, obj);
4827 evas_object_event_callback_add(pan_obj, EVAS_CALLBACK_MOUSE_MOVE,
4828 _mouse_move_scroller, obj);
4831 priv->s_iface->extern_pan_set(obj, priv->pan_obj);
4833 edje_object_size_min_calc(ELM_WIDGET_DATA(priv)->resize_obj, &minw, &minh);
4834 evas_object_size_hint_min_set(obj, minw, minh);
4836 _item_cache_all_free(priv);
4837 _mirrored_set(obj, elm_widget_mirrored_get(obj));
4839 elm_layout_sizing_eval(obj);
4843 _elm_genlist_smart_del(Evas_Object *obj)
4845 ELM_GENLIST_DATA_GET(obj, sd);
4847 elm_genlist_clear(obj);
4848 if (sd->calc_job) ecore_job_del(sd->calc_job);
4849 if (sd->update_job) ecore_job_del(sd->update_job);
4850 if (sd->queue_idle_enterer) ecore_idle_enterer_del(sd->queue_idle_enterer);
4851 if (sd->must_recalc_idler) ecore_idler_del(sd->must_recalc_idler);
4852 if (sd->multi_timer) ecore_timer_del(sd->multi_timer);
4853 if (sd->decorate_it_type) eina_stringshare_del(sd->decorate_it_type);
4854 if (sd->scr_hold_timer) ecore_timer_del(sd->scr_hold_timer);
4856 evas_object_del(sd->pan_obj);
4857 ELM_WIDGET_CLASS(_elm_genlist_parent_sc)->base.del(obj);
4861 _elm_genlist_smart_move(Evas_Object *obj,
4865 ELM_GENLIST_DATA_GET(obj, sd);
4867 ELM_WIDGET_CLASS(_elm_genlist_parent_sc)->base.move(obj, x, y);
4869 evas_object_move(sd->hit_rect, x, y);
4873 _elm_genlist_smart_resize(Evas_Object *obj,
4877 ELM_GENLIST_DATA_GET(obj, sd);
4879 ELM_WIDGET_CLASS(_elm_genlist_parent_sc)->base.resize(obj, w, h);
4881 evas_object_resize(sd->hit_rect, w, h);
4885 _elm_genlist_smart_member_add(Evas_Object *obj,
4886 Evas_Object *member)
4888 ELM_GENLIST_DATA_GET(obj, sd);
4890 ELM_WIDGET_CLASS(_elm_genlist_parent_sc)->base.member_add(obj, member);
4893 evas_object_raise(sd->hit_rect);
4897 _access_obj_process(Elm_Genlist_Smart_Data *sd, Eina_Bool is_access)
4900 Eina_Bool done = EINA_FALSE;
4902 EINA_INLIST_FOREACH(sd->blocks, itb)
4910 EINA_LIST_FOREACH(itb->items, l, it)
4912 if (!it->realized) continue;
4913 if (is_access) _access_widget_item_register(it);
4915 _elm_access_widget_item_unregister((Elm_Widget_Item *)it);
4918 else if (done) break;
4923 _elm_genlist_smart_access(Evas_Object *obj, Eina_Bool is_access)
4925 ELM_GENLIST_CHECK(obj);
4926 ELM_GENLIST_DATA_GET(obj, sd);
4929 ELM_WIDGET_CLASS(ELM_WIDGET_DATA(sd)->api)->focus_next =
4930 _elm_genlist_smart_focus_next;
4932 ELM_WIDGET_CLASS(ELM_WIDGET_DATA(sd)->api)->focus_next = NULL;
4933 _access_obj_process(sd, is_access);
4937 _elm_genlist_smart_set_user(Elm_Genlist_Smart_Class *sc)
4939 ELM_WIDGET_CLASS(sc)->base.add = _elm_genlist_smart_add;
4940 ELM_WIDGET_CLASS(sc)->base.del = _elm_genlist_smart_del;
4941 ELM_WIDGET_CLASS(sc)->base.move = _elm_genlist_smart_move;
4942 ELM_WIDGET_CLASS(sc)->base.resize = _elm_genlist_smart_resize;
4943 ELM_WIDGET_CLASS(sc)->base.member_add = _elm_genlist_smart_member_add;
4945 ELM_WIDGET_CLASS(sc)->sub_object_add = _elm_genlist_smart_sub_object_add;
4946 ELM_WIDGET_CLASS(sc)->sub_object_del = _elm_genlist_smart_sub_object_del;
4947 ELM_WIDGET_CLASS(sc)->on_focus = _elm_genlist_smart_on_focus;
4948 ELM_WIDGET_CLASS(sc)->theme = _elm_genlist_smart_theme;
4949 ELM_WIDGET_CLASS(sc)->event = _elm_genlist_smart_event;
4950 ELM_WIDGET_CLASS(sc)->translate = _elm_genlist_smart_translate;
4952 /* not a 'focus chain manager' */
4953 ELM_WIDGET_CLASS(sc)->focus_next = NULL;
4954 ELM_WIDGET_CLASS(sc)->focus_direction = NULL;
4956 ELM_LAYOUT_CLASS(sc)->sizing_eval = _elm_genlist_smart_sizing_eval;
4959 if (_elm_config->access_mode == ELM_ACCESS_MODE_ON)
4960 ELM_WIDGET_CLASS(sc)->focus_next = _elm_genlist_smart_focus_next;
4962 ELM_WIDGET_CLASS(sc)->access = _elm_genlist_smart_access;
4965 EAPI const Elm_Genlist_Smart_Class *
4966 elm_genlist_smart_class_get(void)
4968 static Elm_Genlist_Smart_Class _sc =
4969 ELM_GENLIST_SMART_CLASS_INIT_NAME_VERSION(ELM_GENLIST_SMART_NAME);
4970 static const Elm_Genlist_Smart_Class *class = NULL;
4971 Evas_Smart_Class *esc = (Evas_Smart_Class *)&_sc;
4976 _elm_genlist_smart_set(&_sc);
4977 esc->callbacks = _smart_callbacks;
4984 elm_genlist_add(Evas_Object *parent)
4988 EINA_SAFETY_ON_NULL_RETURN_VAL(parent, NULL);
4990 obj = elm_widget_add(_elm_genlist_smart_class_new(), parent);
4991 if (!obj) return NULL;
4993 if (!elm_widget_sub_object_add(parent, obj))
4994 ERR("could not add %p as sub object of %p", obj, parent);
5000 static Evas_Object *
5001 _item_content_get_hook(Elm_Gen_Item *it,
5004 Evas_Object *ret = NULL;
5005 if (it->deco_all_view)
5006 ret = edje_object_part_swallow_get(it->deco_all_view, part);
5007 else if (it->decorate_it_set)
5008 ret = edje_object_part_swallow_get(it->item->deco_it_view, part);
5010 ret = edje_object_part_swallow_get(VIEW(it), part);
5015 _item_text_get_hook(Elm_Gen_Item *it,
5018 if (!it->itc->func.text_get) return NULL;
5019 const char *ret = NULL;
5020 if (it->deco_all_view)
5021 ret = edje_object_part_text_get(it->deco_all_view, part);
5022 else if (it->decorate_it_set)
5023 ret = edje_object_part_text_get(it->item->deco_it_view, part);
5025 ret = edje_object_part_text_get(VIEW(it), part);
5030 _item_disable_hook(Elm_Object_Item *item)
5034 Elm_Gen_Item *it = (Elm_Gen_Item *)item;
5037 elm_genlist_item_selected_set(item, EINA_FALSE);
5041 if (elm_widget_item_disabled_get(it))
5043 edje_object_signal_emit(VIEW(it), "elm,state,disabled", "elm");
5044 if (it->deco_all_view)
5045 edje_object_signal_emit
5046 (it->deco_all_view, "elm,state,disabled", "elm");
5050 edje_object_signal_emit(VIEW(it), "elm,state,enabled", "elm");
5051 if (it->deco_all_view)
5052 edje_object_signal_emit
5053 (it->deco_all_view, "elm,state,enabled", "elm");
5055 EINA_LIST_FOREACH(it->content_objs, l, obj)
5056 elm_widget_disabled_set(obj, elm_widget_item_disabled_get(it));
5061 _item_free(Elm_Gen_Item *it)
5063 Elm_Genlist_Smart_Data *sd = GL_IT(it)->wsd;
5065 #if GENLIST_FX_SUPPORT
5066 if (sd->fx_mode) GL_IT(it)->has_proxy_it = EINA_FALSE;
5067 _elm_genlist_proxy_item_del((Elm_Object_Item *)it);
5068 if ((!sd->fx_mode) || (sd->genlist_clearing))
5071 _item_free_common(it);
5073 _item_unrealize(it, EINA_FALSE);
5074 elm_genlist_item_class_unref((Elm_Genlist_Item_Class *)it->itc);
5077 if (sd->calc_job) ecore_job_del(sd->calc_job);
5078 sd->calc_job = ecore_job_add(_calc_job, sd);
5081 #if GENLIST_FX_SUPPORT
5083 _item_del_pre_fx_process(Elm_Gen_Item *it)
5085 Elm_Genlist_Smart_Data *sd = GL_IT(it)->wsd;
5087 sd->fx_items_deleted = EINA_TRUE;
5088 _elm_genlist_fx_capture(ELM_WIDGET_DATA(sd)->obj, 0);
5089 if (!eina_list_data_find(sd->pending_del_items, it))
5090 sd->pending_del_items = eina_list_append(sd->pending_del_items, it);
5092 _item_free_common(it);
5098 _item_del_pre_hook(Elm_Object_Item *item)
5100 Elm_Gen_Item *it = (Elm_Gen_Item *)item;
5102 #if GENLIST_FX_SUPPORT
5103 if ((GL_IT(it)->wsd->fx_mode) && (!GL_IT(it)->wsd->genlist_clearing))
5105 _item_del_pre_fx_process(it);
5114 _item_signal_emit_hook(Elm_Object_Item *it,
5115 const char *emission,
5118 edje_object_signal_emit(VIEW(it), emission, source);
5121 static Elm_Gen_Item *
5122 _elm_genlist_item_new(Elm_Genlist_Smart_Data *sd,
5123 const Elm_Genlist_Item_Class *itc,
5125 Elm_Gen_Item *parent,
5126 Elm_Genlist_Item_Type type,
5128 const void *func_data)
5130 Elm_Gen_Item *it, *it2;
5133 if (!itc) return NULL;
5135 it = elm_widget_item_new(ELM_WIDGET_DATA(sd)->obj, Elm_Gen_Item);
5136 if (!it) return NULL;
5139 elm_genlist_item_class_ref((Elm_Genlist_Item_Class *)itc);
5141 it->base.data = data;
5142 it->parent = parent;
5143 it->func.func = func;
5144 it->func.data = func_data;
5146 elm_widget_item_content_get_hook_set(it, _item_content_get_hook);
5147 elm_widget_item_text_get_hook_set(it, _item_text_get_hook);
5148 elm_widget_item_disable_hook_set(it, _item_disable_hook);
5149 elm_widget_item_del_pre_hook_set(it, _item_del_pre_hook);
5150 elm_widget_item_signal_emit_hook_set(it, _item_signal_emit_hook);
5152 #if 0 // FIXME: difference from upstream
5153 it->can_focus = EINA_TRUE;
5155 //it->del_cb = (Ecore_Cb)_item_free;
5156 //it->highlight_cb = (Ecore_Cb)_item_highlight;
5157 //it->unhighlight_cb = (Ecore_Cb)_item_unhighlight;
5158 //it->sel_cb = (Ecore_Cb)_item_select;
5159 //it->unsel_cb = (Ecore_Cb)_item_unselect;
5160 //it->unrealize_cb = (Ecore_Cb)_item_unrealize_cb;
5162 GL_IT(it) = ELM_NEW(Elm_Gen_Item_Type);
5163 GL_IT(it)->wsd = sd;
5164 GL_IT(it)->type = type;
5165 if (type & ELM_GENLIST_ITEM_GROUP) it->group++;
5169 if (it->parent->group)
5170 GL_IT(it)->group_item = parent;
5171 else if (GL_IT(it->parent)->group_item)
5172 GL_IT(it)->group_item = GL_IT(it->parent)->group_item;
5174 for (it2 = it, depth = 0; it2->parent; it2 = it2->parent)
5176 if (!it2->parent->group) depth += 1;
5178 GL_IT(it)->expanded_depth = depth;
5181 #if GENLIST_FX_SUPPORT
5182 it->item->num = sd->item_count;
5185 sd->fx_items_deleted = EINA_FALSE;
5186 _elm_genlist_fx_capture(ELM_WIDGET_DATA(sd)->obj, 0);
5193 _elm_genlist_item_compare(const void *data,
5196 const Elm_Gen_Item *it, *item1;
5198 it = ELM_GEN_ITEM_FROM_INLIST(data);
5199 item1 = ELM_GEN_ITEM_FROM_INLIST(data1);
5200 return GL_IT(it)->wsd->item_compare_cb(it, item1);
5204 _elm_genlist_item_list_compare(const void *data,
5207 const Elm_Gen_Item *it = data;
5208 const Elm_Gen_Item *item1 = data1;
5210 return GL_IT(it)->wsd->item_compare_cb(it, item1);
5214 elm_genlist_items_count(const Evas_Object *obj)
5216 ELM_GENLIST_CHECK(obj) 0;
5217 ELM_GENLIST_DATA_GET(obj, sd);
5219 return sd->item_count;
5222 EAPI Elm_Object_Item *
5223 elm_genlist_item_append(Evas_Object *obj,
5224 const Elm_Genlist_Item_Class *itc,
5226 Elm_Object_Item *parent,
5227 Elm_Genlist_Item_Type type,
5229 const void *func_data)
5233 ELM_GENLIST_CHECK(obj) NULL;
5234 ELM_GENLIST_DATA_GET(obj, sd);
5236 ELM_WIDGET_ITEM_RETURN_IF_ONDEL(((Elm_Widget_Item *)parent),NULL);
5238 it = _elm_genlist_item_new
5239 (sd, itc, data, (Elm_Gen_Item *)parent, type, func, func_data);
5240 if (!it) return NULL;
5245 sd->group_items = eina_list_append(sd->group_items, it);
5246 sd->items = eina_inlist_append(sd->items, EINA_INLIST_GET(it));
5247 it->item->rel = NULL;
5251 Elm_Gen_Item *it2 = NULL;
5252 Eina_List *ll = eina_list_last(it->parent->item->items);
5254 if (ll) it2 = ll->data;
5255 it->parent->item->items =
5256 eina_list_append(it->parent->item->items, it);
5257 if (!it2) it2 = it->parent;
5258 sd->items = eina_inlist_append_relative
5259 (sd->items, EINA_INLIST_GET(it), EINA_INLIST_GET(it2));
5260 it->item->rel = it2;
5261 it2->item->rel_revs = eina_list_append(it2->item->rel_revs, it);
5263 it->item->before = EINA_FALSE;
5264 _item_queue(sd, it, NULL);
5266 return (Elm_Object_Item *)it;
5269 EAPI Elm_Object_Item *
5270 elm_genlist_item_prepend(Evas_Object *obj,
5271 const Elm_Genlist_Item_Class *itc,
5273 Elm_Object_Item *parent,
5274 Elm_Genlist_Item_Type type,
5276 const void *func_data)
5280 ELM_GENLIST_CHECK(obj) NULL;
5281 ELM_GENLIST_DATA_GET(obj, sd);
5282 it = _elm_genlist_item_new
5283 (sd, itc, data, (Elm_Gen_Item *)parent, type, func, func_data);
5284 if (!it) return NULL;
5289 sd->group_items = eina_list_prepend(sd->group_items, it);
5290 sd->items = eina_inlist_prepend(sd->items, EINA_INLIST_GET(it));
5291 it->item->rel = NULL;
5295 Elm_Gen_Item *it2 = NULL;
5296 Eina_List *ll = it->parent->item->items;
5298 if (ll) it2 = ll->data;
5299 it->parent->item->items =
5300 eina_list_prepend(it->parent->item->items, it);
5301 if (!it2) it2 = it->parent;
5302 sd->items = eina_inlist_prepend_relative
5303 (sd->items, EINA_INLIST_GET(it), EINA_INLIST_GET(it2));
5304 it->item->rel = it2;
5305 it2->item->rel_revs = eina_list_append(it2->item->rel_revs, it);
5307 it->item->before = EINA_TRUE;
5308 _item_queue(sd, it, NULL);
5310 return (Elm_Object_Item *)it;
5313 EAPI Elm_Object_Item *
5314 elm_genlist_item_insert_after(Evas_Object *obj,
5315 const Elm_Genlist_Item_Class *itc,
5317 Elm_Object_Item *parent,
5318 Elm_Object_Item *after_it,
5319 Elm_Genlist_Item_Type type,
5321 const void *func_data)
5323 Elm_Gen_Item *after = (Elm_Gen_Item *)after_it;
5326 ELM_GENLIST_CHECK(obj) NULL;
5327 ELM_GENLIST_ITEM_CHECK_OR_RETURN(after_it, NULL);
5328 ELM_GENLIST_DATA_GET(obj, sd);
5330 /* It makes no sense to insert after in an empty list with after !=
5331 * NULL, something really bad is happening in your app. */
5332 EINA_SAFETY_ON_NULL_RETURN_VAL(sd->items, NULL);
5334 it = _elm_genlist_item_new
5335 (sd, itc, data, (Elm_Gen_Item *)parent, type, func, func_data);
5336 if (!it) return NULL;
5340 if ((it->group) && (after->group))
5341 sd->group_items = eina_list_append_relative
5342 (sd->group_items, it, after);
5346 it->parent->item->items =
5347 eina_list_append_relative(it->parent->item->items, it, after);
5349 sd->items = eina_inlist_append_relative
5350 (sd->items, EINA_INLIST_GET(it), EINA_INLIST_GET(after));
5352 it->item->rel = after;
5353 after->item->rel_revs = eina_list_append(after->item->rel_revs, it);
5354 it->item->before = EINA_FALSE;
5355 _item_queue(sd, it, NULL);
5357 return (Elm_Object_Item *)it;
5360 EAPI Elm_Object_Item *
5361 elm_genlist_item_insert_before(Evas_Object *obj,
5362 const Elm_Genlist_Item_Class *itc,
5364 Elm_Object_Item *parent,
5365 Elm_Object_Item *before_it,
5366 Elm_Genlist_Item_Type type,
5368 const void *func_data)
5370 Elm_Gen_Item *before = (Elm_Gen_Item *)before_it;
5373 ELM_GENLIST_CHECK(obj) NULL;
5374 ELM_GENLIST_ITEM_CHECK_OR_RETURN(before_it, NULL);
5375 ELM_GENLIST_DATA_GET(obj, sd);
5377 /* It makes no sense to insert before in an empty list with before
5378 * != NULL, something really bad is happening in your app. */
5379 EINA_SAFETY_ON_NULL_RETURN_VAL(sd->items, NULL);
5381 it = _elm_genlist_item_new
5382 (sd, itc, data, (Elm_Gen_Item *)parent, type, func, func_data);
5383 if (!it) return NULL;
5387 if (it->group && before->group)
5389 eina_list_prepend_relative(sd->group_items, it, before);
5393 it->parent->item->items =
5394 eina_list_prepend_relative(it->parent->item->items, it, before);
5396 sd->items = eina_inlist_prepend_relative
5397 (sd->items, EINA_INLIST_GET(it), EINA_INLIST_GET(before));
5399 it->item->rel = before;
5400 before->item->rel_revs = eina_list_append(before->item->rel_revs, it);
5401 it->item->before = EINA_TRUE;
5402 _item_queue(sd, it, NULL);
5404 return (Elm_Object_Item *)it;
5407 EAPI Elm_Object_Item *
5408 elm_genlist_item_sorted_insert(Evas_Object *obj,
5409 const Elm_Genlist_Item_Class *itc,
5411 Elm_Object_Item *parent,
5412 Elm_Genlist_Item_Type type,
5413 Eina_Compare_Cb comp,
5415 const void *func_data)
5417 Elm_Gen_Item *rel = NULL;
5420 ELM_GENLIST_CHECK(obj) NULL;
5421 ELM_GENLIST_DATA_GET(obj, sd);
5423 it = _elm_genlist_item_new
5424 (sd, itc, data, (Elm_Gen_Item *)parent, type, func, func_data);
5425 if (!it) return NULL;
5427 sd->item_compare_cb = comp;
5434 l = eina_list_search_sorted_near_list
5435 (it->parent->item->items, _elm_genlist_item_list_compare, it,
5439 rel = eina_list_data_get(l);
5443 if (cmp_result >= 0)
5445 it->parent->item->items = eina_list_prepend_relative_list
5446 (it->parent->item->items, it, l);
5447 sd->items = eina_inlist_prepend_relative
5448 (sd->items, EINA_INLIST_GET(it), EINA_INLIST_GET(rel));
5449 it->item->before = EINA_FALSE;
5451 else if (cmp_result < 0)
5453 it->parent->item->items = eina_list_append_relative_list
5454 (it->parent->item->items, it, l);
5455 sd->items = eina_inlist_append_relative
5456 (sd->items, EINA_INLIST_GET(it), EINA_INLIST_GET(rel));
5457 it->item->before = EINA_TRUE;
5464 sd->state = eina_inlist_sorted_state_new();
5465 eina_inlist_sorted_state_init(sd->state, sd->items);
5466 sd->requeued = EINA_FALSE;
5470 sd->group_items = eina_list_append(sd->group_items, it);
5472 sd->items = eina_inlist_sorted_state_insert
5473 (sd->items, EINA_INLIST_GET(it), _elm_genlist_item_compare,
5476 if (EINA_INLIST_GET(it)->next)
5478 rel = ELM_GEN_ITEM_FROM_INLIST(EINA_INLIST_GET(it)->next);
5479 it->item->before = EINA_TRUE;
5481 else if (EINA_INLIST_GET(it)->prev)
5483 rel = ELM_GEN_ITEM_FROM_INLIST(EINA_INLIST_GET(it)->prev);
5484 it->item->before = EINA_FALSE;
5490 it->item->rel = rel;
5491 rel->item->rel_revs = eina_list_append(rel->item->rel_revs, it);
5494 _item_queue(sd, it, _elm_genlist_item_list_compare);
5496 return (Elm_Object_Item *)it;
5500 _elm_genlist_fx_clear(Evas_Object *obj)
5502 ELM_GENLIST_DATA_GET(obj, sd);
5504 Elm_Gen_FX_Item *fi;
5508 EINA_LIST_FREE(sd->capture_before_items, pi)
5510 if ((pi->it) && (GL_IT(pi->it))) GL_IT(pi->it)->has_proxy_it = EINA_FALSE;
5511 if (pi->proxy) evas_object_smart_member_del(pi->proxy);
5512 if (pi->proxy) evas_object_del(pi->proxy);
5515 EINA_LIST_FREE(sd->capture_after_items, pi)
5517 if ((pi->it) && (GL_IT(pi->it))) GL_IT(pi->it)->has_proxy_it = EINA_FALSE;
5518 if (pi->proxy) evas_object_smart_member_del(pi->proxy);
5519 if (pi->proxy) evas_object_del(pi->proxy);
5523 EINA_LIST_FREE(sd->fx_items, fi)
5525 if (fi->trans) elm_transit_del(fi->trans);
5529 EINA_LIST_FREE (sd->pending_unrealized_items, it)
5530 _item_unrealize(it, EINA_FALSE);
5532 EINA_LIST_FREE (sd->pending_unrealized_decorate_all_items, it)
5533 _decorate_all_item_unrealize(it);
5535 EINA_LIST_FREE (sd->pending_del_items, it)
5538 _elm_widget_item_free((Elm_Widget_Item *)it);
5540 if (sd->alpha_bg) evas_object_del(sd->alpha_bg);
5541 sd->alpha_bg = NULL;
5542 if (sd->fx_timer) ecore_timer_del(sd->fx_timer);
5543 sd->fx_timer = NULL;
5545 sd->genlist_clearing = EINA_TRUE;
5546 sd->fx_playing = EINA_FALSE;
5547 sd->sorting = EINA_FALSE;
5548 sd->fx_first_captured = EINA_FALSE;
5549 sd->fx_items_deleted = EINA_FALSE;
5553 elm_genlist_clear(Evas_Object *obj)
5555 ELM_GENLIST_CHECK(obj);
5556 ELM_GENLIST_DATA_GET(obj, sd);
5561 eina_inlist_sorted_state_free(sd->state);
5565 #if GENLIST_FX_SUPPORT
5568 _elm_genlist_fx_clear(obj);
5569 sd->genlist_clearing = EINA_TRUE;
5570 sd->rendered = EINA_FALSE;
5573 #if GENLIST_PINCH_ZOOM_SUPPORT
5574 sd->pinch_zoom_h = 0;
5575 sd->realized_top_item = NULL;
5576 sd->pinch_zoom_mode = ELM_GEN_PINCH_ZOOM_NONE;
5579 //evas_event_freeze(evas_object_evas_get(ELM_WIDGET_DATA(sd)->obj));
5581 // Do not use EINA_INLIST_FOREACH or EINA_INLIST_FOREACH_SAFE
5582 // because sd->items can be modified inside elm_widget_item_del()
5585 it = EINA_INLIST_CONTAINER_GET(sd->items->last, Elm_Gen_Item);
5586 it->item->nocache_once = EINA_TRUE;
5587 elm_widget_item_del(it);
5591 _item_cache_all_free(sd);
5593 sd->pan_changed = EINA_TRUE;
5594 if (sd->selected) sd->selected = eina_list_free(sd->selected);
5595 sd->selected = NULL;
5597 sd->anchor_item = NULL;
5598 if (sd->multi_timer)
5600 ecore_timer_del(sd->multi_timer);
5601 sd->multi_timer = NULL;
5605 ecore_job_del(sd->update_job);
5606 sd->update_job = NULL;
5610 ecore_job_del(sd->calc_job);
5611 sd->calc_job = NULL;
5613 if (sd->queue_idle_enterer)
5615 ecore_idle_enterer_del(sd->queue_idle_enterer);
5616 sd->queue_idle_enterer = NULL;
5618 if (sd->must_recalc_idler)
5620 ecore_idler_del(sd->must_recalc_idler);
5621 sd->must_recalc_idler = NULL;
5623 if (sd->queue) sd->queue = eina_list_free(sd->queue);
5624 if (sd->reorder_move_animator)
5626 ecore_animator_del(sd->reorder_move_animator);
5627 sd->reorder_move_animator = NULL;
5629 sd->show_item = NULL;
5630 sd->reorder_old_pan_y = 0;
5637 if (sd->alpha_bg) evas_object_del(sd->alpha_bg);
5638 sd->alpha_bg = NULL;
5642 evas_object_size_hint_min_set(sd->pan_obj, sd->minw, sd->minh);
5643 evas_object_smart_callback_call(sd->pan_obj, "changed", NULL);
5645 elm_layout_sizing_eval(ELM_WIDGET_DATA(sd)->obj);
5646 sd->s_iface->content_region_show(obj, 0, 0, 0, 0);
5648 #if GENLIST_FX_SUPPORT
5649 sd->genlist_clearing = EINA_FALSE;
5651 //evas_event_thaw(evas_object_evas_get(ELM_WIDGET_DATA(sd)->obj));
5652 //evas_event_thaw_eval(evas_object_evas_get(ELM_WIDGET_DATA(sd)->obj));
5656 elm_genlist_multi_select_set(Evas_Object *obj,
5659 ELM_GENLIST_CHECK(obj);
5660 ELM_GENLIST_DATA_GET(obj, sd);
5662 sd->multi = !!multi;
5666 elm_genlist_multi_select_get(const Evas_Object *obj)
5668 ELM_GENLIST_CHECK(obj) EINA_FALSE;
5669 ELM_GENLIST_DATA_GET(obj, sd);
5674 EAPI Elm_Object_Item *
5675 elm_genlist_selected_item_get(const Evas_Object *obj)
5677 ELM_GENLIST_CHECK(obj) NULL;
5678 ELM_GENLIST_DATA_GET(obj, sd);
5681 return sd->selected->data;
5687 elm_genlist_selected_items_get(const Evas_Object *obj)
5689 ELM_GENLIST_CHECK(obj) NULL;
5690 ELM_GENLIST_DATA_GET(obj, sd);
5692 return sd->selected;
5696 elm_genlist_realized_items_get(const Evas_Object *obj)
5699 Eina_List *list = NULL;
5700 Eina_Bool done = EINA_FALSE;
5702 ELM_GENLIST_CHECK(obj) NULL;
5703 ELM_GENLIST_DATA_GET(obj, sd);
5705 EINA_INLIST_FOREACH(sd->blocks, itb)
5713 EINA_LIST_FOREACH(itb->items, l, it)
5715 if (it->realized) list = eina_list_append(list, it);
5726 EAPI Elm_Object_Item *
5727 elm_genlist_at_xy_item_get(const Evas_Object *obj,
5732 Evas_Coord ox, oy, ow, oh;
5736 ELM_GENLIST_CHECK(obj) NULL;
5737 ELM_GENLIST_DATA_GET(obj, sd);
5739 evas_object_geometry_get(sd->pan_obj, &ox, &oy, &ow, &oh);
5741 EINA_INLIST_FOREACH(sd->blocks, itb)
5746 if (!ELM_RECTS_INTERSECT(ox + itb->x - itb->sd->pan_x,
5747 oy + itb->y - itb->sd->pan_y,
5748 itb->w, itb->h, x, y, 1, 1))
5750 EINA_LIST_FOREACH(itb->items, l, it)
5752 Evas_Coord itx, ity;
5754 itx = ox + itb->x + it->x - itb->sd->pan_x;
5755 ity = oy + itb->y + it->y - itb->sd->pan_y;
5756 if (ELM_RECTS_INTERSECT
5757 (itx, ity, it->item->w, it->item->h, x, y, 1, 1))
5761 if (y <= (ity + (it->item->h / 4))) *posret = -1;
5762 else if (y >= (ity + it->item->h - (it->item->h / 4)))
5767 return (Elm_Object_Item *)it;
5769 lasty = ity + it->item->h;
5774 if (y > lasty) *posret = 1;
5781 EAPI Elm_Object_Item *
5782 elm_genlist_first_item_get(const Evas_Object *obj)
5784 Elm_Gen_Item *tit, *it = NULL;
5786 ELM_GENLIST_CHECK(obj) NULL;
5787 ELM_GENLIST_DATA_GET(obj, sd);
5789 EINA_INLIST_REVERSE_FOREACH(sd->items, tit) it = tit;
5791 return (Elm_Object_Item *)it;
5794 EAPI Elm_Object_Item *
5795 elm_genlist_last_item_get(const Evas_Object *obj)
5799 ELM_GENLIST_CHECK(obj) NULL;
5800 ELM_GENLIST_DATA_GET(obj, sd);
5801 if (!sd->items) return NULL;
5803 it = ELM_GEN_ITEM_FROM_INLIST(sd->items->last);
5804 return (Elm_Object_Item *)it;
5807 EAPI Elm_Object_Item *
5808 elm_genlist_item_next_get(const Elm_Object_Item *item)
5812 ELM_GENLIST_ITEM_CHECK_OR_RETURN(item, NULL);
5814 it = (Elm_Gen_Item *)item;
5817 it = ELM_GEN_ITEM_FROM_INLIST(EINA_INLIST_GET(it)->next);
5821 return (Elm_Object_Item *)it;
5824 EAPI Elm_Object_Item *
5825 elm_genlist_item_prev_get(const Elm_Object_Item *item)
5829 ELM_GENLIST_ITEM_CHECK_OR_RETURN(item, NULL);
5831 it = (Elm_Gen_Item *)item;
5834 it = ELM_GEN_ITEM_FROM_INLIST(EINA_INLIST_GET(it)->prev);
5838 return (Elm_Object_Item *)it;
5841 EAPI Elm_Object_Item *
5842 elm_genlist_item_parent_get(const Elm_Object_Item *it)
5844 ELM_GENLIST_ITEM_CHECK_OR_RETURN(it, NULL);
5846 return (Elm_Object_Item *)((Elm_Gen_Item *)it)->parent;
5850 elm_genlist_item_subitems_clear(Elm_Object_Item *item)
5852 Elm_Gen_Item *it = (Elm_Gen_Item *)item;
5854 ELM_GENLIST_ITEM_CHECK_OR_RETURN(item);
5855 _item_sub_items_clear(it);
5859 elm_genlist_item_selected_set(Elm_Object_Item *item,
5862 Elm_Gen_Item *it = (Elm_Gen_Item *)item;
5863 ELM_GENLIST_ITEM_CHECK_OR_RETURN(item);
5865 if (elm_widget_item_disabled_get(it)) return;
5866 selected = !!selected;
5867 if (it->selected == selected) return;
5869 _item_select_unselect(it, selected);
5873 elm_genlist_item_selected_get(const Elm_Object_Item *it)
5875 ELM_GENLIST_ITEM_CHECK_OR_RETURN(it, EINA_FALSE);
5877 return ((Elm_Gen_Item *)it)->selected;
5880 static Elm_Gen_Item *
5881 _elm_genlist_expanded_next_item_get(Elm_Gen_Item *it)
5885 if (it->item->expanded)
5887 it2 = (Elm_Gen_Item *)elm_genlist_item_next_get((Elm_Object_Item *)it);
5891 it2 = (Elm_Gen_Item *)elm_genlist_item_next_get((Elm_Object_Item *)it);
5894 if (it->item->expanded_depth >= it2->item->expanded_depth) break;
5895 it2 = (Elm_Gen_Item *)
5896 elm_genlist_item_next_get((Elm_Object_Item *)it2);
5902 static Evas_Object *
5903 _tray_alpha_bg_create(const Evas_Object *obj)
5905 Evas_Object *bg = NULL;
5906 Evas_Coord ox, oy, ow, oh;
5908 ELM_GENLIST_CHECK(obj) NULL;
5909 ELM_GENLIST_DATA_GET(obj, sd);
5911 evas_object_geometry_get(sd->pan_obj, &ox, &oy, &ow, &oh);
5912 bg = evas_object_rectangle_add
5913 (evas_object_evas_get(ELM_WIDGET_DATA(sd)->obj));
5914 evas_object_color_set(bg, 0, 0, 0, 0);
5915 evas_object_resize(bg, ow, oh);
5916 evas_object_move(bg, ox, oy);
5922 elm_genlist_item_expanded_set(Elm_Object_Item *item,
5925 Elm_Gen_Item *it = (Elm_Gen_Item *)item;
5927 ELM_GENLIST_ITEM_CHECK_OR_RETURN(item);
5929 expanded = !!expanded;
5930 if (it->item->expanded == expanded) return;
5931 if (it->item->type != ELM_GENLIST_ITEM_TREE) return;
5932 it->item->expanded = expanded;
5933 GL_IT(it)->wsd->expanded_item = it;
5934 GL_IT(it)->wsd->expanded_next_item =
5935 _elm_genlist_expanded_next_item_get(it);
5937 if (it->item->expanded)
5940 edje_object_signal_emit(VIEW(it), "elm,state,expanded", "elm");
5941 evas_object_smart_callback_call(WIDGET(it), SIG_EXPANDED, it);
5942 GL_IT(it)->wsd->auto_scroll_enabled = EINA_TRUE;
5947 edje_object_signal_emit(VIEW(it), "elm,state,contracted", "elm");
5948 evas_object_smart_callback_call(WIDGET(it), SIG_CONTRACTED, it);
5949 GL_IT(it)->wsd->auto_scroll_enabled = EINA_FALSE;
5954 elm_genlist_item_expanded_get(const Elm_Object_Item *it)
5956 ELM_GENLIST_ITEM_CHECK_OR_RETURN(it, EINA_FALSE);
5958 return ((Elm_Gen_Item *)it)->item->expanded;
5962 elm_genlist_item_expanded_depth_get(const Elm_Object_Item *it)
5964 ELM_GENLIST_ITEM_CHECK_OR_RETURN(it, 0);
5966 return ((Elm_Gen_Item *)it)->item->expanded_depth;
5970 _elm_genlist_item_coordinates_calc(Elm_Object_Item *item,
5971 Elm_Genlist_Item_Scrollto_Type type,
5978 Elm_Gen_Item *it = (Elm_Gen_Item *)item;
5979 Evas_Coord gith = 0;
5981 if (!((GL_IT(it)->wsd->homogeneous) &&
5982 (GL_IT(it)->wsd->mode == ELM_LIST_COMPRESS)))
5984 if ((it->item->queued) || (!it->item->mincalcd))
5986 GL_IT(it)->wsd->show_item = it;
5987 GL_IT(it)->wsd->bring_in = bring_in;
5988 GL_IT(it)->wsd->scroll_to_type = type;
5989 it->item->show_me = EINA_TRUE;
5993 if (GL_IT(it)->wsd->show_item)
5995 GL_IT(it)->wsd->show_item->item->show_me = EINA_FALSE;
5996 GL_IT(it)->wsd->show_item = NULL;
5999 evas_object_geometry_get(GL_IT(it)->wsd->pan_obj, NULL, NULL, w, h);
6002 case ELM_GENLIST_ITEM_SCROLLTO_IN:
6003 if ((it->item->group_item) &&
6004 (GL_IT(it)->wsd->pan_y > (it->y + it->item->block->y)))
6005 gith = it->item->group_item->item->h;
6007 *y = it->y + it->item->block->y - gith;
6010 case ELM_GENLIST_ITEM_SCROLLTO_TOP:
6011 if (it->item->group_item) gith = it->item->group_item->item->h;
6012 *y = it->y + it->item->block->y - gith;
6015 case ELM_GENLIST_ITEM_SCROLLTO_MIDDLE:
6016 *y = it->y + it->item->block->y - (*h / 2) + (it->item->h / 2);
6023 *x = it->x + it->item->block->x;
6024 *w = it->item->block->w;
6030 elm_genlist_item_promote(Elm_Object_Item *item)
6032 ELM_GENLIST_ITEM_CHECK_OR_RETURN(item);
6033 Elm_Gen_Item *it = (Elm_Gen_Item *)item;
6035 (it, (Elm_Gen_Item *)elm_genlist_first_item_get(WIDGET(it)));
6039 elm_genlist_item_demote(Elm_Object_Item *item)
6041 ELM_GENLIST_ITEM_CHECK_OR_RETURN(item);
6042 Elm_Gen_Item *it = (Elm_Gen_Item *)item;
6043 _item_move_after(it, (Elm_Gen_Item *)elm_genlist_last_item_get(WIDGET(it)));
6047 elm_genlist_item_show(Elm_Object_Item *item,
6048 Elm_Genlist_Item_Scrollto_Type type)
6050 Evas_Coord x, y, w, h;
6051 ELM_GENLIST_ITEM_CHECK_OR_RETURN(item);
6052 Elm_Gen_Item *it = (Elm_Gen_Item *)item;
6054 if (_elm_genlist_item_coordinates_calc
6055 (item, type, EINA_FALSE, &x, &y, &w, &h))
6056 GL_IT(it)->wsd->s_iface->content_region_show(WIDGET(item), x, y, w, h);
6060 elm_genlist_item_bring_in(Elm_Object_Item *item,
6061 Elm_Genlist_Item_Scrollto_Type type)
6063 Evas_Coord x, y, w, h;
6064 ELM_GENLIST_ITEM_CHECK_OR_RETURN(item);
6065 Elm_Gen_Item *it = (Elm_Gen_Item *)item;
6067 if (_elm_genlist_item_coordinates_calc
6068 (item, type, EINA_TRUE, &x, &y, &w, &h))
6069 GL_IT(it)->wsd->s_iface->region_bring_in(WIDGET(item), x, y, w, h);
6073 elm_genlist_item_all_contents_unset(Elm_Object_Item *item,
6076 Evas_Object *content;
6078 ELM_GENLIST_ITEM_CHECK_OR_RETURN(item);
6079 Elm_Gen_Item *it = (Elm_Gen_Item *)item;
6081 EINA_LIST_FREE (it->content_objs, content)
6083 evas_object_smart_member_del(content);
6084 evas_object_hide(content);
6085 if (l) *l = eina_list_append(*l, content);
6090 elm_genlist_item_update(Elm_Object_Item *item)
6092 ELM_GENLIST_ITEM_CHECK_OR_RETURN(item);
6093 Elm_Gen_Item *it = (Elm_Gen_Item *)item;
6095 if (!it->item->block) return;
6096 it->item->mincalcd = EINA_FALSE;
6097 it->item->updateme = EINA_TRUE;
6098 it->item->block->updateme = EINA_TRUE;
6099 #if GENLIST_ENTRY_SUPPORT
6100 it->item->unrealize_disabled = EINA_FALSE;
6103 #if GENLIST_FX_SUPPORT
6104 if (GL_IT(it)->wsd->fx_first_captured)
6105 _elm_genlist_fx_clear(ELM_WIDGET_DATA(GL_IT(it)->wsd)->obj);
6108 if (GL_IT(it)->wsd->update_job) ecore_job_del(GL_IT(it)->wsd->update_job);
6109 GL_IT(it)->wsd->update_job = ecore_job_add(_update_job, GL_IT(it)->wsd);
6113 elm_genlist_item_fields_update(Elm_Object_Item *item,
6115 Elm_Genlist_Item_Field_Type itf)
6117 ELM_GENLIST_ITEM_CHECK_OR_RETURN(item);
6118 Elm_Gen_Item *it = (Elm_Gen_Item *)item;
6120 if (!it->item->block) return;
6122 #if GENLIST_ENTRY_SUPPORT
6123 it->item->unrealize_disabled = EINA_FALSE;
6125 if ((!itf) || (itf & ELM_GENLIST_ITEM_FIELD_TEXT))
6127 _item_text_realize(it, VIEW(it), &it->texts, parts);
6129 if ((!itf) || (itf & ELM_GENLIST_ITEM_FIELD_CONTENT))
6131 it->content_objs = _item_content_unrealize(it, VIEW(it),
6132 &it->contents, parts);
6133 it->content_objs = _item_content_realize(it, VIEW(it),
6134 &it->contents, parts);
6138 it->item->flip_content_objs =
6139 _item_mode_content_unrealize(it, VIEW(it),
6140 &it->item->flip_contents, parts,
6141 &it->item->flip_content_objs);
6142 it->item->flip_content_objs =
6143 _item_mode_content_realize(it, VIEW(it),
6144 &it->item->flip_contents, parts,
6145 &it->item->flip_content_objs);
6147 if (it->item->deco_it_view)
6149 it->item->deco_it_content_objs =
6150 _item_mode_content_unrealize(it, it->item->deco_it_view,
6151 &it->item->deco_it_contents, parts,
6152 &it->item->deco_it_content_objs);
6153 it->item->deco_it_content_objs =
6154 _item_mode_content_realize(it, it->item->deco_it_view,
6155 &it->item->deco_it_contents, parts,
6156 &it->item->deco_it_content_objs);
6158 if (GL_IT(it)->wsd->decorate_all_mode)
6160 it->item->deco_all_content_objs =
6161 _item_mode_content_unrealize
6162 (it, it->deco_all_view, &it->item->deco_all_contents, parts,
6163 &it->item->deco_all_content_objs);
6164 it->item->deco_all_content_objs =
6165 _item_mode_content_realize(it, it->deco_all_view,
6166 &it->item->deco_all_contents, parts,
6167 &it->item->deco_all_content_objs);
6171 if ((!itf) || (itf & ELM_GENLIST_ITEM_FIELD_STATE))
6172 _item_state_realize(it, VIEW(it), &it->states, parts);
6176 elm_genlist_item_item_class_update(Elm_Object_Item *item,
6177 const Elm_Genlist_Item_Class *itc)
6179 ELM_GENLIST_ITEM_CHECK_OR_RETURN(item);
6180 Elm_Gen_Item *it = (Elm_Gen_Item *)item;
6182 if (!it->item->block) return;
6183 EINA_SAFETY_ON_NULL_RETURN(itc);
6185 it->item->nocache_once = EINA_TRUE;
6187 elm_widget_stringlist_free(it->texts);
6189 elm_widget_stringlist_free(it->contents);
6190 it->contents = NULL;
6191 elm_widget_stringlist_free(it->states);
6196 elm_widget_stringlist_free(it->item->flip_contents);
6197 it->item->flip_contents = NULL;
6199 if (it->item->deco_it_view)
6201 elm_widget_stringlist_free(it->item->deco_it_texts);
6202 it->item->deco_it_texts = NULL;
6203 elm_widget_stringlist_free(it->item->deco_it_contents);
6204 it->item->deco_it_contents = NULL;
6206 if (GL_IT(it)->wsd->decorate_all_mode)
6208 elm_widget_stringlist_free(it->item->deco_all_texts);
6209 it->item->deco_all_texts = NULL;
6210 elm_widget_stringlist_free(it->item->deco_all_contents);
6211 it->item->deco_all_contents = NULL;
6214 elm_genlist_item_update(item);
6217 EAPI const Elm_Genlist_Item_Class *
6218 elm_genlist_item_item_class_get(const Elm_Object_Item *item)
6220 ELM_GENLIST_ITEM_CHECK_OR_RETURN(item, NULL);
6221 Elm_Gen_Item *it = (Elm_Gen_Item *)item;
6225 static Evas_Object *
6226 _elm_genlist_item_label_create(void *data,
6227 Evas_Object *obj __UNUSED__,
6228 Evas_Object *tooltip,
6229 void *it __UNUSED__)
6231 Evas_Object *label = elm_label_add(tooltip);
6236 elm_object_style_set(label, "tooltip");
6237 elm_object_text_set(label, data);
6243 _elm_genlist_item_label_del_cb(void *data,
6244 Evas_Object *obj __UNUSED__,
6245 void *event_info __UNUSED__)
6247 eina_stringshare_del(data);
6251 elm_genlist_item_tooltip_text_set(Elm_Object_Item *it,
6254 ELM_GENLIST_ITEM_CHECK_OR_RETURN(it);
6256 text = eina_stringshare_add(text);
6257 elm_genlist_item_tooltip_content_cb_set
6258 (it, _elm_genlist_item_label_create, text,
6259 _elm_genlist_item_label_del_cb);
6263 elm_genlist_item_tooltip_content_cb_set(Elm_Object_Item *item,
6264 Elm_Tooltip_Item_Content_Cb func,
6266 Evas_Smart_Cb del_cb)
6268 Elm_Gen_Item *it = (Elm_Gen_Item *)item;
6270 ELM_GENLIST_ITEM_CHECK_OR_GOTO(item, error);
6272 if ((it->tooltip.content_cb == func) && (it->tooltip.data == data))
6275 if (it->tooltip.del_cb)
6276 it->tooltip.del_cb((void *)it->tooltip.data, WIDGET(it), it);
6278 it->tooltip.content_cb = func;
6279 it->tooltip.data = data;
6280 it->tooltip.del_cb = del_cb;
6284 elm_widget_item_tooltip_content_cb_set
6285 (it, it->tooltip.content_cb, it->tooltip.data, NULL);
6286 elm_widget_item_tooltip_style_set(it, it->tooltip.style);
6287 elm_widget_item_tooltip_window_mode_set(it, it->tooltip.free_size);
6293 if (del_cb) del_cb((void *)data, NULL, NULL);
6297 elm_genlist_item_tooltip_unset(Elm_Object_Item *item)
6299 Elm_Gen_Item *it = (Elm_Gen_Item *)item;
6301 ELM_GENLIST_ITEM_CHECK_OR_RETURN(item);
6303 if ((VIEW(it)) && (it->tooltip.content_cb))
6304 elm_widget_item_tooltip_unset(it);
6306 if (it->tooltip.del_cb)
6307 it->tooltip.del_cb((void *)it->tooltip.data, WIDGET(it), it);
6308 it->tooltip.del_cb = NULL;
6309 it->tooltip.content_cb = NULL;
6310 it->tooltip.data = NULL;
6311 it->tooltip.free_size = EINA_FALSE;
6312 if (it->tooltip.style)
6313 elm_genlist_item_tooltip_style_set(item, NULL);
6317 elm_genlist_item_tooltip_style_set(Elm_Object_Item *item,
6320 Elm_Gen_Item *it = (Elm_Gen_Item *)item;
6322 ELM_GENLIST_ITEM_CHECK_OR_RETURN(item);
6324 eina_stringshare_replace(&it->tooltip.style, style);
6325 if (VIEW(it)) elm_widget_item_tooltip_style_set(it, style);
6329 elm_genlist_item_tooltip_style_get(const Elm_Object_Item *it)
6331 return elm_object_item_tooltip_style_get(it);
6335 elm_genlist_item_tooltip_window_mode_set(Elm_Object_Item *item,
6338 Elm_Gen_Item *it = (Elm_Gen_Item *)item;
6340 ELM_GENLIST_ITEM_CHECK_OR_RETURN(item, EINA_FALSE);
6342 it->tooltip.free_size = disable;
6343 if (VIEW(it)) return elm_widget_item_tooltip_window_mode_set(it, disable);
6349 elm_genlist_item_tooltip_window_mode_get(const Elm_Object_Item *it)
6351 return elm_object_tooltip_window_mode_get(VIEW(it));
6355 elm_genlist_item_cursor_set(Elm_Object_Item *item,
6358 Elm_Gen_Item *it = (Elm_Gen_Item *)item;
6360 ELM_GENLIST_ITEM_CHECK_OR_RETURN(item);
6361 eina_stringshare_replace(&it->mouse_cursor, cursor);
6362 if (VIEW(it)) elm_widget_item_cursor_set(it, cursor);
6366 elm_genlist_item_cursor_get(const Elm_Object_Item *it)
6368 return elm_widget_item_cursor_get(it);
6372 elm_genlist_item_cursor_unset(Elm_Object_Item *item)
6374 Elm_Gen_Item *it = (Elm_Gen_Item *)item;
6376 ELM_GENLIST_ITEM_CHECK_OR_RETURN(item);
6378 if (!it->mouse_cursor) return;
6380 if (VIEW(it)) elm_widget_item_cursor_unset(it);
6382 eina_stringshare_del(it->mouse_cursor);
6383 it->mouse_cursor = NULL;
6387 elm_genlist_item_cursor_style_set(Elm_Object_Item *it,
6390 elm_widget_item_cursor_style_set(it, style);
6394 elm_genlist_item_cursor_style_get(const Elm_Object_Item *it)
6396 return elm_widget_item_cursor_style_get(it);
6400 elm_genlist_item_cursor_engine_only_set(Elm_Object_Item *it,
6401 Eina_Bool engine_only)
6403 elm_widget_item_cursor_engine_only_set(it, engine_only);
6407 elm_genlist_item_cursor_engine_only_get(const Elm_Object_Item *it)
6409 return elm_widget_item_cursor_engine_only_get(it);
6413 elm_genlist_item_index_get(const Elm_Object_Item *item)
6417 Elm_Gen_Item *it = (Elm_Gen_Item *)item;
6419 ELM_GENLIST_ITEM_CHECK_OR_RETURN(item, -1);
6421 EINA_INLIST_FOREACH(GL_IT(it)->wsd->items, tmp)
6423 if (tmp == it) break;
6430 elm_genlist_mode_set(Evas_Object *obj,
6433 ELM_GENLIST_CHECK(obj);
6434 ELM_GENLIST_DATA_GET(obj, sd);
6436 if (sd->mode == mode) return;
6438 elm_layout_sizing_eval(obj);
6442 elm_genlist_mode_get(const Evas_Object *obj)
6444 ELM_GENLIST_CHECK(obj) ELM_LIST_LAST;
6445 ELM_GENLIST_DATA_GET(obj, sd);
6451 elm_genlist_bounce_set(Evas_Object *obj,
6455 ELM_GENLIST_CHECK(obj);
6456 ELM_GENLIST_DATA_GET(obj, sd);
6458 sd->h_bounce = !!h_bounce;
6459 sd->v_bounce = !!v_bounce;
6460 sd->s_iface->bounce_allow_set(obj, sd->h_bounce, sd->v_bounce);
6464 elm_genlist_bounce_get(const Evas_Object *obj,
6465 Eina_Bool *h_bounce,
6466 Eina_Bool *v_bounce)
6468 ELM_GENLIST_CHECK(obj);
6469 ELM_GENLIST_DATA_GET(obj, sd);
6471 if (h_bounce) *h_bounce = sd->h_bounce;
6472 if (v_bounce) *v_bounce = sd->v_bounce;
6476 elm_genlist_homogeneous_set(Evas_Object *obj,
6477 Eina_Bool homogeneous)
6479 ELM_GENLIST_CHECK(obj);
6480 ELM_GENLIST_DATA_GET(obj, sd);
6482 sd->homogeneous = !!homogeneous;
6486 elm_genlist_homogeneous_get(const Evas_Object *obj)
6488 ELM_GENLIST_CHECK(obj) EINA_FALSE;
6489 ELM_GENLIST_DATA_GET(obj, sd);
6491 return sd->homogeneous;
6495 elm_genlist_block_count_set(Evas_Object *obj,
6498 ELM_GENLIST_CHECK(obj);
6499 ELM_GENLIST_DATA_GET(obj, sd);
6500 EINA_SAFETY_ON_TRUE_RETURN(count < 1);
6502 sd->max_items_per_block = count;
6503 sd->item_cache_max = sd->max_items_per_block * 2;
6504 _item_cache_all_free(sd);
6508 elm_genlist_block_count_get(const Evas_Object *obj)
6510 ELM_GENLIST_CHECK(obj) 0;
6511 ELM_GENLIST_DATA_GET(obj, sd);
6513 return sd->max_items_per_block;
6517 elm_genlist_longpress_timeout_set(Evas_Object *obj,
6520 ELM_GENLIST_CHECK(obj);
6521 ELM_GENLIST_DATA_GET(obj, sd);
6523 sd->longpress_timeout = timeout;
6527 elm_genlist_longpress_timeout_get(const Evas_Object *obj)
6529 ELM_GENLIST_CHECK(obj) 0;
6530 ELM_GENLIST_DATA_GET(obj, sd);
6532 return sd->longpress_timeout;
6536 elm_genlist_scroller_policy_set(Evas_Object *obj,
6537 Elm_Scroller_Policy policy_h,
6538 Elm_Scroller_Policy policy_v)
6540 ELM_GENLIST_CHECK(obj);
6541 ELM_GENLIST_DATA_GET(obj, sd);
6543 if ((policy_h >= ELM_SCROLLER_POLICY_LAST) ||
6544 (policy_v >= ELM_SCROLLER_POLICY_LAST))
6547 sd->s_iface->policy_set(obj, policy_h, policy_v);
6551 elm_genlist_scroller_policy_get(const Evas_Object *obj,
6552 Elm_Scroller_Policy *policy_h,
6553 Elm_Scroller_Policy *policy_v)
6555 Elm_Scroller_Policy s_policy_h, s_policy_v;
6557 ELM_GENLIST_CHECK(obj);
6558 ELM_GENLIST_DATA_GET(obj, sd);
6560 sd->s_iface->policy_get(obj, &s_policy_h, &s_policy_v);
6561 if (policy_h) *policy_h = (Elm_Scroller_Policy)s_policy_h;
6562 if (policy_v) *policy_v = (Elm_Scroller_Policy)s_policy_v;
6566 elm_genlist_realized_items_update(Evas_Object *obj)
6568 Eina_List *list, *l;
6569 Elm_Object_Item *it;
6571 ELM_GENLIST_CHECK(obj);
6573 list = elm_genlist_realized_items_get(obj);
6574 EINA_LIST_FOREACH(list, l, it)
6575 elm_genlist_item_update(it);
6579 elm_genlist_item_decorate_mode_set(Elm_Object_Item *item,
6580 const char *decorate_it_type,
6581 Eina_Bool decorate_it_set)
6583 Elm_Gen_Item *it = (Elm_Gen_Item *)item;
6584 Elm_Genlist_Smart_Data *sd;
6586 ELM_GENLIST_ITEM_CHECK_OR_RETURN(item);
6587 sd = GL_IT(it)->wsd;
6589 if (elm_widget_item_disabled_get(it)) return;
6590 if (!decorate_it_type) return;
6591 if (sd->decorate_all_mode) return;
6593 if ((sd->mode_item == it) &&
6594 (!strcmp(decorate_it_type, sd->decorate_it_type)) &&
6597 if (!it->itc->decorate_item_style) return;
6598 it->decorate_it_set = decorate_it_set;
6601 if (((sd->decorate_it_type)
6602 && (strcmp(decorate_it_type, sd->decorate_it_type))) ||
6603 (decorate_it_set) || ((it == sd->mode_item) && (!decorate_it_set)))
6604 _decorate_item_unset(sd);
6606 eina_stringshare_replace(&sd->decorate_it_type, decorate_it_type);
6607 if (decorate_it_set) _decorate_item_set(it);
6611 elm_genlist_item_decorate_mode_get(const Elm_Object_Item *item)
6613 Elm_Gen_Item *i = (Elm_Gen_Item *)item;
6615 ELM_GENLIST_ITEM_CHECK_OR_RETURN(item, NULL);
6616 return GL_IT(i)->wsd->decorate_it_type;
6619 EAPI Elm_Object_Item *
6620 elm_genlist_decorated_item_get(const Evas_Object *obj)
6622 ELM_GENLIST_CHECK(obj) NULL;
6623 ELM_GENLIST_DATA_GET(obj, sd);
6625 return (Elm_Object_Item *)sd->mode_item;
6629 elm_genlist_decorate_mode_get(const Evas_Object *obj)
6631 ELM_GENLIST_CHECK(obj) EINA_FALSE;
6632 ELM_GENLIST_DATA_GET(obj, sd);
6634 return sd->decorate_all_mode;
6638 elm_genlist_decorate_mode_set(Evas_Object *obj,
6639 Eina_Bool decorated)
6642 Eina_List *list, *l;
6644 ELM_GENLIST_CHECK(obj);
6645 ELM_GENLIST_DATA_GET(obj, sd);
6647 decorated = !!decorated;
6648 if (sd->decorate_all_mode == decorated) return;
6649 // decorate_all_mode should be set first
6650 // because content_get func. will be called after this
6651 // and user can check whether deocrate_all_mode is enabeld.
6652 sd->decorate_all_mode = decorated;
6654 list = elm_genlist_realized_items_get(obj);
6655 if (!sd->decorate_all_mode)
6657 EINA_LIST_FOREACH(list, l, it)
6659 if (it->item->type != ELM_GENLIST_ITEM_GROUP)
6660 _decorate_all_item_unrealize(it);
6662 _item_cache_all_free(sd);
6666 EINA_LIST_FOREACH(list, l, it)
6668 if (it->item->type != ELM_GENLIST_ITEM_GROUP)
6670 if (it->itc->decorate_all_item_style)
6671 _decorate_all_item_realize(it, EINA_TRUE);
6675 #if GENLIST_FX_SUPPORT
6676 if (sd->fx_first_captured)
6677 _elm_genlist_fx_clear(ELM_WIDGET_DATA(sd)->obj);
6680 if (sd->calc_job) ecore_job_del(sd->calc_job);
6681 sd->calc_job = ecore_job_add(_calc_job, sd);
6685 elm_genlist_reorder_mode_set(Evas_Object *obj,
6686 Eina_Bool reorder_mode)
6688 #if 1 // FIXME: difference from upstream
6689 Eina_List *list, *l;
6692 ELM_GENLIST_CHECK(obj);
6693 ELM_GENLIST_DATA_GET(obj, sd);
6695 if (sd->reorder_mode == !!reorder_mode) return;
6696 sd->reorder_mode = !!reorder_mode;
6697 #if 1 // FIXME: difference from upstream
6698 list = elm_genlist_realized_items_get(obj);
6699 EINA_LIST_FOREACH(list, l, it)
6701 if (it->item->type != ELM_GENLIST_ITEM_GROUP)
6704 if (it->deco_all_view) view = it->deco_all_view;
6705 else view = VIEW(it);
6707 if (sd->reorder_mode)
6708 edje_object_signal_emit
6709 (view, "elm,state,reorder,mode_set", "elm");
6711 edje_object_signal_emit
6712 (view, "elm,state,reorder,mode_unset", "elm");
6715 eina_list_free(list);
6720 elm_genlist_reorder_mode_get(const Evas_Object *obj)
6722 ELM_GENLIST_CHECK(obj) EINA_FALSE;
6723 ELM_GENLIST_DATA_GET(obj, sd);
6725 return sd->reorder_mode;
6728 EAPI Elm_Genlist_Item_Type
6729 elm_genlist_item_type_get(const Elm_Object_Item *item)
6731 Elm_Gen_Item *it = (Elm_Gen_Item *)item;
6733 ELM_GENLIST_ITEM_CHECK_OR_RETURN(item, ELM_GENLIST_ITEM_MAX);
6735 return it->item->type;
6738 EAPI Elm_Genlist_Item_Class *
6739 elm_genlist_item_class_new(void)
6741 Elm_Genlist_Item_Class *itc = ELM_NEW(Elm_Genlist_Item_Class);
6742 EINA_SAFETY_ON_NULL_RETURN_VAL(itc, NULL);
6744 itc->version = CLASS_ALLOCATED;
6746 itc->delete_me = EINA_FALSE;
6752 elm_genlist_item_class_free(Elm_Genlist_Item_Class *itc)
6754 if (itc && (itc->version == CLASS_ALLOCATED))
6756 if (!itc->delete_me) itc->delete_me = EINA_TRUE;
6757 if (itc->refcount > 0) elm_genlist_item_class_unref(itc);
6767 elm_genlist_item_class_ref(Elm_Genlist_Item_Class *itc)
6769 if (itc && (itc->version == CLASS_ALLOCATED))
6772 if (itc->refcount == 0) itc->refcount--;
6777 elm_genlist_item_class_unref(Elm_Genlist_Item_Class *itc)
6779 if (itc && (itc->version == CLASS_ALLOCATED))
6781 if (itc->refcount > 0) itc->refcount--;
6782 if (itc->delete_me && (!itc->refcount))
6783 elm_genlist_item_class_free(itc);
6788 elm_genlist_item_flip_set(Elm_Object_Item *item,
6791 Elm_Gen_Item *it = (Elm_Gen_Item *)item;
6792 ELM_GENLIST_ITEM_CHECK_OR_RETURN(item);
6793 Elm_Genlist_Smart_Data *sd = GL_IT(it)->wsd;
6796 if (it->flipped == flip) return;
6798 it->item->unrealize_disabled = EINA_FALSE;
6802 _item_unrealize(it, EINA_FALSE);
6803 it->flipped = EINA_TRUE;
6804 it->item->nocache = EINA_TRUE;
6808 _item_unrealize(it, EINA_FALSE);
6809 it->flipped = EINA_FALSE;
6810 it->item->nocache = EINA_FALSE;
6812 if (sd->calc_job) ecore_job_del(sd->calc_job);
6813 sd->calc_job = ecore_job_add(_calc_job, sd);
6817 elm_genlist_item_flip_get(const Elm_Object_Item *item)
6819 Elm_Gen_Item *it = (Elm_Gen_Item *)item;
6821 ELM_GENLIST_ITEM_CHECK_OR_RETURN(item, EINA_FALSE);
6827 elm_genlist_select_mode_set(Evas_Object *obj,
6828 Elm_Object_Select_Mode mode)
6830 ELM_GENLIST_CHECK(obj);
6831 ELM_GENLIST_DATA_GET(obj, sd);
6833 if (mode >= ELM_OBJECT_SELECT_MODE_MAX || (sd->select_mode == mode))
6836 sd->select_mode = mode;
6837 if ((sd->select_mode == ELM_OBJECT_SELECT_MODE_NONE) ||
6838 (sd->select_mode == ELM_OBJECT_SELECT_MODE_DISPLAY_ONLY ))
6842 EINA_LIST_FOREACH_SAFE(sd->selected, l, ll, it)
6847 EAPI Elm_Object_Select_Mode
6848 elm_genlist_select_mode_get(const Evas_Object *obj)
6850 ELM_GENLIST_CHECK(obj) ELM_OBJECT_SELECT_MODE_MAX;
6851 ELM_GENLIST_DATA_GET(obj, sd);
6853 return sd->select_mode;
6857 elm_genlist_highlight_mode_set(Evas_Object *obj,
6858 Eina_Bool highlight)
6860 ELM_GENLIST_CHECK(obj);
6861 ELM_GENLIST_DATA_GET(obj, sd);
6863 sd->highlight = !!highlight;
6867 elm_genlist_highlight_mode_get(const Evas_Object *obj)
6869 ELM_GENLIST_CHECK(obj) EINA_FALSE;
6870 ELM_GENLIST_DATA_GET(obj, sd);
6872 return sd->highlight;
6876 elm_genlist_item_select_mode_set(Elm_Object_Item *item,
6877 Elm_Object_Select_Mode mode)
6879 Elm_Gen_Item *it = (Elm_Gen_Item *)item;
6881 ELM_GENLIST_ITEM_CHECK_OR_RETURN(item);
6883 if (mode >= ELM_OBJECT_SELECT_MODE_MAX)
6885 if (it->select_mode != mode)
6886 it->select_mode = mode;
6888 if ((it->select_mode == ELM_OBJECT_SELECT_MODE_NONE) ||
6889 (it->select_mode == ELM_OBJECT_SELECT_MODE_DISPLAY_ONLY ))
6892 if (it->select_mode == ELM_OBJECT_SELECT_MODE_DISPLAY_ONLY)
6894 it->item->mincalcd = EINA_FALSE;
6895 it->item->updateme = EINA_TRUE;
6896 if (it->item->block) it->item->block->updateme = EINA_TRUE;
6897 if (GL_IT(it)->wsd->update_job)
6898 ecore_job_del(GL_IT(it)->wsd->update_job);
6899 GL_IT(it)->wsd->update_job =
6900 ecore_job_add(_update_job, GL_IT(it)->wsd);
6902 // reset homogeneous item size
6903 if (GL_IT(it)->wsd->homogeneous)
6906 GL_IT(it)->wsd->group_item_width =
6907 GL_IT(it)->wsd->group_item_height = 0;
6909 GL_IT(it)->wsd->item_width = GL_IT(it)->wsd->item_height = 0;
6914 EAPI Elm_Object_Select_Mode
6915 elm_genlist_item_select_mode_get(const Elm_Object_Item *item)
6917 Elm_Gen_Item *it = (Elm_Gen_Item *)item;
6919 ELM_GENLIST_ITEM_CHECK_OR_RETURN(item, ELM_OBJECT_SELECT_MODE_MAX);
6921 if (!it) return ELM_OBJECT_SELECT_MODE_MAX;
6923 return it->select_mode;
6926 // will be deprecated
6928 elm_genlist_tree_effect_enabled_set(Evas_Object *obj __UNUSED__,
6929 Eina_Bool enabled __UNUSED__)
6931 ELM_GENLIST_CHECK(obj);
6934 // will be deprecated
6936 elm_genlist_tree_effect_enabled_get(const Evas_Object *obj __UNUSED__)
6938 ELM_GENLIST_CHECK(obj) EINA_FALSE;
6943 EAPI Elm_Object_Item *
6944 elm_genlist_nth_item_get(const Evas_Object *obj, unsigned int nth)
6946 Elm_Gen_Item *it = NULL;
6950 ELM_GENLIST_CHECK(obj) NULL;
6951 ELM_GENLIST_DATA_GET(obj, sd);
6953 if (!sd->items) return NULL;
6955 a = eina_inlist_accessor_new(sd->items);
6956 if (!a) return NULL;
6957 if (eina_accessor_data_get(a, nth, &data))
6958 it = ELM_GEN_ITEM_FROM_INLIST(data);
6959 eina_accessor_free(a);
6960 return (Elm_Object_Item *)it;
6963 #if GENLIST_FX_SUPPORT
6965 elm_genlist_fx_mode_set(Evas_Object *obj, Eina_Bool mode)
6967 ELM_GENLIST_CHECK(obj);
6968 ELM_GENLIST_DATA_GET(obj, sd);
6974 elm_genlist_fx_mode_get(const Evas_Object *obj)
6976 ELM_GENLIST_CHECK(obj) EINA_FALSE;
6977 ELM_GENLIST_DATA_GET(obj, sd);
6983 _elm_genlist_proxy_item_del(const Elm_Object_Item *item)
6985 Elm_Gen_Item *it = (Elm_Gen_Item *)item;
6986 if ((!it) || (!it->item)) return;
6988 Elm_Genlist_Smart_Data *sd = GL_IT(it)->wsd;
6992 EINA_LIST_FOREACH(sd->capture_before_items, l, pi)
6993 if (pi->it == it) pi->it = NULL;
6995 EINA_LIST_FOREACH(sd->capture_after_items, l, pi)
6996 if (pi->it == it) pi->it = NULL;
7000 _elm_genlist_proxy_item_new(const Elm_Object_Item *item)
7002 Elm_Gen_Item *it = (Elm_Gen_Item *)item;
7003 if ((!it) || (!it->item)) return EINA_FALSE;
7006 Proxy_Item *pi = NULL;
7007 pi = calloc(1, sizeof(Proxy_Item));
7008 if (!pi) return NULL;
7010 pi->proxy = evas_object_image_filled_add
7011 (evas_object_evas_get(ELM_WIDGET_DATA(GL_IT(it)->wsd)->obj));
7012 if (!pi->proxy) return EINA_FALSE;
7013 evas_object_clip_set(pi->proxy, evas_object_clip_get(GL_IT(it)->wsd->pan_obj));
7014 evas_object_smart_member_add(pi->proxy, GL_IT(it)->wsd->pan_obj);
7015 evas_object_hide(pi->proxy);
7017 if ((GL_IT(it)->wsd->decorate_all_mode) && (it->deco_all_view))
7018 evas_object_image_source_set(pi->proxy, it->deco_all_view);
7020 evas_object_image_source_set(pi->proxy, VIEW(it));
7022 GL_IT(it)->has_proxy_it = EINA_TRUE;
7024 pi->num = it->item->num;
7025 pi->x = it->item->scrl_x;
7026 pi->y = it->item->scrl_y;
7027 pi->w = it->item->w;
7028 pi->h = it->item->h;
7030 evas_object_geometry_get(VIEW(it), NULL, NULL, &w, &h);
7032 if (w <= 0 || h <= 0)
7034 evas_object_size_hint_min_get(VIEW(it), &w, &h);
7035 evas_object_size_hint_min_set(pi->proxy, w, h);
7037 else evas_object_resize(pi->proxy, w, h);
7043 _elm_genlist_fx_capture(Evas_Object *obj, int level)
7045 ELM_GENLIST_DATA_GET(obj, sd);
7049 Eina_Bool done = EINA_FALSE;
7052 Evas_Coord ox, oy, ow, oh;
7056 if ((!sd->rendered) || (sd->fx_playing)) return EINA_FALSE;
7057 if ((!level) && (sd->fx_first_captured)) return EINA_FALSE;
7058 if ((level) && (!sd->fx_first_captured)) return EINA_FALSE;
7060 evas_object_geometry_get(sd->pan_obj, &ox, &oy, &ow, &oh);
7064 sd->fx_first_captured = EINA_TRUE;
7065 EINA_LIST_FREE(sd->capture_before_items, pi)
7067 if ((pi->it) && (GL_IT(pi->it))) GL_IT(pi->it)->has_proxy_it = EINA_FALSE;
7068 if (pi->proxy) evas_object_smart_member_del(pi->proxy);
7069 if (pi->proxy) evas_object_del(pi->proxy);
7075 EINA_LIST_FREE(sd->capture_after_items, pi)
7077 if ((pi->it) && (GL_IT(pi->it))) GL_IT(pi->it)->has_proxy_it = EINA_FALSE;
7078 if (pi->proxy) evas_object_smart_member_del(pi->proxy);
7079 if (pi->proxy) evas_object_del(pi->proxy);
7083 EINA_INLIST_FOREACH(sd->blocks, itb)
7087 EINA_LIST_FOREACH(itb->items, l, it)
7089 if (it->realized && it->item->scrl_y >= oy)
7091 sd->realized_top_item = it;
7096 if (sd->realized_top_item) break;
7100 #if GENLIST_PINCH_ZOOM_SUPPORT
7101 if (sd->pinch_zoom_mode)
7103 EINA_INLIST_FOREACH(sd->blocks, itb)
7105 EINA_LIST_FOREACH(itb->items, l, it)
7108 if (IS_ROOT_PARENT_IT(it) && it->realized
7109 && (GL_IT(it)->scrl_y + GL_IT(it)->h >= oy && GL_IT(it)->scrl_y <= oy + oh))
7111 pi = _elm_genlist_proxy_item_new((Elm_Object_Item *)it);
7112 if (!level) sd->capture_before_items = eina_list_append(sd->capture_before_items, pi);
7113 else sd->capture_after_items = eina_list_append(sd->capture_after_items, pi);
7117 if ((sd->pinch_zoom_mode == ELM_GEN_PINCH_ZOOM_CONTRACT) && (level)) return EINA_TRUE;
7118 if ((sd->pinch_zoom_mode == ELM_GEN_PINCH_ZOOM_EXPAND) && (!level)) return EINA_TRUE;
7122 EINA_INLIST_FOREACH(sd->blocks, itb)
7127 EINA_LIST_FOREACH(itb->items, l, it)
7129 #if GENLIST_PINCH_ZOOM_SUPPORT
7130 if ((sd->pinch_zoom_mode) && (IS_ROOT_PARENT_IT(it))) continue;
7134 pi = _elm_genlist_proxy_item_new((Elm_Object_Item *)it);
7137 sd->capture_before_items = eina_list_append(sd->capture_before_items, pi);
7139 sd->capture_after_items = eina_list_append(sd->capture_after_items, pi);
7143 else if (done) break;
7148 static Elm_Gen_FX_Item *
7149 _elm_genlist_fx_item_find(const Elm_Object_Item *item)
7151 Elm_Gen_Item *it = (Elm_Gen_Item *)item;
7152 if (!it) return EINA_FALSE;
7154 Elm_Genlist_Smart_Data *sd = GL_IT(it)->wsd;
7155 if (!sd) return NULL;
7157 Elm_Gen_FX_Item *fi = NULL;
7160 EINA_LIST_FOREACH(sd->fx_items, l, fi)
7162 if (fi->it == it) return fi;
7167 static Elm_Gen_FX_Item *
7168 _elm_genlist_fx_item_new(const Proxy_Item *pi)
7170 if ((!pi) || (!pi->it)) return NULL;
7172 Elm_Gen_FX_Item *fi = NULL;
7173 fi = calloc(1, sizeof(Elm_Gen_FX_Item));
7174 if (!fi) return NULL;
7177 GL_IT(fi->it)->fi = fi;
7178 fi->proxy = pi->proxy;
7180 fi->from.x = fi->to.x = pi->x;
7181 fi->from.y = fi->to.y = pi->y;
7182 fi->from.w = fi->to.w = pi->w;
7183 fi->from.h = fi->to.h = pi->h;
7184 fi->update = EINA_FALSE;
7189 static Elm_Object_Item *
7190 _elm_genlist_fx_item_prev_get(const Elm_Object_Item *item)
7193 it = (Elm_Gen_Item *)item;
7194 if (!it) return NULL;
7195 if (GL_IT(it)->wsd->pinch_zoom_mode) return NULL;
7199 it = ELM_GEN_ITEM_FROM_INLIST(EINA_INLIST_GET(it)->prev);
7203 return (Elm_Object_Item *)it;
7207 _elm_genlist_fx_items_make(Evas_Object *obj)
7209 ELM_GENLIST_CHECK(obj) EINA_FALSE;
7210 ELM_GENLIST_DATA_GET(obj, sd);
7212 Elm_Gen_FX_Item *fi;
7215 Elm_Gen_Item *prev = NULL;
7216 Evas_Coord ox, oy, ow, oh, mv_dist, max_mv_dist = 0;
7218 evas_object_geometry_get(sd->pan_obj, &ox, &oy, &ow, &oh);
7220 EINA_LIST_FOREACH(sd->capture_before_items, l, pi)
7222 fi = _elm_genlist_fx_item_new(pi);
7223 if (fi) sd->fx_items = eina_list_append(sd->fx_items, fi);
7226 EINA_LIST_FOREACH(sd->capture_after_items, l, pi)
7228 fi = _elm_genlist_fx_item_find((Elm_Object_Item *)pi->it);
7230 if (fi) // pi exists in both before and after capture items
7232 fi->type = ELM_GEN_ITEM_FX_TYPE_SAME;
7233 fi->update = EINA_TRUE;
7239 // find the max distance between before and after capture items
7240 mv_dist = abs(fi->to.y - fi->from.y);
7241 if (max_mv_dist < mv_dist) max_mv_dist = mv_dist;
7243 else // pi only exists in after capture items
7245 fi = _elm_genlist_fx_item_new(pi);
7248 fi->type = ELM_GEN_ITEM_FX_TYPE_ADD;
7249 fi->update = EINA_TRUE;
7250 sd->fx_items = eina_list_append(sd->fx_items, fi);
7255 EINA_LIST_FOREACH(sd->fx_items, l, fi)
7257 // find deleted items
7258 if (!fi->update) // pi only exists in before capture items
7260 fi->type = ELM_GEN_ITEM_FX_TYPE_DEL;
7261 fi->update = EINA_TRUE;
7263 prev = (Elm_Gen_Item *)_elm_genlist_fx_item_prev_get((Elm_Object_Item *)fi->it);
7264 if ((prev) && (GL_IT(prev)->fi))
7266 fi->to.y = GL_IT(prev)->fi->to.y + GL_IT(prev)->fi->to.h;
7269 else if (fi->type == ELM_GEN_ITEM_FX_TYPE_ADD)
7271 prev = (Elm_Gen_Item *)_elm_genlist_fx_item_prev_get((Elm_Object_Item *)fi->it);
7272 if ((prev) && (prev->realized) && (GL_IT(prev)->fi))
7274 fi->from.y = GL_IT(prev)->fi->from.y + GL_IT(prev)->fi->from.h;
7278 if (sd->realized_top_item)
7281 if (fi->num <= sd->realized_top_item->item->num)
7282 fi->from.y -= max_mv_dist;
7284 fi->from.y += max_mv_dist;
7290 EINA_LIST_FOREACH(sd->fx_items, l, fi)
7292 if ((GL_IT(fi->it)->items) && (GL_IT(fi->it)->expanded_depth == 0))
7294 #if GENLIST_PINCH_ZOOM_SUPPORT
7295 if (sd->pinch_zoom_mode == ELM_GEN_PINCH_ZOOM_CONTRACT)
7297 fi->from.y = oy + GL_IT(fi->it)->pan_scrl_y - sd->pinch_pan_y;
7300 if (fi->type == ELM_GEN_ITEM_FX_TYPE_DEL)
7302 if (sd->realized_top_item)
7304 if (fi->num <= sd->realized_top_item->item->num)
7305 fi->to.y = oy - fi->from.h;
7316 static Elm_Gen_FX_Item *
7317 _fx_cover_item_get(const Elm_Gen_FX_Item *fi)
7319 Elm_Gen_FX_Item *cover_fi;
7321 if (!fi) return NULL;
7323 Elm_Genlist_Smart_Data *sd = GL_IT(fi->it)->wsd;
7324 Evas_Coord ox, oy, ow, oh;
7325 evas_object_geometry_get(sd->pan_obj, &ox, &oy, &ow, &oh);
7327 EINA_LIST_FOREACH(sd->fx_items, l, cover_fi)
7329 if (fi == cover_fi) continue;
7330 if (sd->fx_items_deleted)
7332 if ((cover_fi->from.y >= oy+oh || cover_fi->from.y > fi->to.y) && (cover_fi->from.y - cover_fi->to.y > 0))
7337 if ((cover_fi->to.y > fi->to.y) && (cover_fi->from.y - cover_fi->to.y < 0))
7345 _item_fx_op(Elm_Transit_Effect *data, Elm_Transit *transit __UNUSED__, double progress __UNUSED__)
7347 Elm_Gen_FX_Item *fi = data, *cover_it;
7348 Elm_Genlist_Smart_Data *sd = GL_IT(fi->it)->wsd;
7349 Evas_Coord fi_ox, fi_oy, cover_it_ox, cover_it_oy, ox, oy, ow, oh;
7351 evas_object_show(VIEW(fi->it));
7352 evas_object_geometry_get(sd->pan_obj, &ox, &oy, &ow, &oh);
7353 evas_object_geometry_get(fi->proxy, &fi_ox, &fi_oy, NULL, NULL);
7354 evas_object_move(fi->proxy, ox, fi_oy);
7355 evas_object_show(fi->proxy);
7356 #if GENLIST_PINCH_ZOOM_SUPPORT
7357 if ((sd->pinch_zoom_mode) && (IS_ROOT_PARENT_IT(fi->it))) evas_object_raise(fi->proxy);
7360 if ((!sd->expanded_next_item) || (sd->expanded_next_item == fi->it)) goto raise_event_block;
7361 if (fi->type == ELM_GEN_ITEM_FX_TYPE_SAME) goto raise_event_block;
7363 // find the closest item that cover current item when deleting
7364 cover_it = _fx_cover_item_get(fi);
7367 evas_object_geometry_get(cover_it->proxy, &cover_it_ox, &cover_it_oy, NULL, NULL);
7369 if (sd->fx_items_deleted)
7372 && (fi_oy + fi->to.h >= cover_it_oy + cover_it->to.h ) && (fi->from.y < cover_it->from.y))
7373 evas_object_hide(fi->proxy);
7375 else if (cover_it_oy && (fi_oy >= cover_it_oy))
7376 evas_object_hide(fi->proxy);
7378 evas_object_show(fi->proxy);
7382 evas_object_raise(sd->alpha_bg);
7389 _item_fx_done(Elm_Transit_Effect *data, Elm_Transit *transit __UNUSED__)
7391 Elm_Gen_FX_Item *fx_done_it = data;
7392 Elm_Genlist_Smart_Data *sd = GL_IT(fx_done_it->it)->wsd;
7394 if ((!fx_done_it) || (!fx_done_it->it) || (!sd)) return;
7396 evas_object_image_source_visible_set(fx_done_it->proxy, EINA_TRUE);
7397 evas_object_lower(fx_done_it->proxy);
7399 if ((sd->decorate_all_mode) && (fx_done_it->it->deco_all_view))
7400 evas_object_move(fx_done_it->it->deco_all_view, fx_done_it->to.x, fx_done_it->to.y);
7402 evas_object_move(VIEW(fx_done_it->it), fx_done_it->to.x, fx_done_it->to.y);
7403 GL_IT(fx_done_it->it)->has_proxy_it = EINA_FALSE;
7405 evas_object_clip_unset(fx_done_it->proxy);
7409 _item_fx_del_cb(void *data, Elm_Transit *transit __UNUSED__)
7411 Elm_Gen_FX_Item *fx_done_it = data;
7412 Elm_Gen_Item *it = NULL;
7413 Proxy_Item *pi = NULL;
7415 Elm_Genlist_Smart_Data *sd = GL_IT(fx_done_it->it)->wsd;
7417 if ((!fx_done_it) || (!fx_done_it->it) || (!sd)) return;
7419 sd->fx_items = eina_list_remove(sd->fx_items, fx_done_it);
7420 GL_IT(fx_done_it->it)->fi = NULL;
7423 if (!eina_list_count(sd->fx_items))
7425 EINA_LIST_FREE (sd->pending_unrealized_items, it)
7427 if (GL_IT(it)) GL_IT(it)->has_proxy_it = EINA_FALSE;
7428 #if GENLIST_PINCH_ZOOM_SUPPORT
7429 if ((sd->pinch_zoom_mode) && (IS_ROOT_PARENT_IT(it))) continue;
7431 _item_unrealize(it, EINA_FALSE);
7433 EINA_LIST_FREE (sd->pending_unrealized_decorate_all_items, it)
7435 if (GL_IT(it)) GL_IT(it)->has_proxy_it = EINA_FALSE;
7436 #if GENLIST_PINCH_ZOOM_SUPPORT
7437 if ((sd->pinch_zoom_mode) && (IS_ROOT_PARENT_IT(it))) continue;
7439 _decorate_all_item_unrealize(it);
7442 EINA_LIST_FREE (sd->pending_del_items, it)
7445 _elm_widget_item_free((Elm_Widget_Item *)it);
7448 EINA_LIST_FOREACH(sd->capture_before_items, l, pi)
7449 evas_object_hide(pi->proxy);
7450 EINA_LIST_FOREACH(sd->capture_after_items, l, pi)
7451 evas_object_hide(pi->proxy);
7453 sd->fx_playing = EINA_FALSE;
7454 sd->sorting = EINA_FALSE;
7455 sd->fx_first_captured = EINA_FALSE;
7456 evas_object_hide(sd->alpha_bg);
7458 sd->realized_top_item = NULL;
7459 sd->pan_changed = EINA_TRUE;
7460 evas_object_smart_changed(sd->pan_obj);
7465 _sorting_effect_animator_cb(void *data)
7467 Elm_Genlist_Smart_Data *sd = data;
7468 Elm_Gen_FX_Item *fi;
7471 Evas_Coord ox, oy, ow, oh;
7472 evas_object_geometry_get(sd->pan_obj, &ox, &oy, &ow, &oh);
7474 sd->fx_timer = NULL;
7475 EINA_LIST_FOREACH(sd->fx_items, l, fi)
7479 fi->changed = EINA_TRUE;
7480 evas_object_resize(fi->proxy, ow, fi->to.h);
7482 fi->trans = elm_transit_add();
7483 elm_transit_object_add(fi->trans, fi->proxy);
7484 evas_object_image_source_visible_set(fi->proxy, EINA_FALSE);
7485 elm_transit_tween_mode_set(fi->trans, ELM_TRANSIT_TWEEN_MODE_DECELERATE);
7487 elm_transit_effect_translation_add(fi->trans, fi->to.x, fi->to.y - 30 * elm_config_scale_get(), fi->to.x, fi->to.y);
7488 elm_transit_effect_color_add(fi->trans,0, 0, 0, 0, 255,255,255,255);
7490 elm_transit_effect_add(fi->trans, _item_fx_op, fi, _item_fx_done);
7491 elm_transit_del_cb_set(fi->trans, _item_fx_del_cb, fi);
7492 elm_transit_duration_set(fi->trans,0.3);
7493 elm_transit_objects_final_state_keep_set(fi->trans, EINA_FALSE);
7494 elm_transit_go(fi->trans);
7496 return ECORE_CALLBACK_RENEW;
7499 return ECORE_CALLBACK_CANCEL;
7503 _elm_genlist_fx_play(Evas_Object *obj)
7505 ELM_GENLIST_CHECK(obj);
7506 ELM_GENLIST_DATA_GET(obj, sd);
7508 Evas_Coord ox, oy, ow, oh, cvx, cvy, cvw, cvh;
7509 Elm_Gen_FX_Item *fi;
7512 if (!sd->fx_mode) return;
7514 EINA_LIST_FREE(sd->fx_items, fi)
7516 if (fi->trans) elm_transit_del(fi->trans);
7519 _item_cache_all_free(sd);
7521 _elm_genlist_fx_items_make(obj);
7522 if (!eina_list_count(sd->fx_items) || (sd->queue))
7524 _elm_genlist_fx_clear(obj);
7528 sd->fx_playing = EINA_TRUE;
7530 if (!sd->alpha_bg) sd->alpha_bg = _tray_alpha_bg_create(obj);
7531 evas_object_show(sd->alpha_bg);
7533 evas_object_geometry_get(sd->pan_obj, &ox, &oy, &ow, &oh);
7534 evas_output_viewport_get(evas_object_evas_get(obj), &cvx, &cvy, &cvw, &cvh);
7538 EINA_LIST_FOREACH(sd->fx_items, l, fi)
7539 evas_object_image_source_visible_set(fi->proxy, EINA_FALSE);
7540 if (sd->fx_timer) ecore_timer_del(sd->fx_timer);
7541 sd->fx_timer = ecore_timer_add(0.05, _sorting_effect_animator_cb, sd);
7545 EINA_LIST_FOREACH(sd->fx_items, l, fi)
7547 if (!fi->proxy) continue;
7549 if ((fi->from.y <= oy) || (fi->from.y + fi->from.h >= oy + oh))
7551 if ((sd->decorate_all_mode) && (fi->it->deco_all_view))
7552 evas_object_move(fi->it->deco_all_view, cvx, fi->to.y);
7554 evas_object_move(VIEW(fi->it), cvx, fi->to.y);
7556 else if ((fi->to.y <= oy) || (fi->to.y + fi->to.h >= oy + oh))
7558 if ((sd->decorate_all_mode) && (fi->it->deco_all_view))
7559 evas_object_move(fi->it->deco_all_view, cvx, fi->from.y);
7561 evas_object_move(VIEW(fi->it), cvx, fi->from.y);
7564 evas_object_resize(fi->proxy, ow, fi->to.h);
7565 evas_object_show(fi->proxy);
7567 fi->trans = elm_transit_add();
7568 elm_transit_object_add(fi->trans, fi->proxy);
7570 evas_object_image_source_visible_set(fi->proxy, EINA_FALSE);
7571 elm_transit_tween_mode_set(fi->trans, ELM_TRANSIT_TWEEN_MODE_DECELERATE);
7573 if (fi->type == ELM_GEN_ITEM_FX_TYPE_SAME)
7575 evas_object_raise(fi->proxy);
7576 elm_transit_effect_translation_add(fi->trans, fi->from.x, fi->from.y, fi->to.x, fi->to.y);
7579 else if (fi->type == ELM_GEN_ITEM_FX_TYPE_ADD)
7581 elm_transit_effect_translation_add(fi->trans, fi->from.x, fi->from.y, fi->to.x, fi->to.y);
7582 elm_transit_effect_color_add(fi->trans, 0, 0, 0, 0, 255, 255, 255, 255);
7584 else if (fi->type == ELM_GEN_ITEM_FX_TYPE_DEL)
7586 elm_transit_effect_translation_add(fi->trans, fi->from.x, fi->from.y, fi->to.x, fi->to.y);
7587 elm_transit_effect_color_add(fi->trans, 255, 255, 255, 255, 0, 0, 0, 0);
7589 elm_transit_effect_add(fi->trans, _item_fx_op, fi, _item_fx_done);
7590 elm_transit_del_cb_set(fi->trans, _item_fx_del_cb, fi);
7592 elm_transit_duration_set(fi->trans, FX_MOVE_TIME);
7593 elm_transit_objects_final_state_keep_set(fi->trans, EINA_FALSE);
7594 elm_transit_go(fi->trans);
7599 #if GENLIST_PINCH_ZOOM_SUPPORT
7601 elm_genlist_pinch_zoom_mode_set(Evas_Object *obj, Elm_Gen_Pinch_Zoom_Mode mode)
7603 ELM_GENLIST_DATA_GET(obj, sd);
7608 Eina_Bool done = EINA_FALSE;
7610 if ((sd->queue) || (!sd->rendered) || (sd->queue_idle_enterer)) return EINA_FALSE;
7612 EINA_INLIST_FOREACH(sd->blocks, itb)
7614 EINA_LIST_FOREACH(itb->items, l, it)
7617 if (IS_ROOT_PARENT_IT(it))
7625 if (!done) return EINA_FALSE;
7627 sd->pinch_zoom_mode = mode;
7629 _item_cache_all_free(sd);
7630 _elm_genlist_fx_capture(obj, 0);
7632 sd->pinch_pan_y = sd->pan_y;
7634 if (sd->pinch_zoom_mode == ELM_GEN_PINCH_ZOOM_CONTRACT)
7635 sd->s_iface->content_region_show(obj, 0,0,0,0);
7637 sd->pan_changed = EINA_TRUE;
7638 evas_object_smart_changed(sd->pan_obj);
7645 eina_list_sort_merge(Eina_List *a, Eina_List *b, Eina_Compare_Cb func)
7647 Eina_List *first, *last;
7649 if (func(a->data, b->data) > 0)
7651 _item_move_after(a->data, b->data);
7652 a = (last = first = a)->next;
7656 b = (last = first = b)->next;
7659 if (func(a->data, b->data) > 0)
7661 _item_move_after(a->data, b->data);
7662 a = (last = last->next = a)->next;
7665 b = (last = last->next = b)->next;
7667 last->next = a ? a : b;
7673 elm_genlist_sort(Evas_Object *obj, Eina_Compare_Cb func)
7675 ELM_GENLIST_CHECK(obj) NULL;
7676 ELM_GENLIST_DATA_GET(obj, sd);
7677 Eina_List *list = NULL;
7678 Elm_Gen_Item *it, *next;
7679 unsigned int limit = 0, i = 0, n = 0;
7680 Eina_List *tail = NULL, *unsort = NULL, *stack[32], *prev = NULL;
7682 sd->sorting = EINA_TRUE;
7684 it = (Elm_Gen_Item*)elm_genlist_first_item_get(obj);
7687 list = eina_list_append(list, it);
7688 next = (Elm_Gen_Item*)elm_genlist_item_next_get((Elm_Object_Item *)it);
7696 limit = eina_list_count(list);
7700 (limit > list->accounting->count))
7701 limit = list->accounting->count;
7703 if (limit != list->accounting->count)
7705 unsort = eina_list_nth_list(list, limit);
7707 unsort->prev->next = NULL;
7712 unsigned int idx, tmp;
7714 Eina_List *a = tail;
7715 Eina_List *b = tail->next;
7725 if (func(a->data, b->data) > 0)
7726 ((stack[i++] = a)->next = b)->next = 0;
7728 ((stack[i++] = b)->next = a)->next = 0;
7731 for (idx = n ^ tmp; idx &= idx - 1; i--)
7732 stack[i - 2] = eina_list_sort_merge(stack[i - 2], stack[i - 1], func);
7736 stack[i - 1] = eina_list_sort_merge(stack[i - 1], stack[i], func);
7740 for (; stack[0]; stack[0] = stack[0]->next)
7742 stack[0]->prev = prev;
7749 tail->next = unsort;
7750 unsort->prev = tail;
7753 list->accounting->last = tail;
7755 if (!sd->fx_mode) sd->sorting = EINA_FALSE;
7756 if (sd->decorate_all_mode) sd->sorting = EINA_FALSE;
7757 sd->s_iface->content_region_show(obj, 0,0,0,0);
7758 sd->pan_changed = EINA_TRUE;
7759 evas_object_smart_changed(sd->pan_obj);