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 edje_object_signal_emit
623 (VIEW(it), "elm,state,decorate,disabled", "elm");
624 edje_object_signal_emit
625 (VIEW(it), "elm,state,reorder,mode_unset", "elm");
626 edje_object_message_signal_process(VIEW(it));
628 it->realized = EINA_FALSE;
629 _item_cache_push(it);
631 #if GENLIST_ENTRY_SUPPORT
632 it->item->unrealize_disabled = EINA_FALSE;
634 it->want_unrealize = EINA_FALSE;
636 //evas_event_thaw(evas_object_evas_get(WIDGET(it)));
637 //evas_event_thaw_eval(evas_object_evas_get(WIDGET(it)));
641 _item_block_unrealize(Item_Block *itb)
645 Eina_Bool dragging = EINA_FALSE;
647 if (!itb->realized) return;
648 //evas_event_freeze(evas_object_evas_get(ELM_WIDGET_DATA(itb->sd)->obj));
650 EINA_LIST_FOREACH(itb->items, l, it)
652 if (itb->must_recalc || !it->group)
656 dragging = EINA_TRUE;
657 it->want_unrealize = EINA_TRUE;
660 _item_unrealize(it, EINA_FALSE);
665 itb->realized = EINA_FALSE;
666 itb->want_unrealize = EINA_TRUE;
669 itb->want_unrealize = EINA_FALSE;
670 //evas_event_thaw(evas_object_evas_get(ELM_WIDGET_DATA(itb->sd)->obj));
671 //evas_event_thaw_eval(evas_object_evas_get(ELM_WIDGET_DATA(itb->sd)->obj));
675 _must_recalc_idler(void *data)
677 Elm_Genlist_Smart_Data *sd = data;
679 if (sd->calc_job) ecore_job_del(sd->calc_job);
680 sd->calc_job = ecore_job_add(_calc_job, sd);
681 sd->must_recalc_idler = NULL;
682 return ECORE_CALLBACK_CANCEL;
686 _calc_job(void *data)
689 Item_Block *itb, *chb = NULL;
690 Evas_Coord pan_w = 0, pan_h = 0;
691 Elm_Genlist_Smart_Data *sd = data;
692 Eina_Bool minw_change = EINA_FALSE;
693 Eina_Bool did_must_recalc = EINA_FALSE;
694 Evas_Coord minw = -1, minh = 0, y = 0, dy = 0, vw = 0;
696 sd->s_iface->content_viewport_size_get(ELM_WIDGET_DATA(sd)->obj, &sd->w, &sd->h);
698 //evas_event_freeze(evas_object_evas_get(ELM_WIDGET_DATA(sd)->obj));
699 EINA_INLIST_FOREACH(sd->blocks, itb)
701 Eina_Bool show_me = EINA_FALSE;
704 show_me = itb->show_me;
705 itb->show_me = EINA_FALSE;
708 if (itb->realized) _item_block_unrealize(itb);
710 if ((itb->changed) || ((itb->must_recalc) && (!did_must_recalc)))
712 if (itb->must_recalc)
717 EINA_LIST_FOREACH(itb->items, l, it)
718 if (it->item->mincalcd) it->item->mincalcd = EINA_FALSE;
719 itb->changed = EINA_TRUE;
720 did_must_recalc = EINA_TRUE;
721 if (itb->realized) _item_block_unrealize(itb);
722 itb->must_recalc = EINA_FALSE;
724 show_me = _item_block_recalc(itb, in, EINA_FALSE);
730 if (minw == -1) minw = itb->minw;
731 else if ((!itb->must_recalc) && (minw < itb->minw))
734 minw_change = EINA_TRUE;
736 if ((sd->mode == ELM_LIST_COMPRESS) && (minw > vw))
739 minw_change = EINA_TRUE;
745 if ((show_me) && (sd->show_item) && (!sd->show_item->item->queued))
746 sd->check_scroll = EINA_TRUE;
750 EINA_INLIST_FOREACH(sd->blocks, itb)
756 if ((chb) && (EINA_INLIST_GET(chb)->next))
758 EINA_INLIST_FOREACH(EINA_INLIST_GET(chb)->next, itb)
760 if (itb->realized) _item_block_unrealize(itb);
764 if (minw < sd->w) minw = sd->w;
765 if ((minw != sd->minw) || (minh != sd->minh))
769 evas_object_smart_callback_call(sd->pan_obj, "changed", NULL);
770 elm_layout_sizing_eval(ELM_WIDGET_DATA(sd)->obj);
777 if ((sd->anchor_item) && (sd->anchor_item->item->block)
778 && (!sd->auto_scroll_enabled))
783 it = sd->anchor_item;
785 sd->s_iface->content_pos_set
786 (ELM_WIDGET_DATA(sd)->obj, sd->pan_x, it->item->block->y
787 + it->y + it_y, EINA_TRUE);
788 sd->anchor_item = it;
794 if (!sd->must_recalc_idler)
795 sd->must_recalc_idler = ecore_idler_add(_must_recalc_idler, sd);
797 if (sd->check_scroll)
799 _elm_genlist_pan_smart_content_size_get(sd->pan_obj, &pan_w, &pan_h);
800 if (EINA_INLIST_GET(sd->show_item) == sd->items->last)
801 sd->scroll_to_type = ELM_GENLIST_ITEM_SCROLLTO_IN;
803 switch (sd->scroll_to_type)
805 case ELM_GENLIST_ITEM_SCROLLTO_TOP:
809 case ELM_GENLIST_ITEM_SCROLLTO_MIDDLE:
813 case ELM_GENLIST_ITEM_SCROLLTO_IN:
818 if ((sd->show_item) && (sd->show_item->item->block))
820 if ((pan_w > (sd->show_item->x + sd->show_item->item->block->x))
821 && (pan_h > (sd->show_item->y + sd->show_item->item->block->y
830 evas_object_smart_changed(sd->pan_obj);
831 //evas_event_thaw(evas_object_evas_get(ELM_WIDGET_DATA(sd)->obj));
832 //evas_event_thaw_eval(evas_object_evas_get(ELM_WIDGET_DATA(sd)->obj));
836 _elm_genlist_smart_sizing_eval(Evas_Object *obj)
838 Evas_Coord minw = 0, minh = 0, maxw = -1, maxh = -1, vw = 0;
840 ELM_GENLIST_DATA_GET(obj, sd);
842 /* parent class' early call */
843 if (!sd->s_iface) return;
844 if (sd->on_sub_del) return;;
846 evas_object_size_hint_min_get(obj, &minw, NULL);
847 evas_object_size_hint_max_get(obj, &maxw, &maxh);
848 edje_object_size_min_calc(ELM_WIDGET_DATA(sd)->resize_obj, &minw, &minh);
850 sd->s_iface->content_viewport_size_get(obj, &vw, NULL);
851 if (vw != 0) sd->prev_viewport_w = vw;
853 if (sd->mode == ELM_LIST_LIMIT)
856 minw = minw + sd->realminw;
859 evas_object_size_hint_min_set(obj, minw, minh);
860 evas_object_size_hint_max_set(obj, maxw, maxh);
864 _item_position(Elm_Gen_Item *it,
872 //evas_event_freeze(evas_object_evas_get(ELM_WIDGET_DATA(GL_IT(it)->wsd)->obj));
873 evas_object_resize(view, it->item->w, it->item->h);
874 evas_object_move(view, it_x, it_y);
875 evas_object_show(view);
876 //evas_event_thaw(evas_object_evas_get(ELM_WIDGET_DATA(GL_IT(it)->wsd)->obj));
877 //evas_event_thaw_eval(evas_object_evas_get(ELM_WIDGET_DATA(GL_IT(it)->wsd)->obj));
881 _item_sub_items_clear(Elm_Gen_Item *it)
884 Elm_Object_Item *it2;
886 EINA_LIST_FOREACH_SAFE(it->item->items, l, ll, it2)
887 elm_widget_item_del(it2);
891 _item_auto_scroll(Elm_Genlist_Smart_Data *sd)
893 Elm_Gen_Item *tmp_item = NULL;
895 #if GENLIST_FX_SUPPORT
896 if (sd->fx_first_captured) return;
898 if ((sd->expanded_item) && (sd->auto_scroll_enabled))
900 tmp_item = eina_list_data_get
901 (eina_list_last(sd->expanded_item->item->items));
902 if (!tmp_item) return;
903 sd->show_item = tmp_item;
904 sd->bring_in = EINA_TRUE;
905 sd->scroll_to_type = ELM_GENLIST_ITEM_SCROLLTO_IN;
906 if ((sd->show_item->item->queued) || (!sd->show_item->item->mincalcd))
908 sd->show_item->item->show_me = EINA_TRUE;
909 sd->auto_scroll_enabled = EINA_FALSE;
917 _elm_genlist_item_odd_even_update(Elm_Gen_Item *it)
919 if (!it->item->nostacking)
921 if ((it->item->order_num_in & 0x1) ^ it->item->stacking_even)
923 if (it->deco_all_view) evas_object_lower(it->deco_all_view);
924 else evas_object_lower(VIEW(it));
928 if (it->deco_all_view) evas_object_raise(it->deco_all_view);
929 else evas_object_raise(VIEW(it));
933 if (it->item->order_num_in & 0x1)
935 edje_object_signal_emit(VIEW(it), "elm,state,odd", "elm");
936 if (it->deco_all_view)
937 edje_object_signal_emit(it->deco_all_view, "elm,state,odd", "elm");
941 edje_object_signal_emit(VIEW(it), "elm,state,even", "elm");
942 if (it->deco_all_view)
943 edje_object_signal_emit(it->deco_all_view, "elm,state,even", "elm");
948 _item_order_update(const Eina_Inlist *l,
951 Elm_Gen_Item *it, *it2;
953 for (it = ELM_GEN_ITEM_FROM_INLIST(l); l; l = l->next,
954 it = ELM_GEN_ITEM_FROM_INLIST(l))
956 it->item->order_num_in = start++;
957 _elm_genlist_item_odd_even_update(it);
958 it2 = ELM_GEN_ITEM_FROM_INLIST(l->next);
959 if (it2 && (it->item->order_num_in != it2->item->order_num_in))
965 _elm_genlist_item_state_update(Elm_Gen_Item *it,
970 if (it->selected != itc->selected)
974 if (it->deco_all_view)
975 edje_object_signal_emit
976 (it->deco_all_view, "elm,state,selected", "elm,nosound");
977 edje_object_signal_emit
978 (VIEW(it), "elm,state,selected", "elm,nosound");
979 evas_object_smart_callback_call(WIDGET(it), SIG_HIGHLIGHTED, it);
982 if (elm_widget_item_disabled_get(it) != itc->disabled)
984 if (elm_widget_item_disabled_get(it))
985 edje_object_signal_emit(VIEW(it), "elm,state,disabled", "elm");
986 if (it->deco_all_view)
987 edje_object_signal_emit
988 (it->deco_all_view, "elm,state,disabled", "elm");
990 if (it->item->expanded != itc->expanded)
992 if (it->item->expanded)
993 edje_object_signal_emit(VIEW(it), "elm,state,expanded", "elm");
994 if (it->deco_all_view)
995 edje_object_signal_emit
996 (it->deco_all_view, "elm,state,expanded", "elm");
1003 if (it->deco_all_view)
1004 edje_object_signal_emit
1005 (it->deco_all_view, "elm,state,selected", "elm,nosound");
1006 edje_object_signal_emit
1007 (VIEW(it), "elm,state,selected", "elm,nosound");
1008 evas_object_smart_callback_call(WIDGET(it), SIG_HIGHLIGHTED, it);
1010 if (elm_widget_item_disabled_get(it))
1012 edje_object_signal_emit(VIEW(it), "elm,state,disabled", "elm");
1013 if (it->deco_all_view)
1014 edje_object_signal_emit
1015 (it->deco_all_view, "elm,state,disabled", "elm");
1017 if (it->item->expanded)
1019 edje_object_signal_emit(VIEW(it), "elm,state,expanded", "elm");
1020 if (it->deco_all_view)
1021 edje_object_signal_emit
1022 (it->deco_all_view, "elm,state,expanded", "elm");
1028 _elm_genlist_item_index_update(Elm_Gen_Item *it)
1030 if (it->position_update || it->item->block->position_update)
1032 evas_object_smart_callback_call(WIDGET(it), SIG_INDEX_UPDATE, it);
1033 it->position_update = EINA_FALSE;
1038 _item_text_realize(Elm_Gen_Item *it,
1039 Evas_Object *target,
1043 if (it->itc->func.text_get)
1049 *source = elm_widget_stringlist_get
1050 (edje_object_data_get(target, "texts"));
1051 EINA_LIST_FOREACH(*source, l, key)
1053 if (parts && fnmatch(parts, key, FNM_PERIOD))
1056 char *s = it->itc->func.text_get
1057 ((void *)it->base.data, WIDGET(it), key);
1061 edje_object_part_text_escaped_set(target, key, s);
1066 edje_object_part_text_set(target, key, "");
1073 // FIXME: difference from upstream
1075 _content_focused(void *data, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
1077 Elm_Gen_Item *it = data;
1078 if (it) it->defer_unrealize = EINA_TRUE;
1082 _content_unfocused(void *data, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
1084 Elm_Gen_Item *it = data;
1085 if (it) it->defer_unrealize = EINA_FALSE;
1090 _item_mode_content_realize(Elm_Gen_Item *it,
1091 Evas_Object *target,
1094 Eina_List **contents_list)
1096 Eina_List *res = *contents_list;
1098 if (it->itc->func.content_get)
1104 EINA_LIST_FOREACH(*source, l, key)
1106 if (parts && fnmatch(parts, key, FNM_PERIOD))
1109 ic = it->itc->func.content_get
1110 ((void *)it->base.data, WIDGET(it), key);
1114 res = eina_list_append(res, ic);
1115 edje_object_part_swallow(target, key, ic);
1116 evas_object_show(ic);
1117 #if GENLIST_ENTRY_SUPPORT
1120 // For entry or editfield
1121 // 1. Add resize callback for multiline entry.
1122 // 2. Do not unrealize it for focus issue
1123 // ps. Only for entry because of performnace
1124 if (!strcmp("elm_layout", evas_object_type_get(ic)))
1126 // If editfield style, it can have entry.
1128 edje_object_file_get(elm_layout_edje_get(ic), NULL, &group);
1129 if (group && !strncmp("elm/layout/editfield/", group, 20))
1130 it->item->unrealize_disabled = EINA_TRUE;
1132 else if (!strcmp("elm_entry", evas_object_type_get(ic)))
1133 it->item->unrealize_disabled = EINA_TRUE;
1137 // FIXME: difference from upstream
1140 // FIXME: if entry calcuates its cursor position correctly and conformant works,
1141 // genlist does not need to handle this focus thing.
1142 evas_object_smart_callback_add(ic, "focused", _content_focused, it);
1143 evas_object_smart_callback_add(ic, "unfocused", _content_unfocused, it);
1146 if (elm_widget_item_disabled_get(it))
1147 elm_widget_disabled_set(ic, EINA_TRUE);
1156 _item_state_realize(Elm_Gen_Item *it,
1157 Evas_Object *target,
1161 if (it->itc->func.state_get)
1168 *source = elm_widget_stringlist_get
1169 (edje_object_data_get(target, "states"));
1170 EINA_LIST_FOREACH(*source, l, key)
1172 if (parts && fnmatch(parts, key, FNM_PERIOD))
1175 Eina_Bool on = it->itc->func.state_get
1176 ((void *)it->base.data, WIDGET(it), key);
1180 snprintf(buf, sizeof(buf), "elm,state,%s,active", key);
1181 edje_object_signal_emit(target, buf, "elm");
1185 snprintf(buf, sizeof(buf), "elm,state,%s,passive", key);
1186 edje_object_signal_emit(target, buf, "elm");
1193 _decorate_item_unrealize(Elm_Gen_Item *it)
1195 Elm_Genlist_Smart_Data *sd = GL_IT(it)->wsd;
1196 Evas_Object *content;
1198 if (!it->item->deco_it_view) return;
1200 //evas_event_freeze(evas_object_evas_get(obj));
1201 elm_widget_stringlist_free(it->item->deco_it_texts);
1202 it->item->deco_it_texts = NULL;
1203 elm_widget_stringlist_free(it->item->deco_it_contents);
1204 it->item->deco_it_contents = NULL;
1205 elm_widget_stringlist_free(it->item->deco_it_states);
1207 EINA_LIST_FREE (it->item->deco_it_content_objs, content)
1208 evas_object_del(content);
1210 edje_object_part_unswallow(it->item->deco_it_view, VIEW(it));
1211 evas_object_smart_member_add(VIEW(it), sd->pan_obj);
1212 evas_object_del(it->item->deco_it_view);
1213 it->item->deco_it_view = NULL;
1215 if (sd->mode_item == it) sd->mode_item = NULL;
1216 //evas_event_thaw(evas_object_evas_get(obj));
1217 //evas_event_thaw_eval(evas_object_evas_get(obj));
1222 _decorate_all_item_position(Elm_Gen_Item *it,
1226 evas_object_resize(it->deco_all_view, it->item->w, it->item->h);
1227 evas_object_move(it->deco_all_view, itx, ity);
1231 _decorate_all_item_realize(Elm_Gen_Item *it,
1232 Eina_Bool effect_on)
1235 const char *stacking;
1236 const char *stacking_even;
1238 if ((!it) || (it->item->decorate_all_item_realized)) return;
1240 if (it->item->deco_it_view) _decorate_item_unrealize(it);
1242 it->deco_all_view = edje_object_add(evas_object_evas_get(WIDGET(it)));
1243 edje_object_scale_set(it->deco_all_view, elm_widget_scale_get(WIDGET(it)) *
1244 elm_config_scale_get());
1245 evas_object_smart_member_add(it->deco_all_view, GL_IT(it)->wsd->pan_obj);
1246 elm_widget_sub_object_add(WIDGET(it), it->deco_all_view);
1248 if (it->item->type & ELM_GENLIST_ITEM_TREE)
1249 strncpy(buf, "tree", sizeof(buf));
1250 else strncpy(buf, "item", sizeof(buf));
1251 if (GL_IT(it)->wsd->mode == ELM_LIST_COMPRESS)
1252 strncat(buf, "_compress", sizeof(buf) - strlen(buf));
1254 strncat(buf, "/", sizeof(buf) - strlen(buf));
1255 strncat(buf, it->itc->decorate_all_item_style, sizeof(buf) - strlen(buf));
1257 elm_widget_theme_object_set(WIDGET(it), it->deco_all_view, "genlist", buf,
1258 elm_widget_style_get(WIDGET(it)));
1260 stacking_even = edje_object_data_get(VIEW(it), "stacking_even");
1261 if (!stacking_even) stacking_even = "above";
1262 it->item->stacking_even = !!strcmp("above", stacking_even);
1264 stacking = edje_object_data_get(VIEW(it), "stacking");
1265 if (!stacking) stacking = "yes";
1266 it->item->nostacking = !!strcmp("yes", stacking);
1268 edje_object_mirrored_set
1269 (it->deco_all_view, elm_widget_mirrored_get(WIDGET(it)));
1271 _elm_genlist_item_odd_even_update(it);
1272 _elm_genlist_item_state_update(it, NULL);
1274 #if 1 // FIXME: difference from upstream
1275 if (GL_IT(it)->wsd->reorder_mode)
1276 edje_object_signal_emit
1277 (it->deco_all_view, "elm,state,reorder,mode_set", "elm");
1279 edje_object_signal_emit
1280 (it->deco_all_view, "elm,state,reorder,mode_unset", "elm");
1284 edje_object_signal_emit
1285 (it->deco_all_view, "elm,state,decorate,enabled,effect", "elm");
1286 edje_object_signal_emit
1287 (VIEW(it), "elm,state,decorate,enabled,effect", "elm");
1291 edje_object_signal_emit
1292 (it->deco_all_view, "elm,state,decorate,enabled", "elm");
1293 edje_object_signal_emit
1294 (VIEW(it), "elm,state,decorate,enabled", "elm");
1296 _item_mouse_callbacks_del(it, VIEW(it));
1297 _item_mouse_callbacks_add(it, it->deco_all_view);
1299 _item_text_realize(it, it->deco_all_view, &it->item->deco_all_texts, NULL);
1301 edje_object_signal_emit
1302 (it->deco_all_view, "elm,state,flip,enabled", "elm");
1303 if (!it->item->deco_all_contents)
1304 it->item->deco_all_contents = elm_widget_stringlist_get
1305 (edje_object_data_get(it->deco_all_view, "contents"));
1306 it->item->deco_all_content_objs =
1307 _item_mode_content_realize(it, it->deco_all_view,
1308 &it->item->deco_all_contents, NULL,
1309 &it->item->deco_all_content_objs);
1311 (it, it->deco_all_view, &it->item->deco_all_states, NULL);
1312 edje_object_part_swallow
1313 (it->deco_all_view, "elm.swallow.decorate.content", VIEW(it));
1315 _decorate_all_item_position(it, it->item->scrl_x, it->item->scrl_y);
1316 evas_object_show(it->deco_all_view);
1320 edje_object_signal_emit(it->deco_all_view, "elm,state,selected", "elm");
1321 evas_object_smart_callback_call(WIDGET(it), SIG_HIGHLIGHTED, it);
1324 it->item->decorate_all_item_realized = EINA_TRUE;
1325 it->want_unrealize = EINA_FALSE;
1329 _expand_toggle_signal_cb(void *data,
1330 Evas_Object *obj __UNUSED__,
1331 const char *emission __UNUSED__,
1332 const char *source __UNUSED__)
1334 Elm_Gen_Item *it = data;
1336 if (it->item->expanded)
1337 evas_object_smart_callback_call(WIDGET(it), SIG_CONTRACT_REQUEST, it);
1339 evas_object_smart_callback_call(WIDGET(it), SIG_EXPAND_REQUEST, it);
1343 _expand_signal_cb(void *data,
1344 Evas_Object *obj __UNUSED__,
1345 const char *emission __UNUSED__,
1346 const char *source __UNUSED__)
1348 Elm_Gen_Item *it = data;
1350 if (!it->item->expanded)
1351 evas_object_smart_callback_call(WIDGET(it), SIG_EXPAND_REQUEST, it);
1355 _contract_signal_cb(void *data,
1356 Evas_Object *obj __UNUSED__,
1357 const char *emission __UNUSED__,
1358 const char *source __UNUSED__)
1360 Elm_Gen_Item *it = data;
1362 if (it->item->expanded)
1363 evas_object_smart_callback_call(WIDGET(it), SIG_CONTRACT_REQUEST, it);
1366 #if GENLIST_ENTRY_SUPPORT
1368 _changed_size_hints(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
1370 Elm_Gen_Item *it = data;
1372 if (it->want_unrealize) return;
1373 GL_IT(it)->wsd->size_changed = EINA_TRUE;
1374 evas_object_smart_changed(GL_IT(it)->wsd->pan_obj);
1379 _item_content_realize(Elm_Gen_Item *it,
1380 Evas_Object *target,
1384 Eina_List *res = it->content_objs;
1386 if (it->itc->func.content_get)
1390 Evas_Object *ic = NULL;
1393 *source = elm_widget_stringlist_get
1394 (edje_object_data_get(target, "contents"));
1396 EINA_LIST_FOREACH(*source, l, key)
1398 if (parts && fnmatch(parts, key, FNM_PERIOD))
1401 if (it->itc->func.content_get)
1402 ic = it->itc->func.content_get
1403 ((void *)it->base.data, WIDGET(it), key);
1406 res = eina_list_append(res, ic);
1407 edje_object_part_swallow(target, key, ic);
1408 evas_object_show(ic);
1410 #if GENLIST_ENTRY_SUPPORT
1411 // For entry or editfield
1412 // 1. Add resize callback for multiline entry.
1413 // 2. Do not unrealize it for focus issue
1414 // ps. Only for entry because of performnace
1415 if (!strcmp("elm_layout", evas_object_type_get(ic)))
1417 // If editfield style, it can have entry.
1419 edje_object_file_get(elm_layout_edje_get(ic), NULL, &group);
1420 if (group && !strncmp("elm/layout/editfield/", group, 20))
1422 evas_object_event_callback_add
1423 (ic, EVAS_CALLBACK_CHANGED_SIZE_HINTS,
1424 _changed_size_hints, it);
1425 it->item->unrealize_disabled = EINA_TRUE;
1429 else if (!strcmp("elm_entry", evas_object_type_get(ic)))
1431 evas_object_event_callback_add
1432 (ic, EVAS_CALLBACK_CHANGED_SIZE_HINTS,
1433 _changed_size_hints, it);
1434 it->item->unrealize_disabled = EINA_TRUE;
1437 #if 0 // FIXME: difference from upstream
1440 // FIXME: if entry calcuates its cursor position correctly and conformant works,
1441 // genlist does not need to handle this focus thing.
1442 evas_object_smart_callback_add(ic, "focused", _content_focused, it);
1443 evas_object_smart_callback_add(ic, "unfocused", _content_unfocused, it);
1446 if (elm_widget_item_disabled_get(it))
1447 elm_widget_disabled_set(ic, EINA_TRUE);
1456 _access_info_cb(void *data, Evas_Object *obj __UNUSED__)
1461 Elm_Gen_Item *it = (Elm_Gen_Item *)data;
1462 ELM_GENLIST_ITEM_CHECK_OR_RETURN(it, NULL);
1464 buf = eina_strbuf_new();
1466 if (it->itc->func.text_get)
1471 if (!(it->texts)) it->texts =
1472 elm_widget_stringlist_get(edje_object_data_get(VIEW(it), "texts"));
1474 EINA_LIST_FOREACH(it->texts, l, key)
1476 char *s = it->itc->func.text_get
1477 ((void *)it->base.data, WIDGET(it), key);
1479 s = _elm_util_mkup_to_text(s);
1483 if (eina_strbuf_length_get(buf) > 0) eina_strbuf_append(buf, ", ");
1484 eina_strbuf_append(buf, s);
1490 ret = eina_strbuf_string_steal(buf);
1491 eina_strbuf_free(buf);
1496 _access_state_cb(void *data, Evas_Object *obj __UNUSED__)
1498 Elm_Gen_Item *it = (Elm_Gen_Item *)data;
1499 ELM_GENLIST_ITEM_CHECK_OR_RETURN(it, NULL);
1501 if (it->base.disabled)
1502 return strdup(E_("State: Disabled"));
1508 _access_on_highlight_cb(void *data)
1510 Evas_Coord x, y, w, h;
1511 Evas_Coord sx, sy, sw, sh;
1512 Elm_Gen_Item *it = (Elm_Gen_Item *)data;
1513 ELM_GENLIST_ITEM_CHECK_OR_RETURN(it);
1515 ELM_GENLIST_DATA_GET(it->base.widget, sd);
1517 evas_object_geometry_get(it->base.view, &x, &y, &w, &h);
1518 // XXX There would be a reason.
1519 if ((w == 0) && (h == 0)) return;
1521 evas_object_geometry_get(ELM_WIDGET_DATA(sd)->obj, &sx, &sy, &sw, &sh);
1522 if ((x < sx) || (y < sy) || ((x + w) > (sx + sw)) || ((y + h) > (sy + sh)))
1523 elm_genlist_item_bring_in((Elm_Object_Item *)it,
1524 ELM_GENLIST_ITEM_SCROLLTO_IN);
1528 _access_widget_item_register(Elm_Gen_Item *it)
1530 Elm_Access_Info *ai;
1532 _elm_access_widget_item_register((Elm_Widget_Item *)it);
1534 ai = _elm_access_object_get(it->base.access_obj);
1536 _elm_access_callback_set(ai, ELM_ACCESS_INFO, _access_info_cb, it);
1537 _elm_access_callback_set(ai, ELM_ACCESS_STATE, _access_state_cb, it);
1538 _elm_access_on_highlight_hook_set(ai, _access_on_highlight_cb, it);
1539 _elm_access_activate_callback_set(ai, _access_activate_cb, it);
1543 _item_realize(Elm_Gen_Item *it,
1547 Item_Cache *itc = NULL;
1548 const char *treesize;
1554 if (it->item->order_num_in != in)
1556 _item_order_update(EINA_INLIST_GET(it), in);
1557 _elm_genlist_item_state_update(it, NULL);
1558 _elm_genlist_item_index_update(it);
1562 it->item->order_num_in = in;
1564 if (it->item->nocache_once | it->item->nocache ||
1565 it->item->type == ELM_GENLIST_ITEM_TREE || it->parent ||
1566 !_item_cache_pop(it))
1568 const char *stacking_even;
1569 const char *stacking;
1571 it->item->nocache_once = EINA_FALSE;
1573 VIEW(it) = edje_object_add(evas_object_evas_get(WIDGET(it)));
1574 edje_object_scale_set(VIEW(it),
1575 elm_widget_scale_get(WIDGET(it)) *
1576 elm_config_scale_get());
1577 evas_object_smart_member_add(VIEW(it), GL_IT(it)->wsd->pan_obj);
1578 elm_widget_sub_object_add(WIDGET(it), VIEW(it));
1580 if (it->item->type & ELM_GENLIST_ITEM_TREE)
1581 snprintf(buf, sizeof(buf), "tree%s/%s",
1582 GL_IT(it)->wsd->mode == ELM_LIST_COMPRESS ? "_compress" :
1583 "", it->itc->item_style ? : "default");
1585 snprintf(buf, sizeof(buf), "item%s/%s",
1586 GL_IT(it)->wsd->mode == ELM_LIST_COMPRESS ? "_compress" :
1587 "", it->itc->item_style ? : "default");
1589 elm_widget_theme_object_set
1590 (WIDGET(it), VIEW(it), "genlist", buf,
1591 elm_widget_style_get(WIDGET(it)));
1593 #if 1 // FIXME: difference from upstream
1594 if (it->item->expanded_depth > 0)
1595 edje_object_signal_emit(VIEW(it), "bg_color_change", "elm");
1598 stacking_even = edje_object_data_get(VIEW(it), "stacking_even");
1599 if (!stacking_even) stacking_even = "above";
1600 it->item->stacking_even = !!strcmp("above", stacking_even);
1602 stacking = edje_object_data_get(VIEW(it), "stacking");
1603 if (!stacking) stacking = "yes";
1604 it->item->nostacking = !!strcmp("yes", stacking);
1606 edje_object_mirrored_set
1607 (VIEW(it), elm_widget_mirrored_get(WIDGET(it)));
1609 edje_object_signal_callback_add
1610 (VIEW(it), "elm,action,expand,toggle", "elm",
1611 _expand_toggle_signal_cb, it);
1612 edje_object_signal_callback_add
1613 (VIEW(it), "elm,action,expand", "elm", _expand_signal_cb, it);
1614 edje_object_signal_callback_add
1615 (VIEW(it), "elm,action,contract", "elm", _contract_signal_cb, it);
1616 _item_mouse_callbacks_add(it, VIEW(it));
1620 if (_elm_config->access_mode) _access_widget_item_register(it);
1622 _item_order_update(EINA_INLIST_GET(it), in);
1623 #if 1 // FIXME: difference from upstream
1624 if (it->item->type != ELM_GENLIST_ITEM_GROUP)
1626 if (GL_IT(it)->wsd->reorder_mode)
1627 edje_object_signal_emit
1628 (VIEW(it), "elm,state,reorder,mode_set", "elm");
1630 edje_object_signal_emit
1631 (VIEW(it), "elm,state,reorder,mode_unset", "elm");
1634 treesize = edje_object_data_get(VIEW(it), "treesize");
1635 if (treesize) tsize = atoi(treesize);
1636 if (it->parent && GL_IT(it->parent)->type == ELM_GENLIST_ITEM_TREE &&
1637 !it->spacer && treesize)
1640 evas_object_rectangle_add(evas_object_evas_get(WIDGET(it)));
1641 evas_object_color_set(it->spacer, 0, 0, 0, 0);
1645 evas_object_size_hint_min_set
1646 (it->spacer, (it->item->expanded_depth * tsize) *
1647 elm_config_scale_get(), 1);
1648 edje_object_part_swallow(VIEW(it), "elm.swallow.pad", it->spacer);
1652 if ((GL_IT(it)->wsd->decorate_all_mode) && (!it->deco_all_view) &&
1653 (it->item->type != ELM_GENLIST_ITEM_GROUP) &&
1654 (it->itc->decorate_all_item_style))
1655 _decorate_all_item_realize(it, EINA_FALSE);
1657 _elm_genlist_item_state_update(it, itc);
1658 _elm_genlist_item_index_update(it);
1661 /* homogenous genlist shortcut */
1662 if ((calc) && (GL_IT(it)->wsd->homogeneous) && (!it->item->mincalcd) &&
1663 ((it->group && GL_IT(it)->wsd->group_item_width) ||
1664 (!it->group && GL_IT(it)->wsd->item_width)))
1668 it->item->w = it->item->minw = GL_IT(it)->wsd->group_item_width;
1669 it->item->h = it->item->minh = GL_IT(it)->wsd->group_item_height;
1673 it->item->w = it->item->minw = GL_IT(it)->wsd->item_width;
1674 it->item->h = it->item->minh = GL_IT(it)->wsd->item_height;
1676 it->item->mincalcd = EINA_TRUE;
1680 if (eina_list_count(it->content_objs) != 0)
1681 ERR_ABORT("If you see this error, please notify us and we"
1684 _item_text_realize(it, VIEW(it), &it->texts, NULL);
1686 _item_content_realize(it, VIEW(it), &it->contents, NULL);
1687 _item_state_realize(it, VIEW(it), &it->states, NULL);
1690 edje_object_signal_emit
1691 (VIEW(it), "elm,state,flip,enabled", "elm");
1692 // This is needed before contents are swallowed
1693 edje_object_message_signal_process(VIEW(it));
1695 if (!(it->item->flip_contents))
1696 it->item->flip_contents = elm_widget_stringlist_get
1697 (edje_object_data_get(VIEW(it), "flips"));
1698 it->item->flip_content_objs = _item_mode_content_realize
1699 (it, VIEW(it), &it->item->flip_contents, NULL,
1700 &it->item->flip_content_objs);
1703 /* access: unregister item which have no text and content */
1704 if (_elm_config->access_mode && !it->texts && !it->contents)
1705 _elm_access_widget_item_unregister((Elm_Widget_Item *)it);
1708 // FIXME: difference from upstream
1709 if (!it->item->mincalcd || ((GL_IT(it)->wsd->mode == ELM_LIST_COMPRESS) && (it->item->w != it->item->minw)))
1711 if (!it->item->mincalcd)
1714 Evas_Coord mw = 0, mh = 0;
1716 if (it->select_mode != ELM_OBJECT_SELECT_MODE_DISPLAY_ONLY)
1717 elm_coords_finger_size_adjust(1, &mw, 1, &mh);
1718 if ((GL_IT(it)->wsd->mode == ELM_LIST_COMPRESS) &&
1719 (GL_IT(it)->wsd->prev_viewport_w != 0) &&
1720 (mw < GL_IT(it)->wsd->prev_viewport_w))
1721 mw = GL_IT(it)->wsd->prev_viewport_w;
1722 edje_object_size_min_restricted_calc(VIEW(it), &mw, &mh, mw, mh);
1723 if ((GL_IT(it)->wsd->mode == ELM_LIST_COMPRESS) &&
1724 (GL_IT(it)->wsd->prev_viewport_w != 0) &&
1725 (mw > GL_IT(it)->wsd->prev_viewport_w))
1726 mw = GL_IT(it)->wsd->prev_viewport_w;
1729 it->item->w = it->item->minw = mw;
1730 it->item->h = it->item->minh = mh;
1731 it->item->mincalcd = EINA_TRUE;
1733 if ((!GL_IT(it)->wsd->group_item_width) && (it->group))
1735 GL_IT(it)->wsd->group_item_width = mw;
1736 GL_IT(it)->wsd->group_item_height = mh;
1738 else if ((!GL_IT(it)->wsd->item_width) &&
1739 (it->item->type == ELM_GENLIST_ITEM_NONE))
1741 GL_IT(it)->wsd->item_width = mw;
1742 GL_IT(it)->wsd->item_height = mh;
1745 if (!calc) evas_object_show(VIEW(it));
1748 if (it->tooltip.content_cb)
1750 elm_widget_item_tooltip_content_cb_set
1751 (it, it->tooltip.content_cb, it->tooltip.data, NULL);
1752 elm_widget_item_tooltip_style_set(it, it->tooltip.style);
1753 elm_widget_item_tooltip_window_mode_set(it, it->tooltip.free_size);
1756 if (it->mouse_cursor)
1757 elm_widget_item_cursor_set(it, it->mouse_cursor);
1759 it->realized = EINA_TRUE;
1760 it->want_unrealize = EINA_FALSE;
1762 if (!calc || it->item->unrealize_disabled)
1763 evas_object_smart_callback_call(WIDGET(it), SIG_REALIZED, it);
1765 if ((!calc) && (GL_IT(it)->wsd->decorate_all_mode) &&
1766 (it->item->type != ELM_GENLIST_ITEM_GROUP))
1768 if (it->itc->decorate_all_item_style)
1770 if (!it->deco_all_view)
1771 _decorate_all_item_realize(it, EINA_FALSE);
1772 edje_object_message_signal_process(it->deco_all_view);
1775 if ((!calc) && (it->decorate_it_set) &&
1776 (it->item->type != ELM_GENLIST_ITEM_GROUP))
1778 if (it->itc->decorate_item_style)
1780 if (!it->item->deco_it_view)
1781 _decorate_item_set(it);
1782 edje_object_message_signal_process(it->item->deco_it_view);
1785 edje_object_message_signal_process(VIEW(it));
1788 #if GENLIST_PINCH_ZOOM_SUPPORT
1790 _pinch_items_recalc(void *data)
1792 Elm_Genlist_Smart_Data *sd = data;
1797 Evas_Coord tot_y = 0, ox, oy;
1798 evas_object_geometry_get(sd->pan_obj, &ox, &oy, NULL, NULL);
1800 EINA_INLIST_FOREACH(sd->blocks, itb)
1802 EINA_LIST_FOREACH(itb->items, l, it)
1805 if (IS_ROOT_PARENT_IT(it))
1807 if (sd->pinch_zoom_mode == ELM_GEN_PINCH_ZOOM_CONTRACT)
1809 if (!it->realized) _item_realize(it, 0, EINA_FALSE);
1810 it->item->scrl_y = oy + tot_y - sd->pan_y;
1811 evas_object_resize(VIEW(it), sd->minw, it->item->h);
1812 evas_object_move(VIEW(it), it->item->scrl_x, it->item->scrl_y);
1813 evas_object_show(VIEW(it));
1814 evas_object_raise(VIEW(it));
1815 tot_y += it->item->h;
1816 sd->pinch_zoom_h = tot_y;
1819 else if (sd->pinch_zoom_mode == ELM_GEN_PINCH_ZOOM_EXPAND)
1821 evas_object_resize(VIEW(it), sd->minw, it->item->h);
1822 it->item->scrl_y = oy + it->item->pan_scrl_y - sd->pan_y;
1823 evas_object_move(VIEW(it), it->item->scrl_x, it->item->scrl_y);
1832 #if GROUP_ITEMS_FEATURE
1834 _group_items_recalc(void *data)
1838 Elm_Genlist_Smart_Data *sd = data;
1840 //evas_event_freeze(evas_object_evas_get(ELM_WIDGET_DATA(sd)->obj));
1841 EINA_LIST_FOREACH(sd->group_items, l, git)
1843 if (git->item->want_realize)
1845 if (!git->realized) _item_realize(git, 0, EINA_FALSE);
1846 evas_object_resize(VIEW(git), sd->minw, git->item->h);
1847 evas_object_move(VIEW(git), git->item->scrl_x, git->item->scrl_y);
1848 evas_object_show(VIEW(git));
1849 evas_object_raise(VIEW(git));
1851 else if (!git->item->want_realize)
1854 _item_unrealize(git, EINA_FALSE);
1857 //evas_event_thaw(evas_object_evas_get(ELM_WIDGET_DATA(sd)->obj));
1858 //evas_event_thaw_eval(evas_object_evas_get(ELM_WIDGET_DATA(sd)->obj));
1863 _reorder_move_animator_cb(void *data)
1866 Elm_Gen_Item *it = data;
1867 Eina_Bool down = EINA_FALSE;
1870 dy = 6 * elm_config_scale_get();
1871 t = ((0.0 > (t = ecore_loop_time_get()
1872 - GL_IT(it)->wsd->start_time)) ? 0.0 : t);
1874 if (t <= REORDER_EFFECT_TIME)
1875 y = (1 * sin((t / REORDER_EFFECT_TIME) * (M_PI / 2)) * dy);
1878 diff = abs(it->item->old_scrl_y - it->item->scrl_y);
1879 if (diff < dy) y = diff;
1881 if (it->item->old_scrl_y < it->item->scrl_y)
1883 it->item->old_scrl_y += y;
1886 else if (it->item->old_scrl_y > it->item->scrl_y)
1888 it->item->old_scrl_y -= y;
1892 if (it->deco_all_view)
1894 (it, it->deco_all_view, it->item->scrl_x, it->item->old_scrl_y);
1895 else if (it->item->deco_it_view)
1897 (it, it->item->deco_it_view, it->item->scrl_x, it->item->old_scrl_y);
1899 _item_position(it, VIEW(it), it->item->scrl_x, it->item->old_scrl_y);
1901 if ((GL_IT(it)->wsd->reorder_pan_move) ||
1902 (down && it->item->old_scrl_y >= it->item->scrl_y) ||
1903 (!down && it->item->old_scrl_y <= it->item->scrl_y))
1905 it->item->old_scrl_y = it->item->scrl_y;
1906 it->item->move_effect_enabled = EINA_FALSE;
1907 GL_IT(it)->wsd->reorder_move_animator = NULL;
1908 return ECORE_CALLBACK_CANCEL;
1911 return ECORE_CALLBACK_RENEW;
1915 _reorder_item_space_get(Elm_Gen_Item *it)
1917 Elm_Gen_Item *reorder_it = GL_IT(it)->wsd->reorder_it;
1918 Evas_Coord rox, roy, row, roh, oy, oh;
1919 Eina_Bool top = EINA_FALSE;
1921 if (!reorder_it) return 0;
1922 if(it->deco_all_view) evas_object_lower(it->deco_all_view);
1924 evas_object_geometry_get(GL_IT(it)->wsd->pan_obj, NULL, &oy, NULL, &oh);
1925 evas_object_geometry_get
1926 (GL_IT(it)->wsd->VIEW(reorder_it), &rox, &roy, &row, &roh);
1928 if ((GL_IT(it)->wsd->reorder_start_y < it->item->block->y) &&
1929 (roy - oy + (roh / 2) >= it->item->block->y - GL_IT(it)->wsd->pan_y))
1931 it->item->block->reorder_offset =
1932 GL_IT(it)->wsd->reorder_it->item->h * -1;
1933 if (it->item->block->count == 1)
1934 GL_IT(it)->wsd->reorder_rel = it;
1936 else if ((GL_IT(it)->wsd->reorder_start_y >= it->item->block->y) &&
1937 (roy - oy + (roh / 2) <= it->item->block->y -
1938 GL_IT(it)->wsd->pan_y))
1940 it->item->block->reorder_offset = GL_IT(it)->wsd->reorder_it->item->h;
1943 it->item->block->reorder_offset = 0;
1945 it->item->scrl_y += it->item->block->reorder_offset;
1947 top = (ELM_RECTS_INTERSECT
1948 (it->item->scrl_x, it->item->scrl_y, it->item->w, it->item->h,
1949 rox, roy + (roh / 2), row, 1));
1952 GL_IT(it)->wsd->reorder_rel = it;
1953 it->item->scrl_y += GL_IT(it)->wsd->reorder_it->item->h;
1954 return GL_IT(it)->wsd->reorder_it->item->h;
1961 _item_block_position(Item_Block *itb,
1967 Eina_Bool vis = EINA_FALSE;
1968 Evas_Coord y = 0, ox, oy, ow, oh, cvx, cvy, cvw, cvh;
1970 //evas_event_freeze(evas_object_evas_get(ELM_WIDGET_DATA(itb->sd)->obj));
1971 evas_object_geometry_get(itb->sd->pan_obj, &ox, &oy, &ow, &oh);
1972 evas_output_viewport_get
1973 (evas_object_evas_get(ELM_WIDGET_DATA(itb->sd)->obj),
1974 &cvx, &cvy, &cvw, &cvh);
1976 EINA_LIST_FOREACH(itb->items, l, it)
1978 if ((GL_IT(it)->wsd->reorder_it == it) && it->highlighted) continue;
1982 it->item->w = itb->w;
1983 it->item->scrl_x = itb->x + it->x - GL_IT(it)->wsd->pan_x + ox;
1984 it->item->scrl_y = itb->y + it->y - GL_IT(it)->wsd->pan_y + oy;
1986 vis = (ELM_RECTS_INTERSECT
1987 (it->item->scrl_x, it->item->scrl_y, it->item->w, it->item->h,
1988 cvx, cvy, cvw, cvh));
1991 if ((itb->realized) && (!it->realized))
1993 if (vis) _item_realize(it, in, EINA_FALSE);
1997 if (vis || it->dragging)
1999 #if GENLIST_ENTRY_SUPPORT
2000 evas_object_show(VIEW(it));
2002 if (GL_IT(it)->wsd->reorder_mode &&
2003 GL_IT(it)->wsd->reorder_it &&
2004 GL_IT(it)->wsd->reorder_it->highlighted)
2005 y += _reorder_item_space_get(it);
2006 git = it->item->group_item;
2009 if (git->item->scrl_y < oy)
2010 git->item->scrl_y = oy;
2011 if ((git->item->scrl_y + git->item->h) >
2012 (it->item->scrl_y + it->item->h))
2013 git->item->scrl_y = (it->item->scrl_y +
2014 it->item->h) - git->item->h;
2015 git->item->scrl_x = it->item->scrl_x;
2016 git->item->want_realize = EINA_TRUE;
2018 if ((GL_IT(it)->wsd->reorder_it) &&
2019 GL_IT(it)->wsd->reorder_it->highlighted &&
2020 (it->item->old_scrl_y != it->item->scrl_y))
2022 if (!it->item->move_effect_enabled)
2024 it->item->move_effect_enabled = EINA_TRUE;
2025 GL_IT(it)->wsd->reorder_move_animator =
2027 _reorder_move_animator_cb, it);
2030 if (!it->item->move_effect_enabled)
2032 if ((GL_IT(it)->wsd->decorate_all_mode) &&
2033 (it->itc->decorate_all_item_style))
2034 _decorate_all_item_position
2035 (it, it->item->scrl_x, it->item->scrl_y);
2038 if (it->item->deco_it_view)
2040 (it, it->item->deco_it_view,
2045 (it, VIEW(it), it->item->scrl_x,
2048 it->item->old_scrl_y = it->item->scrl_y;
2049 #if GENLIST_PINCH_ZOOM_SUPPORT
2050 if (((GL_IT(it)->wsd->pinch_zoom_mode == ELM_GEN_PINCH_ZOOM_CONTRACT)
2051 && (!IS_ROOT_PARENT_IT(it))) || (GL_IT(it)->wsd->sorting))
2053 if (it->deco_all_view) evas_object_hide(it->deco_all_view);
2054 else evas_object_hide(VIEW(it));
2062 if ((GL_IT(it)->wsd->pinch_zoom_mode == ELM_GEN_PINCH_ZOOM_CONTRACT)
2063 && (!IS_ROOT_PARENT_IT(it)))
2065 if (it->deco_all_view) evas_object_hide(it->deco_all_view);
2066 else evas_object_hide(VIEW(it));
2069 _item_unrealize(it, EINA_FALSE);
2076 if (vis) it->item->want_realize = EINA_TRUE;
2080 // FIXME: diffrence from upstream
2081 minh += it->item->minh;
2085 //evas_event_thaw(evas_object_evas_get(ELM_WIDGET_DATA(itb->sd)->obj));
2086 //evas_event_thaw_eval(evas_object_evas_get(ELM_WIDGET_DATA(itb->sd)->obj));
2090 _item_block_realize(Item_Block *itb)
2092 if (itb->realized) return;
2094 itb->realized = EINA_TRUE;
2095 itb->want_unrealize = EINA_FALSE;
2099 _changed_job(Elm_Genlist_Smart_Data *sd)
2105 Eina_Bool anything_changed = EINA_FALSE;
2106 Eina_Bool width_changed = EINA_FALSE;
2107 Eina_Bool height_changed = EINA_FALSE;
2109 EINA_INLIST_FOREACH(sd->blocks, itb)
2114 width_changed = height_changed = EINA_FALSE;
2115 EINA_LIST_FOREACH(itb->items, l2, it)
2119 Evas_Coord mw = 0, mh = 0;
2121 if (it->select_mode != ELM_OBJECT_SELECT_MODE_DISPLAY_ONLY)
2122 elm_coords_finger_size_adjust(1, &mw, 1, &mh);
2123 if ((GL_IT(it)->wsd->mode == ELM_LIST_COMPRESS) &&
2124 (GL_IT(it)->wsd->prev_viewport_w != 0) &&
2125 (mw < GL_IT(it)->wsd->prev_viewport_w))
2126 mw = GL_IT(it)->wsd->prev_viewport_w;
2127 edje_object_size_min_restricted_calc(VIEW(it), &mw, &mh, mw, mh);
2128 if ((GL_IT(it)->wsd->mode == ELM_LIST_COMPRESS) &&
2129 (GL_IT(it)->wsd->prev_viewport_w != 0) &&
2130 (mw > GL_IT(it)->wsd->prev_viewport_w))
2131 mw = GL_IT(it)->wsd->prev_viewport_w;
2133 if (it->item->minw != mw)
2135 it->item->w = it->item->minw = mw;
2136 width_changed = EINA_TRUE;
2138 if (it->item->minh != mh)
2140 it->item->h = it->item->minh = mh;
2141 height_changed = EINA_TRUE;
2148 if ((!sd->group_item_width) && (it->group))
2150 sd->group_item_width = mw;
2151 sd->group_item_height = mh;
2153 else if ((!sd->item_width) && (it->item->type == ELM_GENLIST_ITEM_NONE))
2155 sd->item_width = mw;
2156 sd->item_height = mh;
2163 anything_changed = EINA_TRUE;
2164 itb->changed = EINA_TRUE;
2165 _item_block_recalc(itb, num0, 0);
2166 _item_block_position(itb, num0);
2168 else if (width_changed)
2170 _item_block_position(itb, num0);
2173 if (anything_changed)
2175 if (sd->calc_job) ecore_job_del(sd->calc_job);
2176 sd->calc_job = ecore_job_add(_calc_job, sd);
2181 _elm_genlist_pan_smart_calculate(Evas_Object *obj)
2183 Evas_Coord ox, oy, ow, oh, cvx, cvy, cvw, cvh;
2184 Evas_Coord vx = 0, vy = 0, vw = 0, vh = 0;
2190 ELM_GENLIST_PAN_DATA_GET(obj, psd);
2192 //evas_event_freeze(evas_object_evas_get(obj));
2194 #if GENLIST_FX_SUPPORT
2195 if (psd->wsd->fx_playing) return;
2197 if (psd->wsd->pan_changed)
2199 _calc_job(psd->wsd);
2200 psd->wsd->pan_changed = EINA_FALSE;
2203 evas_object_geometry_get(obj, &ox, &oy, &ow, &oh);
2204 evas_output_viewport_get(evas_object_evas_get(obj), &cvx, &cvy, &cvw, &cvh);
2205 EINA_LIST_FOREACH(psd->wsd->group_items, l, git)
2207 #if GROUP_ITEMS_FEATURE
2208 git->item->want_realize = EINA_FALSE;
2210 _item_unrealize(git, EINA_TRUE);
2214 EINA_INLIST_FOREACH(psd->wsd->blocks, itb)
2216 itb->w = psd->wsd->minw;
2217 if (ELM_RECTS_INTERSECT(itb->x - psd->wsd->pan_x + ox,
2218 itb->y - psd->wsd->pan_y + oy,
2220 cvx, cvy, cvw, cvh))
2222 if ((!itb->realized) || (itb->changed))
2224 _item_block_realize(itb);
2226 // FIXME: difference from opensource
2227 if (sd->wd->calc_job) ecore_job_del(sd->wd->calc_job);
2228 sd->wd->calc_job = NULL;
2232 _item_block_position(itb, in);
2236 if (itb->realized) _item_block_unrealize(itb);
2240 #if GENLIST_PINCH_ZOOM_SUPPORT
2241 if (psd->wsd->pinch_zoom_mode) _pinch_items_recalc(psd->wsd);
2244 #if GROUP_ITEMS_FEATURE
2245 if ((!psd->wsd->reorder_it) || (psd->wsd->reorder_pan_move))
2246 _group_items_recalc(psd->wsd);
2248 if ((psd->wsd->reorder_mode) && (psd->wsd->reorder_it))
2250 if (psd->wsd->pan_y != psd->wsd->reorder_old_pan_y)
2251 psd->wsd->reorder_pan_move = EINA_TRUE;
2252 else psd->wsd->reorder_pan_move = EINA_FALSE;
2254 evas_object_raise(psd->wsd->VIEW(reorder_it));
2255 psd->wsd->reorder_old_pan_y = psd->wsd->pan_y;
2256 psd->wsd->start_time = ecore_loop_time_get();
2258 _item_auto_scroll(psd->wsd);
2260 psd->wsd->s_iface->content_pos_get(ELM_WIDGET_DATA(psd->wsd)->obj, &vx, &vy);
2261 psd->wsd->s_iface->content_viewport_size_get(ELM_WIDGET_DATA(psd->wsd)->obj,
2264 if (psd->wsd->reorder_fast == 1)
2265 psd->wsd->s_iface->content_region_show(ELM_WIDGET_DATA(psd->wsd)->obj,
2266 vx,vy - 10, vw, vh);
2267 else if (psd->wsd->reorder_fast == -1)
2268 psd->wsd->s_iface->content_region_show(ELM_WIDGET_DATA(psd->wsd)->obj,
2269 vx, vy + 10, vw, vh);
2271 if (psd->wsd->size_changed)
2273 _changed_job(psd->wsd);
2274 psd->wsd->size_changed = EINA_FALSE;
2277 #if GENLIST_FX_SUPPORT
2278 psd->wsd->rendered = EINA_TRUE;
2279 if ((psd->wsd->fx_mode) && (!psd->wsd->queue))
2281 if (_elm_genlist_fx_capture(ELM_WIDGET_DATA(psd->wsd)->obj, 1))
2282 _elm_genlist_fx_play(ELM_WIDGET_DATA(psd->wsd)->obj);
2285 #if GENLIST_PINCH_ZOOM_SUPPORT
2286 if (psd->wsd->pinch_zoom_mode == ELM_GEN_PINCH_ZOOM_EXPAND)
2287 psd->wsd->pinch_zoom_mode = ELM_GEN_PINCH_ZOOM_NONE;
2289 //evas_event_thaw(evas_object_evas_get(obj));
2290 //evas_event_thaw_eval(evas_object_evas_get(obj));
2294 _elm_genlist_pan_smart_set_user(Elm_Genlist_Pan_Smart_Class *sc)
2296 ELM_PAN_CLASS(sc)->base.add = _elm_genlist_pan_smart_add;
2297 ELM_PAN_CLASS(sc)->base.del = _elm_genlist_pan_smart_del;
2298 ELM_PAN_CLASS(sc)->base.move = _elm_genlist_pan_smart_move;
2299 ELM_PAN_CLASS(sc)->base.resize = _elm_genlist_pan_smart_resize;
2300 ELM_PAN_CLASS(sc)->base.calculate = _elm_genlist_pan_smart_calculate;
2302 ELM_PAN_CLASS(sc)->pos_set = _elm_genlist_pan_smart_pos_set;
2303 ELM_PAN_CLASS(sc)->pos_get = _elm_genlist_pan_smart_pos_get;
2304 ELM_PAN_CLASS(sc)->pos_max_get = _elm_genlist_pan_smart_pos_max_get;
2305 ELM_PAN_CLASS(sc)->pos_min_get = _elm_genlist_pan_smart_pos_min_get;
2306 ELM_PAN_CLASS(sc)->content_size_get =
2307 _elm_genlist_pan_smart_content_size_get;
2311 _item_multi_select_up(Elm_Genlist_Smart_Data *sd)
2313 Elm_Object_Item *prev;
2315 if (!sd->selected) return EINA_FALSE;
2316 if (!sd->multi) return EINA_FALSE;
2318 prev = elm_genlist_item_prev_get(sd->last_selected_item);
2319 if (!prev) return EINA_TRUE;
2321 if (elm_genlist_item_selected_get(prev))
2323 elm_genlist_item_selected_set(sd->last_selected_item, EINA_FALSE);
2324 sd->last_selected_item = prev;
2325 elm_genlist_item_show
2326 (sd->last_selected_item, ELM_GENLIST_ITEM_SCROLLTO_IN);
2330 elm_genlist_item_selected_set(prev, EINA_TRUE);
2331 elm_genlist_item_show(prev, ELM_GENLIST_ITEM_SCROLLTO_IN);
2337 _item_multi_select_down(Elm_Genlist_Smart_Data *sd)
2339 Elm_Object_Item *next;
2341 if (!sd->selected) return EINA_FALSE;
2342 if (!sd->multi) return EINA_FALSE;
2344 next = elm_genlist_item_next_get(sd->last_selected_item);
2345 if (!next) return EINA_TRUE;
2347 if (elm_genlist_item_selected_get(next))
2349 elm_genlist_item_selected_set(sd->last_selected_item, EINA_FALSE);
2350 sd->last_selected_item = next;
2351 elm_genlist_item_show
2352 (sd->last_selected_item, ELM_GENLIST_ITEM_SCROLLTO_IN);
2356 elm_genlist_item_selected_set(next, EINA_TRUE);
2357 elm_genlist_item_show(next, ELM_GENLIST_ITEM_SCROLLTO_IN);
2364 _all_items_deselect(Elm_Genlist_Smart_Data *sd)
2366 if (!sd->selected) return EINA_FALSE;
2368 while (sd->selected)
2369 elm_genlist_item_selected_set(sd->selected->data, EINA_FALSE);
2375 _item_single_select_up(Elm_Genlist_Smart_Data *sd)
2381 prev = ELM_GEN_ITEM_FROM_INLIST(sd->items->last);
2383 prev = ELM_GEN_ITEM_FROM_INLIST(EINA_INLIST_GET(prev)->prev);
2386 prev = (Elm_Gen_Item *)elm_genlist_item_prev_get
2387 (sd->last_selected_item);
2389 if (!prev) return EINA_FALSE;
2391 _all_items_deselect(sd);
2393 elm_genlist_item_selected_set((Elm_Object_Item *)prev, EINA_TRUE);
2394 elm_genlist_item_show((Elm_Object_Item *)prev, ELM_GENLIST_ITEM_SCROLLTO_IN);
2399 _item_single_select_down(Elm_Genlist_Smart_Data *sd)
2405 next = ELM_GEN_ITEM_FROM_INLIST(sd->items);
2407 next = ELM_GEN_ITEM_FROM_INLIST(EINA_INLIST_GET(next)->next);
2410 next = (Elm_Gen_Item *)elm_genlist_item_next_get
2411 (sd->last_selected_item);
2413 if (!next) return EINA_FALSE;
2415 _all_items_deselect(sd);
2417 elm_genlist_item_selected_set((Elm_Object_Item *)next, EINA_TRUE);
2418 elm_genlist_item_show
2419 ((Elm_Object_Item *)next, ELM_GENLIST_ITEM_SCROLLTO_IN);
2425 _elm_genlist_smart_event(Evas_Object *obj,
2426 Evas_Object *src __UNUSED__,
2427 Evas_Callback_Type type,
2434 Evas_Coord step_x = 0;
2435 Evas_Coord step_y = 0;
2436 Evas_Coord page_x = 0;
2437 Evas_Coord page_y = 0;
2438 Elm_Object_Item *it;
2439 Evas_Event_Key_Down *ev = event_info;
2440 Evas_Coord pan_max_x = 0, pan_max_y = 0;
2442 ELM_GENLIST_DATA_GET(obj, sd);
2444 if (type != EVAS_CALLBACK_KEY_DOWN) return EINA_FALSE;
2445 if (!sd->items) return EINA_FALSE;
2446 if (ev->event_flags & EVAS_EVENT_FLAG_ON_HOLD) return EINA_FALSE;
2447 if (elm_widget_disabled_get(obj)) return EINA_FALSE;
2449 sd->s_iface->content_pos_get(obj, &x, &y);
2450 sd->s_iface->step_size_get(obj, &step_x, &step_y);
2451 sd->s_iface->page_size_get(obj, &page_x, &page_y);
2452 sd->s_iface->content_viewport_size_get(obj, &v_w, &v_h);
2454 if ((!strcmp(ev->keyname, "Left")) ||
2455 ((!strcmp(ev->keyname, "KP_Left")) && (!ev->string)))
2459 else if ((!strcmp(ev->keyname, "Right")) ||
2460 ((!strcmp(ev->keyname, "KP_Right")) && (!ev->string)))
2464 else if ((!strcmp(ev->keyname, "Up")) ||
2465 ((!strcmp(ev->keyname, "KP_Up")) && (!ev->string)))
2467 if (((evas_key_modifier_is_set(ev->modifiers, "Shift")) &&
2468 (_item_multi_select_up(sd)))
2469 || (_item_single_select_up(sd)))
2471 ev->event_flags |= EVAS_EVENT_FLAG_ON_HOLD;
2477 else if ((!strcmp(ev->keyname, "Down")) ||
2478 ((!strcmp(ev->keyname, "KP_Down")) && (!ev->string)))
2480 if (((evas_key_modifier_is_set(ev->modifiers, "Shift")) &&
2481 (_item_multi_select_down(sd)))
2482 || (_item_single_select_down(sd)))
2484 ev->event_flags |= EVAS_EVENT_FLAG_ON_HOLD;
2490 else if ((!strcmp(ev->keyname, "Home")) ||
2491 ((!strcmp(ev->keyname, "KP_Home")) && (!ev->string)))
2493 it = elm_genlist_first_item_get(obj);
2494 elm_genlist_item_bring_in(it, ELM_GENLIST_ITEM_SCROLLTO_IN);
2495 elm_genlist_item_selected_set(it, EINA_TRUE);
2496 ev->event_flags |= EVAS_EVENT_FLAG_ON_HOLD;
2499 else if ((!strcmp(ev->keyname, "End")) ||
2500 ((!strcmp(ev->keyname, "KP_End")) && (!ev->string)))
2502 it = elm_genlist_last_item_get(obj);
2503 elm_genlist_item_bring_in(it, ELM_GENLIST_ITEM_SCROLLTO_IN);
2504 elm_genlist_item_selected_set(it, EINA_TRUE);
2505 ev->event_flags |= EVAS_EVENT_FLAG_ON_HOLD;
2508 else if ((!strcmp(ev->keyname, "Prior")) ||
2509 ((!strcmp(ev->keyname, "KP_Prior")) && (!ev->string)))
2512 y -= -(page_y * v_h) / 100;
2516 else if ((!strcmp(ev->keyname, "Next")) ||
2517 ((!strcmp(ev->keyname, "KP_Next")) && (!ev->string)))
2520 y += -(page_y * v_h) / 100;
2524 else if (!strcmp(ev->keyname, "Escape"))
2526 if (!_all_items_deselect(sd)) return EINA_FALSE;
2527 ev->event_flags |= EVAS_EVENT_FLAG_ON_HOLD;
2530 else if (((!strcmp(ev->keyname, "Return")) ||
2531 (!strcmp(ev->keyname, "KP_Enter")) ||
2532 (!strcmp(ev->keyname, "space")))
2533 && (!sd->multi) && (sd->selected))
2535 it = elm_genlist_selected_item_get(obj);
2536 elm_genlist_item_expanded_set(it, !elm_genlist_item_expanded_get(it));
2537 evas_object_smart_callback_call(WIDGET(it), SIG_ACTIVATED, it);
2539 else return EINA_FALSE;
2541 ev->event_flags |= EVAS_EVENT_FLAG_ON_HOLD;
2542 _elm_genlist_pan_smart_pos_max_get(sd->pan_obj, &pan_max_x, &pan_max_y);
2544 if (x > pan_max_x) x = pan_max_x;
2546 if (y > pan_max_y) y = pan_max_y;
2548 sd->s_iface->content_pos_set(obj, x, y, EINA_TRUE);
2554 _elm_genlist_smart_sub_object_add(Evas_Object *obj,
2557 Elm_Widget_Smart_Class *parent_parent;
2559 parent_parent = (Elm_Widget_Smart_Class *)((Evas_Smart_Class *)
2560 _elm_genlist_parent_sc)->parent;
2562 /* skipping layout's code, which registers size hint changing
2563 * callback on sub objects. this is here because items'
2564 * content_get() routines may change hints on the objects after
2565 * creation, thus issuing TOO MANY sizing_eval()'s here. they are
2566 * not needed at here anyway, so let's skip listening to those
2568 if (!parent_parent->sub_object_add(obj, sobj))
2575 _elm_genlist_smart_sub_object_del(Evas_Object *obj,
2578 ELM_GENLIST_DATA_GET(obj, sd);
2580 /* XXX: hack -- also skipping sizing recalculation on
2581 * sub-object-del. genlist's crazy code paths (like groups and
2582 * such) seem to issue a whole lot of deletions and Evas bitches
2583 * about too many recalculations */
2584 sd->on_sub_del = EINA_TRUE;
2586 if (!ELM_WIDGET_CLASS(_elm_genlist_parent_sc)->sub_object_del(obj, sobj))
2589 sd->on_sub_del = EINA_FALSE;
2595 _elm_genlist_smart_on_focus(Evas_Object *obj)
2597 ELM_GENLIST_DATA_GET(obj, sd);
2599 if (!ELM_WIDGET_CLASS(_elm_genlist_parent_sc)->on_focus(obj))
2602 if (elm_widget_focus_get(obj) && (sd->items) && (sd->selected) &&
2603 (!sd->last_selected_item))
2604 sd->last_selected_item = eina_list_data_get(sd->selected);
2610 _elm_genlist_smart_focus_next(const Evas_Object *obj,
2611 Elm_Focus_Direction dir,
2614 Evas_Coord x, y, w, h;
2615 Evas_Coord sx, sy, sw, sh;
2617 Eina_List *items = NULL;
2618 Eina_Bool done = EINA_FALSE;
2620 ELM_GENLIST_CHECK(obj) EINA_FALSE;
2621 ELM_GENLIST_DATA_GET(obj, sd);
2623 evas_object_geometry_get(ELM_WIDGET_DATA(sd)->obj, &sx, &sy, &sw, &sh);
2625 EINA_INLIST_FOREACH(sd->blocks, itb)
2633 EINA_LIST_FOREACH(itb->items, l, it)
2637 evas_object_geometry_get(it->base.view, &x, &y, &w, &h);
2639 /* check item which displays more than half of its size */
2640 if (ELM_RECTS_INTERSECT
2641 (x + (w / 2), y + (h / 2), 0, 0, sx, sy, sw, sh))
2642 items = eina_list_append(items, it->base.access_obj);
2644 if (!it->base.access_order) continue;
2648 EINA_LIST_FOREACH(it->base.access_order, subl, subo)
2649 items = eina_list_append(items, subo);
2653 else if (done) break;
2656 return elm_widget_focus_list_next_get
2657 (obj, items, eina_list_data_get, dir, next);
2661 _mirrored_set(Evas_Object *obj,
2664 ELM_GENLIST_DATA_GET(obj, sd);
2666 sd->s_iface->mirrored_set(obj, rtl);
2670 _elm_genlist_smart_theme(Evas_Object *obj)
2674 ELM_GENLIST_DATA_GET(obj, sd);
2676 if (!ELM_WIDGET_CLASS(_elm_genlist_parent_sc)->theme(obj))
2679 //evas_event_freeze(evas_object_evas_get(ELM_WIDGET_DATA(sd)->obj));
2680 _item_cache_all_free(sd);
2681 _mirrored_set(obj, elm_widget_mirrored_get(obj));
2684 // FIXME: difference from opensource
2685 elm_layout_theme_set(obj, "genlist", "base", elm_widget_style_get(obj));
2688 sd->item_width = sd->item_height = 0;
2689 sd->group_item_width = sd->group_item_height = 0;
2690 sd->minw = sd->minh = sd->realminw = 0;
2691 EINA_INLIST_FOREACH(sd->blocks, itb)
2696 if (itb->realized) _item_block_unrealize(itb);
2697 EINA_LIST_FOREACH(itb->items, l, it)
2698 it->item->mincalcd = EINA_FALSE;
2700 itb->changed = EINA_TRUE;
2702 if (sd->calc_job) ecore_job_del(sd->calc_job);
2703 sd->calc_job = NULL;
2704 elm_layout_sizing_eval(obj);
2705 sd->pan_changed = EINA_TRUE;
2706 evas_object_smart_changed(sd->pan_obj);
2707 //evas_event_thaw(evas_object_evas_get(ELM_WIDGET_DATA(sd)->obj));
2708 //evas_event_thaw_eval(evas_object_evas_get(ELM_WIDGET_DATA(sd)->obj));
2713 /* FIXME: take off later. maybe this show region coords belong in the
2714 * interface (new api functions, set/get)? */
2716 _show_region_hook(void *data,
2719 Evas_Coord x, y, w, h;
2721 ELM_GENLIST_DATA_GET(data, sd);
2723 elm_widget_show_region_get(obj, &x, &y, &w, &h);
2724 //x & y are screen coordinates, Add with pan coordinates
2727 sd->s_iface->content_region_show(obj, x, y, w, h);
2731 _elm_genlist_smart_translate(Evas_Object *obj)
2733 evas_object_smart_callback_call(obj, "language,changed", NULL);
2739 _item_highlight(Elm_Gen_Item *it)
2741 const char *selectraise;
2742 Elm_Genlist_Smart_Data *sd = GL_IT(it)->wsd;
2744 if (elm_widget_item_disabled_get(it)) return;
2745 if ((sd->select_mode == ELM_OBJECT_SELECT_MODE_NONE) ||
2746 (sd->select_mode == ELM_OBJECT_SELECT_MODE_DISPLAY_ONLY ) ||
2747 (it->select_mode == ELM_OBJECT_SELECT_MODE_NONE) ||
2748 (it->select_mode == ELM_OBJECT_SELECT_MODE_DISPLAY_ONLY ))
2751 if (!sd->highlight || it->highlighted) return;
2752 #if GENLIST_PINCH_ZOOM_SUPPORT
2753 if (sd->pinch_zoom_mode) return;
2756 selectraise = edje_object_data_get(VIEW(it), "selectraise");
2757 if ((selectraise) && (!strcmp(selectraise, "on")))
2759 if (it->deco_all_view) evas_object_raise(it->deco_all_view);
2760 else evas_object_raise(VIEW(it));
2761 if ((it->item->group_item) && (it->item->group_item->realized))
2762 evas_object_raise(it->item->VIEW(group_item));
2764 it->highlighted = EINA_TRUE;
2766 if (it->deco_all_view)
2767 edje_object_signal_emit(it->deco_all_view, "elm,state,selected", "elm");
2768 edje_object_signal_emit(VIEW(it), "elm,state,selected", "elm");
2769 evas_object_smart_callback_call(WIDGET(it), SIG_HIGHLIGHTED, it);
2773 _item_unhighlight(Elm_Gen_Item *it)
2775 if (!it->highlighted) return;
2777 if (!it->item->nostacking)
2779 if ((it->item->order_num_in & 0x1) ^ it->item->stacking_even)
2781 if (it->deco_all_view) evas_object_lower(it->deco_all_view);
2782 else evas_object_lower(VIEW(it));
2786 if (it->deco_all_view) evas_object_raise(it->deco_all_view);
2787 else evas_object_raise(VIEW(it));
2790 it->highlighted = EINA_FALSE;
2792 if (it->deco_all_view)
2793 edje_object_signal_emit(it->deco_all_view, "elm,state,unselected", "elm");
2794 edje_object_signal_emit(VIEW(it), "elm,state,unselected", "elm");
2795 evas_object_smart_callback_call(WIDGET(it), SIG_UNHIGHLIGHTED, it);
2799 _item_unselect(Elm_Gen_Item *it)
2801 Elm_Genlist_Smart_Data *sd = GL_IT(it)->wsd;
2802 _item_unhighlight(it);
2803 if (!it->selected) return;
2805 it->selected = EINA_FALSE;
2806 sd->selected = eina_list_remove(sd->selected, it);
2807 evas_object_smart_callback_call(WIDGET(it), SIG_UNSELECTED, it);
2811 _item_select(Elm_Gen_Item *it)
2813 Evas_Object *obj = WIDGET(it);
2814 Elm_Genlist_Smart_Data *sd = GL_IT(it)->wsd;
2815 if (elm_widget_item_disabled_get(it)) return;
2816 if ((sd->select_mode == ELM_OBJECT_SELECT_MODE_NONE) ||
2817 (sd->select_mode == ELM_OBJECT_SELECT_MODE_DISPLAY_ONLY) ||
2818 (it->select_mode == ELM_OBJECT_SELECT_MODE_NONE) ||
2819 (it->select_mode == ELM_OBJECT_SELECT_MODE_DISPLAY_ONLY))
2822 #if GENLIST_PINCH_ZOOM_SUPPORT
2823 if (IS_ROOT_PARENT_IT(it) && (sd->pinch_zoom_mode == ELM_GEN_PINCH_ZOOM_CONTRACT))
2825 elm_genlist_pinch_zoom_mode_set(obj, ELM_GEN_PINCH_ZOOM_EXPAND);
2826 elm_genlist_item_show((Elm_Object_Item *)it, ELM_GENLIST_ITEM_SCROLLTO_TOP);
2832 // FIXME: difference from upstream
2833 if ((GL_IT(it)->wsd->last_selected_item) &&
2834 (it != (Elm_Gen_Item *) GL_IT(it)->wsd->last_selected_item))
2835 _item_unfocusable_set
2836 ((Elm_Gen_Item *)GL_IT(it)->wsd->last_selected_item, EINA_TRUE);
2839 // Do not check selected because always select mode can be used
2840 _item_highlight(it);
2841 it->selected = EINA_TRUE;
2842 sd->selected = eina_list_append(sd->selected, it);
2843 sd->last_selected_item = (Elm_Object_Item *)it;
2845 if (it->func.func) it->func.func((void *)it->func.data, obj, it);
2846 if (!EINA_MAGIC_CHECK((Elm_Widget_Item *)it, ELM_WIDGET_ITEM_MAGIC))
2848 evas_object_smart_callback_call(WIDGET(it), SIG_SELECTED, it);
2852 _item_select_unselect(Elm_Gen_Item *it, Eina_Bool selected)
2854 Elm_Genlist_Smart_Data *sd = GL_IT(it)->wsd;
2855 Evas_Object *obj = ELM_WIDGET_DATA(sd)->obj;
2856 if (elm_widget_item_disabled_get(it)) return;
2858 evas_object_ref(obj);
2861 const Eina_List *l, *ll;
2863 EINA_LIST_FOREACH_SAFE(sd->selected, l, ll, it2)
2864 if (it2 != it) _item_unselect(it2);
2866 if (selected) _item_select(it);
2867 else _item_unselect(it);
2868 evas_object_unref(obj);
2872 _item_block_position_update(Eina_Inlist *list,
2877 EINA_INLIST_FOREACH(list, tmp)
2879 tmp->position = idx++;
2880 tmp->position_update = EINA_TRUE;
2885 _item_position_update(Eina_List *list,
2891 EINA_LIST_FOREACH(list, l, it)
2893 it->position = idx++;
2894 it->position_update = EINA_TRUE;
2899 _item_block_merge(Item_Block *left,
2905 EINA_LIST_FOREACH(right->items, l, it2)
2907 it2->item->block = left;
2909 left->changed = EINA_TRUE;
2911 left->items = eina_list_merge(left->items, right->items);
2915 _item_block_del(Elm_Gen_Item *it)
2918 Item_Block *itb = it->item->block;
2919 Eina_Bool block_changed = EINA_FALSE;
2921 itb->items = eina_list_remove(itb->items, it);
2923 itb->changed = EINA_TRUE;
2924 if (GL_IT(it)->wsd->calc_job) ecore_job_del(GL_IT(it)->wsd->calc_job);
2925 GL_IT(it)->wsd->calc_job = ecore_job_add(_calc_job, GL_IT(it)->wsd);
2930 il = EINA_INLIST_GET(itb);
2931 itbn = (Item_Block *)(il->next);
2933 it->parent->item->items =
2934 eina_list_remove(it->parent->item->items, it);
2937 _item_block_position_update(il->next, itb->position);
2939 GL_IT(it)->wsd->blocks =
2940 eina_inlist_remove(GL_IT(it)->wsd->blocks, il);
2943 if (itbn) itbn->changed = EINA_TRUE;
2947 if (itb->count < (itb->sd->max_items_per_block / 2))
2952 il = EINA_INLIST_GET(itb);
2953 itbp = (Item_Block *)(il->prev);
2954 itbn = (Item_Block *)(il->next);
2956 /* merge block with previous */
2958 ((itbp->count + itb->count) <
2959 (itb->sd->max_items_per_block +
2960 (itb->sd->max_items_per_block / 2))))
2962 _item_block_merge(itbp, itb);
2963 _item_block_position_update
2964 (EINA_INLIST_GET(itb)->next, itb->position);
2965 GL_IT(it)->wsd->blocks = eina_inlist_remove
2966 (GL_IT(it)->wsd->blocks, EINA_INLIST_GET(itb));
2968 block_changed = EINA_TRUE;
2970 /* merge block with next */
2972 ((itbn->count + itb->count) <
2973 (itb->sd->max_items_per_block +
2974 (itb->sd->max_items_per_block / 2))))
2976 _item_block_merge(itb, itbn);
2977 _item_block_position_update
2978 (EINA_INLIST_GET(itbn)->next, itbn->position);
2979 GL_IT(it)->wsd->blocks =
2980 eina_inlist_remove(GL_IT(it)->wsd->blocks,
2981 EINA_INLIST_GET(itbn));
2983 block_changed = EINA_TRUE;
2990 GL_IT(it)->wsd->pan_changed = EINA_TRUE;
2991 evas_object_smart_changed(GL_IT(it)->wsd->pan_obj);
2992 if (GL_IT(it)->wsd->calc_job) ecore_job_del(GL_IT(it)->wsd->calc_job);
2993 GL_IT(it)->wsd->calc_job = NULL;
2995 #if GENLIST_FX_SUPPORT
2996 it->item->block = NULL;
3001 _decorate_all_item_unrealize(Elm_Gen_Item *it)
3005 if ((!it) || (!it->item->decorate_all_item_realized)) return;
3007 #if GENLIST_FX_SUPPORT
3008 if ((GL_IT(it)->has_proxy_it) && (!GL_IT(it)->wsd->genlist_clearing))
3010 if (!eina_list_data_find(GL_IT(it)->wsd->pending_unrealized_decorate_all_items, it))
3011 GL_IT(it)->wsd->pending_unrealized_decorate_all_items =
3012 eina_list_append(GL_IT(it)->wsd->pending_unrealized_decorate_all_items, it);
3017 edje_object_part_unswallow(it->deco_all_view, VIEW(it));
3018 evas_object_smart_member_add(VIEW(it), GL_IT(it)->wsd->pan_obj);
3019 elm_widget_sub_object_add(WIDGET(it), VIEW(it));
3020 _elm_genlist_item_odd_even_update(it);
3021 _elm_genlist_item_state_update(it, NULL);
3023 edje_object_signal_emit
3024 (it->deco_all_view, "elm,state,decorate,disabled", "elm");
3025 edje_object_signal_emit
3026 (VIEW(it), "elm,state,decorate,disabled", "elm");
3027 edje_object_signal_emit
3028 (it->deco_all_view, "elm,state,reorder,mode_unset", "elm");
3029 edje_object_message_signal_process(VIEW(it));
3030 edje_object_message_signal_process(it->deco_all_view);
3032 evas_object_del(it->deco_all_view);
3033 it->deco_all_view = NULL;
3034 elm_widget_stringlist_free(it->item->deco_all_texts);
3035 it->item->deco_all_texts = NULL;
3036 elm_widget_stringlist_free(it->item->deco_all_contents);
3037 it->item->deco_all_contents = NULL;
3038 elm_widget_stringlist_free(it->item->deco_all_states);
3039 it->item->deco_all_states = NULL;
3040 EINA_LIST_FREE (it->item->deco_all_content_objs, icon)
3041 evas_object_del(icon);
3043 _item_mouse_callbacks_del(it, it->deco_all_view);
3044 _item_mouse_callbacks_add(it, VIEW(it));
3046 it->item->decorate_all_item_realized = EINA_FALSE;
3050 _item_free_common(Elm_Gen_Item *it)
3052 Elm_Genlist_Smart_Data *sd = GL_IT(it)->wsd;
3053 elm_widget_item_pre_notify_del(it);
3054 if (it->itc->func.del)
3055 it->itc->func.del((void *)it->base.data, WIDGET(it));
3056 if (it->tooltip.del_cb)
3057 it->tooltip.del_cb((void *)it->tooltip.data, WIDGET(it), it);
3058 if (it->item->block) _item_block_del(it);
3060 it->parent->item->items =
3061 eina_list_remove(it->parent->item->items, it);
3062 if (it->item->queued) sd->queue = eina_list_remove(sd->queue, it);
3063 if (it->group) sd->group_items = eina_list_remove(sd->group_items, it);
3065 // FIXME: relative will be better to be fixed. it is too harsh.
3067 it->item->rel->item->rel_revs =
3068 eina_list_remove(it->item->rel->item->rel_revs, it);
3069 if (it->item->rel_revs)
3072 EINA_LIST_FREE(it->item->rel_revs, tmp) tmp->item->rel = NULL;
3074 _item_sub_items_clear(it);
3076 #if GENLIST_ENTRY_SUPPORT
3077 it->item->unrealize_disabled = EINA_FALSE;
3080 if (it->selected) sd->selected = eina_list_remove(sd->selected, it);
3081 if (sd->show_item == it) sd->show_item = NULL;
3082 if (sd->anchor_item == it)
3085 ELM_GEN_ITEM_FROM_INLIST(EINA_INLIST_GET(it)->next);
3086 if (!sd->anchor_item) sd->anchor_item =
3087 ELM_GEN_ITEM_FROM_INLIST(EINA_INLIST_GET(it)->prev);
3089 if (sd->expanded_item == it) sd->expanded_item = NULL;
3090 if (sd->expanded_next_item == it) sd->expanded_next_item = NULL;
3091 if (sd->state) eina_inlist_sorted_state_free(sd->state);
3093 if (sd->last_selected_item == (Elm_Object_Item *)it)
3094 sd->last_selected_item = NULL;
3098 ecore_timer_del(it->long_timer);
3099 it->long_timer = NULL;
3101 if (it->item->swipe_timer) ecore_timer_del(it->item->swipe_timer);
3103 sd->items = eina_inlist_remove(sd->items, EINA_INLIST_GET(it));
3108 _item_mouse_move_cb(void *data,
3109 Evas *evas __UNUSED__,
3113 EINA_SAFETY_ON_NULL_RETURN(data);
3114 Elm_Gen_Item *it = data;
3115 Elm_Genlist_Smart_Data *sd;
3116 Evas_Event_Mouse_Move *ev = event_info;
3117 Evas_Coord ox, oy, ow, oh, it_scrl_y, y_pos;
3118 Evas_Coord minw = 0, minh = 0, x, y, dx, dy, adx, ady;
3120 sd = GL_IT(it)->wsd;
3122 if (ev->event_flags & EVAS_EVENT_FLAG_ON_HOLD)
3124 if (!sd->on_hold) _item_unselect(it);
3125 sd->on_hold = EINA_TRUE;
3127 if (sd->multi_touched)
3129 sd->cur_x = ev->cur.canvas.x;
3130 sd->cur_y = ev->cur.canvas.y;
3133 if ((it->dragging) && (it->down))
3135 if (sd->movements == SWIPE_MOVES)
3136 sd->swipe = EINA_TRUE;
3139 sd->history[sd->movements].x = ev->cur.canvas.x;
3140 sd->history[sd->movements].y = ev->cur.canvas.y;
3141 if (abs((sd->history[sd->movements].x -
3142 sd->history[0].x)) > 40)
3143 sd->swipe = EINA_TRUE;
3149 ecore_timer_del(it->long_timer);
3150 it->long_timer = NULL;
3152 evas_object_smart_callback_call(WIDGET(it), SIG_DRAG, it);
3155 if ((!it->down) || (sd->longpressed))
3159 ecore_timer_del(it->long_timer);
3160 it->long_timer = NULL;
3162 if ((sd->reorder_mode) && (sd->reorder_it))
3164 evas_object_geometry_get(sd->pan_obj, &ox, &oy, &ow, &oh);
3166 if (ev->cur.canvas.y < (oy + (sd->reorder_it->item->h / 2)))
3167 sd->reorder_fast = 1;
3168 else if (ev->cur.canvas.y > (oy + oh - (sd->reorder_it->item->h / 2)))
3169 sd->reorder_fast = -1;
3170 else sd->reorder_fast = 0;
3172 it_scrl_y = ev->cur.canvas.y - sd->reorder_it->dy;
3174 if (!sd->reorder_start_y)
3175 sd->reorder_start_y = it->item->block->y + it->y;
3179 else if (it_scrl_y + sd->reorder_it->item->h > oy + oh)
3180 y_pos = oy + oh - sd->reorder_it->item->h;
3184 if (it->deco_all_view)
3185 _item_position(it, it->deco_all_view, it->item->scrl_x, y_pos);
3186 else if (it->item->deco_it_view)
3188 (it, it->item->deco_it_view, it->item->scrl_x, y_pos);
3190 _item_position(it, VIEW(it), it->item->scrl_x, y_pos);
3192 if (sd->calc_job) ecore_job_del(sd->calc_job);
3193 sd->calc_job = ecore_job_add(_calc_job, sd);
3197 if (it->select_mode != ELM_OBJECT_SELECT_MODE_DISPLAY_ONLY)
3198 elm_coords_finger_size_adjust(1, &minw, 1, &minh);
3200 evas_object_geometry_get(obj, &x, &y, NULL, NULL);
3201 x = ev->cur.canvas.x - x;
3202 y = ev->cur.canvas.y - y;
3205 if (adx < 0) adx = -dx;
3209 if (ady < 0) ady = -dy;
3213 if ((adx > minw) || (ady > minh))
3215 it->dragging = EINA_TRUE;
3218 ecore_timer_del(it->long_timer);
3219 it->long_timer = NULL;
3224 evas_object_smart_callback_call
3225 (WIDGET(it), SIG_DRAG_START_UP, it);
3229 evas_object_smart_callback_call
3230 (WIDGET(it), SIG_DRAG_START_LEFT, it);
3232 evas_object_smart_callback_call
3233 (WIDGET(it), SIG_DRAG_START_RIGHT, it);
3239 evas_object_smart_callback_call
3240 (WIDGET(it), SIG_DRAG_START_DOWN, it);
3244 evas_object_smart_callback_call
3245 (WIDGET(it), SIG_DRAG_START_LEFT, it);
3247 evas_object_smart_callback_call
3248 (WIDGET(it), SIG_DRAG_START_RIGHT, it);
3255 _long_press_cb(void *data)
3257 Elm_Gen_Item *it = data, *it2;
3258 Elm_Genlist_Smart_Data *sd;
3261 sd = GL_IT(it)->wsd;
3263 it->long_timer = NULL;
3264 if (elm_widget_item_disabled_get(it) || (it->dragging) ||
3265 (it->select_mode == ELM_OBJECT_SELECT_MODE_DISPLAY_ONLY))
3266 return ECORE_CALLBACK_CANCEL;
3268 GL_IT(it)->wsd->longpressed = EINA_TRUE;
3269 evas_object_smart_callback_call(WIDGET(it), SIG_LONGPRESSED, it);
3270 if ((GL_IT(it)->wsd->reorder_mode) && (!it->group))
3272 GL_IT(it)->wsd->reorder_it = it;
3273 GL_IT(it)->wsd->reorder_start_y = 0;
3274 if (it->deco_all_view)
3275 evas_object_raise(it->deco_all_view);
3277 evas_object_raise(VIEW(it));
3279 sd->s_iface->hold_set(ELM_WIDGET_DATA(sd)->obj, EINA_TRUE);
3280 sd->s_iface->bounce_allow_set
3281 (ELM_WIDGET_DATA(sd)->obj, EINA_FALSE, EINA_FALSE);
3283 EINA_LIST_FOREACH_SAFE(sd->selected, l, ll, it2)
3285 if (it != it2) _item_unselect(it2);
3288 // FIXME: difference from opensource
3289 if (it->item->items)
3291 EINA_LIST_FOREACH(it->item->items, l, it_tmp)
3293 if (elm_genlist_item_expanded_get((Elm_Object_Item *) it_tmp))
3295 elm_genlist_item_expanded_set((Elm_Object_Item *)it_tmp,
3297 return ECORE_CALLBACK_RENEW;
3302 if (elm_genlist_item_expanded_get((Elm_Object_Item *)it))
3304 elm_genlist_item_expanded_set((Elm_Object_Item *)it, EINA_FALSE);
3305 return ECORE_CALLBACK_RENEW;
3308 if (!GL_IT(it)->wsd->decorate_all_mode)
3309 edje_object_signal_emit
3310 (VIEW(it), "elm,state,reorder,enabled", "elm");
3313 return ECORE_CALLBACK_CANCEL;
3317 _swipe_do(Elm_Gen_Item *it)
3322 if ((it->select_mode == ELM_OBJECT_SELECT_MODE_DISPLAY_ONLY) ||
3323 elm_widget_item_disabled_get(it)) return;
3325 GL_IT(it)->wsd->swipe = EINA_FALSE;
3326 for (i = 0; i < GL_IT(it)->wsd->movements; i++)
3328 sum += GL_IT(it)->wsd->history[i].x;
3329 if (abs(GL_IT(it)->wsd->history[0].y -
3330 GL_IT(it)->wsd->history[i].y) > 10) return;
3333 sum /= GL_IT(it)->wsd->movements;
3334 if (abs(sum - GL_IT(it)->wsd->history[0].x) <= 10) return;
3335 evas_object_smart_callback_call(WIDGET(it), SIG_SWIPE, it);
3339 _swipe_cancel(void *data)
3341 Elm_Gen_Item *it = data;
3343 if (!it) return ECORE_CALLBACK_CANCEL;
3344 GL_IT(it)->wsd->swipe = EINA_FALSE;
3345 GL_IT(it)->wsd->movements = 0;
3347 return ECORE_CALLBACK_RENEW;
3351 _multi_cancel(void *data)
3353 Elm_Genlist_Smart_Data *sd = data;
3355 if (!sd) return ECORE_CALLBACK_CANCEL;
3356 sd->multi_timeout = EINA_TRUE;
3358 return ECORE_CALLBACK_RENEW;
3362 _multi_touch_gesture_eval(void *data)
3364 Elm_Gen_Item *it = data;
3365 Evas_Coord minw = 0, minh = 0;
3366 Evas_Coord off_x, off_y, off_mx, off_my;
3368 GL_IT(it)->wsd->multi_touched = EINA_FALSE;
3369 if (GL_IT(it)->wsd->multi_timer)
3371 ecore_timer_del(GL_IT(it)->wsd->multi_timer);
3372 GL_IT(it)->wsd->multi_timer = NULL;
3374 if (GL_IT(it)->wsd->multi_timeout)
3376 GL_IT(it)->wsd->multi_timeout = EINA_FALSE;
3380 elm_coords_finger_size_adjust(1, &minw, 1, &minh);
3381 off_x = abs(GL_IT(it)->wsd->cur_x - GL_IT(it)->wsd->prev_x);
3382 off_y = abs(GL_IT(it)->wsd->cur_y - GL_IT(it)->wsd->prev_y);
3383 off_mx = abs(GL_IT(it)->wsd->cur_mx - GL_IT(it)->wsd->prev_mx);
3384 off_my = abs(GL_IT(it)->wsd->cur_my - GL_IT(it)->wsd->prev_my);
3386 if (((off_x > minw) || (off_y > minh)) && ((off_mx > minw)
3387 || (off_my > minh)))
3389 if ((off_x + off_mx) > (off_y + off_my))
3391 if ((GL_IT(it)->wsd->cur_x > GL_IT(it)->wsd->prev_x)
3392 && (GL_IT(it)->wsd->cur_mx > GL_IT(it)->wsd->prev_mx))
3393 evas_object_smart_callback_call
3394 (WIDGET(it), SIG_MULTI_SWIPE_RIGHT, it);
3395 else if ((GL_IT(it)->wsd->cur_x < GL_IT(it)->wsd->prev_x)
3396 && (GL_IT(it)->wsd->cur_mx < GL_IT(it)->wsd->prev_mx))
3397 evas_object_smart_callback_call
3398 (WIDGET(it), SIG_MULTI_SWIPE_LEFT, it);
3399 else if (abs(GL_IT(it)->wsd->cur_x - GL_IT(it)->wsd->cur_mx) >
3400 abs(GL_IT(it)->wsd->prev_x - GL_IT(it)->wsd->prev_mx))
3401 evas_object_smart_callback_call
3402 (WIDGET(it), SIG_MULTI_PINCH_OUT, it);
3404 evas_object_smart_callback_call
3405 (WIDGET(it), SIG_MULTI_PINCH_IN, it);
3409 if ((GL_IT(it)->wsd->cur_y > GL_IT(it)->wsd->prev_y)
3410 && (GL_IT(it)->wsd->cur_my > GL_IT(it)->wsd->prev_my))
3411 evas_object_smart_callback_call
3412 (WIDGET(it), SIG_MULTI_SWIPE_DOWN, it);
3413 else if ((GL_IT(it)->wsd->cur_y < GL_IT(it)->wsd->prev_y)
3414 && (GL_IT(it)->wsd->cur_my < GL_IT(it)->wsd->prev_my))
3415 evas_object_smart_callback_call
3416 (WIDGET(it), SIG_MULTI_SWIPE_UP, it);
3417 else if (abs(GL_IT(it)->wsd->cur_y - GL_IT(it)->wsd->cur_my) >
3418 abs(GL_IT(it)->wsd->prev_y - GL_IT(it)->wsd->prev_my))
3420 evas_object_smart_callback_call
3421 (WIDGET(it), SIG_MULTI_PINCH_OUT, it);
3422 #if GENLIST_PINCH_ZOOM_SUPPORT
3423 if (IS_ROOT_PARENT_IT(it) && (GL_IT(it)->wsd->pinch_zoom_mode == ELM_GEN_PINCH_ZOOM_CONTRACT))
3425 elm_genlist_pinch_zoom_mode_set(ELM_WIDGET_DATA(GL_IT(it)->wsd)->obj, ELM_GEN_PINCH_ZOOM_EXPAND);
3426 elm_genlist_item_show((Elm_Object_Item *)it, ELM_GENLIST_ITEM_SCROLLTO_TOP);
3432 evas_object_smart_callback_call
3433 (WIDGET(it), SIG_MULTI_PINCH_IN, it);
3434 #if GENLIST_PINCH_ZOOM_SUPPORT
3435 elm_genlist_pinch_zoom_mode_set(ELM_WIDGET_DATA(GL_IT(it)->wsd)->obj,
3436 ELM_GEN_PINCH_ZOOM_CONTRACT);
3442 GL_IT(it)->wsd->multi_timeout = EINA_FALSE;
3446 _item_multi_down_cb(void *data,
3447 Evas *evas __UNUSED__,
3448 Evas_Object *obj __UNUSED__,
3451 Elm_Gen_Item *it = data;
3452 Evas_Event_Multi_Down *ev = event_info;
3454 if ((GL_IT(it)->wsd->multi_device != 0) || (GL_IT(it)->wsd->multi_touched)
3455 || (GL_IT(it)->wsd->multi_timeout))
3458 GL_IT(it)->wsd->multi_device = ev->device;
3459 GL_IT(it)->wsd->multi_down = EINA_TRUE;
3460 GL_IT(it)->wsd->multi_touched = EINA_TRUE;
3461 GL_IT(it)->wsd->prev_mx = ev->canvas.x;
3462 GL_IT(it)->wsd->prev_my = ev->canvas.y;
3464 if (!GL_IT(it)->wsd->wasselected)
3466 GL_IT(it)->wsd->wasselected = EINA_FALSE;
3470 ecore_timer_del(it->long_timer);
3471 it->long_timer = NULL;
3475 it->dragging = EINA_FALSE;
3476 evas_object_smart_callback_call(WIDGET(it), SIG_DRAG_STOP, it);
3478 if (it->item->swipe_timer)
3480 ecore_timer_del(it->item->swipe_timer);
3481 it->item->swipe_timer = NULL;
3483 GL_IT(it)->wsd->longpressed = EINA_FALSE;
3484 if (GL_IT(it)->wsd->on_hold)
3486 GL_IT(it)->wsd->swipe = EINA_FALSE;
3487 GL_IT(it)->wsd->movements = 0;
3488 GL_IT(it)->wsd->on_hold = EINA_FALSE;
3493 _item_multi_up_cb(void *data,
3494 Evas *evas __UNUSED__,
3495 Evas_Object *obj __UNUSED__,
3498 Elm_Gen_Item *it = data;
3499 Evas_Event_Multi_Up *ev = event_info;
3501 if (GL_IT(it)->wsd->multi_device != ev->device) return;
3502 GL_IT(it)->wsd->multi_device = 0;
3503 GL_IT(it)->wsd->multi_down = EINA_FALSE;
3504 if (GL_IT(it)->wsd->mouse_down) return;
3505 _multi_touch_gesture_eval(data);
3509 _item_multi_move_cb(void *data,
3510 Evas *evas __UNUSED__,
3511 Evas_Object *obj __UNUSED__,
3514 Elm_Gen_Item *it = data;
3515 Evas_Event_Multi_Move *ev = event_info;
3517 if (GL_IT(it)->wsd->multi_device != ev->device) return;
3518 GL_IT(it)->wsd->cur_mx = ev->cur.canvas.x;
3519 GL_IT(it)->wsd->cur_my = ev->cur.canvas.y;
3523 // FIXME: difference from upstream
3525 _item_unfocusable_set(Elm_Gen_Item *it, Eina_Bool unfocus)
3528 Evas_Object *item_obj;
3529 Evas_Object *obj = WIDGET(it);
3533 EINA_LIST_FOREACH(it->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 EINA_LIST_FOREACH(it->item->flip_content_objs, l, item_obj)
3540 if (unfocus) elm_widget_focused_object_clear(item_obj);
3541 elm_widget_tree_unfocusable_set(item_obj, unfocus);
3543 EINA_LIST_FOREACH(it->item->deco_all_content_objs, l, item_obj)
3545 if (unfocus) elm_widget_focused_object_clear(item_obj);
3546 elm_widget_tree_unfocusable_set(item_obj, unfocus);
3548 it->can_focus = !unfocus;
3554 _item_mouse_down_cb(void *data,
3555 Evas *evas __UNUSED__,
3559 Evas_Event_Mouse_Down *ev = event_info;
3560 Elm_Gen_Item *it = data;
3561 Elm_Genlist_Smart_Data *sd = GL_IT(it)->wsd;
3564 if (ev->button != 1) return;
3566 _item_unfocusable_set(it, EINA_FALSE);
3568 it->down = EINA_TRUE;
3569 it->dragging = EINA_FALSE;
3570 evas_object_geometry_get(obj, &x, &y, NULL, NULL);
3571 it->dx = ev->canvas.x - x;
3572 it->dy = ev->canvas.y - y;
3573 sd->mouse_down = EINA_TRUE;
3574 if (!sd->multi_touched)
3576 sd->prev_x = ev->canvas.x;
3577 sd->prev_y = ev->canvas.y;
3578 sd->multi_timeout = EINA_FALSE;
3579 if (sd->multi_timer) ecore_timer_del(sd->multi_timer);
3580 sd->multi_timer = ecore_timer_add(1, _multi_cancel, sd);
3582 sd->longpressed = EINA_FALSE;
3583 if (ev->event_flags & EVAS_EVENT_FLAG_ON_HOLD)
3585 sd->on_hold = EINA_TRUE;
3588 else sd->on_hold = EINA_FALSE;
3589 _item_highlight(it);
3590 if (ev->flags & EVAS_BUTTON_DOUBLE_CLICK)
3591 if ((!elm_widget_item_disabled_get(it)) &&
3592 (it->select_mode != ELM_OBJECT_SELECT_MODE_DISPLAY_ONLY))
3594 evas_object_smart_callback_call(WIDGET(it), SIG_CLICKED_DOUBLE, it);
3595 evas_object_smart_callback_call(WIDGET(it), SIG_ACTIVATED, it);
3597 if (it->item->swipe_timer) ecore_timer_del(it->item->swipe_timer);
3598 it->item->swipe_timer = ecore_timer_add(0.4, _swipe_cancel, it);
3599 if (it->long_timer) ecore_timer_del(it->long_timer);
3601 it->long_timer = ecore_timer_add
3602 (sd->longpress_timeout, _long_press_cb, it);
3604 it->long_timer = NULL;
3605 sd->swipe = EINA_FALSE;
3610 _item_block_new(Elm_Genlist_Smart_Data *sd,
3615 itb = calloc(1, sizeof(Item_Block));
3616 if (!itb) return NULL;
3620 sd->blocks = eina_inlist_prepend(sd->blocks, EINA_INLIST_GET(itb));
3621 _item_block_position_update(sd->blocks, 0);
3625 sd->blocks = eina_inlist_append(sd->blocks, EINA_INLIST_GET(itb));
3626 itb->position_update = EINA_TRUE;
3627 if (sd->blocks != EINA_INLIST_GET(itb))
3630 ((Item_Block *)(EINA_INLIST_GET(itb)->prev))->position + 1;
3642 _item_block_add(Elm_Genlist_Smart_Data *sd,
3645 Item_Block *itb = NULL;
3652 itb = calloc(1, sizeof(Item_Block));
3653 if (!itb) return EINA_FALSE;
3655 if (!it->item->rel->item->block)
3658 eina_inlist_append(sd->blocks, EINA_INLIST_GET(itb));
3659 itb->items = eina_list_append(itb->items, it);
3660 itb->position_update = EINA_TRUE;
3661 it->position = eina_list_count(itb->items);
3662 it->position_update = EINA_TRUE;
3664 if (sd->blocks != EINA_INLIST_GET(itb))
3668 (EINA_INLIST_GET(itb)->prev))->position + 1;
3679 tmp = eina_list_data_find_list(itb->items, it->item->rel);
3680 if (it->item->before)
3682 sd->blocks = eina_inlist_prepend_relative
3683 (sd->blocks, EINA_INLIST_GET(itb),
3684 EINA_INLIST_GET(it->item->rel->item->block));
3686 eina_list_prepend_relative_list(itb->items, it, tmp);
3688 /* Update index from where we prepended */
3689 _item_position_update
3690 (eina_list_prev(tmp), it->item->rel->position);
3691 _item_block_position_update
3692 (EINA_INLIST_GET(itb),
3693 it->item->rel->item->block->position);
3697 sd->blocks = eina_inlist_append_relative
3698 (sd->blocks, EINA_INLIST_GET(itb),
3699 EINA_INLIST_GET(it->item->rel->item->block));
3701 eina_list_append_relative_list(itb->items, it, tmp);
3703 /* Update block index from where we appended */
3704 _item_position_update
3705 (eina_list_next(tmp), it->item->rel->position + 1);
3706 _item_block_position_update
3707 (EINA_INLIST_GET(itb),
3708 it->item->rel->item->block->position + 1);
3714 if (it->item->before)
3718 itb = (Item_Block *)(sd->blocks);
3719 if (itb->count >= sd->max_items_per_block)
3721 itb = _item_block_new(sd, EINA_TRUE);
3722 if (!itb) return EINA_FALSE;
3727 itb = _item_block_new(sd, EINA_TRUE);
3728 if (!itb) return EINA_FALSE;
3730 itb->items = eina_list_prepend(itb->items, it);
3732 _item_position_update(itb->items, 0);
3738 itb = (Item_Block *)(sd->blocks->last);
3739 if (itb->count >= sd->max_items_per_block)
3741 itb = _item_block_new(sd, EINA_FALSE);
3742 if (!itb) return EINA_FALSE;
3747 itb = _item_block_new(sd, EINA_FALSE);
3748 if (!itb) return EINA_FALSE;
3750 itb->items = eina_list_append(itb->items, it);
3751 it->position = eina_list_count(itb->items);
3759 if (it->item->rel->item->queued)
3761 /* NOTE: for a strange reason eina_list and eina_inlist
3762 don't have the same property on sorted insertion
3763 order, so the queue is not always ordered like the
3764 item list. This lead to issue where we depend on an
3765 item that is not yet created. As a quick work around,
3766 we reschedule the calc of the item and stop reordering
3767 the list to prevent any nasty issue to show up here.
3769 sd->queue = eina_list_append(sd->queue, it);
3770 sd->requeued = EINA_TRUE;
3771 it->item->queued = EINA_TRUE;
3775 itb = it->item->rel->item->block;
3776 if (!itb) goto newblock;
3777 tmp = eina_list_data_find_list(itb->items, it->item->rel);
3778 if (it->item->before)
3780 itb->items = eina_list_prepend_relative_list(itb->items, it, tmp);
3781 _item_position_update
3782 (eina_list_prev(tmp), it->item->rel->position);
3786 itb->items = eina_list_append_relative_list(itb->items, it, tmp);
3787 _item_position_update
3788 (eina_list_next(tmp), it->item->rel->position + 1);
3793 itb->changed = EINA_TRUE;
3794 it->item->block = itb;
3795 if (itb->sd->calc_job) ecore_job_del(itb->sd->calc_job);
3796 itb->sd->calc_job = ecore_job_add(_calc_job, itb->sd);
3798 if (itb->count > itb->sd->max_items_per_block)
3803 Eina_Bool done = EINA_FALSE;
3805 newc = itb->count / 2;
3807 if (EINA_INLIST_GET(itb)->prev)
3809 Item_Block *itbp = (Item_Block *)(EINA_INLIST_GET(itb)->prev);
3811 if (itbp->count + newc < sd->max_items_per_block / 2)
3813 /* moving items to previous block */
3814 while ((itb->count > newc) && (itb->items))
3816 it2 = eina_list_data_get(itb->items);
3817 itb->items = eina_list_remove_list
3818 (itb->items, itb->items);
3821 itbp->items = eina_list_append(itbp->items, it2);
3822 it2->item->block = itbp;
3830 if (!done && EINA_INLIST_GET(itb)->next)
3832 Item_Block *itbn = (Item_Block *)(EINA_INLIST_GET(itb)->next);
3834 if (itbn->count + newc < sd->max_items_per_block / 2)
3836 /* moving items to next block */
3837 while ((itb->count > newc) && (itb->items))
3841 l = eina_list_last(itb->items);
3842 it2 = eina_list_data_get(l);
3843 itb->items = eina_list_remove_list(itb->items, l);
3846 itbn->items = eina_list_prepend(itbn->items, it2);
3847 it2->item->block = itbn;
3857 /* moving items to new block */
3858 itb2 = calloc(1, sizeof(Item_Block));
3859 if (!itb2) return EINA_FALSE;
3862 eina_inlist_append_relative(sd->blocks, EINA_INLIST_GET(itb2),
3863 EINA_INLIST_GET(itb));
3864 itb2->changed = EINA_TRUE;
3865 while ((itb->count > newc) && (itb->items))
3869 l = eina_list_last(itb->items);
3871 itb->items = eina_list_remove_list(itb->items, l);
3874 itb2->items = eina_list_prepend(itb2->items, it2);
3875 it2->item->block = itb2;
3885 _item_process(Elm_Genlist_Smart_Data *sd,
3888 if (!_item_block_add(sd, it)) return 1;
3890 _item_block_realize(it->item->block);
3896 _item_process_post(Elm_Genlist_Smart_Data *sd,
3900 Eina_Bool show_me = EINA_FALSE;
3902 if (it->item->block->changed)
3904 show_me = _item_block_recalc
3905 (it->item->block, it->item->block->num, qadd);
3906 it->item->block->changed = 0;
3907 if (sd->pan_changed)
3909 if (sd->calc_job) ecore_job_del(sd->calc_job);
3910 sd->calc_job = NULL;
3912 sd->pan_changed = EINA_FALSE;
3915 if (show_me) it->item->block->show_me = EINA_TRUE;
3917 /* when prepending, move the scroller along with the first selected
3918 * item to create the illusion that we're watching the selected
3919 * item this prevents the selected item being scrolled off the
3922 if (sd->selected && it->item->before)
3927 it2 = sd->selected->data;
3928 if (!it2->item->block) return;
3929 sd->s_iface->content_pos_get(ELM_WIDGET_DATA(sd)->obj, NULL, &y);
3930 evas_object_geometry_get(sd->pan_obj, NULL, NULL, NULL, &h);
3931 if ((it->y + it->item->block->y > y + h) ||
3932 (it->y + it->item->block->y + it->item->h < y))
3933 /* offscreen, just update */
3934 sd->s_iface->content_region_show
3935 (ELM_WIDGET_DATA(sd)->obj, it2->x + it2->item->block->x, y,
3936 it2->item->block->w, h);
3938 sd->s_iface->content_region_show
3939 (ELM_WIDGET_DATA(sd)->obj, it->x + it->item->block->x,
3940 y + it->item->h, it->item->block->w, h);
3945 _queue_process(Elm_Genlist_Smart_Data *sd)
3950 t0 = ecore_loop_time_get();
3951 for (n = 0; (sd->queue) && (n < 128); n++)
3955 it = eina_list_data_get(sd->queue);
3956 sd->queue = eina_list_remove_list(sd->queue, sd->queue);
3957 it->item->queued = EINA_FALSE;
3958 if (_item_process(sd, it)) continue;
3959 t = ecore_time_get();
3960 _item_process_post(sd, it, EINA_TRUE);
3961 /* same as eina_inlist_count > 1 */
3962 if (sd->blocks && sd->blocks->next)
3964 if ((t - t0) > (ecore_animator_frametime_get())) break;
3971 _idle_process(void *data,
3974 Elm_Genlist_Smart_Data *sd = data;
3976 if (_queue_process(sd) > 0) *wakeup = EINA_TRUE;
3979 return ECORE_CALLBACK_CANCEL;
3981 #if GENLIST_FX_SUPPORT
3982 if (sd->fx_first_captured)
3983 _elm_genlist_fx_clear(ELM_WIDGET_DATA(sd)->obj);
3985 return ECORE_CALLBACK_RENEW;
3989 _item_idle_enterer(void *data)
3991 Eina_Bool wakeup = EINA_FALSE;
3992 Elm_Genlist_Smart_Data *sd = data;
3993 Eina_Bool ok = _idle_process(data, &wakeup);
3998 if (sd->calc_job) ecore_job_del(sd->calc_job);
3999 sd->calc_job = ecore_job_add(_calc_job, sd);
4001 if (ok == ECORE_CALLBACK_CANCEL) sd->queue_idle_enterer = NULL;
4007 _item_queue(Elm_Genlist_Smart_Data *sd,
4011 if (it->item->queued) return;
4013 it->item->queued = EINA_TRUE;
4014 if (cb && !sd->requeued)
4015 sd->queue = eina_list_sorted_insert(sd->queue, cb, it);
4017 sd->queue = eina_list_append(sd->queue, it);
4019 if (sd->queue_idle_enterer)
4020 ecore_idle_enterer_del(sd->queue_idle_enterer);
4021 sd->queue_idle_enterer = ecore_idle_enterer_add(_item_idle_enterer, sd);
4023 if (sd->prev_viewport_w != 0)
4025 while ((sd->queue) && ((!sd->blocks) || (!sd->blocks->next)))
4028 while ((sd->queue) && (sd->blocks) &&
4029 (sd->homogeneous) && (sd->mode == ELM_LIST_COMPRESS))
4034 /* If the application wants to know the relative item, use
4035 * elm_genlist_item_prev_get(it)*/
4037 _item_move_after(Elm_Gen_Item *it,
4038 Elm_Gen_Item *after)
4042 if (it == after) return;
4044 GL_IT(it)->wsd->items =
4045 eina_inlist_remove(GL_IT(it)->wsd->items, EINA_INLIST_GET(it));
4046 if (it->item->block) _item_block_del(it);
4048 GL_IT(it)->wsd->items = eina_inlist_append_relative
4049 (GL_IT(it)->wsd->items, EINA_INLIST_GET(it), EINA_INLIST_GET(after));
4050 it->item->rel = after;
4051 after->item->rel_revs = eina_list_append(after->item->rel_revs, it);
4052 it->item->before = EINA_FALSE;
4053 if (after->item->group_item) it->item->group_item = after->item->group_item;
4054 _item_queue(GL_IT(it)->wsd, it, NULL);
4056 evas_object_smart_callback_call(WIDGET(it), SIG_MOVED_AFTER, it);
4060 _access_activate_cb(void *data __UNUSED__,
4061 Evas_Object *part_obj __UNUSED__,
4062 Elm_Object_Item *item)
4064 _item_select_unselect((Elm_Gen_Item *)item, EINA_TRUE);
4067 /* If the application wants to know the relative item, use
4068 * elm_genlist_item_next_get(it)*/
4070 _item_move_before(Elm_Gen_Item *it,
4071 Elm_Gen_Item *before)
4074 if (!before) return;
4075 if (it == before) return;
4077 GL_IT(it)->wsd->items =
4078 eina_inlist_remove(GL_IT(it)->wsd->items, EINA_INLIST_GET(it));
4079 if (it->item->block) _item_block_del(it);
4080 GL_IT(it)->wsd->items = eina_inlist_prepend_relative
4081 (GL_IT(it)->wsd->items, EINA_INLIST_GET(it), EINA_INLIST_GET(before));
4082 it->item->rel = before;
4083 before->item->rel_revs = eina_list_append(before->item->rel_revs, it);
4084 it->item->before = EINA_TRUE;
4085 if (before->item->group_item)
4086 it->item->group_item = before->item->group_item;
4087 _item_queue(GL_IT(it)->wsd, it, NULL);
4089 evas_object_smart_callback_call(WIDGET(it), SIG_MOVED_BEFORE, it);
4093 _item_mouse_up_cb(void *data,
4094 Evas *evas __UNUSED__,
4095 Evas_Object *obj __UNUSED__,
4098 Evas_Event_Mouse_Up *ev = event_info;
4099 Eina_Bool dragged = EINA_FALSE;
4100 Elm_Genlist_Smart_Data *sd;
4101 Elm_Gen_Item *it = data;
4103 if (ev->button != 1) return;
4104 it->down = EINA_FALSE;
4105 sd = GL_IT(it)->wsd;
4107 sd->mouse_down = EINA_FALSE;
4108 if (sd->multi_touched)
4110 if ((!sd->multi) && (!it->selected) && (it->highlighted))
4111 _item_unhighlight(it);
4112 if (sd->multi_down) return;
4113 _multi_touch_gesture_eval(data);
4118 ecore_timer_del(it->long_timer);
4119 it->long_timer = NULL;
4123 it->dragging = EINA_FALSE;
4124 evas_object_smart_callback_call(WIDGET(it), SIG_DRAG_STOP, it);
4127 if (it->item->swipe_timer)
4129 ecore_timer_del(it->item->swipe_timer);
4130 it->item->swipe_timer = NULL;
4132 if (sd->multi_timer)
4134 ecore_timer_del(sd->multi_timer);
4135 sd->multi_timer = NULL;
4136 sd->multi_timeout = EINA_FALSE;
4138 sd->on_hold = EINA_FALSE;
4139 if (ev->event_flags & EVAS_EVENT_FLAG_ON_HOLD)
4141 if (sd->swipe) _swipe_do(data);
4142 sd->longpressed = EINA_FALSE;
4145 if ((sd->reorder_mode) && (sd->reorder_it))
4147 Evas_Coord it_scrl_y = ev->canvas.y - sd->reorder_it->dy;
4148 sd->reorder_fast = 0;
4150 if (sd->reorder_rel &&
4151 (sd->reorder_it->parent == sd->reorder_rel->parent))
4153 if (it_scrl_y <= sd->reorder_rel->item->scrl_y)
4154 _item_move_before(sd->reorder_it, sd->reorder_rel);
4156 _item_move_after(sd->reorder_it, sd->reorder_rel);
4157 evas_object_smart_callback_call(WIDGET(it), SIG_MOVED, it);
4161 if (sd->calc_job) ecore_job_del(sd->calc_job);
4162 sd->calc_job = ecore_job_add(_calc_job, sd);
4164 edje_object_signal_emit(VIEW(it), "elm,state,reorder,disabled", "elm");
4165 sd->reorder_it = sd->reorder_rel = NULL;
4166 sd->s_iface->hold_set(ELM_WIDGET_DATA(sd)->obj, EINA_FALSE);
4167 sd->s_iface->bounce_allow_set
4168 (ELM_WIDGET_DATA(sd)->obj, sd->h_bounce, sd->v_bounce);
4172 if (it->want_unrealize && !(it->item->unrealize_disabled))
4174 _item_unrealize(it, EINA_FALSE);
4175 if (it->item->block->want_unrealize)
4176 _item_block_unrealize(it->item->block);
4181 if (!sd->longpressed)
4182 if ((sd->select_mode == ELM_OBJECT_SELECT_MODE_ALWAYS) ||
4183 (it->select_mode == ELM_OBJECT_SELECT_MODE_ALWAYS))
4184 _item_select_unselect(it, EINA_TRUE);
4185 else _item_select_unselect(it, !it->selected);
4187 _item_unhighlight(it);
4191 _item_mouse_callbacks_add(Elm_Gen_Item *it,
4194 evas_object_event_callback_add
4195 (view, EVAS_CALLBACK_MOUSE_DOWN, _item_mouse_down_cb, it);
4196 evas_object_event_callback_add
4197 (view, EVAS_CALLBACK_MOUSE_UP, _item_mouse_up_cb, it);
4198 evas_object_event_callback_add
4199 (view, EVAS_CALLBACK_MOUSE_MOVE, _item_mouse_move_cb, it);
4200 evas_object_event_callback_add
4201 (view, EVAS_CALLBACK_MULTI_DOWN, _item_multi_down_cb, it);
4202 evas_object_event_callback_add
4203 (view, EVAS_CALLBACK_MULTI_UP, _item_multi_up_cb, it);
4204 evas_object_event_callback_add
4205 (view, EVAS_CALLBACK_MULTI_MOVE, _item_multi_move_cb, it);
4209 _item_mouse_callbacks_del(Elm_Gen_Item *it,
4212 evas_object_event_callback_del_full
4213 (view, EVAS_CALLBACK_MOUSE_DOWN, _item_mouse_down_cb, it);
4214 evas_object_event_callback_del_full
4215 (view, EVAS_CALLBACK_MOUSE_UP, _item_mouse_up_cb, it);
4216 evas_object_event_callback_del_full
4217 (view, EVAS_CALLBACK_MOUSE_MOVE, _item_mouse_move_cb, it);
4218 evas_object_event_callback_del_full
4219 (view, EVAS_CALLBACK_MULTI_DOWN, _item_multi_down_cb, it);
4220 evas_object_event_callback_del_full
4221 (view, EVAS_CALLBACK_MULTI_UP, _item_multi_up_cb, it);
4222 evas_object_event_callback_del_full
4223 (view, EVAS_CALLBACK_MULTI_MOVE, _item_multi_move_cb, it);
4227 _scroll_hold_timer_cb(void *data)
4229 Elm_Genlist_Smart_Data *sd = data;
4231 if (!data) return ECORE_CALLBACK_CANCEL;
4233 sd->s_iface->hold_set(ELM_WIDGET_DATA(sd)->obj, EINA_FALSE);
4234 sd->scr_hold_timer = NULL;
4236 return ECORE_CALLBACK_CANCEL;
4240 _decorate_item_finished_signal_cb(void *data,
4242 const char *emission __UNUSED__,
4243 const char *source __UNUSED__)
4245 Elm_Gen_Item *it = data;
4248 if (!data || !obj) return;
4249 if ((!it->realized) || (!it->item->deco_it_view)) return;
4251 it->item->nocache_once = EINA_FALSE;
4252 _decorate_item_unrealize(it);
4253 if (it->item->group_item)
4254 evas_object_raise(it->item->VIEW(group_item));
4256 snprintf(buf, sizeof(buf), "elm,state,%s,passive,finished",
4257 GL_IT(it)->wsd->decorate_it_type);
4258 edje_object_signal_callback_del_full
4259 (obj, buf, "elm", _decorate_item_finished_signal_cb, it);
4263 _item_mode_content_unrealize(Elm_Gen_Item *it,
4264 Evas_Object *target,
4267 Eina_List **contents_list)
4269 Eina_List *res = *contents_list;
4271 if (it->itc->func.content_get)
4275 Evas_Object *ic = NULL;
4277 EINA_LIST_FOREACH(*source, l, key)
4279 if (parts && fnmatch(parts, key, FNM_PERIOD))
4282 ic = edje_object_part_swallow_get(target, key);
4285 res = eina_list_remove(res, ic);
4286 edje_object_part_unswallow(target, ic);
4287 evas_object_del(ic);
4296 _item_content_unrealize(Elm_Gen_Item *it,
4297 Evas_Object *target,
4301 Eina_List *res = it->content_objs;
4303 if (it->itc->func.content_get)
4307 Evas_Object *ic = NULL;
4309 EINA_LIST_FOREACH(*source, l, key)
4311 if (parts && fnmatch(parts, key, FNM_PERIOD))
4314 ic = edje_object_part_swallow_get(target, key);
4317 res = eina_list_remove(res, ic);
4318 edje_object_part_unswallow(target, ic);
4319 // FIXME: If parent-child relationship was broken before 'ic'
4320 // is deleted, freeze_pop will not be called. ex) elm_slider
4321 // If layout is used instead of edje, this problme can be
4323 if (0 != elm_widget_scroll_freeze_get(ic))
4324 elm_widget_scroll_freeze_pop(ic);
4325 evas_object_del(ic);
4334 _item_block_recalc(Item_Block *itb,
4338 const Eina_List *l, *ll;
4340 Evas_Coord minw = 0, minh = 0;
4341 Eina_Bool show_me = EINA_FALSE, changed = EINA_FALSE;
4345 EINA_LIST_FOREACH_SAFE(itb->items, l, ll, it)
4347 show_me |= it->item->show_me;
4352 if (!it->item->mincalcd) changed = EINA_TRUE;
4355 _item_realize(it, in, EINA_TRUE);
4356 _item_unrealize(it, EINA_TRUE);
4361 if ((itb->sd->homogeneous) &&
4362 (itb->sd->mode == ELM_LIST_COMPRESS))
4366 it->item->w = it->item->minw =
4367 GL_IT(it)->wsd->group_item_width;
4368 it->item->h = it->item->minh =
4369 GL_IT(it)->wsd->group_item_height;
4373 it->item->w = it->item->minw =
4374 GL_IT(it)->wsd->item_width;
4375 it->item->h = it->item->minh =
4376 GL_IT(it)->wsd->item_height;
4381 _item_realize(it, in, EINA_TRUE);
4382 _item_unrealize(it, EINA_TRUE);
4388 if (!it->item->mincalcd) changed = EINA_TRUE;
4389 _item_realize(it, in, EINA_FALSE);
4391 minh += it->item->minh;
4392 if (minw < it->item->minw) minw = it->item->minw;
4396 #if GENLIST_PINCH_ZOOM_SUPPORT
4397 if (IS_ROOT_PARENT_IT(it))
4398 it->item->pan_scrl_y = itb->y + it->y;
4402 if (changed) itb->sd->pan_changed = changed;
4405 itb->changed = EINA_FALSE;
4406 itb->position_update = EINA_FALSE;
4412 _update_job(void *data)
4414 Eina_Bool position = EINA_FALSE, recalc = EINA_FALSE;
4415 Elm_Genlist_Smart_Data *sd = data;
4420 sd->update_job = NULL;
4423 //evas_event_freeze(evas_object_evas_get(ELM_WIDGET_DATA(sd)->obj));
4424 EINA_INLIST_FOREACH(sd->blocks, itb)
4426 Evas_Coord itminw, itminh;
4433 _item_block_position(itb, num);
4437 recalc = EINA_FALSE;
4438 EINA_LIST_FOREACH(itb->items, l2, it)
4440 if (it->item->updateme)
4442 itminw = it->item->minw;
4443 itminh = it->item->minh;
4445 it->item->updateme = EINA_FALSE;
4448 _item_unrealize(it, EINA_FALSE);
4449 _item_realize(it, num, EINA_FALSE);
4450 position = EINA_TRUE;
4454 _item_realize(it, num, EINA_TRUE);
4455 _item_unrealize(it, EINA_TRUE);
4457 if ((it->item->minw != itminw) || (it->item->minh != itminh))
4462 itb->updateme = EINA_FALSE;
4465 position = EINA_TRUE;
4466 itb->changed = EINA_TRUE;
4467 _item_block_recalc(itb, num0, EINA_FALSE);
4468 _item_block_position(itb, num0);
4473 if (sd->calc_job) ecore_job_del(sd->calc_job);
4474 sd->calc_job = ecore_job_add(_calc_job, sd);
4476 //evas_event_thaw(evas_object_evas_get(ELM_WIDGET_DATA(sd)->obj));
4477 //evas_event_thaw_eval(evas_object_evas_get(ELM_WIDGET_DATA(sd)->obj));
4481 _scroll_animate_start_cb(Evas_Object *obj,
4482 void *data __UNUSED__)
4484 evas_object_smart_callback_call(obj, SIG_SCROLL_ANIM_START, NULL);
4488 _scroll_animate_stop_cb(Evas_Object *obj,
4489 void *data __UNUSED__)
4491 evas_object_smart_callback_call(obj, SIG_SCROLL_ANIM_STOP, NULL);
4495 _scroll_drag_start_cb(Evas_Object *obj,
4496 void *data __UNUSED__)
4498 evas_object_smart_callback_call(obj, SIG_SCROLL_DRAG_START, NULL);
4502 _scroll_drag_stop_cb(Evas_Object *obj,
4503 void *data __UNUSED__)
4505 evas_object_smart_callback_call(obj, SIG_SCROLL_DRAG_STOP, NULL);
4509 _edge_left_cb(Evas_Object *obj,
4510 void *data __UNUSED__)
4512 evas_object_smart_callback_call(obj, SIG_EDGE_LEFT, NULL);
4516 _edge_right_cb(Evas_Object *obj,
4517 void *data __UNUSED__)
4519 evas_object_smart_callback_call(obj, SIG_EDGE_RIGHT, NULL);
4523 _edge_top_cb(Evas_Object *obj,
4524 void *data __UNUSED__)
4526 evas_object_smart_callback_call(obj, SIG_EDGE_TOP, NULL);
4530 _edge_bottom_cb(Evas_Object *obj,
4531 void *data __UNUSED__)
4533 evas_object_smart_callback_call(obj, SIG_EDGE_BOTTOM, NULL);
4537 _vbar_drag_cb(Evas_Object *obj,
4538 void *data __UNUSED__)
4540 evas_object_smart_callback_call(obj, SIG_VBAR_DRAG, NULL);
4544 _vbar_press_cb(Evas_Object *obj,
4545 void *data __UNUSED__)
4547 evas_object_smart_callback_call(obj, SIG_VBAR_PRESS, NULL);
4551 _vbar_unpress_cb(Evas_Object *obj,
4552 void *data __UNUSED__)
4554 evas_object_smart_callback_call(obj, SIG_VBAR_UNPRESS, NULL);
4558 _hbar_drag_cb(Evas_Object *obj,
4559 void *data __UNUSED__)
4561 evas_object_smart_callback_call(obj, SIG_HBAR_DRAG, NULL);
4565 _hbar_press_cb(Evas_Object *obj,
4566 void *data __UNUSED__)
4568 evas_object_smart_callback_call(obj, SIG_HBAR_PRESS, NULL);
4572 _hbar_unpress_cb(Evas_Object *obj,
4573 void *data __UNUSED__)
4575 evas_object_smart_callback_call(obj, SIG_HBAR_UNPRESS, NULL);
4579 _decorate_item_realize(Elm_Gen_Item *it)
4582 if (it->item->deco_it_view) return;
4584 //evas_event_freeze(evas_object_evas_get(obj));
4585 it->item->deco_it_view = edje_object_add(evas_object_evas_get(WIDGET(it)));
4586 edje_object_scale_set
4587 (it->item->deco_it_view, elm_widget_scale_get(WIDGET(it)) *
4588 elm_config_scale_get());
4589 evas_object_smart_member_add
4590 (it->item->deco_it_view, GL_IT(it)->wsd->pan_obj);
4591 elm_widget_sub_object_add(WIDGET(it), it->item->deco_it_view);
4593 strncpy(buf, "item", sizeof(buf));
4594 if (GL_IT(it)->wsd->mode == ELM_LIST_COMPRESS)
4595 strncat(buf, "_compress", sizeof(buf) - strlen(buf));
4597 if (it->item->order_num_in & 0x1)
4598 strncat(buf, "_odd", sizeof(buf) - strlen(buf));
4599 strncat(buf, "/", sizeof(buf) - strlen(buf));
4600 strncat(buf, it->itc->decorate_item_style, sizeof(buf) - strlen(buf));
4602 elm_widget_theme_object_set
4603 (WIDGET(it), it->item->deco_it_view, "genlist", buf,
4604 elm_widget_style_get(WIDGET(it)));
4605 edje_object_mirrored_set
4606 (it->item->deco_it_view, elm_widget_mirrored_get(WIDGET(it)));
4608 /* signal callback add */
4609 evas_object_event_callback_add
4610 (it->item->deco_it_view, EVAS_CALLBACK_MOUSE_DOWN, _item_mouse_down_cb,
4612 evas_object_event_callback_add
4613 (it->item->deco_it_view, EVAS_CALLBACK_MOUSE_UP, _item_mouse_up_cb, it);
4614 evas_object_event_callback_add
4615 (it->item->deco_it_view, EVAS_CALLBACK_MOUSE_MOVE, _item_mouse_move_cb,
4618 if (eina_list_count(it->item->deco_it_content_objs) != 0)
4619 ERR_ABORT("If you see this error, please notify us and we"
4622 /* text_get, content_get, state_get */
4624 (it, it->item->deco_it_view, &it->item->deco_it_texts, NULL);
4625 if (!it->item->deco_it_contents)
4626 it->item->deco_it_contents =
4627 elm_widget_stringlist_get
4628 (edje_object_data_get(it->item->deco_it_view, "contents"));
4629 it->item->deco_it_content_objs =
4630 _item_mode_content_realize
4631 (it, it->item->deco_it_view, &it->item->deco_it_contents, NULL,
4632 &it->item->deco_it_content_objs);
4634 (it, it->item->deco_it_view, &it->item->deco_it_states, NULL);
4635 edje_object_part_swallow
4636 (it->item->deco_it_view,
4637 edje_object_data_get(it->item->deco_it_view, "mode_part"), VIEW(it));
4639 it->want_unrealize = EINA_FALSE;
4640 //evas_event_thaw(evas_object_evas_get(obj));
4641 //evas_event_thaw_eval(evas_object_evas_get(obj));
4645 _decorate_item_set(Elm_Gen_Item *it)
4647 Elm_Genlist_Smart_Data *sd;
4652 sd = GL_IT(it)->wsd;
4655 it->item->nocache_once = EINA_TRUE;
4657 if (sd->scr_hold_timer)
4659 ecore_timer_del(sd->scr_hold_timer);
4660 sd->scr_hold_timer = NULL;
4662 sd->s_iface->hold_set(ELM_WIDGET_DATA(sd)->obj, EINA_TRUE);
4663 sd->scr_hold_timer = ecore_timer_add(0.1, _scroll_hold_timer_cb, sd);
4665 //evas_event_freeze(evas_object_evas_get(ELM_WIDGET_DATA(sd)->obj));
4666 _decorate_item_realize(it);
4667 if (it->item->group_item)
4668 evas_object_raise(it->item->VIEW(group_item));
4670 (it, it->item->deco_it_view, it->item->scrl_x, it->item->scrl_y);
4671 //evas_event_thaw(evas_object_evas_get(ELM_WIDGET_DATA(sd)->obj));
4672 //evas_event_thaw_eval(evas_object_evas_get(ELM_WIDGET_DATA(sd)->obj));
4674 snprintf(buf, sizeof(buf), "elm,state,%s,active", sd->decorate_it_type);
4675 edje_object_signal_emit(it->item->deco_it_view, buf, "elm");
4679 _decorate_item_unset(Elm_Genlist_Smart_Data *sd)
4681 char buf[1024], buf2[1024];
4684 if (!sd->mode_item) return;
4687 it->item->nocache_once = EINA_TRUE;
4689 snprintf(buf, sizeof(buf), "elm,state,%s,passive", sd->decorate_it_type);
4690 snprintf(buf2, sizeof(buf2), "elm,state,%s,passive,finished",
4691 sd->decorate_it_type);
4692 edje_object_signal_emit(it->item->deco_it_view, buf, "elm");
4693 edje_object_signal_callback_add
4694 (it->item->deco_it_view, buf2, "elm", _decorate_item_finished_signal_cb,
4696 sd->mode_item = NULL;
4700 // FIXME: difference from upstream
4702 _mouse_down_scroller(void *data,
4703 Evas *evas __UNUSED__,
4704 Evas_Object *obj __UNUSED__,
4705 void *event_info __UNUSED__)
4707 Widget_Data *wd = elm_widget_data_get(data);
4710 wd->drag_started = EINA_FALSE;
4714 _mouse_up_scroller(void *data,
4715 Evas *evas __UNUSED__,
4716 Evas_Object *obj __UNUSED__,
4717 void *event_info __UNUSED__)
4719 Widget_Data *wd = elm_widget_data_get(data);
4722 wd->drag_started = EINA_FALSE;
4726 _mouse_move_scroller(void *data,
4727 Evas *evas __UNUSED__,
4728 Evas_Object *obj __UNUSED__,
4731 Widget_Data *wd = elm_widget_data_get(data);
4732 Evas_Event_Mouse_Move *ev = event_info;
4733 Evas_Coord minw = 0, minh = 0, dx, dy, adx, ady;
4736 if (wd->drag_started) return;
4738 elm_coords_finger_size_adjust(1, &minw, 1, &minh);
4739 dx = ev->cur.canvas.x - ev->prev.canvas.x;
4740 dy = ev->cur.canvas.y - ev->prev.canvas.y;
4743 if (adx < 0) adx = -dx;
4744 if (ady < 0) ady = -dy;
4745 if (((ady < minh) && (ady > minh / 2)) && (ady > adx))
4749 evas_object_smart_callback_call(data, SIG_DRAG_START_UP, NULL);
4750 wd->drag_started = EINA_TRUE;
4754 evas_object_smart_callback_call(data, SIG_DRAG_START_DOWN, NULL);
4755 wd->drag_started = EINA_TRUE;
4762 _elm_genlist_smart_add(Evas_Object *obj)
4764 Evas_Coord minw, minh;
4765 Elm_Genlist_Pan_Smart_Data *pan_data;
4767 EVAS_SMART_DATA_ALLOC(obj, Elm_Genlist_Smart_Data);
4769 ELM_WIDGET_CLASS(_elm_genlist_parent_sc)->base.add(obj);
4771 priv->hit_rect = evas_object_rectangle_add(evas_object_evas_get(obj));
4772 evas_object_smart_member_add(priv->hit_rect, obj);
4773 elm_widget_sub_object_add(obj, priv->hit_rect);
4775 /* common scroller hit rectangle setup */
4776 evas_object_color_set(priv->hit_rect, 0, 0, 0, 0);
4777 evas_object_show(priv->hit_rect);
4778 evas_object_repeat_events_set(priv->hit_rect, EINA_TRUE);
4780 elm_widget_can_focus_set(obj, EINA_TRUE);
4781 elm_widget_on_show_region_hook_set(obj, _show_region_hook, obj);
4783 elm_layout_theme_set(obj, "genlist", "base", elm_widget_style_get(obj));
4785 /* interface's add() routine issued AFTER the object's smart_add() */
4786 priv->s_iface = evas_object_smart_interface_get
4787 (obj, ELM_SCROLLABLE_IFACE_NAME);
4789 priv->s_iface->objects_set
4790 (obj, ELM_WIDGET_DATA(priv)->resize_obj, priv->hit_rect);
4792 priv->s_iface->bounce_allow_set
4793 (obj, EINA_FALSE, _elm_config->thumbscroll_bounce_enable);
4794 priv->v_bounce = _elm_config->thumbscroll_bounce_enable;
4796 priv->s_iface->animate_start_cb_set(obj, _scroll_animate_start_cb);
4797 priv->s_iface->animate_stop_cb_set(obj, _scroll_animate_stop_cb);
4798 priv->s_iface->drag_start_cb_set(obj, _scroll_drag_start_cb);
4799 priv->s_iface->drag_stop_cb_set(obj, _scroll_drag_stop_cb);
4800 priv->s_iface->edge_left_cb_set(obj, _edge_left_cb);
4801 priv->s_iface->edge_right_cb_set(obj, _edge_right_cb);
4802 priv->s_iface->edge_top_cb_set(obj, _edge_top_cb);
4803 priv->s_iface->edge_bottom_cb_set(obj, _edge_bottom_cb);
4804 priv->s_iface->vbar_drag_cb_set(obj, _vbar_drag_cb);
4805 priv->s_iface->vbar_press_cb_set(obj, _vbar_press_cb);
4806 priv->s_iface->vbar_unpress_cb_set(obj, _vbar_unpress_cb);
4807 priv->s_iface->hbar_drag_cb_set(obj, _hbar_drag_cb);
4808 priv->s_iface->hbar_press_cb_set(obj, _hbar_press_cb);
4809 priv->s_iface->hbar_unpress_cb_set(obj, _hbar_unpress_cb);
4811 priv->mode = ELM_LIST_SCROLL;
4812 priv->max_items_per_block = MAX_ITEMS_PER_BLOCK;
4813 priv->item_cache_max = priv->max_items_per_block * 2;
4814 priv->longpress_timeout = _elm_config->longpress_timeout;
4815 priv->highlight = EINA_TRUE;
4817 #if GENLIST_FX_SUPPORT
4818 priv->fx_mode = EINA_FALSE;
4819 priv->rendered = EINA_FALSE;
4820 priv->fx_first_captured = EINA_FALSE;
4821 priv->fx_playing = EINA_FALSE;
4822 priv->fx_items_deleted = EINA_FALSE;
4823 priv->genlist_clearing = EINA_FALSE;
4826 priv->pan_obj = evas_object_smart_add
4827 (evas_object_evas_get(obj), _elm_genlist_pan_smart_class_new());
4828 pan_data = evas_object_smart_data_get(priv->pan_obj);
4829 pan_data->wsd = priv;
4832 // FIXME: difference from upstream
4833 evas_object_event_callback_add(pan_obj, EVAS_CALLBACK_MOUSE_DOWN,
4834 _mouse_down_scroller, obj);
4835 evas_object_event_callback_add(pan_obj, EVAS_CALLBACK_MOUSE_UP,
4836 _mouse_up_scroller, obj);
4837 evas_object_event_callback_add(pan_obj, EVAS_CALLBACK_MOUSE_MOVE,
4838 _mouse_move_scroller, obj);
4841 priv->s_iface->extern_pan_set(obj, priv->pan_obj);
4843 edje_object_size_min_calc(ELM_WIDGET_DATA(priv)->resize_obj, &minw, &minh);
4844 evas_object_size_hint_min_set(obj, minw, minh);
4846 _item_cache_all_free(priv);
4847 _mirrored_set(obj, elm_widget_mirrored_get(obj));
4849 elm_layout_sizing_eval(obj);
4853 _elm_genlist_smart_del(Evas_Object *obj)
4855 ELM_GENLIST_DATA_GET(obj, sd);
4857 elm_genlist_clear(obj);
4858 if (sd->calc_job) ecore_job_del(sd->calc_job);
4859 if (sd->update_job) ecore_job_del(sd->update_job);
4860 if (sd->queue_idle_enterer) ecore_idle_enterer_del(sd->queue_idle_enterer);
4861 if (sd->must_recalc_idler) ecore_idler_del(sd->must_recalc_idler);
4862 if (sd->multi_timer) ecore_timer_del(sd->multi_timer);
4863 if (sd->decorate_it_type) eina_stringshare_del(sd->decorate_it_type);
4864 if (sd->scr_hold_timer) ecore_timer_del(sd->scr_hold_timer);
4866 evas_object_del(sd->pan_obj);
4867 ELM_WIDGET_CLASS(_elm_genlist_parent_sc)->base.del(obj);
4871 _elm_genlist_smart_move(Evas_Object *obj,
4875 ELM_GENLIST_DATA_GET(obj, sd);
4877 ELM_WIDGET_CLASS(_elm_genlist_parent_sc)->base.move(obj, x, y);
4879 evas_object_move(sd->hit_rect, x, y);
4883 _elm_genlist_smart_resize(Evas_Object *obj,
4887 ELM_GENLIST_DATA_GET(obj, sd);
4889 ELM_WIDGET_CLASS(_elm_genlist_parent_sc)->base.resize(obj, w, h);
4891 evas_object_resize(sd->hit_rect, w, h);
4895 _elm_genlist_smart_member_add(Evas_Object *obj,
4896 Evas_Object *member)
4898 ELM_GENLIST_DATA_GET(obj, sd);
4900 ELM_WIDGET_CLASS(_elm_genlist_parent_sc)->base.member_add(obj, member);
4903 evas_object_raise(sd->hit_rect);
4907 _access_obj_process(Elm_Genlist_Smart_Data *sd, Eina_Bool is_access)
4910 Eina_Bool done = EINA_FALSE;
4912 EINA_INLIST_FOREACH(sd->blocks, itb)
4920 EINA_LIST_FOREACH(itb->items, l, it)
4922 if (!it->realized) continue;
4923 if (is_access) _access_widget_item_register(it);
4925 _elm_access_widget_item_unregister((Elm_Widget_Item *)it);
4928 else if (done) break;
4933 _elm_genlist_smart_access(Evas_Object *obj, Eina_Bool is_access)
4935 ELM_GENLIST_CHECK(obj);
4936 ELM_GENLIST_DATA_GET(obj, sd);
4939 ELM_WIDGET_CLASS(ELM_WIDGET_DATA(sd)->api)->focus_next =
4940 _elm_genlist_smart_focus_next;
4942 ELM_WIDGET_CLASS(ELM_WIDGET_DATA(sd)->api)->focus_next = NULL;
4943 _access_obj_process(sd, is_access);
4947 _elm_genlist_smart_set_user(Elm_Genlist_Smart_Class *sc)
4949 ELM_WIDGET_CLASS(sc)->base.add = _elm_genlist_smart_add;
4950 ELM_WIDGET_CLASS(sc)->base.del = _elm_genlist_smart_del;
4951 ELM_WIDGET_CLASS(sc)->base.move = _elm_genlist_smart_move;
4952 ELM_WIDGET_CLASS(sc)->base.resize = _elm_genlist_smart_resize;
4953 ELM_WIDGET_CLASS(sc)->base.member_add = _elm_genlist_smart_member_add;
4955 ELM_WIDGET_CLASS(sc)->sub_object_add = _elm_genlist_smart_sub_object_add;
4956 ELM_WIDGET_CLASS(sc)->sub_object_del = _elm_genlist_smart_sub_object_del;
4957 ELM_WIDGET_CLASS(sc)->on_focus = _elm_genlist_smart_on_focus;
4958 ELM_WIDGET_CLASS(sc)->theme = _elm_genlist_smart_theme;
4959 ELM_WIDGET_CLASS(sc)->event = _elm_genlist_smart_event;
4960 ELM_WIDGET_CLASS(sc)->translate = _elm_genlist_smart_translate;
4962 /* not a 'focus chain manager' */
4963 ELM_WIDGET_CLASS(sc)->focus_next = NULL;
4964 ELM_WIDGET_CLASS(sc)->focus_direction = NULL;
4966 ELM_LAYOUT_CLASS(sc)->sizing_eval = _elm_genlist_smart_sizing_eval;
4969 if (_elm_config->access_mode == ELM_ACCESS_MODE_ON)
4970 ELM_WIDGET_CLASS(sc)->focus_next = _elm_genlist_smart_focus_next;
4972 ELM_WIDGET_CLASS(sc)->access = _elm_genlist_smart_access;
4975 EAPI const Elm_Genlist_Smart_Class *
4976 elm_genlist_smart_class_get(void)
4978 static Elm_Genlist_Smart_Class _sc =
4979 ELM_GENLIST_SMART_CLASS_INIT_NAME_VERSION(ELM_GENLIST_SMART_NAME);
4980 static const Elm_Genlist_Smart_Class *class = NULL;
4981 Evas_Smart_Class *esc = (Evas_Smart_Class *)&_sc;
4986 _elm_genlist_smart_set(&_sc);
4987 esc->callbacks = _smart_callbacks;
4994 elm_genlist_add(Evas_Object *parent)
4998 EINA_SAFETY_ON_NULL_RETURN_VAL(parent, NULL);
5000 obj = elm_widget_add(_elm_genlist_smart_class_new(), parent);
5001 if (!obj) return NULL;
5003 if (!elm_widget_sub_object_add(parent, obj))
5004 ERR("could not add %p as sub object of %p", obj, parent);
5010 static Evas_Object *
5011 _item_content_get_hook(Elm_Gen_Item *it,
5014 Evas_Object *ret = NULL;
5015 if (it->deco_all_view)
5016 ret = edje_object_part_swallow_get(it->deco_all_view, part);
5017 else if (it->decorate_it_set)
5018 ret = edje_object_part_swallow_get(it->item->deco_it_view, part);
5020 ret = edje_object_part_swallow_get(VIEW(it), part);
5025 _item_text_get_hook(Elm_Gen_Item *it,
5028 if (!it->itc->func.text_get) return NULL;
5029 const char *ret = NULL;
5030 if (it->deco_all_view)
5031 ret = edje_object_part_text_get(it->deco_all_view, part);
5032 else if (it->decorate_it_set)
5033 ret = edje_object_part_text_get(it->item->deco_it_view, part);
5035 ret = edje_object_part_text_get(VIEW(it), part);
5040 _item_disable_hook(Elm_Object_Item *item)
5044 Elm_Gen_Item *it = (Elm_Gen_Item *)item;
5047 elm_genlist_item_selected_set(item, EINA_FALSE);
5051 if (elm_widget_item_disabled_get(it))
5053 edje_object_signal_emit(VIEW(it), "elm,state,disabled", "elm");
5054 if (it->deco_all_view)
5055 edje_object_signal_emit
5056 (it->deco_all_view, "elm,state,disabled", "elm");
5060 edje_object_signal_emit(VIEW(it), "elm,state,enabled", "elm");
5061 if (it->deco_all_view)
5062 edje_object_signal_emit
5063 (it->deco_all_view, "elm,state,enabled", "elm");
5065 EINA_LIST_FOREACH(it->content_objs, l, obj)
5066 elm_widget_disabled_set(obj, elm_widget_item_disabled_get(it));
5071 _item_free(Elm_Gen_Item *it)
5073 Elm_Genlist_Smart_Data *sd = GL_IT(it)->wsd;
5075 #if GENLIST_FX_SUPPORT
5076 if (sd->fx_mode) GL_IT(it)->has_proxy_it = EINA_FALSE;
5077 _elm_genlist_proxy_item_del((Elm_Object_Item *)it);
5078 if ((!sd->fx_mode) || (sd->genlist_clearing))
5081 _item_free_common(it);
5083 _item_unrealize(it, EINA_FALSE);
5084 elm_genlist_item_class_unref((Elm_Genlist_Item_Class *)it->itc);
5087 if (sd->calc_job) ecore_job_del(sd->calc_job);
5088 sd->calc_job = ecore_job_add(_calc_job, sd);
5091 #if GENLIST_FX_SUPPORT
5093 _item_del_pre_fx_process(Elm_Gen_Item *it)
5095 Elm_Genlist_Smart_Data *sd = GL_IT(it)->wsd;
5097 sd->fx_items_deleted = EINA_TRUE;
5098 _elm_genlist_fx_capture(ELM_WIDGET_DATA(sd)->obj, 0);
5099 if (!eina_list_data_find(sd->pending_del_items, it))
5100 sd->pending_del_items = eina_list_append(sd->pending_del_items, it);
5102 _item_free_common(it);
5108 _item_del_pre_hook(Elm_Object_Item *item)
5110 Elm_Gen_Item *it = (Elm_Gen_Item *)item;
5112 #if GENLIST_FX_SUPPORT
5113 if ((GL_IT(it)->wsd->fx_mode) && (!GL_IT(it)->wsd->genlist_clearing))
5115 _item_del_pre_fx_process(it);
5124 _item_signal_emit_hook(Elm_Object_Item *it,
5125 const char *emission,
5128 edje_object_signal_emit(VIEW(it), emission, source);
5131 static Elm_Gen_Item *
5132 _elm_genlist_item_new(Elm_Genlist_Smart_Data *sd,
5133 const Elm_Genlist_Item_Class *itc,
5135 Elm_Gen_Item *parent,
5136 Elm_Genlist_Item_Type type,
5138 const void *func_data)
5140 Elm_Gen_Item *it, *it2;
5143 if (!itc) return NULL;
5145 it = elm_widget_item_new(ELM_WIDGET_DATA(sd)->obj, Elm_Gen_Item);
5146 if (!it) return NULL;
5149 elm_genlist_item_class_ref((Elm_Genlist_Item_Class *)itc);
5151 it->base.data = data;
5152 it->parent = parent;
5153 it->func.func = func;
5154 it->func.data = func_data;
5156 elm_widget_item_content_get_hook_set(it, _item_content_get_hook);
5157 elm_widget_item_text_get_hook_set(it, _item_text_get_hook);
5158 elm_widget_item_disable_hook_set(it, _item_disable_hook);
5159 elm_widget_item_del_pre_hook_set(it, _item_del_pre_hook);
5160 elm_widget_item_signal_emit_hook_set(it, _item_signal_emit_hook);
5162 #if 0 // FIXME: difference from upstream
5163 it->can_focus = EINA_TRUE;
5165 //it->del_cb = (Ecore_Cb)_item_free;
5166 //it->highlight_cb = (Ecore_Cb)_item_highlight;
5167 //it->unhighlight_cb = (Ecore_Cb)_item_unhighlight;
5168 //it->sel_cb = (Ecore_Cb)_item_select;
5169 //it->unsel_cb = (Ecore_Cb)_item_unselect;
5170 //it->unrealize_cb = (Ecore_Cb)_item_unrealize_cb;
5172 GL_IT(it) = ELM_NEW(Elm_Gen_Item_Type);
5173 GL_IT(it)->wsd = sd;
5174 GL_IT(it)->type = type;
5175 if (type & ELM_GENLIST_ITEM_GROUP) it->group++;
5179 if (it->parent->group)
5180 GL_IT(it)->group_item = parent;
5181 else if (GL_IT(it->parent)->group_item)
5182 GL_IT(it)->group_item = GL_IT(it->parent)->group_item;
5184 for (it2 = it, depth = 0; it2->parent; it2 = it2->parent)
5186 if (!it2->parent->group) depth += 1;
5188 GL_IT(it)->expanded_depth = depth;
5191 #if GENLIST_FX_SUPPORT
5192 it->item->num = sd->item_count;
5195 sd->fx_items_deleted = EINA_FALSE;
5196 _elm_genlist_fx_capture(ELM_WIDGET_DATA(sd)->obj, 0);
5203 _elm_genlist_item_compare(const void *data,
5206 const Elm_Gen_Item *it, *item1;
5208 it = ELM_GEN_ITEM_FROM_INLIST(data);
5209 item1 = ELM_GEN_ITEM_FROM_INLIST(data1);
5210 return GL_IT(it)->wsd->item_compare_cb(it, item1);
5214 _elm_genlist_item_list_compare(const void *data,
5217 const Elm_Gen_Item *it = data;
5218 const Elm_Gen_Item *item1 = data1;
5220 return GL_IT(it)->wsd->item_compare_cb(it, item1);
5224 elm_genlist_items_count(const Evas_Object *obj)
5226 ELM_GENLIST_CHECK(obj) 0;
5227 ELM_GENLIST_DATA_GET(obj, sd);
5229 return sd->item_count;
5232 EAPI Elm_Object_Item *
5233 elm_genlist_item_append(Evas_Object *obj,
5234 const Elm_Genlist_Item_Class *itc,
5236 Elm_Object_Item *parent,
5237 Elm_Genlist_Item_Type type,
5239 const void *func_data)
5243 ELM_GENLIST_CHECK(obj) NULL;
5244 ELM_GENLIST_DATA_GET(obj, sd);
5246 ELM_WIDGET_ITEM_RETURN_IF_ONDEL(((Elm_Widget_Item *)parent),NULL);
5248 it = _elm_genlist_item_new
5249 (sd, itc, data, (Elm_Gen_Item *)parent, type, func, func_data);
5250 if (!it) return NULL;
5255 sd->group_items = eina_list_append(sd->group_items, it);
5256 sd->items = eina_inlist_append(sd->items, EINA_INLIST_GET(it));
5257 it->item->rel = NULL;
5261 Elm_Gen_Item *it2 = NULL;
5262 Eina_List *ll = eina_list_last(it->parent->item->items);
5264 if (ll) it2 = ll->data;
5265 it->parent->item->items =
5266 eina_list_append(it->parent->item->items, it);
5267 if (!it2) it2 = it->parent;
5268 sd->items = eina_inlist_append_relative
5269 (sd->items, EINA_INLIST_GET(it), EINA_INLIST_GET(it2));
5270 it->item->rel = it2;
5271 it2->item->rel_revs = eina_list_append(it2->item->rel_revs, it);
5273 it->item->before = EINA_FALSE;
5274 _item_queue(sd, it, NULL);
5276 return (Elm_Object_Item *)it;
5279 EAPI Elm_Object_Item *
5280 elm_genlist_item_prepend(Evas_Object *obj,
5281 const Elm_Genlist_Item_Class *itc,
5283 Elm_Object_Item *parent,
5284 Elm_Genlist_Item_Type type,
5286 const void *func_data)
5290 ELM_GENLIST_CHECK(obj) NULL;
5291 ELM_GENLIST_DATA_GET(obj, sd);
5292 it = _elm_genlist_item_new
5293 (sd, itc, data, (Elm_Gen_Item *)parent, type, func, func_data);
5294 if (!it) return NULL;
5299 sd->group_items = eina_list_prepend(sd->group_items, it);
5300 sd->items = eina_inlist_prepend(sd->items, EINA_INLIST_GET(it));
5301 it->item->rel = NULL;
5305 Elm_Gen_Item *it2 = NULL;
5306 Eina_List *ll = it->parent->item->items;
5308 if (ll) it2 = ll->data;
5309 it->parent->item->items =
5310 eina_list_prepend(it->parent->item->items, it);
5311 if (!it2) it2 = it->parent;
5312 sd->items = eina_inlist_prepend_relative
5313 (sd->items, EINA_INLIST_GET(it), EINA_INLIST_GET(it2));
5314 it->item->rel = it2;
5315 it2->item->rel_revs = eina_list_append(it2->item->rel_revs, it);
5317 it->item->before = EINA_TRUE;
5318 _item_queue(sd, it, NULL);
5320 return (Elm_Object_Item *)it;
5323 EAPI Elm_Object_Item *
5324 elm_genlist_item_insert_after(Evas_Object *obj,
5325 const Elm_Genlist_Item_Class *itc,
5327 Elm_Object_Item *parent,
5328 Elm_Object_Item *after_it,
5329 Elm_Genlist_Item_Type type,
5331 const void *func_data)
5333 Elm_Gen_Item *after = (Elm_Gen_Item *)after_it;
5336 ELM_GENLIST_CHECK(obj) NULL;
5337 ELM_GENLIST_ITEM_CHECK_OR_RETURN(after_it, NULL);
5338 ELM_GENLIST_DATA_GET(obj, sd);
5340 /* It makes no sense to insert after in an empty list with after !=
5341 * NULL, something really bad is happening in your app. */
5342 EINA_SAFETY_ON_NULL_RETURN_VAL(sd->items, NULL);
5344 it = _elm_genlist_item_new
5345 (sd, itc, data, (Elm_Gen_Item *)parent, type, func, func_data);
5346 if (!it) return NULL;
5350 if ((it->group) && (after->group))
5351 sd->group_items = eina_list_append_relative
5352 (sd->group_items, it, after);
5356 it->parent->item->items =
5357 eina_list_append_relative(it->parent->item->items, it, after);
5359 sd->items = eina_inlist_append_relative
5360 (sd->items, EINA_INLIST_GET(it), EINA_INLIST_GET(after));
5362 it->item->rel = after;
5363 after->item->rel_revs = eina_list_append(after->item->rel_revs, it);
5364 it->item->before = EINA_FALSE;
5365 _item_queue(sd, it, NULL);
5367 return (Elm_Object_Item *)it;
5370 EAPI Elm_Object_Item *
5371 elm_genlist_item_insert_before(Evas_Object *obj,
5372 const Elm_Genlist_Item_Class *itc,
5374 Elm_Object_Item *parent,
5375 Elm_Object_Item *before_it,
5376 Elm_Genlist_Item_Type type,
5378 const void *func_data)
5380 Elm_Gen_Item *before = (Elm_Gen_Item *)before_it;
5383 ELM_GENLIST_CHECK(obj) NULL;
5384 ELM_GENLIST_ITEM_CHECK_OR_RETURN(before_it, NULL);
5385 ELM_GENLIST_DATA_GET(obj, sd);
5387 /* It makes no sense to insert before in an empty list with before
5388 * != NULL, something really bad is happening in your app. */
5389 EINA_SAFETY_ON_NULL_RETURN_VAL(sd->items, NULL);
5391 it = _elm_genlist_item_new
5392 (sd, itc, data, (Elm_Gen_Item *)parent, type, func, func_data);
5393 if (!it) return NULL;
5397 if (it->group && before->group)
5399 eina_list_prepend_relative(sd->group_items, it, before);
5403 it->parent->item->items =
5404 eina_list_prepend_relative(it->parent->item->items, it, before);
5406 sd->items = eina_inlist_prepend_relative
5407 (sd->items, EINA_INLIST_GET(it), EINA_INLIST_GET(before));
5409 it->item->rel = before;
5410 before->item->rel_revs = eina_list_append(before->item->rel_revs, it);
5411 it->item->before = EINA_TRUE;
5412 _item_queue(sd, it, NULL);
5414 return (Elm_Object_Item *)it;
5417 EAPI Elm_Object_Item *
5418 elm_genlist_item_sorted_insert(Evas_Object *obj,
5419 const Elm_Genlist_Item_Class *itc,
5421 Elm_Object_Item *parent,
5422 Elm_Genlist_Item_Type type,
5423 Eina_Compare_Cb comp,
5425 const void *func_data)
5427 Elm_Gen_Item *rel = NULL;
5430 ELM_GENLIST_CHECK(obj) NULL;
5431 ELM_GENLIST_DATA_GET(obj, sd);
5433 it = _elm_genlist_item_new
5434 (sd, itc, data, (Elm_Gen_Item *)parent, type, func, func_data);
5435 if (!it) return NULL;
5437 sd->item_compare_cb = comp;
5444 l = eina_list_search_sorted_near_list
5445 (it->parent->item->items, _elm_genlist_item_list_compare, it,
5449 rel = eina_list_data_get(l);
5453 if (cmp_result >= 0)
5455 it->parent->item->items = eina_list_prepend_relative_list
5456 (it->parent->item->items, it, l);
5457 sd->items = eina_inlist_prepend_relative
5458 (sd->items, EINA_INLIST_GET(it), EINA_INLIST_GET(rel));
5459 it->item->before = EINA_FALSE;
5461 else if (cmp_result < 0)
5463 it->parent->item->items = eina_list_append_relative_list
5464 (it->parent->item->items, it, l);
5465 sd->items = eina_inlist_append_relative
5466 (sd->items, EINA_INLIST_GET(it), EINA_INLIST_GET(rel));
5467 it->item->before = EINA_TRUE;
5474 sd->state = eina_inlist_sorted_state_new();
5475 eina_inlist_sorted_state_init(sd->state, sd->items);
5476 sd->requeued = EINA_FALSE;
5480 sd->group_items = eina_list_append(sd->group_items, it);
5482 sd->items = eina_inlist_sorted_state_insert
5483 (sd->items, EINA_INLIST_GET(it), _elm_genlist_item_compare,
5486 if (EINA_INLIST_GET(it)->next)
5488 rel = ELM_GEN_ITEM_FROM_INLIST(EINA_INLIST_GET(it)->next);
5489 it->item->before = EINA_TRUE;
5491 else if (EINA_INLIST_GET(it)->prev)
5493 rel = ELM_GEN_ITEM_FROM_INLIST(EINA_INLIST_GET(it)->prev);
5494 it->item->before = EINA_FALSE;
5500 it->item->rel = rel;
5501 rel->item->rel_revs = eina_list_append(rel->item->rel_revs, it);
5504 _item_queue(sd, it, _elm_genlist_item_list_compare);
5506 return (Elm_Object_Item *)it;
5510 _elm_genlist_fx_clear(Evas_Object *obj)
5512 ELM_GENLIST_DATA_GET(obj, sd);
5514 Elm_Gen_FX_Item *fi;
5518 EINA_LIST_FREE(sd->capture_before_items, pi)
5520 if ((pi->it) && (GL_IT(pi->it))) GL_IT(pi->it)->has_proxy_it = EINA_FALSE;
5521 if (pi->proxy) evas_object_smart_member_del(pi->proxy);
5522 if (pi->proxy) evas_object_del(pi->proxy);
5525 EINA_LIST_FREE(sd->capture_after_items, pi)
5527 if ((pi->it) && (GL_IT(pi->it))) GL_IT(pi->it)->has_proxy_it = EINA_FALSE;
5528 if (pi->proxy) evas_object_smart_member_del(pi->proxy);
5529 if (pi->proxy) evas_object_del(pi->proxy);
5533 EINA_LIST_FREE(sd->fx_items, fi)
5535 if (fi->trans) elm_transit_del(fi->trans);
5539 EINA_LIST_FREE (sd->pending_unrealized_items, it)
5540 _item_unrealize(it, EINA_FALSE);
5542 EINA_LIST_FREE (sd->pending_unrealized_decorate_all_items, it)
5543 _decorate_all_item_unrealize(it);
5545 EINA_LIST_FREE (sd->pending_del_items, it)
5548 _elm_widget_item_free((Elm_Widget_Item *)it);
5550 if (sd->alpha_bg) evas_object_del(sd->alpha_bg);
5551 sd->alpha_bg = NULL;
5552 if (sd->fx_timer) ecore_timer_del(sd->fx_timer);
5553 sd->fx_timer = NULL;
5555 sd->genlist_clearing = EINA_TRUE;
5556 sd->fx_playing = EINA_FALSE;
5557 sd->sorting = EINA_FALSE;
5558 sd->fx_first_captured = EINA_FALSE;
5559 sd->fx_items_deleted = EINA_FALSE;
5563 elm_genlist_clear(Evas_Object *obj)
5565 ELM_GENLIST_CHECK(obj);
5566 ELM_GENLIST_DATA_GET(obj, sd);
5571 eina_inlist_sorted_state_free(sd->state);
5575 #if GENLIST_FX_SUPPORT
5578 _elm_genlist_fx_clear(obj);
5579 sd->genlist_clearing = EINA_TRUE;
5580 sd->rendered = EINA_FALSE;
5583 #if GENLIST_PINCH_ZOOM_SUPPORT
5584 sd->pinch_zoom_h = 0;
5585 sd->realized_top_item = NULL;
5586 sd->pinch_zoom_mode = ELM_GEN_PINCH_ZOOM_NONE;
5589 //evas_event_freeze(evas_object_evas_get(ELM_WIDGET_DATA(sd)->obj));
5591 // Do not use EINA_INLIST_FOREACH or EINA_INLIST_FOREACH_SAFE
5592 // because sd->items can be modified inside elm_widget_item_del()
5595 it = EINA_INLIST_CONTAINER_GET(sd->items->last, Elm_Gen_Item);
5596 it->item->nocache_once = EINA_TRUE;
5597 elm_widget_item_del(it);
5601 _item_cache_all_free(sd);
5603 sd->pan_changed = EINA_TRUE;
5604 if (sd->selected) sd->selected = eina_list_free(sd->selected);
5605 sd->selected = NULL;
5607 sd->anchor_item = NULL;
5608 if (sd->multi_timer)
5610 ecore_timer_del(sd->multi_timer);
5611 sd->multi_timer = NULL;
5615 ecore_job_del(sd->update_job);
5616 sd->update_job = NULL;
5620 ecore_job_del(sd->calc_job);
5621 sd->calc_job = NULL;
5623 if (sd->queue_idle_enterer)
5625 ecore_idle_enterer_del(sd->queue_idle_enterer);
5626 sd->queue_idle_enterer = NULL;
5628 if (sd->must_recalc_idler)
5630 ecore_idler_del(sd->must_recalc_idler);
5631 sd->must_recalc_idler = NULL;
5633 if (sd->queue) sd->queue = eina_list_free(sd->queue);
5634 if (sd->reorder_move_animator)
5636 ecore_animator_del(sd->reorder_move_animator);
5637 sd->reorder_move_animator = NULL;
5639 sd->show_item = NULL;
5640 sd->reorder_old_pan_y = 0;
5647 if (sd->alpha_bg) evas_object_del(sd->alpha_bg);
5648 sd->alpha_bg = NULL;
5652 evas_object_size_hint_min_set(sd->pan_obj, sd->minw, sd->minh);
5653 evas_object_smart_callback_call(sd->pan_obj, "changed", NULL);
5655 elm_layout_sizing_eval(ELM_WIDGET_DATA(sd)->obj);
5656 sd->s_iface->content_region_show(obj, 0, 0, 0, 0);
5658 #if GENLIST_FX_SUPPORT
5659 sd->genlist_clearing = EINA_FALSE;
5661 //evas_event_thaw(evas_object_evas_get(ELM_WIDGET_DATA(sd)->obj));
5662 //evas_event_thaw_eval(evas_object_evas_get(ELM_WIDGET_DATA(sd)->obj));
5666 elm_genlist_multi_select_set(Evas_Object *obj,
5669 ELM_GENLIST_CHECK(obj);
5670 ELM_GENLIST_DATA_GET(obj, sd);
5672 sd->multi = !!multi;
5676 elm_genlist_multi_select_get(const Evas_Object *obj)
5678 ELM_GENLIST_CHECK(obj) EINA_FALSE;
5679 ELM_GENLIST_DATA_GET(obj, sd);
5684 EAPI Elm_Object_Item *
5685 elm_genlist_selected_item_get(const Evas_Object *obj)
5687 ELM_GENLIST_CHECK(obj) NULL;
5688 ELM_GENLIST_DATA_GET(obj, sd);
5691 return sd->selected->data;
5697 elm_genlist_selected_items_get(const Evas_Object *obj)
5699 ELM_GENLIST_CHECK(obj) NULL;
5700 ELM_GENLIST_DATA_GET(obj, sd);
5702 return sd->selected;
5706 elm_genlist_realized_items_get(const Evas_Object *obj)
5709 Eina_List *list = NULL;
5710 Eina_Bool done = EINA_FALSE;
5712 ELM_GENLIST_CHECK(obj) NULL;
5713 ELM_GENLIST_DATA_GET(obj, sd);
5715 EINA_INLIST_FOREACH(sd->blocks, itb)
5723 EINA_LIST_FOREACH(itb->items, l, it)
5725 if (it->realized) list = eina_list_append(list, it);
5736 EAPI Elm_Object_Item *
5737 elm_genlist_at_xy_item_get(const Evas_Object *obj,
5742 Evas_Coord ox, oy, ow, oh;
5746 ELM_GENLIST_CHECK(obj) NULL;
5747 ELM_GENLIST_DATA_GET(obj, sd);
5749 evas_object_geometry_get(sd->pan_obj, &ox, &oy, &ow, &oh);
5751 EINA_INLIST_FOREACH(sd->blocks, itb)
5756 if (!ELM_RECTS_INTERSECT(ox + itb->x - itb->sd->pan_x,
5757 oy + itb->y - itb->sd->pan_y,
5758 itb->w, itb->h, x, y, 1, 1))
5760 EINA_LIST_FOREACH(itb->items, l, it)
5762 Evas_Coord itx, ity;
5764 itx = ox + itb->x + it->x - itb->sd->pan_x;
5765 ity = oy + itb->y + it->y - itb->sd->pan_y;
5766 if (ELM_RECTS_INTERSECT
5767 (itx, ity, it->item->w, it->item->h, x, y, 1, 1))
5771 if (y <= (ity + (it->item->h / 4))) *posret = -1;
5772 else if (y >= (ity + it->item->h - (it->item->h / 4)))
5777 return (Elm_Object_Item *)it;
5779 lasty = ity + it->item->h;
5784 if (y > lasty) *posret = 1;
5791 EAPI Elm_Object_Item *
5792 elm_genlist_first_item_get(const Evas_Object *obj)
5794 Elm_Gen_Item *tit, *it = NULL;
5796 ELM_GENLIST_CHECK(obj) NULL;
5797 ELM_GENLIST_DATA_GET(obj, sd);
5799 EINA_INLIST_REVERSE_FOREACH(sd->items, tit) it = tit;
5801 return (Elm_Object_Item *)it;
5804 EAPI Elm_Object_Item *
5805 elm_genlist_last_item_get(const Evas_Object *obj)
5809 ELM_GENLIST_CHECK(obj) NULL;
5810 ELM_GENLIST_DATA_GET(obj, sd);
5811 if (!sd->items) return NULL;
5813 it = ELM_GEN_ITEM_FROM_INLIST(sd->items->last);
5814 return (Elm_Object_Item *)it;
5817 EAPI Elm_Object_Item *
5818 elm_genlist_item_next_get(const Elm_Object_Item *item)
5822 ELM_GENLIST_ITEM_CHECK_OR_RETURN(item, NULL);
5824 it = (Elm_Gen_Item *)item;
5827 it = ELM_GEN_ITEM_FROM_INLIST(EINA_INLIST_GET(it)->next);
5831 return (Elm_Object_Item *)it;
5834 EAPI Elm_Object_Item *
5835 elm_genlist_item_prev_get(const Elm_Object_Item *item)
5839 ELM_GENLIST_ITEM_CHECK_OR_RETURN(item, NULL);
5841 it = (Elm_Gen_Item *)item;
5844 it = ELM_GEN_ITEM_FROM_INLIST(EINA_INLIST_GET(it)->prev);
5848 return (Elm_Object_Item *)it;
5851 EAPI Elm_Object_Item *
5852 elm_genlist_item_parent_get(const Elm_Object_Item *it)
5854 ELM_GENLIST_ITEM_CHECK_OR_RETURN(it, NULL);
5856 return (Elm_Object_Item *)((Elm_Gen_Item *)it)->parent;
5860 elm_genlist_item_subitems_clear(Elm_Object_Item *item)
5862 Elm_Gen_Item *it = (Elm_Gen_Item *)item;
5864 ELM_GENLIST_ITEM_CHECK_OR_RETURN(item);
5865 _item_sub_items_clear(it);
5869 elm_genlist_item_selected_set(Elm_Object_Item *item,
5872 Elm_Gen_Item *it = (Elm_Gen_Item *)item;
5873 ELM_GENLIST_ITEM_CHECK_OR_RETURN(item);
5875 if (elm_widget_item_disabled_get(it)) return;
5876 selected = !!selected;
5877 if (it->selected == selected) return;
5879 _item_select_unselect(it, selected);
5883 elm_genlist_item_selected_get(const Elm_Object_Item *it)
5885 ELM_GENLIST_ITEM_CHECK_OR_RETURN(it, EINA_FALSE);
5887 return ((Elm_Gen_Item *)it)->selected;
5890 static Elm_Gen_Item *
5891 _elm_genlist_expanded_next_item_get(Elm_Gen_Item *it)
5895 if (it->item->expanded)
5897 it2 = (Elm_Gen_Item *)elm_genlist_item_next_get((Elm_Object_Item *)it);
5901 it2 = (Elm_Gen_Item *)elm_genlist_item_next_get((Elm_Object_Item *)it);
5904 if (it->item->expanded_depth >= it2->item->expanded_depth) break;
5905 it2 = (Elm_Gen_Item *)
5906 elm_genlist_item_next_get((Elm_Object_Item *)it2);
5912 static Evas_Object *
5913 _tray_alpha_bg_create(const Evas_Object *obj)
5915 Evas_Object *bg = NULL;
5916 Evas_Coord ox, oy, ow, oh;
5918 ELM_GENLIST_CHECK(obj) NULL;
5919 ELM_GENLIST_DATA_GET(obj, sd);
5921 evas_object_geometry_get(sd->pan_obj, &ox, &oy, &ow, &oh);
5922 bg = evas_object_rectangle_add
5923 (evas_object_evas_get(ELM_WIDGET_DATA(sd)->obj));
5924 evas_object_color_set(bg, 0, 0, 0, 0);
5925 evas_object_resize(bg, ow, oh);
5926 evas_object_move(bg, ox, oy);
5932 elm_genlist_item_expanded_set(Elm_Object_Item *item,
5935 Elm_Gen_Item *it = (Elm_Gen_Item *)item;
5937 ELM_GENLIST_ITEM_CHECK_OR_RETURN(item);
5939 expanded = !!expanded;
5940 if (it->item->expanded == expanded) return;
5941 if (it->item->type != ELM_GENLIST_ITEM_TREE) return;
5942 it->item->expanded = expanded;
5943 GL_IT(it)->wsd->expanded_item = it;
5944 GL_IT(it)->wsd->expanded_next_item =
5945 _elm_genlist_expanded_next_item_get(it);
5947 if (it->item->expanded)
5950 edje_object_signal_emit(VIEW(it), "elm,state,expanded", "elm");
5951 evas_object_smart_callback_call(WIDGET(it), SIG_EXPANDED, it);
5952 GL_IT(it)->wsd->auto_scroll_enabled = EINA_TRUE;
5957 edje_object_signal_emit(VIEW(it), "elm,state,contracted", "elm");
5958 evas_object_smart_callback_call(WIDGET(it), SIG_CONTRACTED, it);
5959 GL_IT(it)->wsd->auto_scroll_enabled = EINA_FALSE;
5964 elm_genlist_item_expanded_get(const Elm_Object_Item *it)
5966 ELM_GENLIST_ITEM_CHECK_OR_RETURN(it, EINA_FALSE);
5968 return ((Elm_Gen_Item *)it)->item->expanded;
5972 elm_genlist_item_expanded_depth_get(const Elm_Object_Item *it)
5974 ELM_GENLIST_ITEM_CHECK_OR_RETURN(it, 0);
5976 return ((Elm_Gen_Item *)it)->item->expanded_depth;
5980 _elm_genlist_item_coordinates_calc(Elm_Object_Item *item,
5981 Elm_Genlist_Item_Scrollto_Type type,
5988 Elm_Gen_Item *it = (Elm_Gen_Item *)item;
5989 Evas_Coord gith = 0;
5991 if (!((GL_IT(it)->wsd->homogeneous) &&
5992 (GL_IT(it)->wsd->mode == ELM_LIST_COMPRESS)))
5994 if ((it->item->queued) || (!it->item->mincalcd))
5996 GL_IT(it)->wsd->show_item = it;
5997 GL_IT(it)->wsd->bring_in = bring_in;
5998 GL_IT(it)->wsd->scroll_to_type = type;
5999 it->item->show_me = EINA_TRUE;
6003 if (GL_IT(it)->wsd->show_item)
6005 GL_IT(it)->wsd->show_item->item->show_me = EINA_FALSE;
6006 GL_IT(it)->wsd->show_item = NULL;
6009 evas_object_geometry_get(GL_IT(it)->wsd->pan_obj, NULL, NULL, w, h);
6012 case ELM_GENLIST_ITEM_SCROLLTO_IN:
6013 if ((it->item->group_item) &&
6014 (GL_IT(it)->wsd->pan_y > (it->y + it->item->block->y)))
6015 gith = it->item->group_item->item->h;
6017 *y = it->y + it->item->block->y - gith;
6020 case ELM_GENLIST_ITEM_SCROLLTO_TOP:
6021 if (it->item->group_item) gith = it->item->group_item->item->h;
6022 *y = it->y + it->item->block->y - gith;
6025 case ELM_GENLIST_ITEM_SCROLLTO_MIDDLE:
6026 *y = it->y + it->item->block->y - (*h / 2) + (it->item->h / 2);
6033 *x = it->x + it->item->block->x;
6034 *w = it->item->block->w;
6040 elm_genlist_item_promote(Elm_Object_Item *item)
6042 ELM_GENLIST_ITEM_CHECK_OR_RETURN(item);
6043 Elm_Gen_Item *it = (Elm_Gen_Item *)item;
6045 (it, (Elm_Gen_Item *)elm_genlist_first_item_get(WIDGET(it)));
6049 elm_genlist_item_demote(Elm_Object_Item *item)
6051 ELM_GENLIST_ITEM_CHECK_OR_RETURN(item);
6052 Elm_Gen_Item *it = (Elm_Gen_Item *)item;
6053 _item_move_after(it, (Elm_Gen_Item *)elm_genlist_last_item_get(WIDGET(it)));
6057 elm_genlist_item_show(Elm_Object_Item *item,
6058 Elm_Genlist_Item_Scrollto_Type type)
6060 Evas_Coord x, y, w, h;
6061 ELM_GENLIST_ITEM_CHECK_OR_RETURN(item);
6062 Elm_Gen_Item *it = (Elm_Gen_Item *)item;
6064 if (_elm_genlist_item_coordinates_calc
6065 (item, type, EINA_FALSE, &x, &y, &w, &h))
6066 GL_IT(it)->wsd->s_iface->content_region_show(WIDGET(item), x, y, w, h);
6070 elm_genlist_item_bring_in(Elm_Object_Item *item,
6071 Elm_Genlist_Item_Scrollto_Type type)
6073 Evas_Coord x, y, w, h;
6074 ELM_GENLIST_ITEM_CHECK_OR_RETURN(item);
6075 Elm_Gen_Item *it = (Elm_Gen_Item *)item;
6077 if (_elm_genlist_item_coordinates_calc
6078 (item, type, EINA_TRUE, &x, &y, &w, &h))
6079 GL_IT(it)->wsd->s_iface->region_bring_in(WIDGET(item), x, y, w, h);
6083 elm_genlist_item_all_contents_unset(Elm_Object_Item *item,
6086 Evas_Object *content;
6088 ELM_GENLIST_ITEM_CHECK_OR_RETURN(item);
6089 Elm_Gen_Item *it = (Elm_Gen_Item *)item;
6091 EINA_LIST_FREE (it->content_objs, content)
6093 evas_object_smart_member_del(content);
6094 evas_object_hide(content);
6095 if (l) *l = eina_list_append(*l, content);
6100 elm_genlist_item_update(Elm_Object_Item *item)
6102 ELM_GENLIST_ITEM_CHECK_OR_RETURN(item);
6103 Elm_Gen_Item *it = (Elm_Gen_Item *)item;
6105 if (!it->item->block) return;
6106 it->item->mincalcd = EINA_FALSE;
6107 it->item->updateme = EINA_TRUE;
6108 it->item->block->updateme = EINA_TRUE;
6109 #if GENLIST_ENTRY_SUPPORT
6110 it->item->unrealize_disabled = EINA_FALSE;
6113 #if GENLIST_FX_SUPPORT
6114 if (GL_IT(it)->wsd->fx_first_captured)
6115 _elm_genlist_fx_clear(ELM_WIDGET_DATA(GL_IT(it)->wsd)->obj);
6118 if (GL_IT(it)->wsd->update_job) ecore_job_del(GL_IT(it)->wsd->update_job);
6119 GL_IT(it)->wsd->update_job = ecore_job_add(_update_job, GL_IT(it)->wsd);
6123 elm_genlist_item_fields_update(Elm_Object_Item *item,
6125 Elm_Genlist_Item_Field_Type itf)
6127 ELM_GENLIST_ITEM_CHECK_OR_RETURN(item);
6128 Elm_Gen_Item *it = (Elm_Gen_Item *)item;
6130 if (!it->item->block) return;
6132 #if GENLIST_ENTRY_SUPPORT
6133 it->item->unrealize_disabled = EINA_FALSE;
6135 if ((!itf) || (itf & ELM_GENLIST_ITEM_FIELD_TEXT))
6137 _item_text_realize(it, VIEW(it), &it->texts, parts);
6139 if ((!itf) || (itf & ELM_GENLIST_ITEM_FIELD_CONTENT))
6141 it->content_objs = _item_content_unrealize(it, VIEW(it),
6142 &it->contents, parts);
6143 it->content_objs = _item_content_realize(it, VIEW(it),
6144 &it->contents, parts);
6148 it->item->flip_content_objs =
6149 _item_mode_content_unrealize(it, VIEW(it),
6150 &it->item->flip_contents, parts,
6151 &it->item->flip_content_objs);
6152 it->item->flip_content_objs =
6153 _item_mode_content_realize(it, VIEW(it),
6154 &it->item->flip_contents, parts,
6155 &it->item->flip_content_objs);
6157 if (it->item->deco_it_view)
6159 it->item->deco_it_content_objs =
6160 _item_mode_content_unrealize(it, it->item->deco_it_view,
6161 &it->item->deco_it_contents, parts,
6162 &it->item->deco_it_content_objs);
6163 it->item->deco_it_content_objs =
6164 _item_mode_content_realize(it, it->item->deco_it_view,
6165 &it->item->deco_it_contents, parts,
6166 &it->item->deco_it_content_objs);
6168 if (GL_IT(it)->wsd->decorate_all_mode)
6170 it->item->deco_all_content_objs =
6171 _item_mode_content_unrealize
6172 (it, it->deco_all_view, &it->item->deco_all_contents, parts,
6173 &it->item->deco_all_content_objs);
6174 it->item->deco_all_content_objs =
6175 _item_mode_content_realize(it, it->deco_all_view,
6176 &it->item->deco_all_contents, parts,
6177 &it->item->deco_all_content_objs);
6181 if ((!itf) || (itf & ELM_GENLIST_ITEM_FIELD_STATE))
6182 _item_state_realize(it, VIEW(it), &it->states, parts);
6186 elm_genlist_item_item_class_update(Elm_Object_Item *item,
6187 const Elm_Genlist_Item_Class *itc)
6189 ELM_GENLIST_ITEM_CHECK_OR_RETURN(item);
6190 Elm_Gen_Item *it = (Elm_Gen_Item *)item;
6192 if (!it->item->block) return;
6193 EINA_SAFETY_ON_NULL_RETURN(itc);
6195 it->item->nocache_once = EINA_TRUE;
6197 elm_widget_stringlist_free(it->texts);
6199 elm_widget_stringlist_free(it->contents);
6200 it->contents = NULL;
6201 elm_widget_stringlist_free(it->states);
6206 elm_widget_stringlist_free(it->item->flip_contents);
6207 it->item->flip_contents = NULL;
6209 if (it->item->deco_it_view)
6211 elm_widget_stringlist_free(it->item->deco_it_texts);
6212 it->item->deco_it_texts = NULL;
6213 elm_widget_stringlist_free(it->item->deco_it_contents);
6214 it->item->deco_it_contents = NULL;
6216 if (GL_IT(it)->wsd->decorate_all_mode)
6218 elm_widget_stringlist_free(it->item->deco_all_texts);
6219 it->item->deco_all_texts = NULL;
6220 elm_widget_stringlist_free(it->item->deco_all_contents);
6221 it->item->deco_all_contents = NULL;
6224 elm_genlist_item_update(item);
6227 EAPI const Elm_Genlist_Item_Class *
6228 elm_genlist_item_item_class_get(const Elm_Object_Item *item)
6230 ELM_GENLIST_ITEM_CHECK_OR_RETURN(item, NULL);
6231 Elm_Gen_Item *it = (Elm_Gen_Item *)item;
6235 static Evas_Object *
6236 _elm_genlist_item_label_create(void *data,
6237 Evas_Object *obj __UNUSED__,
6238 Evas_Object *tooltip,
6239 void *it __UNUSED__)
6241 Evas_Object *label = elm_label_add(tooltip);
6246 elm_object_style_set(label, "tooltip");
6247 elm_object_text_set(label, data);
6253 _elm_genlist_item_label_del_cb(void *data,
6254 Evas_Object *obj __UNUSED__,
6255 void *event_info __UNUSED__)
6257 eina_stringshare_del(data);
6261 elm_genlist_item_tooltip_text_set(Elm_Object_Item *it,
6264 ELM_GENLIST_ITEM_CHECK_OR_RETURN(it);
6266 text = eina_stringshare_add(text);
6267 elm_genlist_item_tooltip_content_cb_set
6268 (it, _elm_genlist_item_label_create, text,
6269 _elm_genlist_item_label_del_cb);
6273 elm_genlist_item_tooltip_content_cb_set(Elm_Object_Item *item,
6274 Elm_Tooltip_Item_Content_Cb func,
6276 Evas_Smart_Cb del_cb)
6278 Elm_Gen_Item *it = (Elm_Gen_Item *)item;
6280 ELM_GENLIST_ITEM_CHECK_OR_GOTO(item, error);
6282 if ((it->tooltip.content_cb == func) && (it->tooltip.data == data))
6285 if (it->tooltip.del_cb)
6286 it->tooltip.del_cb((void *)it->tooltip.data, WIDGET(it), it);
6288 it->tooltip.content_cb = func;
6289 it->tooltip.data = data;
6290 it->tooltip.del_cb = del_cb;
6294 elm_widget_item_tooltip_content_cb_set
6295 (it, it->tooltip.content_cb, it->tooltip.data, NULL);
6296 elm_widget_item_tooltip_style_set(it, it->tooltip.style);
6297 elm_widget_item_tooltip_window_mode_set(it, it->tooltip.free_size);
6303 if (del_cb) del_cb((void *)data, NULL, NULL);
6307 elm_genlist_item_tooltip_unset(Elm_Object_Item *item)
6309 Elm_Gen_Item *it = (Elm_Gen_Item *)item;
6311 ELM_GENLIST_ITEM_CHECK_OR_RETURN(item);
6313 if ((VIEW(it)) && (it->tooltip.content_cb))
6314 elm_widget_item_tooltip_unset(it);
6316 if (it->tooltip.del_cb)
6317 it->tooltip.del_cb((void *)it->tooltip.data, WIDGET(it), it);
6318 it->tooltip.del_cb = NULL;
6319 it->tooltip.content_cb = NULL;
6320 it->tooltip.data = NULL;
6321 it->tooltip.free_size = EINA_FALSE;
6322 if (it->tooltip.style)
6323 elm_genlist_item_tooltip_style_set(item, NULL);
6327 elm_genlist_item_tooltip_style_set(Elm_Object_Item *item,
6330 Elm_Gen_Item *it = (Elm_Gen_Item *)item;
6332 ELM_GENLIST_ITEM_CHECK_OR_RETURN(item);
6334 eina_stringshare_replace(&it->tooltip.style, style);
6335 if (VIEW(it)) elm_widget_item_tooltip_style_set(it, style);
6339 elm_genlist_item_tooltip_style_get(const Elm_Object_Item *it)
6341 return elm_object_item_tooltip_style_get(it);
6345 elm_genlist_item_tooltip_window_mode_set(Elm_Object_Item *item,
6348 Elm_Gen_Item *it = (Elm_Gen_Item *)item;
6350 ELM_GENLIST_ITEM_CHECK_OR_RETURN(item, EINA_FALSE);
6352 it->tooltip.free_size = disable;
6353 if (VIEW(it)) return elm_widget_item_tooltip_window_mode_set(it, disable);
6359 elm_genlist_item_tooltip_window_mode_get(const Elm_Object_Item *it)
6361 return elm_object_tooltip_window_mode_get(VIEW(it));
6365 elm_genlist_item_cursor_set(Elm_Object_Item *item,
6368 Elm_Gen_Item *it = (Elm_Gen_Item *)item;
6370 ELM_GENLIST_ITEM_CHECK_OR_RETURN(item);
6371 eina_stringshare_replace(&it->mouse_cursor, cursor);
6372 if (VIEW(it)) elm_widget_item_cursor_set(it, cursor);
6376 elm_genlist_item_cursor_get(const Elm_Object_Item *it)
6378 return elm_widget_item_cursor_get(it);
6382 elm_genlist_item_cursor_unset(Elm_Object_Item *item)
6384 Elm_Gen_Item *it = (Elm_Gen_Item *)item;
6386 ELM_GENLIST_ITEM_CHECK_OR_RETURN(item);
6388 if (!it->mouse_cursor) return;
6390 if (VIEW(it)) elm_widget_item_cursor_unset(it);
6392 eina_stringshare_del(it->mouse_cursor);
6393 it->mouse_cursor = NULL;
6397 elm_genlist_item_cursor_style_set(Elm_Object_Item *it,
6400 elm_widget_item_cursor_style_set(it, style);
6404 elm_genlist_item_cursor_style_get(const Elm_Object_Item *it)
6406 return elm_widget_item_cursor_style_get(it);
6410 elm_genlist_item_cursor_engine_only_set(Elm_Object_Item *it,
6411 Eina_Bool engine_only)
6413 elm_widget_item_cursor_engine_only_set(it, engine_only);
6417 elm_genlist_item_cursor_engine_only_get(const Elm_Object_Item *it)
6419 return elm_widget_item_cursor_engine_only_get(it);
6423 elm_genlist_item_index_get(const Elm_Object_Item *item)
6427 Elm_Gen_Item *it = (Elm_Gen_Item *)item;
6429 ELM_GENLIST_ITEM_CHECK_OR_RETURN(item, -1);
6431 EINA_INLIST_FOREACH(GL_IT(it)->wsd->items, tmp)
6433 if (tmp == it) break;
6440 elm_genlist_mode_set(Evas_Object *obj,
6443 ELM_GENLIST_CHECK(obj);
6444 ELM_GENLIST_DATA_GET(obj, sd);
6446 if (sd->mode == mode) return;
6448 elm_layout_sizing_eval(obj);
6452 elm_genlist_mode_get(const Evas_Object *obj)
6454 ELM_GENLIST_CHECK(obj) ELM_LIST_LAST;
6455 ELM_GENLIST_DATA_GET(obj, sd);
6461 elm_genlist_bounce_set(Evas_Object *obj,
6465 ELM_GENLIST_CHECK(obj);
6466 ELM_GENLIST_DATA_GET(obj, sd);
6468 sd->h_bounce = !!h_bounce;
6469 sd->v_bounce = !!v_bounce;
6470 sd->s_iface->bounce_allow_set(obj, sd->h_bounce, sd->v_bounce);
6474 elm_genlist_bounce_get(const Evas_Object *obj,
6475 Eina_Bool *h_bounce,
6476 Eina_Bool *v_bounce)
6478 ELM_GENLIST_CHECK(obj);
6479 ELM_GENLIST_DATA_GET(obj, sd);
6481 if (h_bounce) *h_bounce = sd->h_bounce;
6482 if (v_bounce) *v_bounce = sd->v_bounce;
6486 elm_genlist_homogeneous_set(Evas_Object *obj,
6487 Eina_Bool homogeneous)
6489 ELM_GENLIST_CHECK(obj);
6490 ELM_GENLIST_DATA_GET(obj, sd);
6492 sd->homogeneous = !!homogeneous;
6496 elm_genlist_homogeneous_get(const Evas_Object *obj)
6498 ELM_GENLIST_CHECK(obj) EINA_FALSE;
6499 ELM_GENLIST_DATA_GET(obj, sd);
6501 return sd->homogeneous;
6505 elm_genlist_block_count_set(Evas_Object *obj,
6508 ELM_GENLIST_CHECK(obj);
6509 ELM_GENLIST_DATA_GET(obj, sd);
6510 EINA_SAFETY_ON_TRUE_RETURN(count < 1);
6512 sd->max_items_per_block = count;
6513 sd->item_cache_max = sd->max_items_per_block * 2;
6514 _item_cache_all_free(sd);
6518 elm_genlist_block_count_get(const Evas_Object *obj)
6520 ELM_GENLIST_CHECK(obj) 0;
6521 ELM_GENLIST_DATA_GET(obj, sd);
6523 return sd->max_items_per_block;
6527 elm_genlist_longpress_timeout_set(Evas_Object *obj,
6530 ELM_GENLIST_CHECK(obj);
6531 ELM_GENLIST_DATA_GET(obj, sd);
6533 sd->longpress_timeout = timeout;
6537 elm_genlist_longpress_timeout_get(const Evas_Object *obj)
6539 ELM_GENLIST_CHECK(obj) 0;
6540 ELM_GENLIST_DATA_GET(obj, sd);
6542 return sd->longpress_timeout;
6546 elm_genlist_scroller_policy_set(Evas_Object *obj,
6547 Elm_Scroller_Policy policy_h,
6548 Elm_Scroller_Policy policy_v)
6550 ELM_GENLIST_CHECK(obj);
6551 ELM_GENLIST_DATA_GET(obj, sd);
6553 if ((policy_h >= ELM_SCROLLER_POLICY_LAST) ||
6554 (policy_v >= ELM_SCROLLER_POLICY_LAST))
6557 sd->s_iface->policy_set(obj, policy_h, policy_v);
6561 elm_genlist_scroller_policy_get(const Evas_Object *obj,
6562 Elm_Scroller_Policy *policy_h,
6563 Elm_Scroller_Policy *policy_v)
6565 Elm_Scroller_Policy s_policy_h, s_policy_v;
6567 ELM_GENLIST_CHECK(obj);
6568 ELM_GENLIST_DATA_GET(obj, sd);
6570 sd->s_iface->policy_get(obj, &s_policy_h, &s_policy_v);
6571 if (policy_h) *policy_h = (Elm_Scroller_Policy)s_policy_h;
6572 if (policy_v) *policy_v = (Elm_Scroller_Policy)s_policy_v;
6576 elm_genlist_realized_items_update(Evas_Object *obj)
6578 Eina_List *list, *l;
6579 Elm_Object_Item *it;
6581 ELM_GENLIST_CHECK(obj);
6583 list = elm_genlist_realized_items_get(obj);
6584 EINA_LIST_FOREACH(list, l, it)
6585 elm_genlist_item_update(it);
6589 elm_genlist_item_decorate_mode_set(Elm_Object_Item *item,
6590 const char *decorate_it_type,
6591 Eina_Bool decorate_it_set)
6593 Elm_Gen_Item *it = (Elm_Gen_Item *)item;
6594 Elm_Genlist_Smart_Data *sd;
6596 ELM_GENLIST_ITEM_CHECK_OR_RETURN(item);
6597 sd = GL_IT(it)->wsd;
6599 if (elm_widget_item_disabled_get(it)) return;
6600 if (!decorate_it_type) return;
6601 if (sd->decorate_all_mode) return;
6603 if ((sd->mode_item == it) &&
6604 (!strcmp(decorate_it_type, sd->decorate_it_type)) &&
6607 if (!it->itc->decorate_item_style) return;
6608 it->decorate_it_set = decorate_it_set;
6611 if (((sd->decorate_it_type)
6612 && (strcmp(decorate_it_type, sd->decorate_it_type))) ||
6613 (decorate_it_set) || ((it == sd->mode_item) && (!decorate_it_set)))
6614 _decorate_item_unset(sd);
6616 eina_stringshare_replace(&sd->decorate_it_type, decorate_it_type);
6617 if (decorate_it_set) _decorate_item_set(it);
6621 elm_genlist_item_decorate_mode_get(const Elm_Object_Item *item)
6623 Elm_Gen_Item *i = (Elm_Gen_Item *)item;
6625 ELM_GENLIST_ITEM_CHECK_OR_RETURN(item, NULL);
6626 return GL_IT(i)->wsd->decorate_it_type;
6629 EAPI Elm_Object_Item *
6630 elm_genlist_decorated_item_get(const Evas_Object *obj)
6632 ELM_GENLIST_CHECK(obj) NULL;
6633 ELM_GENLIST_DATA_GET(obj, sd);
6635 return (Elm_Object_Item *)sd->mode_item;
6639 elm_genlist_decorate_mode_get(const Evas_Object *obj)
6641 ELM_GENLIST_CHECK(obj) EINA_FALSE;
6642 ELM_GENLIST_DATA_GET(obj, sd);
6644 return sd->decorate_all_mode;
6648 elm_genlist_decorate_mode_set(Evas_Object *obj,
6649 Eina_Bool decorated)
6652 Eina_List *list, *l;
6654 ELM_GENLIST_CHECK(obj);
6655 ELM_GENLIST_DATA_GET(obj, sd);
6657 decorated = !!decorated;
6658 if (sd->decorate_all_mode == decorated) return;
6659 // decorate_all_mode should be set first
6660 // because content_get func. will be called after this
6661 // and user can check whether deocrate_all_mode is enabeld.
6662 sd->decorate_all_mode = decorated;
6664 list = elm_genlist_realized_items_get(obj);
6665 if (!sd->decorate_all_mode)
6667 EINA_LIST_FOREACH(list, l, it)
6669 if (it->item->type != ELM_GENLIST_ITEM_GROUP)
6670 _decorate_all_item_unrealize(it);
6672 _item_cache_all_free(sd);
6676 EINA_LIST_FOREACH(list, l, it)
6678 if (it->item->type != ELM_GENLIST_ITEM_GROUP)
6680 if (it->itc->decorate_all_item_style)
6681 _decorate_all_item_realize(it, EINA_TRUE);
6685 #if GENLIST_FX_SUPPORT
6686 if (sd->fx_first_captured)
6687 _elm_genlist_fx_clear(ELM_WIDGET_DATA(sd)->obj);
6690 if (sd->calc_job) ecore_job_del(sd->calc_job);
6691 sd->calc_job = ecore_job_add(_calc_job, sd);
6695 elm_genlist_reorder_mode_set(Evas_Object *obj,
6696 Eina_Bool reorder_mode)
6698 #if 1 // FIXME: difference from upstream
6699 Eina_List *list, *l;
6702 ELM_GENLIST_CHECK(obj);
6703 ELM_GENLIST_DATA_GET(obj, sd);
6705 if (sd->reorder_mode == !!reorder_mode) return;
6706 sd->reorder_mode = !!reorder_mode;
6707 #if 1 // FIXME: difference from upstream
6708 list = elm_genlist_realized_items_get(obj);
6709 EINA_LIST_FOREACH(list, l, it)
6711 if (it->item->type != ELM_GENLIST_ITEM_GROUP)
6713 if (sd->reorder_mode)
6714 edje_object_signal_emit
6715 (VIEW(it), "elm,state,reorder,mode_set", "elm");
6717 edje_object_signal_emit
6718 (VIEW(it), "elm,state,reorder,mode_unset", "elm");
6720 if (sd->decorate_all_mode)
6722 if (sd->reorder_mode)
6723 edje_object_signal_emit
6724 (it->deco_all_view, "elm,state,reorder,mode_set", "elm");
6726 edje_object_signal_emit
6727 (it->deco_all_view, "elm,state,reorder,mode_unset", "elm");
6730 eina_list_free(list);
6735 elm_genlist_reorder_mode_get(const Evas_Object *obj)
6737 ELM_GENLIST_CHECK(obj) EINA_FALSE;
6738 ELM_GENLIST_DATA_GET(obj, sd);
6740 return sd->reorder_mode;
6743 EAPI Elm_Genlist_Item_Type
6744 elm_genlist_item_type_get(const Elm_Object_Item *item)
6746 Elm_Gen_Item *it = (Elm_Gen_Item *)item;
6748 ELM_GENLIST_ITEM_CHECK_OR_RETURN(item, ELM_GENLIST_ITEM_MAX);
6750 return it->item->type;
6753 EAPI Elm_Genlist_Item_Class *
6754 elm_genlist_item_class_new(void)
6756 Elm_Genlist_Item_Class *itc = ELM_NEW(Elm_Genlist_Item_Class);
6757 EINA_SAFETY_ON_NULL_RETURN_VAL(itc, NULL);
6759 itc->version = CLASS_ALLOCATED;
6761 itc->delete_me = EINA_FALSE;
6767 elm_genlist_item_class_free(Elm_Genlist_Item_Class *itc)
6769 if (itc && (itc->version == CLASS_ALLOCATED))
6771 if (!itc->delete_me) itc->delete_me = EINA_TRUE;
6772 if (itc->refcount > 0) elm_genlist_item_class_unref(itc);
6782 elm_genlist_item_class_ref(Elm_Genlist_Item_Class *itc)
6784 if (itc && (itc->version == CLASS_ALLOCATED))
6787 if (itc->refcount == 0) itc->refcount--;
6792 elm_genlist_item_class_unref(Elm_Genlist_Item_Class *itc)
6794 if (itc && (itc->version == CLASS_ALLOCATED))
6796 if (itc->refcount > 0) itc->refcount--;
6797 if (itc->delete_me && (!itc->refcount))
6798 elm_genlist_item_class_free(itc);
6803 elm_genlist_item_flip_set(Elm_Object_Item *item,
6806 Elm_Gen_Item *it = (Elm_Gen_Item *)item;
6807 ELM_GENLIST_ITEM_CHECK_OR_RETURN(item);
6808 Elm_Genlist_Smart_Data *sd = GL_IT(it)->wsd;
6811 if (it->flipped == flip) return;
6813 it->item->unrealize_disabled = EINA_FALSE;
6817 _item_unrealize(it, EINA_FALSE);
6818 it->flipped = EINA_TRUE;
6819 it->item->nocache = EINA_TRUE;
6823 _item_unrealize(it, EINA_FALSE);
6824 it->flipped = EINA_FALSE;
6825 it->item->nocache = EINA_FALSE;
6827 if (sd->calc_job) ecore_job_del(sd->calc_job);
6828 sd->calc_job = ecore_job_add(_calc_job, sd);
6832 elm_genlist_item_flip_get(const Elm_Object_Item *item)
6834 Elm_Gen_Item *it = (Elm_Gen_Item *)item;
6836 ELM_GENLIST_ITEM_CHECK_OR_RETURN(item, EINA_FALSE);
6842 elm_genlist_select_mode_set(Evas_Object *obj,
6843 Elm_Object_Select_Mode mode)
6845 ELM_GENLIST_CHECK(obj);
6846 ELM_GENLIST_DATA_GET(obj, sd);
6848 if (mode >= ELM_OBJECT_SELECT_MODE_MAX || (sd->select_mode == mode))
6851 sd->select_mode = mode;
6852 if ((sd->select_mode == ELM_OBJECT_SELECT_MODE_NONE) ||
6853 (sd->select_mode == ELM_OBJECT_SELECT_MODE_DISPLAY_ONLY ))
6857 EINA_LIST_FOREACH_SAFE(sd->selected, l, ll, it)
6862 EAPI Elm_Object_Select_Mode
6863 elm_genlist_select_mode_get(const Evas_Object *obj)
6865 ELM_GENLIST_CHECK(obj) ELM_OBJECT_SELECT_MODE_MAX;
6866 ELM_GENLIST_DATA_GET(obj, sd);
6868 return sd->select_mode;
6872 elm_genlist_highlight_mode_set(Evas_Object *obj,
6873 Eina_Bool highlight)
6875 ELM_GENLIST_CHECK(obj);
6876 ELM_GENLIST_DATA_GET(obj, sd);
6878 sd->highlight = !!highlight;
6882 elm_genlist_highlight_mode_get(const Evas_Object *obj)
6884 ELM_GENLIST_CHECK(obj) EINA_FALSE;
6885 ELM_GENLIST_DATA_GET(obj, sd);
6887 return sd->highlight;
6891 elm_genlist_item_select_mode_set(Elm_Object_Item *item,
6892 Elm_Object_Select_Mode mode)
6894 Elm_Gen_Item *it = (Elm_Gen_Item *)item;
6896 ELM_GENLIST_ITEM_CHECK_OR_RETURN(item);
6898 if (mode >= ELM_OBJECT_SELECT_MODE_MAX)
6900 if (it->select_mode != mode)
6901 it->select_mode = mode;
6903 if ((it->select_mode == ELM_OBJECT_SELECT_MODE_NONE) ||
6904 (it->select_mode == ELM_OBJECT_SELECT_MODE_DISPLAY_ONLY ))
6907 if (it->select_mode == ELM_OBJECT_SELECT_MODE_DISPLAY_ONLY)
6909 it->item->mincalcd = EINA_FALSE;
6910 it->item->updateme = EINA_TRUE;
6911 if (it->item->block) it->item->block->updateme = EINA_TRUE;
6912 if (GL_IT(it)->wsd->update_job)
6913 ecore_job_del(GL_IT(it)->wsd->update_job);
6914 GL_IT(it)->wsd->update_job =
6915 ecore_job_add(_update_job, GL_IT(it)->wsd);
6917 // reset homogeneous item size
6918 if (GL_IT(it)->wsd->homogeneous)
6921 GL_IT(it)->wsd->group_item_width =
6922 GL_IT(it)->wsd->group_item_height = 0;
6924 GL_IT(it)->wsd->item_width = GL_IT(it)->wsd->item_height = 0;
6929 EAPI Elm_Object_Select_Mode
6930 elm_genlist_item_select_mode_get(const Elm_Object_Item *item)
6932 Elm_Gen_Item *it = (Elm_Gen_Item *)item;
6934 ELM_GENLIST_ITEM_CHECK_OR_RETURN(item, ELM_OBJECT_SELECT_MODE_MAX);
6936 if (!it) return ELM_OBJECT_SELECT_MODE_MAX;
6938 return it->select_mode;
6941 // will be deprecated
6943 elm_genlist_tree_effect_enabled_set(Evas_Object *obj __UNUSED__,
6944 Eina_Bool enabled __UNUSED__)
6946 ELM_GENLIST_CHECK(obj);
6949 // will be deprecated
6951 elm_genlist_tree_effect_enabled_get(const Evas_Object *obj __UNUSED__)
6953 ELM_GENLIST_CHECK(obj) EINA_FALSE;
6958 EAPI Elm_Object_Item *
6959 elm_genlist_nth_item_get(const Evas_Object *obj, unsigned int nth)
6961 Elm_Gen_Item *it = NULL;
6965 ELM_GENLIST_CHECK(obj) NULL;
6966 ELM_GENLIST_DATA_GET(obj, sd);
6968 if (!sd->items) return NULL;
6970 a = eina_inlist_accessor_new(sd->items);
6971 if (!a) return NULL;
6972 if (eina_accessor_data_get(a, nth, &data))
6973 it = ELM_GEN_ITEM_FROM_INLIST(data);
6974 eina_accessor_free(a);
6975 return (Elm_Object_Item *)it;
6978 #if GENLIST_FX_SUPPORT
6980 elm_genlist_fx_mode_set(Evas_Object *obj, Eina_Bool mode)
6982 ELM_GENLIST_CHECK(obj);
6983 ELM_GENLIST_DATA_GET(obj, sd);
6989 elm_genlist_fx_mode_get(const Evas_Object *obj)
6991 ELM_GENLIST_CHECK(obj) EINA_FALSE;
6992 ELM_GENLIST_DATA_GET(obj, sd);
6998 _elm_genlist_proxy_item_del(const Elm_Object_Item *item)
7000 Elm_Gen_Item *it = (Elm_Gen_Item *)item;
7001 if ((!it) || (!it->item)) return;
7003 Elm_Genlist_Smart_Data *sd = GL_IT(it)->wsd;
7007 EINA_LIST_FOREACH(sd->capture_before_items, l, pi)
7008 if (pi->it == it) pi->it = NULL;
7010 EINA_LIST_FOREACH(sd->capture_after_items, l, pi)
7011 if (pi->it == it) pi->it = NULL;
7015 _elm_genlist_proxy_item_new(const Elm_Object_Item *item)
7017 Elm_Gen_Item *it = (Elm_Gen_Item *)item;
7018 if ((!it) || (!it->item)) return EINA_FALSE;
7021 Proxy_Item *pi = NULL;
7022 pi = calloc(1, sizeof(Proxy_Item));
7023 if (!pi) return NULL;
7025 pi->proxy = evas_object_image_filled_add
7026 (evas_object_evas_get(ELM_WIDGET_DATA(GL_IT(it)->wsd)->obj));
7027 if (!pi->proxy) return EINA_FALSE;
7028 evas_object_clip_set(pi->proxy, evas_object_clip_get(GL_IT(it)->wsd->pan_obj));
7029 evas_object_smart_member_add(pi->proxy, GL_IT(it)->wsd->pan_obj);
7030 evas_object_hide(pi->proxy);
7032 if ((GL_IT(it)->wsd->decorate_all_mode) && (it->deco_all_view))
7033 evas_object_image_source_set(pi->proxy, it->deco_all_view);
7035 evas_object_image_source_set(pi->proxy, VIEW(it));
7037 GL_IT(it)->has_proxy_it = EINA_TRUE;
7039 pi->num = it->item->num;
7040 pi->x = it->item->scrl_x;
7041 pi->y = it->item->scrl_y;
7042 pi->w = it->item->w;
7043 pi->h = it->item->h;
7045 evas_object_geometry_get(VIEW(it), NULL, NULL, &w, &h);
7047 if (w <= 0 || h <= 0)
7049 evas_object_size_hint_min_get(VIEW(it), &w, &h);
7050 evas_object_size_hint_min_set(pi->proxy, w, h);
7052 else evas_object_resize(pi->proxy, w, h);
7058 _elm_genlist_fx_capture(Evas_Object *obj, int level)
7060 ELM_GENLIST_DATA_GET(obj, sd);
7064 Eina_Bool done = EINA_FALSE;
7067 Evas_Coord ox, oy, ow, oh;
7071 if ((!sd->rendered) || (sd->fx_playing)) return EINA_FALSE;
7072 if ((!level) && (sd->fx_first_captured)) return EINA_FALSE;
7073 if ((level) && (!sd->fx_first_captured)) return EINA_FALSE;
7075 evas_object_geometry_get(sd->pan_obj, &ox, &oy, &ow, &oh);
7079 sd->fx_first_captured = EINA_TRUE;
7080 EINA_LIST_FREE(sd->capture_before_items, pi)
7082 if ((pi->it) && (GL_IT(pi->it))) GL_IT(pi->it)->has_proxy_it = EINA_FALSE;
7083 if (pi->proxy) evas_object_smart_member_del(pi->proxy);
7084 if (pi->proxy) evas_object_del(pi->proxy);
7090 EINA_LIST_FREE(sd->capture_after_items, pi)
7092 if ((pi->it) && (GL_IT(pi->it))) GL_IT(pi->it)->has_proxy_it = EINA_FALSE;
7093 if (pi->proxy) evas_object_smart_member_del(pi->proxy);
7094 if (pi->proxy) evas_object_del(pi->proxy);
7098 EINA_INLIST_FOREACH(sd->blocks, itb)
7102 EINA_LIST_FOREACH(itb->items, l, it)
7104 if (it->realized && it->item->scrl_y >= oy)
7106 sd->realized_top_item = it;
7111 if (sd->realized_top_item) break;
7115 #if GENLIST_PINCH_ZOOM_SUPPORT
7116 if (sd->pinch_zoom_mode)
7118 EINA_INLIST_FOREACH(sd->blocks, itb)
7120 EINA_LIST_FOREACH(itb->items, l, it)
7123 if (IS_ROOT_PARENT_IT(it) && it->realized
7124 && (GL_IT(it)->scrl_y + GL_IT(it)->h >= oy && GL_IT(it)->scrl_y <= oy + oh))
7126 pi = _elm_genlist_proxy_item_new((Elm_Object_Item *)it);
7127 if (!level) sd->capture_before_items = eina_list_append(sd->capture_before_items, pi);
7128 else sd->capture_after_items = eina_list_append(sd->capture_after_items, pi);
7132 if ((sd->pinch_zoom_mode == ELM_GEN_PINCH_ZOOM_CONTRACT) && (level)) return EINA_TRUE;
7133 if ((sd->pinch_zoom_mode == ELM_GEN_PINCH_ZOOM_EXPAND) && (!level)) return EINA_TRUE;
7137 EINA_INLIST_FOREACH(sd->blocks, itb)
7142 EINA_LIST_FOREACH(itb->items, l, it)
7144 #if GENLIST_PINCH_ZOOM_SUPPORT
7145 if ((sd->pinch_zoom_mode) && (IS_ROOT_PARENT_IT(it))) continue;
7149 pi = _elm_genlist_proxy_item_new((Elm_Object_Item *)it);
7152 sd->capture_before_items = eina_list_append(sd->capture_before_items, pi);
7154 sd->capture_after_items = eina_list_append(sd->capture_after_items, pi);
7158 else if (done) break;
7163 static Elm_Gen_FX_Item *
7164 _elm_genlist_fx_item_find(const Elm_Object_Item *item)
7166 Elm_Gen_Item *it = (Elm_Gen_Item *)item;
7167 if (!it) return EINA_FALSE;
7169 Elm_Genlist_Smart_Data *sd = GL_IT(it)->wsd;
7170 if (!sd) return NULL;
7172 Elm_Gen_FX_Item *fi = NULL;
7175 EINA_LIST_FOREACH(sd->fx_items, l, fi)
7177 if (fi->it == it) return fi;
7182 static Elm_Gen_FX_Item *
7183 _elm_genlist_fx_item_new(const Proxy_Item *pi)
7185 if ((!pi) || (!pi->it)) return NULL;
7187 Elm_Gen_FX_Item *fi = NULL;
7188 fi = calloc(1, sizeof(Elm_Gen_FX_Item));
7189 if (!fi) return NULL;
7192 GL_IT(fi->it)->fi = fi;
7193 fi->proxy = pi->proxy;
7195 fi->from.x = fi->to.x = pi->x;
7196 fi->from.y = fi->to.y = pi->y;
7197 fi->from.w = fi->to.w = pi->w;
7198 fi->from.h = fi->to.h = pi->h;
7199 fi->update = EINA_FALSE;
7204 static Elm_Object_Item *
7205 _elm_genlist_fx_item_prev_get(const Elm_Object_Item *item)
7208 it = (Elm_Gen_Item *)item;
7209 if (!it) return NULL;
7210 if (GL_IT(it)->wsd->pinch_zoom_mode) return NULL;
7214 it = ELM_GEN_ITEM_FROM_INLIST(EINA_INLIST_GET(it)->prev);
7218 return (Elm_Object_Item *)it;
7222 _elm_genlist_fx_items_make(Evas_Object *obj)
7224 ELM_GENLIST_CHECK(obj) EINA_FALSE;
7225 ELM_GENLIST_DATA_GET(obj, sd);
7227 Elm_Gen_FX_Item *fi;
7230 Elm_Gen_Item *prev = NULL;
7231 Evas_Coord ox, oy, ow, oh, mv_dist, max_mv_dist = 0;
7233 evas_object_geometry_get(sd->pan_obj, &ox, &oy, &ow, &oh);
7235 EINA_LIST_FOREACH(sd->capture_before_items, l, pi)
7237 fi = _elm_genlist_fx_item_new(pi);
7238 if (fi) sd->fx_items = eina_list_append(sd->fx_items, fi);
7241 EINA_LIST_FOREACH(sd->capture_after_items, l, pi)
7243 fi = _elm_genlist_fx_item_find((Elm_Object_Item *)pi->it);
7245 if (fi) // pi exists in both before and after capture items
7247 fi->type = ELM_GEN_ITEM_FX_TYPE_SAME;
7248 fi->update = EINA_TRUE;
7254 // find the max distance between before and after capture items
7255 mv_dist = abs(fi->to.y - fi->from.y);
7256 if (max_mv_dist < mv_dist) max_mv_dist = mv_dist;
7258 else // pi only exists in after capture items
7260 fi = _elm_genlist_fx_item_new(pi);
7263 fi->type = ELM_GEN_ITEM_FX_TYPE_ADD;
7264 fi->update = EINA_TRUE;
7265 sd->fx_items = eina_list_append(sd->fx_items, fi);
7270 EINA_LIST_FOREACH(sd->fx_items, l, fi)
7272 // find deleted items
7273 if (!fi->update) // pi only exists in before capture items
7275 fi->type = ELM_GEN_ITEM_FX_TYPE_DEL;
7276 fi->update = EINA_TRUE;
7278 prev = (Elm_Gen_Item *)_elm_genlist_fx_item_prev_get((Elm_Object_Item *)fi->it);
7279 if ((prev) && (GL_IT(prev)->fi))
7281 fi->to.y = GL_IT(prev)->fi->to.y + GL_IT(prev)->fi->to.h;
7284 else if (fi->type == ELM_GEN_ITEM_FX_TYPE_ADD)
7286 prev = (Elm_Gen_Item *)_elm_genlist_fx_item_prev_get((Elm_Object_Item *)fi->it);
7287 if ((prev) && (prev->realized) && (GL_IT(prev)->fi))
7289 fi->from.y = GL_IT(prev)->fi->from.y + GL_IT(prev)->fi->from.h;
7293 if (sd->realized_top_item)
7296 if (fi->num <= sd->realized_top_item->item->num)
7297 fi->from.y -= max_mv_dist;
7299 fi->from.y += max_mv_dist;
7305 EINA_LIST_FOREACH(sd->fx_items, l, fi)
7307 if ((GL_IT(fi->it)->items) && (GL_IT(fi->it)->expanded_depth == 0))
7309 #if GENLIST_PINCH_ZOOM_SUPPORT
7310 if (sd->pinch_zoom_mode == ELM_GEN_PINCH_ZOOM_CONTRACT)
7312 fi->from.y = oy + GL_IT(fi->it)->pan_scrl_y - sd->pinch_pan_y;
7315 if (fi->type == ELM_GEN_ITEM_FX_TYPE_DEL)
7317 if (sd->realized_top_item)
7319 if (fi->num <= sd->realized_top_item->item->num)
7320 fi->to.y = oy - fi->from.h;
7331 static Elm_Gen_FX_Item *
7332 _fx_cover_item_get(const Elm_Gen_FX_Item *fi)
7334 Elm_Gen_FX_Item *cover_fi;
7336 if (!fi) return NULL;
7338 Elm_Genlist_Smart_Data *sd = GL_IT(fi->it)->wsd;
7339 Evas_Coord ox, oy, ow, oh;
7340 evas_object_geometry_get(sd->pan_obj, &ox, &oy, &ow, &oh);
7342 EINA_LIST_FOREACH(sd->fx_items, l, cover_fi)
7344 if (fi == cover_fi) continue;
7345 if (sd->fx_items_deleted)
7347 if ((cover_fi->from.y >= oy+oh || cover_fi->from.y > fi->to.y) && (cover_fi->from.y - cover_fi->to.y > 0))
7352 if ((cover_fi->to.y > fi->to.y) && (cover_fi->from.y - cover_fi->to.y < 0))
7360 _item_fx_op(Elm_Transit_Effect *data, Elm_Transit *transit __UNUSED__, double progress __UNUSED__)
7362 Elm_Gen_FX_Item *fi = data, *cover_it;
7363 Elm_Genlist_Smart_Data *sd = GL_IT(fi->it)->wsd;
7364 Evas_Coord fi_ox, fi_oy, cover_it_ox, cover_it_oy, ox, oy, ow, oh;
7366 evas_object_show(VIEW(fi->it));
7367 evas_object_geometry_get(sd->pan_obj, &ox, &oy, &ow, &oh);
7368 evas_object_geometry_get(fi->proxy, &fi_ox, &fi_oy, NULL, NULL);
7369 evas_object_move(fi->proxy, ox, fi_oy);
7370 evas_object_show(fi->proxy);
7371 #if GENLIST_PINCH_ZOOM_SUPPORT
7372 if ((sd->pinch_zoom_mode) && (IS_ROOT_PARENT_IT(fi->it))) evas_object_raise(fi->proxy);
7375 if ((!sd->expanded_next_item) || (sd->expanded_next_item == fi->it)) goto raise_event_block;
7376 if (fi->type == ELM_GEN_ITEM_FX_TYPE_SAME) goto raise_event_block;
7378 // find the closest item that cover current item when deleting
7379 cover_it = _fx_cover_item_get(fi);
7382 evas_object_geometry_get(cover_it->proxy, &cover_it_ox, &cover_it_oy, NULL, NULL);
7384 if (sd->fx_items_deleted)
7387 && (fi_oy + fi->to.h >= cover_it_oy + cover_it->to.h ) && (fi->from.y < cover_it->from.y))
7388 evas_object_hide(fi->proxy);
7390 else if (cover_it_oy && (fi_oy >= cover_it_oy))
7391 evas_object_hide(fi->proxy);
7393 evas_object_show(fi->proxy);
7397 evas_object_raise(sd->alpha_bg);
7404 _item_fx_done(Elm_Transit_Effect *data, Elm_Transit *transit __UNUSED__)
7406 Elm_Gen_FX_Item *fx_done_it = data;
7407 Elm_Genlist_Smart_Data *sd = GL_IT(fx_done_it->it)->wsd;
7409 if ((!fx_done_it) || (!fx_done_it->it) || (!sd)) return;
7411 evas_object_image_source_visible_set(fx_done_it->proxy, EINA_TRUE);
7412 evas_object_lower(fx_done_it->proxy);
7414 if ((sd->decorate_all_mode) && (fx_done_it->it->deco_all_view))
7415 evas_object_move(fx_done_it->it->deco_all_view, fx_done_it->to.x, fx_done_it->to.y);
7417 evas_object_move(VIEW(fx_done_it->it), fx_done_it->to.x, fx_done_it->to.y);
7418 GL_IT(fx_done_it->it)->has_proxy_it = EINA_FALSE;
7420 evas_object_clip_unset(fx_done_it->proxy);
7424 _item_fx_del_cb(void *data, Elm_Transit *transit __UNUSED__)
7426 Elm_Gen_FX_Item *fx_done_it = data;
7427 Elm_Gen_Item *it = NULL;
7428 Proxy_Item *pi = NULL;
7430 Elm_Genlist_Smart_Data *sd = GL_IT(fx_done_it->it)->wsd;
7432 if ((!fx_done_it) || (!fx_done_it->it) || (!sd)) return;
7434 sd->fx_items = eina_list_remove(sd->fx_items, fx_done_it);
7435 GL_IT(fx_done_it->it)->fi = NULL;
7438 if (!eina_list_count(sd->fx_items))
7440 EINA_LIST_FREE (sd->pending_unrealized_items, it)
7442 if (GL_IT(it)) GL_IT(it)->has_proxy_it = EINA_FALSE;
7443 #if GENLIST_PINCH_ZOOM_SUPPORT
7444 if ((sd->pinch_zoom_mode) && (IS_ROOT_PARENT_IT(it))) continue;
7446 _item_unrealize(it, EINA_FALSE);
7448 EINA_LIST_FREE (sd->pending_unrealized_decorate_all_items, it)
7450 if (GL_IT(it)) GL_IT(it)->has_proxy_it = EINA_FALSE;
7451 #if GENLIST_PINCH_ZOOM_SUPPORT
7452 if ((sd->pinch_zoom_mode) && (IS_ROOT_PARENT_IT(it))) continue;
7454 _decorate_all_item_unrealize(it);
7457 EINA_LIST_FREE (sd->pending_del_items, it)
7460 _elm_widget_item_free((Elm_Widget_Item *)it);
7463 EINA_LIST_FOREACH(sd->capture_before_items, l, pi)
7464 evas_object_hide(pi->proxy);
7465 EINA_LIST_FOREACH(sd->capture_after_items, l, pi)
7466 evas_object_hide(pi->proxy);
7468 sd->fx_playing = EINA_FALSE;
7469 sd->sorting = EINA_FALSE;
7470 sd->fx_first_captured = EINA_FALSE;
7471 evas_object_hide(sd->alpha_bg);
7473 sd->realized_top_item = NULL;
7474 sd->pan_changed = EINA_TRUE;
7475 evas_object_smart_changed(sd->pan_obj);
7480 _sorting_effect_animator_cb(void *data)
7482 Elm_Genlist_Smart_Data *sd = data;
7483 Elm_Gen_FX_Item *fi;
7486 Evas_Coord ox, oy, ow, oh;
7487 evas_object_geometry_get(sd->pan_obj, &ox, &oy, &ow, &oh);
7489 sd->fx_timer = NULL;
7490 EINA_LIST_FOREACH(sd->fx_items, l, fi)
7494 fi->changed = EINA_TRUE;
7495 evas_object_resize(fi->proxy, ow, fi->to.h);
7497 fi->trans = elm_transit_add();
7498 elm_transit_object_add(fi->trans, fi->proxy);
7499 evas_object_image_source_visible_set(fi->proxy, EINA_FALSE);
7500 elm_transit_tween_mode_set(fi->trans, ELM_TRANSIT_TWEEN_MODE_DECELERATE);
7502 elm_transit_effect_translation_add(fi->trans, fi->to.x, fi->to.y - 30 * elm_config_scale_get(), fi->to.x, fi->to.y);
7503 elm_transit_effect_color_add(fi->trans,0, 0, 0, 0, 255,255,255,255);
7505 elm_transit_effect_add(fi->trans, _item_fx_op, fi, _item_fx_done);
7506 elm_transit_del_cb_set(fi->trans, _item_fx_del_cb, fi);
7507 elm_transit_duration_set(fi->trans,0.3);
7508 elm_transit_objects_final_state_keep_set(fi->trans, EINA_FALSE);
7509 elm_transit_go(fi->trans);
7511 return ECORE_CALLBACK_RENEW;
7514 return ECORE_CALLBACK_CANCEL;
7518 _elm_genlist_fx_play(Evas_Object *obj)
7520 ELM_GENLIST_CHECK(obj);
7521 ELM_GENLIST_DATA_GET(obj, sd);
7523 Evas_Coord ox, oy, ow, oh, cvx, cvy, cvw, cvh;
7524 Elm_Gen_FX_Item *fi;
7527 if (!sd->fx_mode) return;
7529 EINA_LIST_FREE(sd->fx_items, fi)
7531 if (fi->trans) elm_transit_del(fi->trans);
7534 _item_cache_all_free(sd);
7536 _elm_genlist_fx_items_make(obj);
7537 if (!eina_list_count(sd->fx_items) || (sd->queue))
7539 _elm_genlist_fx_clear(obj);
7543 sd->fx_playing = EINA_TRUE;
7545 if (!sd->alpha_bg) sd->alpha_bg = _tray_alpha_bg_create(obj);
7546 evas_object_show(sd->alpha_bg);
7548 evas_object_geometry_get(sd->pan_obj, &ox, &oy, &ow, &oh);
7549 evas_output_viewport_get(evas_object_evas_get(obj), &cvx, &cvy, &cvw, &cvh);
7553 EINA_LIST_FOREACH(sd->fx_items, l, fi)
7554 evas_object_image_source_visible_set(fi->proxy, EINA_FALSE);
7555 if (sd->fx_timer) ecore_timer_del(sd->fx_timer);
7556 sd->fx_timer = ecore_timer_add(0.05, _sorting_effect_animator_cb, sd);
7560 EINA_LIST_FOREACH(sd->fx_items, l, fi)
7562 if (!fi->proxy) continue;
7564 if ((fi->from.y <= oy) || (fi->from.y + fi->from.h >= oy + oh))
7566 if ((sd->decorate_all_mode) && (fi->it->deco_all_view))
7567 evas_object_move(fi->it->deco_all_view, cvx, fi->to.y);
7569 evas_object_move(VIEW(fi->it), cvx, fi->to.y);
7571 else if ((fi->to.y <= oy) || (fi->to.y + fi->to.h >= oy + oh))
7573 if ((sd->decorate_all_mode) && (fi->it->deco_all_view))
7574 evas_object_move(fi->it->deco_all_view, cvx, fi->from.y);
7576 evas_object_move(VIEW(fi->it), cvx, fi->from.y);
7579 evas_object_resize(fi->proxy, ow, fi->to.h);
7580 evas_object_show(fi->proxy);
7582 fi->trans = elm_transit_add();
7583 elm_transit_object_add(fi->trans, fi->proxy);
7585 evas_object_image_source_visible_set(fi->proxy, EINA_FALSE);
7586 elm_transit_tween_mode_set(fi->trans, ELM_TRANSIT_TWEEN_MODE_DECELERATE);
7588 if (fi->type == ELM_GEN_ITEM_FX_TYPE_SAME)
7590 evas_object_raise(fi->proxy);
7591 elm_transit_effect_translation_add(fi->trans, fi->from.x, fi->from.y, fi->to.x, fi->to.y);
7594 else if (fi->type == ELM_GEN_ITEM_FX_TYPE_ADD)
7596 elm_transit_effect_translation_add(fi->trans, fi->from.x, fi->from.y, fi->to.x, fi->to.y);
7597 elm_transit_effect_color_add(fi->trans, 0, 0, 0, 0, 255, 255, 255, 255);
7599 else if (fi->type == ELM_GEN_ITEM_FX_TYPE_DEL)
7601 elm_transit_effect_translation_add(fi->trans, fi->from.x, fi->from.y, fi->to.x, fi->to.y);
7602 elm_transit_effect_color_add(fi->trans, 255, 255, 255, 255, 0, 0, 0, 0);
7604 elm_transit_effect_add(fi->trans, _item_fx_op, fi, _item_fx_done);
7605 elm_transit_del_cb_set(fi->trans, _item_fx_del_cb, fi);
7607 elm_transit_duration_set(fi->trans, FX_MOVE_TIME);
7608 elm_transit_objects_final_state_keep_set(fi->trans, EINA_FALSE);
7609 elm_transit_go(fi->trans);
7614 #if GENLIST_PINCH_ZOOM_SUPPORT
7616 elm_genlist_pinch_zoom_mode_set(Evas_Object *obj, Elm_Gen_Pinch_Zoom_Mode mode)
7618 ELM_GENLIST_DATA_GET(obj, sd);
7623 Eina_Bool done = EINA_FALSE;
7625 if ((sd->queue) || (!sd->rendered) || (sd->queue_idle_enterer)) return EINA_FALSE;
7627 EINA_INLIST_FOREACH(sd->blocks, itb)
7629 EINA_LIST_FOREACH(itb->items, l, it)
7632 if (IS_ROOT_PARENT_IT(it))
7640 if (!done) return EINA_FALSE;
7642 sd->pinch_zoom_mode = mode;
7644 _item_cache_all_free(sd);
7645 _elm_genlist_fx_capture(obj, 0);
7647 sd->pinch_pan_y = sd->pan_y;
7649 if (sd->pinch_zoom_mode == ELM_GEN_PINCH_ZOOM_CONTRACT)
7650 sd->s_iface->content_region_show(obj, 0,0,0,0);
7652 sd->pan_changed = EINA_TRUE;
7653 evas_object_smart_changed(sd->pan_obj);
7660 eina_list_sort_merge(Eina_List *a, Eina_List *b, Eina_Compare_Cb func)
7662 Eina_List *first, *last;
7664 if (func(a->data, b->data) > 0)
7666 _item_move_after(a->data, b->data);
7667 a = (last = first = a)->next;
7671 b = (last = first = b)->next;
7674 if (func(a->data, b->data) > 0)
7676 _item_move_after(a->data, b->data);
7677 a = (last = last->next = a)->next;
7680 b = (last = last->next = b)->next;
7682 last->next = a ? a : b;
7688 elm_genlist_sort(Evas_Object *obj, Eina_Compare_Cb func)
7690 ELM_GENLIST_CHECK(obj) NULL;
7691 ELM_GENLIST_DATA_GET(obj, sd);
7692 Eina_List *list = NULL;
7693 Elm_Gen_Item *it, *next;
7694 unsigned int limit = 0, i = 0, n = 0;
7695 Eina_List *tail = NULL, *unsort = NULL, *stack[32], *prev = NULL;
7697 sd->sorting = EINA_TRUE;
7699 it = (Elm_Gen_Item*)elm_genlist_first_item_get(obj);
7702 list = eina_list_append(list, it);
7703 next = (Elm_Gen_Item*)elm_genlist_item_next_get((Elm_Object_Item *)it);
7711 limit = eina_list_count(list);
7715 (limit > list->accounting->count))
7716 limit = list->accounting->count;
7718 if (limit != list->accounting->count)
7720 unsort = eina_list_nth_list(list, limit);
7722 unsort->prev->next = NULL;
7727 unsigned int idx, tmp;
7729 Eina_List *a = tail;
7730 Eina_List *b = tail->next;
7740 if (func(a->data, b->data) > 0)
7741 ((stack[i++] = a)->next = b)->next = 0;
7743 ((stack[i++] = b)->next = a)->next = 0;
7746 for (idx = n ^ tmp; idx &= idx - 1; i--)
7747 stack[i - 2] = eina_list_sort_merge(stack[i - 2], stack[i - 1], func);
7751 stack[i - 1] = eina_list_sort_merge(stack[i - 1], stack[i], func);
7755 for (; stack[0]; stack[0] = stack[0]->next)
7757 stack[0]->prev = prev;
7764 tail->next = unsort;
7765 unsort->prev = tail;
7768 list->accounting->last = tail;
7770 if (!sd->fx_mode) sd->sorting = EINA_FALSE;
7771 if (sd->decorate_all_mode) sd->sorting = EINA_FALSE;
7772 sd->s_iface->content_region_show(obj, 0,0,0,0);
7773 sd->pan_changed = EINA_TRUE;
7774 evas_object_smart_changed(sd->pan_obj);