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);
152 #if GENLIST_FX_SUPPORT
153 static Eina_Bool _elm_genlist_fx_capture(Evas_Object *obj, int level);
154 static void _elm_genlist_fx_play(Evas_Object *obj);
155 static void _elm_genlist_fx_clear(Evas_Object *obj);
156 static void _elm_genlist_proxy_item_del(const Elm_Object_Item *item);
159 #if GENLIST_PINCH_ZOOM_SUPPORT
160 EAPI Eina_Bool elm_genlist_pinch_zoom_mode_set(Evas_Object *obj, Elm_Gen_Pinch_Zoom_Mode mode);
164 _item_cache_all_free(Elm_Genlist_Smart_Data *sd)
166 // It would be better not to use
167 // EINA_INLIST_FOREACH or EINA_INLIST_FOREACH_SAFE
168 while (sd->item_cache)
170 Item_Cache *ic = EINA_INLIST_CONTAINER_GET(sd->item_cache->last, Item_Cache);
171 if (ic->spacer) evas_object_del(ic->spacer);
172 if (ic->base_view) evas_object_del(ic->base_view);
173 if (ic->item_style) eina_stringshare_del(ic->item_style);
174 sd->item_cache = eina_inlist_remove(sd->item_cache, EINA_INLIST_GET(ic));
175 // Free should be performed after inlist is poped
178 sd->item_cache = NULL;
179 sd->item_cache_count = 0;
183 _item_cache_push(Elm_Gen_Item *it)
185 Elm_Genlist_Smart_Data *sd = GL_IT(it)->wsd;
186 Item_Cache *ic = NULL;
188 if (sd->item_cache_count >= sd->item_cache_max)
190 ic = EINA_INLIST_CONTAINER_GET(sd->item_cache->last, Item_Cache);
191 if (ic->spacer) evas_object_del(ic->spacer);
192 if (ic->base_view) evas_object_del(ic->base_view);
193 eina_stringshare_del(ic->item_style);
194 sd->item_cache = eina_inlist_remove(sd->item_cache,
195 sd->item_cache->last);
196 sd->item_cache_count--;
197 // Free should be performed after inlist is poped
200 //evas_event_freeze(evas_object_evas_get(obj));
202 edje_object_mirrored_set(VIEW(it),
203 elm_widget_mirrored_get(WIDGET(it)));
204 edje_object_scale_set(VIEW(it),
205 elm_widget_scale_get(WIDGET(it))
206 * elm_config_scale_get());
208 // FIXME: other callbacks?
209 edje_object_signal_callback_del_full(VIEW(it), "elm,action,expand,toggle",
210 "elm", _expand_toggle_signal_cb, it);
211 edje_object_signal_callback_del_full(VIEW(it), "elm,action,expand", "elm",
212 _expand_signal_cb, it);
213 edje_object_signal_callback_del_full(VIEW(it), "elm,action,contract", "elm",
214 _contract_signal_cb, it);
215 _item_mouse_callbacks_del(it, VIEW(it));
217 #if GENLIST_FX_SUPPORT
218 if ((it->item->nocache_once) || (it->item->nocache) || (sd->pending_del_items))
220 if ((it->item->nocache_once) || (it->item->nocache))
223 if (VIEW(it)) evas_object_del(VIEW(it));
224 if (it->spacer) evas_object_del(it->spacer);
227 ic = ELM_NEW(Item_Cache);
230 if (VIEW(it)) evas_object_del(VIEW(it));
231 if (it->spacer) evas_object_del(it->spacer);
236 ecore_timer_del(it->long_timer);
237 it->long_timer = NULL;
239 if (it->item->swipe_timer)
241 ecore_timer_del(it->item->swipe_timer);
242 it->item->swipe_timer = NULL;
245 ic->base_view = VIEW(it);
246 ic->spacer = it->spacer;
247 ic->item_style = eina_stringshare_add(it->itc->item_style);
248 if (it->item->type & ELM_GENLIST_ITEM_TREE) ic->tree = 1;
250 ic->selected = it->selected;
251 ic->disabled = elm_widget_item_disabled_get(it);
252 ic->expanded = it->item->expanded;
253 if (it->item->type & ELM_GENLIST_ITEM_TREE) ic->tree = 1;
255 edje_object_signal_emit(ic->base_view, "elm,state,unselected", "elm");
256 evas_object_hide(ic->base_view);
258 sd->item_cache = eina_inlist_prepend(sd->item_cache, EINA_INLIST_GET(ic));
259 sd->item_cache_count++;
265 it->realized = EINA_FALSE;
266 it->want_unrealize = EINA_FALSE;
268 //evas_event_thaw(evas_object_evas_get(obj));
269 //evas_event_thaw_eval(evas_object_evas_get(obj));
273 _item_cache_pop(Elm_Gen_Item *it)
275 Item_Cache *ic = NULL;
278 Elm_Genlist_Smart_Data *sd = GL_IT(it)->wsd;
280 if (it->item->nocache_once) {
281 it->item->nocache_once = EINA_FALSE;
284 if (it->item->nocache) return EINA_FALSE;
286 if (it->item->type & ELM_GENLIST_ITEM_TREE) tree = 1;
287 EINA_INLIST_FOREACH_SAFE(sd->item_cache, l, ic)
289 if ((ic->selected) || (ic->disabled) || (ic->expanded))
292 if ((ic->tree == tree) &&
293 (((!it->itc->item_style) && (!ic->item_style)) ||
294 (it->itc->item_style && ic->item_style &&
295 (!strcmp(it->itc->item_style, ic->item_style)))))
298 eina_inlist_remove(sd->item_cache, EINA_INLIST_GET(ic));
299 sd->item_cache_count--;
301 VIEW(it) = ic->base_view;
302 it->spacer = ic->spacer;
304 #if 1 // FIXME: different from upstream
305 // Because of item cache, set state as default after cache item
307 edje_object_signal_emit(VIEW(it),"elm,state,default", "elm");
309 edje_object_signal_callback_add
310 (VIEW(it), "elm,action,expand,toggle", "elm",
311 _expand_toggle_signal_cb, it);
312 edje_object_signal_callback_add
313 (VIEW(it), "elm,action,expand", "elm", _expand_signal_cb, it);
314 edje_object_signal_callback_add
315 (VIEW(it), "elm,action,contract", "elm", _contract_signal_cb, it);
316 _item_mouse_callbacks_add(it, VIEW(it));
318 eina_stringshare_del(ic->item_style);
328 _elm_genlist_pan_smart_pos_set(Evas_Object *obj,
334 ELM_GENLIST_PAN_DATA_GET(obj, psd);
336 if ((x == psd->wsd->pan_x) && (y == psd->wsd->pan_y)) return;
340 EINA_INLIST_FOREACH(psd->wsd->blocks, itb)
342 if ((itb->y + itb->h) > y)
347 EINA_LIST_FOREACH(itb->items, l2, it)
349 if ((itb->y + it->y) >= y)
351 psd->wsd->anchor_item = it;
352 psd->wsd->anchor_y = -(itb->y + it->y - y);
359 if (!psd->wsd->reorder_move_animator) evas_object_smart_changed(obj);
363 _elm_genlist_pan_smart_pos_get(const Evas_Object *obj,
367 ELM_GENLIST_PAN_DATA_GET(obj, psd);
369 if (x) *x = psd->wsd->pan_x;
370 if (y) *y = psd->wsd->pan_y;
374 _elm_genlist_pan_smart_pos_max_get(const Evas_Object *obj,
380 ELM_GENLIST_PAN_DATA_GET(obj, psd);
382 evas_object_geometry_get(obj, NULL, NULL, &ow, &oh);
383 ow = psd->wsd->minw - ow;
385 oh = psd->wsd->minh - oh;
390 #if GENLIST_PINCH_ZOOM_SUPPORT
391 if (psd->wsd->pinch_zoom_mode == ELM_GEN_PINCH_ZOOM_CONTRACT)
393 evas_object_geometry_get(obj, NULL, NULL, &ow, &oh);
394 if (psd->wsd->pinch_zoom_h > oh)
395 *y = psd->wsd->pinch_zoom_h - oh;
402 _elm_genlist_pan_smart_pos_min_get(const Evas_Object *obj __UNUSED__,
411 _elm_genlist_pan_smart_content_size_get(const Evas_Object *obj,
415 ELM_GENLIST_PAN_DATA_GET(obj, psd);
417 if (w) *w = psd->wsd->minw;
418 if (h) *h = psd->wsd->minh;
422 _elm_genlist_pan_smart_add(Evas_Object *obj)
424 /* here just to allocate our extended data */
425 EVAS_SMART_DATA_ALLOC(obj, Elm_Genlist_Pan_Smart_Data);
427 ELM_PAN_CLASS(_elm_genlist_pan_parent_sc)->base.add(obj);
431 _elm_genlist_pan_smart_del(Evas_Object *obj)
433 ELM_GENLIST_PAN_DATA_GET(obj, psd);
437 ecore_job_del(psd->resize_job);
438 psd->resize_job = NULL;
441 _elm_genlist_pan_parent_sc->base.del(obj);
445 _elm_genlist_pan_smart_move(Evas_Object *obj,
446 Evas_Coord x __UNUSED__,
447 Evas_Coord y __UNUSED__)
449 ELM_GENLIST_PAN_DATA_GET(obj, psd);
451 psd->wsd->pan_changed = EINA_TRUE;
452 evas_object_smart_changed(obj);
453 if (psd->wsd->calc_job) ecore_job_del(psd->wsd->calc_job);
454 psd->wsd->calc_job = NULL;
458 _elm_genlist_pan_smart_resize_job(void *data)
460 Elm_Genlist_Pan_Smart_Data *psd = data;
462 elm_layout_sizing_eval(ELM_WIDGET_DATA(psd->wsd)->obj);
463 psd->resize_job = NULL;
467 _elm_genlist_pan_smart_resize(Evas_Object *obj,
473 ELM_GENLIST_PAN_DATA_GET(obj, psd);
475 evas_object_geometry_get(obj, NULL, NULL, &ow, &oh);
476 if ((ow == w) && (oh == h)) return;
477 if ((psd->wsd->mode == ELM_LIST_COMPRESS) && (ow != w))
480 if (psd->resize_job) ecore_job_del(psd->resize_job);
482 ecore_job_add(_elm_genlist_pan_smart_resize_job, psd);
484 psd->wsd->pan_changed = EINA_TRUE;
485 evas_object_smart_changed(obj);
486 if (psd->wsd->calc_job) ecore_job_del(psd->wsd->calc_job);
487 // if the widht changed we may have to resize content if scrollbar went
488 // away or appesared to queue a job to deal with it. it should settle in
489 // the end to a steady-state
491 psd->wsd->calc_job = ecore_job_add(_calc_job, psd->wsd);
493 psd->wsd->calc_job = NULL;
497 _item_scroll(Elm_Genlist_Smart_Data *sd)
500 Elm_Gen_Item *it = NULL;
501 Evas_Coord ow, oh, dx = 0, dy = 0, dw = 0, dh = 0;
503 if (!sd->show_item) return;
505 evas_object_geometry_get(sd->pan_obj, NULL, NULL, &ow, &oh);
507 dx = it->x + it->item->block->x;
508 dy = it->y + it->item->block->y;
509 dw = it->item->block->w;
512 switch (sd->scroll_to_type)
514 case ELM_GENLIST_ITEM_SCROLLTO_TOP:
515 if (it->item->group_item) gith = it->item->group_item->item->h;
519 case ELM_GENLIST_ITEM_SCROLLTO_MIDDLE:
520 dy += ((it->item->h / 2) - (oh / 2));
523 case ELM_GENLIST_ITEM_SCROLLTO_IN:
525 if ((sd->expanded_item) &&
526 ((sd->show_item->y + sd->show_item->item->block->y
527 + sd->show_item->item->h) -
528 (sd->expanded_item->y + sd->expanded_item->item->block->y) > oh))
530 it = sd->expanded_item;
531 if (it->item->group_item) gith = it->item->group_item->item->h;
532 dx = it->x + it->item->block->x;
533 dy = it->y + it->item->block->y - gith;
534 dw = it->item->block->w;
538 if ((it->item->group_item) &&
539 (sd->pan_y > (it->y + it->item->block->y)))
540 gith = it->item->group_item->item->h;
547 sd->s_iface->region_bring_in(ELM_WIDGET_DATA(sd)->obj, dx, dy, dw, dh);
549 sd->s_iface->content_region_show
550 (ELM_WIDGET_DATA(sd)->obj, dx, dy, dw, dh);
552 it->item->show_me = EINA_FALSE;
553 sd->show_item = NULL;
554 sd->auto_scroll_enabled = EINA_FALSE;
555 sd->check_scroll = EINA_FALSE;
559 _item_unrealize(Elm_Gen_Item *it,
562 Evas_Object *content;
566 if (!it->realized) return;
567 if (GL_IT(it)->wsd->reorder_it == it) return;
569 #if GENLIST_FX_SUPPORT
570 if ((GL_IT(it)->has_proxy_it) && (!GL_IT(it)->wsd->genlist_clearing))
572 if (!eina_list_data_find(GL_IT(it)->wsd->pending_unrealized_items, it))
573 GL_IT(it)->wsd->pending_unrealized_items =
574 eina_list_append(GL_IT(it)->wsd->pending_unrealized_items, it);
578 #if GENLIST_ENTRY_SUPPORT
579 if (it->item->unrealize_disabled)
581 evas_object_hide(VIEW(it));
586 //evas_event_freeze(evas_object_evas_get(WIDGET(it)));
588 evas_object_smart_callback_call(WIDGET(it), SIG_UNREALIZED, it);
591 ecore_timer_del(it->long_timer);
592 it->long_timer = NULL;
594 if (it->item->swipe_timer)
596 ecore_timer_del(it->item->swipe_timer);
597 it->item->swipe_timer = NULL;
601 EINA_LIST_FOREACH(it->texts, l, part)
602 edje_object_part_text_set(VIEW(it), part, NULL);
604 elm_widget_stringlist_free(it->texts);
606 elm_widget_stringlist_free(it->contents);
608 elm_widget_stringlist_free(it->states);
610 EINA_LIST_FREE(it->content_objs, content)
612 // FIXME: If parent-child relationship was broken before 'ic'
613 // is deleted, freeze_pop will not be called. ex) elm_slider
614 // If layout is used instead of edje, this problme can be
616 if (0 != elm_widget_scroll_freeze_get(content))
617 elm_widget_scroll_freeze_pop(content);
618 evas_object_del(content);
622 elm_widget_stringlist_free(it->item->flip_contents);
623 it->item->flip_contents = NULL;
624 EINA_LIST_FREE(it->item->flip_content_objs, content)
625 evas_object_del(content);
628 if (_elm_config->access_mode == ELM_ACCESS_MODE_ON)
629 _elm_access_widget_item_unregister((Elm_Widget_Item *)it);
631 // unswallow VIEW(it) first then manipulate VIEW(it)
632 _decorate_item_unrealize(it);
633 _decorate_all_item_unrealize(it);
635 it->realized = EINA_FALSE;
636 _item_cache_push(it);
638 #if GENLIST_ENTRY_SUPPORT
639 it->item->unrealize_disabled = EINA_FALSE;
641 it->want_unrealize = EINA_FALSE;
643 //evas_event_thaw(evas_object_evas_get(WIDGET(it)));
644 //evas_event_thaw_eval(evas_object_evas_get(WIDGET(it)));
648 _item_block_unrealize(Item_Block *itb)
652 Eina_Bool dragging = EINA_FALSE;
654 if (!itb->realized) return;
655 //evas_event_freeze(evas_object_evas_get(ELM_WIDGET_DATA(itb->sd)->obj));
657 EINA_LIST_FOREACH(itb->items, l, it)
659 if (itb->must_recalc || !it->group)
663 dragging = EINA_TRUE;
664 it->want_unrealize = EINA_TRUE;
667 _item_unrealize(it, EINA_FALSE);
672 itb->realized = EINA_FALSE;
673 itb->want_unrealize = EINA_TRUE;
676 itb->want_unrealize = EINA_FALSE;
677 //evas_event_thaw(evas_object_evas_get(ELM_WIDGET_DATA(itb->sd)->obj));
678 //evas_event_thaw_eval(evas_object_evas_get(ELM_WIDGET_DATA(itb->sd)->obj));
682 _must_recalc_idler(void *data)
684 Elm_Genlist_Smart_Data *sd = data;
686 if (sd->calc_job) ecore_job_del(sd->calc_job);
687 sd->calc_job = ecore_job_add(_calc_job, sd);
688 sd->must_recalc_idler = NULL;
689 return ECORE_CALLBACK_CANCEL;
693 _calc_job(void *data)
696 Item_Block *itb, *chb = NULL;
697 Evas_Coord pan_w = 0, pan_h = 0;
698 Elm_Genlist_Smart_Data *sd = data;
699 Eina_Bool minw_change = EINA_FALSE;
700 Eina_Bool did_must_recalc = EINA_FALSE;
701 Evas_Coord minw = -1, minh = 0, y = 0, ow, dy = 0, vw = 0;
703 evas_object_geometry_get(sd->pan_obj, NULL, NULL, &ow, &sd->h);
704 if (sd->mode == ELM_LIST_COMPRESS)
705 sd->s_iface->content_viewport_size_get(ELM_WIDGET_DATA(sd)->obj, &vw, NULL);
707 if (sd->w != ow) sd->w = ow;
709 //evas_event_freeze(evas_object_evas_get(ELM_WIDGET_DATA(sd)->obj));
710 EINA_INLIST_FOREACH(sd->blocks, itb)
712 Eina_Bool show_me = EINA_FALSE;
715 show_me = itb->show_me;
716 itb->show_me = EINA_FALSE;
719 if (itb->realized) _item_block_unrealize(itb);
721 if ((itb->changed) || ((itb->must_recalc) && (!did_must_recalc)))
723 if (itb->must_recalc)
728 EINA_LIST_FOREACH(itb->items, l, it)
729 if (it->item->mincalcd) it->item->mincalcd = EINA_FALSE;
730 itb->changed = EINA_TRUE;
731 did_must_recalc = EINA_TRUE;
732 if (itb->realized) _item_block_unrealize(itb);
733 itb->must_recalc = EINA_FALSE;
735 show_me = _item_block_recalc(itb, in, EINA_FALSE);
741 if (minw == -1) minw = itb->minw;
742 else if ((!itb->must_recalc) && (minw < itb->minw))
745 minw_change = EINA_TRUE;
747 if ((sd->mode == ELM_LIST_COMPRESS) && (minw > vw))
750 minw_change = EINA_TRUE;
756 if ((show_me) && (sd->show_item) && (!sd->show_item->item->queued))
757 sd->check_scroll = EINA_TRUE;
761 EINA_INLIST_FOREACH(sd->blocks, itb)
767 if ((chb) && (EINA_INLIST_GET(chb)->next))
769 EINA_INLIST_FOREACH(EINA_INLIST_GET(chb)->next, itb)
771 if (itb->realized) _item_block_unrealize(itb);
775 if (minw < sd->w) minw = sd->w;
776 if ((minw != sd->minw) || (minh != sd->minh))
780 evas_object_smart_callback_call(sd->pan_obj, "changed", NULL);
781 elm_layout_sizing_eval(ELM_WIDGET_DATA(sd)->obj);
788 if ((sd->anchor_item) && (sd->anchor_item->item->block)
789 && (!sd->auto_scroll_enabled))
794 it = sd->anchor_item;
796 sd->s_iface->content_pos_set
797 (ELM_WIDGET_DATA(sd)->obj, sd->pan_x, it->item->block->y
798 + it->y + it_y, EINA_TRUE);
799 sd->anchor_item = it;
805 if (!sd->must_recalc_idler)
806 sd->must_recalc_idler = ecore_idler_add(_must_recalc_idler, sd);
808 if (sd->check_scroll)
810 _elm_genlist_pan_smart_content_size_get(sd->pan_obj, &pan_w, &pan_h);
811 if (EINA_INLIST_GET(sd->show_item) == sd->items->last)
812 sd->scroll_to_type = ELM_GENLIST_ITEM_SCROLLTO_IN;
814 switch (sd->scroll_to_type)
816 case ELM_GENLIST_ITEM_SCROLLTO_TOP:
820 case ELM_GENLIST_ITEM_SCROLLTO_MIDDLE:
824 case ELM_GENLIST_ITEM_SCROLLTO_IN:
829 if ((sd->show_item) && (sd->show_item->item->block))
831 if ((pan_w > (sd->show_item->x + sd->show_item->item->block->x))
832 && (pan_h > (sd->show_item->y + sd->show_item->item->block->y
841 evas_object_smart_changed(sd->pan_obj);
842 //evas_event_thaw(evas_object_evas_get(ELM_WIDGET_DATA(sd)->obj));
843 //evas_event_thaw_eval(evas_object_evas_get(ELM_WIDGET_DATA(sd)->obj));
847 _elm_genlist_smart_sizing_eval(Evas_Object *obj)
849 Evas_Coord minw = -1, minh = -1, maxw = -1, maxh = -1;
850 Evas_Coord vmw = 0, vmh = 0;
852 ELM_GENLIST_DATA_GET(obj, sd);
854 /* parent class' early call */
855 if (!sd->s_iface) return;
857 if (sd->on_sub_del) return;;
859 evas_object_size_hint_min_get(obj, &minw, NULL);
860 evas_object_size_hint_max_get(obj, &maxw, &maxh);
862 edje_object_size_min_calc(ELM_WIDGET_DATA(sd)->resize_obj, &vmw, &vmh);
864 if (sd->mode == ELM_LIST_COMPRESS)
868 sd->s_iface->content_viewport_size_get(obj, &vw, &vh);
869 if ((vw != 0) && (vw != sd->prev_viewport_w))
873 sd->prev_viewport_w = vw;
875 EINA_INLIST_FOREACH(sd->blocks, itb)
877 itb->must_recalc = EINA_TRUE;
879 if (sd->calc_job) ecore_job_del(sd->calc_job);
880 sd->calc_job = ecore_job_add(_calc_job, sd);
885 else if (sd->mode == ELM_LIST_LIMIT)
888 minw = vmw + sd->realminw;
896 evas_object_size_hint_min_set(obj, minw, minh);
897 evas_object_size_hint_max_set(obj, maxw, maxh);
901 _item_position(Elm_Gen_Item *it,
909 //evas_event_freeze(evas_object_evas_get(ELM_WIDGET_DATA(GL_IT(it)->wsd)->obj));
910 evas_object_resize(view, it->item->w, it->item->h);
911 evas_object_move(view, it_x, it_y);
912 evas_object_show(view);
913 //evas_event_thaw(evas_object_evas_get(ELM_WIDGET_DATA(GL_IT(it)->wsd)->obj));
914 //evas_event_thaw_eval(evas_object_evas_get(ELM_WIDGET_DATA(GL_IT(it)->wsd)->obj));
918 _item_sub_items_clear(Elm_Gen_Item *it)
921 Elm_Object_Item *it2;
923 EINA_LIST_FOREACH_SAFE(it->item->items, l, ll, it2)
924 elm_widget_item_del(it2);
928 _item_auto_scroll(Elm_Genlist_Smart_Data *sd)
930 Elm_Gen_Item *tmp_item = NULL;
932 #if GENLIST_FX_SUPPORT
933 if (sd->fx_first_captured) return;
935 if ((sd->expanded_item) && (sd->auto_scroll_enabled))
937 tmp_item = eina_list_data_get
938 (eina_list_last(sd->expanded_item->item->items));
939 if (!tmp_item) return;
940 sd->show_item = tmp_item;
941 sd->bring_in = EINA_TRUE;
942 sd->scroll_to_type = ELM_GENLIST_ITEM_SCROLLTO_IN;
943 if ((sd->show_item->item->queued) || (!sd->show_item->item->mincalcd))
945 sd->show_item->item->show_me = EINA_TRUE;
946 sd->auto_scroll_enabled = EINA_FALSE;
954 _elm_genlist_item_odd_even_update(Elm_Gen_Item *it)
956 if (!it->item->nostacking)
958 if ((it->item->order_num_in & 0x1) ^ it->item->stacking_even)
960 if (it->deco_all_view) evas_object_lower(it->deco_all_view);
961 else evas_object_lower(VIEW(it));
965 if (it->deco_all_view) evas_object_raise(it->deco_all_view);
966 else evas_object_raise(VIEW(it));
970 if (it->item->order_num_in & 0x1)
972 edje_object_signal_emit(VIEW(it), "elm,state,odd", "elm");
973 if (it->deco_all_view)
974 edje_object_signal_emit(it->deco_all_view, "elm,state,odd", "elm");
978 edje_object_signal_emit(VIEW(it), "elm,state,even", "elm");
979 if (it->deco_all_view)
980 edje_object_signal_emit(it->deco_all_view, "elm,state,even", "elm");
985 _item_order_update(const Eina_Inlist *l,
988 Elm_Gen_Item *it, *it2;
990 for (it = ELM_GEN_ITEM_FROM_INLIST(l); l; l = l->next,
991 it = ELM_GEN_ITEM_FROM_INLIST(l))
993 it->item->order_num_in = start++;
994 _elm_genlist_item_odd_even_update(it);
995 it2 = ELM_GEN_ITEM_FROM_INLIST(l->next);
996 if (it2 && (it->item->order_num_in != it2->item->order_num_in))
1002 _elm_genlist_item_state_update(Elm_Gen_Item *it,
1007 if (it->selected != itc->selected)
1011 if (it->deco_all_view)
1012 edje_object_signal_emit
1013 (it->deco_all_view, "elm,state,selected", "elm,nosound");
1014 edje_object_signal_emit
1015 (VIEW(it), "elm,state,selected", "elm,nosound");
1016 evas_object_smart_callback_call(WIDGET(it), SIG_HIGHLIGHTED, it);
1019 if (elm_widget_item_disabled_get(it) != itc->disabled)
1021 if (elm_widget_item_disabled_get(it))
1022 edje_object_signal_emit(VIEW(it), "elm,state,disabled", "elm");
1023 if (it->deco_all_view)
1024 edje_object_signal_emit
1025 (it->deco_all_view, "elm,state,disabled", "elm");
1027 if (it->item->expanded != itc->expanded)
1029 if (it->item->expanded)
1030 edje_object_signal_emit(VIEW(it), "elm,state,expanded", "elm");
1031 if (it->deco_all_view)
1032 edje_object_signal_emit
1033 (it->deco_all_view, "elm,state,expanded", "elm");
1040 if (it->deco_all_view)
1041 edje_object_signal_emit
1042 (it->deco_all_view, "elm,state,selected", "elm,nosound");
1043 edje_object_signal_emit
1044 (VIEW(it), "elm,state,selected", "elm,nosound");
1045 evas_object_smart_callback_call(WIDGET(it), SIG_HIGHLIGHTED, it);
1047 if (elm_widget_item_disabled_get(it))
1049 edje_object_signal_emit(VIEW(it), "elm,state,disabled", "elm");
1050 if (it->deco_all_view)
1051 edje_object_signal_emit
1052 (it->deco_all_view, "elm,state,disabled", "elm");
1054 if (it->item->expanded)
1056 edje_object_signal_emit(VIEW(it), "elm,state,expanded", "elm");
1057 if (it->deco_all_view)
1058 edje_object_signal_emit
1059 (it->deco_all_view, "elm,state,expanded", "elm");
1065 _elm_genlist_item_index_update(Elm_Gen_Item *it)
1067 if (it->position_update || it->item->block->position_update)
1069 evas_object_smart_callback_call(WIDGET(it), SIG_INDEX_UPDATE, it);
1070 it->position_update = EINA_FALSE;
1075 _item_text_realize(Elm_Gen_Item *it,
1076 Evas_Object *target,
1080 if (it->itc->func.text_get)
1086 *source = elm_widget_stringlist_get
1087 (edje_object_data_get(target, "texts"));
1088 EINA_LIST_FOREACH(*source, l, key)
1090 if (parts && fnmatch(parts, key, FNM_PERIOD))
1093 char *s = it->itc->func.text_get
1094 ((void *)it->base.data, WIDGET(it), key);
1098 edje_object_part_text_escaped_set(target, key, s);
1103 edje_object_part_text_set(target, key, "");
1110 // FIXME: difference from upstream
1112 _content_focused(void *data, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
1114 Elm_Gen_Item *it = data;
1115 if (it) it->defer_unrealize = EINA_TRUE;
1119 _content_unfocused(void *data, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
1121 Elm_Gen_Item *it = data;
1122 if (it) it->defer_unrealize = EINA_FALSE;
1127 _item_mode_content_realize(Elm_Gen_Item *it,
1128 Evas_Object *target,
1131 Eina_List **contents_list)
1133 Eina_List *res = *contents_list;
1135 if (it->itc->func.content_get)
1141 EINA_LIST_FOREACH(*source, l, key)
1143 if (parts && fnmatch(parts, key, FNM_PERIOD))
1146 ic = it->itc->func.content_get
1147 ((void *)it->base.data, WIDGET(it), key);
1151 res = eina_list_append(res, ic);
1152 edje_object_part_swallow(target, key, ic);
1153 evas_object_show(ic);
1154 #if GENLIST_ENTRY_SUPPORT
1157 // For entry or editfield
1158 // 1. Add resize callback for multiline entry.
1159 // 2. Do not unrealize it for focus issue
1160 // ps. Only for entry because of performnace
1161 if (!strcmp("elm_layout", evas_object_type_get(ic)))
1163 // If editfield style, it can have entry.
1165 edje_object_file_get(elm_layout_edje_get(ic), NULL, &group);
1166 if (group && !strncmp("elm/layout/editfield/", group, 20))
1167 it->item->unrealize_disabled = EINA_TRUE;
1169 else if (!strcmp("elm_entry", evas_object_type_get(ic)))
1170 it->item->unrealize_disabled = EINA_TRUE;
1174 // FIXME: difference from upstream
1177 // FIXME: if entry calcuates its cursor position correctly and conformant works,
1178 // genlist does not need to handle this focus thing.
1179 evas_object_smart_callback_add(ic, "focused", _content_focused, it);
1180 evas_object_smart_callback_add(ic, "unfocused", _content_unfocused, it);
1183 if (elm_widget_item_disabled_get(it))
1184 elm_widget_disabled_set(ic, EINA_TRUE);
1193 _item_state_realize(Elm_Gen_Item *it,
1194 Evas_Object *target,
1198 if (it->itc->func.state_get)
1205 *source = elm_widget_stringlist_get
1206 (edje_object_data_get(target, "states"));
1207 EINA_LIST_FOREACH(*source, l, key)
1209 if (parts && fnmatch(parts, key, FNM_PERIOD))
1212 Eina_Bool on = it->itc->func.state_get
1213 ((void *)it->base.data, WIDGET(it), key);
1217 snprintf(buf, sizeof(buf), "elm,state,%s,active", key);
1218 edje_object_signal_emit(target, buf, "elm");
1222 snprintf(buf, sizeof(buf), "elm,state,%s,passive", key);
1223 edje_object_signal_emit(target, buf, "elm");
1230 _decorate_item_unrealize(Elm_Gen_Item *it)
1232 Elm_Genlist_Smart_Data *sd = GL_IT(it)->wsd;
1233 Evas_Object *content;
1235 if (!it->item->deco_it_view) return;
1237 //evas_event_freeze(evas_object_evas_get(obj));
1238 elm_widget_stringlist_free(it->item->deco_it_texts);
1239 it->item->deco_it_texts = NULL;
1240 elm_widget_stringlist_free(it->item->deco_it_contents);
1241 it->item->deco_it_contents = NULL;
1242 elm_widget_stringlist_free(it->item->deco_it_states);
1244 EINA_LIST_FREE (it->item->deco_it_content_objs, content)
1245 evas_object_del(content);
1247 edje_object_part_unswallow(it->item->deco_it_view, VIEW(it));
1248 evas_object_smart_member_add(VIEW(it), sd->pan_obj);
1249 evas_object_del(it->item->deco_it_view);
1250 it->item->deco_it_view = NULL;
1252 if (sd->mode_item == it) sd->mode_item = NULL;
1253 //evas_event_thaw(evas_object_evas_get(obj));
1254 //evas_event_thaw_eval(evas_object_evas_get(obj));
1259 _decorate_all_item_position(Elm_Gen_Item *it,
1263 evas_object_resize(it->deco_all_view, it->item->w, it->item->h);
1264 evas_object_move(it->deco_all_view, itx, ity);
1268 _decorate_all_item_realize(Elm_Gen_Item *it,
1269 Eina_Bool effect_on)
1272 const char *stacking;
1273 const char *stacking_even;
1275 if ((!it) || (it->item->decorate_all_item_realized)) return;
1277 if (it->item->deco_it_view) _decorate_item_unrealize(it);
1279 it->deco_all_view = edje_object_add(evas_object_evas_get(WIDGET(it)));
1280 edje_object_scale_set(it->deco_all_view, elm_widget_scale_get(WIDGET(it)) *
1281 elm_config_scale_get());
1282 evas_object_smart_member_add(it->deco_all_view, GL_IT(it)->wsd->pan_obj);
1283 elm_widget_sub_object_add(WIDGET(it), it->deco_all_view);
1285 if (it->item->type & ELM_GENLIST_ITEM_TREE)
1286 strncpy(buf, "tree", sizeof(buf));
1287 else strncpy(buf, "item", sizeof(buf));
1288 if (GL_IT(it)->wsd->mode == ELM_LIST_COMPRESS)
1289 strncat(buf, "_compress", sizeof(buf) - strlen(buf));
1291 strncat(buf, "/", sizeof(buf) - strlen(buf));
1292 strncat(buf, it->itc->decorate_all_item_style, sizeof(buf) - strlen(buf));
1294 elm_widget_theme_object_set(WIDGET(it), it->deco_all_view, "genlist", buf,
1295 elm_widget_style_get(WIDGET(it)));
1297 stacking_even = edje_object_data_get(VIEW(it), "stacking_even");
1298 if (!stacking_even) stacking_even = "above";
1299 it->item->stacking_even = !!strcmp("above", stacking_even);
1301 stacking = edje_object_data_get(VIEW(it), "stacking");
1302 if (!stacking) stacking = "yes";
1303 it->item->nostacking = !!strcmp("yes", stacking);
1305 edje_object_mirrored_set
1306 (it->deco_all_view, elm_widget_mirrored_get(WIDGET(it)));
1308 _elm_genlist_item_odd_even_update(it);
1309 _elm_genlist_item_state_update(it, NULL);
1311 #if 1 // FIXME: difference from upstream
1312 if (GL_IT(it)->wsd->reorder_mode)
1314 edje_object_signal_emit
1315 (VIEW(it), "elm,state,reorder,mode_unset", "elm");
1316 edje_object_signal_emit
1317 (it->deco_all_view, "elm,state,reorder,mode_set", "elm");
1322 edje_object_signal_emit
1323 (it->deco_all_view, "elm,state,decorate,enabled,effect", "elm");
1324 edje_object_signal_emit
1325 (VIEW(it), "elm,state,decorate,enabled,effect", "elm");
1329 edje_object_signal_emit
1330 (it->deco_all_view, "elm,state,decorate,enabled", "elm");
1331 edje_object_signal_emit
1332 (VIEW(it), "elm,state,decorate,enabled", "elm");
1334 _item_mouse_callbacks_del(it, VIEW(it));
1335 _item_mouse_callbacks_add(it, it->deco_all_view);
1337 _item_text_realize(it, it->deco_all_view, &it->item->deco_all_texts, NULL);
1339 edje_object_signal_emit
1340 (it->deco_all_view, "elm,state,flip,enabled", "elm");
1341 if (!it->item->deco_all_contents)
1342 it->item->deco_all_contents = elm_widget_stringlist_get
1343 (edje_object_data_get(it->deco_all_view, "contents"));
1344 it->item->deco_all_content_objs =
1345 _item_mode_content_realize(it, it->deco_all_view,
1346 &it->item->deco_all_contents, NULL,
1347 &it->item->deco_all_content_objs);
1349 (it, it->deco_all_view, &it->item->deco_all_states, NULL);
1350 edje_object_part_swallow
1351 (it->deco_all_view, "elm.swallow.decorate.content", VIEW(it));
1353 _decorate_all_item_position(it, it->item->scrl_x, it->item->scrl_y);
1354 evas_object_show(it->deco_all_view);
1358 edje_object_signal_emit(it->deco_all_view, "elm,state,selected", "elm");
1359 evas_object_smart_callback_call(WIDGET(it), SIG_HIGHLIGHTED, it);
1362 it->item->decorate_all_item_realized = EINA_TRUE;
1363 it->want_unrealize = EINA_FALSE;
1367 _expand_toggle_signal_cb(void *data,
1368 Evas_Object *obj __UNUSED__,
1369 const char *emission __UNUSED__,
1370 const char *source __UNUSED__)
1372 Elm_Gen_Item *it = data;
1374 if (it->item->expanded)
1375 evas_object_smart_callback_call(WIDGET(it), SIG_CONTRACT_REQUEST, it);
1377 evas_object_smart_callback_call(WIDGET(it), SIG_EXPAND_REQUEST, it);
1381 _expand_signal_cb(void *data,
1382 Evas_Object *obj __UNUSED__,
1383 const char *emission __UNUSED__,
1384 const char *source __UNUSED__)
1386 Elm_Gen_Item *it = data;
1388 if (!it->item->expanded)
1389 evas_object_smart_callback_call(WIDGET(it), SIG_EXPAND_REQUEST, it);
1393 _contract_signal_cb(void *data,
1394 Evas_Object *obj __UNUSED__,
1395 const char *emission __UNUSED__,
1396 const char *source __UNUSED__)
1398 Elm_Gen_Item *it = data;
1400 if (it->item->expanded)
1401 evas_object_smart_callback_call(WIDGET(it), SIG_CONTRACT_REQUEST, it);
1404 #if GENLIST_ENTRY_SUPPORT
1406 _changed_size_hints(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
1408 Elm_Gen_Item *it = data;
1410 if (it->want_unrealize) return;
1411 it->item->mincalcd = EINA_FALSE;
1412 it->item->block->changeme = EINA_TRUE;
1413 GL_IT(it)->wsd->size_changed = EINA_TRUE;
1414 evas_object_smart_changed(GL_IT(it)->wsd->pan_obj);
1419 _item_content_realize(Elm_Gen_Item *it,
1420 Evas_Object *target,
1424 Eina_List *res = it->content_objs;
1426 if (it->itc->func.content_get)
1430 Evas_Object *ic = NULL;
1433 *source = elm_widget_stringlist_get
1434 (edje_object_data_get(target, "contents"));
1436 EINA_LIST_FOREACH(*source, l, key)
1438 if (parts && fnmatch(parts, key, FNM_PERIOD))
1441 if (it->itc->func.content_get)
1442 ic = it->itc->func.content_get
1443 ((void *)it->base.data, WIDGET(it), key);
1446 res = eina_list_append(res, ic);
1447 edje_object_part_swallow(target, key, ic);
1448 evas_object_show(ic);
1450 #if GENLIST_ENTRY_SUPPORT
1451 // For entry or editfield
1452 // 1. Add resize callback for multiline entry.
1453 // 2. Do not unrealize it for focus issue
1454 // ps. Only for entry because of performnace
1455 if (!strcmp("elm_layout", evas_object_type_get(ic)))
1457 // If editfield style, it can have entry.
1459 edje_object_file_get(elm_layout_edje_get(ic), NULL, &group);
1460 if (group && !strncmp("elm/layout/editfield/", group, 20))
1462 evas_object_event_callback_add
1463 (ic, EVAS_CALLBACK_CHANGED_SIZE_HINTS,
1464 _changed_size_hints, it);
1465 it->item->unrealize_disabled = EINA_TRUE;
1469 else if (!strcmp("elm_entry", evas_object_type_get(ic)))
1471 evas_object_event_callback_add
1472 (ic, EVAS_CALLBACK_CHANGED_SIZE_HINTS,
1473 _changed_size_hints, it);
1474 it->item->unrealize_disabled = EINA_TRUE;
1477 #if 0 // FIXME: difference from upstream
1480 // FIXME: if entry calcuates its cursor position correctly and conformant works,
1481 // genlist does not need to handle this focus thing.
1482 evas_object_smart_callback_add(ic, "focused", _content_focused, it);
1483 evas_object_smart_callback_add(ic, "unfocused", _content_unfocused, it);
1486 if (elm_widget_item_disabled_get(it))
1487 elm_widget_disabled_set(ic, EINA_TRUE);
1496 _access_info_cb(void *data, Evas_Object *obj __UNUSED__)
1501 Elm_Gen_Item *it = (Elm_Gen_Item *)data;
1502 ELM_GENLIST_ITEM_CHECK_OR_RETURN(it, NULL);
1504 buf = eina_strbuf_new();
1506 if (it->itc->func.text_get)
1511 if (!(it->texts)) it->texts =
1512 elm_widget_stringlist_get(edje_object_data_get(VIEW(it), "texts"));
1514 EINA_LIST_FOREACH(it->texts, l, key)
1516 char *s = it->itc->func.text_get
1517 ((void *)it->base.data, WIDGET(it), key);
1519 s = _elm_util_mkup_to_text(s);
1523 if (eina_strbuf_length_get(buf) > 0) eina_strbuf_append(buf, ", ");
1524 eina_strbuf_append(buf, s);
1530 ret = eina_strbuf_string_steal(buf);
1531 eina_strbuf_free(buf);
1536 _access_state_cb(void *data, Evas_Object *obj __UNUSED__)
1538 Elm_Gen_Item *it = (Elm_Gen_Item *)data;
1539 ELM_GENLIST_ITEM_CHECK_OR_RETURN(it, NULL);
1541 if (it->base.disabled)
1542 return strdup(E_("State: Disabled"));
1548 _access_on_highlight_cb(void *data)
1550 Evas_Coord x, y, w, h;
1551 Evas_Coord sx, sy, sw, sh;
1552 Elm_Gen_Item *it = (Elm_Gen_Item *)data;
1553 ELM_GENLIST_ITEM_CHECK_OR_RETURN(it);
1555 ELM_GENLIST_DATA_GET(it->base.widget, sd);
1557 evas_object_geometry_get(it->base.view, &x, &y, &w, &h);
1558 // XXX There would be a reason.
1559 if ((w == 0) && (h == 0)) return;
1561 evas_object_geometry_get(ELM_WIDGET_DATA(sd)->obj, &sx, &sy, &sw, &sh);
1562 if ((x < sx) || (y < sy) || ((x + w) > (sx + sw)) || ((y + h) > (sy + sh)))
1563 elm_genlist_item_bring_in((Elm_Object_Item *)it,
1564 ELM_GENLIST_ITEM_SCROLLTO_IN);
1568 _access_widget_item_register(Elm_Gen_Item *it)
1570 Elm_Access_Info *ai;
1572 _elm_access_widget_item_register((Elm_Widget_Item *)it);
1574 ai = _elm_access_object_get(it->base.access_obj);
1576 _elm_access_callback_set(ai, ELM_ACCESS_INFO, _access_info_cb, it);
1577 _elm_access_callback_set(ai, ELM_ACCESS_STATE, _access_state_cb, it);
1578 _elm_access_on_highlight_hook_set(ai, _access_on_highlight_cb, it);
1579 _elm_access_activate_callback_set(ai, _access_activate_cb, it);
1583 _item_realize(Elm_Gen_Item *it,
1587 Item_Cache *itc = NULL;
1588 const char *treesize;
1594 if (it->item->order_num_in != in)
1596 _item_order_update(EINA_INLIST_GET(it), in);
1597 _elm_genlist_item_state_update(it, NULL);
1598 _elm_genlist_item_index_update(it);
1602 it->item->order_num_in = in;
1604 if (it->item->nocache_once | it->item->nocache ||
1605 it->item->type == ELM_GENLIST_ITEM_TREE || it->parent ||
1606 !_item_cache_pop(it))
1608 const char *stacking_even;
1609 const char *stacking;
1611 it->item->nocache_once = EINA_FALSE;
1613 VIEW(it) = edje_object_add(evas_object_evas_get(WIDGET(it)));
1614 edje_object_scale_set(VIEW(it),
1615 elm_widget_scale_get(WIDGET(it)) *
1616 elm_config_scale_get());
1617 evas_object_smart_member_add(VIEW(it), GL_IT(it)->wsd->pan_obj);
1618 elm_widget_sub_object_add(WIDGET(it), VIEW(it));
1620 if (it->item->type & ELM_GENLIST_ITEM_TREE)
1621 snprintf(buf, sizeof(buf), "tree%s/%s",
1622 GL_IT(it)->wsd->mode == ELM_LIST_COMPRESS ? "_compress" :
1623 "", it->itc->item_style ? : "default");
1625 snprintf(buf, sizeof(buf), "item%s/%s",
1626 GL_IT(it)->wsd->mode == ELM_LIST_COMPRESS ? "_compress" :
1627 "", it->itc->item_style ? : "default");
1629 elm_widget_theme_object_set
1630 (WIDGET(it), VIEW(it), "genlist", buf,
1631 elm_widget_style_get(WIDGET(it)));
1633 #if 1 // FIXME: difference from upstream
1634 if (it->item->expanded_depth > 0)
1635 edje_object_signal_emit(VIEW(it), "bg_color_change", "elm");
1638 stacking_even = edje_object_data_get(VIEW(it), "stacking_even");
1639 if (!stacking_even) stacking_even = "above";
1640 it->item->stacking_even = !!strcmp("above", stacking_even);
1642 stacking = edje_object_data_get(VIEW(it), "stacking");
1643 if (!stacking) stacking = "yes";
1644 it->item->nostacking = !!strcmp("yes", stacking);
1646 edje_object_mirrored_set
1647 (VIEW(it), elm_widget_mirrored_get(WIDGET(it)));
1649 edje_object_signal_callback_add
1650 (VIEW(it), "elm,action,expand,toggle", "elm",
1651 _expand_toggle_signal_cb, it);
1652 edje_object_signal_callback_add
1653 (VIEW(it), "elm,action,expand", "elm", _expand_signal_cb, it);
1654 edje_object_signal_callback_add
1655 (VIEW(it), "elm,action,contract", "elm", _contract_signal_cb, it);
1656 _item_mouse_callbacks_add(it, VIEW(it));
1660 if (_elm_config->access_mode) _access_widget_item_register(it);
1662 _item_order_update(EINA_INLIST_GET(it), in);
1663 #if 1 // FIXME: difference from upstream
1664 if (!(it->deco_all_view) && (it->item->type != ELM_GENLIST_ITEM_GROUP))
1666 if (GL_IT(it)->wsd->reorder_mode)
1667 edje_object_signal_emit
1668 (VIEW(it), "elm,state,reorder,mode_set", "elm");
1670 edje_object_signal_emit
1671 (VIEW(it), "elm,state,reorder,mode_unset", "elm");
1674 treesize = edje_object_data_get(VIEW(it), "treesize");
1675 if (treesize) tsize = atoi(treesize);
1676 if (it->parent && GL_IT(it->parent)->type == ELM_GENLIST_ITEM_TREE &&
1677 !it->spacer && treesize)
1680 evas_object_rectangle_add(evas_object_evas_get(WIDGET(it)));
1681 evas_object_color_set(it->spacer, 0, 0, 0, 0);
1685 evas_object_size_hint_min_set
1686 (it->spacer, (it->item->expanded_depth * tsize) *
1687 elm_config_scale_get(), 1);
1688 edje_object_part_swallow(VIEW(it), "elm.swallow.pad", it->spacer);
1692 if ((GL_IT(it)->wsd->decorate_all_mode) && (!it->deco_all_view) &&
1693 (it->item->type != ELM_GENLIST_ITEM_GROUP) &&
1694 (it->itc->decorate_all_item_style))
1695 _decorate_all_item_realize(it, EINA_FALSE);
1697 _elm_genlist_item_state_update(it, itc);
1698 _elm_genlist_item_index_update(it);
1701 /* homogenous genlist shortcut */
1702 if ((calc) && (GL_IT(it)->wsd->homogeneous) && (!it->item->mincalcd) &&
1703 ((it->group && GL_IT(it)->wsd->group_item_width) ||
1704 (!it->group && GL_IT(it)->wsd->item_width)))
1708 it->item->w = it->item->minw = GL_IT(it)->wsd->group_item_width;
1709 it->item->h = it->item->minh = GL_IT(it)->wsd->group_item_height;
1713 it->item->w = it->item->minw = GL_IT(it)->wsd->item_width;
1714 it->item->h = it->item->minh = GL_IT(it)->wsd->item_height;
1716 it->item->mincalcd = EINA_TRUE;
1720 if (eina_list_count(it->content_objs) != 0)
1721 ERR_ABORT("If you see this error, please notify us and we"
1724 _item_text_realize(it, VIEW(it), &it->texts, NULL);
1726 _item_content_realize(it, VIEW(it), &it->contents, NULL);
1727 _item_state_realize(it, VIEW(it), &it->states, NULL);
1730 edje_object_signal_emit
1731 (VIEW(it), "elm,state,flip,enabled", "elm");
1732 // This is needed before contents are swallowed
1733 edje_object_message_signal_process(VIEW(it));
1735 if (!(it->item->flip_contents))
1736 it->item->flip_contents = elm_widget_stringlist_get
1737 (edje_object_data_get(VIEW(it), "flips"));
1738 it->item->flip_content_objs = _item_mode_content_realize
1739 (it, VIEW(it), &it->item->flip_contents, NULL,
1740 &it->item->flip_content_objs);
1743 /* access: unregister item which have no text and content */
1744 if (_elm_config->access_mode && !it->texts && !it->contents)
1745 _elm_access_widget_item_unregister((Elm_Widget_Item *)it);
1748 // FIXME: difference from upstream
1749 if (!it->item->mincalcd || ((GL_IT(it)->wsd->mode == ELM_LIST_COMPRESS) && (it->item->w != it->item->minw)))
1751 if (!it->item->mincalcd)
1754 Evas_Coord mw = -1, mh = -1;
1756 if (it->select_mode != ELM_OBJECT_SELECT_MODE_DISPLAY_ONLY)
1757 elm_coords_finger_size_adjust(1, &mw, 1, &mh);
1758 if (GL_IT(it)->wsd->mode == ELM_LIST_COMPRESS)
1759 mw = GL_IT(it)->wsd->prev_viewport_w;
1760 edje_object_size_min_restricted_calc(VIEW(it), &mw, &mh, mw, mh);
1762 it->item->w = it->item->minw = mw;
1763 it->item->h = it->item->minh = mh;
1764 it->item->mincalcd = EINA_TRUE;
1766 if ((!GL_IT(it)->wsd->group_item_width) && (it->group))
1768 GL_IT(it)->wsd->group_item_width = mw;
1769 GL_IT(it)->wsd->group_item_height = mh;
1771 else if ((!GL_IT(it)->wsd->item_width) &&
1772 (it->item->type == ELM_GENLIST_ITEM_NONE))
1774 GL_IT(it)->wsd->item_width = mw;
1775 GL_IT(it)->wsd->item_height = mh;
1778 if (!calc) evas_object_show(VIEW(it));
1781 if (it->tooltip.content_cb)
1783 elm_widget_item_tooltip_content_cb_set
1784 (it, it->tooltip.content_cb, it->tooltip.data, NULL);
1785 elm_widget_item_tooltip_style_set(it, it->tooltip.style);
1786 elm_widget_item_tooltip_window_mode_set(it, it->tooltip.free_size);
1789 if (it->mouse_cursor)
1790 elm_widget_item_cursor_set(it, it->mouse_cursor);
1792 it->realized = EINA_TRUE;
1793 it->want_unrealize = EINA_FALSE;
1795 if (!calc || it->item->unrealize_disabled)
1796 evas_object_smart_callback_call(WIDGET(it), SIG_REALIZED, it);
1798 if ((!calc) && (GL_IT(it)->wsd->decorate_all_mode) &&
1799 (it->item->type != ELM_GENLIST_ITEM_GROUP))
1801 if (it->itc->decorate_all_item_style)
1803 if (!it->deco_all_view)
1804 _decorate_all_item_realize(it, EINA_FALSE);
1805 edje_object_message_signal_process(it->deco_all_view);
1808 if ((!calc) && (it->decorate_it_set) &&
1809 (it->item->type != ELM_GENLIST_ITEM_GROUP))
1811 if (it->itc->decorate_item_style)
1813 if (!it->item->deco_it_view)
1814 _decorate_item_set(it);
1815 edje_object_message_signal_process(it->item->deco_it_view);
1818 edje_object_message_signal_process(VIEW(it));
1821 #if GENLIST_PINCH_ZOOM_SUPPORT
1823 _pinch_items_recalc(void *data)
1825 Elm_Genlist_Smart_Data *sd = data;
1830 Evas_Coord tot_y = 0, ox, oy;
1831 evas_object_geometry_get(sd->pan_obj, &ox, &oy, NULL, NULL);
1833 EINA_INLIST_FOREACH(sd->blocks, itb)
1835 EINA_LIST_FOREACH(itb->items, l, it)
1838 if (IS_ROOT_PARENT_IT(it))
1840 if (sd->pinch_zoom_mode == ELM_GEN_PINCH_ZOOM_CONTRACT)
1842 if (!it->realized) _item_realize(it, 0, EINA_FALSE);
1843 it->item->scrl_y = oy + tot_y - sd->pan_y;
1844 evas_object_resize(VIEW(it), sd->minw, it->item->h);
1845 evas_object_move(VIEW(it), it->item->scrl_x, it->item->scrl_y);
1846 evas_object_show(VIEW(it));
1847 evas_object_raise(VIEW(it));
1848 tot_y += it->item->h;
1849 sd->pinch_zoom_h = tot_y;
1852 else if (sd->pinch_zoom_mode == ELM_GEN_PINCH_ZOOM_EXPAND)
1854 evas_object_resize(VIEW(it), sd->minw, it->item->h);
1855 it->item->scrl_y = oy + it->item->pan_scrl_y - sd->pan_y;
1856 evas_object_move(VIEW(it), it->item->scrl_x, it->item->scrl_y);
1865 #if GROUP_ITEMS_FEATURE
1867 _group_items_recalc(void *data)
1871 Elm_Genlist_Smart_Data *sd = data;
1873 //evas_event_freeze(evas_object_evas_get(ELM_WIDGET_DATA(sd)->obj));
1874 EINA_LIST_FOREACH(sd->group_items, l, git)
1876 if (git->item->want_realize)
1878 if (!git->realized) _item_realize(git, 0, EINA_FALSE);
1879 evas_object_resize(VIEW(git), sd->minw, git->item->h);
1880 evas_object_move(VIEW(git), git->item->scrl_x, git->item->scrl_y);
1881 evas_object_show(VIEW(git));
1882 evas_object_raise(VIEW(git));
1884 else if (!git->item->want_realize)
1887 _item_unrealize(git, EINA_FALSE);
1890 //evas_event_thaw(evas_object_evas_get(ELM_WIDGET_DATA(sd)->obj));
1891 //evas_event_thaw_eval(evas_object_evas_get(ELM_WIDGET_DATA(sd)->obj));
1896 _reorder_move_animator_cb(void *data)
1899 Elm_Gen_Item *it = data;
1900 Eina_Bool down = EINA_FALSE;
1903 dy = 6 * elm_config_scale_get();
1904 t = ((0.0 > (t = ecore_loop_time_get()
1905 - GL_IT(it)->wsd->start_time)) ? 0.0 : t);
1907 if (t <= REORDER_EFFECT_TIME)
1908 y = (1 * sin((t / REORDER_EFFECT_TIME) * (M_PI / 2)) * dy);
1911 diff = abs(it->item->old_scrl_y - it->item->scrl_y);
1912 if (diff < dy) y = diff;
1914 if (it->item->old_scrl_y < it->item->scrl_y)
1916 it->item->old_scrl_y += y;
1919 else if (it->item->old_scrl_y > it->item->scrl_y)
1921 it->item->old_scrl_y -= y;
1925 if (it->deco_all_view)
1927 (it, it->deco_all_view, it->item->scrl_x, it->item->old_scrl_y);
1928 else if (it->item->deco_it_view)
1930 (it, it->item->deco_it_view, it->item->scrl_x, it->item->old_scrl_y);
1932 _item_position(it, VIEW(it), it->item->scrl_x, it->item->old_scrl_y);
1934 if ((GL_IT(it)->wsd->reorder_pan_move) ||
1935 (down && it->item->old_scrl_y >= it->item->scrl_y) ||
1936 (!down && it->item->old_scrl_y <= it->item->scrl_y))
1938 it->item->old_scrl_y = it->item->scrl_y;
1939 it->item->move_effect_enabled = EINA_FALSE;
1940 GL_IT(it)->wsd->reorder_move_animator = NULL;
1941 return ECORE_CALLBACK_CANCEL;
1944 return ECORE_CALLBACK_RENEW;
1948 _reorder_item_space_get(Elm_Gen_Item *it)
1950 Elm_Gen_Item *reorder_it = GL_IT(it)->wsd->reorder_it;
1951 Evas_Coord rox, roy, row, roh, oy, oh;
1952 Eina_Bool top = EINA_FALSE;
1954 if (!reorder_it) return 0;
1955 if(it->deco_all_view) evas_object_lower(it->deco_all_view);
1957 evas_object_geometry_get(GL_IT(it)->wsd->pan_obj, NULL, &oy, NULL, &oh);
1958 evas_object_geometry_get
1959 (GL_IT(it)->wsd->VIEW(reorder_it), &rox, &roy, &row, &roh);
1961 if ((GL_IT(it)->wsd->reorder_start_y < it->item->block->y) &&
1962 (roy - oy + (roh / 2) >= it->item->block->y - GL_IT(it)->wsd->pan_y))
1964 it->item->block->reorder_offset =
1965 GL_IT(it)->wsd->reorder_it->item->h * -1;
1966 if (it->item->block->count == 1)
1967 GL_IT(it)->wsd->reorder_rel = it;
1969 else if ((GL_IT(it)->wsd->reorder_start_y >= it->item->block->y) &&
1970 (roy - oy + (roh / 2) <= it->item->block->y -
1971 GL_IT(it)->wsd->pan_y))
1973 it->item->block->reorder_offset = GL_IT(it)->wsd->reorder_it->item->h;
1976 it->item->block->reorder_offset = 0;
1978 it->item->scrl_y += it->item->block->reorder_offset;
1980 top = (ELM_RECTS_INTERSECT
1981 (it->item->scrl_x, it->item->scrl_y, it->item->w, it->item->h,
1982 rox, roy + (roh / 2), row, 1));
1985 GL_IT(it)->wsd->reorder_rel = it;
1986 it->item->scrl_y += GL_IT(it)->wsd->reorder_it->item->h;
1987 return GL_IT(it)->wsd->reorder_it->item->h;
1994 _item_block_position(Item_Block *itb,
2000 Eina_Bool vis = EINA_FALSE;
2001 Evas_Coord y = 0, ox, oy, ow, oh, cvx, cvy, cvw, cvh;
2003 //evas_event_freeze(evas_object_evas_get(ELM_WIDGET_DATA(itb->sd)->obj));
2004 evas_object_geometry_get(itb->sd->pan_obj, &ox, &oy, &ow, &oh);
2005 evas_output_viewport_get
2006 (evas_object_evas_get(ELM_WIDGET_DATA(itb->sd)->obj),
2007 &cvx, &cvy, &cvw, &cvh);
2009 EINA_LIST_FOREACH(itb->items, l, it)
2011 if ((GL_IT(it)->wsd->reorder_it == it) && it->highlighted) continue;
2015 it->item->w = itb->w;
2016 it->item->scrl_x = itb->x + it->x - GL_IT(it)->wsd->pan_x + ox;
2017 it->item->scrl_y = itb->y + it->y - GL_IT(it)->wsd->pan_y + oy;
2019 vis = (ELM_RECTS_INTERSECT
2020 (it->item->scrl_x, it->item->scrl_y, it->item->w, it->item->h,
2021 cvx, cvy, cvw, cvh));
2024 if ((itb->realized) && (!it->realized))
2026 if (vis) _item_realize(it, in, EINA_FALSE);
2030 if (vis || it->dragging)
2032 #if GENLIST_ENTRY_SUPPORT
2033 evas_object_show(VIEW(it));
2035 if (GL_IT(it)->wsd->reorder_mode &&
2036 GL_IT(it)->wsd->reorder_it &&
2037 GL_IT(it)->wsd->reorder_it->highlighted)
2038 y += _reorder_item_space_get(it);
2039 git = it->item->group_item;
2042 if (git->item->scrl_y < oy)
2043 git->item->scrl_y = oy;
2044 if ((git->item->scrl_y + git->item->h) >
2045 (it->item->scrl_y + it->item->h))
2046 git->item->scrl_y = (it->item->scrl_y +
2047 it->item->h) - git->item->h;
2048 git->item->scrl_x = it->item->scrl_x;
2049 git->item->want_realize = EINA_TRUE;
2051 if ((GL_IT(it)->wsd->reorder_it) &&
2052 GL_IT(it)->wsd->reorder_it->highlighted &&
2053 (it->item->old_scrl_y != it->item->scrl_y))
2055 if (!it->item->move_effect_enabled)
2057 it->item->move_effect_enabled = EINA_TRUE;
2058 GL_IT(it)->wsd->reorder_move_animator =
2060 _reorder_move_animator_cb, it);
2063 if (!it->item->move_effect_enabled)
2065 if ((GL_IT(it)->wsd->decorate_all_mode) &&
2066 (it->itc->decorate_all_item_style))
2067 _decorate_all_item_position
2068 (it, it->item->scrl_x, it->item->scrl_y);
2071 if (it->item->deco_it_view)
2073 (it, it->item->deco_it_view,
2078 (it, VIEW(it), it->item->scrl_x,
2081 it->item->old_scrl_y = it->item->scrl_y;
2082 #if GENLIST_PINCH_ZOOM_SUPPORT
2083 if (((GL_IT(it)->wsd->pinch_zoom_mode == ELM_GEN_PINCH_ZOOM_CONTRACT)
2084 && (!IS_ROOT_PARENT_IT(it))) || (GL_IT(it)->wsd->sorting))
2086 if (it->deco_all_view) evas_object_hide(it->deco_all_view);
2087 else evas_object_hide(VIEW(it));
2095 if ((GL_IT(it)->wsd->pinch_zoom_mode == ELM_GEN_PINCH_ZOOM_CONTRACT)
2096 && (!IS_ROOT_PARENT_IT(it)))
2098 if (it->deco_all_view) evas_object_hide(it->deco_all_view);
2099 else evas_object_hide(VIEW(it));
2102 _item_unrealize(it, EINA_FALSE);
2109 if (vis) it->item->want_realize = EINA_TRUE;
2113 // FIXME: diffrence from upstream
2114 minh += it->item->minh;
2118 //evas_event_thaw(evas_object_evas_get(ELM_WIDGET_DATA(itb->sd)->obj));
2119 //evas_event_thaw_eval(evas_object_evas_get(ELM_WIDGET_DATA(itb->sd)->obj));
2123 _item_block_realize(Item_Block *itb)
2125 if (itb->realized) return;
2127 itb->realized = EINA_TRUE;
2128 itb->want_unrealize = EINA_FALSE;
2131 #if GENLIST_ENTRY_SUPPORT
2133 _changed_job(Elm_Genlist_Smart_Data *sd)
2139 Eina_Bool anything_changed = EINA_FALSE;
2140 Eina_Bool width_changed = EINA_FALSE;
2141 Eina_Bool height_changed = EINA_FALSE;
2142 sd->size_changed = EINA_FALSE;
2144 EINA_INLIST_FOREACH(sd->blocks, itb)
2151 if (anything_changed)
2152 _item_block_position(itb, num);
2156 width_changed = height_changed = EINA_FALSE;
2157 EINA_LIST_FOREACH(itb->items, l2, it)
2159 if ((!it->item->mincalcd) && (it->realized))
2161 Evas_Coord fw = -1, fh = -1;
2162 Evas_Coord mw = -1, mh = -1;
2164 if (it->select_mode != ELM_OBJECT_SELECT_MODE_DISPLAY_ONLY)
2165 elm_coords_finger_size_adjust(1, &fw, 1, &fh);
2167 // FIXME: why compressmode do this?
2168 if (sd->mode == ELM_LIST_COMPRESS) mw = sd->prev_viewport_w;
2170 edje_object_size_min_restricted_calc(VIEW(it), &mw, &mh, fw, fh);
2172 if (it->item->w != mw)
2174 it->item->w = it->item->minw = mw;
2175 width_changed = EINA_TRUE;
2177 if (it->item->h != mh)
2179 it->item->h = it->item->minh = mh;
2180 height_changed = EINA_TRUE;
2187 it->item->mincalcd = EINA_TRUE;
2189 if ((!sd->group_item_width) && (it->group))
2191 sd->group_item_width = mw;
2192 sd->group_item_height = mh;
2194 else if ((!sd->item_width) && (it->item->type == ELM_GENLIST_ITEM_NONE))
2196 sd->item_width = mw;
2197 sd->item_height = mh;
2202 itb->changeme = EINA_FALSE;
2205 anything_changed = EINA_TRUE;
2206 itb->changed = EINA_TRUE;
2207 _item_block_recalc(itb, num0, 0);
2208 _item_block_position(itb, num0);
2210 else if (width_changed)
2212 _item_block_position(itb, num0);
2215 if (anything_changed)
2217 if (sd->calc_job) ecore_job_del(sd->calc_job);
2218 sd->calc_job = ecore_job_add(_calc_job, sd);
2224 _elm_genlist_pan_smart_calculate(Evas_Object *obj)
2226 Evas_Coord ox, oy, ow, oh, cvx, cvy, cvw, cvh;
2227 Evas_Coord vx = 0, vy = 0, vw = 0, vh = 0;
2233 ELM_GENLIST_PAN_DATA_GET(obj, psd);
2235 //evas_event_freeze(evas_object_evas_get(obj));
2237 #if GENLIST_FX_SUPPORT
2238 if (psd->wsd->fx_playing) return;
2240 if (psd->wsd->pan_changed)
2242 _calc_job(psd->wsd);
2243 psd->wsd->pan_changed = EINA_FALSE;
2246 evas_object_geometry_get(obj, &ox, &oy, &ow, &oh);
2247 evas_output_viewport_get(evas_object_evas_get(obj), &cvx, &cvy, &cvw, &cvh);
2248 EINA_LIST_FOREACH(psd->wsd->group_items, l, git)
2250 #if GROUP_ITEMS_FEATURE
2251 git->item->want_realize = EINA_FALSE;
2253 _item_unrealize(git, EINA_TRUE);
2257 EINA_INLIST_FOREACH(psd->wsd->blocks, itb)
2259 itb->w = psd->wsd->minw;
2260 if (ELM_RECTS_INTERSECT(itb->x - psd->wsd->pan_x + ox,
2261 itb->y - psd->wsd->pan_y + oy,
2263 cvx, cvy, cvw, cvh))
2265 if ((!itb->realized) || (itb->changed))
2267 _item_block_realize(itb);
2269 // FIXME: difference from opensource
2270 if (sd->wd->calc_job) ecore_job_del(sd->wd->calc_job);
2271 sd->wd->calc_job = NULL;
2275 _item_block_position(itb, in);
2279 if (itb->realized) _item_block_unrealize(itb);
2283 #if GENLIST_PINCH_ZOOM_SUPPORT
2284 if (psd->wsd->pinch_zoom_mode) _pinch_items_recalc(psd->wsd);
2287 #if GROUP_ITEMS_FEATURE
2288 if ((!psd->wsd->reorder_it) || (psd->wsd->reorder_pan_move))
2289 _group_items_recalc(psd->wsd);
2291 if ((psd->wsd->reorder_mode) && (psd->wsd->reorder_it))
2293 if (psd->wsd->pan_y != psd->wsd->reorder_old_pan_y)
2294 psd->wsd->reorder_pan_move = EINA_TRUE;
2295 else psd->wsd->reorder_pan_move = EINA_FALSE;
2297 evas_object_raise(psd->wsd->VIEW(reorder_it));
2298 psd->wsd->reorder_old_pan_y = psd->wsd->pan_y;
2299 psd->wsd->start_time = ecore_loop_time_get();
2301 _item_auto_scroll(psd->wsd);
2303 psd->wsd->s_iface->content_pos_get(ELM_WIDGET_DATA(psd->wsd)->obj, &vx, &vy);
2304 psd->wsd->s_iface->content_viewport_size_get(ELM_WIDGET_DATA(psd->wsd)->obj,
2307 if (psd->wsd->reorder_fast == 1)
2308 psd->wsd->s_iface->content_region_show(ELM_WIDGET_DATA(psd->wsd)->obj,
2309 vx,vy - 10, vw, vh);
2310 else if (psd->wsd->reorder_fast == -1)
2311 psd->wsd->s_iface->content_region_show(ELM_WIDGET_DATA(psd->wsd)->obj,
2312 vx, vy + 10, vw, vh);
2314 #if GENLIST_ENTRY_SUPPORT
2315 if (psd->wsd->size_changed) _changed_job(psd->wsd);
2318 #if GENLIST_FX_SUPPORT
2319 psd->wsd->rendered = EINA_TRUE;
2320 if ((psd->wsd->fx_mode) && (!psd->wsd->queue))
2322 if (_elm_genlist_fx_capture(ELM_WIDGET_DATA(psd->wsd)->obj, 1))
2323 _elm_genlist_fx_play(ELM_WIDGET_DATA(psd->wsd)->obj);
2326 #if GENLIST_PINCH_ZOOM_SUPPORT
2327 if (psd->wsd->pinch_zoom_mode == ELM_GEN_PINCH_ZOOM_EXPAND)
2328 psd->wsd->pinch_zoom_mode = ELM_GEN_PINCH_ZOOM_NONE;
2330 //evas_event_thaw(evas_object_evas_get(obj));
2331 //evas_event_thaw_eval(evas_object_evas_get(obj));
2335 _elm_genlist_pan_smart_set_user(Elm_Genlist_Pan_Smart_Class *sc)
2337 ELM_PAN_CLASS(sc)->base.add = _elm_genlist_pan_smart_add;
2338 ELM_PAN_CLASS(sc)->base.del = _elm_genlist_pan_smart_del;
2339 ELM_PAN_CLASS(sc)->base.move = _elm_genlist_pan_smart_move;
2340 ELM_PAN_CLASS(sc)->base.resize = _elm_genlist_pan_smart_resize;
2341 ELM_PAN_CLASS(sc)->base.calculate = _elm_genlist_pan_smart_calculate;
2343 ELM_PAN_CLASS(sc)->pos_set = _elm_genlist_pan_smart_pos_set;
2344 ELM_PAN_CLASS(sc)->pos_get = _elm_genlist_pan_smart_pos_get;
2345 ELM_PAN_CLASS(sc)->pos_max_get = _elm_genlist_pan_smart_pos_max_get;
2346 ELM_PAN_CLASS(sc)->pos_min_get = _elm_genlist_pan_smart_pos_min_get;
2347 ELM_PAN_CLASS(sc)->content_size_get =
2348 _elm_genlist_pan_smart_content_size_get;
2352 _item_multi_select_up(Elm_Genlist_Smart_Data *sd)
2354 Elm_Object_Item *prev;
2356 if (!sd->selected) return EINA_FALSE;
2357 if (!sd->multi) return EINA_FALSE;
2359 prev = elm_genlist_item_prev_get(sd->last_selected_item);
2360 if (!prev) return EINA_TRUE;
2362 if (elm_genlist_item_selected_get(prev))
2364 elm_genlist_item_selected_set(sd->last_selected_item, EINA_FALSE);
2365 sd->last_selected_item = prev;
2366 elm_genlist_item_show
2367 (sd->last_selected_item, ELM_GENLIST_ITEM_SCROLLTO_IN);
2371 elm_genlist_item_selected_set(prev, EINA_TRUE);
2372 elm_genlist_item_show(prev, ELM_GENLIST_ITEM_SCROLLTO_IN);
2378 _item_multi_select_down(Elm_Genlist_Smart_Data *sd)
2380 Elm_Object_Item *next;
2382 if (!sd->selected) return EINA_FALSE;
2383 if (!sd->multi) return EINA_FALSE;
2385 next = elm_genlist_item_next_get(sd->last_selected_item);
2386 if (!next) return EINA_TRUE;
2388 if (elm_genlist_item_selected_get(next))
2390 elm_genlist_item_selected_set(sd->last_selected_item, EINA_FALSE);
2391 sd->last_selected_item = next;
2392 elm_genlist_item_show
2393 (sd->last_selected_item, ELM_GENLIST_ITEM_SCROLLTO_IN);
2397 elm_genlist_item_selected_set(next, EINA_TRUE);
2398 elm_genlist_item_show(next, ELM_GENLIST_ITEM_SCROLLTO_IN);
2405 _all_items_deselect(Elm_Genlist_Smart_Data *sd)
2407 if (!sd->selected) return EINA_FALSE;
2409 while (sd->selected)
2410 elm_genlist_item_selected_set(sd->selected->data, EINA_FALSE);
2416 _item_single_select_up(Elm_Genlist_Smart_Data *sd)
2422 prev = ELM_GEN_ITEM_FROM_INLIST(sd->items->last);
2424 prev = ELM_GEN_ITEM_FROM_INLIST(EINA_INLIST_GET(prev)->prev);
2427 prev = (Elm_Gen_Item *)elm_genlist_item_prev_get
2428 (sd->last_selected_item);
2430 if (!prev) return EINA_FALSE;
2432 _all_items_deselect(sd);
2434 elm_genlist_item_selected_set((Elm_Object_Item *)prev, EINA_TRUE);
2435 elm_genlist_item_show((Elm_Object_Item *)prev, ELM_GENLIST_ITEM_SCROLLTO_IN);
2440 _item_single_select_down(Elm_Genlist_Smart_Data *sd)
2446 next = ELM_GEN_ITEM_FROM_INLIST(sd->items);
2448 next = ELM_GEN_ITEM_FROM_INLIST(EINA_INLIST_GET(next)->next);
2451 next = (Elm_Gen_Item *)elm_genlist_item_next_get
2452 (sd->last_selected_item);
2454 if (!next) return EINA_FALSE;
2456 _all_items_deselect(sd);
2458 elm_genlist_item_selected_set((Elm_Object_Item *)next, EINA_TRUE);
2459 elm_genlist_item_show
2460 ((Elm_Object_Item *)next, ELM_GENLIST_ITEM_SCROLLTO_IN);
2466 _elm_genlist_smart_event(Evas_Object *obj,
2467 Evas_Object *src __UNUSED__,
2468 Evas_Callback_Type type,
2475 Evas_Coord step_x = 0;
2476 Evas_Coord step_y = 0;
2477 Evas_Coord page_x = 0;
2478 Evas_Coord page_y = 0;
2479 Elm_Object_Item *it;
2480 Evas_Event_Key_Down *ev = event_info;
2481 Evas_Coord pan_max_x = 0, pan_max_y = 0;
2483 ELM_GENLIST_DATA_GET(obj, sd);
2485 if (type != EVAS_CALLBACK_KEY_DOWN) return EINA_FALSE;
2486 if (!sd->items) return EINA_FALSE;
2487 if (ev->event_flags & EVAS_EVENT_FLAG_ON_HOLD) return EINA_FALSE;
2488 if (elm_widget_disabled_get(obj)) return EINA_FALSE;
2490 sd->s_iface->content_pos_get(obj, &x, &y);
2491 sd->s_iface->step_size_get(obj, &step_x, &step_y);
2492 sd->s_iface->page_size_get(obj, &page_x, &page_y);
2493 sd->s_iface->content_viewport_size_get(obj, &v_w, &v_h);
2495 if ((!strcmp(ev->keyname, "Left")) ||
2496 ((!strcmp(ev->keyname, "KP_Left")) && (!ev->string)))
2500 else if ((!strcmp(ev->keyname, "Right")) ||
2501 ((!strcmp(ev->keyname, "KP_Right")) && (!ev->string)))
2505 else if ((!strcmp(ev->keyname, "Up")) ||
2506 ((!strcmp(ev->keyname, "KP_Up")) && (!ev->string)))
2508 if (((evas_key_modifier_is_set(ev->modifiers, "Shift")) &&
2509 (_item_multi_select_up(sd)))
2510 || (_item_single_select_up(sd)))
2512 ev->event_flags |= EVAS_EVENT_FLAG_ON_HOLD;
2518 else if ((!strcmp(ev->keyname, "Down")) ||
2519 ((!strcmp(ev->keyname, "KP_Down")) && (!ev->string)))
2521 if (((evas_key_modifier_is_set(ev->modifiers, "Shift")) &&
2522 (_item_multi_select_down(sd)))
2523 || (_item_single_select_down(sd)))
2525 ev->event_flags |= EVAS_EVENT_FLAG_ON_HOLD;
2531 else if ((!strcmp(ev->keyname, "Home")) ||
2532 ((!strcmp(ev->keyname, "KP_Home")) && (!ev->string)))
2534 it = elm_genlist_first_item_get(obj);
2535 elm_genlist_item_bring_in(it, ELM_GENLIST_ITEM_SCROLLTO_IN);
2536 elm_genlist_item_selected_set(it, EINA_TRUE);
2537 ev->event_flags |= EVAS_EVENT_FLAG_ON_HOLD;
2540 else if ((!strcmp(ev->keyname, "End")) ||
2541 ((!strcmp(ev->keyname, "KP_End")) && (!ev->string)))
2543 it = elm_genlist_last_item_get(obj);
2544 elm_genlist_item_bring_in(it, ELM_GENLIST_ITEM_SCROLLTO_IN);
2545 elm_genlist_item_selected_set(it, EINA_TRUE);
2546 ev->event_flags |= EVAS_EVENT_FLAG_ON_HOLD;
2549 else if ((!strcmp(ev->keyname, "Prior")) ||
2550 ((!strcmp(ev->keyname, "KP_Prior")) && (!ev->string)))
2553 y -= -(page_y * v_h) / 100;
2557 else if ((!strcmp(ev->keyname, "Next")) ||
2558 ((!strcmp(ev->keyname, "KP_Next")) && (!ev->string)))
2561 y += -(page_y * v_h) / 100;
2565 else if (!strcmp(ev->keyname, "Escape"))
2567 if (!_all_items_deselect(sd)) return EINA_FALSE;
2568 ev->event_flags |= EVAS_EVENT_FLAG_ON_HOLD;
2571 else if (((!strcmp(ev->keyname, "Return")) ||
2572 (!strcmp(ev->keyname, "KP_Enter")) ||
2573 (!strcmp(ev->keyname, "space")))
2574 && (!sd->multi) && (sd->selected))
2576 it = elm_genlist_selected_item_get(obj);
2577 elm_genlist_item_expanded_set(it, !elm_genlist_item_expanded_get(it));
2578 evas_object_smart_callback_call(WIDGET(it), SIG_ACTIVATED, it);
2580 else return EINA_FALSE;
2582 ev->event_flags |= EVAS_EVENT_FLAG_ON_HOLD;
2583 _elm_genlist_pan_smart_pos_max_get(sd->pan_obj, &pan_max_x, &pan_max_y);
2585 if (x > pan_max_x) x = pan_max_x;
2587 if (y > pan_max_y) y = pan_max_y;
2589 sd->s_iface->content_pos_set(obj, x, y, EINA_TRUE);
2595 _elm_genlist_smart_sub_object_add(Evas_Object *obj,
2598 Elm_Widget_Smart_Class *parent_parent;
2600 parent_parent = (Elm_Widget_Smart_Class *)((Evas_Smart_Class *)
2601 _elm_genlist_parent_sc)->parent;
2603 /* skipping layout's code, which registers size hint changing
2604 * callback on sub objects. this is here because items'
2605 * content_get() routines may change hints on the objects after
2606 * creation, thus issuing TOO MANY sizing_eval()'s here. they are
2607 * not needed at here anyway, so let's skip listening to those
2609 if (!parent_parent->sub_object_add(obj, sobj))
2616 _elm_genlist_smart_sub_object_del(Evas_Object *obj,
2619 ELM_GENLIST_DATA_GET(obj, sd);
2621 /* XXX: hack -- also skipping sizing recalculation on
2622 * sub-object-del. genlist's crazy code paths (like groups and
2623 * such) seem to issue a whole lot of deletions and Evas bitches
2624 * about too many recalculations */
2625 sd->on_sub_del = EINA_TRUE;
2627 if (!ELM_WIDGET_CLASS(_elm_genlist_parent_sc)->sub_object_del(obj, sobj))
2630 sd->on_sub_del = EINA_FALSE;
2636 _elm_genlist_smart_on_focus(Evas_Object *obj)
2638 ELM_GENLIST_DATA_GET(obj, sd);
2640 if (!ELM_WIDGET_CLASS(_elm_genlist_parent_sc)->on_focus(obj))
2643 if (elm_widget_focus_get(obj) && (sd->items) && (sd->selected) &&
2644 (!sd->last_selected_item))
2645 sd->last_selected_item = eina_list_data_get(sd->selected);
2651 _elm_genlist_smart_focus_next(const Evas_Object *obj,
2652 Elm_Focus_Direction dir,
2655 Evas_Coord x, y, w, h;
2656 Evas_Coord sx, sy, sw, sh;
2658 Eina_List *items = NULL;
2659 Eina_Bool done = EINA_FALSE;
2661 ELM_GENLIST_CHECK(obj) EINA_FALSE;
2662 ELM_GENLIST_DATA_GET(obj, sd);
2664 evas_object_geometry_get(ELM_WIDGET_DATA(sd)->obj, &sx, &sy, &sw, &sh);
2666 EINA_INLIST_FOREACH(sd->blocks, itb)
2674 EINA_LIST_FOREACH(itb->items, l, it)
2678 evas_object_geometry_get(it->base.view, &x, &y, &w, &h);
2680 /* check item which displays more than half of its size */
2681 if (ELM_RECTS_INTERSECT
2682 (x + (w / 2), y + (h / 2), 0, 0, sx, sy, sw, sh))
2683 items = eina_list_append(items, it->base.access_obj);
2685 if (!it->base.access_order) continue;
2689 EINA_LIST_FOREACH(it->base.access_order, subl, subo)
2690 items = eina_list_append(items, subo);
2694 else if (done) break;
2697 return elm_widget_focus_list_next_get
2698 (obj, items, eina_list_data_get, dir, next);
2702 _mirrored_set(Evas_Object *obj,
2705 ELM_GENLIST_DATA_GET(obj, sd);
2707 sd->s_iface->mirrored_set(obj, rtl);
2711 _elm_genlist_smart_theme(Evas_Object *obj)
2715 ELM_GENLIST_DATA_GET(obj, sd);
2717 if (!ELM_WIDGET_CLASS(_elm_genlist_parent_sc)->theme(obj))
2720 //evas_event_freeze(evas_object_evas_get(ELM_WIDGET_DATA(sd)->obj));
2721 _item_cache_all_free(sd);
2722 _mirrored_set(obj, elm_widget_mirrored_get(obj));
2725 // FIXME: difference from opensource
2726 elm_layout_theme_set(obj, "genlist", "base", elm_widget_style_get(obj));
2729 sd->item_width = sd->item_height = 0;
2730 sd->group_item_width = sd->group_item_height = 0;
2731 sd->minw = sd->minh = sd->realminw = 0;
2732 EINA_INLIST_FOREACH(sd->blocks, itb)
2737 if (itb->realized) _item_block_unrealize(itb);
2738 EINA_LIST_FOREACH(itb->items, l, it)
2739 it->item->mincalcd = EINA_FALSE;
2741 itb->changed = EINA_TRUE;
2743 if (sd->calc_job) ecore_job_del(sd->calc_job);
2744 sd->calc_job = NULL;
2745 elm_layout_sizing_eval(obj);
2746 sd->pan_changed = EINA_TRUE;
2747 evas_object_smart_changed(sd->pan_obj);
2748 //evas_event_thaw(evas_object_evas_get(ELM_WIDGET_DATA(sd)->obj));
2749 //evas_event_thaw_eval(evas_object_evas_get(ELM_WIDGET_DATA(sd)->obj));
2754 /* FIXME: take off later. maybe this show region coords belong in the
2755 * interface (new api functions, set/get)? */
2757 _show_region_hook(void *data,
2760 Evas_Coord x, y, w, h;
2762 ELM_GENLIST_DATA_GET(data, sd);
2764 elm_widget_show_region_get(obj, &x, &y, &w, &h);
2765 //x & y are screen coordinates, Add with pan coordinates
2768 sd->s_iface->content_region_show(obj, x, y, w, h);
2772 _elm_genlist_smart_translate(Evas_Object *obj)
2774 evas_object_smart_callback_call(obj, "language,changed", NULL);
2780 _item_highlight(Elm_Gen_Item *it)
2782 const char *selectraise;
2783 Elm_Genlist_Smart_Data *sd = GL_IT(it)->wsd;
2785 if (elm_widget_item_disabled_get(it)) return;
2786 if ((sd->select_mode == ELM_OBJECT_SELECT_MODE_NONE) ||
2787 (sd->select_mode == ELM_OBJECT_SELECT_MODE_DISPLAY_ONLY ) ||
2788 (it->select_mode == ELM_OBJECT_SELECT_MODE_NONE) ||
2789 (it->select_mode == ELM_OBJECT_SELECT_MODE_DISPLAY_ONLY ))
2792 if (!sd->highlight || it->highlighted) return;
2793 #if GENLIST_PINCH_ZOOM_SUPPORT
2794 if (sd->pinch_zoom_mode) return;
2797 selectraise = edje_object_data_get(VIEW(it), "selectraise");
2798 if ((selectraise) && (!strcmp(selectraise, "on")))
2800 if (it->deco_all_view) evas_object_raise(it->deco_all_view);
2801 else evas_object_raise(VIEW(it));
2802 if ((it->item->group_item) && (it->item->group_item->realized))
2803 evas_object_raise(it->item->VIEW(group_item));
2805 it->highlighted = EINA_TRUE;
2807 if (it->deco_all_view)
2808 edje_object_signal_emit(it->deco_all_view, "elm,state,selected", "elm");
2809 edje_object_signal_emit(VIEW(it), "elm,state,selected", "elm");
2810 evas_object_smart_callback_call(WIDGET(it), SIG_HIGHLIGHTED, it);
2814 _item_unhighlight(Elm_Gen_Item *it)
2816 if (!it->highlighted) return;
2818 if (!it->item->nostacking)
2820 if ((it->item->order_num_in & 0x1) ^ it->item->stacking_even)
2822 if (it->deco_all_view) evas_object_lower(it->deco_all_view);
2823 else evas_object_lower(VIEW(it));
2827 if (it->deco_all_view) evas_object_raise(it->deco_all_view);
2828 else evas_object_raise(VIEW(it));
2831 it->highlighted = EINA_FALSE;
2833 if (it->deco_all_view)
2834 edje_object_signal_emit(it->deco_all_view, "elm,state,unselected", "elm");
2835 edje_object_signal_emit(VIEW(it), "elm,state,unselected", "elm");
2836 evas_object_smart_callback_call(WIDGET(it), SIG_UNHIGHLIGHTED, it);
2840 _item_unselect(Elm_Gen_Item *it)
2842 Elm_Genlist_Smart_Data *sd = GL_IT(it)->wsd;
2843 _item_unhighlight(it);
2844 if (!it->selected) return;
2846 it->selected = EINA_FALSE;
2847 sd->selected = eina_list_remove(sd->selected, it);
2848 evas_object_smart_callback_call(WIDGET(it), SIG_UNSELECTED, it);
2852 _item_select(Elm_Gen_Item *it)
2854 Evas_Object *obj = WIDGET(it);
2855 Elm_Genlist_Smart_Data *sd = GL_IT(it)->wsd;
2856 if (elm_widget_item_disabled_get(it)) return;
2857 if ((sd->select_mode == ELM_OBJECT_SELECT_MODE_NONE) ||
2858 (sd->select_mode == ELM_OBJECT_SELECT_MODE_DISPLAY_ONLY) ||
2859 (it->select_mode == ELM_OBJECT_SELECT_MODE_NONE) ||
2860 (it->select_mode == ELM_OBJECT_SELECT_MODE_DISPLAY_ONLY))
2863 #if GENLIST_PINCH_ZOOM_SUPPORT
2864 if (IS_ROOT_PARENT_IT(it) && (sd->pinch_zoom_mode == ELM_GEN_PINCH_ZOOM_CONTRACT))
2866 elm_genlist_pinch_zoom_mode_set(obj, ELM_GEN_PINCH_ZOOM_EXPAND);
2867 elm_genlist_item_show((Elm_Object_Item *)it, ELM_GENLIST_ITEM_SCROLLTO_TOP);
2873 // FIXME: difference from upstream
2874 if ((GL_IT(it)->wsd->last_selected_item) &&
2875 (it != (Elm_Gen_Item *) GL_IT(it)->wsd->last_selected_item))
2876 _item_unfocusable_set
2877 ((Elm_Gen_Item *)GL_IT(it)->wsd->last_selected_item, EINA_TRUE);
2880 // Do not check selected because always select mode can be used
2881 _item_highlight(it);
2882 it->selected = EINA_TRUE;
2883 sd->selected = eina_list_append(sd->selected, it);
2884 sd->last_selected_item = (Elm_Object_Item *)it;
2886 if (it->func.func) it->func.func((void *)it->func.data, obj, it);
2887 if (!EINA_MAGIC_CHECK((Elm_Widget_Item *)it, ELM_WIDGET_ITEM_MAGIC))
2889 evas_object_smart_callback_call(WIDGET(it), SIG_SELECTED, it);
2893 _item_select_unselect(Elm_Gen_Item *it, Eina_Bool selected)
2895 Elm_Genlist_Smart_Data *sd = GL_IT(it)->wsd;
2896 Evas_Object *obj = ELM_WIDGET_DATA(sd)->obj;
2897 if (elm_widget_item_disabled_get(it)) return;
2899 evas_object_ref(obj);
2902 const Eina_List *l, *ll;
2904 EINA_LIST_FOREACH_SAFE(sd->selected, l, ll, it2)
2905 if (it2 != it) _item_unselect(it2);
2907 if (selected) _item_select(it);
2908 else _item_unselect(it);
2909 evas_object_unref(obj);
2913 _item_block_position_update(Eina_Inlist *list,
2918 EINA_INLIST_FOREACH(list, tmp)
2920 tmp->position = idx++;
2921 tmp->position_update = EINA_TRUE;
2926 _item_position_update(Eina_List *list,
2932 EINA_LIST_FOREACH(list, l, it)
2934 it->position = idx++;
2935 it->position_update = EINA_TRUE;
2940 _item_block_merge(Item_Block *left,
2946 EINA_LIST_FOREACH(right->items, l, it2)
2948 it2->item->block = left;
2950 left->changed = EINA_TRUE;
2952 left->items = eina_list_merge(left->items, right->items);
2956 _item_block_del(Elm_Gen_Item *it)
2959 Item_Block *itb = it->item->block;
2960 Eina_Bool block_changed = EINA_FALSE;
2962 itb->items = eina_list_remove(itb->items, it);
2964 itb->changed = EINA_TRUE;
2965 if (GL_IT(it)->wsd->calc_job) ecore_job_del(GL_IT(it)->wsd->calc_job);
2966 GL_IT(it)->wsd->calc_job = ecore_job_add(_calc_job, GL_IT(it)->wsd);
2971 il = EINA_INLIST_GET(itb);
2972 itbn = (Item_Block *)(il->next);
2974 it->parent->item->items =
2975 eina_list_remove(it->parent->item->items, it);
2978 _item_block_position_update(il->next, itb->position);
2980 GL_IT(it)->wsd->blocks =
2981 eina_inlist_remove(GL_IT(it)->wsd->blocks, il);
2984 if (itbn) itbn->changed = EINA_TRUE;
2988 if (itb->count < (itb->sd->max_items_per_block / 2))
2993 il = EINA_INLIST_GET(itb);
2994 itbp = (Item_Block *)(il->prev);
2995 itbn = (Item_Block *)(il->next);
2997 /* merge block with previous */
2999 ((itbp->count + itb->count) <
3000 (itb->sd->max_items_per_block +
3001 (itb->sd->max_items_per_block / 2))))
3003 _item_block_merge(itbp, itb);
3004 _item_block_position_update
3005 (EINA_INLIST_GET(itb)->next, itb->position);
3006 GL_IT(it)->wsd->blocks = eina_inlist_remove
3007 (GL_IT(it)->wsd->blocks, EINA_INLIST_GET(itb));
3009 block_changed = EINA_TRUE;
3011 /* merge block with next */
3013 ((itbn->count + itb->count) <
3014 (itb->sd->max_items_per_block +
3015 (itb->sd->max_items_per_block / 2))))
3017 _item_block_merge(itb, itbn);
3018 _item_block_position_update
3019 (EINA_INLIST_GET(itbn)->next, itbn->position);
3020 GL_IT(it)->wsd->blocks =
3021 eina_inlist_remove(GL_IT(it)->wsd->blocks,
3022 EINA_INLIST_GET(itbn));
3024 block_changed = EINA_TRUE;
3031 GL_IT(it)->wsd->pan_changed = EINA_TRUE;
3032 evas_object_smart_changed(GL_IT(it)->wsd->pan_obj);
3033 if (GL_IT(it)->wsd->calc_job) ecore_job_del(GL_IT(it)->wsd->calc_job);
3034 GL_IT(it)->wsd->calc_job = NULL;
3036 #if GENLIST_FX_SUPPORT
3037 it->item->block = NULL;
3042 _decorate_all_item_unrealize(Elm_Gen_Item *it)
3046 if ((!it) || (!it->item->decorate_all_item_realized)) return;
3048 #if GENLIST_FX_SUPPORT
3049 if ((GL_IT(it)->has_proxy_it) && (!GL_IT(it)->wsd->genlist_clearing))
3051 if (!eina_list_data_find(GL_IT(it)->wsd->pending_unrealized_decorate_all_items, it))
3052 GL_IT(it)->wsd->pending_unrealized_decorate_all_items =
3053 eina_list_append(GL_IT(it)->wsd->pending_unrealized_decorate_all_items, it);
3058 edje_object_part_unswallow(it->deco_all_view, VIEW(it));
3059 evas_object_smart_member_add(VIEW(it), GL_IT(it)->wsd->pan_obj);
3060 elm_widget_sub_object_add(WIDGET(it), VIEW(it));
3061 _elm_genlist_item_odd_even_update(it);
3062 _elm_genlist_item_state_update(it, NULL);
3064 edje_object_signal_emit
3065 (it->deco_all_view, "elm,state,decorate,disabled", "elm");
3066 edje_object_signal_emit
3067 (VIEW(it), "elm,state,decorate,disabled", "elm");
3068 if (it->item->wsd->reorder_mode)
3070 edje_object_signal_emit
3071 (VIEW(it), "elm,state,reorder,mode_set", "elm");
3072 edje_object_signal_emit
3073 (it->deco_all_view, "elm,state,reorder,mode_unset", "elm");
3076 edje_object_message_signal_process(VIEW(it));
3077 edje_object_message_signal_process(it->deco_all_view);
3079 evas_object_del(it->deco_all_view);
3080 it->deco_all_view = NULL;
3081 elm_widget_stringlist_free(it->item->deco_all_texts);
3082 it->item->deco_all_texts = NULL;
3083 elm_widget_stringlist_free(it->item->deco_all_contents);
3084 it->item->deco_all_contents = NULL;
3085 elm_widget_stringlist_free(it->item->deco_all_states);
3086 it->item->deco_all_states = NULL;
3087 EINA_LIST_FREE (it->item->deco_all_content_objs, icon)
3088 evas_object_del(icon);
3090 _item_mouse_callbacks_del(it, it->deco_all_view);
3091 _item_mouse_callbacks_add(it, VIEW(it));
3093 it->item->decorate_all_item_realized = EINA_FALSE;
3097 _item_free_common(Elm_Gen_Item *it)
3099 Elm_Genlist_Smart_Data *sd = GL_IT(it)->wsd;
3100 elm_widget_item_pre_notify_del(it);
3101 if (it->itc->func.del)
3102 it->itc->func.del((void *)it->base.data, WIDGET(it));
3103 if (it->tooltip.del_cb)
3104 it->tooltip.del_cb((void *)it->tooltip.data, WIDGET(it), it);
3105 if (it->item->block) _item_block_del(it);
3107 it->parent->item->items =
3108 eina_list_remove(it->parent->item->items, it);
3109 if (it->item->queued) sd->queue = eina_list_remove(sd->queue, it);
3110 if (it->group) sd->group_items = eina_list_remove(sd->group_items, it);
3112 // FIXME: relative will be better to be fixed. it is too harsh.
3114 it->item->rel->item->rel_revs =
3115 eina_list_remove(it->item->rel->item->rel_revs, it);
3116 if (it->item->rel_revs)
3119 EINA_LIST_FREE(it->item->rel_revs, tmp) tmp->item->rel = NULL;
3121 _item_sub_items_clear(it);
3123 #if GENLIST_ENTRY_SUPPORT
3124 it->item->unrealize_disabled = EINA_FALSE;
3127 if (it->selected) sd->selected = eina_list_remove(sd->selected, it);
3128 if (sd->show_item == it) sd->show_item = NULL;
3129 if (sd->anchor_item == it)
3132 ELM_GEN_ITEM_FROM_INLIST(EINA_INLIST_GET(it)->next);
3133 if (!sd->anchor_item) sd->anchor_item =
3134 ELM_GEN_ITEM_FROM_INLIST(EINA_INLIST_GET(it)->prev);
3136 if (sd->expanded_item == it) sd->expanded_item = NULL;
3137 if (sd->expanded_next_item == it) sd->expanded_next_item = NULL;
3138 if (sd->state) eina_inlist_sorted_state_free(sd->state);
3140 if (sd->last_selected_item == (Elm_Object_Item *)it)
3141 sd->last_selected_item = NULL;
3145 ecore_timer_del(it->long_timer);
3146 it->long_timer = NULL;
3148 if (it->item->swipe_timer) ecore_timer_del(it->item->swipe_timer);
3150 sd->items = eina_inlist_remove(sd->items, EINA_INLIST_GET(it));
3155 _item_mouse_move_cb(void *data,
3156 Evas *evas __UNUSED__,
3160 EINA_SAFETY_ON_NULL_RETURN(data);
3161 Elm_Gen_Item *it = data;
3162 Elm_Genlist_Smart_Data *sd;
3163 Evas_Event_Mouse_Move *ev = event_info;
3164 Evas_Coord ox, oy, ow, oh, it_scrl_y, y_pos;
3165 Evas_Coord minw = 0, minh = 0, x, y, dx, dy, adx, ady;
3167 sd = GL_IT(it)->wsd;
3169 if (ev->event_flags & EVAS_EVENT_FLAG_ON_HOLD)
3171 if (!sd->on_hold) _item_unselect(it);
3172 sd->on_hold = EINA_TRUE;
3174 if (sd->multi_touched)
3176 sd->cur_x = ev->cur.canvas.x;
3177 sd->cur_y = ev->cur.canvas.y;
3180 if ((it->dragging) && (it->down))
3182 if (sd->movements == SWIPE_MOVES)
3183 sd->swipe = EINA_TRUE;
3186 sd->history[sd->movements].x = ev->cur.canvas.x;
3187 sd->history[sd->movements].y = ev->cur.canvas.y;
3188 if (abs((sd->history[sd->movements].x -
3189 sd->history[0].x)) > 40)
3190 sd->swipe = EINA_TRUE;
3196 ecore_timer_del(it->long_timer);
3197 it->long_timer = NULL;
3199 evas_object_smart_callback_call(WIDGET(it), SIG_DRAG, it);
3202 if ((!it->down) || (sd->longpressed))
3206 ecore_timer_del(it->long_timer);
3207 it->long_timer = NULL;
3209 if ((sd->reorder_mode) && (sd->reorder_it))
3211 evas_object_geometry_get(sd->pan_obj, &ox, &oy, &ow, &oh);
3213 if (ev->cur.canvas.y < (oy + (sd->reorder_it->item->h / 2)))
3214 sd->reorder_fast = 1;
3215 else if (ev->cur.canvas.y > (oy + oh - (sd->reorder_it->item->h / 2)))
3216 sd->reorder_fast = -1;
3217 else sd->reorder_fast = 0;
3219 it_scrl_y = ev->cur.canvas.y - sd->reorder_it->dy;
3221 if (!sd->reorder_start_y)
3222 sd->reorder_start_y = it->item->block->y + it->y;
3226 else if (it_scrl_y + sd->reorder_it->item->h > oy + oh)
3227 y_pos = oy + oh - sd->reorder_it->item->h;
3231 if (it->deco_all_view)
3232 _item_position(it, it->deco_all_view, it->item->scrl_x, y_pos);
3233 else if (it->item->deco_it_view)
3235 (it, it->item->deco_it_view, it->item->scrl_x, y_pos);
3237 _item_position(it, VIEW(it), it->item->scrl_x, y_pos);
3239 if (sd->calc_job) ecore_job_del(sd->calc_job);
3240 sd->calc_job = ecore_job_add(_calc_job, sd);
3244 if (it->select_mode != ELM_OBJECT_SELECT_MODE_DISPLAY_ONLY)
3245 elm_coords_finger_size_adjust(1, &minw, 1, &minh);
3247 evas_object_geometry_get(obj, &x, &y, NULL, NULL);
3248 x = ev->cur.canvas.x - x;
3249 y = ev->cur.canvas.y - y;
3252 if (adx < 0) adx = -dx;
3256 if (ady < 0) ady = -dy;
3260 if ((adx > minw) || (ady > minh))
3262 it->dragging = EINA_TRUE;
3265 ecore_timer_del(it->long_timer);
3266 it->long_timer = NULL;
3271 evas_object_smart_callback_call
3272 (WIDGET(it), SIG_DRAG_START_UP, it);
3276 evas_object_smart_callback_call
3277 (WIDGET(it), SIG_DRAG_START_LEFT, it);
3279 evas_object_smart_callback_call
3280 (WIDGET(it), SIG_DRAG_START_RIGHT, it);
3286 evas_object_smart_callback_call
3287 (WIDGET(it), SIG_DRAG_START_DOWN, it);
3291 evas_object_smart_callback_call
3292 (WIDGET(it), SIG_DRAG_START_LEFT, it);
3294 evas_object_smart_callback_call
3295 (WIDGET(it), SIG_DRAG_START_RIGHT, it);
3302 _long_press_cb(void *data)
3304 Elm_Gen_Item *it = data, *it2;
3305 Elm_Genlist_Smart_Data *sd;
3308 sd = GL_IT(it)->wsd;
3310 it->long_timer = NULL;
3311 if (elm_widget_item_disabled_get(it) || (it->dragging) ||
3312 (it->select_mode == ELM_OBJECT_SELECT_MODE_DISPLAY_ONLY))
3313 return ECORE_CALLBACK_CANCEL;
3315 GL_IT(it)->wsd->longpressed = EINA_TRUE;
3316 evas_object_smart_callback_call(WIDGET(it), SIG_LONGPRESSED, it);
3317 if ((GL_IT(it)->wsd->reorder_mode) && (!it->group))
3319 GL_IT(it)->wsd->reorder_it = it;
3320 GL_IT(it)->wsd->reorder_start_y = 0;
3321 if (it->deco_all_view)
3322 evas_object_raise(it->deco_all_view);
3324 evas_object_raise(VIEW(it));
3326 sd->s_iface->hold_set(ELM_WIDGET_DATA(sd)->obj, EINA_TRUE);
3327 sd->s_iface->bounce_allow_set
3328 (ELM_WIDGET_DATA(sd)->obj, EINA_FALSE, EINA_FALSE);
3330 EINA_LIST_FOREACH_SAFE(sd->selected, l, ll, it2)
3332 if (it != it2) _item_unselect(it2);
3335 // FIXME: difference from opensource
3336 if (it->item->items)
3338 EINA_LIST_FOREACH(it->item->items, l, it_tmp)
3340 if (elm_genlist_item_expanded_get((Elm_Object_Item *) it_tmp))
3342 elm_genlist_item_expanded_set((Elm_Object_Item *)it_tmp,
3344 return ECORE_CALLBACK_RENEW;
3349 if (elm_genlist_item_expanded_get((Elm_Object_Item *)it))
3351 elm_genlist_item_expanded_set((Elm_Object_Item *)it, EINA_FALSE);
3352 return ECORE_CALLBACK_RENEW;
3355 if (!GL_IT(it)->wsd->decorate_all_mode)
3356 edje_object_signal_emit
3357 (VIEW(it), "elm,state,reorder,enabled", "elm");
3360 return ECORE_CALLBACK_CANCEL;
3364 _swipe_do(Elm_Gen_Item *it)
3369 if ((it->select_mode == ELM_OBJECT_SELECT_MODE_DISPLAY_ONLY) ||
3370 elm_widget_item_disabled_get(it)) return;
3372 GL_IT(it)->wsd->swipe = EINA_FALSE;
3373 for (i = 0; i < GL_IT(it)->wsd->movements; i++)
3375 sum += GL_IT(it)->wsd->history[i].x;
3376 if (abs(GL_IT(it)->wsd->history[0].y -
3377 GL_IT(it)->wsd->history[i].y) > 10) return;
3380 sum /= GL_IT(it)->wsd->movements;
3381 if (abs(sum - GL_IT(it)->wsd->history[0].x) <= 10) return;
3382 evas_object_smart_callback_call(WIDGET(it), SIG_SWIPE, it);
3386 _swipe_cancel(void *data)
3388 Elm_Gen_Item *it = data;
3390 if (!it) return ECORE_CALLBACK_CANCEL;
3391 GL_IT(it)->wsd->swipe = EINA_FALSE;
3392 GL_IT(it)->wsd->movements = 0;
3394 return ECORE_CALLBACK_RENEW;
3398 _multi_cancel(void *data)
3400 Elm_Genlist_Smart_Data *sd = data;
3402 if (!sd) return ECORE_CALLBACK_CANCEL;
3403 sd->multi_timeout = EINA_TRUE;
3405 return ECORE_CALLBACK_RENEW;
3409 _multi_touch_gesture_eval(void *data)
3411 Elm_Gen_Item *it = data;
3412 Evas_Coord minw = 0, minh = 0;
3413 Evas_Coord off_x, off_y, off_mx, off_my;
3415 GL_IT(it)->wsd->multi_touched = EINA_FALSE;
3416 if (GL_IT(it)->wsd->multi_timer)
3418 ecore_timer_del(GL_IT(it)->wsd->multi_timer);
3419 GL_IT(it)->wsd->multi_timer = NULL;
3421 if (GL_IT(it)->wsd->multi_timeout)
3423 GL_IT(it)->wsd->multi_timeout = EINA_FALSE;
3427 elm_coords_finger_size_adjust(1, &minw, 1, &minh);
3428 off_x = abs(GL_IT(it)->wsd->cur_x - GL_IT(it)->wsd->prev_x);
3429 off_y = abs(GL_IT(it)->wsd->cur_y - GL_IT(it)->wsd->prev_y);
3430 off_mx = abs(GL_IT(it)->wsd->cur_mx - GL_IT(it)->wsd->prev_mx);
3431 off_my = abs(GL_IT(it)->wsd->cur_my - GL_IT(it)->wsd->prev_my);
3433 if (((off_x > minw) || (off_y > minh)) && ((off_mx > minw)
3434 || (off_my > minh)))
3436 if ((off_x + off_mx) > (off_y + off_my))
3438 if ((GL_IT(it)->wsd->cur_x > GL_IT(it)->wsd->prev_x)
3439 && (GL_IT(it)->wsd->cur_mx > GL_IT(it)->wsd->prev_mx))
3440 evas_object_smart_callback_call
3441 (WIDGET(it), SIG_MULTI_SWIPE_RIGHT, it);
3442 else if ((GL_IT(it)->wsd->cur_x < GL_IT(it)->wsd->prev_x)
3443 && (GL_IT(it)->wsd->cur_mx < GL_IT(it)->wsd->prev_mx))
3444 evas_object_smart_callback_call
3445 (WIDGET(it), SIG_MULTI_SWIPE_LEFT, it);
3446 else if (abs(GL_IT(it)->wsd->cur_x - GL_IT(it)->wsd->cur_mx) >
3447 abs(GL_IT(it)->wsd->prev_x - GL_IT(it)->wsd->prev_mx))
3448 evas_object_smart_callback_call
3449 (WIDGET(it), SIG_MULTI_PINCH_OUT, it);
3451 evas_object_smart_callback_call
3452 (WIDGET(it), SIG_MULTI_PINCH_IN, it);
3456 if ((GL_IT(it)->wsd->cur_y > GL_IT(it)->wsd->prev_y)
3457 && (GL_IT(it)->wsd->cur_my > GL_IT(it)->wsd->prev_my))
3458 evas_object_smart_callback_call
3459 (WIDGET(it), SIG_MULTI_SWIPE_DOWN, it);
3460 else if ((GL_IT(it)->wsd->cur_y < GL_IT(it)->wsd->prev_y)
3461 && (GL_IT(it)->wsd->cur_my < GL_IT(it)->wsd->prev_my))
3462 evas_object_smart_callback_call
3463 (WIDGET(it), SIG_MULTI_SWIPE_UP, it);
3464 else if (abs(GL_IT(it)->wsd->cur_y - GL_IT(it)->wsd->cur_my) >
3465 abs(GL_IT(it)->wsd->prev_y - GL_IT(it)->wsd->prev_my))
3467 evas_object_smart_callback_call
3468 (WIDGET(it), SIG_MULTI_PINCH_OUT, it);
3469 #if GENLIST_PINCH_ZOOM_SUPPORT
3470 if (IS_ROOT_PARENT_IT(it) && (GL_IT(it)->wsd->pinch_zoom_mode == ELM_GEN_PINCH_ZOOM_CONTRACT))
3472 elm_genlist_pinch_zoom_mode_set(ELM_WIDGET_DATA(GL_IT(it)->wsd)->obj, ELM_GEN_PINCH_ZOOM_EXPAND);
3473 elm_genlist_item_show((Elm_Object_Item *)it, ELM_GENLIST_ITEM_SCROLLTO_TOP);
3479 evas_object_smart_callback_call
3480 (WIDGET(it), SIG_MULTI_PINCH_IN, it);
3481 #if GENLIST_PINCH_ZOOM_SUPPORT
3482 elm_genlist_pinch_zoom_mode_set(ELM_WIDGET_DATA(GL_IT(it)->wsd)->obj,
3483 ELM_GEN_PINCH_ZOOM_CONTRACT);
3489 GL_IT(it)->wsd->multi_timeout = EINA_FALSE;
3493 _item_multi_down_cb(void *data,
3494 Evas *evas __UNUSED__,
3495 Evas_Object *obj __UNUSED__,
3498 Elm_Gen_Item *it = data;
3499 Evas_Event_Multi_Down *ev = event_info;
3501 if ((GL_IT(it)->wsd->multi_device != 0) || (GL_IT(it)->wsd->multi_touched)
3502 || (GL_IT(it)->wsd->multi_timeout))
3505 GL_IT(it)->wsd->multi_device = ev->device;
3506 GL_IT(it)->wsd->multi_down = EINA_TRUE;
3507 GL_IT(it)->wsd->multi_touched = EINA_TRUE;
3508 GL_IT(it)->wsd->prev_mx = ev->canvas.x;
3509 GL_IT(it)->wsd->prev_my = ev->canvas.y;
3511 if (!GL_IT(it)->wsd->wasselected)
3513 GL_IT(it)->wsd->wasselected = EINA_FALSE;
3517 ecore_timer_del(it->long_timer);
3518 it->long_timer = NULL;
3522 it->dragging = EINA_FALSE;
3523 evas_object_smart_callback_call(WIDGET(it), SIG_DRAG_STOP, it);
3525 if (it->item->swipe_timer)
3527 ecore_timer_del(it->item->swipe_timer);
3528 it->item->swipe_timer = NULL;
3530 GL_IT(it)->wsd->longpressed = EINA_FALSE;
3531 if (GL_IT(it)->wsd->on_hold)
3533 GL_IT(it)->wsd->swipe = EINA_FALSE;
3534 GL_IT(it)->wsd->movements = 0;
3535 GL_IT(it)->wsd->on_hold = EINA_FALSE;
3540 _item_multi_up_cb(void *data,
3541 Evas *evas __UNUSED__,
3542 Evas_Object *obj __UNUSED__,
3545 Elm_Gen_Item *it = data;
3546 Evas_Event_Multi_Up *ev = event_info;
3548 if (GL_IT(it)->wsd->multi_device != ev->device) return;
3549 GL_IT(it)->wsd->multi_device = 0;
3550 GL_IT(it)->wsd->multi_down = EINA_FALSE;
3551 if (GL_IT(it)->wsd->mouse_down) return;
3552 _multi_touch_gesture_eval(data);
3556 _item_multi_move_cb(void *data,
3557 Evas *evas __UNUSED__,
3558 Evas_Object *obj __UNUSED__,
3561 Elm_Gen_Item *it = data;
3562 Evas_Event_Multi_Move *ev = event_info;
3564 if (GL_IT(it)->wsd->multi_device != ev->device) return;
3565 GL_IT(it)->wsd->cur_mx = ev->cur.canvas.x;
3566 GL_IT(it)->wsd->cur_my = ev->cur.canvas.y;
3570 // FIXME: difference from upstream
3572 _item_unfocusable_set(Elm_Gen_Item *it, Eina_Bool unfocus)
3575 Evas_Object *item_obj;
3576 Evas_Object *obj = WIDGET(it);
3580 EINA_LIST_FOREACH(it->content_objs, l, item_obj)
3582 if (unfocus) elm_widget_focused_object_clear(item_obj);
3583 elm_widget_tree_unfocusable_set(item_obj, unfocus);
3585 EINA_LIST_FOREACH(it->item->flip_content_objs, l, item_obj)
3587 if (unfocus) elm_widget_focused_object_clear(item_obj);
3588 elm_widget_tree_unfocusable_set(item_obj, unfocus);
3590 EINA_LIST_FOREACH(it->item->deco_all_content_objs, l, item_obj)
3592 if (unfocus) elm_widget_focused_object_clear(item_obj);
3593 elm_widget_tree_unfocusable_set(item_obj, unfocus);
3595 it->can_focus = !unfocus;
3601 _item_mouse_down_cb(void *data,
3602 Evas *evas __UNUSED__,
3606 Evas_Event_Mouse_Down *ev = event_info;
3607 Elm_Gen_Item *it = data;
3608 Elm_Genlist_Smart_Data *sd = GL_IT(it)->wsd;
3611 if (ev->button != 1) return;
3613 _item_unfocusable_set(it, EINA_FALSE);
3615 it->down = EINA_TRUE;
3616 it->dragging = EINA_FALSE;
3617 evas_object_geometry_get(obj, &x, &y, NULL, NULL);
3618 it->dx = ev->canvas.x - x;
3619 it->dy = ev->canvas.y - y;
3620 sd->mouse_down = EINA_TRUE;
3621 if (!sd->multi_touched)
3623 sd->prev_x = ev->canvas.x;
3624 sd->prev_y = ev->canvas.y;
3625 sd->multi_timeout = EINA_FALSE;
3626 if (sd->multi_timer) ecore_timer_del(sd->multi_timer);
3627 sd->multi_timer = ecore_timer_add(1, _multi_cancel, sd);
3629 sd->longpressed = EINA_FALSE;
3630 if (ev->event_flags & EVAS_EVENT_FLAG_ON_HOLD)
3632 sd->on_hold = EINA_TRUE;
3635 else sd->on_hold = EINA_FALSE;
3636 _item_highlight(it);
3637 if (ev->flags & EVAS_BUTTON_DOUBLE_CLICK)
3638 if ((!elm_widget_item_disabled_get(it)) &&
3639 (it->select_mode != ELM_OBJECT_SELECT_MODE_DISPLAY_ONLY))
3641 evas_object_smart_callback_call(WIDGET(it), SIG_CLICKED_DOUBLE, it);
3642 evas_object_smart_callback_call(WIDGET(it), SIG_ACTIVATED, it);
3644 if (it->item->swipe_timer) ecore_timer_del(it->item->swipe_timer);
3645 it->item->swipe_timer = ecore_timer_add(0.4, _swipe_cancel, it);
3646 if (it->long_timer) ecore_timer_del(it->long_timer);
3648 it->long_timer = ecore_timer_add
3649 (sd->longpress_timeout, _long_press_cb, it);
3651 it->long_timer = NULL;
3652 sd->swipe = EINA_FALSE;
3657 _item_block_new(Elm_Genlist_Smart_Data *sd,
3662 itb = calloc(1, sizeof(Item_Block));
3663 if (!itb) return NULL;
3667 sd->blocks = eina_inlist_prepend(sd->blocks, EINA_INLIST_GET(itb));
3668 _item_block_position_update(sd->blocks, 0);
3672 sd->blocks = eina_inlist_append(sd->blocks, EINA_INLIST_GET(itb));
3673 itb->position_update = EINA_TRUE;
3674 if (sd->blocks != EINA_INLIST_GET(itb))
3677 ((Item_Block *)(EINA_INLIST_GET(itb)->prev))->position + 1;
3689 _item_block_add(Elm_Genlist_Smart_Data *sd,
3692 Item_Block *itb = NULL;
3699 itb = calloc(1, sizeof(Item_Block));
3700 if (!itb) return EINA_FALSE;
3702 if (!it->item->rel->item->block)
3705 eina_inlist_append(sd->blocks, EINA_INLIST_GET(itb));
3706 itb->items = eina_list_append(itb->items, it);
3707 itb->position_update = EINA_TRUE;
3708 it->position = eina_list_count(itb->items);
3709 it->position_update = EINA_TRUE;
3711 if (sd->blocks != EINA_INLIST_GET(itb))
3715 (EINA_INLIST_GET(itb)->prev))->position + 1;
3726 tmp = eina_list_data_find_list(itb->items, it->item->rel);
3727 if (it->item->before)
3729 sd->blocks = eina_inlist_prepend_relative
3730 (sd->blocks, EINA_INLIST_GET(itb),
3731 EINA_INLIST_GET(it->item->rel->item->block));
3733 eina_list_prepend_relative_list(itb->items, it, tmp);
3735 /* Update index from where we prepended */
3736 _item_position_update
3737 (eina_list_prev(tmp), it->item->rel->position);
3738 _item_block_position_update
3739 (EINA_INLIST_GET(itb),
3740 it->item->rel->item->block->position);
3744 sd->blocks = eina_inlist_append_relative
3745 (sd->blocks, EINA_INLIST_GET(itb),
3746 EINA_INLIST_GET(it->item->rel->item->block));
3748 eina_list_append_relative_list(itb->items, it, tmp);
3750 /* Update block index from where we appended */
3751 _item_position_update
3752 (eina_list_next(tmp), it->item->rel->position + 1);
3753 _item_block_position_update
3754 (EINA_INLIST_GET(itb),
3755 it->item->rel->item->block->position + 1);
3761 if (it->item->before)
3765 itb = (Item_Block *)(sd->blocks);
3766 if (itb->count >= sd->max_items_per_block)
3768 itb = _item_block_new(sd, EINA_TRUE);
3769 if (!itb) return EINA_FALSE;
3774 itb = _item_block_new(sd, EINA_TRUE);
3775 if (!itb) return EINA_FALSE;
3777 itb->items = eina_list_prepend(itb->items, it);
3779 _item_position_update(itb->items, 0);
3785 itb = (Item_Block *)(sd->blocks->last);
3786 if (itb->count >= sd->max_items_per_block)
3788 itb = _item_block_new(sd, EINA_FALSE);
3789 if (!itb) return EINA_FALSE;
3794 itb = _item_block_new(sd, EINA_FALSE);
3795 if (!itb) return EINA_FALSE;
3797 itb->items = eina_list_append(itb->items, it);
3798 it->position = eina_list_count(itb->items);
3806 if (it->item->rel->item->queued)
3808 /* NOTE: for a strange reason eina_list and eina_inlist
3809 don't have the same property on sorted insertion
3810 order, so the queue is not always ordered like the
3811 item list. This lead to issue where we depend on an
3812 item that is not yet created. As a quick work around,
3813 we reschedule the calc of the item and stop reordering
3814 the list to prevent any nasty issue to show up here.
3816 sd->queue = eina_list_append(sd->queue, it);
3817 sd->requeued = EINA_TRUE;
3818 it->item->queued = EINA_TRUE;
3822 itb = it->item->rel->item->block;
3823 if (!itb) goto newblock;
3824 tmp = eina_list_data_find_list(itb->items, it->item->rel);
3825 if (it->item->before)
3827 itb->items = eina_list_prepend_relative_list(itb->items, it, tmp);
3828 _item_position_update
3829 (eina_list_prev(tmp), it->item->rel->position);
3833 itb->items = eina_list_append_relative_list(itb->items, it, tmp);
3834 _item_position_update
3835 (eina_list_next(tmp), it->item->rel->position + 1);
3840 itb->changed = EINA_TRUE;
3841 it->item->block = itb;
3842 if (itb->sd->calc_job) ecore_job_del(itb->sd->calc_job);
3843 itb->sd->calc_job = ecore_job_add(_calc_job, itb->sd);
3845 if (itb->count > itb->sd->max_items_per_block)
3850 Eina_Bool done = EINA_FALSE;
3852 newc = itb->count / 2;
3854 if (EINA_INLIST_GET(itb)->prev)
3856 Item_Block *itbp = (Item_Block *)(EINA_INLIST_GET(itb)->prev);
3858 if (itbp->count + newc < sd->max_items_per_block / 2)
3860 /* moving items to previous block */
3861 while ((itb->count > newc) && (itb->items))
3863 it2 = eina_list_data_get(itb->items);
3864 itb->items = eina_list_remove_list
3865 (itb->items, itb->items);
3868 itbp->items = eina_list_append(itbp->items, it2);
3869 it2->item->block = itbp;
3877 if (!done && EINA_INLIST_GET(itb)->next)
3879 Item_Block *itbn = (Item_Block *)(EINA_INLIST_GET(itb)->next);
3881 if (itbn->count + newc < sd->max_items_per_block / 2)
3883 /* moving items to next block */
3884 while ((itb->count > newc) && (itb->items))
3888 l = eina_list_last(itb->items);
3889 it2 = eina_list_data_get(l);
3890 itb->items = eina_list_remove_list(itb->items, l);
3893 itbn->items = eina_list_prepend(itbn->items, it2);
3894 it2->item->block = itbn;
3904 /* moving items to new block */
3905 itb2 = calloc(1, sizeof(Item_Block));
3906 if (!itb2) return EINA_FALSE;
3909 eina_inlist_append_relative(sd->blocks, EINA_INLIST_GET(itb2),
3910 EINA_INLIST_GET(itb));
3911 itb2->changed = EINA_TRUE;
3912 while ((itb->count > newc) && (itb->items))
3916 l = eina_list_last(itb->items);
3918 itb->items = eina_list_remove_list(itb->items, l);
3921 itb2->items = eina_list_prepend(itb2->items, it2);
3922 it2->item->block = itb2;
3932 _item_process(Elm_Genlist_Smart_Data *sd,
3935 if (!_item_block_add(sd, it)) return 1;
3937 _item_block_realize(it->item->block);
3943 _item_process_post(Elm_Genlist_Smart_Data *sd,
3947 Eina_Bool show_me = EINA_FALSE;
3949 if (it->item->block->changed)
3951 show_me = _item_block_recalc
3952 (it->item->block, it->item->block->num, qadd);
3953 it->item->block->changed = 0;
3954 if (sd->pan_changed)
3956 if (sd->calc_job) ecore_job_del(sd->calc_job);
3957 sd->calc_job = NULL;
3959 sd->pan_changed = EINA_FALSE;
3962 if (show_me) it->item->block->show_me = EINA_TRUE;
3964 /* when prepending, move the scroller along with the first selected
3965 * item to create the illusion that we're watching the selected
3966 * item this prevents the selected item being scrolled off the
3969 if (sd->selected && it->item->before)
3974 it2 = sd->selected->data;
3975 if (!it2->item->block) return;
3976 sd->s_iface->content_pos_get(ELM_WIDGET_DATA(sd)->obj, NULL, &y);
3977 evas_object_geometry_get(sd->pan_obj, NULL, NULL, NULL, &h);
3978 if ((it->y + it->item->block->y > y + h) ||
3979 (it->y + it->item->block->y + it->item->h < y))
3980 /* offscreen, just update */
3981 sd->s_iface->content_region_show
3982 (ELM_WIDGET_DATA(sd)->obj, it2->x + it2->item->block->x, y,
3983 it2->item->block->w, h);
3985 sd->s_iface->content_region_show
3986 (ELM_WIDGET_DATA(sd)->obj, it->x + it->item->block->x,
3987 y + it->item->h, it->item->block->w, h);
3992 _queue_process(Elm_Genlist_Smart_Data *sd)
3997 t0 = ecore_loop_time_get();
3998 for (n = 0; (sd->queue) && (n < 128); n++)
4002 it = eina_list_data_get(sd->queue);
4003 sd->queue = eina_list_remove_list(sd->queue, sd->queue);
4004 it->item->queued = EINA_FALSE;
4005 if (_item_process(sd, it)) continue;
4006 t = ecore_time_get();
4007 _item_process_post(sd, it, EINA_TRUE);
4008 /* same as eina_inlist_count > 1 */
4009 if (sd->blocks && sd->blocks->next)
4011 if ((t - t0) > (ecore_animator_frametime_get())) break;
4018 _idle_process(void *data,
4021 Elm_Genlist_Smart_Data *sd = data;
4023 if (_queue_process(sd) > 0) *wakeup = EINA_TRUE;
4026 return ECORE_CALLBACK_CANCEL;
4028 #if GENLIST_FX_SUPPORT
4029 if (sd->fx_first_captured)
4030 _elm_genlist_fx_clear(ELM_WIDGET_DATA(sd)->obj);
4032 return ECORE_CALLBACK_RENEW;
4036 _item_idle_enterer(void *data)
4038 Eina_Bool wakeup = EINA_FALSE;
4039 Elm_Genlist_Smart_Data *sd = data;
4040 Eina_Bool ok = _idle_process(data, &wakeup);
4045 if (sd->calc_job) ecore_job_del(sd->calc_job);
4046 sd->calc_job = ecore_job_add(_calc_job, sd);
4048 if (ok == ECORE_CALLBACK_CANCEL) sd->queue_idle_enterer = NULL;
4054 _item_queue(Elm_Genlist_Smart_Data *sd,
4058 if (it->item->queued) return;
4059 it->item->queued = EINA_TRUE;
4060 if (cb && !sd->requeued)
4061 sd->queue = eina_list_sorted_insert(sd->queue, cb, it);
4063 sd->queue = eina_list_append(sd->queue, it);
4064 // FIXME: why does a freeze then thaw here cause some genlist
4065 // elm_genlist_item_append() to be much much slower?
4066 // evas_event_freeze(evas_object_evas_get(sd->obj));
4067 while ((sd->queue) && ((!sd->blocks) || (!sd->blocks->next)))
4069 if (sd->queue_idle_enterer)
4071 ecore_idle_enterer_del(sd->queue_idle_enterer);
4072 sd->queue_idle_enterer = NULL;
4076 while ((sd->queue) && (sd->blocks) &&
4077 (sd->homogeneous) && (sd->mode == ELM_LIST_COMPRESS))
4079 if (sd->queue_idle_enterer)
4081 ecore_idle_enterer_del(sd->queue_idle_enterer);
4082 sd->queue_idle_enterer = NULL;
4087 // evas_event_thaw(evas_object_evas_get(sd->obj));
4088 // evas_event_thaw_eval(evas_object_evas_get(sd->obj));
4089 if (!sd->queue_idle_enterer)
4090 sd->queue_idle_enterer = ecore_idle_enterer_add(_item_idle_enterer, sd);
4093 /* If the application wants to know the relative item, use
4094 * elm_genlist_item_prev_get(it)*/
4096 _item_move_after(Elm_Gen_Item *it,
4097 Elm_Gen_Item *after)
4101 if (it == after) return;
4103 GL_IT(it)->wsd->items =
4104 eina_inlist_remove(GL_IT(it)->wsd->items, EINA_INLIST_GET(it));
4105 if (it->item->block) _item_block_del(it);
4107 GL_IT(it)->wsd->items = eina_inlist_append_relative
4108 (GL_IT(it)->wsd->items, EINA_INLIST_GET(it), EINA_INLIST_GET(after));
4109 it->item->rel = after;
4110 after->item->rel_revs = eina_list_append(after->item->rel_revs, it);
4111 it->item->before = EINA_FALSE;
4112 if (after->item->group_item) it->item->group_item = after->item->group_item;
4113 _item_queue(GL_IT(it)->wsd, it, NULL);
4115 evas_object_smart_callback_call(WIDGET(it), SIG_MOVED_AFTER, it);
4119 _access_activate_cb(void *data __UNUSED__,
4120 Evas_Object *part_obj __UNUSED__,
4121 Elm_Object_Item *item)
4123 _item_select_unselect((Elm_Gen_Item *)item, EINA_TRUE);
4126 /* If the application wants to know the relative item, use
4127 * elm_genlist_item_next_get(it)*/
4129 _item_move_before(Elm_Gen_Item *it,
4130 Elm_Gen_Item *before)
4133 if (!before) return;
4134 if (it == before) return;
4136 GL_IT(it)->wsd->items =
4137 eina_inlist_remove(GL_IT(it)->wsd->items, EINA_INLIST_GET(it));
4138 if (it->item->block) _item_block_del(it);
4139 GL_IT(it)->wsd->items = eina_inlist_prepend_relative
4140 (GL_IT(it)->wsd->items, EINA_INLIST_GET(it), EINA_INLIST_GET(before));
4141 it->item->rel = before;
4142 before->item->rel_revs = eina_list_append(before->item->rel_revs, it);
4143 it->item->before = EINA_TRUE;
4144 if (before->item->group_item)
4145 it->item->group_item = before->item->group_item;
4146 _item_queue(GL_IT(it)->wsd, it, NULL);
4148 evas_object_smart_callback_call(WIDGET(it), SIG_MOVED_BEFORE, it);
4152 _item_mouse_up_cb(void *data,
4153 Evas *evas __UNUSED__,
4154 Evas_Object *obj __UNUSED__,
4157 Evas_Event_Mouse_Up *ev = event_info;
4158 Eina_Bool dragged = EINA_FALSE;
4159 Elm_Genlist_Smart_Data *sd;
4160 Elm_Gen_Item *it = data;
4162 if (ev->button != 1) return;
4163 it->down = EINA_FALSE;
4164 sd = GL_IT(it)->wsd;
4166 sd->mouse_down = EINA_FALSE;
4167 if (sd->multi_touched)
4169 if ((!sd->multi) && (!it->selected) && (it->highlighted))
4170 _item_unhighlight(it);
4171 if (sd->multi_down) return;
4172 _multi_touch_gesture_eval(data);
4177 ecore_timer_del(it->long_timer);
4178 it->long_timer = NULL;
4182 it->dragging = EINA_FALSE;
4183 evas_object_smart_callback_call(WIDGET(it), SIG_DRAG_STOP, it);
4186 if (it->item->swipe_timer)
4188 ecore_timer_del(it->item->swipe_timer);
4189 it->item->swipe_timer = NULL;
4191 if (sd->multi_timer)
4193 ecore_timer_del(sd->multi_timer);
4194 sd->multi_timer = NULL;
4195 sd->multi_timeout = EINA_FALSE;
4197 sd->on_hold = EINA_FALSE;
4198 if (ev->event_flags & EVAS_EVENT_FLAG_ON_HOLD)
4200 if (sd->swipe) _swipe_do(data);
4201 sd->longpressed = EINA_FALSE;
4204 if ((sd->reorder_mode) && (sd->reorder_it))
4206 Evas_Coord it_scrl_y = ev->canvas.y - sd->reorder_it->dy;
4207 sd->reorder_fast = 0;
4209 if (sd->reorder_rel &&
4210 (sd->reorder_it->parent == sd->reorder_rel->parent))
4212 if (it_scrl_y <= sd->reorder_rel->item->scrl_y)
4213 _item_move_before(sd->reorder_it, sd->reorder_rel);
4215 _item_move_after(sd->reorder_it, sd->reorder_rel);
4216 evas_object_smart_callback_call(WIDGET(it), SIG_MOVED, it);
4220 if (sd->calc_job) ecore_job_del(sd->calc_job);
4221 sd->calc_job = ecore_job_add(_calc_job, sd);
4223 edje_object_signal_emit(VIEW(it), "elm,state,reorder,disabled", "elm");
4224 sd->reorder_it = sd->reorder_rel = NULL;
4225 sd->s_iface->hold_set(ELM_WIDGET_DATA(sd)->obj, EINA_FALSE);
4226 sd->s_iface->bounce_allow_set
4227 (ELM_WIDGET_DATA(sd)->obj, sd->h_bounce, sd->v_bounce);
4231 if (it->want_unrealize && !(it->item->unrealize_disabled))
4233 _item_unrealize(it, EINA_FALSE);
4234 if (it->item->block->want_unrealize)
4235 _item_block_unrealize(it->item->block);
4240 if (!sd->longpressed)
4241 if ((sd->select_mode == ELM_OBJECT_SELECT_MODE_ALWAYS) ||
4242 (it->select_mode == ELM_OBJECT_SELECT_MODE_ALWAYS))
4243 _item_select_unselect(it, EINA_TRUE);
4244 else _item_select_unselect(it, !it->selected);
4246 _item_unhighlight(it);
4250 _item_mouse_callbacks_add(Elm_Gen_Item *it,
4253 evas_object_event_callback_add
4254 (view, EVAS_CALLBACK_MOUSE_DOWN, _item_mouse_down_cb, it);
4255 evas_object_event_callback_add
4256 (view, EVAS_CALLBACK_MOUSE_UP, _item_mouse_up_cb, it);
4257 evas_object_event_callback_add
4258 (view, EVAS_CALLBACK_MOUSE_MOVE, _item_mouse_move_cb, it);
4259 evas_object_event_callback_add
4260 (view, EVAS_CALLBACK_MULTI_DOWN, _item_multi_down_cb, it);
4261 evas_object_event_callback_add
4262 (view, EVAS_CALLBACK_MULTI_UP, _item_multi_up_cb, it);
4263 evas_object_event_callback_add
4264 (view, EVAS_CALLBACK_MULTI_MOVE, _item_multi_move_cb, it);
4268 _item_mouse_callbacks_del(Elm_Gen_Item *it,
4271 evas_object_event_callback_del_full
4272 (view, EVAS_CALLBACK_MOUSE_DOWN, _item_mouse_down_cb, it);
4273 evas_object_event_callback_del_full
4274 (view, EVAS_CALLBACK_MOUSE_UP, _item_mouse_up_cb, it);
4275 evas_object_event_callback_del_full
4276 (view, EVAS_CALLBACK_MOUSE_MOVE, _item_mouse_move_cb, it);
4277 evas_object_event_callback_del_full
4278 (view, EVAS_CALLBACK_MULTI_DOWN, _item_multi_down_cb, it);
4279 evas_object_event_callback_del_full
4280 (view, EVAS_CALLBACK_MULTI_UP, _item_multi_up_cb, it);
4281 evas_object_event_callback_del_full
4282 (view, EVAS_CALLBACK_MULTI_MOVE, _item_multi_move_cb, it);
4286 _scroll_hold_timer_cb(void *data)
4288 Elm_Genlist_Smart_Data *sd = data;
4290 if (!data) return ECORE_CALLBACK_CANCEL;
4292 sd->s_iface->hold_set(ELM_WIDGET_DATA(sd)->obj, EINA_FALSE);
4293 sd->scr_hold_timer = NULL;
4295 return ECORE_CALLBACK_CANCEL;
4299 _decorate_item_finished_signal_cb(void *data,
4301 const char *emission __UNUSED__,
4302 const char *source __UNUSED__)
4304 Elm_Gen_Item *it = data;
4307 if (!data || !obj) return;
4308 if ((!it->realized) || (!it->item->deco_it_view)) return;
4310 it->item->nocache_once = EINA_FALSE;
4311 _decorate_item_unrealize(it);
4312 if (it->item->group_item)
4313 evas_object_raise(it->item->VIEW(group_item));
4315 snprintf(buf, sizeof(buf), "elm,state,%s,passive,finished",
4316 GL_IT(it)->wsd->decorate_it_type);
4317 edje_object_signal_callback_del_full
4318 (obj, buf, "elm", _decorate_item_finished_signal_cb, it);
4322 _item_mode_content_unrealize(Elm_Gen_Item *it,
4323 Evas_Object *target,
4326 Eina_List **contents_list)
4328 Eina_List *res = *contents_list;
4330 if (it->itc->func.content_get)
4334 Evas_Object *ic = NULL;
4336 EINA_LIST_FOREACH(*source, l, key)
4338 if (parts && fnmatch(parts, key, FNM_PERIOD))
4341 ic = edje_object_part_swallow_get(target, key);
4344 res = eina_list_remove(res, ic);
4345 edje_object_part_unswallow(target, ic);
4346 evas_object_del(ic);
4355 _item_content_unrealize(Elm_Gen_Item *it,
4356 Evas_Object *target,
4360 Eina_List *res = it->content_objs;
4362 if (it->itc->func.content_get)
4366 Evas_Object *ic = NULL;
4368 EINA_LIST_FOREACH(*source, l, key)
4370 if (parts && fnmatch(parts, key, FNM_PERIOD))
4373 ic = edje_object_part_swallow_get(target, key);
4376 res = eina_list_remove(res, ic);
4377 edje_object_part_unswallow(target, ic);
4378 // FIXME: If parent-child relationship was broken before 'ic'
4379 // is deleted, freeze_pop will not be called. ex) elm_slider
4380 // If layout is used instead of edje, this problme can be
4382 if (0 != elm_widget_scroll_freeze_get(ic))
4383 elm_widget_scroll_freeze_pop(ic);
4384 evas_object_del(ic);
4393 _item_block_recalc(Item_Block *itb,
4397 const Eina_List *l, *ll;
4399 Evas_Coord minw = 0, minh = 0;
4400 Eina_Bool show_me = EINA_FALSE, changed = EINA_FALSE;
4404 EINA_LIST_FOREACH_SAFE(itb->items, l, ll, it)
4406 show_me |= it->item->show_me;
4411 if (!it->item->mincalcd) changed = EINA_TRUE;
4414 _item_realize(it, in, EINA_TRUE);
4415 _item_unrealize(it, EINA_TRUE);
4420 if ((itb->sd->homogeneous) &&
4421 (itb->sd->mode == ELM_LIST_COMPRESS))
4425 it->item->w = it->item->minw =
4426 GL_IT(it)->wsd->group_item_width;
4427 it->item->h = it->item->minh =
4428 GL_IT(it)->wsd->group_item_height;
4432 it->item->w = it->item->minw =
4433 GL_IT(it)->wsd->item_width;
4434 it->item->h = it->item->minh =
4435 GL_IT(it)->wsd->item_height;
4440 _item_realize(it, in, EINA_TRUE);
4441 _item_unrealize(it, EINA_TRUE);
4447 if (!it->item->mincalcd) changed = EINA_TRUE;
4448 _item_realize(it, in, EINA_FALSE);
4450 minh += it->item->minh;
4451 if (minw < it->item->minw) minw = it->item->minw;
4455 #if GENLIST_PINCH_ZOOM_SUPPORT
4456 if (IS_ROOT_PARENT_IT(it))
4457 it->item->pan_scrl_y = itb->y + it->y;
4461 if (changed) itb->sd->pan_changed = changed;
4464 itb->changed = EINA_FALSE;
4465 itb->position_update = EINA_FALSE;
4471 _update_job(void *data)
4473 Eina_Bool position = EINA_FALSE, recalc = EINA_FALSE;
4474 Elm_Genlist_Smart_Data *sd = data;
4479 sd->update_job = NULL;
4482 //evas_event_freeze(evas_object_evas_get(ELM_WIDGET_DATA(sd)->obj));
4483 EINA_INLIST_FOREACH(sd->blocks, itb)
4485 Evas_Coord itminw, itminh;
4492 _item_block_position(itb, num);
4496 recalc = EINA_FALSE;
4497 EINA_LIST_FOREACH(itb->items, l2, it)
4499 if (it->item->updateme)
4501 itminw = it->item->minw;
4502 itminh = it->item->minh;
4504 it->item->updateme = EINA_FALSE;
4507 _item_unrealize(it, EINA_FALSE);
4508 _item_realize(it, num, EINA_FALSE);
4509 position = EINA_TRUE;
4513 _item_realize(it, num, EINA_TRUE);
4514 _item_unrealize(it, EINA_TRUE);
4516 if ((it->item->minw != itminw) || (it->item->minh != itminh))
4521 itb->updateme = EINA_FALSE;
4524 position = EINA_TRUE;
4525 itb->changed = EINA_TRUE;
4526 _item_block_recalc(itb, num0, EINA_FALSE);
4527 _item_block_position(itb, num0);
4532 if (sd->calc_job) ecore_job_del(sd->calc_job);
4533 sd->calc_job = ecore_job_add(_calc_job, sd);
4535 //evas_event_thaw(evas_object_evas_get(ELM_WIDGET_DATA(sd)->obj));
4536 //evas_event_thaw_eval(evas_object_evas_get(ELM_WIDGET_DATA(sd)->obj));
4540 _scroll_animate_start_cb(Evas_Object *obj,
4541 void *data __UNUSED__)
4543 evas_object_smart_callback_call(obj, SIG_SCROLL_ANIM_START, NULL);
4547 _scroll_animate_stop_cb(Evas_Object *obj,
4548 void *data __UNUSED__)
4550 evas_object_smart_callback_call(obj, SIG_SCROLL_ANIM_STOP, NULL);
4554 _scroll_drag_start_cb(Evas_Object *obj,
4555 void *data __UNUSED__)
4557 evas_object_smart_callback_call(obj, SIG_SCROLL_DRAG_START, NULL);
4561 _scroll_drag_stop_cb(Evas_Object *obj,
4562 void *data __UNUSED__)
4564 evas_object_smart_callback_call(obj, SIG_SCROLL_DRAG_STOP, NULL);
4568 _edge_left_cb(Evas_Object *obj,
4569 void *data __UNUSED__)
4571 evas_object_smart_callback_call(obj, SIG_EDGE_LEFT, NULL);
4575 _edge_right_cb(Evas_Object *obj,
4576 void *data __UNUSED__)
4578 evas_object_smart_callback_call(obj, SIG_EDGE_RIGHT, NULL);
4582 _edge_top_cb(Evas_Object *obj,
4583 void *data __UNUSED__)
4585 evas_object_smart_callback_call(obj, SIG_EDGE_TOP, NULL);
4589 _edge_bottom_cb(Evas_Object *obj,
4590 void *data __UNUSED__)
4592 evas_object_smart_callback_call(obj, SIG_EDGE_BOTTOM, NULL);
4596 _vbar_drag_cb(Evas_Object *obj,
4597 void *data __UNUSED__)
4599 evas_object_smart_callback_call(obj, SIG_VBAR_DRAG, NULL);
4603 _vbar_press_cb(Evas_Object *obj,
4604 void *data __UNUSED__)
4606 evas_object_smart_callback_call(obj, SIG_VBAR_PRESS, NULL);
4610 _vbar_unpress_cb(Evas_Object *obj,
4611 void *data __UNUSED__)
4613 evas_object_smart_callback_call(obj, SIG_VBAR_UNPRESS, NULL);
4617 _hbar_drag_cb(Evas_Object *obj,
4618 void *data __UNUSED__)
4620 evas_object_smart_callback_call(obj, SIG_HBAR_DRAG, NULL);
4624 _hbar_press_cb(Evas_Object *obj,
4625 void *data __UNUSED__)
4627 evas_object_smart_callback_call(obj, SIG_HBAR_PRESS, NULL);
4631 _hbar_unpress_cb(Evas_Object *obj,
4632 void *data __UNUSED__)
4634 evas_object_smart_callback_call(obj, SIG_HBAR_UNPRESS, NULL);
4638 _decorate_item_realize(Elm_Gen_Item *it)
4641 if (it->item->deco_it_view) return;
4643 //evas_event_freeze(evas_object_evas_get(obj));
4644 it->item->deco_it_view = edje_object_add(evas_object_evas_get(WIDGET(it)));
4645 edje_object_scale_set
4646 (it->item->deco_it_view, elm_widget_scale_get(WIDGET(it)) *
4647 elm_config_scale_get());
4648 evas_object_smart_member_add
4649 (it->item->deco_it_view, GL_IT(it)->wsd->pan_obj);
4650 elm_widget_sub_object_add(WIDGET(it), it->item->deco_it_view);
4652 strncpy(buf, "item", sizeof(buf));
4653 if (GL_IT(it)->wsd->mode == ELM_LIST_COMPRESS)
4654 strncat(buf, "_compress", sizeof(buf) - strlen(buf));
4656 if (it->item->order_num_in & 0x1)
4657 strncat(buf, "_odd", sizeof(buf) - strlen(buf));
4658 strncat(buf, "/", sizeof(buf) - strlen(buf));
4659 strncat(buf, it->itc->decorate_item_style, sizeof(buf) - strlen(buf));
4661 elm_widget_theme_object_set
4662 (WIDGET(it), it->item->deco_it_view, "genlist", buf,
4663 elm_widget_style_get(WIDGET(it)));
4664 edje_object_mirrored_set
4665 (it->item->deco_it_view, elm_widget_mirrored_get(WIDGET(it)));
4667 /* signal callback add */
4668 evas_object_event_callback_add
4669 (it->item->deco_it_view, EVAS_CALLBACK_MOUSE_DOWN, _item_mouse_down_cb,
4671 evas_object_event_callback_add
4672 (it->item->deco_it_view, EVAS_CALLBACK_MOUSE_UP, _item_mouse_up_cb, it);
4673 evas_object_event_callback_add
4674 (it->item->deco_it_view, EVAS_CALLBACK_MOUSE_MOVE, _item_mouse_move_cb,
4677 if (eina_list_count(it->item->deco_it_content_objs) != 0)
4678 ERR_ABORT("If you see this error, please notify us and we"
4681 /* text_get, content_get, state_get */
4683 (it, it->item->deco_it_view, &it->item->deco_it_texts, NULL);
4684 if (!it->item->deco_it_contents)
4685 it->item->deco_it_contents =
4686 elm_widget_stringlist_get
4687 (edje_object_data_get(it->item->deco_it_view, "contents"));
4688 it->item->deco_it_content_objs =
4689 _item_mode_content_realize
4690 (it, it->item->deco_it_view, &it->item->deco_it_contents, NULL,
4691 &it->item->deco_it_content_objs);
4693 (it, it->item->deco_it_view, &it->item->deco_it_states, NULL);
4694 edje_object_part_swallow
4695 (it->item->deco_it_view,
4696 edje_object_data_get(it->item->deco_it_view, "mode_part"), VIEW(it));
4698 it->want_unrealize = EINA_FALSE;
4699 //evas_event_thaw(evas_object_evas_get(obj));
4700 //evas_event_thaw_eval(evas_object_evas_get(obj));
4704 _decorate_item_set(Elm_Gen_Item *it)
4706 Elm_Genlist_Smart_Data *sd;
4711 sd = GL_IT(it)->wsd;
4714 it->item->nocache_once = EINA_TRUE;
4716 if (sd->scr_hold_timer)
4718 ecore_timer_del(sd->scr_hold_timer);
4719 sd->scr_hold_timer = NULL;
4721 sd->s_iface->hold_set(ELM_WIDGET_DATA(sd)->obj, EINA_TRUE);
4722 sd->scr_hold_timer = ecore_timer_add(0.1, _scroll_hold_timer_cb, sd);
4724 //evas_event_freeze(evas_object_evas_get(ELM_WIDGET_DATA(sd)->obj));
4725 _decorate_item_realize(it);
4726 if (it->item->group_item)
4727 evas_object_raise(it->item->VIEW(group_item));
4729 (it, it->item->deco_it_view, it->item->scrl_x, it->item->scrl_y);
4730 //evas_event_thaw(evas_object_evas_get(ELM_WIDGET_DATA(sd)->obj));
4731 //evas_event_thaw_eval(evas_object_evas_get(ELM_WIDGET_DATA(sd)->obj));
4733 snprintf(buf, sizeof(buf), "elm,state,%s,active", sd->decorate_it_type);
4734 edje_object_signal_emit(it->item->deco_it_view, buf, "elm");
4738 _decorate_item_unset(Elm_Genlist_Smart_Data *sd)
4740 char buf[1024], buf2[1024];
4743 if (!sd->mode_item) return;
4746 it->item->nocache_once = EINA_TRUE;
4748 snprintf(buf, sizeof(buf), "elm,state,%s,passive", sd->decorate_it_type);
4749 snprintf(buf2, sizeof(buf2), "elm,state,%s,passive,finished",
4750 sd->decorate_it_type);
4751 edje_object_signal_emit(it->item->deco_it_view, buf, "elm");
4752 edje_object_signal_callback_add
4753 (it->item->deco_it_view, buf2, "elm", _decorate_item_finished_signal_cb,
4755 sd->mode_item = NULL;
4759 // FIXME: difference from upstream
4761 _mouse_down_scroller(void *data,
4762 Evas *evas __UNUSED__,
4763 Evas_Object *obj __UNUSED__,
4764 void *event_info __UNUSED__)
4766 Widget_Data *wd = elm_widget_data_get(data);
4769 wd->drag_started = EINA_FALSE;
4773 _mouse_up_scroller(void *data,
4774 Evas *evas __UNUSED__,
4775 Evas_Object *obj __UNUSED__,
4776 void *event_info __UNUSED__)
4778 Widget_Data *wd = elm_widget_data_get(data);
4781 wd->drag_started = EINA_FALSE;
4785 _mouse_move_scroller(void *data,
4786 Evas *evas __UNUSED__,
4787 Evas_Object *obj __UNUSED__,
4790 Widget_Data *wd = elm_widget_data_get(data);
4791 Evas_Event_Mouse_Move *ev = event_info;
4792 Evas_Coord minw = 0, minh = 0, dx, dy, adx, ady;
4795 if (wd->drag_started) return;
4797 elm_coords_finger_size_adjust(1, &minw, 1, &minh);
4798 dx = ev->cur.canvas.x - ev->prev.canvas.x;
4799 dy = ev->cur.canvas.y - ev->prev.canvas.y;
4802 if (adx < 0) adx = -dx;
4803 if (ady < 0) ady = -dy;
4804 if (((ady < minh) && (ady > minh / 2)) && (ady > adx))
4808 evas_object_smart_callback_call(data, SIG_DRAG_START_UP, NULL);
4809 wd->drag_started = EINA_TRUE;
4813 evas_object_smart_callback_call(data, SIG_DRAG_START_DOWN, NULL);
4814 wd->drag_started = EINA_TRUE;
4821 _elm_genlist_smart_add(Evas_Object *obj)
4823 Evas_Coord minw, minh;
4824 Elm_Genlist_Pan_Smart_Data *pan_data;
4826 EVAS_SMART_DATA_ALLOC(obj, Elm_Genlist_Smart_Data);
4828 ELM_WIDGET_CLASS(_elm_genlist_parent_sc)->base.add(obj);
4830 priv->hit_rect = evas_object_rectangle_add(evas_object_evas_get(obj));
4831 evas_object_smart_member_add(priv->hit_rect, obj);
4832 elm_widget_sub_object_add(obj, priv->hit_rect);
4834 /* common scroller hit rectangle setup */
4835 evas_object_color_set(priv->hit_rect, 0, 0, 0, 0);
4836 evas_object_show(priv->hit_rect);
4837 evas_object_repeat_events_set(priv->hit_rect, EINA_TRUE);
4839 elm_widget_can_focus_set(obj, EINA_TRUE);
4840 elm_widget_on_show_region_hook_set(obj, _show_region_hook, obj);
4842 elm_layout_theme_set(obj, "genlist", "base", elm_widget_style_get(obj));
4844 /* interface's add() routine issued AFTER the object's smart_add() */
4845 priv->s_iface = evas_object_smart_interface_get
4846 (obj, ELM_SCROLLABLE_IFACE_NAME);
4848 priv->s_iface->objects_set
4849 (obj, ELM_WIDGET_DATA(priv)->resize_obj, priv->hit_rect);
4851 priv->s_iface->bounce_allow_set
4852 (obj, EINA_FALSE, _elm_config->thumbscroll_bounce_enable);
4853 priv->v_bounce = _elm_config->thumbscroll_bounce_enable;
4855 priv->s_iface->animate_start_cb_set(obj, _scroll_animate_start_cb);
4856 priv->s_iface->animate_stop_cb_set(obj, _scroll_animate_stop_cb);
4857 priv->s_iface->drag_start_cb_set(obj, _scroll_drag_start_cb);
4858 priv->s_iface->drag_stop_cb_set(obj, _scroll_drag_stop_cb);
4859 priv->s_iface->edge_left_cb_set(obj, _edge_left_cb);
4860 priv->s_iface->edge_right_cb_set(obj, _edge_right_cb);
4861 priv->s_iface->edge_top_cb_set(obj, _edge_top_cb);
4862 priv->s_iface->edge_bottom_cb_set(obj, _edge_bottom_cb);
4863 priv->s_iface->vbar_drag_cb_set(obj, _vbar_drag_cb);
4864 priv->s_iface->vbar_press_cb_set(obj, _vbar_press_cb);
4865 priv->s_iface->vbar_unpress_cb_set(obj, _vbar_unpress_cb);
4866 priv->s_iface->hbar_drag_cb_set(obj, _hbar_drag_cb);
4867 priv->s_iface->hbar_press_cb_set(obj, _hbar_press_cb);
4868 priv->s_iface->hbar_unpress_cb_set(obj, _hbar_unpress_cb);
4870 priv->mode = ELM_LIST_SCROLL;
4871 priv->max_items_per_block = MAX_ITEMS_PER_BLOCK;
4872 priv->item_cache_max = priv->max_items_per_block * 2;
4873 priv->longpress_timeout = _elm_config->longpress_timeout;
4874 priv->highlight = EINA_TRUE;
4876 #if GENLIST_FX_SUPPORT
4877 priv->fx_mode = EINA_FALSE;
4878 priv->rendered = EINA_FALSE;
4879 priv->fx_first_captured = EINA_FALSE;
4880 priv->fx_playing = EINA_FALSE;
4881 priv->fx_items_deleted = EINA_FALSE;
4882 priv->genlist_clearing = EINA_FALSE;
4885 priv->pan_obj = evas_object_smart_add
4886 (evas_object_evas_get(obj), _elm_genlist_pan_smart_class_new());
4887 pan_data = evas_object_smart_data_get(priv->pan_obj);
4888 pan_data->wsd = priv;
4891 // FIXME: difference from upstream
4892 evas_object_event_callback_add(pan_obj, EVAS_CALLBACK_MOUSE_DOWN,
4893 _mouse_down_scroller, obj);
4894 evas_object_event_callback_add(pan_obj, EVAS_CALLBACK_MOUSE_UP,
4895 _mouse_up_scroller, obj);
4896 evas_object_event_callback_add(pan_obj, EVAS_CALLBACK_MOUSE_MOVE,
4897 _mouse_move_scroller, obj);
4900 priv->s_iface->extern_pan_set(obj, priv->pan_obj);
4902 edje_object_size_min_calc(ELM_WIDGET_DATA(priv)->resize_obj, &minw, &minh);
4903 evas_object_size_hint_min_set(obj, minw, minh);
4905 _item_cache_all_free(priv);
4906 _mirrored_set(obj, elm_widget_mirrored_get(obj));
4908 elm_layout_sizing_eval(obj);
4912 _elm_genlist_smart_del(Evas_Object *obj)
4914 ELM_GENLIST_DATA_GET(obj, sd);
4916 elm_genlist_clear(obj);
4917 if (sd->calc_job) ecore_job_del(sd->calc_job);
4918 if (sd->update_job) ecore_job_del(sd->update_job);
4919 if (sd->queue_idle_enterer) ecore_idle_enterer_del(sd->queue_idle_enterer);
4920 if (sd->must_recalc_idler) ecore_idler_del(sd->must_recalc_idler);
4921 if (sd->multi_timer) ecore_timer_del(sd->multi_timer);
4922 if (sd->decorate_it_type) eina_stringshare_del(sd->decorate_it_type);
4923 if (sd->scr_hold_timer) ecore_timer_del(sd->scr_hold_timer);
4925 evas_object_del(sd->pan_obj);
4926 ELM_WIDGET_CLASS(_elm_genlist_parent_sc)->base.del(obj);
4930 _elm_genlist_smart_move(Evas_Object *obj,
4934 ELM_GENLIST_DATA_GET(obj, sd);
4936 ELM_WIDGET_CLASS(_elm_genlist_parent_sc)->base.move(obj, x, y);
4938 evas_object_move(sd->hit_rect, x, y);
4942 _elm_genlist_smart_resize(Evas_Object *obj,
4946 ELM_GENLIST_DATA_GET(obj, sd);
4948 ELM_WIDGET_CLASS(_elm_genlist_parent_sc)->base.resize(obj, w, h);
4950 evas_object_resize(sd->hit_rect, w, h);
4954 _elm_genlist_smart_member_add(Evas_Object *obj,
4955 Evas_Object *member)
4957 ELM_GENLIST_DATA_GET(obj, sd);
4959 ELM_WIDGET_CLASS(_elm_genlist_parent_sc)->base.member_add(obj, member);
4962 evas_object_raise(sd->hit_rect);
4966 _access_obj_process(Elm_Genlist_Smart_Data *sd, Eina_Bool is_access)
4969 Eina_Bool done = EINA_FALSE;
4971 EINA_INLIST_FOREACH(sd->blocks, itb)
4979 EINA_LIST_FOREACH(itb->items, l, it)
4981 if (!it->realized) continue;
4982 if (is_access) _access_widget_item_register(it);
4984 _elm_access_widget_item_unregister((Elm_Widget_Item *)it);
4987 else if (done) break;
4992 _elm_genlist_smart_access(Evas_Object *obj, Eina_Bool is_access)
4994 ELM_GENLIST_CHECK(obj);
4995 ELM_GENLIST_DATA_GET(obj, sd);
4998 ELM_WIDGET_CLASS(ELM_WIDGET_DATA(sd)->api)->focus_next =
4999 _elm_genlist_smart_focus_next;
5001 ELM_WIDGET_CLASS(ELM_WIDGET_DATA(sd)->api)->focus_next = NULL;
5002 _access_obj_process(sd, is_access);
5006 _elm_genlist_smart_set_user(Elm_Genlist_Smart_Class *sc)
5008 ELM_WIDGET_CLASS(sc)->base.add = _elm_genlist_smart_add;
5009 ELM_WIDGET_CLASS(sc)->base.del = _elm_genlist_smart_del;
5010 ELM_WIDGET_CLASS(sc)->base.move = _elm_genlist_smart_move;
5011 ELM_WIDGET_CLASS(sc)->base.resize = _elm_genlist_smart_resize;
5012 ELM_WIDGET_CLASS(sc)->base.member_add = _elm_genlist_smart_member_add;
5014 ELM_WIDGET_CLASS(sc)->sub_object_add = _elm_genlist_smart_sub_object_add;
5015 ELM_WIDGET_CLASS(sc)->sub_object_del = _elm_genlist_smart_sub_object_del;
5016 ELM_WIDGET_CLASS(sc)->on_focus = _elm_genlist_smart_on_focus;
5017 ELM_WIDGET_CLASS(sc)->theme = _elm_genlist_smart_theme;
5018 ELM_WIDGET_CLASS(sc)->event = _elm_genlist_smart_event;
5019 ELM_WIDGET_CLASS(sc)->translate = _elm_genlist_smart_translate;
5021 /* not a 'focus chain manager' */
5022 ELM_WIDGET_CLASS(sc)->focus_next = NULL;
5023 ELM_WIDGET_CLASS(sc)->focus_direction = NULL;
5025 ELM_LAYOUT_CLASS(sc)->sizing_eval = _elm_genlist_smart_sizing_eval;
5028 if (_elm_config->access_mode == ELM_ACCESS_MODE_ON)
5029 ELM_WIDGET_CLASS(sc)->focus_next = _elm_genlist_smart_focus_next;
5031 ELM_WIDGET_CLASS(sc)->access = _elm_genlist_smart_access;
5034 EAPI const Elm_Genlist_Smart_Class *
5035 elm_genlist_smart_class_get(void)
5037 static Elm_Genlist_Smart_Class _sc =
5038 ELM_GENLIST_SMART_CLASS_INIT_NAME_VERSION(ELM_GENLIST_SMART_NAME);
5039 static const Elm_Genlist_Smart_Class *class = NULL;
5040 Evas_Smart_Class *esc = (Evas_Smart_Class *)&_sc;
5045 _elm_genlist_smart_set(&_sc);
5046 esc->callbacks = _smart_callbacks;
5053 elm_genlist_add(Evas_Object *parent)
5057 EINA_SAFETY_ON_NULL_RETURN_VAL(parent, NULL);
5059 obj = elm_widget_add(_elm_genlist_smart_class_new(), parent);
5060 if (!obj) return NULL;
5062 if (!elm_widget_sub_object_add(parent, obj))
5063 ERR("could not add %p as sub object of %p", obj, parent);
5069 static Evas_Object *
5070 _item_content_get_hook(Elm_Gen_Item *it,
5073 Evas_Object *ret = NULL;
5074 if (it->deco_all_view)
5075 ret = edje_object_part_swallow_get(it->deco_all_view, part);
5076 else if (it->decorate_it_set)
5077 ret = edje_object_part_swallow_get(it->item->deco_it_view, part);
5079 ret = edje_object_part_swallow_get(VIEW(it), part);
5084 _item_text_get_hook(Elm_Gen_Item *it,
5087 if (!it->itc->func.text_get) return NULL;
5088 const char *ret = NULL;
5089 if (it->deco_all_view)
5090 ret = edje_object_part_text_get(it->deco_all_view, part);
5091 else if (it->decorate_it_set)
5092 ret = edje_object_part_text_get(it->item->deco_it_view, part);
5094 ret = edje_object_part_text_get(VIEW(it), part);
5099 _item_disable_hook(Elm_Object_Item *item)
5103 Elm_Gen_Item *it = (Elm_Gen_Item *)item;
5106 elm_genlist_item_selected_set(item, EINA_FALSE);
5110 if (elm_widget_item_disabled_get(it))
5112 edje_object_signal_emit(VIEW(it), "elm,state,disabled", "elm");
5113 if (it->deco_all_view)
5114 edje_object_signal_emit
5115 (it->deco_all_view, "elm,state,disabled", "elm");
5119 edje_object_signal_emit(VIEW(it), "elm,state,enabled", "elm");
5120 if (it->deco_all_view)
5121 edje_object_signal_emit
5122 (it->deco_all_view, "elm,state,enabled", "elm");
5124 EINA_LIST_FOREACH(it->content_objs, l, obj)
5125 elm_widget_disabled_set(obj, elm_widget_item_disabled_get(it));
5130 _item_free(Elm_Gen_Item *it)
5132 Elm_Genlist_Smart_Data *sd = GL_IT(it)->wsd;
5134 #if GENLIST_FX_SUPPORT
5135 if (sd->fx_mode) GL_IT(it)->has_proxy_it = EINA_FALSE;
5136 _elm_genlist_proxy_item_del((Elm_Object_Item *)it);
5137 if ((!sd->fx_mode) || (sd->genlist_clearing))
5140 _item_free_common(it);
5142 _item_unrealize(it, EINA_FALSE);
5143 elm_genlist_item_class_unref((Elm_Genlist_Item_Class *)it->itc);
5146 if (sd->calc_job) ecore_job_del(sd->calc_job);
5147 sd->calc_job = ecore_job_add(_calc_job, sd);
5150 #if GENLIST_FX_SUPPORT
5152 _item_del_pre_fx_process(Elm_Gen_Item *it)
5154 Elm_Genlist_Smart_Data *sd = GL_IT(it)->wsd;
5156 sd->fx_items_deleted = EINA_TRUE;
5157 _elm_genlist_fx_capture(ELM_WIDGET_DATA(sd)->obj, 0);
5158 if (!eina_list_data_find(sd->pending_del_items, it))
5159 sd->pending_del_items = eina_list_append(sd->pending_del_items, it);
5161 _item_free_common(it);
5167 _item_del_pre_hook(Elm_Object_Item *item)
5169 Elm_Gen_Item *it = (Elm_Gen_Item *)item;
5171 #if GENLIST_FX_SUPPORT
5172 if ((GL_IT(it)->wsd->fx_mode) && (!GL_IT(it)->wsd->genlist_clearing))
5174 _item_del_pre_fx_process(it);
5183 _item_signal_emit_hook(Elm_Object_Item *it,
5184 const char *emission,
5187 edje_object_signal_emit(VIEW(it), emission, source);
5190 static Elm_Gen_Item *
5191 _elm_genlist_item_new(Elm_Genlist_Smart_Data *sd,
5192 const Elm_Genlist_Item_Class *itc,
5194 Elm_Gen_Item *parent,
5195 Elm_Genlist_Item_Type type,
5197 const void *func_data)
5199 Elm_Gen_Item *it, *it2;
5202 if (!itc) return NULL;
5204 it = elm_widget_item_new(ELM_WIDGET_DATA(sd)->obj, Elm_Gen_Item);
5205 if (!it) return NULL;
5208 elm_genlist_item_class_ref((Elm_Genlist_Item_Class *)itc);
5210 it->base.data = data;
5211 it->parent = parent;
5212 it->func.func = func;
5213 it->func.data = func_data;
5215 elm_widget_item_content_get_hook_set(it, _item_content_get_hook);
5216 elm_widget_item_text_get_hook_set(it, _item_text_get_hook);
5217 elm_widget_item_disable_hook_set(it, _item_disable_hook);
5218 elm_widget_item_del_pre_hook_set(it, _item_del_pre_hook);
5219 elm_widget_item_signal_emit_hook_set(it, _item_signal_emit_hook);
5221 #if 0 // FIXME: difference from upstream
5222 it->can_focus = EINA_TRUE;
5224 //it->del_cb = (Ecore_Cb)_item_free;
5225 //it->highlight_cb = (Ecore_Cb)_item_highlight;
5226 //it->unhighlight_cb = (Ecore_Cb)_item_unhighlight;
5227 //it->sel_cb = (Ecore_Cb)_item_select;
5228 //it->unsel_cb = (Ecore_Cb)_item_unselect;
5229 //it->unrealize_cb = (Ecore_Cb)_item_unrealize_cb;
5231 GL_IT(it) = ELM_NEW(Elm_Gen_Item_Type);
5232 GL_IT(it)->wsd = sd;
5233 GL_IT(it)->type = type;
5234 if (type & ELM_GENLIST_ITEM_GROUP) it->group++;
5238 if (it->parent->group)
5239 GL_IT(it)->group_item = parent;
5240 else if (GL_IT(it->parent)->group_item)
5241 GL_IT(it)->group_item = GL_IT(it->parent)->group_item;
5243 for (it2 = it, depth = 0; it2->parent; it2 = it2->parent)
5245 if (!it2->parent->group) depth += 1;
5247 GL_IT(it)->expanded_depth = depth;
5250 #if GENLIST_FX_SUPPORT
5251 it->item->num = sd->item_count;
5254 sd->fx_items_deleted = EINA_FALSE;
5255 _elm_genlist_fx_capture(ELM_WIDGET_DATA(sd)->obj, 0);
5262 _elm_genlist_item_compare(const void *data,
5265 const Elm_Gen_Item *it, *item1;
5267 it = ELM_GEN_ITEM_FROM_INLIST(data);
5268 item1 = ELM_GEN_ITEM_FROM_INLIST(data1);
5269 return GL_IT(it)->wsd->item_compare_cb(it, item1);
5273 _elm_genlist_item_list_compare(const void *data,
5276 const Elm_Gen_Item *it = data;
5277 const Elm_Gen_Item *item1 = data1;
5279 return GL_IT(it)->wsd->item_compare_cb(it, item1);
5283 elm_genlist_items_count(const Evas_Object *obj)
5285 ELM_GENLIST_CHECK(obj) 0;
5286 ELM_GENLIST_DATA_GET(obj, sd);
5288 return sd->item_count;
5291 EAPI Elm_Object_Item *
5292 elm_genlist_item_append(Evas_Object *obj,
5293 const Elm_Genlist_Item_Class *itc,
5295 Elm_Object_Item *parent,
5296 Elm_Genlist_Item_Type type,
5298 const void *func_data)
5302 ELM_GENLIST_CHECK(obj) NULL;
5303 ELM_GENLIST_DATA_GET(obj, sd);
5305 ELM_WIDGET_ITEM_RETURN_IF_ONDEL(((Elm_Widget_Item *)parent),NULL);
5307 it = _elm_genlist_item_new
5308 (sd, itc, data, (Elm_Gen_Item *)parent, type, func, func_data);
5309 if (!it) return NULL;
5314 sd->group_items = eina_list_append(sd->group_items, it);
5315 sd->items = eina_inlist_append(sd->items, EINA_INLIST_GET(it));
5316 it->item->rel = NULL;
5320 Elm_Gen_Item *it2 = NULL;
5321 Eina_List *ll = eina_list_last(it->parent->item->items);
5323 if (ll) it2 = ll->data;
5324 it->parent->item->items =
5325 eina_list_append(it->parent->item->items, it);
5326 if (!it2) it2 = it->parent;
5327 sd->items = eina_inlist_append_relative
5328 (sd->items, EINA_INLIST_GET(it), EINA_INLIST_GET(it2));
5329 it->item->rel = it2;
5330 it2->item->rel_revs = eina_list_append(it2->item->rel_revs, it);
5332 it->item->before = EINA_FALSE;
5333 _item_queue(sd, it, NULL);
5335 return (Elm_Object_Item *)it;
5338 EAPI Elm_Object_Item *
5339 elm_genlist_item_prepend(Evas_Object *obj,
5340 const Elm_Genlist_Item_Class *itc,
5342 Elm_Object_Item *parent,
5343 Elm_Genlist_Item_Type type,
5345 const void *func_data)
5349 ELM_GENLIST_CHECK(obj) NULL;
5350 ELM_GENLIST_DATA_GET(obj, sd);
5351 it = _elm_genlist_item_new
5352 (sd, itc, data, (Elm_Gen_Item *)parent, type, func, func_data);
5353 if (!it) return NULL;
5358 sd->group_items = eina_list_prepend(sd->group_items, it);
5359 sd->items = eina_inlist_prepend(sd->items, EINA_INLIST_GET(it));
5360 it->item->rel = NULL;
5364 Elm_Gen_Item *it2 = NULL;
5365 Eina_List *ll = it->parent->item->items;
5367 if (ll) it2 = ll->data;
5368 it->parent->item->items =
5369 eina_list_prepend(it->parent->item->items, it);
5370 if (!it2) it2 = it->parent;
5371 sd->items = eina_inlist_prepend_relative
5372 (sd->items, EINA_INLIST_GET(it), EINA_INLIST_GET(it2));
5373 it->item->rel = it2;
5374 it2->item->rel_revs = eina_list_append(it2->item->rel_revs, it);
5376 it->item->before = EINA_TRUE;
5377 _item_queue(sd, it, NULL);
5379 return (Elm_Object_Item *)it;
5382 EAPI Elm_Object_Item *
5383 elm_genlist_item_insert_after(Evas_Object *obj,
5384 const Elm_Genlist_Item_Class *itc,
5386 Elm_Object_Item *parent,
5387 Elm_Object_Item *after_it,
5388 Elm_Genlist_Item_Type type,
5390 const void *func_data)
5392 Elm_Gen_Item *after = (Elm_Gen_Item *)after_it;
5395 ELM_GENLIST_CHECK(obj) NULL;
5396 ELM_GENLIST_ITEM_CHECK_OR_RETURN(after_it, NULL);
5397 ELM_GENLIST_DATA_GET(obj, sd);
5399 /* It makes no sense to insert after in an empty list with after !=
5400 * NULL, something really bad is happening in your app. */
5401 EINA_SAFETY_ON_NULL_RETURN_VAL(sd->items, NULL);
5403 it = _elm_genlist_item_new
5404 (sd, itc, data, (Elm_Gen_Item *)parent, type, func, func_data);
5405 if (!it) return NULL;
5409 if ((it->group) && (after->group))
5410 sd->group_items = eina_list_append_relative
5411 (sd->group_items, it, after);
5415 it->parent->item->items =
5416 eina_list_append_relative(it->parent->item->items, it, after);
5418 sd->items = eina_inlist_append_relative
5419 (sd->items, EINA_INLIST_GET(it), EINA_INLIST_GET(after));
5421 it->item->rel = after;
5422 after->item->rel_revs = eina_list_append(after->item->rel_revs, it);
5423 it->item->before = EINA_FALSE;
5424 _item_queue(sd, it, NULL);
5426 return (Elm_Object_Item *)it;
5429 EAPI Elm_Object_Item *
5430 elm_genlist_item_insert_before(Evas_Object *obj,
5431 const Elm_Genlist_Item_Class *itc,
5433 Elm_Object_Item *parent,
5434 Elm_Object_Item *before_it,
5435 Elm_Genlist_Item_Type type,
5437 const void *func_data)
5439 Elm_Gen_Item *before = (Elm_Gen_Item *)before_it;
5442 ELM_GENLIST_CHECK(obj) NULL;
5443 ELM_GENLIST_ITEM_CHECK_OR_RETURN(before_it, NULL);
5444 ELM_GENLIST_DATA_GET(obj, sd);
5446 /* It makes no sense to insert before in an empty list with before
5447 * != NULL, something really bad is happening in your app. */
5448 EINA_SAFETY_ON_NULL_RETURN_VAL(sd->items, NULL);
5450 it = _elm_genlist_item_new
5451 (sd, itc, data, (Elm_Gen_Item *)parent, type, func, func_data);
5452 if (!it) return NULL;
5456 if (it->group && before->group)
5458 eina_list_prepend_relative(sd->group_items, it, before);
5462 it->parent->item->items =
5463 eina_list_prepend_relative(it->parent->item->items, it, before);
5465 sd->items = eina_inlist_prepend_relative
5466 (sd->items, EINA_INLIST_GET(it), EINA_INLIST_GET(before));
5468 it->item->rel = before;
5469 before->item->rel_revs = eina_list_append(before->item->rel_revs, it);
5470 it->item->before = EINA_TRUE;
5471 _item_queue(sd, it, NULL);
5473 return (Elm_Object_Item *)it;
5476 EAPI Elm_Object_Item *
5477 elm_genlist_item_sorted_insert(Evas_Object *obj,
5478 const Elm_Genlist_Item_Class *itc,
5480 Elm_Object_Item *parent,
5481 Elm_Genlist_Item_Type type,
5482 Eina_Compare_Cb comp,
5484 const void *func_data)
5486 Elm_Gen_Item *rel = NULL;
5489 ELM_GENLIST_CHECK(obj) NULL;
5490 ELM_GENLIST_DATA_GET(obj, sd);
5492 it = _elm_genlist_item_new
5493 (sd, itc, data, (Elm_Gen_Item *)parent, type, func, func_data);
5494 if (!it) return NULL;
5496 sd->item_compare_cb = comp;
5503 l = eina_list_search_sorted_near_list
5504 (it->parent->item->items, _elm_genlist_item_list_compare, it,
5508 rel = eina_list_data_get(l);
5512 if (cmp_result >= 0)
5514 it->parent->item->items = eina_list_prepend_relative_list
5515 (it->parent->item->items, it, l);
5516 sd->items = eina_inlist_prepend_relative
5517 (sd->items, EINA_INLIST_GET(it), EINA_INLIST_GET(rel));
5518 it->item->before = EINA_FALSE;
5520 else if (cmp_result < 0)
5522 it->parent->item->items = eina_list_append_relative_list
5523 (it->parent->item->items, it, l);
5524 sd->items = eina_inlist_append_relative
5525 (sd->items, EINA_INLIST_GET(it), EINA_INLIST_GET(rel));
5526 it->item->before = EINA_TRUE;
5533 sd->state = eina_inlist_sorted_state_new();
5534 eina_inlist_sorted_state_init(sd->state, sd->items);
5535 sd->requeued = EINA_FALSE;
5539 sd->group_items = eina_list_append(sd->group_items, it);
5541 sd->items = eina_inlist_sorted_state_insert
5542 (sd->items, EINA_INLIST_GET(it), _elm_genlist_item_compare,
5545 if (EINA_INLIST_GET(it)->next)
5547 rel = ELM_GEN_ITEM_FROM_INLIST(EINA_INLIST_GET(it)->next);
5548 it->item->before = EINA_TRUE;
5550 else if (EINA_INLIST_GET(it)->prev)
5552 rel = ELM_GEN_ITEM_FROM_INLIST(EINA_INLIST_GET(it)->prev);
5553 it->item->before = EINA_FALSE;
5559 it->item->rel = rel;
5560 rel->item->rel_revs = eina_list_append(rel->item->rel_revs, it);
5563 _item_queue(sd, it, _elm_genlist_item_list_compare);
5565 return (Elm_Object_Item *)it;
5569 _elm_genlist_fx_clear(Evas_Object *obj)
5571 ELM_GENLIST_DATA_GET(obj, sd);
5573 Elm_Gen_FX_Item *fi;
5577 EINA_LIST_FREE(sd->capture_before_items, pi)
5579 if ((pi->it) && (GL_IT(pi->it))) GL_IT(pi->it)->has_proxy_it = EINA_FALSE;
5580 if (pi->proxy) evas_object_smart_member_del(pi->proxy);
5581 if (pi->proxy) evas_object_del(pi->proxy);
5584 EINA_LIST_FREE(sd->capture_after_items, pi)
5586 if ((pi->it) && (GL_IT(pi->it))) GL_IT(pi->it)->has_proxy_it = EINA_FALSE;
5587 if (pi->proxy) evas_object_smart_member_del(pi->proxy);
5588 if (pi->proxy) evas_object_del(pi->proxy);
5592 EINA_LIST_FREE(sd->fx_items, fi)
5594 if (fi->trans) elm_transit_del(fi->trans);
5598 EINA_LIST_FREE (sd->pending_unrealized_items, it)
5599 _item_unrealize(it, EINA_FALSE);
5601 EINA_LIST_FREE (sd->pending_unrealized_decorate_all_items, it)
5602 _decorate_all_item_unrealize(it);
5604 EINA_LIST_FREE (sd->pending_del_items, it)
5607 _elm_widget_item_free((Elm_Widget_Item *)it);
5609 if (sd->alpha_bg) evas_object_del(sd->alpha_bg);
5610 sd->alpha_bg = NULL;
5611 if (sd->fx_timer) ecore_timer_del(sd->fx_timer);
5612 sd->fx_timer = NULL;
5614 sd->genlist_clearing = EINA_TRUE;
5615 sd->fx_playing = EINA_FALSE;
5616 sd->sorting = EINA_FALSE;
5617 sd->fx_first_captured = EINA_FALSE;
5618 sd->fx_items_deleted = EINA_FALSE;
5622 elm_genlist_clear(Evas_Object *obj)
5624 ELM_GENLIST_CHECK(obj);
5625 ELM_GENLIST_DATA_GET(obj, sd);
5630 eina_inlist_sorted_state_free(sd->state);
5634 #if GENLIST_FX_SUPPORT
5637 _elm_genlist_fx_clear(obj);
5638 sd->genlist_clearing = EINA_TRUE;
5639 sd->rendered = EINA_FALSE;
5642 #if GENLIST_PINCH_ZOOM_SUPPORT
5643 sd->pinch_zoom_h = 0;
5644 sd->realized_top_item = NULL;
5645 sd->pinch_zoom_mode = ELM_GEN_PINCH_ZOOM_NONE;
5648 //evas_event_freeze(evas_object_evas_get(ELM_WIDGET_DATA(sd)->obj));
5650 // Do not use EINA_INLIST_FOREACH or EINA_INLIST_FOREACH_SAFE
5651 // because sd->items can be modified inside elm_widget_item_del()
5654 it = EINA_INLIST_CONTAINER_GET(sd->items->last, Elm_Gen_Item);
5655 it->item->nocache_once = EINA_TRUE;
5656 elm_widget_item_del(it);
5660 _item_cache_all_free(sd);
5662 sd->pan_changed = EINA_TRUE;
5663 if (sd->selected) sd->selected = eina_list_free(sd->selected);
5664 sd->selected = NULL;
5666 sd->anchor_item = NULL;
5667 if (sd->multi_timer)
5669 ecore_timer_del(sd->multi_timer);
5670 sd->multi_timer = NULL;
5674 ecore_job_del(sd->update_job);
5675 sd->update_job = NULL;
5679 ecore_job_del(sd->calc_job);
5680 sd->calc_job = NULL;
5682 if (sd->queue_idle_enterer)
5684 ecore_idle_enterer_del(sd->queue_idle_enterer);
5685 sd->queue_idle_enterer = NULL;
5687 if (sd->must_recalc_idler)
5689 ecore_idler_del(sd->must_recalc_idler);
5690 sd->must_recalc_idler = NULL;
5692 if (sd->queue) sd->queue = eina_list_free(sd->queue);
5693 if (sd->reorder_move_animator)
5695 ecore_animator_del(sd->reorder_move_animator);
5696 sd->reorder_move_animator = NULL;
5698 sd->show_item = NULL;
5699 sd->reorder_old_pan_y = 0;
5706 if (sd->alpha_bg) evas_object_del(sd->alpha_bg);
5707 sd->alpha_bg = NULL;
5711 evas_object_size_hint_min_set(sd->pan_obj, sd->minw, sd->minh);
5712 evas_object_smart_callback_call(sd->pan_obj, "changed", NULL);
5714 elm_layout_sizing_eval(ELM_WIDGET_DATA(sd)->obj);
5715 sd->s_iface->content_region_show(obj, 0, 0, 0, 0);
5717 #if GENLIST_FX_SUPPORT
5718 sd->genlist_clearing = EINA_FALSE;
5720 //evas_event_thaw(evas_object_evas_get(ELM_WIDGET_DATA(sd)->obj));
5721 //evas_event_thaw_eval(evas_object_evas_get(ELM_WIDGET_DATA(sd)->obj));
5725 elm_genlist_multi_select_set(Evas_Object *obj,
5728 ELM_GENLIST_CHECK(obj);
5729 ELM_GENLIST_DATA_GET(obj, sd);
5731 sd->multi = !!multi;
5735 elm_genlist_multi_select_get(const Evas_Object *obj)
5737 ELM_GENLIST_CHECK(obj) EINA_FALSE;
5738 ELM_GENLIST_DATA_GET(obj, sd);
5743 EAPI Elm_Object_Item *
5744 elm_genlist_selected_item_get(const Evas_Object *obj)
5746 ELM_GENLIST_CHECK(obj) NULL;
5747 ELM_GENLIST_DATA_GET(obj, sd);
5750 return sd->selected->data;
5756 elm_genlist_selected_items_get(const Evas_Object *obj)
5758 ELM_GENLIST_CHECK(obj) NULL;
5759 ELM_GENLIST_DATA_GET(obj, sd);
5761 return sd->selected;
5765 elm_genlist_realized_items_get(const Evas_Object *obj)
5768 Eina_List *list = NULL;
5769 Eina_Bool done = EINA_FALSE;
5771 ELM_GENLIST_CHECK(obj) NULL;
5772 ELM_GENLIST_DATA_GET(obj, sd);
5774 EINA_INLIST_FOREACH(sd->blocks, itb)
5782 EINA_LIST_FOREACH(itb->items, l, it)
5784 if (it->realized) list = eina_list_append(list, it);
5795 EAPI Elm_Object_Item *
5796 elm_genlist_at_xy_item_get(const Evas_Object *obj,
5801 Evas_Coord ox, oy, ow, oh;
5805 ELM_GENLIST_CHECK(obj) NULL;
5806 ELM_GENLIST_DATA_GET(obj, sd);
5808 evas_object_geometry_get(sd->pan_obj, &ox, &oy, &ow, &oh);
5810 EINA_INLIST_FOREACH(sd->blocks, itb)
5815 if (!ELM_RECTS_INTERSECT(ox + itb->x - itb->sd->pan_x,
5816 oy + itb->y - itb->sd->pan_y,
5817 itb->w, itb->h, x, y, 1, 1))
5819 EINA_LIST_FOREACH(itb->items, l, it)
5821 Evas_Coord itx, ity;
5823 itx = ox + itb->x + it->x - itb->sd->pan_x;
5824 ity = oy + itb->y + it->y - itb->sd->pan_y;
5825 if (ELM_RECTS_INTERSECT
5826 (itx, ity, it->item->w, it->item->h, x, y, 1, 1))
5830 if (y <= (ity + (it->item->h / 4))) *posret = -1;
5831 else if (y >= (ity + it->item->h - (it->item->h / 4)))
5836 return (Elm_Object_Item *)it;
5838 lasty = ity + it->item->h;
5843 if (y > lasty) *posret = 1;
5850 EAPI Elm_Object_Item *
5851 elm_genlist_first_item_get(const Evas_Object *obj)
5853 Elm_Gen_Item *tit, *it = NULL;
5855 ELM_GENLIST_CHECK(obj) NULL;
5856 ELM_GENLIST_DATA_GET(obj, sd);
5858 EINA_INLIST_REVERSE_FOREACH(sd->items, tit) it = tit;
5860 return (Elm_Object_Item *)it;
5863 EAPI Elm_Object_Item *
5864 elm_genlist_last_item_get(const Evas_Object *obj)
5868 ELM_GENLIST_CHECK(obj) NULL;
5869 ELM_GENLIST_DATA_GET(obj, sd);
5870 if (!sd->items) return NULL;
5872 it = ELM_GEN_ITEM_FROM_INLIST(sd->items->last);
5873 return (Elm_Object_Item *)it;
5876 EAPI Elm_Object_Item *
5877 elm_genlist_item_next_get(const Elm_Object_Item *item)
5881 ELM_GENLIST_ITEM_CHECK_OR_RETURN(item, NULL);
5883 it = (Elm_Gen_Item *)item;
5886 it = ELM_GEN_ITEM_FROM_INLIST(EINA_INLIST_GET(it)->next);
5890 return (Elm_Object_Item *)it;
5893 EAPI Elm_Object_Item *
5894 elm_genlist_item_prev_get(const Elm_Object_Item *item)
5898 ELM_GENLIST_ITEM_CHECK_OR_RETURN(item, NULL);
5900 it = (Elm_Gen_Item *)item;
5903 it = ELM_GEN_ITEM_FROM_INLIST(EINA_INLIST_GET(it)->prev);
5907 return (Elm_Object_Item *)it;
5910 EAPI Elm_Object_Item *
5911 elm_genlist_item_parent_get(const Elm_Object_Item *it)
5913 ELM_GENLIST_ITEM_CHECK_OR_RETURN(it, NULL);
5915 return (Elm_Object_Item *)((Elm_Gen_Item *)it)->parent;
5919 elm_genlist_item_subitems_clear(Elm_Object_Item *item)
5921 Elm_Gen_Item *it = (Elm_Gen_Item *)item;
5923 ELM_GENLIST_ITEM_CHECK_OR_RETURN(item);
5924 _item_sub_items_clear(it);
5928 elm_genlist_item_selected_set(Elm_Object_Item *item,
5931 Elm_Gen_Item *it = (Elm_Gen_Item *)item;
5932 ELM_GENLIST_ITEM_CHECK_OR_RETURN(item);
5934 if (elm_widget_item_disabled_get(it)) return;
5935 selected = !!selected;
5936 if (it->selected == selected) return;
5938 _item_select_unselect(it, selected);
5942 elm_genlist_item_selected_get(const Elm_Object_Item *it)
5944 ELM_GENLIST_ITEM_CHECK_OR_RETURN(it, EINA_FALSE);
5946 return ((Elm_Gen_Item *)it)->selected;
5949 static Elm_Gen_Item *
5950 _elm_genlist_expanded_next_item_get(Elm_Gen_Item *it)
5954 if (it->item->expanded)
5956 it2 = (Elm_Gen_Item *)elm_genlist_item_next_get((Elm_Object_Item *)it);
5960 it2 = (Elm_Gen_Item *)elm_genlist_item_next_get((Elm_Object_Item *)it);
5963 if (it->item->expanded_depth >= it2->item->expanded_depth) break;
5964 it2 = (Elm_Gen_Item *)
5965 elm_genlist_item_next_get((Elm_Object_Item *)it2);
5971 static Evas_Object *
5972 _tray_alpha_bg_create(const Evas_Object *obj)
5974 Evas_Object *bg = NULL;
5975 Evas_Coord ox, oy, ow, oh;
5977 ELM_GENLIST_CHECK(obj) NULL;
5978 ELM_GENLIST_DATA_GET(obj, sd);
5980 evas_object_geometry_get(sd->pan_obj, &ox, &oy, &ow, &oh);
5981 bg = evas_object_rectangle_add
5982 (evas_object_evas_get(ELM_WIDGET_DATA(sd)->obj));
5983 evas_object_color_set(bg, 0, 0, 0, 0);
5984 evas_object_resize(bg, ow, oh);
5985 evas_object_move(bg, ox, oy);
5991 elm_genlist_item_expanded_set(Elm_Object_Item *item,
5994 Elm_Gen_Item *it = (Elm_Gen_Item *)item;
5996 ELM_GENLIST_ITEM_CHECK_OR_RETURN(item);
5998 expanded = !!expanded;
5999 if (it->item->expanded == expanded) return;
6000 if (it->item->type != ELM_GENLIST_ITEM_TREE) return;
6001 it->item->expanded = expanded;
6002 GL_IT(it)->wsd->expanded_item = it;
6003 GL_IT(it)->wsd->expanded_next_item =
6004 _elm_genlist_expanded_next_item_get(it);
6006 if (it->item->expanded)
6009 edje_object_signal_emit(VIEW(it), "elm,state,expanded", "elm");
6010 evas_object_smart_callback_call(WIDGET(it), SIG_EXPANDED, it);
6011 GL_IT(it)->wsd->auto_scroll_enabled = EINA_TRUE;
6016 edje_object_signal_emit(VIEW(it), "elm,state,contracted", "elm");
6017 evas_object_smart_callback_call(WIDGET(it), SIG_CONTRACTED, it);
6018 GL_IT(it)->wsd->auto_scroll_enabled = EINA_FALSE;
6023 elm_genlist_item_expanded_get(const Elm_Object_Item *it)
6025 ELM_GENLIST_ITEM_CHECK_OR_RETURN(it, EINA_FALSE);
6027 return ((Elm_Gen_Item *)it)->item->expanded;
6031 elm_genlist_item_expanded_depth_get(const Elm_Object_Item *it)
6033 ELM_GENLIST_ITEM_CHECK_OR_RETURN(it, 0);
6035 return ((Elm_Gen_Item *)it)->item->expanded_depth;
6039 _elm_genlist_item_coordinates_calc(Elm_Object_Item *item,
6040 Elm_Genlist_Item_Scrollto_Type type,
6047 Elm_Gen_Item *it = (Elm_Gen_Item *)item;
6048 Evas_Coord gith = 0;
6050 if (!((GL_IT(it)->wsd->homogeneous) &&
6051 (GL_IT(it)->wsd->mode == ELM_LIST_COMPRESS)))
6053 if ((it->item->queued) || (!it->item->mincalcd))
6055 GL_IT(it)->wsd->show_item = it;
6056 GL_IT(it)->wsd->bring_in = bring_in;
6057 GL_IT(it)->wsd->scroll_to_type = type;
6058 it->item->show_me = EINA_TRUE;
6062 if (GL_IT(it)->wsd->show_item)
6064 GL_IT(it)->wsd->show_item->item->show_me = EINA_FALSE;
6065 GL_IT(it)->wsd->show_item = NULL;
6068 evas_object_geometry_get(GL_IT(it)->wsd->pan_obj, NULL, NULL, w, h);
6071 case ELM_GENLIST_ITEM_SCROLLTO_IN:
6072 if ((it->item->group_item) &&
6073 (GL_IT(it)->wsd->pan_y > (it->y + it->item->block->y)))
6074 gith = it->item->group_item->item->h;
6076 *y = it->y + it->item->block->y - gith;
6079 case ELM_GENLIST_ITEM_SCROLLTO_TOP:
6080 if (it->item->group_item) gith = it->item->group_item->item->h;
6081 *y = it->y + it->item->block->y - gith;
6084 case ELM_GENLIST_ITEM_SCROLLTO_MIDDLE:
6085 *y = it->y + it->item->block->y - (*h / 2) + (it->item->h / 2);
6092 *x = it->x + it->item->block->x;
6093 *w = it->item->block->w;
6099 elm_genlist_item_promote(Elm_Object_Item *item)
6101 ELM_GENLIST_ITEM_CHECK_OR_RETURN(item);
6102 Elm_Gen_Item *it = (Elm_Gen_Item *)item;
6104 (it, (Elm_Gen_Item *)elm_genlist_first_item_get(WIDGET(it)));
6108 elm_genlist_item_demote(Elm_Object_Item *item)
6110 ELM_GENLIST_ITEM_CHECK_OR_RETURN(item);
6111 Elm_Gen_Item *it = (Elm_Gen_Item *)item;
6112 _item_move_after(it, (Elm_Gen_Item *)elm_genlist_last_item_get(WIDGET(it)));
6116 elm_genlist_item_show(Elm_Object_Item *item,
6117 Elm_Genlist_Item_Scrollto_Type type)
6119 Evas_Coord x, y, w, h;
6120 ELM_GENLIST_ITEM_CHECK_OR_RETURN(item);
6121 Elm_Gen_Item *it = (Elm_Gen_Item *)item;
6123 if (_elm_genlist_item_coordinates_calc
6124 (item, type, EINA_FALSE, &x, &y, &w, &h))
6125 GL_IT(it)->wsd->s_iface->content_region_show(WIDGET(item), x, y, w, h);
6129 elm_genlist_item_bring_in(Elm_Object_Item *item,
6130 Elm_Genlist_Item_Scrollto_Type type)
6132 Evas_Coord x, y, w, h;
6133 ELM_GENLIST_ITEM_CHECK_OR_RETURN(item);
6134 Elm_Gen_Item *it = (Elm_Gen_Item *)item;
6136 if (_elm_genlist_item_coordinates_calc
6137 (item, type, EINA_TRUE, &x, &y, &w, &h))
6138 GL_IT(it)->wsd->s_iface->region_bring_in(WIDGET(item), x, y, w, h);
6142 elm_genlist_item_all_contents_unset(Elm_Object_Item *item,
6145 Evas_Object *content;
6147 ELM_GENLIST_ITEM_CHECK_OR_RETURN(item);
6148 Elm_Gen_Item *it = (Elm_Gen_Item *)item;
6150 EINA_LIST_FREE (it->content_objs, content)
6152 evas_object_smart_member_del(content);
6153 evas_object_hide(content);
6154 if (l) *l = eina_list_append(*l, content);
6159 elm_genlist_item_update(Elm_Object_Item *item)
6161 ELM_GENLIST_ITEM_CHECK_OR_RETURN(item);
6162 Elm_Gen_Item *it = (Elm_Gen_Item *)item;
6164 if (!it->item->block) return;
6165 it->item->mincalcd = EINA_FALSE;
6166 it->item->updateme = EINA_TRUE;
6167 it->item->block->updateme = EINA_TRUE;
6168 #if GENLIST_ENTRY_SUPPORT
6169 it->item->unrealize_disabled = EINA_FALSE;
6172 #if GENLIST_FX_SUPPORT
6173 if (GL_IT(it)->wsd->fx_first_captured)
6174 _elm_genlist_fx_clear(ELM_WIDGET_DATA(GL_IT(it)->wsd)->obj);
6177 if (GL_IT(it)->wsd->update_job) ecore_job_del(GL_IT(it)->wsd->update_job);
6178 GL_IT(it)->wsd->update_job = ecore_job_add(_update_job, GL_IT(it)->wsd);
6182 elm_genlist_item_fields_update(Elm_Object_Item *item,
6184 Elm_Genlist_Item_Field_Type itf)
6186 ELM_GENLIST_ITEM_CHECK_OR_RETURN(item);
6187 Elm_Gen_Item *it = (Elm_Gen_Item *)item;
6189 if (!it->item->block) return;
6191 #if GENLIST_ENTRY_SUPPORT
6192 it->item->unrealize_disabled = EINA_FALSE;
6194 if ((!itf) || (itf & ELM_GENLIST_ITEM_FIELD_TEXT))
6196 _item_text_realize(it, VIEW(it), &it->texts, parts);
6198 if ((!itf) || (itf & ELM_GENLIST_ITEM_FIELD_CONTENT))
6200 it->content_objs = _item_content_unrealize(it, VIEW(it),
6201 &it->contents, parts);
6202 it->content_objs = _item_content_realize(it, VIEW(it),
6203 &it->contents, parts);
6207 it->item->flip_content_objs =
6208 _item_mode_content_unrealize(it, VIEW(it),
6209 &it->item->flip_contents, parts,
6210 &it->item->flip_content_objs);
6211 it->item->flip_content_objs =
6212 _item_mode_content_realize(it, VIEW(it),
6213 &it->item->flip_contents, parts,
6214 &it->item->flip_content_objs);
6216 if (it->item->deco_it_view)
6218 it->item->deco_it_content_objs =
6219 _item_mode_content_unrealize(it, it->item->deco_it_view,
6220 &it->item->deco_it_contents, parts,
6221 &it->item->deco_it_content_objs);
6222 it->item->deco_it_content_objs =
6223 _item_mode_content_realize(it, it->item->deco_it_view,
6224 &it->item->deco_it_contents, parts,
6225 &it->item->deco_it_content_objs);
6227 if (GL_IT(it)->wsd->decorate_all_mode)
6229 it->item->deco_all_content_objs =
6230 _item_mode_content_unrealize
6231 (it, it->deco_all_view, &it->item->deco_all_contents, parts,
6232 &it->item->deco_all_content_objs);
6233 it->item->deco_all_content_objs =
6234 _item_mode_content_realize(it, it->deco_all_view,
6235 &it->item->deco_all_contents, parts,
6236 &it->item->deco_all_content_objs);
6240 if ((!itf) || (itf & ELM_GENLIST_ITEM_FIELD_STATE))
6241 _item_state_realize(it, VIEW(it), &it->states, parts);
6245 elm_genlist_item_item_class_update(Elm_Object_Item *item,
6246 const Elm_Genlist_Item_Class *itc)
6248 ELM_GENLIST_ITEM_CHECK_OR_RETURN(item);
6249 Elm_Gen_Item *it = (Elm_Gen_Item *)item;
6251 if (!it->item->block) return;
6252 EINA_SAFETY_ON_NULL_RETURN(itc);
6254 it->item->nocache_once = EINA_TRUE;
6256 elm_widget_stringlist_free(it->texts);
6258 elm_widget_stringlist_free(it->contents);
6259 it->contents = NULL;
6260 elm_widget_stringlist_free(it->states);
6265 elm_widget_stringlist_free(it->item->flip_contents);
6266 it->item->flip_contents = NULL;
6268 if (it->item->deco_it_view)
6270 elm_widget_stringlist_free(it->item->deco_it_texts);
6271 it->item->deco_it_texts = NULL;
6272 elm_widget_stringlist_free(it->item->deco_it_contents);
6273 it->item->deco_it_contents = NULL;
6275 if (GL_IT(it)->wsd->decorate_all_mode)
6277 elm_widget_stringlist_free(it->item->deco_all_texts);
6278 it->item->deco_all_texts = NULL;
6279 elm_widget_stringlist_free(it->item->deco_all_contents);
6280 it->item->deco_all_contents = NULL;
6283 elm_genlist_item_update(item);
6286 EAPI const Elm_Genlist_Item_Class *
6287 elm_genlist_item_item_class_get(const Elm_Object_Item *item)
6289 ELM_GENLIST_ITEM_CHECK_OR_RETURN(item, NULL);
6290 Elm_Gen_Item *it = (Elm_Gen_Item *)item;
6294 static Evas_Object *
6295 _elm_genlist_item_label_create(void *data,
6296 Evas_Object *obj __UNUSED__,
6297 Evas_Object *tooltip,
6298 void *it __UNUSED__)
6300 Evas_Object *label = elm_label_add(tooltip);
6305 elm_object_style_set(label, "tooltip");
6306 elm_object_text_set(label, data);
6312 _elm_genlist_item_label_del_cb(void *data,
6313 Evas_Object *obj __UNUSED__,
6314 void *event_info __UNUSED__)
6316 eina_stringshare_del(data);
6320 elm_genlist_item_tooltip_text_set(Elm_Object_Item *it,
6323 ELM_GENLIST_ITEM_CHECK_OR_RETURN(it);
6325 text = eina_stringshare_add(text);
6326 elm_genlist_item_tooltip_content_cb_set
6327 (it, _elm_genlist_item_label_create, text,
6328 _elm_genlist_item_label_del_cb);
6332 elm_genlist_item_tooltip_content_cb_set(Elm_Object_Item *item,
6333 Elm_Tooltip_Item_Content_Cb func,
6335 Evas_Smart_Cb del_cb)
6337 Elm_Gen_Item *it = (Elm_Gen_Item *)item;
6339 ELM_GENLIST_ITEM_CHECK_OR_GOTO(item, error);
6341 if ((it->tooltip.content_cb == func) && (it->tooltip.data == data))
6344 if (it->tooltip.del_cb)
6345 it->tooltip.del_cb((void *)it->tooltip.data, WIDGET(it), it);
6347 it->tooltip.content_cb = func;
6348 it->tooltip.data = data;
6349 it->tooltip.del_cb = del_cb;
6353 elm_widget_item_tooltip_content_cb_set
6354 (it, it->tooltip.content_cb, it->tooltip.data, NULL);
6355 elm_widget_item_tooltip_style_set(it, it->tooltip.style);
6356 elm_widget_item_tooltip_window_mode_set(it, it->tooltip.free_size);
6362 if (del_cb) del_cb((void *)data, NULL, NULL);
6366 elm_genlist_item_tooltip_unset(Elm_Object_Item *item)
6368 Elm_Gen_Item *it = (Elm_Gen_Item *)item;
6370 ELM_GENLIST_ITEM_CHECK_OR_RETURN(item);
6372 if ((VIEW(it)) && (it->tooltip.content_cb))
6373 elm_widget_item_tooltip_unset(it);
6375 if (it->tooltip.del_cb)
6376 it->tooltip.del_cb((void *)it->tooltip.data, WIDGET(it), it);
6377 it->tooltip.del_cb = NULL;
6378 it->tooltip.content_cb = NULL;
6379 it->tooltip.data = NULL;
6380 it->tooltip.free_size = EINA_FALSE;
6381 if (it->tooltip.style)
6382 elm_genlist_item_tooltip_style_set(item, NULL);
6386 elm_genlist_item_tooltip_style_set(Elm_Object_Item *item,
6389 Elm_Gen_Item *it = (Elm_Gen_Item *)item;
6391 ELM_GENLIST_ITEM_CHECK_OR_RETURN(item);
6393 eina_stringshare_replace(&it->tooltip.style, style);
6394 if (VIEW(it)) elm_widget_item_tooltip_style_set(it, style);
6398 elm_genlist_item_tooltip_style_get(const Elm_Object_Item *it)
6400 return elm_object_item_tooltip_style_get(it);
6404 elm_genlist_item_tooltip_window_mode_set(Elm_Object_Item *item,
6407 Elm_Gen_Item *it = (Elm_Gen_Item *)item;
6409 ELM_GENLIST_ITEM_CHECK_OR_RETURN(item, EINA_FALSE);
6411 it->tooltip.free_size = disable;
6412 if (VIEW(it)) return elm_widget_item_tooltip_window_mode_set(it, disable);
6418 elm_genlist_item_tooltip_window_mode_get(const Elm_Object_Item *it)
6420 return elm_object_tooltip_window_mode_get(VIEW(it));
6424 elm_genlist_item_cursor_set(Elm_Object_Item *item,
6427 Elm_Gen_Item *it = (Elm_Gen_Item *)item;
6429 ELM_GENLIST_ITEM_CHECK_OR_RETURN(item);
6430 eina_stringshare_replace(&it->mouse_cursor, cursor);
6431 if (VIEW(it)) elm_widget_item_cursor_set(it, cursor);
6435 elm_genlist_item_cursor_get(const Elm_Object_Item *it)
6437 return elm_widget_item_cursor_get(it);
6441 elm_genlist_item_cursor_unset(Elm_Object_Item *item)
6443 Elm_Gen_Item *it = (Elm_Gen_Item *)item;
6445 ELM_GENLIST_ITEM_CHECK_OR_RETURN(item);
6447 if (!it->mouse_cursor) return;
6449 if (VIEW(it)) elm_widget_item_cursor_unset(it);
6451 eina_stringshare_del(it->mouse_cursor);
6452 it->mouse_cursor = NULL;
6456 elm_genlist_item_cursor_style_set(Elm_Object_Item *it,
6459 elm_widget_item_cursor_style_set(it, style);
6463 elm_genlist_item_cursor_style_get(const Elm_Object_Item *it)
6465 return elm_widget_item_cursor_style_get(it);
6469 elm_genlist_item_cursor_engine_only_set(Elm_Object_Item *it,
6470 Eina_Bool engine_only)
6472 elm_widget_item_cursor_engine_only_set(it, engine_only);
6476 elm_genlist_item_cursor_engine_only_get(const Elm_Object_Item *it)
6478 return elm_widget_item_cursor_engine_only_get(it);
6482 elm_genlist_item_index_get(const Elm_Object_Item *item)
6486 Elm_Gen_Item *it = (Elm_Gen_Item *)item;
6488 ELM_GENLIST_ITEM_CHECK_OR_RETURN(item, -1);
6490 EINA_INLIST_FOREACH(GL_IT(it)->wsd->items, tmp)
6492 if (tmp == it) break;
6499 elm_genlist_mode_set(Evas_Object *obj,
6502 ELM_GENLIST_CHECK(obj);
6503 ELM_GENLIST_DATA_GET(obj, sd);
6505 if (sd->mode == mode) return;
6507 elm_layout_sizing_eval(obj);
6511 elm_genlist_mode_get(const Evas_Object *obj)
6513 ELM_GENLIST_CHECK(obj) ELM_LIST_LAST;
6514 ELM_GENLIST_DATA_GET(obj, sd);
6520 elm_genlist_bounce_set(Evas_Object *obj,
6524 ELM_GENLIST_CHECK(obj);
6525 ELM_GENLIST_DATA_GET(obj, sd);
6527 sd->h_bounce = !!h_bounce;
6528 sd->v_bounce = !!v_bounce;
6529 sd->s_iface->bounce_allow_set(obj, sd->h_bounce, sd->v_bounce);
6533 elm_genlist_bounce_get(const Evas_Object *obj,
6534 Eina_Bool *h_bounce,
6535 Eina_Bool *v_bounce)
6537 ELM_GENLIST_CHECK(obj);
6538 ELM_GENLIST_DATA_GET(obj, sd);
6540 if (h_bounce) *h_bounce = sd->h_bounce;
6541 if (v_bounce) *v_bounce = sd->v_bounce;
6545 elm_genlist_homogeneous_set(Evas_Object *obj,
6546 Eina_Bool homogeneous)
6548 ELM_GENLIST_CHECK(obj);
6549 ELM_GENLIST_DATA_GET(obj, sd);
6551 sd->homogeneous = !!homogeneous;
6555 elm_genlist_homogeneous_get(const Evas_Object *obj)
6557 ELM_GENLIST_CHECK(obj) EINA_FALSE;
6558 ELM_GENLIST_DATA_GET(obj, sd);
6560 return sd->homogeneous;
6564 elm_genlist_block_count_set(Evas_Object *obj,
6567 ELM_GENLIST_CHECK(obj);
6568 ELM_GENLIST_DATA_GET(obj, sd);
6569 EINA_SAFETY_ON_TRUE_RETURN(count < 1);
6571 sd->max_items_per_block = count;
6572 sd->item_cache_max = sd->max_items_per_block * 2;
6573 _item_cache_all_free(sd);
6577 elm_genlist_block_count_get(const Evas_Object *obj)
6579 ELM_GENLIST_CHECK(obj) 0;
6580 ELM_GENLIST_DATA_GET(obj, sd);
6582 return sd->max_items_per_block;
6586 elm_genlist_longpress_timeout_set(Evas_Object *obj,
6589 ELM_GENLIST_CHECK(obj);
6590 ELM_GENLIST_DATA_GET(obj, sd);
6592 sd->longpress_timeout = timeout;
6596 elm_genlist_longpress_timeout_get(const Evas_Object *obj)
6598 ELM_GENLIST_CHECK(obj) 0;
6599 ELM_GENLIST_DATA_GET(obj, sd);
6601 return sd->longpress_timeout;
6605 elm_genlist_scroller_policy_set(Evas_Object *obj,
6606 Elm_Scroller_Policy policy_h,
6607 Elm_Scroller_Policy policy_v)
6609 ELM_GENLIST_CHECK(obj);
6610 ELM_GENLIST_DATA_GET(obj, sd);
6612 if ((policy_h >= ELM_SCROLLER_POLICY_LAST) ||
6613 (policy_v >= ELM_SCROLLER_POLICY_LAST))
6616 sd->s_iface->policy_set(obj, policy_h, policy_v);
6620 elm_genlist_scroller_policy_get(const Evas_Object *obj,
6621 Elm_Scroller_Policy *policy_h,
6622 Elm_Scroller_Policy *policy_v)
6624 Elm_Scroller_Policy s_policy_h, s_policy_v;
6626 ELM_GENLIST_CHECK(obj);
6627 ELM_GENLIST_DATA_GET(obj, sd);
6629 sd->s_iface->policy_get(obj, &s_policy_h, &s_policy_v);
6630 if (policy_h) *policy_h = (Elm_Scroller_Policy)s_policy_h;
6631 if (policy_v) *policy_v = (Elm_Scroller_Policy)s_policy_v;
6635 elm_genlist_realized_items_update(Evas_Object *obj)
6637 Eina_List *list, *l;
6638 Elm_Object_Item *it;
6640 ELM_GENLIST_CHECK(obj);
6642 list = elm_genlist_realized_items_get(obj);
6643 EINA_LIST_FOREACH(list, l, it)
6644 elm_genlist_item_update(it);
6648 elm_genlist_item_decorate_mode_set(Elm_Object_Item *item,
6649 const char *decorate_it_type,
6650 Eina_Bool decorate_it_set)
6652 Elm_Gen_Item *it = (Elm_Gen_Item *)item;
6653 Elm_Genlist_Smart_Data *sd;
6655 ELM_GENLIST_ITEM_CHECK_OR_RETURN(item);
6656 sd = GL_IT(it)->wsd;
6658 if (elm_widget_item_disabled_get(it)) return;
6659 if (!decorate_it_type) return;
6660 if (sd->decorate_all_mode) return;
6662 if ((sd->mode_item == it) &&
6663 (!strcmp(decorate_it_type, sd->decorate_it_type)) &&
6666 if (!it->itc->decorate_item_style) return;
6667 it->decorate_it_set = decorate_it_set;
6670 if (((sd->decorate_it_type)
6671 && (strcmp(decorate_it_type, sd->decorate_it_type))) ||
6672 (decorate_it_set) || ((it == sd->mode_item) && (!decorate_it_set)))
6673 _decorate_item_unset(sd);
6675 eina_stringshare_replace(&sd->decorate_it_type, decorate_it_type);
6676 if (decorate_it_set) _decorate_item_set(it);
6680 elm_genlist_item_decorate_mode_get(const Elm_Object_Item *item)
6682 Elm_Gen_Item *i = (Elm_Gen_Item *)item;
6684 ELM_GENLIST_ITEM_CHECK_OR_RETURN(item, NULL);
6685 return GL_IT(i)->wsd->decorate_it_type;
6688 EAPI Elm_Object_Item *
6689 elm_genlist_decorated_item_get(const Evas_Object *obj)
6691 ELM_GENLIST_CHECK(obj) NULL;
6692 ELM_GENLIST_DATA_GET(obj, sd);
6694 return (Elm_Object_Item *)sd->mode_item;
6698 elm_genlist_decorate_mode_get(const Evas_Object *obj)
6700 ELM_GENLIST_CHECK(obj) EINA_FALSE;
6701 ELM_GENLIST_DATA_GET(obj, sd);
6703 return sd->decorate_all_mode;
6707 elm_genlist_decorate_mode_set(Evas_Object *obj,
6708 Eina_Bool decorated)
6711 Eina_List *list, *l;
6713 ELM_GENLIST_CHECK(obj);
6714 ELM_GENLIST_DATA_GET(obj, sd);
6716 decorated = !!decorated;
6717 if (sd->decorate_all_mode == decorated) return;
6718 // decorate_all_mode should be set first
6719 // because content_get func. will be called after this
6720 // and user can check whether deocrate_all_mode is enabeld.
6721 sd->decorate_all_mode = decorated;
6723 list = elm_genlist_realized_items_get(obj);
6724 if (!sd->decorate_all_mode)
6726 EINA_LIST_FOREACH(list, l, it)
6728 if (it->item->type != ELM_GENLIST_ITEM_GROUP)
6729 _decorate_all_item_unrealize(it);
6731 _item_cache_all_free(sd);
6735 EINA_LIST_FOREACH(list, l, it)
6737 if (it->item->type != ELM_GENLIST_ITEM_GROUP)
6739 if (it->itc->decorate_all_item_style)
6740 _decorate_all_item_realize(it, EINA_TRUE);
6744 #if GENLIST_FX_SUPPORT
6745 if (sd->fx_first_captured)
6746 _elm_genlist_fx_clear(ELM_WIDGET_DATA(sd)->obj);
6749 if (sd->calc_job) ecore_job_del(sd->calc_job);
6750 sd->calc_job = ecore_job_add(_calc_job, sd);
6754 elm_genlist_reorder_mode_set(Evas_Object *obj,
6755 Eina_Bool reorder_mode)
6757 #if 1 // FIXME: difference from upstream
6758 Eina_List *list, *l;
6761 ELM_GENLIST_CHECK(obj);
6762 ELM_GENLIST_DATA_GET(obj, sd);
6764 if (sd->reorder_mode == !!reorder_mode) return;
6765 sd->reorder_mode = !!reorder_mode;
6766 #if 1 // FIXME: difference from upstream
6767 list = elm_genlist_realized_items_get(obj);
6768 EINA_LIST_FOREACH(list, l, it)
6770 if (it->item->type != ELM_GENLIST_ITEM_GROUP)
6773 if (it->deco_all_view) view = it->deco_all_view;
6774 else view = VIEW(it);
6776 if (sd->reorder_mode)
6777 edje_object_signal_emit
6778 (view, "elm,state,reorder,mode_set", "elm");
6780 edje_object_signal_emit
6781 (view, "elm,state,reorder,mode_unset", "elm");
6784 eina_list_free(list);
6789 elm_genlist_reorder_mode_get(const Evas_Object *obj)
6791 ELM_GENLIST_CHECK(obj) EINA_FALSE;
6792 ELM_GENLIST_DATA_GET(obj, sd);
6794 return sd->reorder_mode;
6797 EAPI Elm_Genlist_Item_Type
6798 elm_genlist_item_type_get(const Elm_Object_Item *item)
6800 Elm_Gen_Item *it = (Elm_Gen_Item *)item;
6802 ELM_GENLIST_ITEM_CHECK_OR_RETURN(item, ELM_GENLIST_ITEM_MAX);
6804 return it->item->type;
6807 EAPI Elm_Genlist_Item_Class *
6808 elm_genlist_item_class_new(void)
6810 Elm_Genlist_Item_Class *itc = ELM_NEW(Elm_Genlist_Item_Class);
6811 EINA_SAFETY_ON_NULL_RETURN_VAL(itc, NULL);
6813 itc->version = CLASS_ALLOCATED;
6815 itc->delete_me = EINA_FALSE;
6821 elm_genlist_item_class_free(Elm_Genlist_Item_Class *itc)
6823 if (itc && (itc->version == CLASS_ALLOCATED))
6825 if (!itc->delete_me) itc->delete_me = EINA_TRUE;
6826 if (itc->refcount > 0) elm_genlist_item_class_unref(itc);
6836 elm_genlist_item_class_ref(Elm_Genlist_Item_Class *itc)
6838 if (itc && (itc->version == CLASS_ALLOCATED))
6841 if (itc->refcount == 0) itc->refcount--;
6846 elm_genlist_item_class_unref(Elm_Genlist_Item_Class *itc)
6848 if (itc && (itc->version == CLASS_ALLOCATED))
6850 if (itc->refcount > 0) itc->refcount--;
6851 if (itc->delete_me && (!itc->refcount))
6852 elm_genlist_item_class_free(itc);
6857 elm_genlist_item_flip_set(Elm_Object_Item *item,
6860 Elm_Gen_Item *it = (Elm_Gen_Item *)item;
6861 ELM_GENLIST_ITEM_CHECK_OR_RETURN(item);
6862 Elm_Genlist_Smart_Data *sd = GL_IT(it)->wsd;
6865 if (it->flipped == flip) return;
6867 it->item->unrealize_disabled = EINA_FALSE;
6871 _item_unrealize(it, EINA_FALSE);
6872 it->flipped = EINA_TRUE;
6873 it->item->nocache = EINA_TRUE;
6877 _item_unrealize(it, EINA_FALSE);
6878 it->flipped = EINA_FALSE;
6879 it->item->nocache = EINA_FALSE;
6881 if (sd->calc_job) ecore_job_del(sd->calc_job);
6882 sd->calc_job = ecore_job_add(_calc_job, sd);
6886 elm_genlist_item_flip_get(const Elm_Object_Item *item)
6888 Elm_Gen_Item *it = (Elm_Gen_Item *)item;
6890 ELM_GENLIST_ITEM_CHECK_OR_RETURN(item, EINA_FALSE);
6896 elm_genlist_select_mode_set(Evas_Object *obj,
6897 Elm_Object_Select_Mode mode)
6899 ELM_GENLIST_CHECK(obj);
6900 ELM_GENLIST_DATA_GET(obj, sd);
6902 if (mode >= ELM_OBJECT_SELECT_MODE_MAX || (sd->select_mode == mode))
6905 sd->select_mode = mode;
6906 if ((sd->select_mode == ELM_OBJECT_SELECT_MODE_NONE) ||
6907 (sd->select_mode == ELM_OBJECT_SELECT_MODE_DISPLAY_ONLY ))
6911 EINA_LIST_FOREACH_SAFE(sd->selected, l, ll, it)
6916 EAPI Elm_Object_Select_Mode
6917 elm_genlist_select_mode_get(const Evas_Object *obj)
6919 ELM_GENLIST_CHECK(obj) ELM_OBJECT_SELECT_MODE_MAX;
6920 ELM_GENLIST_DATA_GET(obj, sd);
6922 return sd->select_mode;
6926 elm_genlist_highlight_mode_set(Evas_Object *obj,
6927 Eina_Bool highlight)
6929 ELM_GENLIST_CHECK(obj);
6930 ELM_GENLIST_DATA_GET(obj, sd);
6932 sd->highlight = !!highlight;
6936 elm_genlist_highlight_mode_get(const Evas_Object *obj)
6938 ELM_GENLIST_CHECK(obj) EINA_FALSE;
6939 ELM_GENLIST_DATA_GET(obj, sd);
6941 return sd->highlight;
6945 elm_genlist_item_select_mode_set(Elm_Object_Item *item,
6946 Elm_Object_Select_Mode mode)
6948 Elm_Gen_Item *it = (Elm_Gen_Item *)item;
6950 ELM_GENLIST_ITEM_CHECK_OR_RETURN(item);
6952 if (mode >= ELM_OBJECT_SELECT_MODE_MAX)
6954 if (it->select_mode != mode)
6955 it->select_mode = mode;
6957 if ((it->select_mode == ELM_OBJECT_SELECT_MODE_NONE) ||
6958 (it->select_mode == ELM_OBJECT_SELECT_MODE_DISPLAY_ONLY ))
6961 if (it->select_mode == ELM_OBJECT_SELECT_MODE_DISPLAY_ONLY)
6963 it->item->mincalcd = EINA_FALSE;
6964 it->item->updateme = EINA_TRUE;
6965 if (it->item->block) it->item->block->updateme = EINA_TRUE;
6966 if (GL_IT(it)->wsd->update_job)
6967 ecore_job_del(GL_IT(it)->wsd->update_job);
6968 GL_IT(it)->wsd->update_job =
6969 ecore_job_add(_update_job, GL_IT(it)->wsd);
6971 // reset homogeneous item size
6972 if (GL_IT(it)->wsd->homogeneous)
6975 GL_IT(it)->wsd->group_item_width =
6976 GL_IT(it)->wsd->group_item_height = 0;
6978 GL_IT(it)->wsd->item_width = GL_IT(it)->wsd->item_height = 0;
6983 EAPI Elm_Object_Select_Mode
6984 elm_genlist_item_select_mode_get(const Elm_Object_Item *item)
6986 Elm_Gen_Item *it = (Elm_Gen_Item *)item;
6988 ELM_GENLIST_ITEM_CHECK_OR_RETURN(item, ELM_OBJECT_SELECT_MODE_MAX);
6990 if (!it) return ELM_OBJECT_SELECT_MODE_MAX;
6992 return it->select_mode;
6995 // will be deprecated
6997 elm_genlist_tree_effect_enabled_set(Evas_Object *obj __UNUSED__,
6998 Eina_Bool enabled __UNUSED__)
7000 ELM_GENLIST_CHECK(obj);
7003 // will be deprecated
7005 elm_genlist_tree_effect_enabled_get(const Evas_Object *obj __UNUSED__)
7007 ELM_GENLIST_CHECK(obj) EINA_FALSE;
7012 EAPI Elm_Object_Item *
7013 elm_genlist_nth_item_get(const Evas_Object *obj, unsigned int nth)
7015 Elm_Gen_Item *it = NULL;
7019 ELM_GENLIST_CHECK(obj) NULL;
7020 ELM_GENLIST_DATA_GET(obj, sd);
7022 if (!sd->items) return NULL;
7024 a = eina_inlist_accessor_new(sd->items);
7025 if (!a) return NULL;
7026 if (eina_accessor_data_get(a, nth, &data))
7027 it = ELM_GEN_ITEM_FROM_INLIST(data);
7028 eina_accessor_free(a);
7029 return (Elm_Object_Item *)it;
7032 #if GENLIST_FX_SUPPORT
7034 elm_genlist_fx_mode_set(Evas_Object *obj, Eina_Bool mode)
7036 ELM_GENLIST_CHECK(obj);
7037 ELM_GENLIST_DATA_GET(obj, sd);
7043 elm_genlist_fx_mode_get(const Evas_Object *obj)
7045 ELM_GENLIST_CHECK(obj) EINA_FALSE;
7046 ELM_GENLIST_DATA_GET(obj, sd);
7052 _elm_genlist_proxy_item_del(const Elm_Object_Item *item)
7054 Elm_Gen_Item *it = (Elm_Gen_Item *)item;
7055 if ((!it) || (!it->item)) return;
7057 Elm_Genlist_Smart_Data *sd = GL_IT(it)->wsd;
7061 EINA_LIST_FOREACH(sd->capture_before_items, l, pi)
7062 if (pi->it == it) pi->it = NULL;
7064 EINA_LIST_FOREACH(sd->capture_after_items, l, pi)
7065 if (pi->it == it) pi->it = NULL;
7069 _elm_genlist_proxy_item_new(const Elm_Object_Item *item)
7071 Elm_Gen_Item *it = (Elm_Gen_Item *)item;
7072 if ((!it) || (!it->item)) return EINA_FALSE;
7075 Proxy_Item *pi = NULL;
7076 pi = calloc(1, sizeof(Proxy_Item));
7077 if (!pi) return NULL;
7079 pi->proxy = evas_object_image_filled_add
7080 (evas_object_evas_get(ELM_WIDGET_DATA(GL_IT(it)->wsd)->obj));
7081 if (!pi->proxy) return EINA_FALSE;
7082 evas_object_clip_set(pi->proxy, evas_object_clip_get(GL_IT(it)->wsd->pan_obj));
7083 evas_object_smart_member_add(pi->proxy, GL_IT(it)->wsd->pan_obj);
7084 evas_object_hide(pi->proxy);
7086 if ((GL_IT(it)->wsd->decorate_all_mode) && (it->deco_all_view))
7087 evas_object_image_source_set(pi->proxy, it->deco_all_view);
7089 evas_object_image_source_set(pi->proxy, VIEW(it));
7091 GL_IT(it)->has_proxy_it = EINA_TRUE;
7093 pi->num = it->item->num;
7094 pi->x = it->item->scrl_x;
7095 pi->y = it->item->scrl_y;
7096 pi->w = it->item->w;
7097 pi->h = it->item->h;
7099 evas_object_geometry_get(VIEW(it), NULL, NULL, &w, &h);
7101 if (w <= 0 || h <= 0)
7103 evas_object_size_hint_min_get(VIEW(it), &w, &h);
7104 evas_object_size_hint_min_set(pi->proxy, w, h);
7106 else evas_object_resize(pi->proxy, w, h);
7112 _elm_genlist_fx_capture(Evas_Object *obj, int level)
7114 ELM_GENLIST_DATA_GET(obj, sd);
7118 Eina_Bool done = EINA_FALSE;
7121 Evas_Coord ox, oy, ow, oh;
7125 if ((!sd->rendered) || (sd->fx_playing)) return EINA_FALSE;
7126 if ((!level) && (sd->fx_first_captured)) return EINA_FALSE;
7127 if ((level) && (!sd->fx_first_captured)) return EINA_FALSE;
7129 evas_object_geometry_get(sd->pan_obj, &ox, &oy, &ow, &oh);
7133 sd->fx_first_captured = EINA_TRUE;
7134 EINA_LIST_FREE(sd->capture_before_items, pi)
7136 if ((pi->it) && (GL_IT(pi->it))) GL_IT(pi->it)->has_proxy_it = EINA_FALSE;
7137 if (pi->proxy) evas_object_smart_member_del(pi->proxy);
7138 if (pi->proxy) evas_object_del(pi->proxy);
7144 EINA_LIST_FREE(sd->capture_after_items, pi)
7146 if ((pi->it) && (GL_IT(pi->it))) GL_IT(pi->it)->has_proxy_it = EINA_FALSE;
7147 if (pi->proxy) evas_object_smart_member_del(pi->proxy);
7148 if (pi->proxy) evas_object_del(pi->proxy);
7152 EINA_INLIST_FOREACH(sd->blocks, itb)
7156 EINA_LIST_FOREACH(itb->items, l, it)
7158 if (it->realized && it->item->scrl_y >= oy)
7160 sd->realized_top_item = it;
7165 if (sd->realized_top_item) break;
7169 #if GENLIST_PINCH_ZOOM_SUPPORT
7170 if (sd->pinch_zoom_mode)
7172 EINA_INLIST_FOREACH(sd->blocks, itb)
7174 EINA_LIST_FOREACH(itb->items, l, it)
7177 if (IS_ROOT_PARENT_IT(it) && it->realized
7178 && (GL_IT(it)->scrl_y + GL_IT(it)->h >= oy && GL_IT(it)->scrl_y <= oy + oh))
7180 pi = _elm_genlist_proxy_item_new((Elm_Object_Item *)it);
7181 if (!level) sd->capture_before_items = eina_list_append(sd->capture_before_items, pi);
7182 else sd->capture_after_items = eina_list_append(sd->capture_after_items, pi);
7186 if ((sd->pinch_zoom_mode == ELM_GEN_PINCH_ZOOM_CONTRACT) && (level)) return EINA_TRUE;
7187 if ((sd->pinch_zoom_mode == ELM_GEN_PINCH_ZOOM_EXPAND) && (!level)) return EINA_TRUE;
7191 EINA_INLIST_FOREACH(sd->blocks, itb)
7196 EINA_LIST_FOREACH(itb->items, l, it)
7198 #if GENLIST_PINCH_ZOOM_SUPPORT
7199 if ((sd->pinch_zoom_mode) && (IS_ROOT_PARENT_IT(it))) continue;
7203 pi = _elm_genlist_proxy_item_new((Elm_Object_Item *)it);
7206 sd->capture_before_items = eina_list_append(sd->capture_before_items, pi);
7208 sd->capture_after_items = eina_list_append(sd->capture_after_items, pi);
7212 else if (done) break;
7217 static Elm_Gen_FX_Item *
7218 _elm_genlist_fx_item_find(const Elm_Object_Item *item)
7220 Elm_Gen_Item *it = (Elm_Gen_Item *)item;
7221 if (!it) return EINA_FALSE;
7223 Elm_Genlist_Smart_Data *sd = GL_IT(it)->wsd;
7224 if (!sd) return NULL;
7226 Elm_Gen_FX_Item *fi = NULL;
7229 EINA_LIST_FOREACH(sd->fx_items, l, fi)
7231 if (fi->it == it) return fi;
7236 static Elm_Gen_FX_Item *
7237 _elm_genlist_fx_item_new(const Proxy_Item *pi)
7239 if ((!pi) || (!pi->it)) return NULL;
7241 Elm_Gen_FX_Item *fi = NULL;
7242 fi = calloc(1, sizeof(Elm_Gen_FX_Item));
7243 if (!fi) return NULL;
7246 GL_IT(fi->it)->fi = fi;
7247 fi->proxy = pi->proxy;
7249 fi->from.x = fi->to.x = pi->x;
7250 fi->from.y = fi->to.y = pi->y;
7251 fi->from.w = fi->to.w = pi->w;
7252 fi->from.h = fi->to.h = pi->h;
7253 fi->update = EINA_FALSE;
7258 static Elm_Object_Item *
7259 _elm_genlist_fx_item_prev_get(const Elm_Object_Item *item)
7262 it = (Elm_Gen_Item *)item;
7263 if (!it) return NULL;
7264 if (GL_IT(it)->wsd->pinch_zoom_mode) return NULL;
7268 it = ELM_GEN_ITEM_FROM_INLIST(EINA_INLIST_GET(it)->prev);
7272 return (Elm_Object_Item *)it;
7276 _elm_genlist_fx_items_make(Evas_Object *obj)
7278 ELM_GENLIST_CHECK(obj) EINA_FALSE;
7279 ELM_GENLIST_DATA_GET(obj, sd);
7281 Elm_Gen_FX_Item *fi;
7284 Elm_Gen_Item *prev = NULL;
7285 Evas_Coord ox, oy, ow, oh, mv_dist, max_mv_dist = 0;
7287 evas_object_geometry_get(sd->pan_obj, &ox, &oy, &ow, &oh);
7289 EINA_LIST_FOREACH(sd->capture_before_items, l, pi)
7291 fi = _elm_genlist_fx_item_new(pi);
7292 if (fi) sd->fx_items = eina_list_append(sd->fx_items, fi);
7295 EINA_LIST_FOREACH(sd->capture_after_items, l, pi)
7297 fi = _elm_genlist_fx_item_find((Elm_Object_Item *)pi->it);
7299 if (fi) // pi exists in both before and after capture items
7301 fi->type = ELM_GEN_ITEM_FX_TYPE_SAME;
7302 fi->update = EINA_TRUE;
7308 // find the max distance between before and after capture items
7309 mv_dist = abs(fi->to.y - fi->from.y);
7310 if (max_mv_dist < mv_dist) max_mv_dist = mv_dist;
7312 else // pi only exists in after capture items
7314 fi = _elm_genlist_fx_item_new(pi);
7317 fi->type = ELM_GEN_ITEM_FX_TYPE_ADD;
7318 fi->update = EINA_TRUE;
7319 sd->fx_items = eina_list_append(sd->fx_items, fi);
7324 EINA_LIST_FOREACH(sd->fx_items, l, fi)
7326 // find deleted items
7327 if (!fi->update) // pi only exists in before capture items
7329 fi->type = ELM_GEN_ITEM_FX_TYPE_DEL;
7330 fi->update = EINA_TRUE;
7332 prev = (Elm_Gen_Item *)_elm_genlist_fx_item_prev_get((Elm_Object_Item *)fi->it);
7333 if ((prev) && (GL_IT(prev)->fi))
7335 fi->to.y = GL_IT(prev)->fi->to.y + GL_IT(prev)->fi->to.h;
7338 else if (fi->type == ELM_GEN_ITEM_FX_TYPE_ADD)
7340 prev = (Elm_Gen_Item *)_elm_genlist_fx_item_prev_get((Elm_Object_Item *)fi->it);
7341 if ((prev) && (prev->realized) && (GL_IT(prev)->fi))
7343 fi->from.y = GL_IT(prev)->fi->from.y + GL_IT(prev)->fi->from.h;
7347 if (sd->realized_top_item)
7350 if (fi->num <= sd->realized_top_item->item->num)
7351 fi->from.y -= max_mv_dist;
7353 fi->from.y += max_mv_dist;
7359 EINA_LIST_FOREACH(sd->fx_items, l, fi)
7361 if ((GL_IT(fi->it)->items) && (GL_IT(fi->it)->expanded_depth == 0))
7363 #if GENLIST_PINCH_ZOOM_SUPPORT
7364 if (sd->pinch_zoom_mode == ELM_GEN_PINCH_ZOOM_CONTRACT)
7366 fi->from.y = oy + GL_IT(fi->it)->pan_scrl_y - sd->pinch_pan_y;
7369 if (fi->type == ELM_GEN_ITEM_FX_TYPE_DEL)
7371 if (sd->realized_top_item)
7373 if (fi->num <= sd->realized_top_item->item->num)
7374 fi->to.y = oy - fi->from.h;
7385 static Elm_Gen_FX_Item *
7386 _fx_cover_item_get(const Elm_Gen_FX_Item *fi)
7388 Elm_Gen_FX_Item *cover_fi;
7390 if (!fi) return NULL;
7392 Elm_Genlist_Smart_Data *sd = GL_IT(fi->it)->wsd;
7393 Evas_Coord ox, oy, ow, oh;
7394 evas_object_geometry_get(sd->pan_obj, &ox, &oy, &ow, &oh);
7396 EINA_LIST_FOREACH(sd->fx_items, l, cover_fi)
7398 if (fi == cover_fi) continue;
7399 if (sd->fx_items_deleted)
7401 if ((cover_fi->from.y >= oy+oh || cover_fi->from.y > fi->to.y) && (cover_fi->from.y - cover_fi->to.y > 0))
7406 if ((cover_fi->to.y > fi->to.y) && (cover_fi->from.y - cover_fi->to.y < 0))
7414 _item_fx_op(Elm_Transit_Effect *data, Elm_Transit *transit __UNUSED__, double progress __UNUSED__)
7416 Elm_Gen_FX_Item *fi = data, *cover_it;
7417 Elm_Genlist_Smart_Data *sd = GL_IT(fi->it)->wsd;
7418 Evas_Coord fi_ox, fi_oy, cover_it_ox, cover_it_oy, ox, oy, ow, oh;
7420 evas_object_show(VIEW(fi->it));
7421 evas_object_geometry_get(sd->pan_obj, &ox, &oy, &ow, &oh);
7422 evas_object_geometry_get(fi->proxy, &fi_ox, &fi_oy, NULL, NULL);
7423 evas_object_move(fi->proxy, ox, fi_oy);
7424 evas_object_show(fi->proxy);
7425 #if GENLIST_PINCH_ZOOM_SUPPORT
7426 if ((sd->pinch_zoom_mode) && (IS_ROOT_PARENT_IT(fi->it))) evas_object_raise(fi->proxy);
7429 if ((!sd->expanded_next_item) || (sd->expanded_next_item == fi->it)) goto raise_event_block;
7430 if (fi->type == ELM_GEN_ITEM_FX_TYPE_SAME) goto raise_event_block;
7432 // find the closest item that cover current item when deleting
7433 cover_it = _fx_cover_item_get(fi);
7436 evas_object_geometry_get(cover_it->proxy, &cover_it_ox, &cover_it_oy, NULL, NULL);
7438 if (sd->fx_items_deleted)
7441 && (fi_oy + fi->to.h >= cover_it_oy + cover_it->to.h ) && (fi->from.y < cover_it->from.y))
7442 evas_object_hide(fi->proxy);
7444 else if (cover_it_oy && (fi_oy >= cover_it_oy))
7445 evas_object_hide(fi->proxy);
7447 evas_object_show(fi->proxy);
7451 evas_object_raise(sd->alpha_bg);
7458 _item_fx_done(Elm_Transit_Effect *data, Elm_Transit *transit __UNUSED__)
7460 Elm_Gen_FX_Item *fx_done_it = data;
7461 Elm_Genlist_Smart_Data *sd = GL_IT(fx_done_it->it)->wsd;
7463 if ((!fx_done_it) || (!fx_done_it->it) || (!sd)) return;
7465 evas_object_image_source_visible_set(fx_done_it->proxy, EINA_TRUE);
7466 evas_object_lower(fx_done_it->proxy);
7468 if ((sd->decorate_all_mode) && (fx_done_it->it->deco_all_view))
7469 evas_object_move(fx_done_it->it->deco_all_view, fx_done_it->to.x, fx_done_it->to.y);
7471 evas_object_move(VIEW(fx_done_it->it), fx_done_it->to.x, fx_done_it->to.y);
7472 GL_IT(fx_done_it->it)->has_proxy_it = EINA_FALSE;
7474 evas_object_clip_unset(fx_done_it->proxy);
7478 _item_fx_del_cb(void *data, Elm_Transit *transit __UNUSED__)
7480 Elm_Gen_FX_Item *fx_done_it = data;
7481 Elm_Gen_Item *it = NULL;
7482 Proxy_Item *pi = NULL;
7484 Elm_Genlist_Smart_Data *sd = GL_IT(fx_done_it->it)->wsd;
7486 if ((!fx_done_it) || (!fx_done_it->it) || (!sd)) return;
7488 sd->fx_items = eina_list_remove(sd->fx_items, fx_done_it);
7489 GL_IT(fx_done_it->it)->fi = NULL;
7492 if (!eina_list_count(sd->fx_items))
7494 EINA_LIST_FREE (sd->pending_unrealized_items, it)
7496 if (GL_IT(it)) GL_IT(it)->has_proxy_it = EINA_FALSE;
7497 #if GENLIST_PINCH_ZOOM_SUPPORT
7498 if ((sd->pinch_zoom_mode) && (IS_ROOT_PARENT_IT(it))) continue;
7500 _item_unrealize(it, EINA_FALSE);
7502 EINA_LIST_FREE (sd->pending_unrealized_decorate_all_items, it)
7504 if (GL_IT(it)) GL_IT(it)->has_proxy_it = EINA_FALSE;
7505 #if GENLIST_PINCH_ZOOM_SUPPORT
7506 if ((sd->pinch_zoom_mode) && (IS_ROOT_PARENT_IT(it))) continue;
7508 _decorate_all_item_unrealize(it);
7511 EINA_LIST_FREE (sd->pending_del_items, it)
7514 _elm_widget_item_free((Elm_Widget_Item *)it);
7517 EINA_LIST_FOREACH(sd->capture_before_items, l, pi)
7518 evas_object_hide(pi->proxy);
7519 EINA_LIST_FOREACH(sd->capture_after_items, l, pi)
7520 evas_object_hide(pi->proxy);
7522 sd->fx_playing = EINA_FALSE;
7523 sd->sorting = EINA_FALSE;
7524 sd->fx_first_captured = EINA_FALSE;
7525 evas_object_hide(sd->alpha_bg);
7527 sd->realized_top_item = NULL;
7528 sd->pan_changed = EINA_TRUE;
7529 evas_object_smart_changed(sd->pan_obj);
7534 _sorting_effect_animator_cb(void *data)
7536 Elm_Genlist_Smart_Data *sd = data;
7537 Elm_Gen_FX_Item *fi;
7540 Evas_Coord ox, oy, ow, oh;
7541 evas_object_geometry_get(sd->pan_obj, &ox, &oy, &ow, &oh);
7543 sd->fx_timer = NULL;
7544 EINA_LIST_FOREACH(sd->fx_items, l, fi)
7548 fi->changed = EINA_TRUE;
7549 evas_object_resize(fi->proxy, ow, fi->to.h);
7551 fi->trans = elm_transit_add();
7552 elm_transit_object_add(fi->trans, fi->proxy);
7553 evas_object_image_source_visible_set(fi->proxy, EINA_FALSE);
7554 elm_transit_tween_mode_set(fi->trans, ELM_TRANSIT_TWEEN_MODE_DECELERATE);
7556 elm_transit_effect_translation_add(fi->trans, fi->to.x, fi->to.y - 30 * elm_config_scale_get(), fi->to.x, fi->to.y);
7557 elm_transit_effect_color_add(fi->trans,0, 0, 0, 0, 255,255,255,255);
7559 elm_transit_effect_add(fi->trans, _item_fx_op, fi, _item_fx_done);
7560 elm_transit_del_cb_set(fi->trans, _item_fx_del_cb, fi);
7561 elm_transit_duration_set(fi->trans,0.3);
7562 elm_transit_objects_final_state_keep_set(fi->trans, EINA_FALSE);
7563 elm_transit_go(fi->trans);
7565 return ECORE_CALLBACK_RENEW;
7568 return ECORE_CALLBACK_CANCEL;
7572 _elm_genlist_fx_play(Evas_Object *obj)
7574 ELM_GENLIST_CHECK(obj);
7575 ELM_GENLIST_DATA_GET(obj, sd);
7577 Evas_Coord ox, oy, ow, oh, cvx, cvy, cvw, cvh;
7578 Elm_Gen_FX_Item *fi;
7581 if (!sd->fx_mode) return;
7583 EINA_LIST_FREE(sd->fx_items, fi)
7585 if (fi->trans) elm_transit_del(fi->trans);
7588 _item_cache_all_free(sd);
7590 _elm_genlist_fx_items_make(obj);
7591 if (!eina_list_count(sd->fx_items) || (sd->queue))
7593 _elm_genlist_fx_clear(obj);
7597 sd->fx_playing = EINA_TRUE;
7599 if (!sd->alpha_bg) sd->alpha_bg = _tray_alpha_bg_create(obj);
7600 evas_object_show(sd->alpha_bg);
7602 evas_object_geometry_get(sd->pan_obj, &ox, &oy, &ow, &oh);
7603 evas_output_viewport_get(evas_object_evas_get(obj), &cvx, &cvy, &cvw, &cvh);
7607 EINA_LIST_FOREACH(sd->fx_items, l, fi)
7608 evas_object_image_source_visible_set(fi->proxy, EINA_FALSE);
7609 if (sd->fx_timer) ecore_timer_del(sd->fx_timer);
7610 sd->fx_timer = ecore_timer_add(0.05, _sorting_effect_animator_cb, sd);
7614 EINA_LIST_FOREACH(sd->fx_items, l, fi)
7616 if (!fi->proxy) continue;
7618 if ((fi->from.y <= oy) || (fi->from.y + fi->from.h >= oy + oh))
7620 if ((sd->decorate_all_mode) && (fi->it->deco_all_view))
7621 evas_object_move(fi->it->deco_all_view, cvx, fi->to.y);
7623 evas_object_move(VIEW(fi->it), cvx, fi->to.y);
7625 else if ((fi->to.y <= oy) || (fi->to.y + fi->to.h >= oy + oh))
7627 if ((sd->decorate_all_mode) && (fi->it->deco_all_view))
7628 evas_object_move(fi->it->deco_all_view, cvx, fi->from.y);
7630 evas_object_move(VIEW(fi->it), cvx, fi->from.y);
7633 evas_object_resize(fi->proxy, ow, fi->to.h);
7634 evas_object_show(fi->proxy);
7636 fi->trans = elm_transit_add();
7637 elm_transit_object_add(fi->trans, fi->proxy);
7639 evas_object_image_source_visible_set(fi->proxy, EINA_FALSE);
7640 elm_transit_tween_mode_set(fi->trans, ELM_TRANSIT_TWEEN_MODE_DECELERATE);
7642 if (fi->type == ELM_GEN_ITEM_FX_TYPE_SAME)
7644 evas_object_raise(fi->proxy);
7645 elm_transit_effect_translation_add(fi->trans, fi->from.x, fi->from.y, fi->to.x, fi->to.y);
7648 else if (fi->type == ELM_GEN_ITEM_FX_TYPE_ADD)
7650 elm_transit_effect_translation_add(fi->trans, fi->from.x, fi->from.y, fi->to.x, fi->to.y);
7651 elm_transit_effect_color_add(fi->trans, 0, 0, 0, 0, 255, 255, 255, 255);
7653 else if (fi->type == ELM_GEN_ITEM_FX_TYPE_DEL)
7655 elm_transit_effect_translation_add(fi->trans, fi->from.x, fi->from.y, fi->to.x, fi->to.y);
7656 elm_transit_effect_color_add(fi->trans, 255, 255, 255, 255, 0, 0, 0, 0);
7658 elm_transit_effect_add(fi->trans, _item_fx_op, fi, _item_fx_done);
7659 elm_transit_del_cb_set(fi->trans, _item_fx_del_cb, fi);
7661 elm_transit_duration_set(fi->trans, FX_MOVE_TIME);
7662 elm_transit_objects_final_state_keep_set(fi->trans, EINA_FALSE);
7663 elm_transit_go(fi->trans);
7668 #if GENLIST_PINCH_ZOOM_SUPPORT
7670 elm_genlist_pinch_zoom_mode_set(Evas_Object *obj, Elm_Gen_Pinch_Zoom_Mode mode)
7672 ELM_GENLIST_DATA_GET(obj, sd);
7677 Eina_Bool done = EINA_FALSE;
7679 if ((sd->queue) || (!sd->rendered) || (sd->queue_idle_enterer)) return EINA_FALSE;
7681 EINA_INLIST_FOREACH(sd->blocks, itb)
7683 EINA_LIST_FOREACH(itb->items, l, it)
7686 if (IS_ROOT_PARENT_IT(it))
7694 if (!done) return EINA_FALSE;
7696 sd->pinch_zoom_mode = mode;
7698 _item_cache_all_free(sd);
7699 _elm_genlist_fx_capture(obj, 0);
7701 sd->pinch_pan_y = sd->pan_y;
7703 if (sd->pinch_zoom_mode == ELM_GEN_PINCH_ZOOM_CONTRACT)
7704 sd->s_iface->content_region_show(obj, 0,0,0,0);
7706 sd->pan_changed = EINA_TRUE;
7707 evas_object_smart_changed(sd->pan_obj);
7714 eina_list_sort_merge(Eina_List *a, Eina_List *b, Eina_Compare_Cb func)
7716 Eina_List *first, *last;
7718 if (func(a->data, b->data) > 0)
7720 _item_move_after(a->data, b->data);
7721 a = (last = first = a)->next;
7725 b = (last = first = b)->next;
7728 if (func(a->data, b->data) > 0)
7730 _item_move_after(a->data, b->data);
7731 a = (last = last->next = a)->next;
7734 b = (last = last->next = b)->next;
7736 last->next = a ? a : b;
7742 elm_genlist_sort(Evas_Object *obj, Eina_Compare_Cb func)
7744 ELM_GENLIST_CHECK(obj) NULL;
7745 ELM_GENLIST_DATA_GET(obj, sd);
7746 Eina_List *list = NULL;
7747 Elm_Gen_Item *it, *next;
7748 unsigned int limit = 0, i = 0, n = 0;
7749 Eina_List *tail = NULL, *unsort = NULL, *stack[32], *prev = NULL;
7751 sd->sorting = EINA_TRUE;
7753 it = (Elm_Gen_Item*)elm_genlist_first_item_get(obj);
7756 list = eina_list_append(list, it);
7757 next = (Elm_Gen_Item*)elm_genlist_item_next_get((Elm_Object_Item *)it);
7765 limit = eina_list_count(list);
7769 (limit > list->accounting->count))
7770 limit = list->accounting->count;
7772 if (limit != list->accounting->count)
7774 unsort = eina_list_nth_list(list, limit);
7776 unsort->prev->next = NULL;
7781 unsigned int idx, tmp;
7783 Eina_List *a = tail;
7784 Eina_List *b = tail->next;
7794 if (func(a->data, b->data) > 0)
7795 ((stack[i++] = a)->next = b)->next = 0;
7797 ((stack[i++] = b)->next = a)->next = 0;
7800 for (idx = n ^ tmp; idx &= idx - 1; i--)
7801 stack[i - 2] = eina_list_sort_merge(stack[i - 2], stack[i - 1], func);
7805 stack[i - 1] = eina_list_sort_merge(stack[i - 1], stack[i], func);
7809 for (; stack[0]; stack[0] = stack[0]->next)
7811 stack[0]->prev = prev;
7818 tail->next = unsort;
7819 unsort->prev = tail;
7822 list->accounting->last = tail;
7824 if (!sd->fx_mode) sd->sorting = EINA_FALSE;
7825 if (sd->decorate_all_mode) sd->sorting = EINA_FALSE;
7826 sd->s_iface->content_region_show(obj, 0,0,0,0);
7827 sd->pan_changed = EINA_TRUE;
7828 evas_object_smart_changed(sd->pan_obj);