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 ((it->item->nocache_once) || (it->item->nocache))
219 if (VIEW(it)) evas_object_del(VIEW(it));
220 if (it->spacer) evas_object_del(it->spacer);
223 ic = ELM_NEW(Item_Cache);
226 if (VIEW(it)) evas_object_del(VIEW(it));
227 if (it->spacer) evas_object_del(it->spacer);
232 ecore_timer_del(it->long_timer);
233 it->long_timer = NULL;
235 if (it->item->swipe_timer)
237 ecore_timer_del(it->item->swipe_timer);
238 it->item->swipe_timer = NULL;
241 ic->base_view = VIEW(it);
242 ic->spacer = it->spacer;
243 ic->item_style = eina_stringshare_add(it->itc->item_style);
244 if (it->item->type & ELM_GENLIST_ITEM_TREE) ic->tree = 1;
246 ic->selected = it->selected;
247 ic->disabled = elm_widget_item_disabled_get(it);
248 ic->expanded = it->item->expanded;
249 if (it->item->type & ELM_GENLIST_ITEM_TREE) ic->tree = 1;
251 edje_object_signal_emit(ic->base_view, "elm,state,unselected", "elm");
252 evas_object_hide(ic->base_view);
254 sd->item_cache = eina_inlist_prepend(sd->item_cache, EINA_INLIST_GET(ic));
255 sd->item_cache_count++;
261 it->realized = EINA_FALSE;
262 it->want_unrealize = EINA_FALSE;
264 //evas_event_thaw(evas_object_evas_get(obj));
265 //evas_event_thaw_eval(evas_object_evas_get(obj));
269 _item_cache_pop(Elm_Gen_Item *it)
271 Item_Cache *ic = NULL;
274 Elm_Genlist_Smart_Data *sd = GL_IT(it)->wsd;
276 if (it->item->nocache_once) {
277 it->item->nocache_once = EINA_FALSE;
280 if (it->item->nocache) return EINA_FALSE;
282 if (it->item->type & ELM_GENLIST_ITEM_TREE) tree = 1;
283 EINA_INLIST_FOREACH_SAFE(sd->item_cache, l, ic)
285 if ((ic->selected) || (ic->disabled) || (ic->expanded))
288 if ((ic->tree == tree) &&
289 (((!it->itc->item_style) && (!ic->item_style)) ||
290 (it->itc->item_style && ic->item_style &&
291 (!strcmp(it->itc->item_style, ic->item_style)))))
294 eina_inlist_remove(sd->item_cache, EINA_INLIST_GET(ic));
295 sd->item_cache_count--;
297 VIEW(it) = ic->base_view;
298 it->spacer = ic->spacer;
300 #if 1 // FIXME: different from upstream
301 // Because of item cache, set state as default after cache item
303 edje_object_signal_emit(VIEW(it),"elm,state,default", "elm");
305 edje_object_signal_callback_add
306 (VIEW(it), "elm,action,expand,toggle", "elm",
307 _expand_toggle_signal_cb, it);
308 edje_object_signal_callback_add
309 (VIEW(it), "elm,action,expand", "elm", _expand_signal_cb, it);
310 edje_object_signal_callback_add
311 (VIEW(it), "elm,action,contract", "elm", _contract_signal_cb, it);
312 _item_mouse_callbacks_add(it, VIEW(it));
314 eina_stringshare_del(ic->item_style);
324 _elm_genlist_pan_smart_pos_set(Evas_Object *obj,
330 ELM_GENLIST_PAN_DATA_GET(obj, psd);
332 if ((x == psd->wsd->pan_x) && (y == psd->wsd->pan_y)) return;
336 EINA_INLIST_FOREACH(psd->wsd->blocks, itb)
338 if ((itb->y + itb->h) > y)
343 EINA_LIST_FOREACH(itb->items, l2, it)
345 if ((itb->y + it->y) >= y)
347 psd->wsd->anchor_item = it;
348 psd->wsd->anchor_y = -(itb->y + it->y - y);
355 if (!psd->wsd->reorder_move_animator) evas_object_smart_changed(obj);
359 _elm_genlist_pan_smart_pos_get(const Evas_Object *obj,
363 ELM_GENLIST_PAN_DATA_GET(obj, psd);
365 if (x) *x = psd->wsd->pan_x;
366 if (y) *y = psd->wsd->pan_y;
370 _elm_genlist_pan_smart_pos_max_get(const Evas_Object *obj,
376 ELM_GENLIST_PAN_DATA_GET(obj, psd);
378 evas_object_geometry_get(obj, NULL, NULL, &ow, &oh);
379 ow = psd->wsd->minw - ow;
381 oh = psd->wsd->minh - oh;
386 #if GENLIST_PINCH_ZOOM_SUPPORT
387 if (psd->wsd->pinch_zoom_mode == ELM_GEN_PINCH_ZOOM_CONTRACT)
389 evas_object_geometry_get(obj, NULL, NULL, &ow, &oh);
390 if (psd->wsd->pinch_zoom_h > oh)
391 *y = psd->wsd->pinch_zoom_h - oh;
398 _elm_genlist_pan_smart_pos_min_get(const Evas_Object *obj __UNUSED__,
407 _elm_genlist_pan_smart_content_size_get(const Evas_Object *obj,
411 ELM_GENLIST_PAN_DATA_GET(obj, psd);
413 if (w) *w = psd->wsd->minw;
414 if (h) *h = psd->wsd->minh;
418 _elm_genlist_pan_smart_add(Evas_Object *obj)
420 /* here just to allocate our extended data */
421 EVAS_SMART_DATA_ALLOC(obj, Elm_Genlist_Pan_Smart_Data);
423 ELM_PAN_CLASS(_elm_genlist_pan_parent_sc)->base.add(obj);
427 _elm_genlist_pan_smart_del(Evas_Object *obj)
429 ELM_GENLIST_PAN_DATA_GET(obj, psd);
433 ecore_job_del(psd->resize_job);
434 psd->resize_job = NULL;
437 _elm_genlist_pan_parent_sc->base.del(obj);
441 _elm_genlist_pan_smart_move(Evas_Object *obj,
442 Evas_Coord x __UNUSED__,
443 Evas_Coord y __UNUSED__)
445 ELM_GENLIST_PAN_DATA_GET(obj, psd);
447 psd->wsd->pan_changed = EINA_TRUE;
448 evas_object_smart_changed(obj);
449 if (psd->wsd->calc_job) ecore_job_del(psd->wsd->calc_job);
450 psd->wsd->calc_job = NULL;
454 _elm_genlist_pan_smart_resize_job(void *data)
456 Elm_Genlist_Pan_Smart_Data *psd = data;
458 elm_layout_sizing_eval(ELM_WIDGET_DATA(psd->wsd)->obj);
459 psd->resize_job = NULL;
463 _elm_genlist_pan_smart_resize(Evas_Object *obj,
469 ELM_GENLIST_PAN_DATA_GET(obj, psd);
471 evas_object_geometry_get(obj, NULL, NULL, &ow, &oh);
472 if ((ow == w) && (oh == h)) return;
473 if ((psd->wsd->mode == ELM_LIST_COMPRESS) && (ow != w))
476 if (psd->resize_job) ecore_job_del(psd->resize_job);
478 ecore_job_add(_elm_genlist_pan_smart_resize_job, psd);
480 psd->wsd->pan_changed = EINA_TRUE;
481 evas_object_smart_changed(obj);
482 if (psd->wsd->calc_job) ecore_job_del(psd->wsd->calc_job);
483 // if the widht changed we may have to resize content if scrollbar went
484 // away or appesared to queue a job to deal with it. it should settle in
485 // the end to a steady-state
487 psd->wsd->calc_job = ecore_job_add(_calc_job, psd->wsd);
489 psd->wsd->calc_job = NULL;
493 _item_scroll(Elm_Genlist_Smart_Data *sd)
496 Elm_Gen_Item *it = NULL;
497 Evas_Coord ow, oh, dx = 0, dy = 0, dw = 0, dh = 0;
499 if (!sd->show_item) return;
501 evas_object_geometry_get(sd->pan_obj, NULL, NULL, &ow, &oh);
503 dx = it->x + it->item->block->x;
504 dy = it->y + it->item->block->y;
505 dw = it->item->block->w;
508 switch (sd->scroll_to_type)
510 case ELM_GENLIST_ITEM_SCROLLTO_TOP:
511 if (it->item->group_item) gith = it->item->group_item->item->h;
515 case ELM_GENLIST_ITEM_SCROLLTO_MIDDLE:
516 dy += ((it->item->h / 2) - (oh / 2));
519 case ELM_GENLIST_ITEM_SCROLLTO_IN:
521 if ((sd->expanded_item) &&
522 ((sd->show_item->y + sd->show_item->item->block->y
523 + sd->show_item->item->h) -
524 (sd->expanded_item->y + sd->expanded_item->item->block->y) > oh))
526 it = sd->expanded_item;
527 if (it->item->group_item) gith = it->item->group_item->item->h;
528 dx = it->x + it->item->block->x;
529 dy = it->y + it->item->block->y - gith;
530 dw = it->item->block->w;
534 if ((it->item->group_item) &&
535 (sd->pan_y > (it->y + it->item->block->y)))
536 gith = it->item->group_item->item->h;
543 sd->s_iface->region_bring_in(ELM_WIDGET_DATA(sd)->obj, dx, dy, dw, dh);
545 sd->s_iface->content_region_show
546 (ELM_WIDGET_DATA(sd)->obj, dx, dy, dw, dh);
548 it->item->show_me = EINA_FALSE;
549 sd->show_item = NULL;
550 sd->auto_scroll_enabled = EINA_FALSE;
551 sd->check_scroll = EINA_FALSE;
555 _item_unrealize(Elm_Gen_Item *it,
558 Evas_Object *content;
562 if (!it->realized) return;
563 if (GL_IT(it)->wsd->reorder_it == it) return;
565 #if GENLIST_FX_SUPPORT
566 if ((GL_IT(it)->has_proxy_it) && (!GL_IT(it)->wsd->genlist_clearing))
568 if (!eina_list_data_find(GL_IT(it)->wsd->pending_unrealized_items, it))
569 GL_IT(it)->wsd->pending_unrealized_items =
570 eina_list_append(GL_IT(it)->wsd->pending_unrealized_items, it);
574 #if GENLIST_ENTRY_SUPPORT
575 if (it->item->unrealize_disabled)
577 evas_object_hide(VIEW(it));
582 //evas_event_freeze(evas_object_evas_get(WIDGET(it)));
584 evas_object_smart_callback_call(WIDGET(it), SIG_UNREALIZED, it);
587 ecore_timer_del(it->long_timer);
588 it->long_timer = NULL;
590 if (it->item->swipe_timer)
592 ecore_timer_del(it->item->swipe_timer);
593 it->item->swipe_timer = NULL;
597 EINA_LIST_FOREACH(it->texts, l, part)
598 edje_object_part_text_set(VIEW(it), part, NULL);
600 elm_widget_stringlist_free(it->texts);
602 elm_widget_stringlist_free(it->contents);
604 elm_widget_stringlist_free(it->states);
606 EINA_LIST_FREE(it->content_objs, content)
608 // FIXME: If parent-child relationship was broken before 'ic'
609 // is deleted, freeze_pop will not be called. ex) elm_slider
610 // If layout is used instead of edje, this problme can be
612 if (0 != elm_widget_scroll_freeze_get(content))
613 elm_widget_scroll_freeze_pop(content);
614 evas_object_del(content);
618 elm_widget_stringlist_free(it->item->flip_contents);
619 it->item->flip_contents = NULL;
620 EINA_LIST_FREE(it->item->flip_content_objs, content)
621 evas_object_del(content);
624 if (_elm_config->access_mode == ELM_ACCESS_MODE_ON)
625 _elm_access_widget_item_unregister((Elm_Widget_Item *)it);
627 // unswallow VIEW(it) first then manipulate VIEW(it)
628 _decorate_item_unrealize(it);
629 _decorate_all_item_unrealize(it);
631 it->realized = EINA_FALSE;
632 _item_cache_push(it);
634 #if GENLIST_ENTRY_SUPPORT
635 it->item->unrealize_disabled = EINA_FALSE;
637 it->want_unrealize = EINA_FALSE;
639 //evas_event_thaw(evas_object_evas_get(WIDGET(it)));
640 //evas_event_thaw_eval(evas_object_evas_get(WIDGET(it)));
644 _item_block_unrealize(Item_Block *itb)
648 Eina_Bool dragging = EINA_FALSE;
650 if (!itb->realized) return;
651 //evas_event_freeze(evas_object_evas_get(ELM_WIDGET_DATA(itb->sd)->obj));
653 EINA_LIST_FOREACH(itb->items, l, it)
655 if (itb->must_recalc || !it->group)
659 dragging = EINA_TRUE;
660 it->want_unrealize = EINA_TRUE;
663 _item_unrealize(it, EINA_FALSE);
668 itb->realized = EINA_FALSE;
669 itb->want_unrealize = EINA_TRUE;
672 itb->want_unrealize = EINA_FALSE;
673 //evas_event_thaw(evas_object_evas_get(ELM_WIDGET_DATA(itb->sd)->obj));
674 //evas_event_thaw_eval(evas_object_evas_get(ELM_WIDGET_DATA(itb->sd)->obj));
678 _must_recalc_idler(void *data)
680 Elm_Genlist_Smart_Data *sd = data;
682 if (sd->calc_job) ecore_job_del(sd->calc_job);
683 sd->calc_job = ecore_job_add(_calc_job, sd);
684 sd->must_recalc_idler = NULL;
685 return ECORE_CALLBACK_CANCEL;
689 _calc_job(void *data)
692 Item_Block *itb, *chb = NULL;
693 Evas_Coord pan_w = 0, pan_h = 0;
694 Elm_Genlist_Smart_Data *sd = data;
695 Eina_Bool minw_change = EINA_FALSE;
696 Eina_Bool did_must_recalc = EINA_FALSE;
697 Evas_Coord minw = -1, minh = 0, y = 0, ow, dy = 0, vw = 0;
699 evas_object_geometry_get(sd->pan_obj, NULL, NULL, &ow, &sd->h);
700 if (sd->mode == ELM_LIST_COMPRESS)
701 sd->s_iface->content_viewport_size_get(ELM_WIDGET_DATA(sd)->obj, &vw, NULL);
703 if (sd->w != ow) sd->w = ow;
705 //evas_event_freeze(evas_object_evas_get(ELM_WIDGET_DATA(sd)->obj));
706 EINA_INLIST_FOREACH(sd->blocks, itb)
708 Eina_Bool show_me = EINA_FALSE;
711 show_me = itb->show_me;
712 itb->show_me = EINA_FALSE;
715 if (itb->realized) _item_block_unrealize(itb);
717 if ((itb->changed) || ((itb->must_recalc) && (!did_must_recalc)))
719 if (itb->must_recalc)
724 EINA_LIST_FOREACH(itb->items, l, it)
725 if (it->item->mincalcd) it->item->mincalcd = EINA_FALSE;
726 itb->changed = EINA_TRUE;
727 did_must_recalc = EINA_TRUE;
728 if (itb->realized) _item_block_unrealize(itb);
729 itb->must_recalc = EINA_FALSE;
731 show_me = _item_block_recalc(itb, in, EINA_FALSE);
737 if (minw == -1) minw = itb->minw;
738 else if ((!itb->must_recalc) && (minw < itb->minw))
741 minw_change = EINA_TRUE;
743 if ((sd->mode == ELM_LIST_COMPRESS) && (minw > vw))
746 minw_change = EINA_TRUE;
752 if ((show_me) && (sd->show_item) && (!sd->show_item->item->queued))
753 sd->check_scroll = EINA_TRUE;
757 EINA_INLIST_FOREACH(sd->blocks, itb)
763 if ((chb) && (EINA_INLIST_GET(chb)->next))
765 EINA_INLIST_FOREACH(EINA_INLIST_GET(chb)->next, itb)
767 if (itb->realized) _item_block_unrealize(itb);
771 if (minw < sd->w) minw = sd->w;
772 if ((minw != sd->minw) || (minh != sd->minh))
776 evas_object_smart_callback_call(sd->pan_obj, "changed", NULL);
777 elm_layout_sizing_eval(ELM_WIDGET_DATA(sd)->obj);
784 if ((sd->anchor_item) && (sd->anchor_item->item->block)
785 && (!sd->auto_scroll_enabled))
790 it = sd->anchor_item;
792 sd->s_iface->content_pos_set
793 (ELM_WIDGET_DATA(sd)->obj, sd->pan_x, it->item->block->y
794 + it->y + it_y, EINA_TRUE);
795 sd->anchor_item = it;
801 if (!sd->must_recalc_idler)
802 sd->must_recalc_idler = ecore_idler_add(_must_recalc_idler, sd);
804 if (sd->check_scroll)
806 _elm_genlist_pan_smart_content_size_get(sd->pan_obj, &pan_w, &pan_h);
807 if (EINA_INLIST_GET(sd->show_item) == sd->items->last)
808 sd->scroll_to_type = ELM_GENLIST_ITEM_SCROLLTO_IN;
810 switch (sd->scroll_to_type)
812 case ELM_GENLIST_ITEM_SCROLLTO_TOP:
816 case ELM_GENLIST_ITEM_SCROLLTO_MIDDLE:
820 case ELM_GENLIST_ITEM_SCROLLTO_IN:
825 if ((sd->show_item) && (sd->show_item->item->block))
827 if ((pan_w > (sd->show_item->x + sd->show_item->item->block->x))
828 && (pan_h > (sd->show_item->y + sd->show_item->item->block->y
837 evas_object_smart_changed(sd->pan_obj);
838 //evas_event_thaw(evas_object_evas_get(ELM_WIDGET_DATA(sd)->obj));
839 //evas_event_thaw_eval(evas_object_evas_get(ELM_WIDGET_DATA(sd)->obj));
843 _elm_genlist_smart_sizing_eval(Evas_Object *obj)
845 Evas_Coord minw = -1, minh = -1, maxw = -1, maxh = -1;
846 Evas_Coord vmw = 0, vmh = 0;
848 ELM_GENLIST_DATA_GET(obj, sd);
850 /* parent class' early call */
851 if (!sd->s_iface) return;
853 if (sd->on_sub_del) return;;
855 evas_object_size_hint_min_get(obj, &minw, NULL);
856 evas_object_size_hint_max_get(obj, &maxw, &maxh);
858 edje_object_size_min_calc(ELM_WIDGET_DATA(sd)->resize_obj, &vmw, &vmh);
860 if (sd->mode == ELM_LIST_COMPRESS)
864 sd->s_iface->content_viewport_size_get(obj, &vw, &vh);
865 if ((vw != 0) && (vw != sd->prev_viewport_w))
869 sd->prev_viewport_w = vw;
871 EINA_INLIST_FOREACH(sd->blocks, itb)
873 itb->must_recalc = EINA_TRUE;
875 if (sd->calc_job) ecore_job_del(sd->calc_job);
876 sd->calc_job = ecore_job_add(_calc_job, sd);
881 else if (sd->mode == ELM_LIST_LIMIT)
884 minw = vmw + sd->realminw;
892 evas_object_size_hint_min_set(obj, minw, minh);
893 evas_object_size_hint_max_set(obj, maxw, maxh);
897 _item_position(Elm_Gen_Item *it,
905 //evas_event_freeze(evas_object_evas_get(ELM_WIDGET_DATA(GL_IT(it)->wsd)->obj));
906 evas_object_resize(view, it->item->w, it->item->h);
907 evas_object_move(view, it_x, it_y);
908 evas_object_show(view);
909 //evas_event_thaw(evas_object_evas_get(ELM_WIDGET_DATA(GL_IT(it)->wsd)->obj));
910 //evas_event_thaw_eval(evas_object_evas_get(ELM_WIDGET_DATA(GL_IT(it)->wsd)->obj));
914 _item_subitems_clear(Elm_Gen_Item *it)
917 Elm_Object_Item *it2;
919 EINA_LIST_FOREACH_SAFE(it->item->items, l, ll, it2)
920 elm_widget_item_del(it2);
924 _item_auto_scroll(Elm_Genlist_Smart_Data *sd)
926 Elm_Gen_Item *tmp_item = NULL;
928 #if GENLIST_FX_SUPPORT
929 if (sd->fx_first_captured) return;
931 if ((sd->expanded_item) && (sd->auto_scroll_enabled))
933 tmp_item = eina_list_data_get
934 (eina_list_last(sd->expanded_item->item->items));
935 if (!tmp_item) return;
936 sd->show_item = tmp_item;
937 sd->bring_in = EINA_TRUE;
938 sd->scroll_to_type = ELM_GENLIST_ITEM_SCROLLTO_IN;
939 if ((sd->show_item->item->queued) || (!sd->show_item->item->mincalcd))
941 sd->show_item->item->show_me = EINA_TRUE;
942 sd->auto_scroll_enabled = EINA_FALSE;
950 _elm_genlist_item_odd_even_update(Elm_Gen_Item *it)
952 if (!it->item->nostacking)
954 if ((it->item->order_num_in & 0x1) ^ it->item->stacking_even)
956 if (it->deco_all_view) evas_object_lower(it->deco_all_view);
957 else evas_object_lower(VIEW(it));
961 if (it->deco_all_view) evas_object_raise(it->deco_all_view);
962 else evas_object_raise(VIEW(it));
966 if (it->item->order_num_in & 0x1)
968 edje_object_signal_emit(VIEW(it), "elm,state,odd", "elm");
969 if (it->deco_all_view)
970 edje_object_signal_emit(it->deco_all_view, "elm,state,odd", "elm");
974 edje_object_signal_emit(VIEW(it), "elm,state,even", "elm");
975 if (it->deco_all_view)
976 edje_object_signal_emit(it->deco_all_view, "elm,state,even", "elm");
981 _item_order_update(const Eina_Inlist *l,
984 Elm_Gen_Item *it, *it2;
986 for (it = ELM_GEN_ITEM_FROM_INLIST(l); l; l = l->next,
987 it = ELM_GEN_ITEM_FROM_INLIST(l))
989 it->item->order_num_in = start++;
990 _elm_genlist_item_odd_even_update(it);
991 it2 = ELM_GEN_ITEM_FROM_INLIST(l->next);
992 if (it2 && (it->item->order_num_in != it2->item->order_num_in))
998 _elm_genlist_item_state_update(Elm_Gen_Item *it,
1003 if (it->selected != itc->selected)
1007 if (it->deco_all_view)
1008 edje_object_signal_emit
1009 (it->deco_all_view, "elm,state,selected", "elm,nosound");
1010 edje_object_signal_emit
1011 (VIEW(it), "elm,state,selected", "elm,nosound");
1012 evas_object_smart_callback_call(WIDGET(it), SIG_HIGHLIGHTED, it);
1015 if (elm_widget_item_disabled_get(it) != itc->disabled)
1017 if (elm_widget_item_disabled_get(it))
1018 edje_object_signal_emit(VIEW(it), "elm,state,disabled", "elm");
1019 if (it->deco_all_view)
1020 edje_object_signal_emit
1021 (it->deco_all_view, "elm,state,disabled", "elm");
1023 if (it->item->expanded != itc->expanded)
1025 if (it->item->expanded)
1026 edje_object_signal_emit(VIEW(it), "elm,state,expanded", "elm");
1027 if (it->deco_all_view)
1028 edje_object_signal_emit
1029 (it->deco_all_view, "elm,state,expanded", "elm");
1036 if (it->deco_all_view)
1037 edje_object_signal_emit
1038 (it->deco_all_view, "elm,state,selected", "elm,nosound");
1039 edje_object_signal_emit
1040 (VIEW(it), "elm,state,selected", "elm,nosound");
1041 evas_object_smart_callback_call(WIDGET(it), SIG_HIGHLIGHTED, it);
1043 if (elm_widget_item_disabled_get(it))
1045 edje_object_signal_emit(VIEW(it), "elm,state,disabled", "elm");
1046 if (it->deco_all_view)
1047 edje_object_signal_emit
1048 (it->deco_all_view, "elm,state,disabled", "elm");
1050 if (it->item->expanded)
1052 edje_object_signal_emit(VIEW(it), "elm,state,expanded", "elm");
1053 if (it->deco_all_view)
1054 edje_object_signal_emit
1055 (it->deco_all_view, "elm,state,expanded", "elm");
1061 _elm_genlist_item_index_update(Elm_Gen_Item *it)
1063 if (it->position_update || it->item->block->position_update)
1065 evas_object_smart_callback_call(WIDGET(it), SIG_INDEX_UPDATE, it);
1066 it->position_update = EINA_FALSE;
1071 _item_text_realize(Elm_Gen_Item *it,
1072 Evas_Object *target,
1076 if (it->itc->func.text_get)
1082 *source = elm_widget_stringlist_get
1083 (edje_object_data_get(target, "texts"));
1084 EINA_LIST_FOREACH(*source, l, key)
1086 if (parts && fnmatch(parts, key, FNM_PERIOD))
1089 char *s = it->itc->func.text_get
1090 ((void *)it->base.data, WIDGET(it), key);
1094 edje_object_part_text_escaped_set(target, key, s);
1099 edje_object_part_text_set(target, key, "");
1106 // FIXME: difference from upstream
1108 _content_focused(void *data, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
1110 Elm_Gen_Item *it = data;
1111 if (it) it->defer_unrealize = EINA_TRUE;
1115 _content_unfocused(void *data, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
1117 Elm_Gen_Item *it = data;
1118 if (it) it->defer_unrealize = EINA_FALSE;
1123 _item_mode_content_realize(Elm_Gen_Item *it,
1124 Evas_Object *target,
1127 Eina_List **contents_list)
1129 Eina_List *res = *contents_list;
1131 if (it->itc->func.content_get)
1137 EINA_LIST_FOREACH(*source, l, key)
1139 if (parts && fnmatch(parts, key, FNM_PERIOD))
1142 ic = it->itc->func.content_get
1143 ((void *)it->base.data, WIDGET(it), key);
1147 res = eina_list_append(res, ic);
1148 edje_object_part_swallow(target, key, ic);
1149 evas_object_show(ic);
1150 #if GENLIST_ENTRY_SUPPORT
1153 // For entry or editfield
1154 // 1. Add resize callback for multiline entry.
1155 // 2. Do not unrealize it for focus issue
1156 // ps. Only for entry because of performnace
1157 if (!strcmp("elm_layout", evas_object_type_get(ic)))
1159 // If editfield style, it can have entry.
1161 edje_object_file_get(elm_layout_edje_get(ic), NULL, &group);
1162 if (group && !strncmp("elm/layout/editfield/", group, 20))
1163 it->item->unrealize_disabled = EINA_TRUE;
1165 else if (!strcmp("elm_entry", evas_object_type_get(ic)))
1166 it->item->unrealize_disabled = EINA_TRUE;
1170 // FIXME: difference from upstream
1173 // FIXME: if entry calcuates its cursor position correctly and conformant works,
1174 // genlist does not need to handle this focus thing.
1175 evas_object_smart_callback_add(ic, "focused", _content_focused, it);
1176 evas_object_smart_callback_add(ic, "unfocused", _content_unfocused, it);
1179 if (elm_widget_item_disabled_get(it))
1180 elm_widget_disabled_set(ic, EINA_TRUE);
1189 _item_state_realize(Elm_Gen_Item *it,
1190 Evas_Object *target,
1194 if (it->itc->func.state_get)
1201 *source = elm_widget_stringlist_get
1202 (edje_object_data_get(target, "states"));
1203 EINA_LIST_FOREACH(*source, l, key)
1205 if (parts && fnmatch(parts, key, FNM_PERIOD))
1208 Eina_Bool on = it->itc->func.state_get
1209 ((void *)it->base.data, WIDGET(it), key);
1213 snprintf(buf, sizeof(buf), "elm,state,%s,active", key);
1214 edje_object_signal_emit(target, buf, "elm");
1218 snprintf(buf, sizeof(buf), "elm,state,%s,passive", key);
1219 edje_object_signal_emit(target, buf, "elm");
1226 _decorate_item_unrealize(Elm_Gen_Item *it)
1228 Elm_Genlist_Smart_Data *sd = GL_IT(it)->wsd;
1229 Evas_Object *content;
1231 if (!it->item->deco_it_view) return;
1233 //evas_event_freeze(evas_object_evas_get(obj));
1234 elm_widget_stringlist_free(it->item->deco_it_texts);
1235 it->item->deco_it_texts = NULL;
1236 elm_widget_stringlist_free(it->item->deco_it_contents);
1237 it->item->deco_it_contents = NULL;
1238 elm_widget_stringlist_free(it->item->deco_it_states);
1240 EINA_LIST_FREE (it->item->deco_it_content_objs, content)
1241 evas_object_del(content);
1243 edje_object_part_unswallow(it->item->deco_it_view, VIEW(it));
1244 evas_object_smart_member_add(VIEW(it), sd->pan_obj);
1245 evas_object_del(it->item->deco_it_view);
1246 it->item->deco_it_view = NULL;
1248 if (sd->mode_item == it) sd->mode_item = NULL;
1249 //evas_event_thaw(evas_object_evas_get(obj));
1250 //evas_event_thaw_eval(evas_object_evas_get(obj));
1255 _decorate_all_item_position(Elm_Gen_Item *it,
1259 evas_object_resize(it->deco_all_view, it->item->w, it->item->h);
1260 evas_object_move(it->deco_all_view, itx, ity);
1264 _decorate_all_item_realize(Elm_Gen_Item *it,
1265 Eina_Bool effect_on)
1268 const char *stacking;
1269 const char *stacking_even;
1271 if ((!it) || (it->item->decorate_all_item_realized)) return;
1273 if (it->item->deco_it_view) _decorate_item_unrealize(it);
1275 it->deco_all_view = edje_object_add(evas_object_evas_get(WIDGET(it)));
1276 edje_object_scale_set(it->deco_all_view, elm_widget_scale_get(WIDGET(it)) *
1277 elm_config_scale_get());
1278 evas_object_smart_member_add(it->deco_all_view, GL_IT(it)->wsd->pan_obj);
1279 elm_widget_sub_object_add(WIDGET(it), it->deco_all_view);
1281 if (it->item->type & ELM_GENLIST_ITEM_TREE)
1282 strncpy(buf, "tree", sizeof(buf));
1283 else strncpy(buf, "item", sizeof(buf));
1284 if (GL_IT(it)->wsd->mode == ELM_LIST_COMPRESS)
1285 strncat(buf, "_compress", sizeof(buf) - strlen(buf));
1287 strncat(buf, "/", sizeof(buf) - strlen(buf));
1288 strncat(buf, it->itc->decorate_all_item_style, sizeof(buf) - strlen(buf));
1290 elm_widget_theme_object_set(WIDGET(it), it->deco_all_view, "genlist", buf,
1291 elm_widget_style_get(WIDGET(it)));
1293 stacking_even = edje_object_data_get(VIEW(it), "stacking_even");
1294 if (!stacking_even) stacking_even = "above";
1295 it->item->stacking_even = !!strcmp("above", stacking_even);
1297 stacking = edje_object_data_get(VIEW(it), "stacking");
1298 if (!stacking) stacking = "yes";
1299 it->item->nostacking = !!strcmp("yes", stacking);
1301 edje_object_mirrored_set
1302 (it->deco_all_view, elm_widget_mirrored_get(WIDGET(it)));
1304 _elm_genlist_item_odd_even_update(it);
1305 _elm_genlist_item_state_update(it, NULL);
1307 #if 1 // FIXME: difference from upstream
1308 if (GL_IT(it)->wsd->reorder_mode)
1310 edje_object_signal_emit
1311 (VIEW(it), "elm,state,reorder,mode_unset", "elm");
1312 edje_object_signal_emit
1313 (it->deco_all_view, "elm,state,reorder,mode_set", "elm");
1318 edje_object_signal_emit
1319 (it->deco_all_view, "elm,state,decorate,enabled,effect", "elm");
1320 edje_object_signal_emit
1321 (VIEW(it), "elm,state,decorate,enabled,effect", "elm");
1325 edje_object_signal_emit
1326 (it->deco_all_view, "elm,state,decorate,enabled", "elm");
1327 edje_object_signal_emit
1328 (VIEW(it), "elm,state,decorate,enabled", "elm");
1330 _item_mouse_callbacks_del(it, VIEW(it));
1331 _item_mouse_callbacks_add(it, it->deco_all_view);
1333 _item_text_realize(it, it->deco_all_view, &it->item->deco_all_texts, NULL);
1335 edje_object_signal_emit
1336 (it->deco_all_view, "elm,state,flip,enabled", "elm");
1337 if (!it->item->deco_all_contents)
1338 it->item->deco_all_contents = elm_widget_stringlist_get
1339 (edje_object_data_get(it->deco_all_view, "contents"));
1340 it->item->deco_all_content_objs =
1341 _item_mode_content_realize(it, it->deco_all_view,
1342 &it->item->deco_all_contents, NULL,
1343 &it->item->deco_all_content_objs);
1345 (it, it->deco_all_view, &it->item->deco_all_states, NULL);
1346 edje_object_part_swallow
1347 (it->deco_all_view, "elm.swallow.decorate.content", VIEW(it));
1349 _decorate_all_item_position(it, it->item->scrl_x, it->item->scrl_y);
1350 evas_object_show(it->deco_all_view);
1354 edje_object_signal_emit(it->deco_all_view, "elm,state,selected", "elm");
1355 evas_object_smart_callback_call(WIDGET(it), SIG_HIGHLIGHTED, it);
1358 it->item->decorate_all_item_realized = EINA_TRUE;
1359 it->want_unrealize = EINA_FALSE;
1363 _expand_toggle_signal_cb(void *data,
1364 Evas_Object *obj __UNUSED__,
1365 const char *emission __UNUSED__,
1366 const char *source __UNUSED__)
1368 Elm_Gen_Item *it = data;
1370 if (it->item->expanded)
1371 evas_object_smart_callback_call(WIDGET(it), SIG_CONTRACT_REQUEST, it);
1373 evas_object_smart_callback_call(WIDGET(it), SIG_EXPAND_REQUEST, it);
1377 _expand_signal_cb(void *data,
1378 Evas_Object *obj __UNUSED__,
1379 const char *emission __UNUSED__,
1380 const char *source __UNUSED__)
1382 Elm_Gen_Item *it = data;
1384 if (!it->item->expanded)
1385 evas_object_smart_callback_call(WIDGET(it), SIG_EXPAND_REQUEST, it);
1389 _contract_signal_cb(void *data,
1390 Evas_Object *obj __UNUSED__,
1391 const char *emission __UNUSED__,
1392 const char *source __UNUSED__)
1394 Elm_Gen_Item *it = data;
1396 if (it->item->expanded)
1397 evas_object_smart_callback_call(WIDGET(it), SIG_CONTRACT_REQUEST, it);
1400 #if GENLIST_ENTRY_SUPPORT
1402 _changed_size_hints(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
1404 Elm_Gen_Item *it = data;
1406 if (it->want_unrealize) return;
1407 it->item->mincalcd = EINA_FALSE;
1408 it->item->block->changeme = EINA_TRUE;
1409 GL_IT(it)->wsd->size_changed = EINA_TRUE;
1410 evas_object_smart_changed(GL_IT(it)->wsd->pan_obj);
1415 _item_content_realize(Elm_Gen_Item *it,
1416 Evas_Object *target,
1420 Eina_List *res = it->content_objs;
1422 if (it->itc->func.content_get)
1426 Evas_Object *ic = NULL;
1429 *source = elm_widget_stringlist_get
1430 (edje_object_data_get(target, "contents"));
1432 EINA_LIST_FOREACH(*source, l, key)
1434 if (parts && fnmatch(parts, key, FNM_PERIOD))
1437 if (it->itc->func.content_get)
1438 ic = it->itc->func.content_get
1439 ((void *)it->base.data, WIDGET(it), key);
1442 res = eina_list_append(res, ic);
1443 edje_object_part_swallow(target, key, ic);
1444 evas_object_show(ic);
1446 #if GENLIST_ENTRY_SUPPORT
1447 // For entry or editfield
1448 // 1. Add resize callback for multiline entry.
1449 // 2. Do not unrealize it for focus issue
1450 // ps. Only for entry because of performnace
1451 if (!strcmp("elm_layout", evas_object_type_get(ic)))
1453 // If editfield style, it can have entry.
1455 edje_object_file_get(elm_layout_edje_get(ic), NULL, &group);
1456 if (group && !strncmp("elm/layout/editfield/", group, 20))
1458 evas_object_event_callback_add
1459 (ic, EVAS_CALLBACK_CHANGED_SIZE_HINTS,
1460 _changed_size_hints, it);
1461 it->item->unrealize_disabled = EINA_TRUE;
1465 else if (!strcmp("elm_entry", evas_object_type_get(ic)))
1467 evas_object_event_callback_add
1468 (ic, EVAS_CALLBACK_CHANGED_SIZE_HINTS,
1469 _changed_size_hints, it);
1470 it->item->unrealize_disabled = EINA_TRUE;
1473 #if 0 // FIXME: difference from upstream
1476 // FIXME: if entry calcuates its cursor position correctly and conformant works,
1477 // genlist does not need to handle this focus thing.
1478 evas_object_smart_callback_add(ic, "focused", _content_focused, it);
1479 evas_object_smart_callback_add(ic, "unfocused", _content_unfocused, it);
1482 if (elm_widget_item_disabled_get(it))
1483 elm_widget_disabled_set(ic, EINA_TRUE);
1492 _access_info_cb(void *data, Evas_Object *obj __UNUSED__)
1497 Elm_Gen_Item *it = (Elm_Gen_Item *)data;
1498 ELM_GENLIST_ITEM_CHECK_OR_RETURN(it, NULL);
1500 buf = eina_strbuf_new();
1502 if (it->itc->func.text_get)
1507 if (!(it->texts)) it->texts =
1508 elm_widget_stringlist_get(edje_object_data_get(VIEW(it), "texts"));
1510 EINA_LIST_FOREACH(it->texts, l, key)
1512 char *s = it->itc->func.text_get
1513 ((void *)it->base.data, WIDGET(it), key);
1515 s = _elm_util_mkup_to_text(s);
1519 if (eina_strbuf_length_get(buf) > 0) eina_strbuf_append(buf, ", ");
1520 eina_strbuf_append(buf, s);
1526 ret = eina_strbuf_string_steal(buf);
1527 eina_strbuf_free(buf);
1532 _access_state_cb(void *data, Evas_Object *obj __UNUSED__)
1534 Elm_Gen_Item *it = (Elm_Gen_Item *)data;
1535 ELM_GENLIST_ITEM_CHECK_OR_RETURN(it, NULL);
1537 if (it->base.disabled)
1538 return strdup(E_("State: Disabled"));
1544 _access_on_highlight_cb(void *data)
1546 Evas_Coord x, y, w, h;
1547 Evas_Coord sx, sy, sw, sh;
1548 Elm_Gen_Item *it = (Elm_Gen_Item *)data;
1549 ELM_GENLIST_ITEM_CHECK_OR_RETURN(it);
1551 ELM_GENLIST_DATA_GET(it->base.widget, sd);
1553 evas_object_geometry_get(it->base.view, &x, &y, &w, &h);
1554 // XXX There would be a reason.
1555 if ((w == 0) && (h == 0)) return;
1557 evas_object_geometry_get(ELM_WIDGET_DATA(sd)->obj, &sx, &sy, &sw, &sh);
1558 if ((x < sx) || (y < sy) || ((x + w) > (sx + sw)) || ((y + h) > (sy + sh)))
1559 elm_genlist_item_bring_in((Elm_Object_Item *)it,
1560 ELM_GENLIST_ITEM_SCROLLTO_IN);
1564 _access_widget_item_register(Elm_Gen_Item *it)
1566 Elm_Access_Info *ai;
1568 _elm_access_widget_item_register((Elm_Widget_Item *)it);
1570 ai = _elm_access_object_get(it->base.access_obj);
1572 _elm_access_callback_set(ai, ELM_ACCESS_INFO, _access_info_cb, it);
1573 _elm_access_callback_set(ai, ELM_ACCESS_STATE, _access_state_cb, it);
1574 _elm_access_on_highlight_hook_set(ai, _access_on_highlight_cb, it);
1575 _elm_access_activate_callback_set(ai, _access_activate_cb, it);
1579 _item_realize(Elm_Gen_Item *it,
1583 Item_Cache *itc = NULL;
1584 const char *treesize;
1590 if (it->item->order_num_in != in)
1592 _item_order_update(EINA_INLIST_GET(it), in);
1593 _elm_genlist_item_state_update(it, NULL);
1594 _elm_genlist_item_index_update(it);
1598 it->item->order_num_in = in;
1600 if (it->item->nocache_once | it->item->nocache ||
1601 it->item->type == ELM_GENLIST_ITEM_TREE || it->parent ||
1602 !_item_cache_pop(it))
1604 const char *stacking_even;
1605 const char *stacking;
1607 it->item->nocache_once = EINA_FALSE;
1609 VIEW(it) = edje_object_add(evas_object_evas_get(WIDGET(it)));
1610 edje_object_scale_set(VIEW(it),
1611 elm_widget_scale_get(WIDGET(it)) *
1612 elm_config_scale_get());
1613 evas_object_smart_member_add(VIEW(it), GL_IT(it)->wsd->pan_obj);
1614 elm_widget_sub_object_add(WIDGET(it), VIEW(it));
1616 if (it->item->type & ELM_GENLIST_ITEM_TREE)
1617 snprintf(buf, sizeof(buf), "tree%s/%s",
1618 GL_IT(it)->wsd->mode == ELM_LIST_COMPRESS ? "_compress" :
1619 "", it->itc->item_style ? : "default");
1621 snprintf(buf, sizeof(buf), "item%s/%s",
1622 GL_IT(it)->wsd->mode == ELM_LIST_COMPRESS ? "_compress" :
1623 "", it->itc->item_style ? : "default");
1625 elm_widget_theme_object_set
1626 (WIDGET(it), VIEW(it), "genlist", buf,
1627 elm_widget_style_get(WIDGET(it)));
1629 if (it->item->expanded_depth > 0)
1630 edje_object_signal_emit(VIEW(it), "bg_color_change", "elm");
1632 stacking_even = edje_object_data_get(VIEW(it), "stacking_even");
1633 if (!stacking_even) stacking_even = "above";
1634 it->item->stacking_even = !!strcmp("above", stacking_even);
1636 stacking = edje_object_data_get(VIEW(it), "stacking");
1637 if (!stacking) stacking = "yes";
1638 it->item->nostacking = !!strcmp("yes", stacking);
1640 edje_object_mirrored_set
1641 (VIEW(it), elm_widget_mirrored_get(WIDGET(it)));
1643 edje_object_signal_callback_add
1644 (VIEW(it), "elm,action,expand,toggle", "elm",
1645 _expand_toggle_signal_cb, it);
1646 edje_object_signal_callback_add
1647 (VIEW(it), "elm,action,expand", "elm", _expand_signal_cb, it);
1648 edje_object_signal_callback_add
1649 (VIEW(it), "elm,action,contract", "elm", _contract_signal_cb, it);
1650 _item_mouse_callbacks_add(it, VIEW(it));
1654 if (_elm_config->access_mode) _access_widget_item_register(it);
1656 _item_order_update(EINA_INLIST_GET(it), in);
1657 #if 1 // FIXME: difference from upstream
1658 if (!(it->deco_all_view) && (it->item->type != ELM_GENLIST_ITEM_GROUP))
1660 if (GL_IT(it)->wsd->reorder_mode)
1661 edje_object_signal_emit
1662 (VIEW(it), "elm,state,reorder,mode_set", "elm");
1664 edje_object_signal_emit
1665 (VIEW(it), "elm,state,reorder,mode_unset", "elm");
1668 treesize = edje_object_data_get(VIEW(it), "treesize");
1669 if (treesize) tsize = atoi(treesize);
1670 if (!it->spacer && treesize)
1673 evas_object_rectangle_add(evas_object_evas_get(WIDGET(it)));
1674 evas_object_color_set(it->spacer, 0, 0, 0, 0);
1678 evas_object_size_hint_min_set
1679 (it->spacer, (it->item->expanded_depth * tsize) *
1680 elm_config_scale_get(), 1);
1681 edje_object_part_swallow(VIEW(it), "elm.swallow.pad", it->spacer);
1685 if ((GL_IT(it)->wsd->decorate_all_mode) && (!it->deco_all_view) &&
1686 (it->item->type != ELM_GENLIST_ITEM_GROUP) &&
1687 (it->itc->decorate_all_item_style))
1688 _decorate_all_item_realize(it, EINA_FALSE);
1690 _elm_genlist_item_state_update(it, itc);
1691 _elm_genlist_item_index_update(it);
1694 /* homogenous genlist shortcut */
1695 if ((calc) && (GL_IT(it)->wsd->homogeneous) && (!it->item->mincalcd) &&
1696 ((it->group && GL_IT(it)->wsd->group_item_width) ||
1697 (!it->group && GL_IT(it)->wsd->item_width)))
1701 it->item->w = it->item->minw = GL_IT(it)->wsd->group_item_width;
1702 it->item->h = it->item->minh = GL_IT(it)->wsd->group_item_height;
1706 it->item->w = it->item->minw = GL_IT(it)->wsd->item_width;
1707 it->item->h = it->item->minh = GL_IT(it)->wsd->item_height;
1709 it->item->mincalcd = EINA_TRUE;
1713 if (eina_list_count(it->content_objs) != 0)
1714 ERR_ABORT("If you see this error, please notify us and we"
1717 _item_text_realize(it, VIEW(it), &it->texts, NULL);
1719 _item_content_realize(it, VIEW(it), &it->contents, NULL);
1720 _item_state_realize(it, VIEW(it), &it->states, NULL);
1723 edje_object_signal_emit
1724 (VIEW(it), "elm,state,flip,enabled", "elm");
1725 // This is needed before contents are swallowed
1726 edje_object_message_signal_process(VIEW(it));
1728 if (!(it->item->flip_contents))
1729 it->item->flip_contents = elm_widget_stringlist_get
1730 (edje_object_data_get(VIEW(it), "flips"));
1731 it->item->flip_content_objs = _item_mode_content_realize
1732 (it, VIEW(it), &it->item->flip_contents, NULL,
1733 &it->item->flip_content_objs);
1736 /* access: unregister item which have no text and content */
1737 if (_elm_config->access_mode && !it->texts && !it->contents)
1738 _elm_access_widget_item_unregister((Elm_Widget_Item *)it);
1741 // FIXME: difference from upstream
1742 if (!it->item->mincalcd || ((GL_IT(it)->wsd->mode == ELM_LIST_COMPRESS) && (it->item->w != it->item->minw)))
1744 if (!it->item->mincalcd)
1747 Evas_Coord mw = -1, mh = -1;
1749 if (it->select_mode != ELM_OBJECT_SELECT_MODE_DISPLAY_ONLY)
1750 elm_coords_finger_size_adjust(1, &mw, 1, &mh);
1751 if (GL_IT(it)->wsd->mode == ELM_LIST_COMPRESS)
1752 mw = GL_IT(it)->wsd->prev_viewport_w;
1753 edje_object_size_min_restricted_calc(VIEW(it), &mw, &mh, mw, mh);
1755 it->item->w = it->item->minw = mw;
1756 it->item->h = it->item->minh = mh;
1757 it->item->mincalcd = EINA_TRUE;
1759 if ((!GL_IT(it)->wsd->group_item_width) && (it->group))
1761 GL_IT(it)->wsd->group_item_width = mw;
1762 GL_IT(it)->wsd->group_item_height = mh;
1764 else if ((!GL_IT(it)->wsd->item_width) &&
1765 (it->item->type == ELM_GENLIST_ITEM_NONE))
1767 GL_IT(it)->wsd->item_width = mw;
1768 GL_IT(it)->wsd->item_height = mh;
1771 if (!calc) evas_object_show(VIEW(it));
1774 if (it->tooltip.content_cb)
1776 elm_widget_item_tooltip_content_cb_set
1777 (it, it->tooltip.content_cb, it->tooltip.data, NULL);
1778 elm_widget_item_tooltip_style_set(it, it->tooltip.style);
1779 elm_widget_item_tooltip_window_mode_set(it, it->tooltip.free_size);
1782 if (it->mouse_cursor)
1783 elm_widget_item_cursor_set(it, it->mouse_cursor);
1785 it->realized = EINA_TRUE;
1786 it->want_unrealize = EINA_FALSE;
1788 if (!calc || it->item->unrealize_disabled)
1789 evas_object_smart_callback_call(WIDGET(it), SIG_REALIZED, it);
1791 if ((!calc) && (GL_IT(it)->wsd->decorate_all_mode) &&
1792 (it->item->type != ELM_GENLIST_ITEM_GROUP))
1794 if (it->itc->decorate_all_item_style)
1796 if (!it->deco_all_view)
1797 _decorate_all_item_realize(it, EINA_FALSE);
1798 edje_object_message_signal_process(it->deco_all_view);
1801 if ((!calc) && (it->decorate_it_set) &&
1802 (it->item->type != ELM_GENLIST_ITEM_GROUP))
1804 if (it->itc->decorate_item_style)
1806 if (!it->item->deco_it_view)
1807 _decorate_item_set(it);
1808 edje_object_message_signal_process(it->item->deco_it_view);
1811 edje_object_message_signal_process(VIEW(it));
1814 #if GENLIST_PINCH_ZOOM_SUPPORT
1816 _pinch_items_recalc(void *data)
1818 Elm_Genlist_Smart_Data *sd = data;
1823 Evas_Coord tot_y = 0, ox, oy;
1824 evas_object_geometry_get(sd->pan_obj, &ox, &oy, NULL, NULL);
1826 EINA_INLIST_FOREACH(sd->blocks, itb)
1828 EINA_LIST_FOREACH(itb->items, l, it)
1831 if (IS_ROOT_PARENT_IT(it))
1833 if (sd->pinch_zoom_mode == ELM_GEN_PINCH_ZOOM_CONTRACT)
1835 if (!it->realized) _item_realize(it, 0, EINA_FALSE);
1836 it->item->scrl_y = oy + tot_y - sd->pan_y;
1837 evas_object_resize(VIEW(it), sd->minw, it->item->h);
1838 evas_object_move(VIEW(it), it->item->scrl_x, it->item->scrl_y);
1839 evas_object_show(VIEW(it));
1840 evas_object_raise(VIEW(it));
1841 tot_y += it->item->h;
1842 sd->pinch_zoom_h = tot_y;
1845 else if (sd->pinch_zoom_mode == ELM_GEN_PINCH_ZOOM_EXPAND)
1847 evas_object_resize(VIEW(it), sd->minw, it->item->h);
1848 it->item->scrl_y = oy + it->item->pan_scrl_y - sd->pan_y;
1849 evas_object_move(VIEW(it), it->item->scrl_x, it->item->scrl_y);
1858 #if GROUP_ITEMS_FEATURE
1860 _group_items_recalc(void *data)
1864 Elm_Genlist_Smart_Data *sd = data;
1866 //evas_event_freeze(evas_object_evas_get(ELM_WIDGET_DATA(sd)->obj));
1867 EINA_LIST_FOREACH(sd->group_items, l, git)
1869 if (git->item->want_realize)
1871 if (!git->realized) _item_realize(git, 0, EINA_FALSE);
1872 evas_object_resize(VIEW(git), sd->minw, git->item->h);
1873 evas_object_move(VIEW(git), git->item->scrl_x, git->item->scrl_y);
1874 evas_object_show(VIEW(git));
1875 evas_object_raise(VIEW(git));
1877 else if (!git->item->want_realize)
1880 _item_unrealize(git, EINA_FALSE);
1883 //evas_event_thaw(evas_object_evas_get(ELM_WIDGET_DATA(sd)->obj));
1884 //evas_event_thaw_eval(evas_object_evas_get(ELM_WIDGET_DATA(sd)->obj));
1889 _reorder_move_animator_cb(void *data)
1892 Elm_Gen_Item *it = data;
1893 Eina_Bool down = EINA_FALSE;
1896 dy = 6 * elm_config_scale_get();
1897 t = ((0.0 > (t = ecore_loop_time_get()
1898 - GL_IT(it)->wsd->start_time)) ? 0.0 : t);
1900 if (t <= REORDER_EFFECT_TIME)
1901 y = (1 * sin((t / REORDER_EFFECT_TIME) * (M_PI / 2)) * dy);
1904 diff = abs(it->item->old_scrl_y - it->item->scrl_y);
1905 if (diff < dy) y = diff;
1907 if (it->item->old_scrl_y < it->item->scrl_y)
1909 it->item->old_scrl_y += y;
1912 else if (it->item->old_scrl_y > it->item->scrl_y)
1914 it->item->old_scrl_y -= y;
1918 if (it->deco_all_view)
1920 (it, it->deco_all_view, it->item->scrl_x, it->item->old_scrl_y);
1921 else if (it->item->deco_it_view)
1923 (it, it->item->deco_it_view, it->item->scrl_x, it->item->old_scrl_y);
1925 _item_position(it, VIEW(it), it->item->scrl_x, it->item->old_scrl_y);
1927 if ((GL_IT(it)->wsd->reorder_pan_move) ||
1928 (down && it->item->old_scrl_y >= it->item->scrl_y) ||
1929 (!down && it->item->old_scrl_y <= it->item->scrl_y))
1931 it->item->old_scrl_y = it->item->scrl_y;
1932 it->item->move_effect_enabled = EINA_FALSE;
1933 GL_IT(it)->wsd->reorder_move_animator = NULL;
1934 return ECORE_CALLBACK_CANCEL;
1937 return ECORE_CALLBACK_RENEW;
1941 _reorder_item_space_get(Elm_Gen_Item *it)
1943 Elm_Gen_Item *reorder_it = GL_IT(it)->wsd->reorder_it;
1944 Evas_Coord rox, roy, row, roh, oy, oh;
1945 Eina_Bool top = EINA_FALSE;
1947 if (!reorder_it) return 0;
1948 if(it->deco_all_view) evas_object_lower(it->deco_all_view);
1950 evas_object_geometry_get(GL_IT(it)->wsd->pan_obj, NULL, &oy, NULL, &oh);
1951 evas_object_geometry_get
1952 (GL_IT(it)->wsd->VIEW(reorder_it), &rox, &roy, &row, &roh);
1954 if ((GL_IT(it)->wsd->reorder_start_y < it->item->block->y) &&
1955 (roy - oy + (roh / 2) >= it->item->block->y - GL_IT(it)->wsd->pan_y))
1957 it->item->block->reorder_offset =
1958 GL_IT(it)->wsd->reorder_it->item->h * -1;
1959 if (it->item->block->count == 1)
1960 GL_IT(it)->wsd->reorder_rel = it;
1962 else if ((GL_IT(it)->wsd->reorder_start_y >= it->item->block->y) &&
1963 (roy - oy + (roh / 2) <= it->item->block->y -
1964 GL_IT(it)->wsd->pan_y))
1966 it->item->block->reorder_offset = GL_IT(it)->wsd->reorder_it->item->h;
1969 it->item->block->reorder_offset = 0;
1971 it->item->scrl_y += it->item->block->reorder_offset;
1973 top = (ELM_RECTS_INTERSECT
1974 (it->item->scrl_x, it->item->scrl_y, it->item->w, it->item->h,
1975 rox, roy + (roh / 2), row, 1));
1978 GL_IT(it)->wsd->reorder_rel = it;
1979 it->item->scrl_y += GL_IT(it)->wsd->reorder_it->item->h;
1980 return GL_IT(it)->wsd->reorder_it->item->h;
1987 _item_block_position(Item_Block *itb,
1993 Eina_Bool vis = EINA_FALSE;
1994 Evas_Coord y = 0, ox, oy, ow, oh, cvx, cvy, cvw, cvh;
1996 //evas_event_freeze(evas_object_evas_get(ELM_WIDGET_DATA(itb->sd)->obj));
1997 evas_object_geometry_get(itb->sd->pan_obj, &ox, &oy, &ow, &oh);
1998 evas_output_viewport_get
1999 (evas_object_evas_get(ELM_WIDGET_DATA(itb->sd)->obj),
2000 &cvx, &cvy, &cvw, &cvh);
2002 EINA_LIST_FOREACH(itb->items, l, it)
2004 if ((GL_IT(it)->wsd->reorder_it == it) && it->highlighted) continue;
2008 it->item->w = itb->w;
2009 it->item->scrl_x = itb->x + it->x - GL_IT(it)->wsd->pan_x + ox;
2010 it->item->scrl_y = itb->y + it->y - GL_IT(it)->wsd->pan_y + oy;
2012 vis = (ELM_RECTS_INTERSECT
2013 (it->item->scrl_x, it->item->scrl_y, it->item->w, it->item->h,
2014 cvx, cvy, cvw, cvh));
2017 if ((itb->realized) && (!it->realized))
2019 if (vis) _item_realize(it, in, EINA_FALSE);
2023 if (vis || it->dragging)
2025 #if GENLIST_ENTRY_SUPPORT
2026 evas_object_show(VIEW(it));
2028 if (GL_IT(it)->wsd->reorder_mode &&
2029 GL_IT(it)->wsd->reorder_it &&
2030 GL_IT(it)->wsd->reorder_it->highlighted)
2031 y += _reorder_item_space_get(it);
2032 git = it->item->group_item;
2035 if (git->item->scrl_y < oy)
2036 git->item->scrl_y = oy;
2037 if ((git->item->scrl_y + git->item->h) >
2038 (it->item->scrl_y + it->item->h))
2039 git->item->scrl_y = (it->item->scrl_y +
2040 it->item->h) - git->item->h;
2041 git->item->scrl_x = it->item->scrl_x;
2042 git->item->want_realize = EINA_TRUE;
2044 if ((GL_IT(it)->wsd->reorder_it) &&
2045 GL_IT(it)->wsd->reorder_it->highlighted &&
2046 (it->item->old_scrl_y != it->item->scrl_y))
2048 if (!it->item->move_effect_enabled)
2050 it->item->move_effect_enabled = EINA_TRUE;
2051 GL_IT(it)->wsd->reorder_move_animator =
2053 _reorder_move_animator_cb, it);
2056 if (!it->item->move_effect_enabled)
2058 if ((GL_IT(it)->wsd->decorate_all_mode) &&
2059 (it->itc->decorate_all_item_style))
2060 _decorate_all_item_position
2061 (it, it->item->scrl_x, it->item->scrl_y);
2064 if (it->item->deco_it_view)
2066 (it, it->item->deco_it_view,
2071 (it, VIEW(it), it->item->scrl_x,
2074 it->item->old_scrl_y = it->item->scrl_y;
2075 #if GENLIST_PINCH_ZOOM_SUPPORT
2076 if ((GL_IT(it)->wsd->pinch_zoom_mode == ELM_GEN_PINCH_ZOOM_CONTRACT)
2077 && (!IS_ROOT_PARENT_IT(it)))
2079 if (it->deco_all_view) evas_object_hide(it->deco_all_view);
2080 else evas_object_hide(VIEW(it));
2088 if ((GL_IT(it)->wsd->pinch_zoom_mode == ELM_GEN_PINCH_ZOOM_CONTRACT)
2089 && (!IS_ROOT_PARENT_IT(it)))
2091 if (it->deco_all_view) evas_object_hide(it->deco_all_view);
2092 else evas_object_hide(VIEW(it));
2095 _item_unrealize(it, EINA_FALSE);
2102 if (vis) it->item->want_realize = EINA_TRUE;
2106 // FIXME: diffrence from upstream
2107 minh += it->item->minh;
2111 //evas_event_thaw(evas_object_evas_get(ELM_WIDGET_DATA(itb->sd)->obj));
2112 //evas_event_thaw_eval(evas_object_evas_get(ELM_WIDGET_DATA(itb->sd)->obj));
2116 _item_block_realize(Item_Block *itb)
2118 if (itb->realized) return;
2120 itb->realized = EINA_TRUE;
2121 itb->want_unrealize = EINA_FALSE;
2124 #if GENLIST_ENTRY_SUPPORT
2126 _changed_job(Elm_Genlist_Smart_Data *sd)
2132 Eina_Bool anything_changed = EINA_FALSE;
2133 Eina_Bool width_changed = EINA_FALSE;
2134 Eina_Bool height_changed = EINA_FALSE;
2135 sd->size_changed = EINA_FALSE;
2137 EINA_INLIST_FOREACH(sd->blocks, itb)
2144 if (anything_changed)
2145 _item_block_position(itb, num);
2149 width_changed = height_changed = EINA_FALSE;
2150 EINA_LIST_FOREACH(itb->items, l2, it)
2152 if ((!it->item->mincalcd) && (it->realized))
2154 Evas_Coord fw = -1, fh = -1;
2155 Evas_Coord mw = -1, mh = -1;
2157 if (it->select_mode != ELM_OBJECT_SELECT_MODE_DISPLAY_ONLY)
2158 elm_coords_finger_size_adjust(1, &fw, 1, &fh);
2160 // FIXME: why compressmode do this?
2161 if (sd->mode == ELM_LIST_COMPRESS) mw = sd->prev_viewport_w;
2163 edje_object_size_min_restricted_calc(VIEW(it), &mw, &mh, fw, fh);
2165 if (it->item->w != mw)
2167 it->item->w = it->item->minw = mw;
2168 width_changed = EINA_TRUE;
2170 if (it->item->h != mh)
2172 it->item->h = it->item->minh = mh;
2173 height_changed = EINA_TRUE;
2180 it->item->mincalcd = EINA_TRUE;
2182 if ((!sd->group_item_width) && (it->group))
2184 sd->group_item_width = mw;
2185 sd->group_item_height = mh;
2187 else if ((!sd->item_width) && (it->item->type == ELM_GENLIST_ITEM_NONE))
2189 sd->item_width = mw;
2190 sd->item_height = mh;
2195 itb->changeme = EINA_FALSE;
2198 anything_changed = EINA_TRUE;
2199 itb->changed = EINA_TRUE;
2200 _item_block_recalc(itb, num0, 0);
2201 _item_block_position(itb, num0);
2203 else if (width_changed)
2205 _item_block_position(itb, num0);
2208 if (anything_changed)
2210 if (sd->calc_job) ecore_job_del(sd->calc_job);
2211 sd->calc_job = ecore_job_add(_calc_job, sd);
2217 _elm_genlist_pan_smart_calculate(Evas_Object *obj)
2219 Evas_Coord ox, oy, ow, oh, cvx, cvy, cvw, cvh;
2220 Evas_Coord vx = 0, vy = 0, vw = 0, vh = 0;
2226 ELM_GENLIST_PAN_DATA_GET(obj, psd);
2228 //evas_event_freeze(evas_object_evas_get(obj));
2230 #if GENLIST_FX_SUPPORT
2231 if (psd->wsd->fx_playing) return;
2233 if (psd->wsd->pan_changed)
2235 _calc_job(psd->wsd);
2236 psd->wsd->pan_changed = EINA_FALSE;
2239 evas_object_geometry_get(obj, &ox, &oy, &ow, &oh);
2240 evas_output_viewport_get(evas_object_evas_get(obj), &cvx, &cvy, &cvw, &cvh);
2241 EINA_LIST_FOREACH(psd->wsd->group_items, l, git)
2243 #if GROUP_ITEMS_FEATURE
2244 git->item->want_realize = EINA_FALSE;
2246 _item_unrealize(git, EINA_TRUE);
2250 EINA_INLIST_FOREACH(psd->wsd->blocks, itb)
2252 itb->w = psd->wsd->minw;
2253 if (ELM_RECTS_INTERSECT(itb->x - psd->wsd->pan_x + ox,
2254 itb->y - psd->wsd->pan_y + oy,
2256 cvx, cvy, cvw, cvh))
2258 if ((!itb->realized) || (itb->changed))
2260 _item_block_realize(itb);
2262 // FIXME: difference from opensource
2263 if (sd->wd->calc_job) ecore_job_del(sd->wd->calc_job);
2264 sd->wd->calc_job = NULL;
2268 _item_block_position(itb, in);
2272 if (itb->realized) _item_block_unrealize(itb);
2276 #if GENLIST_PINCH_ZOOM_SUPPORT
2277 if (psd->wsd->pinch_zoom_mode) _pinch_items_recalc(psd->wsd);
2280 #if GROUP_ITEMS_FEATURE
2281 if ((!psd->wsd->reorder_it) || (psd->wsd->reorder_pan_move))
2282 _group_items_recalc(psd->wsd);
2284 if ((psd->wsd->reorder_mode) && (psd->wsd->reorder_it))
2286 if (psd->wsd->pan_y != psd->wsd->reorder_old_pan_y)
2287 psd->wsd->reorder_pan_move = EINA_TRUE;
2288 else psd->wsd->reorder_pan_move = EINA_FALSE;
2290 evas_object_raise(psd->wsd->VIEW(reorder_it));
2291 psd->wsd->reorder_old_pan_y = psd->wsd->pan_y;
2292 psd->wsd->start_time = ecore_loop_time_get();
2294 _item_auto_scroll(psd->wsd);
2296 psd->wsd->s_iface->content_pos_get(ELM_WIDGET_DATA(psd->wsd)->obj, &vx, &vy);
2297 psd->wsd->s_iface->content_viewport_size_get(ELM_WIDGET_DATA(psd->wsd)->obj,
2300 if (psd->wsd->reorder_fast == 1)
2301 psd->wsd->s_iface->content_region_show(ELM_WIDGET_DATA(psd->wsd)->obj,
2302 vx,vy - 10, vw, vh);
2303 else if (psd->wsd->reorder_fast == -1)
2304 psd->wsd->s_iface->content_region_show(ELM_WIDGET_DATA(psd->wsd)->obj,
2305 vx, vy + 10, vw, vh);
2307 #if GENLIST_ENTRY_SUPPORT
2308 if (psd->wsd->size_changed) _changed_job(psd->wsd);
2311 #if GENLIST_FX_SUPPORT
2312 psd->wsd->rendered = EINA_TRUE;
2313 if ((psd->wsd->fx_mode) && (!psd->wsd->queue))
2315 if (_elm_genlist_fx_capture(ELM_WIDGET_DATA(psd->wsd)->obj, 1))
2316 _elm_genlist_fx_play(ELM_WIDGET_DATA(psd->wsd)->obj);
2319 #if GENLIST_PINCH_ZOOM_SUPPORT
2320 if (psd->wsd->pinch_zoom_mode == ELM_GEN_PINCH_ZOOM_EXPAND)
2321 psd->wsd->pinch_zoom_mode = ELM_GEN_PINCH_ZOOM_NONE;
2323 //evas_event_thaw(evas_object_evas_get(obj));
2324 //evas_event_thaw_eval(evas_object_evas_get(obj));
2328 _elm_genlist_pan_smart_set_user(Elm_Genlist_Pan_Smart_Class *sc)
2330 ELM_PAN_CLASS(sc)->base.add = _elm_genlist_pan_smart_add;
2331 ELM_PAN_CLASS(sc)->base.del = _elm_genlist_pan_smart_del;
2332 ELM_PAN_CLASS(sc)->base.move = _elm_genlist_pan_smart_move;
2333 ELM_PAN_CLASS(sc)->base.resize = _elm_genlist_pan_smart_resize;
2334 ELM_PAN_CLASS(sc)->base.calculate = _elm_genlist_pan_smart_calculate;
2336 ELM_PAN_CLASS(sc)->pos_set = _elm_genlist_pan_smart_pos_set;
2337 ELM_PAN_CLASS(sc)->pos_get = _elm_genlist_pan_smart_pos_get;
2338 ELM_PAN_CLASS(sc)->pos_max_get = _elm_genlist_pan_smart_pos_max_get;
2339 ELM_PAN_CLASS(sc)->pos_min_get = _elm_genlist_pan_smart_pos_min_get;
2340 ELM_PAN_CLASS(sc)->content_size_get =
2341 _elm_genlist_pan_smart_content_size_get;
2345 _item_multi_select_up(Elm_Genlist_Smart_Data *sd)
2347 Elm_Object_Item *prev;
2349 if (!sd->selected) return EINA_FALSE;
2350 if (!sd->multi) return EINA_FALSE;
2352 prev = elm_genlist_item_prev_get(sd->last_selected_item);
2353 if (!prev) return EINA_TRUE;
2355 if (elm_genlist_item_selected_get(prev))
2357 elm_genlist_item_selected_set(sd->last_selected_item, EINA_FALSE);
2358 sd->last_selected_item = prev;
2359 elm_genlist_item_show
2360 (sd->last_selected_item, ELM_GENLIST_ITEM_SCROLLTO_IN);
2364 elm_genlist_item_selected_set(prev, EINA_TRUE);
2365 elm_genlist_item_show(prev, ELM_GENLIST_ITEM_SCROLLTO_IN);
2371 _item_multi_select_down(Elm_Genlist_Smart_Data *sd)
2373 Elm_Object_Item *next;
2375 if (!sd->selected) return EINA_FALSE;
2376 if (!sd->multi) return EINA_FALSE;
2378 next = elm_genlist_item_next_get(sd->last_selected_item);
2379 if (!next) return EINA_TRUE;
2381 if (elm_genlist_item_selected_get(next))
2383 elm_genlist_item_selected_set(sd->last_selected_item, EINA_FALSE);
2384 sd->last_selected_item = next;
2385 elm_genlist_item_show
2386 (sd->last_selected_item, ELM_GENLIST_ITEM_SCROLLTO_IN);
2390 elm_genlist_item_selected_set(next, EINA_TRUE);
2391 elm_genlist_item_show(next, ELM_GENLIST_ITEM_SCROLLTO_IN);
2398 _all_items_deselect(Elm_Genlist_Smart_Data *sd)
2400 if (!sd->selected) return EINA_FALSE;
2402 while (sd->selected)
2403 elm_genlist_item_selected_set(sd->selected->data, EINA_FALSE);
2409 _item_single_select_up(Elm_Genlist_Smart_Data *sd)
2415 prev = ELM_GEN_ITEM_FROM_INLIST(sd->items->last);
2417 prev = ELM_GEN_ITEM_FROM_INLIST(EINA_INLIST_GET(prev)->prev);
2420 prev = (Elm_Gen_Item *)elm_genlist_item_prev_get
2421 (sd->last_selected_item);
2423 if (!prev) return EINA_FALSE;
2425 _all_items_deselect(sd);
2427 elm_genlist_item_selected_set((Elm_Object_Item *)prev, EINA_TRUE);
2428 elm_genlist_item_show((Elm_Object_Item *)prev, ELM_GENLIST_ITEM_SCROLLTO_IN);
2433 _item_single_select_down(Elm_Genlist_Smart_Data *sd)
2439 next = ELM_GEN_ITEM_FROM_INLIST(sd->items);
2441 next = ELM_GEN_ITEM_FROM_INLIST(EINA_INLIST_GET(next)->next);
2444 next = (Elm_Gen_Item *)elm_genlist_item_next_get
2445 (sd->last_selected_item);
2447 if (!next) return EINA_FALSE;
2449 _all_items_deselect(sd);
2451 elm_genlist_item_selected_set((Elm_Object_Item *)next, EINA_TRUE);
2452 elm_genlist_item_show
2453 ((Elm_Object_Item *)next, ELM_GENLIST_ITEM_SCROLLTO_IN);
2459 _elm_genlist_smart_event(Evas_Object *obj,
2460 Evas_Object *src __UNUSED__,
2461 Evas_Callback_Type type,
2468 Evas_Coord step_x = 0;
2469 Evas_Coord step_y = 0;
2470 Evas_Coord page_x = 0;
2471 Evas_Coord page_y = 0;
2472 Elm_Object_Item *it;
2473 Evas_Event_Key_Down *ev = event_info;
2474 Evas_Coord pan_max_x = 0, pan_max_y = 0;
2476 ELM_GENLIST_DATA_GET(obj, sd);
2478 if (type != EVAS_CALLBACK_KEY_DOWN) return EINA_FALSE;
2479 if (!sd->items) return EINA_FALSE;
2480 if (ev->event_flags & EVAS_EVENT_FLAG_ON_HOLD) return EINA_FALSE;
2481 if (elm_widget_disabled_get(obj)) return EINA_FALSE;
2483 sd->s_iface->content_pos_get(obj, &x, &y);
2484 sd->s_iface->step_size_get(obj, &step_x, &step_y);
2485 sd->s_iface->page_size_get(obj, &page_x, &page_y);
2486 sd->s_iface->content_viewport_size_get(obj, &v_w, &v_h);
2488 if ((!strcmp(ev->keyname, "Left")) ||
2489 ((!strcmp(ev->keyname, "KP_Left")) && (!ev->string)))
2493 else if ((!strcmp(ev->keyname, "Right")) ||
2494 ((!strcmp(ev->keyname, "KP_Right")) && (!ev->string)))
2498 else if ((!strcmp(ev->keyname, "Up")) ||
2499 ((!strcmp(ev->keyname, "KP_Up")) && (!ev->string)))
2501 if (((evas_key_modifier_is_set(ev->modifiers, "Shift")) &&
2502 (_item_multi_select_up(sd)))
2503 || (_item_single_select_up(sd)))
2505 ev->event_flags |= EVAS_EVENT_FLAG_ON_HOLD;
2511 else if ((!strcmp(ev->keyname, "Down")) ||
2512 ((!strcmp(ev->keyname, "KP_Down")) && (!ev->string)))
2514 if (((evas_key_modifier_is_set(ev->modifiers, "Shift")) &&
2515 (_item_multi_select_down(sd)))
2516 || (_item_single_select_down(sd)))
2518 ev->event_flags |= EVAS_EVENT_FLAG_ON_HOLD;
2524 else if ((!strcmp(ev->keyname, "Home")) ||
2525 ((!strcmp(ev->keyname, "KP_Home")) && (!ev->string)))
2527 it = elm_genlist_first_item_get(obj);
2528 elm_genlist_item_bring_in(it, ELM_GENLIST_ITEM_SCROLLTO_IN);
2529 elm_genlist_item_selected_set(it, EINA_TRUE);
2530 ev->event_flags |= EVAS_EVENT_FLAG_ON_HOLD;
2533 else if ((!strcmp(ev->keyname, "End")) ||
2534 ((!strcmp(ev->keyname, "KP_End")) && (!ev->string)))
2536 it = elm_genlist_last_item_get(obj);
2537 elm_genlist_item_bring_in(it, ELM_GENLIST_ITEM_SCROLLTO_IN);
2538 elm_genlist_item_selected_set(it, EINA_TRUE);
2539 ev->event_flags |= EVAS_EVENT_FLAG_ON_HOLD;
2542 else if ((!strcmp(ev->keyname, "Prior")) ||
2543 ((!strcmp(ev->keyname, "KP_Prior")) && (!ev->string)))
2546 y -= -(page_y * v_h) / 100;
2550 else if ((!strcmp(ev->keyname, "Next")) ||
2551 ((!strcmp(ev->keyname, "KP_Next")) && (!ev->string)))
2554 y += -(page_y * v_h) / 100;
2558 else if (!strcmp(ev->keyname, "Escape"))
2560 if (!_all_items_deselect(sd)) return EINA_FALSE;
2561 ev->event_flags |= EVAS_EVENT_FLAG_ON_HOLD;
2564 else if (((!strcmp(ev->keyname, "Return")) ||
2565 (!strcmp(ev->keyname, "KP_Enter")) ||
2566 (!strcmp(ev->keyname, "space")))
2567 && (!sd->multi) && (sd->selected))
2569 it = elm_genlist_selected_item_get(obj);
2570 elm_genlist_item_expanded_set(it, !elm_genlist_item_expanded_get(it));
2571 evas_object_smart_callback_call(WIDGET(it), SIG_ACTIVATED, it);
2573 else return EINA_FALSE;
2575 ev->event_flags |= EVAS_EVENT_FLAG_ON_HOLD;
2576 _elm_genlist_pan_smart_pos_max_get(sd->pan_obj, &pan_max_x, &pan_max_y);
2578 if (x > pan_max_x) x = pan_max_x;
2580 if (y > pan_max_y) y = pan_max_y;
2582 sd->s_iface->content_pos_set(obj, x, y, EINA_TRUE);
2588 _elm_genlist_smart_sub_object_add(Evas_Object *obj,
2591 Elm_Widget_Smart_Class *parent_parent;
2593 parent_parent = (Elm_Widget_Smart_Class *)((Evas_Smart_Class *)
2594 _elm_genlist_parent_sc)->parent;
2596 /* skipping layout's code, which registers size hint changing
2597 * callback on sub objects. this is here because items'
2598 * content_get() routines may change hints on the objects after
2599 * creation, thus issuing TOO MANY sizing_eval()'s here. they are
2600 * not needed at here anyway, so let's skip listening to those
2602 if (!parent_parent->sub_object_add(obj, sobj))
2609 _elm_genlist_smart_sub_object_del(Evas_Object *obj,
2612 ELM_GENLIST_DATA_GET(obj, sd);
2614 /* XXX: hack -- also skipping sizing recalculation on
2615 * sub-object-del. genlist's crazy code paths (like groups and
2616 * such) seem to issue a whole lot of deletions and Evas bitches
2617 * about too many recalculations */
2618 sd->on_sub_del = EINA_TRUE;
2620 if (!ELM_WIDGET_CLASS(_elm_genlist_parent_sc)->sub_object_del(obj, sobj))
2623 sd->on_sub_del = EINA_FALSE;
2629 _elm_genlist_smart_on_focus(Evas_Object *obj)
2631 ELM_GENLIST_DATA_GET(obj, sd);
2633 if (!ELM_WIDGET_CLASS(_elm_genlist_parent_sc)->on_focus(obj))
2636 if (elm_widget_focus_get(obj) && (sd->items) && (sd->selected) &&
2637 (!sd->last_selected_item))
2638 sd->last_selected_item = eina_list_data_get(sd->selected);
2644 _elm_genlist_smart_focus_next(const Evas_Object *obj,
2645 Elm_Focus_Direction dir,
2648 Evas_Coord x, y, w, h;
2649 Evas_Coord sx, sy, sw, sh;
2651 Eina_List *items = NULL;
2652 Eina_Bool done = EINA_FALSE;
2654 ELM_GENLIST_CHECK(obj) EINA_FALSE;
2655 ELM_GENLIST_DATA_GET(obj, sd);
2657 evas_object_geometry_get(ELM_WIDGET_DATA(sd)->obj, &sx, &sy, &sw, &sh);
2659 EINA_INLIST_FOREACH(sd->blocks, itb)
2667 EINA_LIST_FOREACH(itb->items, l, it)
2671 evas_object_geometry_get(it->base.view, &x, &y, &w, &h);
2673 /* check item which displays more than half of its size */
2674 if (ELM_RECTS_INTERSECT
2675 (x + (w / 2), y + (h / 2), 0, 0, sx, sy, sw, sh))
2676 items = eina_list_append(items, it->base.access_obj);
2678 if (!it->base.access_order) continue;
2682 EINA_LIST_FOREACH(it->base.access_order, subl, subo)
2683 items = eina_list_append(items, subo);
2687 else if (done) break;
2690 return elm_widget_focus_list_next_get
2691 (obj, items, eina_list_data_get, dir, next);
2695 _mirrored_set(Evas_Object *obj,
2698 ELM_GENLIST_DATA_GET(obj, sd);
2700 sd->s_iface->mirrored_set(obj, rtl);
2704 _elm_genlist_smart_theme(Evas_Object *obj)
2708 ELM_GENLIST_DATA_GET(obj, sd);
2710 if (!ELM_WIDGET_CLASS(_elm_genlist_parent_sc)->theme(obj))
2713 //evas_event_freeze(evas_object_evas_get(ELM_WIDGET_DATA(sd)->obj));
2714 _item_cache_all_free(sd);
2715 _mirrored_set(obj, elm_widget_mirrored_get(obj));
2718 // FIXME: difference from opensource
2719 elm_layout_theme_set(obj, "genlist", "base", elm_widget_style_get(obj));
2722 sd->item_width = sd->item_height = 0;
2723 sd->group_item_width = sd->group_item_height = 0;
2724 sd->minw = sd->minh = sd->realminw = 0;
2725 EINA_INLIST_FOREACH(sd->blocks, itb)
2730 if (itb->realized) _item_block_unrealize(itb);
2731 EINA_LIST_FOREACH(itb->items, l, it)
2732 it->item->mincalcd = EINA_FALSE;
2734 itb->changed = EINA_TRUE;
2736 if (sd->calc_job) ecore_job_del(sd->calc_job);
2737 sd->calc_job = NULL;
2738 elm_layout_sizing_eval(obj);
2739 sd->pan_changed = EINA_TRUE;
2740 evas_object_smart_changed(sd->pan_obj);
2741 //evas_event_thaw(evas_object_evas_get(ELM_WIDGET_DATA(sd)->obj));
2742 //evas_event_thaw_eval(evas_object_evas_get(ELM_WIDGET_DATA(sd)->obj));
2747 /* FIXME: take off later. maybe this show region coords belong in the
2748 * interface (new api functions, set/get)? */
2750 _show_region_hook(void *data,
2753 Evas_Coord x, y, w, h;
2755 ELM_GENLIST_DATA_GET(data, sd);
2757 elm_widget_show_region_get(obj, &x, &y, &w, &h);
2758 //x & y are screen coordinates, Add with pan coordinates
2761 sd->s_iface->content_region_show(obj, x, y, w, h);
2765 _elm_genlist_smart_translate(Evas_Object *obj)
2767 evas_object_smart_callback_call(obj, "language,changed", NULL);
2773 _item_highlight(Elm_Gen_Item *it)
2775 const char *selectraise;
2776 Elm_Genlist_Smart_Data *sd = GL_IT(it)->wsd;
2778 if (elm_widget_item_disabled_get(it)) return;
2779 if ((sd->select_mode == ELM_OBJECT_SELECT_MODE_NONE) ||
2780 (sd->select_mode == ELM_OBJECT_SELECT_MODE_DISPLAY_ONLY ) ||
2781 (it->select_mode == ELM_OBJECT_SELECT_MODE_NONE) ||
2782 (it->select_mode == ELM_OBJECT_SELECT_MODE_DISPLAY_ONLY ))
2785 if (!sd->highlight || it->highlighted) return;
2786 #if GENLIST_PINCH_ZOOM_SUPPORT
2787 if (sd->pinch_zoom_mode) return;
2790 selectraise = edje_object_data_get(VIEW(it), "selectraise");
2791 if ((selectraise) && (!strcmp(selectraise, "on")))
2793 if (it->deco_all_view) evas_object_raise(it->deco_all_view);
2794 else evas_object_raise(VIEW(it));
2795 if ((it->item->group_item) && (it->item->group_item->realized))
2796 evas_object_raise(it->item->VIEW(group_item));
2798 it->highlighted = EINA_TRUE;
2800 if (it->deco_all_view)
2801 edje_object_signal_emit(it->deco_all_view, "elm,state,selected", "elm");
2802 edje_object_signal_emit(VIEW(it), "elm,state,selected", "elm");
2803 evas_object_smart_callback_call(WIDGET(it), SIG_HIGHLIGHTED, it);
2807 _item_unhighlight(Elm_Gen_Item *it)
2809 if (!it->highlighted) return;
2811 if (!it->item->nostacking)
2813 if ((it->item->order_num_in & 0x1) ^ it->item->stacking_even)
2815 if (it->deco_all_view) evas_object_lower(it->deco_all_view);
2816 else evas_object_lower(VIEW(it));
2820 if (it->deco_all_view) evas_object_raise(it->deco_all_view);
2821 else evas_object_raise(VIEW(it));
2824 it->highlighted = EINA_FALSE;
2826 if (it->deco_all_view)
2827 edje_object_signal_emit(it->deco_all_view, "elm,state,unselected", "elm");
2828 edje_object_signal_emit(VIEW(it), "elm,state,unselected", "elm");
2829 evas_object_smart_callback_call(WIDGET(it), SIG_UNHIGHLIGHTED, it);
2833 _item_unselect(Elm_Gen_Item *it)
2835 Elm_Genlist_Smart_Data *sd = GL_IT(it)->wsd;
2836 _item_unhighlight(it);
2837 if (!it->selected) return;
2839 it->selected = EINA_FALSE;
2840 sd->selected = eina_list_remove(sd->selected, it);
2841 evas_object_smart_callback_call(WIDGET(it), SIG_UNSELECTED, it);
2845 _item_select(Elm_Gen_Item *it)
2847 Evas_Object *obj = WIDGET(it);
2848 Elm_Genlist_Smart_Data *sd = GL_IT(it)->wsd;
2849 if (elm_widget_item_disabled_get(it)) return;
2850 if ((sd->select_mode == ELM_OBJECT_SELECT_MODE_NONE) ||
2851 (sd->select_mode == ELM_OBJECT_SELECT_MODE_DISPLAY_ONLY) ||
2852 (it->select_mode == ELM_OBJECT_SELECT_MODE_NONE) ||
2853 (it->select_mode == ELM_OBJECT_SELECT_MODE_DISPLAY_ONLY))
2856 #if GENLIST_PINCH_ZOOM_SUPPORT
2857 if (IS_ROOT_PARENT_IT(it) && (sd->pinch_zoom_mode == ELM_GEN_PINCH_ZOOM_CONTRACT))
2859 elm_genlist_pinch_zoom_mode_set(obj, ELM_GEN_PINCH_ZOOM_EXPAND);
2860 elm_genlist_item_show((Elm_Object_Item *)it, ELM_GENLIST_ITEM_SCROLLTO_TOP);
2866 // FIXME: difference from upstream
2867 if ((GL_IT(it)->wsd->last_selected_item) &&
2868 (it != (Elm_Gen_Item *) GL_IT(it)->wsd->last_selected_item))
2869 _item_unfocusable_set
2870 ((Elm_Gen_Item *)GL_IT(it)->wsd->last_selected_item, EINA_TRUE);
2873 // Do not check selected because always select mode can be used
2874 _item_highlight(it);
2875 it->selected = EINA_TRUE;
2876 sd->selected = eina_list_append(sd->selected, it);
2877 sd->last_selected_item = (Elm_Object_Item *)it;
2879 if (it->func.func) it->func.func((void *)it->func.data, obj, it);
2880 if (!EINA_MAGIC_CHECK((Elm_Widget_Item *)it, ELM_WIDGET_ITEM_MAGIC))
2882 evas_object_smart_callback_call(WIDGET(it), SIG_SELECTED, it);
2886 _item_select_unselect(Elm_Gen_Item *it, Eina_Bool selected)
2888 Elm_Genlist_Smart_Data *sd = GL_IT(it)->wsd;
2889 Evas_Object *obj = ELM_WIDGET_DATA(sd)->obj;
2890 if (elm_widget_item_disabled_get(it)) return;
2892 evas_object_ref(obj);
2895 const Eina_List *l, *ll;
2897 EINA_LIST_FOREACH_SAFE(sd->selected, l, ll, it2)
2898 if (it2 != it) _item_unselect(it2);
2900 if (selected) _item_select(it);
2901 else _item_unselect(it);
2902 evas_object_unref(obj);
2906 _item_block_position_update(Eina_Inlist *list,
2911 EINA_INLIST_FOREACH(list, tmp)
2913 tmp->position = idx++;
2914 tmp->position_update = EINA_TRUE;
2919 _item_position_update(Eina_List *list,
2925 EINA_LIST_FOREACH(list, l, it)
2927 it->position = idx++;
2928 it->position_update = EINA_TRUE;
2933 _item_block_merge(Item_Block *left,
2939 EINA_LIST_FOREACH(right->items, l, it2)
2941 it2->item->block = left;
2943 left->changed = EINA_TRUE;
2945 left->items = eina_list_merge(left->items, right->items);
2949 _item_block_del(Elm_Gen_Item *it)
2952 Item_Block *itb = it->item->block;
2953 Eina_Bool block_changed = EINA_FALSE;
2955 itb->items = eina_list_remove(itb->items, it);
2957 itb->changed = EINA_TRUE;
2958 if (GL_IT(it)->wsd->calc_job) ecore_job_del(GL_IT(it)->wsd->calc_job);
2959 GL_IT(it)->wsd->calc_job = ecore_job_add(_calc_job, GL_IT(it)->wsd);
2964 il = EINA_INLIST_GET(itb);
2965 itbn = (Item_Block *)(il->next);
2967 it->parent->item->items =
2968 eina_list_remove(it->parent->item->items, it);
2971 _item_block_position_update(il->next, itb->position);
2973 GL_IT(it)->wsd->blocks =
2974 eina_inlist_remove(GL_IT(it)->wsd->blocks, il);
2977 if (itbn) itbn->changed = EINA_TRUE;
2981 if (itb->count < (itb->sd->max_items_per_block / 2))
2986 il = EINA_INLIST_GET(itb);
2987 itbp = (Item_Block *)(il->prev);
2988 itbn = (Item_Block *)(il->next);
2990 /* merge block with previous */
2992 ((itbp->count + itb->count) <
2993 (itb->sd->max_items_per_block +
2994 (itb->sd->max_items_per_block / 2))))
2996 _item_block_merge(itbp, itb);
2997 _item_block_position_update
2998 (EINA_INLIST_GET(itb)->next, itb->position);
2999 GL_IT(it)->wsd->blocks = eina_inlist_remove
3000 (GL_IT(it)->wsd->blocks, EINA_INLIST_GET(itb));
3002 block_changed = EINA_TRUE;
3004 /* merge block with next */
3006 ((itbn->count + itb->count) <
3007 (itb->sd->max_items_per_block +
3008 (itb->sd->max_items_per_block / 2))))
3010 _item_block_merge(itb, itbn);
3011 _item_block_position_update
3012 (EINA_INLIST_GET(itbn)->next, itbn->position);
3013 GL_IT(it)->wsd->blocks =
3014 eina_inlist_remove(GL_IT(it)->wsd->blocks,
3015 EINA_INLIST_GET(itbn));
3017 block_changed = EINA_TRUE;
3024 GL_IT(it)->wsd->pan_changed = EINA_TRUE;
3025 evas_object_smart_changed(GL_IT(it)->wsd->pan_obj);
3026 if (GL_IT(it)->wsd->calc_job) ecore_job_del(GL_IT(it)->wsd->calc_job);
3027 GL_IT(it)->wsd->calc_job = NULL;
3029 #if GENLIST_FX_SUPPORT
3030 it->item->block = NULL;
3035 _decorate_all_item_unrealize(Elm_Gen_Item *it)
3039 if ((!it) || (!it->item->decorate_all_item_realized)) return;
3041 #if GENLIST_FX_SUPPORT
3042 if ((GL_IT(it)->has_proxy_it) && (!GL_IT(it)->wsd->genlist_clearing))
3044 if (!eina_list_data_find(GL_IT(it)->wsd->pending_unrealized_decorate_all_items, it))
3045 GL_IT(it)->wsd->pending_unrealized_decorate_all_items =
3046 eina_list_append(GL_IT(it)->wsd->pending_unrealized_decorate_all_items, it);
3051 edje_object_part_unswallow(it->deco_all_view, VIEW(it));
3052 evas_object_smart_member_add(VIEW(it), GL_IT(it)->wsd->pan_obj);
3053 elm_widget_sub_object_add(WIDGET(it), VIEW(it));
3054 _elm_genlist_item_odd_even_update(it);
3055 _elm_genlist_item_state_update(it, NULL);
3057 edje_object_signal_emit
3058 (it->deco_all_view, "elm,state,decorate,disabled", "elm");
3059 edje_object_signal_emit
3060 (VIEW(it), "elm,state,decorate,disabled", "elm");
3061 if (it->item->wsd->reorder_mode)
3063 edje_object_signal_emit
3064 (VIEW(it), "elm,state,reorder,mode_set", "elm");
3065 edje_object_signal_emit
3066 (it->deco_all_view, "elm,state,reorder,mode_unset", "elm");
3069 edje_object_message_signal_process(VIEW(it));
3070 edje_object_message_signal_process(it->deco_all_view);
3072 evas_object_del(it->deco_all_view);
3073 it->deco_all_view = NULL;
3074 elm_widget_stringlist_free(it->item->deco_all_texts);
3075 it->item->deco_all_texts = NULL;
3076 elm_widget_stringlist_free(it->item->deco_all_contents);
3077 it->item->deco_all_contents = NULL;
3078 elm_widget_stringlist_free(it->item->deco_all_states);
3079 it->item->deco_all_states = NULL;
3080 EINA_LIST_FREE (it->item->deco_all_content_objs, icon)
3081 evas_object_del(icon);
3083 _item_mouse_callbacks_del(it, it->deco_all_view);
3084 _item_mouse_callbacks_add(it, VIEW(it));
3086 it->item->decorate_all_item_realized = EINA_FALSE;
3090 _item_free_common(Elm_Gen_Item *it)
3092 Elm_Genlist_Smart_Data *sd = GL_IT(it)->wsd;
3093 elm_widget_item_pre_notify_del(it);
3094 if (it->itc->func.del)
3095 it->itc->func.del((void *)it->base.data, WIDGET(it));
3096 if (it->tooltip.del_cb)
3097 it->tooltip.del_cb((void *)it->tooltip.data, WIDGET(it), it);
3098 if (it->item->block) _item_block_del(it);
3100 it->parent->item->items =
3101 eina_list_remove(it->parent->item->items, it);
3102 if (it->item->queued) sd->queue = eina_list_remove(sd->queue, it);
3103 if (it->group) sd->group_items = eina_list_remove(sd->group_items, it);
3105 // FIXME: relative will be better to be fixed. it is too harsh.
3107 it->item->rel->item->rel_revs =
3108 eina_list_remove(it->item->rel->item->rel_revs, it);
3109 if (it->item->rel_revs)
3112 EINA_LIST_FREE(it->item->rel_revs, tmp) tmp->item->rel = NULL;
3114 _item_subitems_clear(it);
3116 #if GENLIST_ENTRY_SUPPORT
3117 it->item->unrealize_disabled = EINA_FALSE;
3120 if (it->selected) sd->selected = eina_list_remove(sd->selected, it);
3121 if (sd->show_item == it) sd->show_item = NULL;
3122 if (sd->anchor_item == it)
3125 ELM_GEN_ITEM_FROM_INLIST(EINA_INLIST_GET(it)->next);
3126 if (!sd->anchor_item) sd->anchor_item =
3127 ELM_GEN_ITEM_FROM_INLIST(EINA_INLIST_GET(it)->prev);
3129 if (sd->expanded_item == it) sd->expanded_item = NULL;
3130 if (sd->expanded_next_item == it) sd->expanded_next_item = NULL;
3131 if (sd->state) eina_inlist_sorted_state_free(sd->state);
3133 if (sd->last_selected_item == (Elm_Object_Item *)it)
3134 sd->last_selected_item = NULL;
3138 ecore_timer_del(it->long_timer);
3139 it->long_timer = NULL;
3141 if (it->item->swipe_timer) ecore_timer_del(it->item->swipe_timer);
3143 sd->items = eina_inlist_remove(sd->items, EINA_INLIST_GET(it));
3148 _item_free(Elm_Gen_Item *it)
3150 Elm_Genlist_Smart_Data *sd = GL_IT(it)->wsd;
3152 #if GENLIST_FX_SUPPORT
3153 if (sd->fx_mode) GL_IT(it)->has_proxy_it = EINA_FALSE;
3154 _elm_genlist_proxy_item_del((Elm_Object_Item *)it);
3155 if ((!sd->fx_mode) || (sd->genlist_clearing))
3158 _item_free_common(it);
3160 _item_unrealize(it, EINA_FALSE);
3161 elm_genlist_item_class_unref((Elm_Genlist_Item_Class *)it->itc);
3164 if (sd->calc_job) ecore_job_del(sd->calc_job);
3165 sd->calc_job = ecore_job_add(_calc_job, sd);
3168 #if GENLIST_FX_SUPPORT
3170 _item_del_pre_fx_process(Elm_Gen_Item *it)
3172 Elm_Genlist_Smart_Data *sd = GL_IT(it)->wsd;
3174 sd->fx_items_deleted = EINA_TRUE;
3175 _elm_genlist_fx_capture(ELM_WIDGET_DATA(sd)->obj, 0);
3176 if (!eina_list_data_find(sd->pending_del_items, it))
3177 sd->pending_del_items = eina_list_append(sd->pending_del_items, it);
3179 _item_free_common(it);
3185 _item_mouse_move_cb(void *data,
3186 Evas *evas __UNUSED__,
3190 EINA_SAFETY_ON_NULL_RETURN(data);
3191 Elm_Gen_Item *it = data;
3192 Elm_Genlist_Smart_Data *sd;
3193 Evas_Event_Mouse_Move *ev = event_info;
3194 Evas_Coord ox, oy, ow, oh, it_scrl_y, y_pos;
3195 Evas_Coord minw = 0, minh = 0, x, y, dx, dy, adx, ady;
3197 sd = GL_IT(it)->wsd;
3199 if (ev->event_flags & EVAS_EVENT_FLAG_ON_HOLD)
3201 if (!sd->on_hold) _item_unselect(it);
3202 sd->on_hold = EINA_TRUE;
3204 if (sd->multi_touched)
3206 sd->cur_x = ev->cur.canvas.x;
3207 sd->cur_y = ev->cur.canvas.y;
3210 if ((it->dragging) && (it->down))
3212 if (sd->movements == SWIPE_MOVES)
3213 sd->swipe = EINA_TRUE;
3216 sd->history[sd->movements].x = ev->cur.canvas.x;
3217 sd->history[sd->movements].y = ev->cur.canvas.y;
3218 if (abs((sd->history[sd->movements].x -
3219 sd->history[0].x)) > 40)
3220 sd->swipe = EINA_TRUE;
3226 ecore_timer_del(it->long_timer);
3227 it->long_timer = NULL;
3229 evas_object_smart_callback_call(WIDGET(it), SIG_DRAG, it);
3232 if ((!it->down) || (sd->longpressed))
3236 ecore_timer_del(it->long_timer);
3237 it->long_timer = NULL;
3239 if ((sd->reorder_mode) && (sd->reorder_it))
3241 evas_object_geometry_get(sd->pan_obj, &ox, &oy, &ow, &oh);
3243 if (ev->cur.canvas.y < (oy + (sd->reorder_it->item->h / 2)))
3244 sd->reorder_fast = 1;
3245 else if (ev->cur.canvas.y > (oy + oh - (sd->reorder_it->item->h / 2)))
3246 sd->reorder_fast = -1;
3247 else sd->reorder_fast = 0;
3249 it_scrl_y = ev->cur.canvas.y - sd->reorder_it->dy;
3251 if (!sd->reorder_start_y)
3252 sd->reorder_start_y = it->item->block->y + it->y;
3256 else if (it_scrl_y + sd->reorder_it->item->h > oy + oh)
3257 y_pos = oy + oh - sd->reorder_it->item->h;
3261 if (it->deco_all_view)
3262 _item_position(it, it->deco_all_view, it->item->scrl_x, y_pos);
3263 else if (it->item->deco_it_view)
3265 (it, it->item->deco_it_view, it->item->scrl_x, y_pos);
3267 _item_position(it, VIEW(it), it->item->scrl_x, y_pos);
3269 if (sd->calc_job) ecore_job_del(sd->calc_job);
3270 sd->calc_job = ecore_job_add(_calc_job, sd);
3274 if (it->select_mode != ELM_OBJECT_SELECT_MODE_DISPLAY_ONLY)
3275 elm_coords_finger_size_adjust(1, &minw, 1, &minh);
3277 evas_object_geometry_get(obj, &x, &y, NULL, NULL);
3278 x = ev->cur.canvas.x - x;
3279 y = ev->cur.canvas.y - y;
3282 if (adx < 0) adx = -dx;
3286 if (ady < 0) ady = -dy;
3290 if ((adx > minw) || (ady > minh))
3292 it->dragging = EINA_TRUE;
3295 ecore_timer_del(it->long_timer);
3296 it->long_timer = NULL;
3301 evas_object_smart_callback_call
3302 (WIDGET(it), SIG_DRAG_START_UP, it);
3306 evas_object_smart_callback_call
3307 (WIDGET(it), SIG_DRAG_START_LEFT, it);
3309 evas_object_smart_callback_call
3310 (WIDGET(it), SIG_DRAG_START_RIGHT, it);
3316 evas_object_smart_callback_call
3317 (WIDGET(it), SIG_DRAG_START_DOWN, it);
3321 evas_object_smart_callback_call
3322 (WIDGET(it), SIG_DRAG_START_LEFT, it);
3324 evas_object_smart_callback_call
3325 (WIDGET(it), SIG_DRAG_START_RIGHT, it);
3332 _long_press_cb(void *data)
3334 Elm_Gen_Item *it = data, *it2;
3335 Elm_Genlist_Smart_Data *sd;
3338 sd = GL_IT(it)->wsd;
3340 it->long_timer = NULL;
3341 if (elm_widget_item_disabled_get(it) || (it->dragging) ||
3342 (it->select_mode == ELM_OBJECT_SELECT_MODE_DISPLAY_ONLY))
3343 return ECORE_CALLBACK_CANCEL;
3345 GL_IT(it)->wsd->longpressed = EINA_TRUE;
3346 evas_object_smart_callback_call(WIDGET(it), SIG_LONGPRESSED, it);
3347 if ((GL_IT(it)->wsd->reorder_mode) && (!it->group))
3349 GL_IT(it)->wsd->reorder_it = it;
3350 GL_IT(it)->wsd->reorder_start_y = 0;
3351 if (it->deco_all_view)
3352 evas_object_raise(it->deco_all_view);
3354 evas_object_raise(VIEW(it));
3356 sd->s_iface->hold_set(ELM_WIDGET_DATA(sd)->obj, EINA_TRUE);
3357 sd->s_iface->bounce_allow_set
3358 (ELM_WIDGET_DATA(sd)->obj, EINA_FALSE, EINA_FALSE);
3360 EINA_LIST_FOREACH_SAFE(sd->selected, l, ll, it2)
3362 if (it != it2) _item_unselect(it2);
3365 // FIXME: difference from opensource
3366 if (it->item->items)
3368 EINA_LIST_FOREACH(it->item->items, l, it_tmp)
3370 if (elm_genlist_item_expanded_get((Elm_Object_Item *) it_tmp))
3372 elm_genlist_item_expanded_set((Elm_Object_Item *)it_tmp,
3374 return ECORE_CALLBACK_RENEW;
3379 if (elm_genlist_item_expanded_get((Elm_Object_Item *)it))
3381 elm_genlist_item_expanded_set((Elm_Object_Item *)it, EINA_FALSE);
3382 return ECORE_CALLBACK_RENEW;
3385 if (!GL_IT(it)->wsd->decorate_all_mode)
3386 edje_object_signal_emit
3387 (VIEW(it), "elm,state,reorder,enabled", "elm");
3390 return ECORE_CALLBACK_CANCEL;
3394 _swipe_do(Elm_Gen_Item *it)
3399 if ((it->select_mode == ELM_OBJECT_SELECT_MODE_DISPLAY_ONLY) ||
3400 elm_widget_item_disabled_get(it)) return;
3402 GL_IT(it)->wsd->swipe = EINA_FALSE;
3403 for (i = 0; i < GL_IT(it)->wsd->movements; i++)
3405 sum += GL_IT(it)->wsd->history[i].x;
3406 if (abs(GL_IT(it)->wsd->history[0].y -
3407 GL_IT(it)->wsd->history[i].y) > 10) return;
3410 sum /= GL_IT(it)->wsd->movements;
3411 if (abs(sum - GL_IT(it)->wsd->history[0].x) <= 10) return;
3412 evas_object_smart_callback_call(WIDGET(it), SIG_SWIPE, it);
3416 _swipe_cancel(void *data)
3418 Elm_Gen_Item *it = data;
3420 if (!it) return ECORE_CALLBACK_CANCEL;
3421 GL_IT(it)->wsd->swipe = EINA_FALSE;
3422 GL_IT(it)->wsd->movements = 0;
3424 return ECORE_CALLBACK_RENEW;
3428 _multi_cancel(void *data)
3430 Elm_Genlist_Smart_Data *sd = data;
3432 if (!sd) return ECORE_CALLBACK_CANCEL;
3433 sd->multi_timeout = EINA_TRUE;
3435 return ECORE_CALLBACK_RENEW;
3439 _multi_touch_gesture_eval(void *data)
3441 Elm_Gen_Item *it = data;
3442 Evas_Coord minw = 0, minh = 0;
3443 Evas_Coord off_x, off_y, off_mx, off_my;
3445 GL_IT(it)->wsd->multi_touched = EINA_FALSE;
3446 if (GL_IT(it)->wsd->multi_timer)
3448 ecore_timer_del(GL_IT(it)->wsd->multi_timer);
3449 GL_IT(it)->wsd->multi_timer = NULL;
3451 if (GL_IT(it)->wsd->multi_timeout)
3453 GL_IT(it)->wsd->multi_timeout = EINA_FALSE;
3457 elm_coords_finger_size_adjust(1, &minw, 1, &minh);
3458 off_x = abs(GL_IT(it)->wsd->cur_x - GL_IT(it)->wsd->prev_x);
3459 off_y = abs(GL_IT(it)->wsd->cur_y - GL_IT(it)->wsd->prev_y);
3460 off_mx = abs(GL_IT(it)->wsd->cur_mx - GL_IT(it)->wsd->prev_mx);
3461 off_my = abs(GL_IT(it)->wsd->cur_my - GL_IT(it)->wsd->prev_my);
3463 if (((off_x > minw) || (off_y > minh)) && ((off_mx > minw)
3464 || (off_my > minh)))
3466 if ((off_x + off_mx) > (off_y + off_my))
3468 if ((GL_IT(it)->wsd->cur_x > GL_IT(it)->wsd->prev_x)
3469 && (GL_IT(it)->wsd->cur_mx > GL_IT(it)->wsd->prev_mx))
3470 evas_object_smart_callback_call
3471 (WIDGET(it), SIG_MULTI_SWIPE_RIGHT, it);
3472 else if ((GL_IT(it)->wsd->cur_x < GL_IT(it)->wsd->prev_x)
3473 && (GL_IT(it)->wsd->cur_mx < GL_IT(it)->wsd->prev_mx))
3474 evas_object_smart_callback_call
3475 (WIDGET(it), SIG_MULTI_SWIPE_LEFT, it);
3476 else if (abs(GL_IT(it)->wsd->cur_x - GL_IT(it)->wsd->cur_mx) >
3477 abs(GL_IT(it)->wsd->prev_x - GL_IT(it)->wsd->prev_mx))
3478 evas_object_smart_callback_call
3479 (WIDGET(it), SIG_MULTI_PINCH_OUT, it);
3481 evas_object_smart_callback_call
3482 (WIDGET(it), SIG_MULTI_PINCH_IN, it);
3486 if ((GL_IT(it)->wsd->cur_y > GL_IT(it)->wsd->prev_y)
3487 && (GL_IT(it)->wsd->cur_my > GL_IT(it)->wsd->prev_my))
3488 evas_object_smart_callback_call
3489 (WIDGET(it), SIG_MULTI_SWIPE_DOWN, it);
3490 else if ((GL_IT(it)->wsd->cur_y < GL_IT(it)->wsd->prev_y)
3491 && (GL_IT(it)->wsd->cur_my < GL_IT(it)->wsd->prev_my))
3492 evas_object_smart_callback_call
3493 (WIDGET(it), SIG_MULTI_SWIPE_UP, it);
3494 else if (abs(GL_IT(it)->wsd->cur_y - GL_IT(it)->wsd->cur_my) >
3495 abs(GL_IT(it)->wsd->prev_y - GL_IT(it)->wsd->prev_my))
3497 evas_object_smart_callback_call
3498 (WIDGET(it), SIG_MULTI_PINCH_OUT, it);
3499 #if GENLIST_PINCH_ZOOM_SUPPORT
3500 if (IS_ROOT_PARENT_IT(it) && (GL_IT(it)->wsd->pinch_zoom_mode == ELM_GEN_PINCH_ZOOM_CONTRACT))
3502 elm_genlist_pinch_zoom_mode_set(ELM_WIDGET_DATA(GL_IT(it)->wsd)->obj, ELM_GEN_PINCH_ZOOM_EXPAND);
3503 elm_genlist_item_show((Elm_Object_Item *)it, ELM_GENLIST_ITEM_SCROLLTO_TOP);
3509 evas_object_smart_callback_call
3510 (WIDGET(it), SIG_MULTI_PINCH_IN, it);
3511 #if GENLIST_PINCH_ZOOM_SUPPORT
3512 elm_genlist_pinch_zoom_mode_set(ELM_WIDGET_DATA(GL_IT(it)->wsd)->obj,
3513 ELM_GEN_PINCH_ZOOM_CONTRACT);
3519 GL_IT(it)->wsd->multi_timeout = EINA_FALSE;
3523 _item_multi_down_cb(void *data,
3524 Evas *evas __UNUSED__,
3525 Evas_Object *obj __UNUSED__,
3528 Elm_Gen_Item *it = data;
3529 Evas_Event_Multi_Down *ev = event_info;
3531 if ((GL_IT(it)->wsd->multi_device != 0) || (GL_IT(it)->wsd->multi_touched)
3532 || (GL_IT(it)->wsd->multi_timeout))
3535 GL_IT(it)->wsd->multi_device = ev->device;
3536 GL_IT(it)->wsd->multi_down = EINA_TRUE;
3537 GL_IT(it)->wsd->multi_touched = EINA_TRUE;
3538 GL_IT(it)->wsd->prev_mx = ev->canvas.x;
3539 GL_IT(it)->wsd->prev_my = ev->canvas.y;
3541 if (!GL_IT(it)->wsd->wasselected)
3543 GL_IT(it)->wsd->wasselected = EINA_FALSE;
3547 ecore_timer_del(it->long_timer);
3548 it->long_timer = NULL;
3552 it->dragging = EINA_FALSE;
3553 evas_object_smart_callback_call(WIDGET(it), SIG_DRAG_STOP, it);
3555 if (it->item->swipe_timer)
3557 ecore_timer_del(it->item->swipe_timer);
3558 it->item->swipe_timer = NULL;
3560 GL_IT(it)->wsd->longpressed = EINA_FALSE;
3561 if (GL_IT(it)->wsd->on_hold)
3563 GL_IT(it)->wsd->swipe = EINA_FALSE;
3564 GL_IT(it)->wsd->movements = 0;
3565 GL_IT(it)->wsd->on_hold = EINA_FALSE;
3570 _item_multi_up_cb(void *data,
3571 Evas *evas __UNUSED__,
3572 Evas_Object *obj __UNUSED__,
3575 Elm_Gen_Item *it = data;
3576 Evas_Event_Multi_Up *ev = event_info;
3578 if (GL_IT(it)->wsd->multi_device != ev->device) return;
3579 GL_IT(it)->wsd->multi_device = 0;
3580 GL_IT(it)->wsd->multi_down = EINA_FALSE;
3581 if (GL_IT(it)->wsd->mouse_down) return;
3582 _multi_touch_gesture_eval(data);
3586 _item_multi_move_cb(void *data,
3587 Evas *evas __UNUSED__,
3588 Evas_Object *obj __UNUSED__,
3591 Elm_Gen_Item *it = data;
3592 Evas_Event_Multi_Move *ev = event_info;
3594 if (GL_IT(it)->wsd->multi_device != ev->device) return;
3595 GL_IT(it)->wsd->cur_mx = ev->cur.canvas.x;
3596 GL_IT(it)->wsd->cur_my = ev->cur.canvas.y;
3600 // FIXME: difference from upstream
3602 _item_unfocusable_set(Elm_Gen_Item *it, Eina_Bool unfocus)
3605 Evas_Object *item_obj;
3606 Evas_Object *obj = WIDGET(it);
3610 EINA_LIST_FOREACH(it->content_objs, l, item_obj)
3612 if (unfocus) elm_widget_focused_object_clear(item_obj);
3613 elm_widget_tree_unfocusable_set(item_obj, unfocus);
3615 EINA_LIST_FOREACH(it->item->flip_content_objs, l, item_obj)
3617 if (unfocus) elm_widget_focused_object_clear(item_obj);
3618 elm_widget_tree_unfocusable_set(item_obj, unfocus);
3620 EINA_LIST_FOREACH(it->item->deco_all_content_objs, l, item_obj)
3622 if (unfocus) elm_widget_focused_object_clear(item_obj);
3623 elm_widget_tree_unfocusable_set(item_obj, unfocus);
3625 it->can_focus = !unfocus;
3631 _item_mouse_down_cb(void *data,
3632 Evas *evas __UNUSED__,
3636 Evas_Event_Mouse_Down *ev = event_info;
3637 Elm_Gen_Item *it = data;
3638 Elm_Genlist_Smart_Data *sd = GL_IT(it)->wsd;
3641 if (ev->button != 1) return;
3643 _item_unfocusable_set(it, EINA_FALSE);
3645 it->down = EINA_TRUE;
3646 it->dragging = EINA_FALSE;
3647 evas_object_geometry_get(obj, &x, &y, NULL, NULL);
3648 it->dx = ev->canvas.x - x;
3649 it->dy = ev->canvas.y - y;
3650 sd->mouse_down = EINA_TRUE;
3651 if (!sd->multi_touched)
3653 sd->prev_x = ev->canvas.x;
3654 sd->prev_y = ev->canvas.y;
3655 sd->multi_timeout = EINA_FALSE;
3656 if (sd->multi_timer) ecore_timer_del(sd->multi_timer);
3657 sd->multi_timer = ecore_timer_add(1, _multi_cancel, sd);
3659 sd->longpressed = EINA_FALSE;
3660 if (ev->event_flags & EVAS_EVENT_FLAG_ON_HOLD)
3662 sd->on_hold = EINA_TRUE;
3665 else sd->on_hold = EINA_FALSE;
3666 _item_highlight(it);
3667 if (ev->flags & EVAS_BUTTON_DOUBLE_CLICK)
3668 if ((!elm_widget_item_disabled_get(it)) &&
3669 (it->select_mode != ELM_OBJECT_SELECT_MODE_DISPLAY_ONLY))
3671 evas_object_smart_callback_call(WIDGET(it), SIG_CLICKED_DOUBLE, it);
3672 evas_object_smart_callback_call(WIDGET(it), SIG_ACTIVATED, it);
3674 if (it->item->swipe_timer) ecore_timer_del(it->item->swipe_timer);
3675 it->item->swipe_timer = ecore_timer_add(0.4, _swipe_cancel, it);
3676 if (it->long_timer) ecore_timer_del(it->long_timer);
3678 it->long_timer = ecore_timer_add
3679 (sd->longpress_timeout, _long_press_cb, it);
3681 it->long_timer = NULL;
3682 sd->swipe = EINA_FALSE;
3687 _item_block_new(Elm_Genlist_Smart_Data *sd,
3692 itb = calloc(1, sizeof(Item_Block));
3693 if (!itb) return NULL;
3697 sd->blocks = eina_inlist_prepend(sd->blocks, EINA_INLIST_GET(itb));
3698 _item_block_position_update(sd->blocks, 0);
3702 sd->blocks = eina_inlist_append(sd->blocks, EINA_INLIST_GET(itb));
3703 itb->position_update = EINA_TRUE;
3704 if (sd->blocks != EINA_INLIST_GET(itb))
3707 ((Item_Block *)(EINA_INLIST_GET(itb)->prev))->position + 1;
3719 _item_block_add(Elm_Genlist_Smart_Data *sd,
3722 Item_Block *itb = NULL;
3729 itb = calloc(1, sizeof(Item_Block));
3730 if (!itb) return EINA_FALSE;
3732 if (!it->item->rel->item->block)
3735 eina_inlist_append(sd->blocks, EINA_INLIST_GET(itb));
3736 itb->items = eina_list_append(itb->items, it);
3737 itb->position_update = EINA_TRUE;
3738 it->position = eina_list_count(itb->items);
3739 it->position_update = EINA_TRUE;
3741 if (sd->blocks != EINA_INLIST_GET(itb))
3745 (EINA_INLIST_GET(itb)->prev))->position + 1;
3756 tmp = eina_list_data_find_list(itb->items, it->item->rel);
3757 if (it->item->before)
3759 sd->blocks = eina_inlist_prepend_relative
3760 (sd->blocks, EINA_INLIST_GET(itb),
3761 EINA_INLIST_GET(it->item->rel->item->block));
3763 eina_list_prepend_relative_list(itb->items, it, tmp);
3765 /* Update index from where we prepended */
3766 _item_position_update
3767 (eina_list_prev(tmp), it->item->rel->position);
3768 _item_block_position_update
3769 (EINA_INLIST_GET(itb),
3770 it->item->rel->item->block->position);
3774 sd->blocks = eina_inlist_append_relative
3775 (sd->blocks, EINA_INLIST_GET(itb),
3776 EINA_INLIST_GET(it->item->rel->item->block));
3778 eina_list_append_relative_list(itb->items, it, tmp);
3780 /* Update block index from where we appended */
3781 _item_position_update
3782 (eina_list_next(tmp), it->item->rel->position + 1);
3783 _item_block_position_update
3784 (EINA_INLIST_GET(itb),
3785 it->item->rel->item->block->position + 1);
3791 if (it->item->before)
3795 itb = (Item_Block *)(sd->blocks);
3796 if (itb->count >= sd->max_items_per_block)
3798 itb = _item_block_new(sd, EINA_TRUE);
3799 if (!itb) return EINA_FALSE;
3804 itb = _item_block_new(sd, EINA_TRUE);
3805 if (!itb) return EINA_FALSE;
3807 itb->items = eina_list_prepend(itb->items, it);
3809 _item_position_update(itb->items, 0);
3815 itb = (Item_Block *)(sd->blocks->last);
3816 if (itb->count >= sd->max_items_per_block)
3818 itb = _item_block_new(sd, EINA_FALSE);
3819 if (!itb) return EINA_FALSE;
3824 itb = _item_block_new(sd, EINA_FALSE);
3825 if (!itb) return EINA_FALSE;
3827 itb->items = eina_list_append(itb->items, it);
3828 it->position = eina_list_count(itb->items);
3836 if (it->item->rel->item->queued)
3838 /* NOTE: for a strange reason eina_list and eina_inlist
3839 don't have the same property on sorted insertion
3840 order, so the queue is not always ordered like the
3841 item list. This lead to issue where we depend on an
3842 item that is not yet created. As a quick work around,
3843 we reschedule the calc of the item and stop reordering
3844 the list to prevent any nasty issue to show up here.
3846 sd->queue = eina_list_append(sd->queue, it);
3847 sd->requeued = EINA_TRUE;
3848 it->item->queued = EINA_TRUE;
3852 itb = it->item->rel->item->block;
3853 if (!itb) goto newblock;
3854 tmp = eina_list_data_find_list(itb->items, it->item->rel);
3855 if (it->item->before)
3857 itb->items = eina_list_prepend_relative_list(itb->items, it, tmp);
3858 _item_position_update
3859 (eina_list_prev(tmp), it->item->rel->position);
3863 itb->items = eina_list_append_relative_list(itb->items, it, tmp);
3864 _item_position_update
3865 (eina_list_next(tmp), it->item->rel->position + 1);
3870 itb->changed = EINA_TRUE;
3871 it->item->block = itb;
3872 if (itb->sd->calc_job) ecore_job_del(itb->sd->calc_job);
3873 itb->sd->calc_job = ecore_job_add(_calc_job, itb->sd);
3877 it->item->rel->relcount--;
3878 // FIXME: relcount should be removed.
3879 if (((Elm_Widget_Item *)it->item->rel)->on_deletion &&
3880 (!it->item->rel->relcount))
3882 elm_widget_item_del(it->item->rel);
3884 it->item->rel = NULL;
3887 if (itb->count > itb->sd->max_items_per_block)
3892 Eina_Bool done = EINA_FALSE;
3894 newc = itb->count / 2;
3896 if (EINA_INLIST_GET(itb)->prev)
3898 Item_Block *itbp = (Item_Block *)(EINA_INLIST_GET(itb)->prev);
3900 if (itbp->count + newc < sd->max_items_per_block / 2)
3902 /* moving items to previous block */
3903 while ((itb->count > newc) && (itb->items))
3905 it2 = eina_list_data_get(itb->items);
3906 itb->items = eina_list_remove_list
3907 (itb->items, itb->items);
3910 itbp->items = eina_list_append(itbp->items, it2);
3911 it2->item->block = itbp;
3919 if (!done && EINA_INLIST_GET(itb)->next)
3921 Item_Block *itbn = (Item_Block *)(EINA_INLIST_GET(itb)->next);
3923 if (itbn->count + newc < sd->max_items_per_block / 2)
3925 /* moving items to next block */
3926 while ((itb->count > newc) && (itb->items))
3930 l = eina_list_last(itb->items);
3931 it2 = eina_list_data_get(l);
3932 itb->items = eina_list_remove_list(itb->items, l);
3935 itbn->items = eina_list_prepend(itbn->items, it2);
3936 it2->item->block = itbn;
3946 /* moving items to new block */
3947 itb2 = calloc(1, sizeof(Item_Block));
3948 if (!itb2) return EINA_FALSE;
3951 eina_inlist_append_relative(sd->blocks, EINA_INLIST_GET(itb2),
3952 EINA_INLIST_GET(itb));
3953 itb2->changed = EINA_TRUE;
3954 while ((itb->count > newc) && (itb->items))
3958 l = eina_list_last(itb->items);
3960 itb->items = eina_list_remove_list(itb->items, l);
3963 itb2->items = eina_list_prepend(itb2->items, it2);
3964 it2->item->block = itb2;
3974 _item_process(Elm_Genlist_Smart_Data *sd,
3977 if (!_item_block_add(sd, it)) return 1;
3979 _item_block_realize(it->item->block);
3985 _item_process_post(Elm_Genlist_Smart_Data *sd,
3989 Eina_Bool show_me = EINA_FALSE;
3991 if (it->item->block->changed)
3993 show_me = _item_block_recalc
3994 (it->item->block, it->item->block->num, qadd);
3995 it->item->block->changed = 0;
3996 if (sd->pan_changed)
3998 if (sd->calc_job) ecore_job_del(sd->calc_job);
3999 sd->calc_job = NULL;
4001 sd->pan_changed = EINA_FALSE;
4004 if (show_me) it->item->block->show_me = EINA_TRUE;
4006 /* when prepending, move the scroller along with the first selected
4007 * item to create the illusion that we're watching the selected
4008 * item this prevents the selected item being scrolled off the
4011 if (sd->selected && it->item->before)
4016 it2 = sd->selected->data;
4017 if (!it2->item->block) return;
4018 sd->s_iface->content_pos_get(ELM_WIDGET_DATA(sd)->obj, NULL, &y);
4019 evas_object_geometry_get(sd->pan_obj, NULL, NULL, NULL, &h);
4020 if ((it->y + it->item->block->y > y + h) ||
4021 (it->y + it->item->block->y + it->item->h < y))
4022 /* offscreen, just update */
4023 sd->s_iface->content_region_show
4024 (ELM_WIDGET_DATA(sd)->obj, it2->x + it2->item->block->x, y,
4025 it2->item->block->w, h);
4027 sd->s_iface->content_region_show
4028 (ELM_WIDGET_DATA(sd)->obj, it->x + it->item->block->x,
4029 y + it->item->h, it->item->block->w, h);
4034 _queue_process(Elm_Genlist_Smart_Data *sd)
4039 t0 = ecore_loop_time_get();
4040 for (n = 0; (sd->queue) && (n < 128); n++)
4044 it = eina_list_data_get(sd->queue);
4045 sd->queue = eina_list_remove_list(sd->queue, sd->queue);
4046 it->item->queued = EINA_FALSE;
4047 if (_item_process(sd, it)) continue;
4048 t = ecore_time_get();
4049 _item_process_post(sd, it, EINA_TRUE);
4050 /* same as eina_inlist_count > 1 */
4051 if (sd->blocks && sd->blocks->next)
4053 if ((t - t0) > (ecore_animator_frametime_get())) break;
4060 _idle_process(void *data,
4063 Elm_Genlist_Smart_Data *sd = data;
4065 if (_queue_process(sd) > 0) *wakeup = EINA_TRUE;
4068 return ECORE_CALLBACK_CANCEL;
4070 #if GENLIST_FX_SUPPORT
4071 if (sd->fx_first_captured)
4072 _elm_genlist_fx_clear(ELM_WIDGET_DATA(sd)->obj);
4074 return ECORE_CALLBACK_RENEW;
4078 _item_idle_enterer(void *data)
4080 Eina_Bool wakeup = EINA_FALSE;
4081 Elm_Genlist_Smart_Data *sd = data;
4082 Eina_Bool ok = _idle_process(data, &wakeup);
4087 if (sd->calc_job) ecore_job_del(sd->calc_job);
4088 sd->calc_job = ecore_job_add(_calc_job, sd);
4090 if (ok == ECORE_CALLBACK_CANCEL) sd->queue_idle_enterer = NULL;
4096 _item_queue(Elm_Genlist_Smart_Data *sd,
4100 if (it->item->queued) return;
4101 it->item->queued = EINA_TRUE;
4102 if (cb && !sd->requeued)
4103 sd->queue = eina_list_sorted_insert(sd->queue, cb, it);
4105 sd->queue = eina_list_append(sd->queue, it);
4106 // FIXME: why does a freeze then thaw here cause some genlist
4107 // elm_genlist_item_append() to be much much slower?
4108 // evas_event_freeze(evas_object_evas_get(sd->obj));
4109 while ((sd->queue) && ((!sd->blocks) || (!sd->blocks->next)))
4111 if (sd->queue_idle_enterer)
4113 ecore_idle_enterer_del(sd->queue_idle_enterer);
4114 sd->queue_idle_enterer = NULL;
4118 while ((sd->queue) && (sd->blocks) &&
4119 (sd->homogeneous) && (sd->mode == ELM_LIST_COMPRESS))
4121 if (sd->queue_idle_enterer)
4123 ecore_idle_enterer_del(sd->queue_idle_enterer);
4124 sd->queue_idle_enterer = NULL;
4129 // evas_event_thaw(evas_object_evas_get(sd->obj));
4130 // evas_event_thaw_eval(evas_object_evas_get(sd->obj));
4131 if (!sd->queue_idle_enterer)
4132 sd->queue_idle_enterer = ecore_idle_enterer_add(_item_idle_enterer, sd);
4135 /* If the application wants to know the relative item, use
4136 * elm_genlist_item_prev_get(it)*/
4138 _item_move_after(Elm_Gen_Item *it,
4139 Elm_Gen_Item *after)
4143 if (it == after) return;
4145 GL_IT(it)->wsd->items =
4146 eina_inlist_remove(GL_IT(it)->wsd->items, EINA_INLIST_GET(it));
4147 if (it->item->block) _item_block_del(it);
4149 GL_IT(it)->wsd->items = eina_inlist_append_relative
4150 (GL_IT(it)->wsd->items, EINA_INLIST_GET(it), EINA_INLIST_GET(after));
4151 it->item->rel = after;
4152 after->item->rel_revs = eina_list_append(after->item->rel_revs, it);
4153 it->item->before = EINA_FALSE;
4154 if (after->item->group_item) it->item->group_item = after->item->group_item;
4155 _item_queue(GL_IT(it)->wsd, it, NULL);
4157 evas_object_smart_callback_call(WIDGET(it), SIG_MOVED_AFTER, it);
4161 _access_activate_cb(void *data __UNUSED__,
4162 Evas_Object *part_obj __UNUSED__,
4163 Elm_Object_Item *item)
4165 _item_select_unselect((Elm_Gen_Item *)item, EINA_TRUE);
4168 /* If the application wants to know the relative item, use
4169 * elm_genlist_item_next_get(it)*/
4171 _item_move_before(Elm_Gen_Item *it,
4172 Elm_Gen_Item *before)
4175 if (!before) return;
4176 if (it == before) return;
4178 GL_IT(it)->wsd->items =
4179 eina_inlist_remove(GL_IT(it)->wsd->items, EINA_INLIST_GET(it));
4180 if (it->item->block) _item_block_del(it);
4181 GL_IT(it)->wsd->items = eina_inlist_prepend_relative
4182 (GL_IT(it)->wsd->items, EINA_INLIST_GET(it), EINA_INLIST_GET(before));
4183 it->item->rel = before;
4184 before->item->rel_revs = eina_list_append(before->item->rel_revs, it);
4185 it->item->before = EINA_TRUE;
4186 if (before->item->group_item)
4187 it->item->group_item = before->item->group_item;
4188 _item_queue(GL_IT(it)->wsd, it, NULL);
4190 evas_object_smart_callback_call(WIDGET(it), SIG_MOVED_BEFORE, it);
4194 _item_mouse_up_cb(void *data,
4195 Evas *evas __UNUSED__,
4196 Evas_Object *obj __UNUSED__,
4199 Evas_Event_Mouse_Up *ev = event_info;
4200 Eina_Bool dragged = EINA_FALSE;
4201 Elm_Genlist_Smart_Data *sd;
4202 Elm_Gen_Item *it = data;
4204 if (ev->button != 1) return;
4205 it->down = EINA_FALSE;
4206 sd = GL_IT(it)->wsd;
4208 sd->mouse_down = EINA_FALSE;
4209 if (sd->multi_touched)
4211 if ((!sd->multi) && (!it->selected) && (it->highlighted))
4212 _item_unhighlight(it);
4213 if (sd->multi_down) return;
4214 _multi_touch_gesture_eval(data);
4219 ecore_timer_del(it->long_timer);
4220 it->long_timer = NULL;
4224 it->dragging = EINA_FALSE;
4225 evas_object_smart_callback_call(WIDGET(it), SIG_DRAG_STOP, it);
4228 if (it->item->swipe_timer)
4230 ecore_timer_del(it->item->swipe_timer);
4231 it->item->swipe_timer = NULL;
4233 if (sd->multi_timer)
4235 ecore_timer_del(sd->multi_timer);
4236 sd->multi_timer = NULL;
4237 sd->multi_timeout = EINA_FALSE;
4239 sd->on_hold = EINA_FALSE;
4240 if (ev->event_flags & EVAS_EVENT_FLAG_ON_HOLD)
4242 if (sd->swipe) _swipe_do(data);
4243 sd->longpressed = EINA_FALSE;
4246 if ((sd->reorder_mode) && (sd->reorder_it))
4248 Evas_Coord it_scrl_y = ev->canvas.y - sd->reorder_it->dy;
4249 sd->reorder_fast = 0;
4251 if (sd->reorder_rel &&
4252 (sd->reorder_it->parent == sd->reorder_rel->parent))
4254 if (it_scrl_y <= sd->reorder_rel->item->scrl_y)
4255 _item_move_before(sd->reorder_it, sd->reorder_rel);
4257 _item_move_after(sd->reorder_it, sd->reorder_rel);
4258 evas_object_smart_callback_call(WIDGET(it), SIG_MOVED, it);
4262 if (sd->calc_job) ecore_job_del(sd->calc_job);
4263 sd->calc_job = ecore_job_add(_calc_job, sd);
4265 edje_object_signal_emit(VIEW(it), "elm,state,reorder,disabled", "elm");
4266 sd->reorder_it = sd->reorder_rel = NULL;
4267 sd->s_iface->hold_set(ELM_WIDGET_DATA(sd)->obj, EINA_FALSE);
4268 sd->s_iface->bounce_allow_set
4269 (ELM_WIDGET_DATA(sd)->obj, sd->h_bounce, sd->v_bounce);
4273 if (it->want_unrealize && !(it->item->unrealize_disabled))
4275 _item_unrealize(it, EINA_FALSE);
4276 if (it->item->block->want_unrealize)
4277 _item_block_unrealize(it->item->block);
4282 if (!sd->longpressed)
4283 if ((sd->select_mode == ELM_OBJECT_SELECT_MODE_ALWAYS) ||
4284 (it->select_mode == ELM_OBJECT_SELECT_MODE_ALWAYS))
4285 _item_select_unselect(it, EINA_TRUE);
4286 else _item_select_unselect(it, !it->selected);
4288 _item_unhighlight(it);
4292 _item_mouse_callbacks_add(Elm_Gen_Item *it,
4295 evas_object_event_callback_add
4296 (view, EVAS_CALLBACK_MOUSE_DOWN, _item_mouse_down_cb, it);
4297 evas_object_event_callback_add
4298 (view, EVAS_CALLBACK_MOUSE_UP, _item_mouse_up_cb, it);
4299 evas_object_event_callback_add
4300 (view, EVAS_CALLBACK_MOUSE_MOVE, _item_mouse_move_cb, it);
4301 evas_object_event_callback_add
4302 (view, EVAS_CALLBACK_MULTI_DOWN, _item_multi_down_cb, it);
4303 evas_object_event_callback_add
4304 (view, EVAS_CALLBACK_MULTI_UP, _item_multi_up_cb, it);
4305 evas_object_event_callback_add
4306 (view, EVAS_CALLBACK_MULTI_MOVE, _item_multi_move_cb, it);
4310 _item_mouse_callbacks_del(Elm_Gen_Item *it,
4313 evas_object_event_callback_del_full
4314 (view, EVAS_CALLBACK_MOUSE_DOWN, _item_mouse_down_cb, it);
4315 evas_object_event_callback_del_full
4316 (view, EVAS_CALLBACK_MOUSE_UP, _item_mouse_up_cb, it);
4317 evas_object_event_callback_del_full
4318 (view, EVAS_CALLBACK_MOUSE_MOVE, _item_mouse_move_cb, it);
4319 evas_object_event_callback_del_full
4320 (view, EVAS_CALLBACK_MULTI_DOWN, _item_multi_down_cb, it);
4321 evas_object_event_callback_del_full
4322 (view, EVAS_CALLBACK_MULTI_UP, _item_multi_up_cb, it);
4323 evas_object_event_callback_del_full
4324 (view, EVAS_CALLBACK_MULTI_MOVE, _item_multi_move_cb, it);
4328 _scroll_hold_timer_cb(void *data)
4330 Elm_Genlist_Smart_Data *sd = data;
4332 if (!data) return ECORE_CALLBACK_CANCEL;
4334 sd->s_iface->hold_set(ELM_WIDGET_DATA(sd)->obj, EINA_FALSE);
4335 sd->scr_hold_timer = NULL;
4337 return ECORE_CALLBACK_CANCEL;
4341 _decorate_item_finished_signal_cb(void *data,
4343 const char *emission __UNUSED__,
4344 const char *source __UNUSED__)
4346 Elm_Gen_Item *it = data;
4349 if (!data || !obj) return;
4350 if ((!it->realized) || (!it->item->deco_it_view)) return;
4352 it->item->nocache_once = EINA_FALSE;
4353 _decorate_item_unrealize(it);
4354 if (it->item->group_item)
4355 evas_object_raise(it->item->VIEW(group_item));
4357 snprintf(buf, sizeof(buf), "elm,state,%s,passive,finished",
4358 GL_IT(it)->wsd->decorate_it_type);
4359 edje_object_signal_callback_del_full
4360 (obj, buf, "elm", _decorate_item_finished_signal_cb, it);
4364 _item_mode_content_unrealize(Elm_Gen_Item *it,
4365 Evas_Object *target,
4368 Eina_List **contents_list)
4370 Eina_List *res = *contents_list;
4372 if (it->itc->func.content_get)
4376 Evas_Object *ic = NULL;
4378 EINA_LIST_FOREACH(*source, l, key)
4380 if (parts && fnmatch(parts, key, FNM_PERIOD))
4383 ic = edje_object_part_swallow_get(target, key);
4386 res = eina_list_remove(res, ic);
4387 edje_object_part_unswallow(target, ic);
4388 evas_object_del(ic);
4397 _item_content_unrealize(Elm_Gen_Item *it,
4398 Evas_Object *target,
4402 Eina_List *res = it->content_objs;
4404 if (it->itc->func.content_get)
4408 Evas_Object *ic = NULL;
4410 EINA_LIST_FOREACH(*source, l, key)
4412 if (parts && fnmatch(parts, key, FNM_PERIOD))
4415 ic = edje_object_part_swallow_get(target, key);
4418 res = eina_list_remove(res, ic);
4419 edje_object_part_unswallow(target, ic);
4420 // FIXME: If parent-child relationship was broken before 'ic'
4421 // is deleted, freeze_pop will not be called. ex) elm_slider
4422 // If layout is used instead of edje, this problme can be
4424 if (0 != elm_widget_scroll_freeze_get(ic))
4425 elm_widget_scroll_freeze_pop(ic);
4426 evas_object_del(ic);
4435 _item_block_recalc(Item_Block *itb,
4439 const Eina_List *l, *ll;
4441 Evas_Coord minw = 0, minh = 0;
4442 Eina_Bool show_me = EINA_FALSE, changed = EINA_FALSE;
4446 EINA_LIST_FOREACH_SAFE(itb->items, l, ll, it)
4448 show_me |= it->item->show_me;
4453 if (!it->item->mincalcd) changed = EINA_TRUE;
4456 _item_realize(it, in, EINA_TRUE);
4457 _item_unrealize(it, EINA_TRUE);
4462 if ((itb->sd->homogeneous) &&
4463 (itb->sd->mode == ELM_LIST_COMPRESS))
4467 it->item->w = it->item->minw =
4468 GL_IT(it)->wsd->group_item_width;
4469 it->item->h = it->item->minh =
4470 GL_IT(it)->wsd->group_item_height;
4474 it->item->w = it->item->minw =
4475 GL_IT(it)->wsd->item_width;
4476 it->item->h = it->item->minh =
4477 GL_IT(it)->wsd->item_height;
4482 _item_realize(it, in, EINA_TRUE);
4483 _item_unrealize(it, EINA_TRUE);
4489 if (!it->item->mincalcd) changed = EINA_TRUE;
4490 _item_realize(it, in, EINA_FALSE);
4492 minh += it->item->minh;
4493 if (minw < it->item->minw) minw = it->item->minw;
4497 #if GENLIST_PINCH_ZOOM_SUPPORT
4498 if (IS_ROOT_PARENT_IT(it))
4499 it->item->pan_scrl_y = itb->y + it->y;
4503 if (changed) itb->sd->pan_changed = changed;
4506 itb->changed = EINA_FALSE;
4507 itb->position_update = EINA_FALSE;
4513 _update_job(void *data)
4515 Eina_Bool position = EINA_FALSE, recalc = EINA_FALSE;
4516 Elm_Genlist_Smart_Data *sd = data;
4521 sd->update_job = NULL;
4524 //evas_event_freeze(evas_object_evas_get(ELM_WIDGET_DATA(sd)->obj));
4525 EINA_INLIST_FOREACH(sd->blocks, itb)
4527 Evas_Coord itminw, itminh;
4534 _item_block_position(itb, num);
4538 recalc = EINA_FALSE;
4539 EINA_LIST_FOREACH(itb->items, l2, it)
4541 if (it->item->updateme)
4543 itminw = it->item->minw;
4544 itminh = it->item->minh;
4546 it->item->updateme = EINA_FALSE;
4549 _item_unrealize(it, EINA_FALSE);
4550 _item_realize(it, num, EINA_FALSE);
4551 position = EINA_TRUE;
4555 _item_realize(it, num, EINA_TRUE);
4556 _item_unrealize(it, EINA_TRUE);
4558 if ((it->item->minw != itminw) || (it->item->minh != itminh))
4563 itb->updateme = EINA_FALSE;
4566 position = EINA_TRUE;
4567 itb->changed = EINA_TRUE;
4568 _item_block_recalc(itb, num0, EINA_FALSE);
4569 _item_block_position(itb, num0);
4574 if (sd->calc_job) ecore_job_del(sd->calc_job);
4575 sd->calc_job = ecore_job_add(_calc_job, sd);
4577 //evas_event_thaw(evas_object_evas_get(ELM_WIDGET_DATA(sd)->obj));
4578 //evas_event_thaw_eval(evas_object_evas_get(ELM_WIDGET_DATA(sd)->obj));
4582 _scroll_animate_start_cb(Evas_Object *obj,
4583 void *data __UNUSED__)
4585 evas_object_smart_callback_call(obj, SIG_SCROLL_ANIM_START, NULL);
4589 _scroll_animate_stop_cb(Evas_Object *obj,
4590 void *data __UNUSED__)
4592 evas_object_smart_callback_call(obj, SIG_SCROLL_ANIM_STOP, NULL);
4596 _scroll_drag_start_cb(Evas_Object *obj,
4597 void *data __UNUSED__)
4599 evas_object_smart_callback_call(obj, SIG_SCROLL_DRAG_START, NULL);
4603 _scroll_drag_stop_cb(Evas_Object *obj,
4604 void *data __UNUSED__)
4606 evas_object_smart_callback_call(obj, SIG_SCROLL_DRAG_STOP, NULL);
4610 _edge_left_cb(Evas_Object *obj,
4611 void *data __UNUSED__)
4613 evas_object_smart_callback_call(obj, SIG_EDGE_LEFT, NULL);
4617 _edge_right_cb(Evas_Object *obj,
4618 void *data __UNUSED__)
4620 evas_object_smart_callback_call(obj, SIG_EDGE_RIGHT, NULL);
4624 _edge_top_cb(Evas_Object *obj,
4625 void *data __UNUSED__)
4627 evas_object_smart_callback_call(obj, SIG_EDGE_TOP, NULL);
4631 _edge_bottom_cb(Evas_Object *obj,
4632 void *data __UNUSED__)
4634 evas_object_smart_callback_call(obj, SIG_EDGE_BOTTOM, NULL);
4638 _vbar_drag_cb(Evas_Object *obj,
4639 void *data __UNUSED__)
4641 evas_object_smart_callback_call(obj, SIG_VBAR_DRAG, NULL);
4645 _vbar_press_cb(Evas_Object *obj,
4646 void *data __UNUSED__)
4648 evas_object_smart_callback_call(obj, SIG_VBAR_PRESS, NULL);
4652 _vbar_unpress_cb(Evas_Object *obj,
4653 void *data __UNUSED__)
4655 evas_object_smart_callback_call(obj, SIG_VBAR_UNPRESS, NULL);
4659 _hbar_drag_cb(Evas_Object *obj,
4660 void *data __UNUSED__)
4662 evas_object_smart_callback_call(obj, SIG_HBAR_DRAG, NULL);
4666 _hbar_press_cb(Evas_Object *obj,
4667 void *data __UNUSED__)
4669 evas_object_smart_callback_call(obj, SIG_HBAR_PRESS, NULL);
4673 _hbar_unpress_cb(Evas_Object *obj,
4674 void *data __UNUSED__)
4676 evas_object_smart_callback_call(obj, SIG_HBAR_UNPRESS, NULL);
4680 _decorate_item_realize(Elm_Gen_Item *it)
4683 if (it->item->deco_it_view) return;
4685 //evas_event_freeze(evas_object_evas_get(obj));
4686 it->item->deco_it_view = edje_object_add(evas_object_evas_get(WIDGET(it)));
4687 edje_object_scale_set
4688 (it->item->deco_it_view, elm_widget_scale_get(WIDGET(it)) *
4689 elm_config_scale_get());
4690 evas_object_smart_member_add
4691 (it->item->deco_it_view, GL_IT(it)->wsd->pan_obj);
4692 elm_widget_sub_object_add(WIDGET(it), it->item->deco_it_view);
4694 strncpy(buf, "item", sizeof(buf));
4695 if (GL_IT(it)->wsd->mode == ELM_LIST_COMPRESS)
4696 strncat(buf, "_compress", sizeof(buf) - strlen(buf));
4698 if (it->item->order_num_in & 0x1)
4699 strncat(buf, "_odd", sizeof(buf) - strlen(buf));
4700 strncat(buf, "/", sizeof(buf) - strlen(buf));
4701 strncat(buf, it->itc->decorate_item_style, sizeof(buf) - strlen(buf));
4703 elm_widget_theme_object_set
4704 (WIDGET(it), it->item->deco_it_view, "genlist", buf,
4705 elm_widget_style_get(WIDGET(it)));
4706 edje_object_mirrored_set
4707 (it->item->deco_it_view, elm_widget_mirrored_get(WIDGET(it)));
4709 /* signal callback add */
4710 evas_object_event_callback_add
4711 (it->item->deco_it_view, EVAS_CALLBACK_MOUSE_DOWN, _item_mouse_down_cb,
4713 evas_object_event_callback_add
4714 (it->item->deco_it_view, EVAS_CALLBACK_MOUSE_UP, _item_mouse_up_cb, it);
4715 evas_object_event_callback_add
4716 (it->item->deco_it_view, EVAS_CALLBACK_MOUSE_MOVE, _item_mouse_move_cb,
4719 if (eina_list_count(it->item->deco_it_content_objs) != 0)
4720 ERR_ABORT("If you see this error, please notify us and we"
4723 /* text_get, content_get, state_get */
4725 (it, it->item->deco_it_view, &it->item->deco_it_texts, NULL);
4726 if (!it->item->deco_it_contents)
4727 it->item->deco_it_contents =
4728 elm_widget_stringlist_get
4729 (edje_object_data_get(it->item->deco_it_view, "contents"));
4730 it->item->deco_it_content_objs =
4731 _item_mode_content_realize
4732 (it, it->item->deco_it_view, &it->item->deco_it_contents, NULL,
4733 &it->item->deco_it_content_objs);
4735 (it, it->item->deco_it_view, &it->item->deco_it_states, NULL);
4736 edje_object_part_swallow
4737 (it->item->deco_it_view,
4738 edje_object_data_get(it->item->deco_it_view, "mode_part"), VIEW(it));
4740 it->want_unrealize = EINA_FALSE;
4741 //evas_event_thaw(evas_object_evas_get(obj));
4742 //evas_event_thaw_eval(evas_object_evas_get(obj));
4746 _decorate_item_set(Elm_Gen_Item *it)
4748 Elm_Genlist_Smart_Data *sd;
4753 sd = GL_IT(it)->wsd;
4756 it->item->nocache_once = EINA_TRUE;
4758 if (sd->scr_hold_timer)
4760 ecore_timer_del(sd->scr_hold_timer);
4761 sd->scr_hold_timer = NULL;
4763 sd->s_iface->hold_set(ELM_WIDGET_DATA(sd)->obj, EINA_TRUE);
4764 sd->scr_hold_timer = ecore_timer_add(0.1, _scroll_hold_timer_cb, sd);
4766 //evas_event_freeze(evas_object_evas_get(ELM_WIDGET_DATA(sd)->obj));
4767 _decorate_item_realize(it);
4768 if (it->item->group_item)
4769 evas_object_raise(it->item->VIEW(group_item));
4771 (it, it->item->deco_it_view, it->item->scrl_x, it->item->scrl_y);
4772 //evas_event_thaw(evas_object_evas_get(ELM_WIDGET_DATA(sd)->obj));
4773 //evas_event_thaw_eval(evas_object_evas_get(ELM_WIDGET_DATA(sd)->obj));
4775 snprintf(buf, sizeof(buf), "elm,state,%s,active", sd->decorate_it_type);
4776 edje_object_signal_emit(it->item->deco_it_view, buf, "elm");
4780 _decorate_item_unset(Elm_Genlist_Smart_Data *sd)
4782 char buf[1024], buf2[1024];
4785 if (!sd->mode_item) return;
4788 it->item->nocache_once = EINA_TRUE;
4790 snprintf(buf, sizeof(buf), "elm,state,%s,passive", sd->decorate_it_type);
4791 snprintf(buf2, sizeof(buf2), "elm,state,%s,passive,finished",
4792 sd->decorate_it_type);
4793 edje_object_signal_emit(it->item->deco_it_view, buf, "elm");
4794 edje_object_signal_callback_add
4795 (it->item->deco_it_view, buf2, "elm", _decorate_item_finished_signal_cb,
4797 sd->mode_item = NULL;
4801 // FIXME: difference from upstream
4803 _mouse_down_scroller(void *data,
4804 Evas *evas __UNUSED__,
4805 Evas_Object *obj __UNUSED__,
4806 void *event_info __UNUSED__)
4808 Widget_Data *wd = elm_widget_data_get(data);
4811 wd->drag_started = EINA_FALSE;
4815 _mouse_up_scroller(void *data,
4816 Evas *evas __UNUSED__,
4817 Evas_Object *obj __UNUSED__,
4818 void *event_info __UNUSED__)
4820 Widget_Data *wd = elm_widget_data_get(data);
4823 wd->drag_started = EINA_FALSE;
4827 _mouse_move_scroller(void *data,
4828 Evas *evas __UNUSED__,
4829 Evas_Object *obj __UNUSED__,
4832 Widget_Data *wd = elm_widget_data_get(data);
4833 Evas_Event_Mouse_Move *ev = event_info;
4834 Evas_Coord minw = 0, minh = 0, dx, dy, adx, ady;
4837 if (wd->drag_started) return;
4839 elm_coords_finger_size_adjust(1, &minw, 1, &minh);
4840 dx = ev->cur.canvas.x - ev->prev.canvas.x;
4841 dy = ev->cur.canvas.y - ev->prev.canvas.y;
4844 if (adx < 0) adx = -dx;
4845 if (ady < 0) ady = -dy;
4846 if (((ady < minh) && (ady > minh / 2)) && (ady > adx))
4850 evas_object_smart_callback_call(data, SIG_DRAG_START_UP, NULL);
4851 wd->drag_started = EINA_TRUE;
4855 evas_object_smart_callback_call(data, SIG_DRAG_START_DOWN, NULL);
4856 wd->drag_started = EINA_TRUE;
4863 _elm_genlist_smart_add(Evas_Object *obj)
4865 Evas_Coord minw, minh;
4866 Elm_Genlist_Pan_Smart_Data *pan_data;
4868 EVAS_SMART_DATA_ALLOC(obj, Elm_Genlist_Smart_Data);
4870 ELM_WIDGET_CLASS(_elm_genlist_parent_sc)->base.add(obj);
4872 priv->hit_rect = evas_object_rectangle_add(evas_object_evas_get(obj));
4873 evas_object_smart_member_add(priv->hit_rect, obj);
4874 elm_widget_sub_object_add(obj, priv->hit_rect);
4876 /* common scroller hit rectangle setup */
4877 evas_object_color_set(priv->hit_rect, 0, 0, 0, 0);
4878 evas_object_show(priv->hit_rect);
4879 evas_object_repeat_events_set(priv->hit_rect, EINA_TRUE);
4881 elm_widget_can_focus_set(obj, EINA_TRUE);
4882 elm_widget_on_show_region_hook_set(obj, _show_region_hook, obj);
4884 elm_layout_theme_set(obj, "genlist", "base", elm_widget_style_get(obj));
4886 /* interface's add() routine issued AFTER the object's smart_add() */
4887 priv->s_iface = evas_object_smart_interface_get
4888 (obj, ELM_SCROLLABLE_IFACE_NAME);
4890 priv->s_iface->objects_set
4891 (obj, ELM_WIDGET_DATA(priv)->resize_obj, priv->hit_rect);
4893 priv->s_iface->bounce_allow_set
4894 (obj, EINA_FALSE, _elm_config->thumbscroll_bounce_enable);
4895 priv->v_bounce = _elm_config->thumbscroll_bounce_enable;
4897 priv->s_iface->animate_start_cb_set(obj, _scroll_animate_start_cb);
4898 priv->s_iface->animate_stop_cb_set(obj, _scroll_animate_stop_cb);
4899 priv->s_iface->drag_start_cb_set(obj, _scroll_drag_start_cb);
4900 priv->s_iface->drag_stop_cb_set(obj, _scroll_drag_stop_cb);
4901 priv->s_iface->edge_left_cb_set(obj, _edge_left_cb);
4902 priv->s_iface->edge_right_cb_set(obj, _edge_right_cb);
4903 priv->s_iface->edge_top_cb_set(obj, _edge_top_cb);
4904 priv->s_iface->edge_bottom_cb_set(obj, _edge_bottom_cb);
4905 priv->s_iface->vbar_drag_cb_set(obj, _vbar_drag_cb);
4906 priv->s_iface->vbar_press_cb_set(obj, _vbar_press_cb);
4907 priv->s_iface->vbar_unpress_cb_set(obj, _vbar_unpress_cb);
4908 priv->s_iface->hbar_drag_cb_set(obj, _hbar_drag_cb);
4909 priv->s_iface->hbar_press_cb_set(obj, _hbar_press_cb);
4910 priv->s_iface->hbar_unpress_cb_set(obj, _hbar_unpress_cb);
4912 priv->mode = ELM_LIST_SCROLL;
4913 priv->max_items_per_block = MAX_ITEMS_PER_BLOCK;
4914 priv->item_cache_max = priv->max_items_per_block * 2;
4915 priv->longpress_timeout = _elm_config->longpress_timeout;
4916 priv->highlight = EINA_TRUE;
4918 #if GENLIST_FX_SUPPORT
4919 priv->fx_mode = EINA_FALSE;
4920 priv->rendered = EINA_FALSE;
4921 priv->fx_first_captured = EINA_FALSE;
4922 priv->fx_playing = EINA_FALSE;
4923 priv->fx_items_deleted = EINA_FALSE;
4924 priv->genlist_clearing = EINA_FALSE;
4927 priv->pan_obj = evas_object_smart_add
4928 (evas_object_evas_get(obj), _elm_genlist_pan_smart_class_new());
4929 pan_data = evas_object_smart_data_get(priv->pan_obj);
4930 pan_data->wsd = priv;
4933 // FIXME: difference from upstream
4934 evas_object_event_callback_add(pan_obj, EVAS_CALLBACK_MOUSE_DOWN,
4935 _mouse_down_scroller, obj);
4936 evas_object_event_callback_add(pan_obj, EVAS_CALLBACK_MOUSE_UP,
4937 _mouse_up_scroller, obj);
4938 evas_object_event_callback_add(pan_obj, EVAS_CALLBACK_MOUSE_MOVE,
4939 _mouse_move_scroller, obj);
4942 priv->s_iface->extern_pan_set(obj, priv->pan_obj);
4944 edje_object_size_min_calc(ELM_WIDGET_DATA(priv)->resize_obj, &minw, &minh);
4945 evas_object_size_hint_min_set(obj, minw, minh);
4947 _item_cache_all_free(priv);
4948 _mirrored_set(obj, elm_widget_mirrored_get(obj));
4950 elm_layout_sizing_eval(obj);
4954 _elm_genlist_smart_del(Evas_Object *obj)
4956 ELM_GENLIST_DATA_GET(obj, sd);
4958 elm_genlist_clear(obj);
4959 if (sd->calc_job) ecore_job_del(sd->calc_job);
4960 if (sd->update_job) ecore_job_del(sd->update_job);
4961 if (sd->queue_idle_enterer) ecore_idle_enterer_del(sd->queue_idle_enterer);
4962 if (sd->must_recalc_idler) ecore_idler_del(sd->must_recalc_idler);
4963 if (sd->multi_timer) ecore_timer_del(sd->multi_timer);
4964 if (sd->decorate_it_type) eina_stringshare_del(sd->decorate_it_type);
4965 if (sd->scr_hold_timer) ecore_timer_del(sd->scr_hold_timer);
4967 evas_object_del(sd->pan_obj);
4968 ELM_WIDGET_CLASS(_elm_genlist_parent_sc)->base.del(obj);
4972 _elm_genlist_smart_move(Evas_Object *obj,
4976 ELM_GENLIST_DATA_GET(obj, sd);
4978 ELM_WIDGET_CLASS(_elm_genlist_parent_sc)->base.move(obj, x, y);
4980 evas_object_move(sd->hit_rect, x, y);
4984 _elm_genlist_smart_resize(Evas_Object *obj,
4988 ELM_GENLIST_DATA_GET(obj, sd);
4990 ELM_WIDGET_CLASS(_elm_genlist_parent_sc)->base.resize(obj, w, h);
4992 evas_object_resize(sd->hit_rect, w, h);
4996 _elm_genlist_smart_member_add(Evas_Object *obj,
4997 Evas_Object *member)
4999 ELM_GENLIST_DATA_GET(obj, sd);
5001 ELM_WIDGET_CLASS(_elm_genlist_parent_sc)->base.member_add(obj, member);
5004 evas_object_raise(sd->hit_rect);
5008 _access_obj_process(Elm_Genlist_Smart_Data *sd, Eina_Bool is_access)
5011 Eina_Bool done = EINA_FALSE;
5013 EINA_INLIST_FOREACH(sd->blocks, itb)
5021 EINA_LIST_FOREACH(itb->items, l, it)
5023 if (!it->realized) continue;
5024 if (is_access) _access_widget_item_register(it);
5026 _elm_access_widget_item_unregister((Elm_Widget_Item *)it);
5029 else if (done) break;
5034 _elm_genlist_smart_access(Evas_Object *obj, Eina_Bool is_access)
5036 ELM_GENLIST_CHECK(obj);
5037 ELM_GENLIST_DATA_GET(obj, sd);
5040 ELM_WIDGET_CLASS(ELM_WIDGET_DATA(sd)->api)->focus_next =
5041 _elm_genlist_smart_focus_next;
5043 ELM_WIDGET_CLASS(ELM_WIDGET_DATA(sd)->api)->focus_next = NULL;
5044 _access_obj_process(sd, is_access);
5048 _elm_genlist_smart_set_user(Elm_Genlist_Smart_Class *sc)
5050 ELM_WIDGET_CLASS(sc)->base.add = _elm_genlist_smart_add;
5051 ELM_WIDGET_CLASS(sc)->base.del = _elm_genlist_smart_del;
5052 ELM_WIDGET_CLASS(sc)->base.move = _elm_genlist_smart_move;
5053 ELM_WIDGET_CLASS(sc)->base.resize = _elm_genlist_smart_resize;
5054 ELM_WIDGET_CLASS(sc)->base.member_add = _elm_genlist_smart_member_add;
5056 ELM_WIDGET_CLASS(sc)->sub_object_add = _elm_genlist_smart_sub_object_add;
5057 ELM_WIDGET_CLASS(sc)->sub_object_del = _elm_genlist_smart_sub_object_del;
5058 ELM_WIDGET_CLASS(sc)->on_focus = _elm_genlist_smart_on_focus;
5059 ELM_WIDGET_CLASS(sc)->theme = _elm_genlist_smart_theme;
5060 ELM_WIDGET_CLASS(sc)->event = _elm_genlist_smart_event;
5061 ELM_WIDGET_CLASS(sc)->translate = _elm_genlist_smart_translate;
5063 /* not a 'focus chain manager' */
5064 ELM_WIDGET_CLASS(sc)->focus_next = NULL;
5065 ELM_WIDGET_CLASS(sc)->focus_direction = NULL;
5067 ELM_LAYOUT_CLASS(sc)->sizing_eval = _elm_genlist_smart_sizing_eval;
5070 if (_elm_config->access_mode == ELM_ACCESS_MODE_ON)
5071 ELM_WIDGET_CLASS(sc)->focus_next = _elm_genlist_smart_focus_next;
5073 ELM_WIDGET_CLASS(sc)->access = _elm_genlist_smart_access;
5076 EAPI const Elm_Genlist_Smart_Class *
5077 elm_genlist_smart_class_get(void)
5079 static Elm_Genlist_Smart_Class _sc =
5080 ELM_GENLIST_SMART_CLASS_INIT_NAME_VERSION(ELM_GENLIST_SMART_NAME);
5081 static const Elm_Genlist_Smart_Class *class = NULL;
5082 Evas_Smart_Class *esc = (Evas_Smart_Class *)&_sc;
5087 _elm_genlist_smart_set(&_sc);
5088 esc->callbacks = _smart_callbacks;
5095 elm_genlist_add(Evas_Object *parent)
5099 EINA_SAFETY_ON_NULL_RETURN_VAL(parent, NULL);
5101 obj = elm_widget_add(_elm_genlist_smart_class_new(), parent);
5102 if (!obj) return NULL;
5104 if (!elm_widget_sub_object_add(parent, obj))
5105 ERR("could not add %p as sub object of %p", obj, parent);
5111 static Evas_Object *
5112 _item_content_get_hook(Elm_Gen_Item *it,
5115 Evas_Object *ret = NULL;
5116 if (it->deco_all_view)
5117 ret = edje_object_part_swallow_get(it->deco_all_view, part);
5118 else if (it->decorate_it_set)
5119 ret = edje_object_part_swallow_get(it->item->deco_it_view, part);
5121 ret = edje_object_part_swallow_get(VIEW(it), part);
5126 _item_text_get_hook(Elm_Gen_Item *it,
5129 if (!it->itc->func.text_get) return NULL;
5130 const char *ret = NULL;
5131 if (it->deco_all_view)
5132 ret = edje_object_part_text_get(it->deco_all_view, part);
5133 else if (it->decorate_it_set)
5134 ret = edje_object_part_text_get(it->item->deco_it_view, part);
5136 ret = edje_object_part_text_get(VIEW(it), part);
5141 _item_disable_hook(Elm_Object_Item *item)
5145 Elm_Gen_Item *it = (Elm_Gen_Item *)item;
5148 elm_genlist_item_selected_set(item, EINA_FALSE);
5152 if (elm_widget_item_disabled_get(it))
5154 edje_object_signal_emit(VIEW(it), "elm,state,disabled", "elm");
5155 if (it->deco_all_view)
5156 edje_object_signal_emit
5157 (it->deco_all_view, "elm,state,disabled", "elm");
5161 edje_object_signal_emit(VIEW(it), "elm,state,enabled", "elm");
5162 if (it->deco_all_view)
5163 edje_object_signal_emit
5164 (it->deco_all_view, "elm,state,enabled", "elm");
5166 EINA_LIST_FOREACH(it->content_objs, l, obj)
5167 elm_widget_disabled_set(obj, elm_widget_item_disabled_get(it));
5172 _item_del_pre_hook(Elm_Object_Item *item)
5174 Elm_Gen_Item *it = (Elm_Gen_Item *)item;
5176 #if GENLIST_FX_SUPPORT
5177 if ((GL_IT(it)->wsd->fx_mode) && (!GL_IT(it)->wsd->genlist_clearing))
5179 _item_del_pre_fx_process(it);
5188 _item_signal_emit_hook(Elm_Object_Item *it,
5189 const char *emission,
5192 edje_object_signal_emit(VIEW(it), emission, source);
5195 static Elm_Gen_Item *
5196 _elm_genlist_item_new(Elm_Genlist_Smart_Data *sd,
5197 const Elm_Genlist_Item_Class *itc,
5199 Elm_Gen_Item *parent,
5200 Elm_Genlist_Item_Type type,
5202 const void *func_data)
5204 Elm_Gen_Item *it, *it2;
5207 if (!itc) return NULL;
5209 it = elm_widget_item_new(ELM_WIDGET_DATA(sd)->obj, Elm_Gen_Item);
5210 if (!it) return NULL;
5213 elm_genlist_item_class_ref((Elm_Genlist_Item_Class *)itc);
5215 it->base.data = data;
5216 it->parent = parent;
5217 it->func.func = func;
5218 it->func.data = func_data;
5220 elm_widget_item_content_get_hook_set(it, _item_content_get_hook);
5221 elm_widget_item_text_get_hook_set(it, _item_text_get_hook);
5222 elm_widget_item_disable_hook_set(it, _item_disable_hook);
5223 elm_widget_item_del_pre_hook_set(it, _item_del_pre_hook);
5224 elm_widget_item_signal_emit_hook_set(it, _item_signal_emit_hook);
5226 #if 0 // FIXME: difference from upstream
5227 it->can_focus = EINA_TRUE;
5229 //it->del_cb = (Ecore_Cb)_item_free;
5230 //it->highlight_cb = (Ecore_Cb)_item_highlight;
5231 //it->unhighlight_cb = (Ecore_Cb)_item_unhighlight;
5232 //it->sel_cb = (Ecore_Cb)_item_select;
5233 //it->unsel_cb = (Ecore_Cb)_item_unselect;
5234 //it->unrealize_cb = (Ecore_Cb)_item_unrealize_cb;
5236 GL_IT(it) = ELM_NEW(Elm_Gen_Item_Type);
5237 GL_IT(it)->wsd = sd;
5238 GL_IT(it)->type = type;
5239 if (type & ELM_GENLIST_ITEM_GROUP) it->group++;
5243 if (it->parent->group)
5244 GL_IT(it)->group_item = parent;
5245 else if (GL_IT(it->parent)->group_item)
5246 GL_IT(it)->group_item = GL_IT(it->parent)->group_item;
5248 for (it2 = it, depth = 0; it2->parent; it2 = it2->parent)
5250 if (!it2->parent->group) depth += 1;
5252 GL_IT(it)->expanded_depth = depth;
5255 #if GENLIST_FX_SUPPORT
5256 it->item->num = sd->item_count;
5259 sd->fx_items_deleted = EINA_FALSE;
5260 _elm_genlist_fx_capture(ELM_WIDGET_DATA(sd)->obj, 0);
5267 _elm_genlist_item_compare(const void *data,
5270 const Elm_Gen_Item *it, *item1;
5272 it = ELM_GEN_ITEM_FROM_INLIST(data);
5273 item1 = ELM_GEN_ITEM_FROM_INLIST(data1);
5274 return GL_IT(it)->wsd->item_compare_cb(it, item1);
5278 _elm_genlist_item_list_compare(const void *data,
5281 const Elm_Gen_Item *it = data;
5282 const Elm_Gen_Item *item1 = data1;
5284 return GL_IT(it)->wsd->item_compare_cb(it, item1);
5288 elm_genlist_items_count(const Evas_Object *obj)
5290 ELM_GENLIST_CHECK(obj) 0;
5291 ELM_GENLIST_DATA_GET(obj, sd);
5293 return sd->item_count;
5296 EAPI Elm_Object_Item *
5297 elm_genlist_item_append(Evas_Object *obj,
5298 const Elm_Genlist_Item_Class *itc,
5300 Elm_Object_Item *parent,
5301 Elm_Genlist_Item_Type type,
5303 const void *func_data)
5307 ELM_GENLIST_CHECK(obj) NULL;
5308 ELM_GENLIST_DATA_GET(obj, sd);
5310 ELM_WIDGET_ITEM_RETURN_IF_ONDEL(((Elm_Widget_Item *)parent),NULL);
5312 it = _elm_genlist_item_new
5313 (sd, itc, data, (Elm_Gen_Item *)parent, type, func, func_data);
5314 if (!it) return NULL;
5319 sd->group_items = eina_list_append(sd->group_items, it);
5320 sd->items = eina_inlist_append(sd->items, EINA_INLIST_GET(it));
5321 it->item->rel = NULL;
5325 Elm_Gen_Item *it2 = NULL;
5326 Eina_List *ll = eina_list_last(it->parent->item->items);
5328 if (ll) it2 = ll->data;
5329 it->parent->item->items =
5330 eina_list_append(it->parent->item->items, it);
5331 if (!it2) it2 = it->parent;
5332 sd->items = eina_inlist_append_relative
5333 (sd->items, EINA_INLIST_GET(it), EINA_INLIST_GET(it2));
5334 it->item->rel = it2;
5335 it2->item->rel_revs = eina_list_append(it2->item->rel_revs, it);
5337 it->item->before = EINA_FALSE;
5338 _item_queue(sd, it, NULL);
5340 return (Elm_Object_Item *)it;
5343 EAPI Elm_Object_Item *
5344 elm_genlist_item_prepend(Evas_Object *obj,
5345 const Elm_Genlist_Item_Class *itc,
5347 Elm_Object_Item *parent,
5348 Elm_Genlist_Item_Type type,
5350 const void *func_data)
5354 ELM_GENLIST_CHECK(obj) NULL;
5355 ELM_GENLIST_DATA_GET(obj, sd);
5356 it = _elm_genlist_item_new
5357 (sd, itc, data, (Elm_Gen_Item *)parent, type, func, func_data);
5358 if (!it) return NULL;
5363 sd->group_items = eina_list_prepend(sd->group_items, it);
5364 sd->items = eina_inlist_prepend(sd->items, EINA_INLIST_GET(it));
5365 it->item->rel = NULL;
5369 Elm_Gen_Item *it2 = NULL;
5370 Eina_List *ll = it->parent->item->items;
5372 if (ll) it2 = ll->data;
5373 it->parent->item->items =
5374 eina_list_prepend(it->parent->item->items, it);
5375 if (!it2) it2 = it->parent;
5376 sd->items = eina_inlist_prepend_relative
5377 (sd->items, EINA_INLIST_GET(it), EINA_INLIST_GET(it2));
5378 it->item->rel = it2;
5379 it2->item->rel_revs = eina_list_append(it2->item->rel_revs, it);
5381 it->item->before = EINA_TRUE;
5382 _item_queue(sd, it, NULL);
5384 return (Elm_Object_Item *)it;
5387 EAPI Elm_Object_Item *
5388 elm_genlist_item_insert_after(Evas_Object *obj,
5389 const Elm_Genlist_Item_Class *itc,
5391 Elm_Object_Item *parent,
5392 Elm_Object_Item *after_it,
5393 Elm_Genlist_Item_Type type,
5395 const void *func_data)
5397 Elm_Gen_Item *after = (Elm_Gen_Item *)after_it;
5400 ELM_GENLIST_CHECK(obj) NULL;
5401 ELM_GENLIST_ITEM_CHECK_OR_RETURN(after_it, NULL);
5402 ELM_GENLIST_DATA_GET(obj, sd);
5404 /* It makes no sense to insert after in an empty list with after !=
5405 * NULL, something really bad is happening in your app. */
5406 EINA_SAFETY_ON_NULL_RETURN_VAL(sd->items, NULL);
5408 it = _elm_genlist_item_new
5409 (sd, itc, data, (Elm_Gen_Item *)parent, type, func, func_data);
5410 if (!it) return NULL;
5414 if ((it->group) && (after->group))
5415 sd->group_items = eina_list_append_relative
5416 (sd->group_items, it, after);
5420 it->parent->item->items =
5421 eina_list_append_relative(it->parent->item->items, it, after);
5423 sd->items = eina_inlist_append_relative
5424 (sd->items, EINA_INLIST_GET(it), EINA_INLIST_GET(after));
5426 it->item->rel = after;
5427 after->item->rel_revs = eina_list_append(after->item->rel_revs, it);
5428 it->item->before = EINA_FALSE;
5429 _item_queue(sd, it, NULL);
5431 return (Elm_Object_Item *)it;
5434 EAPI Elm_Object_Item *
5435 elm_genlist_item_insert_before(Evas_Object *obj,
5436 const Elm_Genlist_Item_Class *itc,
5438 Elm_Object_Item *parent,
5439 Elm_Object_Item *before_it,
5440 Elm_Genlist_Item_Type type,
5442 const void *func_data)
5444 Elm_Gen_Item *before = (Elm_Gen_Item *)before_it;
5447 ELM_GENLIST_CHECK(obj) NULL;
5448 ELM_GENLIST_ITEM_CHECK_OR_RETURN(before_it, NULL);
5449 ELM_GENLIST_DATA_GET(obj, sd);
5451 /* It makes no sense to insert before in an empty list with before
5452 * != NULL, something really bad is happening in your app. */
5453 EINA_SAFETY_ON_NULL_RETURN_VAL(sd->items, NULL);
5455 it = _elm_genlist_item_new
5456 (sd, itc, data, (Elm_Gen_Item *)parent, type, func, func_data);
5457 if (!it) return NULL;
5461 if (it->group && before->group)
5463 eina_list_prepend_relative(sd->group_items, it, before);
5467 it->parent->item->items =
5468 eina_list_prepend_relative(it->parent->item->items, it, before);
5470 sd->items = eina_inlist_prepend_relative
5471 (sd->items, EINA_INLIST_GET(it), EINA_INLIST_GET(before));
5473 it->item->rel = before;
5474 before->item->rel_revs = eina_list_append(before->item->rel_revs, it);
5475 it->item->before = EINA_TRUE;
5476 _item_queue(sd, it, NULL);
5478 return (Elm_Object_Item *)it;
5481 EAPI Elm_Object_Item *
5482 elm_genlist_item_sorted_insert(Evas_Object *obj,
5483 const Elm_Genlist_Item_Class *itc,
5485 Elm_Object_Item *parent,
5486 Elm_Genlist_Item_Type type,
5487 Eina_Compare_Cb comp,
5489 const void *func_data)
5491 Elm_Gen_Item *rel = NULL;
5494 ELM_GENLIST_CHECK(obj) NULL;
5495 ELM_GENLIST_DATA_GET(obj, sd);
5497 it = _elm_genlist_item_new
5498 (sd, itc, data, (Elm_Gen_Item *)parent, type, func, func_data);
5499 if (!it) return NULL;
5501 sd->item_compare_cb = comp;
5508 l = eina_list_search_sorted_near_list
5509 (it->parent->item->items, _elm_genlist_item_list_compare, it,
5513 rel = eina_list_data_get(l);
5517 if (cmp_result >= 0)
5519 it->parent->item->items = eina_list_prepend_relative_list
5520 (it->parent->item->items, it, l);
5521 sd->items = eina_inlist_prepend_relative
5522 (sd->items, EINA_INLIST_GET(it), EINA_INLIST_GET(rel));
5523 it->item->before = EINA_FALSE;
5525 else if (cmp_result < 0)
5527 it->parent->item->items = eina_list_append_relative_list
5528 (it->parent->item->items, it, l);
5529 sd->items = eina_inlist_append_relative
5530 (sd->items, EINA_INLIST_GET(it), EINA_INLIST_GET(rel));
5531 it->item->before = EINA_TRUE;
5538 sd->state = eina_inlist_sorted_state_new();
5539 eina_inlist_sorted_state_init(sd->state, sd->items);
5540 sd->requeued = EINA_FALSE;
5544 sd->group_items = eina_list_append(sd->group_items, it);
5546 sd->items = eina_inlist_sorted_state_insert
5547 (sd->items, EINA_INLIST_GET(it), _elm_genlist_item_compare,
5550 if (EINA_INLIST_GET(it)->next)
5552 rel = ELM_GEN_ITEM_FROM_INLIST(EINA_INLIST_GET(it)->next);
5553 it->item->before = EINA_TRUE;
5555 else if (EINA_INLIST_GET(it)->prev)
5557 rel = ELM_GEN_ITEM_FROM_INLIST(EINA_INLIST_GET(it)->prev);
5558 it->item->before = EINA_FALSE;
5564 it->item->rel = rel;
5565 rel->item->rel_revs = eina_list_append(rel->item->rel_revs, it);
5568 _item_queue(sd, it, _elm_genlist_item_list_compare);
5570 return (Elm_Object_Item *)it;
5574 _elm_genlist_fx_clear(Evas_Object *obj)
5576 ELM_GENLIST_DATA_GET(obj, sd);
5578 Elm_Gen_FX_Item *fi;
5582 EINA_LIST_FREE(sd->capture_before_items, pi)
5584 if ((pi->it) && (GL_IT(pi->it))) GL_IT(pi->it)->has_proxy_it = EINA_FALSE;
5585 if (pi->proxy) evas_object_smart_member_del(pi->proxy);
5586 if (pi->proxy) evas_object_del(pi->proxy);
5589 EINA_LIST_FREE(sd->capture_after_items, pi)
5591 if ((pi->it) && (GL_IT(pi->it))) GL_IT(pi->it)->has_proxy_it = EINA_FALSE;
5592 if (pi->proxy) evas_object_smart_member_del(pi->proxy);
5593 if (pi->proxy) evas_object_del(pi->proxy);
5597 EINA_LIST_FREE(sd->fx_items, fi)
5599 if (fi->trans) elm_transit_del(fi->trans);
5603 EINA_LIST_FREE (sd->pending_unrealized_items, it)
5604 _item_unrealize(it, EINA_FALSE);
5606 EINA_LIST_FREE (sd->pending_unrealized_decorate_all_items, it)
5607 _decorate_all_item_unrealize(it);
5609 EINA_LIST_FREE (sd->pending_del_items, it)
5612 _elm_widget_item_free((Elm_Widget_Item *)it);
5614 if (sd->alpha_bg) evas_object_del(sd->alpha_bg);
5615 sd->alpha_bg = NULL;
5617 sd->genlist_clearing = EINA_TRUE;
5618 sd->fx_playing = EINA_FALSE;
5619 sd->fx_first_captured = EINA_FALSE;
5620 sd->fx_items_deleted = EINA_FALSE;
5624 elm_genlist_clear(Evas_Object *obj)
5626 ELM_GENLIST_CHECK(obj);
5627 ELM_GENLIST_DATA_GET(obj, sd);
5632 eina_inlist_sorted_state_free(sd->state);
5636 #if GENLIST_FX_SUPPORT
5639 _elm_genlist_fx_clear(obj);
5640 sd->genlist_clearing = EINA_TRUE;
5641 sd->rendered = EINA_FALSE;
5644 #if GENLIST_PINCH_ZOOM_SUPPORT
5645 sd->pinch_zoom_h = 0;
5646 sd->realized_top_item = NULL;
5647 sd->pinch_zoom_mode = ELM_GEN_PINCH_ZOOM_NONE;
5650 //evas_event_freeze(evas_object_evas_get(ELM_WIDGET_DATA(sd)->obj));
5652 // Do not use EINA_INLIST_FOREACH or EINA_INLIST_FOREACH_SAFE
5653 // because sd->items can be modified inside elm_widget_item_del()
5656 it = EINA_INLIST_CONTAINER_GET(sd->items->last, Elm_Gen_Item);
5657 elm_widget_item_del(it);
5661 _item_cache_all_free(sd);
5663 sd->pan_changed = EINA_TRUE;
5664 if (sd->selected) sd->selected = eina_list_free(sd->selected);
5665 sd->selected = NULL;
5667 sd->anchor_item = NULL;
5668 if (sd->multi_timer)
5670 ecore_timer_del(sd->multi_timer);
5671 sd->multi_timer = NULL;
5675 ecore_job_del(sd->update_job);
5676 sd->update_job = NULL;
5680 ecore_job_del(sd->calc_job);
5681 sd->calc_job = NULL;
5683 if (sd->queue_idle_enterer)
5685 ecore_idle_enterer_del(sd->queue_idle_enterer);
5686 sd->queue_idle_enterer = NULL;
5688 if (sd->must_recalc_idler)
5690 ecore_idler_del(sd->must_recalc_idler);
5691 sd->must_recalc_idler = NULL;
5693 if (sd->queue) sd->queue = eina_list_free(sd->queue);
5694 if (sd->reorder_move_animator)
5696 ecore_animator_del(sd->reorder_move_animator);
5697 sd->reorder_move_animator = NULL;
5699 sd->show_item = NULL;
5700 sd->reorder_old_pan_y = 0;
5707 if (sd->alpha_bg) evas_object_del(sd->alpha_bg);
5708 sd->alpha_bg = NULL;
5712 evas_object_size_hint_min_set(sd->pan_obj, sd->minw, sd->minh);
5713 evas_object_smart_callback_call(sd->pan_obj, "changed", NULL);
5715 elm_layout_sizing_eval(ELM_WIDGET_DATA(sd)->obj);
5716 sd->s_iface->content_region_show(obj, 0, 0, 0, 0);
5718 #if GENLIST_FX_SUPPORT
5719 sd->genlist_clearing = EINA_FALSE;
5721 //evas_event_thaw(evas_object_evas_get(ELM_WIDGET_DATA(sd)->obj));
5722 //evas_event_thaw_eval(evas_object_evas_get(ELM_WIDGET_DATA(sd)->obj));
5726 elm_genlist_multi_select_set(Evas_Object *obj,
5729 ELM_GENLIST_CHECK(obj);
5730 ELM_GENLIST_DATA_GET(obj, sd);
5732 sd->multi = !!multi;
5736 elm_genlist_multi_select_get(const Evas_Object *obj)
5738 ELM_GENLIST_CHECK(obj) EINA_FALSE;
5739 ELM_GENLIST_DATA_GET(obj, sd);
5744 EAPI Elm_Object_Item *
5745 elm_genlist_selected_item_get(const Evas_Object *obj)
5747 ELM_GENLIST_CHECK(obj) NULL;
5748 ELM_GENLIST_DATA_GET(obj, sd);
5751 return sd->selected->data;
5757 elm_genlist_selected_items_get(const Evas_Object *obj)
5759 ELM_GENLIST_CHECK(obj) NULL;
5760 ELM_GENLIST_DATA_GET(obj, sd);
5762 return sd->selected;
5766 elm_genlist_realized_items_get(const Evas_Object *obj)
5769 Eina_List *list = NULL;
5770 Eina_Bool done = EINA_FALSE;
5772 ELM_GENLIST_CHECK(obj) NULL;
5773 ELM_GENLIST_DATA_GET(obj, sd);
5775 EINA_INLIST_FOREACH(sd->blocks, itb)
5783 EINA_LIST_FOREACH(itb->items, l, it)
5785 if (it->realized) list = eina_list_append(list, it);
5796 EAPI Elm_Object_Item *
5797 elm_genlist_at_xy_item_get(const Evas_Object *obj,
5802 Evas_Coord ox, oy, ow, oh;
5806 ELM_GENLIST_CHECK(obj) NULL;
5807 ELM_GENLIST_DATA_GET(obj, sd);
5809 evas_object_geometry_get(sd->pan_obj, &ox, &oy, &ow, &oh);
5811 EINA_INLIST_FOREACH(sd->blocks, itb)
5816 if (!ELM_RECTS_INTERSECT(ox + itb->x - itb->sd->pan_x,
5817 oy + itb->y - itb->sd->pan_y,
5818 itb->w, itb->h, x, y, 1, 1))
5820 EINA_LIST_FOREACH(itb->items, l, it)
5822 Evas_Coord itx, ity;
5824 itx = ox + itb->x + it->x - itb->sd->pan_x;
5825 ity = oy + itb->y + it->y - itb->sd->pan_y;
5826 if (ELM_RECTS_INTERSECT
5827 (itx, ity, it->item->w, it->item->h, x, y, 1, 1))
5831 if (y <= (ity + (it->item->h / 4))) *posret = -1;
5832 else if (y >= (ity + it->item->h - (it->item->h / 4)))
5837 return (Elm_Object_Item *)it;
5839 lasty = ity + it->item->h;
5844 if (y > lasty) *posret = 1;
5851 EAPI Elm_Object_Item *
5852 elm_genlist_first_item_get(const Evas_Object *obj)
5854 Elm_Gen_Item *tit, *it = NULL;
5856 ELM_GENLIST_CHECK(obj) NULL;
5857 ELM_GENLIST_DATA_GET(obj, sd);
5859 EINA_INLIST_REVERSE_FOREACH(sd->items, tit) it = tit;
5861 return (Elm_Object_Item *)it;
5864 EAPI Elm_Object_Item *
5865 elm_genlist_last_item_get(const Evas_Object *obj)
5869 ELM_GENLIST_CHECK(obj) NULL;
5870 ELM_GENLIST_DATA_GET(obj, sd);
5871 if (!sd->items) return NULL;
5873 it = ELM_GEN_ITEM_FROM_INLIST(sd->items->last);
5874 return (Elm_Object_Item *)it;
5877 EAPI Elm_Object_Item *
5878 elm_genlist_item_next_get(const Elm_Object_Item *item)
5882 ELM_GENLIST_ITEM_CHECK_OR_RETURN(item, NULL);
5884 it = (Elm_Gen_Item *)item;
5887 it = ELM_GEN_ITEM_FROM_INLIST(EINA_INLIST_GET(it)->next);
5891 return (Elm_Object_Item *)it;
5894 EAPI Elm_Object_Item *
5895 elm_genlist_item_prev_get(const Elm_Object_Item *item)
5899 ELM_GENLIST_ITEM_CHECK_OR_RETURN(item, NULL);
5901 it = (Elm_Gen_Item *)item;
5904 it = ELM_GEN_ITEM_FROM_INLIST(EINA_INLIST_GET(it)->prev);
5908 return (Elm_Object_Item *)it;
5911 EAPI Elm_Object_Item *
5912 elm_genlist_item_parent_get(const Elm_Object_Item *it)
5914 ELM_GENLIST_ITEM_CHECK_OR_RETURN(it, NULL);
5916 return (Elm_Object_Item *)((Elm_Gen_Item *)it)->parent;
5920 elm_genlist_item_subitems_clear(Elm_Object_Item *item)
5922 Elm_Gen_Item *it = (Elm_Gen_Item *)item;
5924 ELM_GENLIST_ITEM_CHECK_OR_RETURN(item);
5925 _item_subitems_clear(it);
5929 elm_genlist_item_selected_set(Elm_Object_Item *item,
5932 Elm_Gen_Item *it = (Elm_Gen_Item *)item;
5933 ELM_GENLIST_ITEM_CHECK_OR_RETURN(item);
5935 if (elm_widget_item_disabled_get(it)) return;
5936 selected = !!selected;
5937 if (it->selected == selected) return;
5939 _item_select_unselect(it, selected);
5943 elm_genlist_item_selected_get(const Elm_Object_Item *it)
5945 ELM_GENLIST_ITEM_CHECK_OR_RETURN(it, EINA_FALSE);
5947 return ((Elm_Gen_Item *)it)->selected;
5950 static Elm_Gen_Item *
5951 _elm_genlist_expanded_next_item_get(Elm_Gen_Item *it)
5955 if (it->item->expanded)
5957 it2 = (Elm_Gen_Item *)elm_genlist_item_next_get((Elm_Object_Item *)it);
5961 it2 = (Elm_Gen_Item *)elm_genlist_item_next_get((Elm_Object_Item *)it);
5964 if (it->item->expanded_depth >= it2->item->expanded_depth) break;
5965 it2 = (Elm_Gen_Item *)
5966 elm_genlist_item_next_get((Elm_Object_Item *)it2);
5972 static Evas_Object *
5973 _tray_alpha_bg_create(const Evas_Object *obj)
5975 Evas_Object *bg = NULL;
5976 Evas_Coord ox, oy, ow, oh;
5978 ELM_GENLIST_CHECK(obj) NULL;
5979 ELM_GENLIST_DATA_GET(obj, sd);
5981 evas_object_geometry_get(sd->pan_obj, &ox, &oy, &ow, &oh);
5982 bg = evas_object_rectangle_add
5983 (evas_object_evas_get(ELM_WIDGET_DATA(sd)->obj));
5984 evas_object_color_set(bg, 0, 0, 0, 0);
5985 evas_object_resize(bg, ow, oh);
5986 evas_object_move(bg, ox, oy);
5992 elm_genlist_item_expanded_set(Elm_Object_Item *item,
5995 Elm_Gen_Item *it = (Elm_Gen_Item *)item;
5997 ELM_GENLIST_ITEM_CHECK_OR_RETURN(item);
5999 expanded = !!expanded;
6000 if (it->item->expanded == expanded) return;
6001 if (it->item->type != ELM_GENLIST_ITEM_TREE) return;
6002 it->item->expanded = expanded;
6003 GL_IT(it)->wsd->expanded_item = it;
6004 GL_IT(it)->wsd->expanded_next_item =
6005 _elm_genlist_expanded_next_item_get(it);
6007 if (it->item->expanded)
6010 edje_object_signal_emit(VIEW(it), "elm,state,expanded", "elm");
6011 evas_object_smart_callback_call(WIDGET(it), SIG_EXPANDED, it);
6012 GL_IT(it)->wsd->auto_scroll_enabled = EINA_TRUE;
6017 edje_object_signal_emit(VIEW(it), "elm,state,contracted", "elm");
6018 evas_object_smart_callback_call(WIDGET(it), SIG_CONTRACTED, it);
6019 GL_IT(it)->wsd->auto_scroll_enabled = EINA_FALSE;
6024 elm_genlist_item_expanded_get(const Elm_Object_Item *it)
6026 ELM_GENLIST_ITEM_CHECK_OR_RETURN(it, EINA_FALSE);
6028 return ((Elm_Gen_Item *)it)->item->expanded;
6032 elm_genlist_item_expanded_depth_get(const Elm_Object_Item *it)
6034 ELM_GENLIST_ITEM_CHECK_OR_RETURN(it, 0);
6036 return ((Elm_Gen_Item *)it)->item->expanded_depth;
6040 _elm_genlist_item_coordinates_calc(Elm_Object_Item *item,
6041 Elm_Genlist_Item_Scrollto_Type type,
6048 Elm_Gen_Item *it = (Elm_Gen_Item *)item;
6049 Evas_Coord gith = 0;
6051 if (!((GL_IT(it)->wsd->homogeneous) &&
6052 (GL_IT(it)->wsd->mode == ELM_LIST_COMPRESS)))
6054 if ((it->item->queued) || (!it->item->mincalcd))
6056 GL_IT(it)->wsd->show_item = it;
6057 GL_IT(it)->wsd->bring_in = bring_in;
6058 GL_IT(it)->wsd->scroll_to_type = type;
6059 it->item->show_me = EINA_TRUE;
6063 if (GL_IT(it)->wsd->show_item)
6065 GL_IT(it)->wsd->show_item->item->show_me = EINA_FALSE;
6066 GL_IT(it)->wsd->show_item = NULL;
6069 evas_object_geometry_get(GL_IT(it)->wsd->pan_obj, NULL, NULL, w, h);
6072 case ELM_GENLIST_ITEM_SCROLLTO_IN:
6073 if ((it->item->group_item) &&
6074 (GL_IT(it)->wsd->pan_y > (it->y + it->item->block->y)))
6075 gith = it->item->group_item->item->h;
6077 *y = it->y + it->item->block->y - gith;
6080 case ELM_GENLIST_ITEM_SCROLLTO_TOP:
6081 if (it->item->group_item) gith = it->item->group_item->item->h;
6082 *y = it->y + it->item->block->y - gith;
6085 case ELM_GENLIST_ITEM_SCROLLTO_MIDDLE:
6086 *y = it->y + it->item->block->y - (*h / 2) + (it->item->h / 2);
6093 *x = it->x + it->item->block->x;
6094 *w = it->item->block->w;
6100 elm_genlist_item_promote(Elm_Object_Item *item)
6102 ELM_GENLIST_ITEM_CHECK_OR_RETURN(item);
6103 Elm_Gen_Item *it = (Elm_Gen_Item *)item;
6105 (it, (Elm_Gen_Item *)elm_genlist_first_item_get(WIDGET(it)));
6109 elm_genlist_item_demote(Elm_Object_Item *item)
6111 ELM_GENLIST_ITEM_CHECK_OR_RETURN(item);
6112 Elm_Gen_Item *it = (Elm_Gen_Item *)item;
6113 _item_move_after(it, (Elm_Gen_Item *)elm_genlist_last_item_get(WIDGET(it)));
6117 elm_genlist_item_show(Elm_Object_Item *item,
6118 Elm_Genlist_Item_Scrollto_Type type)
6120 Evas_Coord x, y, w, h;
6121 ELM_GENLIST_ITEM_CHECK_OR_RETURN(item);
6122 Elm_Gen_Item *it = (Elm_Gen_Item *)item;
6124 if (_elm_genlist_item_coordinates_calc
6125 (item, type, EINA_FALSE, &x, &y, &w, &h))
6126 GL_IT(it)->wsd->s_iface->content_region_show(WIDGET(item), x, y, w, h);
6130 elm_genlist_item_bring_in(Elm_Object_Item *item,
6131 Elm_Genlist_Item_Scrollto_Type type)
6133 Evas_Coord x, y, w, h;
6134 ELM_GENLIST_ITEM_CHECK_OR_RETURN(item);
6135 Elm_Gen_Item *it = (Elm_Gen_Item *)item;
6137 if (_elm_genlist_item_coordinates_calc
6138 (item, type, EINA_TRUE, &x, &y, &w, &h))
6139 GL_IT(it)->wsd->s_iface->region_bring_in(WIDGET(item), x, y, w, h);
6143 elm_genlist_item_all_contents_unset(Elm_Object_Item *item,
6146 Evas_Object *content;
6148 ELM_GENLIST_ITEM_CHECK_OR_RETURN(item);
6149 Elm_Gen_Item *it = (Elm_Gen_Item *)item;
6151 EINA_LIST_FREE (it->content_objs, content)
6153 evas_object_smart_member_del(content);
6154 evas_object_hide(content);
6155 if (l) *l = eina_list_append(*l, content);
6160 elm_genlist_item_update(Elm_Object_Item *item)
6162 ELM_GENLIST_ITEM_CHECK_OR_RETURN(item);
6163 Elm_Gen_Item *it = (Elm_Gen_Item *)item;
6165 if (!it->item->block) return;
6166 it->item->mincalcd = EINA_FALSE;
6167 it->item->updateme = EINA_TRUE;
6168 it->item->block->updateme = EINA_TRUE;
6169 #if GENLIST_ENTRY_SUPPORT
6170 it->item->unrealize_disabled = EINA_FALSE;
6173 #if GENLIST_FX_SUPPORT
6174 if (GL_IT(it)->wsd->fx_first_captured)
6175 _elm_genlist_fx_clear(ELM_WIDGET_DATA(GL_IT(it)->wsd)->obj);
6178 if (GL_IT(it)->wsd->update_job) ecore_job_del(GL_IT(it)->wsd->update_job);
6179 GL_IT(it)->wsd->update_job = ecore_job_add(_update_job, GL_IT(it)->wsd);
6183 elm_genlist_item_fields_update(Elm_Object_Item *item,
6185 Elm_Genlist_Item_Field_Type itf)
6187 ELM_GENLIST_ITEM_CHECK_OR_RETURN(item);
6188 Elm_Gen_Item *it = (Elm_Gen_Item *)item;
6190 if (!it->item->block) return;
6192 #if GENLIST_ENTRY_SUPPORT
6193 it->item->unrealize_disabled = EINA_FALSE;
6195 if ((!itf) || (itf & ELM_GENLIST_ITEM_FIELD_TEXT))
6197 _item_text_realize(it, VIEW(it), &it->texts, parts);
6199 if ((!itf) || (itf & ELM_GENLIST_ITEM_FIELD_CONTENT))
6201 it->content_objs = _item_content_unrealize(it, VIEW(it),
6202 &it->contents, parts);
6203 it->content_objs = _item_content_realize(it, VIEW(it),
6204 &it->contents, parts);
6208 it->item->flip_content_objs =
6209 _item_mode_content_unrealize(it, VIEW(it),
6210 &it->item->flip_contents, parts,
6211 &it->item->flip_content_objs);
6212 it->item->flip_content_objs =
6213 _item_mode_content_realize(it, VIEW(it),
6214 &it->item->flip_contents, parts,
6215 &it->item->flip_content_objs);
6217 if (it->item->deco_it_view)
6219 it->item->deco_it_content_objs =
6220 _item_mode_content_unrealize(it, it->item->deco_it_view,
6221 &it->item->deco_it_contents, parts,
6222 &it->item->deco_it_content_objs);
6223 it->item->deco_it_content_objs =
6224 _item_mode_content_realize(it, it->item->deco_it_view,
6225 &it->item->deco_it_contents, parts,
6226 &it->item->deco_it_content_objs);
6228 if (GL_IT(it)->wsd->decorate_all_mode)
6230 it->item->deco_all_content_objs =
6231 _item_mode_content_unrealize
6232 (it, it->deco_all_view, &it->item->deco_all_contents, parts,
6233 &it->item->deco_all_content_objs);
6234 it->item->deco_all_content_objs =
6235 _item_mode_content_realize(it, it->deco_all_view,
6236 &it->item->deco_all_contents, parts,
6237 &it->item->deco_all_content_objs);
6241 if ((!itf) || (itf & ELM_GENLIST_ITEM_FIELD_STATE))
6242 _item_state_realize(it, VIEW(it), &it->states, parts);
6246 elm_genlist_item_item_class_update(Elm_Object_Item *item,
6247 const Elm_Genlist_Item_Class *itc)
6249 ELM_GENLIST_ITEM_CHECK_OR_RETURN(item);
6250 Elm_Gen_Item *it = (Elm_Gen_Item *)item;
6252 if (!it->item->block) return;
6253 EINA_SAFETY_ON_NULL_RETURN(itc);
6255 it->item->nocache_once = EINA_TRUE;
6257 elm_widget_stringlist_free(it->texts);
6259 elm_widget_stringlist_free(it->contents);
6260 it->contents = NULL;
6261 elm_widget_stringlist_free(it->states);
6266 elm_widget_stringlist_free(it->item->flip_contents);
6267 it->item->flip_contents = NULL;
6269 if (it->item->deco_it_view)
6271 elm_widget_stringlist_free(it->item->deco_it_texts);
6272 it->item->deco_it_texts = NULL;
6273 elm_widget_stringlist_free(it->item->deco_it_contents);
6274 it->item->deco_it_contents = NULL;
6276 if (GL_IT(it)->wsd->decorate_all_mode)
6278 elm_widget_stringlist_free(it->item->deco_all_texts);
6279 it->item->deco_all_texts = NULL;
6280 elm_widget_stringlist_free(it->item->deco_all_contents);
6281 it->item->deco_all_contents = NULL;
6284 elm_genlist_item_update(item);
6287 EAPI const Elm_Genlist_Item_Class *
6288 elm_genlist_item_item_class_get(const Elm_Object_Item *item)
6290 ELM_GENLIST_ITEM_CHECK_OR_RETURN(item, NULL);
6291 Elm_Gen_Item *it = (Elm_Gen_Item *)item;
6295 static Evas_Object *
6296 _elm_genlist_item_label_create(void *data,
6297 Evas_Object *obj __UNUSED__,
6298 Evas_Object *tooltip,
6299 void *it __UNUSED__)
6301 Evas_Object *label = elm_label_add(tooltip);
6306 elm_object_style_set(label, "tooltip");
6307 elm_object_text_set(label, data);
6313 _elm_genlist_item_label_del_cb(void *data,
6314 Evas_Object *obj __UNUSED__,
6315 void *event_info __UNUSED__)
6317 eina_stringshare_del(data);
6321 elm_genlist_item_tooltip_text_set(Elm_Object_Item *it,
6324 ELM_GENLIST_ITEM_CHECK_OR_RETURN(it);
6326 text = eina_stringshare_add(text);
6327 elm_genlist_item_tooltip_content_cb_set
6328 (it, _elm_genlist_item_label_create, text,
6329 _elm_genlist_item_label_del_cb);
6333 elm_genlist_item_tooltip_content_cb_set(Elm_Object_Item *item,
6334 Elm_Tooltip_Item_Content_Cb func,
6336 Evas_Smart_Cb del_cb)
6338 Elm_Gen_Item *it = (Elm_Gen_Item *)item;
6340 ELM_GENLIST_ITEM_CHECK_OR_GOTO(item, error);
6342 if ((it->tooltip.content_cb == func) && (it->tooltip.data == data))
6345 if (it->tooltip.del_cb)
6346 it->tooltip.del_cb((void *)it->tooltip.data, WIDGET(it), it);
6348 it->tooltip.content_cb = func;
6349 it->tooltip.data = data;
6350 it->tooltip.del_cb = del_cb;
6354 elm_widget_item_tooltip_content_cb_set
6355 (it, it->tooltip.content_cb, it->tooltip.data, NULL);
6356 elm_widget_item_tooltip_style_set(it, it->tooltip.style);
6357 elm_widget_item_tooltip_window_mode_set(it, it->tooltip.free_size);
6363 if (del_cb) del_cb((void *)data, NULL, NULL);
6367 elm_genlist_item_tooltip_unset(Elm_Object_Item *item)
6369 Elm_Gen_Item *it = (Elm_Gen_Item *)item;
6371 ELM_GENLIST_ITEM_CHECK_OR_RETURN(item);
6373 if ((VIEW(it)) && (it->tooltip.content_cb))
6374 elm_widget_item_tooltip_unset(it);
6376 if (it->tooltip.del_cb)
6377 it->tooltip.del_cb((void *)it->tooltip.data, WIDGET(it), it);
6378 it->tooltip.del_cb = NULL;
6379 it->tooltip.content_cb = NULL;
6380 it->tooltip.data = NULL;
6381 it->tooltip.free_size = EINA_FALSE;
6382 if (it->tooltip.style)
6383 elm_genlist_item_tooltip_style_set(item, NULL);
6387 elm_genlist_item_tooltip_style_set(Elm_Object_Item *item,
6390 Elm_Gen_Item *it = (Elm_Gen_Item *)item;
6392 ELM_GENLIST_ITEM_CHECK_OR_RETURN(item);
6394 eina_stringshare_replace(&it->tooltip.style, style);
6395 if (VIEW(it)) elm_widget_item_tooltip_style_set(it, style);
6399 elm_genlist_item_tooltip_style_get(const Elm_Object_Item *it)
6401 return elm_object_item_tooltip_style_get(it);
6405 elm_genlist_item_tooltip_window_mode_set(Elm_Object_Item *item,
6408 Elm_Gen_Item *it = (Elm_Gen_Item *)item;
6410 ELM_GENLIST_ITEM_CHECK_OR_RETURN(item, EINA_FALSE);
6412 it->tooltip.free_size = disable;
6413 if (VIEW(it)) return elm_widget_item_tooltip_window_mode_set(it, disable);
6419 elm_genlist_item_tooltip_window_mode_get(const Elm_Object_Item *it)
6421 return elm_object_tooltip_window_mode_get(VIEW(it));
6425 elm_genlist_item_cursor_set(Elm_Object_Item *item,
6428 Elm_Gen_Item *it = (Elm_Gen_Item *)item;
6430 ELM_GENLIST_ITEM_CHECK_OR_RETURN(item);
6431 eina_stringshare_replace(&it->mouse_cursor, cursor);
6432 if (VIEW(it)) elm_widget_item_cursor_set(it, cursor);
6436 elm_genlist_item_cursor_get(const Elm_Object_Item *it)
6438 return elm_widget_item_cursor_get(it);
6442 elm_genlist_item_cursor_unset(Elm_Object_Item *item)
6444 Elm_Gen_Item *it = (Elm_Gen_Item *)item;
6446 ELM_GENLIST_ITEM_CHECK_OR_RETURN(item);
6448 if (!it->mouse_cursor) return;
6450 if (VIEW(it)) elm_widget_item_cursor_unset(it);
6452 eina_stringshare_del(it->mouse_cursor);
6453 it->mouse_cursor = NULL;
6457 elm_genlist_item_cursor_style_set(Elm_Object_Item *it,
6460 elm_widget_item_cursor_style_set(it, style);
6464 elm_genlist_item_cursor_style_get(const Elm_Object_Item *it)
6466 return elm_widget_item_cursor_style_get(it);
6470 elm_genlist_item_cursor_engine_only_set(Elm_Object_Item *it,
6471 Eina_Bool engine_only)
6473 elm_widget_item_cursor_engine_only_set(it, engine_only);
6477 elm_genlist_item_cursor_engine_only_get(const Elm_Object_Item *it)
6479 return elm_widget_item_cursor_engine_only_get(it);
6483 elm_genlist_item_index_get(const Elm_Object_Item *item)
6485 Elm_Gen_Item *it = (Elm_Gen_Item *)item;
6487 ELM_GENLIST_ITEM_CHECK_OR_RETURN(item, -1);
6489 if (it->item->block)
6490 return it->position + (it->item->block->position *
6491 GL_IT(it)->wsd->max_items_per_block);
6496 elm_genlist_mode_set(Evas_Object *obj,
6499 ELM_GENLIST_CHECK(obj);
6500 ELM_GENLIST_DATA_GET(obj, sd);
6502 if (sd->mode == mode) return;
6504 elm_layout_sizing_eval(obj);
6508 elm_genlist_mode_get(const Evas_Object *obj)
6510 ELM_GENLIST_CHECK(obj) ELM_LIST_LAST;
6511 ELM_GENLIST_DATA_GET(obj, sd);
6517 elm_genlist_bounce_set(Evas_Object *obj,
6521 ELM_GENLIST_CHECK(obj);
6522 ELM_GENLIST_DATA_GET(obj, sd);
6524 sd->h_bounce = !!h_bounce;
6525 sd->v_bounce = !!v_bounce;
6526 sd->s_iface->bounce_allow_set(obj, sd->h_bounce, sd->v_bounce);
6530 elm_genlist_bounce_get(const Evas_Object *obj,
6531 Eina_Bool *h_bounce,
6532 Eina_Bool *v_bounce)
6534 ELM_GENLIST_CHECK(obj);
6535 ELM_GENLIST_DATA_GET(obj, sd);
6537 if (h_bounce) *h_bounce = sd->h_bounce;
6538 if (v_bounce) *v_bounce = sd->v_bounce;
6542 elm_genlist_homogeneous_set(Evas_Object *obj,
6543 Eina_Bool homogeneous)
6545 ELM_GENLIST_CHECK(obj);
6546 ELM_GENLIST_DATA_GET(obj, sd);
6548 sd->homogeneous = !!homogeneous;
6552 elm_genlist_homogeneous_get(const Evas_Object *obj)
6554 ELM_GENLIST_CHECK(obj) EINA_FALSE;
6555 ELM_GENLIST_DATA_GET(obj, sd);
6557 return sd->homogeneous;
6561 elm_genlist_block_count_set(Evas_Object *obj,
6564 ELM_GENLIST_CHECK(obj);
6565 ELM_GENLIST_DATA_GET(obj, sd);
6566 EINA_SAFETY_ON_TRUE_RETURN(count < 1);
6568 sd->max_items_per_block = count;
6569 sd->item_cache_max = sd->max_items_per_block * 2;
6570 _item_cache_all_free(sd);
6574 elm_genlist_block_count_get(const Evas_Object *obj)
6576 ELM_GENLIST_CHECK(obj) 0;
6577 ELM_GENLIST_DATA_GET(obj, sd);
6579 return sd->max_items_per_block;
6583 elm_genlist_longpress_timeout_set(Evas_Object *obj,
6586 ELM_GENLIST_CHECK(obj);
6587 ELM_GENLIST_DATA_GET(obj, sd);
6589 sd->longpress_timeout = timeout;
6593 elm_genlist_longpress_timeout_get(const Evas_Object *obj)
6595 ELM_GENLIST_CHECK(obj) 0;
6596 ELM_GENLIST_DATA_GET(obj, sd);
6598 return sd->longpress_timeout;
6602 elm_genlist_scroller_policy_set(Evas_Object *obj,
6603 Elm_Scroller_Policy policy_h,
6604 Elm_Scroller_Policy policy_v)
6606 ELM_GENLIST_CHECK(obj);
6607 ELM_GENLIST_DATA_GET(obj, sd);
6609 if ((policy_h >= ELM_SCROLLER_POLICY_LAST) ||
6610 (policy_v >= ELM_SCROLLER_POLICY_LAST))
6613 sd->s_iface->policy_set(obj, policy_h, policy_v);
6617 elm_genlist_scroller_policy_get(const Evas_Object *obj,
6618 Elm_Scroller_Policy *policy_h,
6619 Elm_Scroller_Policy *policy_v)
6621 Elm_Scroller_Policy s_policy_h, s_policy_v;
6623 ELM_GENLIST_CHECK(obj);
6624 ELM_GENLIST_DATA_GET(obj, sd);
6626 sd->s_iface->policy_get(obj, &s_policy_h, &s_policy_v);
6627 if (policy_h) *policy_h = (Elm_Scroller_Policy)s_policy_h;
6628 if (policy_v) *policy_v = (Elm_Scroller_Policy)s_policy_v;
6632 elm_genlist_realized_items_update(Evas_Object *obj)
6634 Eina_List *list, *l;
6635 Elm_Object_Item *it;
6637 ELM_GENLIST_CHECK(obj);
6639 list = elm_genlist_realized_items_get(obj);
6640 EINA_LIST_FOREACH(list, l, it)
6641 elm_genlist_item_update(it);
6645 elm_genlist_item_decorate_mode_set(Elm_Object_Item *item,
6646 const char *decorate_it_type,
6647 Eina_Bool decorate_it_set)
6649 Elm_Gen_Item *it = (Elm_Gen_Item *)item;
6650 Elm_Genlist_Smart_Data *sd;
6652 ELM_GENLIST_ITEM_CHECK_OR_RETURN(item);
6653 sd = GL_IT(it)->wsd;
6655 if (elm_widget_item_disabled_get(it)) return;
6656 if (!decorate_it_type) return;
6657 if (sd->decorate_all_mode) return;
6659 if ((sd->mode_item == it) &&
6660 (!strcmp(decorate_it_type, sd->decorate_it_type)) &&
6663 if (!it->itc->decorate_item_style) return;
6664 it->decorate_it_set = decorate_it_set;
6667 if (((sd->decorate_it_type)
6668 && (strcmp(decorate_it_type, sd->decorate_it_type))) ||
6669 (decorate_it_set) || ((it == sd->mode_item) && (!decorate_it_set)))
6670 _decorate_item_unset(sd);
6672 eina_stringshare_replace(&sd->decorate_it_type, decorate_it_type);
6673 if (decorate_it_set) _decorate_item_set(it);
6677 elm_genlist_item_decorate_mode_get(const Elm_Object_Item *item)
6679 Elm_Gen_Item *i = (Elm_Gen_Item *)item;
6681 ELM_GENLIST_ITEM_CHECK_OR_RETURN(item, NULL);
6682 return GL_IT(i)->wsd->decorate_it_type;
6685 EAPI Elm_Object_Item *
6686 elm_genlist_decorated_item_get(const Evas_Object *obj)
6688 ELM_GENLIST_CHECK(obj) NULL;
6689 ELM_GENLIST_DATA_GET(obj, sd);
6691 return (Elm_Object_Item *)sd->mode_item;
6695 elm_genlist_decorate_mode_get(const Evas_Object *obj)
6697 ELM_GENLIST_CHECK(obj) EINA_FALSE;
6698 ELM_GENLIST_DATA_GET(obj, sd);
6700 return sd->decorate_all_mode;
6704 elm_genlist_decorate_mode_set(Evas_Object *obj,
6705 Eina_Bool decorated)
6708 Eina_List *list, *l;
6710 ELM_GENLIST_CHECK(obj);
6711 ELM_GENLIST_DATA_GET(obj, sd);
6713 decorated = !!decorated;
6714 if (sd->decorate_all_mode == decorated) return;
6715 // decorate_all_mode should be set first
6716 // because content_get func. will be called after this
6717 // and user can check whether deocrate_all_mode is enabeld.
6718 sd->decorate_all_mode = decorated;
6720 list = elm_genlist_realized_items_get(obj);
6721 if (!sd->decorate_all_mode)
6723 EINA_LIST_FOREACH(list, l, it)
6725 if (it->item->type != ELM_GENLIST_ITEM_GROUP)
6726 _decorate_all_item_unrealize(it);
6728 _item_cache_all_free(sd);
6732 EINA_LIST_FOREACH(list, l, it)
6734 if (it->item->type != ELM_GENLIST_ITEM_GROUP)
6736 if (it->itc->decorate_all_item_style)
6737 _decorate_all_item_realize(it, EINA_TRUE);
6741 #if GENLIST_FX_SUPPORT
6742 if (sd->fx_first_captured)
6743 _elm_genlist_fx_clear(ELM_WIDGET_DATA(sd)->obj);
6746 if (sd->calc_job) ecore_job_del(sd->calc_job);
6747 sd->calc_job = ecore_job_add(_calc_job, sd);
6751 elm_genlist_reorder_mode_set(Evas_Object *obj,
6752 Eina_Bool reorder_mode)
6754 #if 1 // FIXME: difference from upstream
6755 Eina_List *list, *l;
6758 ELM_GENLIST_CHECK(obj);
6759 ELM_GENLIST_DATA_GET(obj, sd);
6761 if (sd->reorder_mode == !!reorder_mode) return;
6762 sd->reorder_mode = !!reorder_mode;
6763 #if 1 // FIXME: difference from upstream
6764 list = elm_genlist_realized_items_get(obj);
6765 EINA_LIST_FOREACH(list, l, it)
6767 if (it->item->type != ELM_GENLIST_ITEM_GROUP)
6770 if (it->deco_all_view) view = it->deco_all_view;
6771 else view = VIEW(it);
6773 if (sd->reorder_mode)
6774 edje_object_signal_emit
6775 (view, "elm,state,reorder,mode_set", "elm");
6777 edje_object_signal_emit
6778 (view, "elm,state,reorder,mode_unset", "elm");
6781 eina_list_free(list);
6786 elm_genlist_reorder_mode_get(const Evas_Object *obj)
6788 ELM_GENLIST_CHECK(obj) EINA_FALSE;
6789 ELM_GENLIST_DATA_GET(obj, sd);
6791 return sd->reorder_mode;
6794 EAPI Elm_Genlist_Item_Type
6795 elm_genlist_item_type_get(const Elm_Object_Item *item)
6797 Elm_Gen_Item *it = (Elm_Gen_Item *)item;
6799 ELM_GENLIST_ITEM_CHECK_OR_RETURN(item, ELM_GENLIST_ITEM_MAX);
6801 return it->item->type;
6804 EAPI Elm_Genlist_Item_Class *
6805 elm_genlist_item_class_new(void)
6807 Elm_Genlist_Item_Class *itc = ELM_NEW(Elm_Genlist_Item_Class);
6808 EINA_SAFETY_ON_NULL_RETURN_VAL(itc, NULL);
6810 itc->version = CLASS_ALLOCATED;
6812 itc->delete_me = EINA_FALSE;
6818 elm_genlist_item_class_free(Elm_Genlist_Item_Class *itc)
6820 if (itc && (itc->version == CLASS_ALLOCATED))
6822 if (!itc->delete_me) itc->delete_me = EINA_TRUE;
6823 if (itc->refcount > 0) elm_genlist_item_class_unref(itc);
6833 elm_genlist_item_class_ref(Elm_Genlist_Item_Class *itc)
6835 if (itc && (itc->version == CLASS_ALLOCATED))
6838 if (itc->refcount == 0) itc->refcount--;
6843 elm_genlist_item_class_unref(Elm_Genlist_Item_Class *itc)
6845 if (itc && (itc->version == CLASS_ALLOCATED))
6847 if (itc->refcount > 0) itc->refcount--;
6848 if (itc->delete_me && (!itc->refcount))
6849 elm_genlist_item_class_free(itc);
6854 elm_genlist_item_flip_set(Elm_Object_Item *item,
6857 Elm_Gen_Item *it = (Elm_Gen_Item *)item;
6858 ELM_GENLIST_ITEM_CHECK_OR_RETURN(item);
6859 Elm_Genlist_Smart_Data *sd = GL_IT(it)->wsd;
6862 if (it->flipped == flip) return;
6864 it->item->unrealize_disabled = EINA_FALSE;
6868 _item_unrealize(it, EINA_FALSE);
6869 it->flipped = EINA_TRUE;
6870 it->item->nocache = EINA_TRUE;
6874 _item_unrealize(it, EINA_FALSE);
6875 it->flipped = EINA_FALSE;
6876 it->item->nocache = EINA_FALSE;
6878 if (sd->calc_job) ecore_job_del(sd->calc_job);
6879 sd->calc_job = ecore_job_add(_calc_job, sd);
6883 elm_genlist_item_flip_get(const Elm_Object_Item *item)
6885 Elm_Gen_Item *it = (Elm_Gen_Item *)item;
6887 ELM_GENLIST_ITEM_CHECK_OR_RETURN(item, EINA_FALSE);
6893 elm_genlist_select_mode_set(Evas_Object *obj,
6894 Elm_Object_Select_Mode mode)
6896 ELM_GENLIST_CHECK(obj);
6897 ELM_GENLIST_DATA_GET(obj, sd);
6899 if (mode >= ELM_OBJECT_SELECT_MODE_MAX || (sd->select_mode == mode))
6902 sd->select_mode = mode;
6903 if ((sd->select_mode == ELM_OBJECT_SELECT_MODE_NONE) ||
6904 (sd->select_mode == ELM_OBJECT_SELECT_MODE_DISPLAY_ONLY ))
6908 EINA_LIST_FOREACH_SAFE(sd->selected, l, ll, it)
6913 EAPI Elm_Object_Select_Mode
6914 elm_genlist_select_mode_get(const Evas_Object *obj)
6916 ELM_GENLIST_CHECK(obj) ELM_OBJECT_SELECT_MODE_MAX;
6917 ELM_GENLIST_DATA_GET(obj, sd);
6919 return sd->select_mode;
6923 elm_genlist_highlight_mode_set(Evas_Object *obj,
6924 Eina_Bool highlight)
6926 ELM_GENLIST_CHECK(obj);
6927 ELM_GENLIST_DATA_GET(obj, sd);
6929 sd->highlight = !!highlight;
6933 elm_genlist_highlight_mode_get(const Evas_Object *obj)
6935 ELM_GENLIST_CHECK(obj) EINA_FALSE;
6936 ELM_GENLIST_DATA_GET(obj, sd);
6938 return sd->highlight;
6942 elm_genlist_item_select_mode_set(Elm_Object_Item *item,
6943 Elm_Object_Select_Mode mode)
6945 Elm_Gen_Item *it = (Elm_Gen_Item *)item;
6947 ELM_GENLIST_ITEM_CHECK_OR_RETURN(item);
6949 if (mode >= ELM_OBJECT_SELECT_MODE_MAX)
6951 if (it->select_mode != mode)
6952 it->select_mode = mode;
6954 if ((it->select_mode == ELM_OBJECT_SELECT_MODE_NONE) ||
6955 (it->select_mode == ELM_OBJECT_SELECT_MODE_DISPLAY_ONLY ))
6958 if (it->select_mode == ELM_OBJECT_SELECT_MODE_DISPLAY_ONLY)
6960 it->item->mincalcd = EINA_FALSE;
6961 it->item->updateme = EINA_TRUE;
6962 if (it->item->block) it->item->block->updateme = EINA_TRUE;
6963 if (GL_IT(it)->wsd->update_job)
6964 ecore_job_del(GL_IT(it)->wsd->update_job);
6965 GL_IT(it)->wsd->update_job =
6966 ecore_job_add(_update_job, GL_IT(it)->wsd);
6968 // reset homogeneous item size
6969 if (GL_IT(it)->wsd->homogeneous)
6972 GL_IT(it)->wsd->group_item_width =
6973 GL_IT(it)->wsd->group_item_height = 0;
6975 GL_IT(it)->wsd->item_width = GL_IT(it)->wsd->item_height = 0;
6980 EAPI Elm_Object_Select_Mode
6981 elm_genlist_item_select_mode_get(const Elm_Object_Item *item)
6983 Elm_Gen_Item *it = (Elm_Gen_Item *)item;
6985 ELM_GENLIST_ITEM_CHECK_OR_RETURN(item, ELM_OBJECT_SELECT_MODE_MAX);
6987 if (!it) return ELM_OBJECT_SELECT_MODE_MAX;
6989 return it->select_mode;
6992 // will be deprecated
6994 elm_genlist_tree_effect_enabled_set(Evas_Object *obj __UNUSED__,
6995 Eina_Bool enabled __UNUSED__)
6997 ELM_GENLIST_CHECK(obj);
7000 // will be deprecated
7002 elm_genlist_tree_effect_enabled_get(const Evas_Object *obj __UNUSED__)
7004 ELM_GENLIST_CHECK(obj) EINA_FALSE;
7009 EAPI Elm_Object_Item *
7010 elm_genlist_nth_item_get(const Evas_Object *obj, unsigned int nth)
7012 Elm_Gen_Item *it = NULL;
7016 ELM_GENLIST_CHECK(obj) NULL;
7017 ELM_GENLIST_DATA_GET(obj, sd);
7019 if (!sd->items) return NULL;
7021 a = eina_inlist_accessor_new(sd->items);
7022 if (!a) return NULL;
7023 if (eina_accessor_data_get(a, nth, &data))
7024 it = ELM_GEN_ITEM_FROM_INLIST(data);
7025 eina_accessor_free(a);
7026 return (Elm_Object_Item *)it;
7029 #if GENLIST_FX_SUPPORT
7031 elm_genlist_fx_mode_set(Evas_Object *obj, Eina_Bool mode)
7033 ELM_GENLIST_CHECK(obj);
7034 ELM_GENLIST_DATA_GET(obj, sd);
7040 elm_genlist_fx_mode_get(const Evas_Object *obj)
7042 ELM_GENLIST_CHECK(obj) EINA_FALSE;
7043 ELM_GENLIST_DATA_GET(obj, sd);
7049 _elm_genlist_proxy_item_del(const Elm_Object_Item *item)
7051 Elm_Gen_Item *it = (Elm_Gen_Item *)item;
7052 if ((!it) || (!it->item)) return EINA_FALSE;
7054 Elm_Genlist_Smart_Data *sd = GL_IT(it)->wsd;
7058 EINA_LIST_FOREACH(sd->capture_before_items, l, pi)
7059 if (pi->it == it) pi->it = NULL;
7061 EINA_LIST_FOREACH(sd->capture_after_items, l, pi)
7062 if (pi->it == it) pi->it = NULL;
7066 _elm_genlist_proxy_item_new(const Elm_Object_Item *item)
7068 Elm_Gen_Item *it = (Elm_Gen_Item *)item;
7069 if ((!it) || (!it->item)) return EINA_FALSE;
7072 Proxy_Item *pi = NULL;
7073 pi = calloc(1, sizeof(Proxy_Item));
7074 if (!pi) return NULL;
7076 pi->proxy = evas_object_image_filled_add
7077 (evas_object_evas_get(ELM_WIDGET_DATA(GL_IT(it)->wsd)->obj));
7078 if (!pi->proxy) return EINA_FALSE;
7079 evas_object_clip_set(pi->proxy, evas_object_clip_get(GL_IT(it)->wsd->pan_obj));
7080 evas_object_smart_member_add(pi->proxy, GL_IT(it)->wsd->pan_obj);
7081 evas_object_hide(pi->proxy);
7083 if ((GL_IT(it)->wsd->decorate_all_mode) && (it->deco_all_view))
7084 evas_object_image_source_set(pi->proxy, it->deco_all_view);
7086 evas_object_image_source_set(pi->proxy, VIEW(it));
7088 GL_IT(it)->has_proxy_it = EINA_TRUE;
7090 pi->num = it->item->num;
7091 pi->x = it->item->scrl_x;
7092 pi->y = it->item->scrl_y;
7093 pi->w = it->item->w;
7094 pi->h = it->item->h;
7096 evas_object_geometry_get(VIEW(it), NULL, NULL, &w, &h);
7098 if (w <= 0 || h <= 0)
7100 evas_object_size_hint_min_get(VIEW(it), &w, &h);
7101 evas_object_size_hint_min_set(pi->proxy, w, h);
7103 else evas_object_resize(pi->proxy, w, h);
7109 _elm_genlist_fx_capture(Evas_Object *obj, int level)
7111 ELM_GENLIST_DATA_GET(obj, sd);
7115 Eina_Bool done = EINA_FALSE;
7118 Evas_Coord ox, oy, ow, oh;
7120 if ((!sd->rendered) || (sd->fx_playing)) return EINA_FALSE;
7121 if ((!level) && (sd->fx_first_captured)) return EINA_FALSE;
7122 if ((level) && (!sd->fx_first_captured)) return EINA_FALSE;
7124 evas_object_geometry_get(sd->pan_obj, &ox, &oy, &ow, &oh);
7128 sd->fx_first_captured = EINA_TRUE;
7129 EINA_LIST_FREE(sd->capture_before_items, pi)
7131 if ((pi->it) && (GL_IT(pi->it))) GL_IT(pi->it)->has_proxy_it = EINA_FALSE;
7132 if (pi->proxy) evas_object_smart_member_del(pi->proxy);
7133 if (pi->proxy) evas_object_del(pi->proxy);
7139 EINA_LIST_FREE(sd->capture_after_items, pi)
7141 if ((pi->it) && (GL_IT(pi->it))) GL_IT(pi->it)->has_proxy_it = EINA_FALSE;
7142 if (pi->proxy) evas_object_smart_member_del(pi->proxy);
7143 if (pi->proxy) evas_object_del(pi->proxy);
7147 EINA_INLIST_FOREACH(sd->blocks, itb)
7151 EINA_LIST_FOREACH(itb->items, l, it)
7153 if (it->realized && it->item->scrl_y >= oy)
7155 sd->realized_top_item = it;
7160 if (sd->realized_top_item) break;
7164 #if GENLIST_PINCH_ZOOM_SUPPORT
7165 if (sd->pinch_zoom_mode)
7167 EINA_INLIST_FOREACH(sd->blocks, itb)
7169 EINA_LIST_FOREACH(itb->items, l, it)
7172 if (IS_ROOT_PARENT_IT(it) && it->realized
7173 && (GL_IT(it)->scrl_y + GL_IT(it)->h >= oy && GL_IT(it)->scrl_y <= oy + oh))
7175 pi = _elm_genlist_proxy_item_new((Elm_Object_Item *)it);
7176 if (!level) sd->capture_before_items = eina_list_append(sd->capture_before_items, pi);
7177 else sd->capture_after_items = eina_list_append(sd->capture_after_items, pi);
7181 if ((sd->pinch_zoom_mode == ELM_GEN_PINCH_ZOOM_CONTRACT) && (level)) return EINA_TRUE;
7182 if ((sd->pinch_zoom_mode == ELM_GEN_PINCH_ZOOM_EXPAND) && (!level)) return EINA_TRUE;
7186 EINA_INLIST_FOREACH(sd->blocks, itb)
7191 EINA_LIST_FOREACH(itb->items, l, it)
7193 #if GENLIST_PINCH_ZOOM_SUPPORT
7194 if ((sd->pinch_zoom_mode) && (IS_ROOT_PARENT_IT(it))) continue;
7198 pi = _elm_genlist_proxy_item_new((Elm_Object_Item *)it);
7201 sd->capture_before_items = eina_list_append(sd->capture_before_items, pi);
7203 sd->capture_after_items = eina_list_append(sd->capture_after_items, pi);
7207 else if (done) break;
7212 static Elm_Gen_FX_Item *
7213 _elm_genlist_fx_item_find(const Elm_Object_Item *item)
7215 Elm_Gen_Item *it = (Elm_Gen_Item *)item;
7216 if (!it) return EINA_FALSE;
7218 Elm_Genlist_Smart_Data *sd = GL_IT(it)->wsd;
7219 if (!sd) return NULL;
7221 Elm_Gen_FX_Item *fi = NULL;
7224 EINA_LIST_FOREACH(sd->fx_items, l, fi)
7226 if (fi->it == it) return fi;
7231 static Elm_Gen_FX_Item *
7232 _elm_genlist_fx_item_new(const Proxy_Item *pi)
7234 if ((!pi) || (!pi->it)) return NULL;
7236 Elm_Gen_FX_Item *fi = NULL;
7237 fi = calloc(1, sizeof(Elm_Gen_FX_Item));
7238 if (!fi) return NULL;
7241 GL_IT(fi->it)->fi = fi;
7242 fi->proxy = pi->proxy;
7244 fi->from.x = fi->to.x = pi->x;
7245 fi->from.y = fi->to.y = pi->y;
7246 fi->from.w = fi->to.w = pi->w;
7247 fi->from.h = fi->to.h = pi->h;
7248 fi->update = EINA_FALSE;
7253 static Elm_Object_Item *
7254 _elm_genlist_fx_item_prev_get(const Elm_Object_Item *item)
7257 it = (Elm_Gen_Item *)item;
7258 if ((!it) || (IS_ROOT_PARENT_IT(it))) return NULL;
7262 it = ELM_GEN_ITEM_FROM_INLIST(EINA_INLIST_GET(it)->prev);
7266 return (Elm_Object_Item *)it;
7270 _elm_genlist_fx_items_make(Evas_Object *obj)
7272 ELM_GENLIST_CHECK(obj) EINA_FALSE;
7273 ELM_GENLIST_DATA_GET(obj, sd);
7275 Elm_Gen_FX_Item *fi;
7278 Elm_Gen_Item *prev = NULL;
7279 Evas_Coord ox, oy, ow, oh, mv_dist, max_mv_dist = 0;
7281 evas_object_geometry_get(sd->pan_obj, &ox, &oy, &ow, &oh);
7283 EINA_LIST_FOREACH(sd->capture_before_items, l, pi)
7285 fi = _elm_genlist_fx_item_new(pi);
7286 if (fi) sd->fx_items = eina_list_append(sd->fx_items, fi);
7289 EINA_LIST_FOREACH(sd->capture_after_items, l, pi)
7291 fi = _elm_genlist_fx_item_find((Elm_Object_Item *)pi->it);
7293 if (fi) // pi exists in both before and after capture items
7295 fi->type = ELM_GEN_ITEM_FX_TYPE_SAME;
7296 fi->update = EINA_TRUE;
7302 // find the max distance between before and after capture items
7303 mv_dist = abs(fi->to.y - fi->from.y);
7304 if (max_mv_dist < mv_dist) max_mv_dist = mv_dist;
7306 else // pi only exists in after capture items
7308 fi = _elm_genlist_fx_item_new(pi);
7311 fi->type = ELM_GEN_ITEM_FX_TYPE_ADD;
7312 fi->update = EINA_TRUE;
7313 sd->fx_items = eina_list_append(sd->fx_items, fi);
7318 EINA_LIST_FOREACH(sd->fx_items, l, fi)
7320 // find deleted items
7321 if (!fi->update) // pi only exists in before capture items
7323 fi->type = ELM_GEN_ITEM_FX_TYPE_DEL;
7324 fi->update = EINA_TRUE;
7326 prev = (Elm_Gen_Item *)_elm_genlist_fx_item_prev_get((Elm_Object_Item *)fi->it);
7327 if ((prev) && (GL_IT(prev)->fi))
7329 fi->to.y = GL_IT(prev)->fi->to.y + GL_IT(prev)->fi->to.h;
7332 else if (fi->type == ELM_GEN_ITEM_FX_TYPE_ADD)
7334 prev = (Elm_Gen_Item *)_elm_genlist_fx_item_prev_get((Elm_Object_Item *)fi->it);
7335 if ((prev) && (prev->realized) && (GL_IT(prev)->fi))
7337 fi->from.y = GL_IT(prev)->fi->from.y + GL_IT(prev)->fi->from.h;
7341 if (sd->realized_top_item)
7344 if (fi->num <= sd->realized_top_item->item->num)
7345 fi->from.y -= max_mv_dist;
7347 fi->from.y += max_mv_dist;
7353 EINA_LIST_FOREACH(sd->fx_items, l, fi)
7355 if (IS_ROOT_PARENT_IT(fi->it))
7357 #if GENLIST_PINCH_ZOOM_SUPPORT
7358 if (sd->pinch_zoom_mode == ELM_GEN_PINCH_ZOOM_CONTRACT)
7360 fi->from.y = oy + GL_IT(fi->it)->pan_scrl_y - sd->pinch_pan_y;
7363 if (fi->type == ELM_GEN_ITEM_FX_TYPE_DEL)
7365 if (sd->realized_top_item)
7368 if (fi->num <= sd->realized_top_item->item->num)
7369 fi->to.y = oy - fi->from.h;
7380 static Elm_Gen_FX_Item *
7381 _fx_cover_item_get(const Elm_Gen_FX_Item *fi)
7383 Elm_Gen_FX_Item *cover_fi;
7385 if (!fi) return NULL;
7387 Elm_Genlist_Smart_Data *sd = GL_IT(fi->it)->wsd;
7388 Evas_Coord ox, oy, ow, oh;
7389 evas_object_geometry_get(sd->pan_obj, &ox, &oy, &ow, &oh);
7391 EINA_LIST_FOREACH(sd->fx_items, l, cover_fi)
7393 if (fi == cover_fi) continue;
7394 if (sd->fx_items_deleted)
7396 if ((cover_fi->from.y >= oy+oh || cover_fi->from.y > fi->to.y) && (cover_fi->from.y - cover_fi->to.y > 0))
7401 if ((cover_fi->to.y > fi->to.y) && (cover_fi->from.y - cover_fi->to.y < 0))
7409 _item_fx_op(Elm_Transit_Effect *data, Elm_Transit *transit __UNUSED__, double progress __UNUSED__)
7411 Elm_Gen_FX_Item *fi = data, *cover_it;
7412 Elm_Genlist_Smart_Data *sd = GL_IT(fi->it)->wsd;
7413 Evas_Coord fi_ox, fi_oy, cover_it_ox, cover_it_oy, ox, oy, ow, oh;
7415 evas_object_show(VIEW(fi->it));
7416 evas_object_geometry_get(sd->pan_obj, &ox, &oy, &ow, &oh);
7417 evas_object_geometry_get(fi->proxy, &fi_ox, &fi_oy, NULL, NULL);
7418 evas_object_move(fi->proxy, ox, fi_oy);
7419 evas_object_show(fi->proxy);
7420 #if GENLIST_PINCH_ZOOM_SUPPORT
7421 if ((sd->pinch_zoom_mode) && (IS_ROOT_PARENT_IT(fi->it))) evas_object_raise(fi->proxy);
7424 if ((!sd->expanded_next_item) || (sd->expanded_next_item == fi->it)) goto raise_event_block;
7425 if (fi->type == ELM_GEN_ITEM_FX_TYPE_SAME) goto raise_event_block;
7427 // find the closest item that cover current item when deleting
7428 cover_it = _fx_cover_item_get(fi);
7431 evas_object_geometry_get(cover_it->proxy, &cover_it_ox, &cover_it_oy, NULL, NULL);
7433 if (sd->fx_items_deleted)
7436 && (fi_oy + fi->to.h >= cover_it_oy + cover_it->to.h ) && (fi->from.y < cover_it->from.y))
7437 evas_object_hide(fi->proxy);
7439 else if (cover_it_oy && (fi_oy >= cover_it_oy))
7440 evas_object_hide(fi->proxy);
7442 evas_object_show(fi->proxy);
7446 evas_object_raise(sd->alpha_bg);
7453 _item_fx_done(Elm_Transit_Effect *data, Elm_Transit *transit __UNUSED__)
7455 Elm_Gen_FX_Item *fx_done_it = data;
7456 Elm_Genlist_Smart_Data *sd = GL_IT(fx_done_it->it)->wsd;
7458 if ((!fx_done_it) || (!fx_done_it->it) || (!sd)) return;
7460 evas_object_image_source_visible_set(fx_done_it->proxy, EINA_TRUE);
7461 evas_object_lower(fx_done_it->proxy);
7463 if ((sd->decorate_all_mode) && (fx_done_it->it->deco_all_view))
7464 evas_object_move(fx_done_it->it->deco_all_view, fx_done_it->to.x, fx_done_it->to.y);
7466 evas_object_move(VIEW(fx_done_it->it), fx_done_it->to.x, fx_done_it->to.y);
7467 GL_IT(fx_done_it->it)->has_proxy_it = EINA_FALSE;
7469 evas_object_clip_unset(fx_done_it->proxy);
7473 _item_fx_del_cb(void *data, Elm_Transit *transit __UNUSED__)
7475 Elm_Gen_FX_Item *fx_done_it = data;
7476 Elm_Gen_Item *it = NULL;
7477 Proxy_Item *pi = NULL;
7479 Elm_Genlist_Smart_Data *sd = GL_IT(fx_done_it->it)->wsd;
7481 if ((!fx_done_it) || (!fx_done_it->it) || (!sd)) return;
7483 sd->fx_items = eina_list_remove(sd->fx_items, fx_done_it);
7484 GL_IT(fx_done_it->it)->fi = NULL;
7487 if (!eina_list_count(sd->fx_items))
7489 EINA_LIST_FREE (sd->pending_unrealized_items, it)
7491 if (GL_IT(it)) GL_IT(it)->has_proxy_it = EINA_FALSE;
7492 #if GENLIST_PINCH_ZOOM_SUPPORT
7493 if ((sd->pinch_zoom_mode) && (IS_ROOT_PARENT_IT(it))) continue;
7495 _item_unrealize(it, EINA_FALSE);
7497 EINA_LIST_FREE (sd->pending_unrealized_decorate_all_items, it)
7499 if (GL_IT(it)) GL_IT(it)->has_proxy_it = EINA_FALSE;
7500 #if GENLIST_PINCH_ZOOM_SUPPORT
7501 if ((sd->pinch_zoom_mode) && (IS_ROOT_PARENT_IT(it))) continue;
7503 _decorate_all_item_unrealize(it);
7506 EINA_LIST_FREE (sd->pending_del_items, it)
7509 _elm_widget_item_free((Elm_Widget_Item *)it);
7512 EINA_LIST_FOREACH(sd->capture_before_items, l, pi)
7513 evas_object_hide(pi->proxy);
7514 EINA_LIST_FOREACH(sd->capture_after_items, l, pi)
7515 evas_object_hide(pi->proxy);
7517 sd->fx_playing = EINA_FALSE;
7518 sd->fx_first_captured = EINA_FALSE;
7519 evas_object_hide(sd->alpha_bg);
7521 sd->realized_top_item = NULL;
7522 sd->pan_changed = EINA_TRUE;
7523 evas_object_smart_changed(sd->pan_obj);
7528 _elm_genlist_fx_play(Evas_Object *obj)
7530 ELM_GENLIST_CHECK(obj);
7531 ELM_GENLIST_DATA_GET(obj, sd);
7533 Evas_Coord ox, oy, ow, oh, cvx, cvy, cvw, cvh;
7534 Elm_Gen_FX_Item *fi;
7537 if (!sd->fx_mode) return;
7539 EINA_LIST_FREE(sd->fx_items, fi)
7541 if (fi->trans) elm_transit_del(fi->trans);
7544 _item_cache_all_free(sd);
7546 _elm_genlist_fx_items_make(obj);
7547 if (!eina_list_count(sd->fx_items) || (sd->queue))
7549 _elm_genlist_fx_clear(obj);
7553 sd->fx_playing = EINA_TRUE;
7555 if (!sd->alpha_bg) sd->alpha_bg = _tray_alpha_bg_create(obj);
7556 evas_object_show(sd->alpha_bg);
7558 evas_object_geometry_get(sd->pan_obj, &ox, &oy, &ow, &oh);
7559 evas_output_viewport_get(evas_object_evas_get(obj), &cvx, &cvy, &cvw, &cvh);
7561 EINA_LIST_FOREACH(sd->fx_items, l, fi)
7563 if (!fi->proxy) continue;
7565 if ((fi->from.y <= oy) || (fi->from.y + fi->from.h >= oy + oh))
7567 if ((sd->decorate_all_mode) && (fi->it->deco_all_view))
7568 evas_object_move(fi->it->deco_all_view, cvx, fi->to.y);
7570 evas_object_move(VIEW(fi->it), cvx, fi->to.y);
7572 else if ((fi->to.y <= oy) || (fi->to.y + fi->to.h >= oy + oh))
7574 if ((sd->decorate_all_mode) && (fi->it->deco_all_view))
7575 evas_object_move(fi->it->deco_all_view, cvx, fi->from.y);
7577 evas_object_move(VIEW(fi->it), cvx, fi->from.y);
7580 evas_object_resize(fi->proxy, ow, fi->to.h);
7581 evas_object_show(fi->proxy);
7583 fi->trans = elm_transit_add();
7584 elm_transit_object_add(fi->trans, fi->proxy);
7586 evas_object_image_source_visible_set(fi->proxy, EINA_FALSE);
7587 elm_transit_tween_mode_set(fi->trans, ELM_TRANSIT_TWEEN_MODE_DECELERATE);
7589 if (fi->type == ELM_GEN_ITEM_FX_TYPE_SAME)
7591 evas_object_raise(fi->proxy);
7592 elm_transit_effect_translation_add(fi->trans, fi->from.x, fi->from.y, fi->to.x, fi->to.y);
7595 else if (fi->type == ELM_GEN_ITEM_FX_TYPE_ADD)
7597 elm_transit_effect_translation_add(fi->trans, fi->from.x, fi->from.y, fi->to.x, fi->to.y);
7598 elm_transit_effect_color_add(fi->trans, 0, 0, 0, 0, 255, 255, 255, 255);
7600 else if (fi->type == ELM_GEN_ITEM_FX_TYPE_DEL)
7602 elm_transit_effect_translation_add(fi->trans, fi->from.x, fi->from.y, fi->to.x, fi->to.y);
7603 elm_transit_effect_color_add(fi->trans, 255, 255, 255, 255, 0, 0, 0, 0);
7605 elm_transit_effect_add(fi->trans, _item_fx_op, fi, _item_fx_done);
7606 elm_transit_del_cb_set(fi->trans, _item_fx_del_cb, fi);
7608 elm_transit_duration_set(fi->trans, FX_MOVE_TIME);
7609 elm_transit_objects_final_state_keep_set(fi->trans, EINA_FALSE);
7610 elm_transit_go(fi->trans);
7615 #if GENLIST_PINCH_ZOOM_SUPPORT
7617 elm_genlist_pinch_zoom_mode_set(Evas_Object *obj, Elm_Gen_Pinch_Zoom_Mode mode)
7619 ELM_GENLIST_DATA_GET(obj, sd);
7624 Eina_Bool done = EINA_FALSE;
7626 if ((sd->queue) || (!sd->rendered) || (sd->queue_idle_enterer)) return EINA_FALSE;
7628 EINA_INLIST_FOREACH(sd->blocks, itb)
7630 EINA_LIST_FOREACH(itb->items, l, it)
7633 if (IS_ROOT_PARENT_IT(it))
7641 if (!done) return EINA_FALSE;
7643 sd->pinch_zoom_mode = mode;
7645 _item_cache_all_free(sd);
7646 _elm_genlist_fx_capture(obj, 0);
7648 sd->pinch_pan_y = sd->pan_y;
7650 if (sd->pinch_zoom_mode == ELM_GEN_PINCH_ZOOM_CONTRACT)
7651 sd->s_iface->content_region_show(obj, 0,0,0,0);
7653 sd->pan_changed = EINA_TRUE;
7654 evas_object_smart_changed(sd->pan_obj);