3 #include <Elementary.h>
4 #include <Elementary_Cursor.h>
6 #include "els_scroller.h"
7 #include "elm_gen_common.h"
9 #define MAX_ITEMS_PER_BLOCK 32
10 #define REORDER_EFFECT_TIME 0.5
12 #define ELM_GEN_SETUP(wd) \
13 (wd)->calc_cb = (Ecore_Cb)_calc_job; \
14 (wd)->clear_cb = (Ecore_Cb)_clear_cb; \
15 (wd)->sizing_cb = (Ecore_Cb)_sizing_eval
17 #define ELM_GEN_ITEM_SETUP(it) \
18 (it)->del_cb = (Ecore_Cb)_item_del; \
19 (it)->highlight_cb = (Ecore_Cb)_item_highlight; \
20 (it)->unsel_cb = (Ecore_Cb)_item_unselect; \
21 (it)->unhighlight_cb = (Ecore_Cb)_item_unhighlight; \
22 (it)->unrealize_cb = (Ecore_Cb)_item_unrealize_cb
24 typedef struct _Item_Block Item_Block;
25 typedef struct _Item_Cache Item_Cache;
27 struct Elm_Gen_Item_Type
32 Evas_Coord w, h, minw, minh;
33 Elm_Gen_Item *group_item;
34 Elm_Genlist_Item_Flags flags;
35 Eina_List *mode_texts, *mode_contents, *mode_states, *mode_content_objs;
36 Ecore_Timer *swipe_timer;
37 Evas_Coord scrl_x, scrl_y, old_scrl_y;
40 Evas_Object *mode_view;
46 Eina_Bool want_realize : 1;
47 Eina_Bool expanded : 1;
48 Eina_Bool mincalcd : 1;
51 Eina_Bool updateme : 1;
52 Eina_Bool nocache : 1;
53 Eina_Bool stacking_even : 1;
54 Eina_Bool nostacking : 1;
55 Eina_Bool move_effect_enabled : 1;
66 Evas_Coord x, y, w, h, minw, minh;
68 int item_position_stamp;
70 Eina_Bool position_update : 1;
71 Eina_Bool want_unrealize : 1;
72 Eina_Bool realized : 1;
73 Eina_Bool changed : 1;
74 Eina_Bool updateme : 1;
76 Eina_Bool must_recalc : 1;
83 Evas_Object *base_view, *spacer;
85 const char *item_style; // it->itc->item_style
86 Eina_Bool tree : 1; // it->group
87 Eina_Bool compress : 1; // it->wd->compress
89 Eina_Bool selected : 1; // it->selected
90 Eina_Bool disabled : 1; // it->disabled
91 Eina_Bool expanded : 1; // it->item->expanded
94 static const char *widtype = NULL;
95 static void _item_cache_zero(Widget_Data *wd);
96 static void _del_hook(Evas_Object *obj);
97 static void _mirrored_set(Evas_Object *obj,
99 static void _theme_hook(Evas_Object *obj);
100 static void _show_region_hook(void *data,
102 static void _sizing_eval(Evas_Object *obj);
103 static void _item_realize(Elm_Gen_Item *it,
106 static void _item_unrealize_cb(Elm_Gen_Item *it);
107 static void _item_block_unrealize(Item_Block *itb);
108 static void _calc_job(void *data);
109 static void _on_focus_hook(void *data,
111 static Eina_Bool _item_multi_select_up(Widget_Data *wd);
112 static Eina_Bool _item_multi_select_down(Widget_Data *wd);
113 static Eina_Bool _item_single_select_up(Widget_Data *wd);
114 static Eina_Bool _item_single_select_down(Widget_Data *wd);
115 static Eina_Bool _event_hook(Evas_Object *obj,
117 Evas_Callback_Type type,
119 static void _signal_emit_hook(Evas_Object *obj,
120 const char *emission,
122 static Eina_Bool _deselect_all_items(Widget_Data *wd);
123 static void _pan_calculate(Evas_Object *obj);
124 static void _pan_max_get(Evas_Object *obj,
127 static void _item_position(Elm_Gen_Item *it,
131 static void _mode_item_realize(Elm_Gen_Item *it);
132 static void _mode_item_unrealize(Elm_Gen_Item *it);
133 static void _item_mode_set(Elm_Gen_Item *it);
134 static void _item_mode_unset(Widget_Data *wd);
135 static void _group_items_recalc(void *data);
136 static void _item_move_after(Elm_Gen_Item *it,
137 Elm_Gen_Item *after);
138 static void _item_move_before(Elm_Gen_Item *it,
139 Elm_Gen_Item *before);
140 static void _item_auto_scroll(Widget_Data *wd);
141 static void _elm_genlist_clear(Evas_Object *obj,
143 static void _pan_child_size_get(Evas_Object *obj,
147 static Evas_Smart_Class _pan_sc = EVAS_SMART_CLASS_INIT_VERSION;
149 static const char SIG_ACTIVATED[] = "activated";
150 static const char SIG_CLICKED_DOUBLE[] = "clicked,double";
151 static const char SIG_SELECTED[] = "selected";
152 static const char SIG_UNSELECTED[] = "unselected";
153 static const char SIG_EXPANDED[] = "expanded";
154 static const char SIG_CONTRACTED[] = "contracted";
155 static const char SIG_EXPAND_REQUEST[] = "expand,request";
156 static const char SIG_CONTRACT_REQUEST[] = "contract,request";
157 static const char SIG_REALIZED[] = "realized";
158 static const char SIG_UNREALIZED[] = "unrealized";
159 static const char SIG_DRAG_START_UP[] = "drag,start,up";
160 static const char SIG_DRAG_START_DOWN[] = "drag,start,down";
161 static const char SIG_DRAG_START_LEFT[] = "drag,start,left";
162 static const char SIG_DRAG_START_RIGHT[] = "drag,start,right";
163 static const char SIG_DRAG_STOP[] = "drag,stop";
164 static const char SIG_DRAG[] = "drag";
165 static const char SIG_LONGPRESSED[] = "longpressed";
166 static const char SIG_SCROLL_ANIM_START[] = "scroll,anim,start";
167 static const char SIG_SCROLL_ANIM_STOP[] = "scroll,anim,stop";
168 static const char SIG_SCROLL_DRAG_START[] = "scroll,drag,start";
169 static const char SIG_SCROLL_DRAG_STOP[] = "scroll,drag,stop";
170 static const char SIG_EDGE_TOP[] = "edge,top";
171 static const char SIG_EDGE_BOTTOM[] = "edge,bottom";
172 static const char SIG_EDGE_LEFT[] = "edge,left";
173 static const char SIG_EDGE_RIGHT[] = "edge,right";
174 static const char SIG_MULTI_SWIPE_LEFT[] = "multi,swipe,left";
175 static const char SIG_MULTI_SWIPE_RIGHT[] = "multi,swipe,right";
176 static const char SIG_MULTI_SWIPE_UP[] = "multi,swipe,up";
177 static const char SIG_MULTI_SWIPE_DOWN[] = "multi,swipe,down";
178 static const char SIG_MULTI_PINCH_OUT[] = "multi,pinch,out";
179 static const char SIG_MULTI_PINCH_IN[] = "multi,pinch,in";
180 static const char SIG_SWIPE[] = "swipe";
181 static const char SIG_MOVED[] = "moved";
182 static const char SIG_INDEX_UPDATE[] = "index,update";
184 static const Evas_Smart_Cb_Description _signals[] = {
185 {SIG_CLICKED_DOUBLE, ""},
188 {SIG_UNSELECTED, ""},
190 {SIG_CONTRACTED, ""},
191 {SIG_EXPAND_REQUEST, ""},
192 {SIG_CONTRACT_REQUEST, ""},
194 {SIG_UNREALIZED, ""},
195 {SIG_DRAG_START_UP, ""},
196 {SIG_DRAG_START_DOWN, ""},
197 {SIG_DRAG_START_LEFT, ""},
198 {SIG_DRAG_START_RIGHT, ""},
201 {SIG_LONGPRESSED, ""},
202 {SIG_SCROLL_ANIM_START, ""},
203 {SIG_SCROLL_ANIM_STOP, ""},
204 {SIG_SCROLL_DRAG_START, ""},
205 {SIG_SCROLL_DRAG_STOP, ""},
207 {SIG_EDGE_BOTTOM, ""},
209 {SIG_EDGE_RIGHT, ""},
210 {SIG_MULTI_SWIPE_LEFT, ""},
211 {SIG_MULTI_SWIPE_RIGHT, ""},
212 {SIG_MULTI_SWIPE_UP, ""},
213 {SIG_MULTI_SWIPE_DOWN, ""},
214 {SIG_MULTI_PINCH_OUT, ""},
215 {SIG_MULTI_PINCH_IN, ""},
222 #undef ELM_CHECK_WIDTYPE
223 #define ELM_CHECK_WIDTYPE(obj, widtype) \
224 if ((!obj) || (!elm_genlist_type_check((obj), __func__))) return
225 #undef ELM_WIDGET_ITEM_WIDTYPE_CHECK_OR_RETURN
226 #define ELM_WIDGET_ITEM_WIDTYPE_CHECK_OR_RETURN(it, ...) \
227 ELM_WIDGET_ITEM_CHECK_OR_RETURN((Elm_Widget_Item *)it, __VA_ARGS__); \
228 ELM_CHECK_WIDTYPE(WIDGET((it)), widtype) __VA_ARGS__;
230 static const char *_gengrid = NULL;
231 static const char *_genlist = NULL;
233 /* THIS FUNCTION IS HACKY AND TEMPORARY!!! */
235 elm_genlist_type_check(const Evas_Object *obj,
238 const char *provided, *expected = "(unknown)";
239 static int abort_on_warn = -1;
240 provided = elm_widget_type_get(obj);
241 if (!_genlist) _genlist = eina_stringshare_add("genlist");
242 if (!_gengrid) _gengrid = eina_stringshare_add("gengrid");
243 if (EINA_LIKELY(provided == _genlist) || EINA_LIKELY(provided == _gengrid))
245 if ((!provided) || (!provided[0]))
247 provided = evas_object_type_get(obj);
248 if ((!provided) || (!provided[0]))
249 provided = "(unknown)";
251 ERR("Passing Object: %p in function: %s, of type: '%s' when expecting type: '%s'", obj, func, provided, expected);
252 if (abort_on_warn == -1)
254 if (getenv("ELM_ERROR_ABORT")) abort_on_warn = 1;
255 else abort_on_warn = 0;
257 if (abort_on_warn == 1) abort();
262 _event_hook(Evas_Object *obj,
263 Evas_Object *src __UNUSED__,
264 Evas_Callback_Type type,
267 if (type != EVAS_CALLBACK_KEY_DOWN) return EINA_FALSE;
268 Evas_Event_Key_Down *ev = event_info;
269 Widget_Data *wd = elm_widget_data_get(obj);
270 Evas_Coord pan_max_x = 0, pan_max_y = 0;
271 if (!wd) return EINA_FALSE;
272 if (!wd->items) return EINA_FALSE;
273 if (ev->event_flags & EVAS_EVENT_FLAG_ON_HOLD) return EINA_FALSE;
274 if (elm_widget_disabled_get(obj)) return EINA_FALSE;
276 Elm_Object_Item *it = NULL;
279 Evas_Coord step_x = 0;
280 Evas_Coord step_y = 0;
283 Evas_Coord page_x = 0;
284 Evas_Coord page_y = 0;
286 elm_smart_scroller_child_pos_get(wd->scr, &x, &y);
287 elm_smart_scroller_step_size_get(wd->scr, &step_x, &step_y);
288 elm_smart_scroller_page_size_get(wd->scr, &page_x, &page_y);
289 elm_smart_scroller_child_viewport_size_get(wd->scr, &v_w, &v_h);
291 if ((!strcmp(ev->keyname, "Left")) || (!strcmp(ev->keyname, "KP_Left")))
295 else if ((!strcmp(ev->keyname, "Right")) || (!strcmp(ev->keyname, "KP_Right")))
299 else if ((!strcmp(ev->keyname, "Up")) || (!strcmp(ev->keyname, "KP_Up")))
301 if (((evas_key_modifier_is_set(ev->modifiers, "Shift")) &&
302 (_item_multi_select_up(wd)))
303 || (_item_single_select_up(wd)))
305 ev->event_flags |= EVAS_EVENT_FLAG_ON_HOLD;
311 else if ((!strcmp(ev->keyname, "Down")) || (!strcmp(ev->keyname, "KP_Down")))
313 if (((evas_key_modifier_is_set(ev->modifiers, "Shift")) &&
314 (_item_multi_select_down(wd)))
315 || (_item_single_select_down(wd)))
317 ev->event_flags |= EVAS_EVENT_FLAG_ON_HOLD;
323 else if ((!strcmp(ev->keyname, "Home")) || (!strcmp(ev->keyname, "KP_Home")))
325 it = elm_genlist_first_item_get(obj);
326 elm_genlist_item_bring_in(it);
327 ev->event_flags |= EVAS_EVENT_FLAG_ON_HOLD;
330 else if ((!strcmp(ev->keyname, "End")) || (!strcmp(ev->keyname, "KP_End")))
332 it = elm_genlist_last_item_get(obj);
333 elm_genlist_item_bring_in(it);
334 ev->event_flags |= EVAS_EVENT_FLAG_ON_HOLD;
337 else if ((!strcmp(ev->keyname, "Prior")) || (!strcmp(ev->keyname, "KP_Prior")))
340 y -= -(page_y * v_h) / 100;
344 else if ((!strcmp(ev->keyname, "Next")) || (!strcmp(ev->keyname, "KP_Next")))
347 y += -(page_y * v_h) / 100;
351 else if (!strcmp(ev->keyname, "Escape"))
353 if (!_deselect_all_items(wd)) return EINA_FALSE;
354 ev->event_flags |= EVAS_EVENT_FLAG_ON_HOLD;
357 else if (((!strcmp(ev->keyname, "Return")) ||
358 (!strcmp(ev->keyname, "KP_Enter")) ||
359 (!strcmp(ev->keyname, "space")))
360 && (!wd->multi) && (wd->selected))
362 it = elm_genlist_selected_item_get(obj);
363 elm_genlist_item_expanded_set(it,
364 !elm_genlist_item_expanded_get(it));
365 evas_object_smart_callback_call(WIDGET(it), SIG_ACTIVATED, it);
367 else return EINA_FALSE;
369 ev->event_flags |= EVAS_EVENT_FLAG_ON_HOLD;
370 _pan_max_get(wd->pan_smart, &pan_max_x, &pan_max_y);
372 if (x > pan_max_x) x = pan_max_x;
374 if (y > pan_max_y) y = pan_max_y;
375 elm_smart_scroller_child_pos_set(wd->scr, x, y);
380 _deselect_all_items(Widget_Data *wd)
382 if (!wd->selected) return EINA_FALSE;
384 elm_genlist_item_selected_set(wd->selected->data, EINA_FALSE);
390 _item_multi_select_up(Widget_Data *wd)
392 if (!wd->selected) return EINA_FALSE;
393 if (!wd->multi) return EINA_FALSE;
395 Elm_Object_Item *prev = elm_genlist_item_prev_get((Elm_Object_Item *) wd->last_selected_item);
396 if (!prev) return EINA_TRUE;
398 if (elm_genlist_item_selected_get(prev))
400 elm_genlist_item_selected_set((Elm_Object_Item *) wd->last_selected_item, EINA_FALSE);
401 wd->last_selected_item = (Elm_Gen_Item *) prev;
402 elm_genlist_item_show((Elm_Object_Item *) wd->last_selected_item);
406 elm_genlist_item_selected_set(prev, EINA_TRUE);
407 elm_genlist_item_show(prev);
413 _item_multi_select_down(Widget_Data *wd)
415 if (!wd->selected) return EINA_FALSE;
416 if (!wd->multi) return EINA_FALSE;
418 Elm_Object_Item *next;
419 next = elm_genlist_item_next_get((Elm_Object_Item *) wd->last_selected_item);
420 if (!next) return EINA_TRUE;
422 if (elm_genlist_item_selected_get(next))
424 elm_genlist_item_selected_set((Elm_Object_Item *) wd->last_selected_item, EINA_FALSE);
425 wd->last_selected_item = (Elm_Gen_Item *) next;
426 elm_genlist_item_show((Elm_Object_Item *) wd->last_selected_item);
430 elm_genlist_item_selected_set(next, EINA_TRUE);
431 elm_genlist_item_show(next);
437 _item_single_select_up(Widget_Data *wd)
442 prev = ELM_GEN_ITEM_FROM_INLIST(wd->items->last);
443 while ((prev) && (prev->generation < wd->generation))
444 prev = ELM_GEN_ITEM_FROM_INLIST(EINA_INLIST_GET(prev)->prev);
446 else prev = (Elm_Gen_Item *) elm_genlist_item_prev_get((Elm_Object_Item *) wd->last_selected_item);
448 if (!prev) return EINA_FALSE;
450 _deselect_all_items(wd);
452 elm_genlist_item_selected_set((Elm_Object_Item *) prev, EINA_TRUE);
453 elm_genlist_item_show((Elm_Object_Item *) prev);
458 _item_single_select_down(Widget_Data *wd)
463 next = ELM_GEN_ITEM_FROM_INLIST(wd->items);
464 while ((next) && (next->generation < wd->generation))
465 next = ELM_GEN_ITEM_FROM_INLIST(EINA_INLIST_GET(next)->next);
467 else next = (Elm_Gen_Item *) elm_genlist_item_next_get((Elm_Object_Item *) wd->last_selected_item);
469 if (!next) return EINA_FALSE;
471 _deselect_all_items(wd);
473 elm_genlist_item_selected_set((Elm_Object_Item *) next, EINA_TRUE);
474 elm_genlist_item_show((Elm_Object_Item *) next);
479 _on_focus_hook(void *data __UNUSED__,
482 Widget_Data *wd = elm_widget_data_get(obj);
484 if (elm_widget_focus_get(obj))
486 elm_object_signal_emit(wd->obj, "elm,action,focus", "elm");
487 evas_object_focus_set(wd->obj, EINA_TRUE);
488 if ((wd->selected) && (!wd->last_selected_item))
489 wd->last_selected_item = eina_list_data_get(wd->selected);
493 elm_object_signal_emit(wd->obj, "elm,action,unfocus", "elm");
494 evas_object_focus_set(wd->obj, EINA_FALSE);
499 _del_hook(Evas_Object *obj)
501 Widget_Data *wd = elm_widget_data_get(obj);
503 _item_cache_zero(wd);
504 if (wd->calc_job) ecore_job_del(wd->calc_job);
505 if (wd->update_job) ecore_job_del(wd->update_job);
506 if (wd->queue_idle_enterer) ecore_idle_enterer_del(wd->queue_idle_enterer);
507 if (wd->must_recalc_idler) ecore_idler_del(wd->must_recalc_idler);
508 if (wd->multi_timer) ecore_timer_del(wd->multi_timer);
509 if (wd->mode_type) eina_stringshare_del(wd->mode_type);
510 if (wd->scr_hold_timer) ecore_timer_del(wd->scr_hold_timer);
515 _del_pre_hook(Evas_Object *obj)
517 Widget_Data *wd = elm_widget_data_get(obj);
519 elm_genlist_clear(obj);
520 evas_object_del(wd->pan_smart);
521 wd->pan_smart = NULL;
525 _mirrored_set(Evas_Object *obj,
528 Widget_Data *wd = elm_widget_data_get(obj);
530 _item_cache_zero(wd);
531 elm_smart_scroller_mirrored_set(wd->scr, rtl);
535 _theme_hook(Evas_Object *obj)
537 Widget_Data *wd = elm_widget_data_get(obj);
540 evas_event_freeze(evas_object_evas_get(wd->obj));
541 _item_cache_zero(wd);
542 _elm_widget_mirrored_reload(obj);
543 _mirrored_set(obj, elm_widget_mirrored_get(obj));
544 elm_smart_scroller_object_theme_set(obj, wd->scr, "genlist", "base",
545 elm_widget_style_get(obj));
546 edje_object_scale_set(wd->scr, elm_widget_scale_get(obj) * _elm_config->scale);
547 wd->item_width = wd->item_height = 0;
548 wd->group_item_width = wd->group_item_height = 0;
549 wd->minw = wd->minh = wd->realminw = 0;
550 EINA_INLIST_FOREACH(wd->blocks, itb)
555 if (itb->realized) _item_block_unrealize(itb);
556 EINA_LIST_FOREACH(itb->items, l, it)
557 it->item->mincalcd = EINA_FALSE;
559 itb->changed = EINA_TRUE;
561 if (wd->calc_job) ecore_job_del(wd->calc_job);
562 wd->calc_job = ecore_job_add(_calc_job, wd);
564 evas_event_thaw(evas_object_evas_get(wd->obj));
565 evas_event_thaw_eval(evas_object_evas_get(wd->obj));
569 _show_region_hook(void *data,
572 Widget_Data *wd = elm_widget_data_get(data);
573 Evas_Coord x, y, w, h;
575 elm_widget_show_region_get(obj, &x, &y, &w, &h);
576 //x & y are screen coordinates, Add with pan coordinates
579 elm_smart_scroller_child_region_show(wd->scr, x, y, w, h);
583 _translate_hook(Evas_Object *obj)
585 evas_object_smart_callback_call(obj, "language,changed", NULL);
589 _sizing_eval(Evas_Object *obj)
591 Widget_Data *wd = elm_widget_data_get(obj);
592 Evas_Coord minw = -1, minh = -1, maxw = -1, maxh = -1;
594 evas_object_size_hint_min_get(wd->scr, &minw, &minh);
595 evas_object_size_hint_max_get(wd->scr, &maxw, &maxh);
597 if (wd->height_for_width)
601 elm_smart_scroller_child_viewport_size_get(wd->scr, &vw, &vh);
602 if ((vw != 0) && (vw != wd->prev_viewport_w))
606 wd->prev_viewport_w = vw;
607 EINA_INLIST_FOREACH(wd->blocks, itb)
609 itb->must_recalc = EINA_TRUE;
611 if (wd->calc_job) ecore_job_del(wd->calc_job);
612 wd->calc_job = ecore_job_add(_calc_job, wd);
615 if (wd->mode == ELM_LIST_LIMIT)
621 edje_object_size_min_calc
622 (elm_smart_scroller_edje_object_get(wd->scr), &vmw, &vmh);
629 edje_object_size_min_calc
630 (elm_smart_scroller_edje_object_get(wd->scr), &vmw, &vmh);
634 evas_object_size_hint_min_set(obj, minw, minh);
635 evas_object_size_hint_max_set(obj, maxw, maxh);
639 _signal_emit_hook(Evas_Object *obj,
640 const char *emission,
643 Widget_Data *wd = elm_widget_data_get(obj);
644 edje_object_signal_emit(elm_smart_scroller_edje_object_get(wd->scr),
649 _item_highlight(Elm_Gen_Item *it)
651 const char *selectraise;
652 if ((it->wd->no_select) || (it->generation < it->wd->generation) || (it->highlighted) ||
653 (it->disabled) || (it->display_only) || (it->item->mode_view))
655 edje_object_signal_emit(VIEW(it), "elm,state,selected", "elm");
656 selectraise = edje_object_data_get(VIEW(it), "selectraise");
657 if ((selectraise) && (!strcmp(selectraise, "on")))
659 evas_object_raise(VIEW(it));
660 if ((it->item->group_item) && (it->item->group_item->realized))
661 evas_object_raise(it->item->VIEW(group_item));
663 it->highlighted = EINA_TRUE;
667 _item_unhighlight(Elm_Gen_Item *it)
669 if ((it->generation < it->wd->generation) || (!it->highlighted)) return;
670 edje_object_signal_emit(VIEW(it), "elm,state,unselected", "elm");
671 if (!it->item->nostacking)
673 if ((it->item->order_num_in & 0x1) ^ it->item->stacking_even) evas_object_lower(VIEW(it));
674 else evas_object_raise(VIEW(it));
676 it->highlighted = EINA_FALSE;
680 _item_block_position_update(Eina_Inlist *list, int idx)
684 EINA_INLIST_FOREACH(list, tmp)
686 tmp->position = idx++;
687 tmp->position_update = EINA_TRUE;
692 _item_position_update(Eina_List *list, int idx)
697 EINA_LIST_FOREACH(list, l, it)
699 it->position = idx++;
700 it->position_update = EINA_TRUE;
705 _item_block_del(Elm_Gen_Item *it)
708 Item_Block *itb = it->item->block;
710 itb->items = eina_list_remove(itb->items, it);
712 itb->changed = EINA_TRUE;
713 if (it->wd->calc_job) ecore_job_del(it->wd->calc_job);
714 it->wd->calc_job = ecore_job_add(_calc_job, it->wd);
717 il = EINA_INLIST_GET(itb);
718 Item_Block *itbn = (Item_Block *)(il->next);
720 it->parent->item->items = eina_list_remove(it->parent->item->items, it);
723 _item_block_position_update(il->next, itb->position);
724 it->wd->blocks = eina_inlist_remove(it->wd->blocks, il);
727 if (itbn) itbn->changed = EINA_TRUE;
731 if (itb->count < itb->wd->max_items_per_block/2)
733 il = EINA_INLIST_GET(itb);
734 Item_Block *itbp = (Item_Block *)(il->prev);
735 Item_Block *itbn = (Item_Block *)(il->next);
736 if ((itbp) && ((itbp->count + itb->count) < itb->wd->max_items_per_block + itb->wd->max_items_per_block/2))
740 EINA_LIST_FREE(itb->items, it2)
742 it2->item->block = itbp;
743 itbp->items = eina_list_append(itbp->items, it2);
745 itbp->changed = EINA_TRUE;
747 _item_block_position_update(EINA_INLIST_GET(itb)->next,
749 it->wd->blocks = eina_inlist_remove(it->wd->blocks,
750 EINA_INLIST_GET(itb));
753 else if ((itbn) && ((itbn->count + itb->count) < itb->wd->max_items_per_block + itb->wd->max_items_per_block/2))
757 Eina_List *last = eina_list_last(itb->items);
758 Elm_Gen_Item *it2 = last->data;
760 it2->item->block = itbn;
761 itb->items = eina_list_remove_list(itb->items, last);
762 itbn->items = eina_list_prepend(itbn->items, it2);
764 itbn->changed = EINA_TRUE;
766 _item_block_position_update(EINA_INLIST_GET(itb)->next,
769 eina_inlist_remove(it->wd->blocks, EINA_INLIST_GET(itb));
777 _item_del(Elm_Gen_Item *it)
779 Evas_Object *obj = WIDGET(it);
781 evas_event_freeze(evas_object_evas_get(obj));
782 elm_genlist_item_subitems_clear((Elm_Object_Item *) it);
783 if (it->wd->show_item == it) it->wd->show_item = NULL;
784 if (it->realized) _elm_genlist_item_unrealize(it, EINA_FALSE);
785 if (it->item->block) _item_block_del(it);
786 if (it->item->queued)
787 it->wd->queue = eina_list_remove(it->wd->queue, it);
788 if (it->wd->anchor_item == it)
790 it->wd->anchor_item = ELM_GEN_ITEM_FROM_INLIST(EINA_INLIST_GET(it)->next);
791 if (!it->wd->anchor_item)
792 it->wd->anchor_item = ELM_GEN_ITEM_FROM_INLIST(EINA_INLIST_GET(it)->prev);
795 it->parent->item->items = eina_list_remove(it->parent->item->items, it);
796 if (it->item->swipe_timer) ecore_timer_del(it->item->swipe_timer);
797 _elm_genlist_item_del_serious(it);
798 evas_event_thaw(evas_object_evas_get(obj));
799 evas_event_thaw_eval(evas_object_evas_get(obj));
803 _clear_cb(Widget_Data *wd)
805 wd->anchor_item = NULL;
808 Item_Block *itb = (Item_Block *)(wd->blocks);
810 wd->blocks = eina_inlist_remove(wd->blocks, wd->blocks);
811 if (itb->items) eina_list_free(itb->items);
814 if (wd->queue_idle_enterer)
816 ecore_idle_enterer_del(wd->queue_idle_enterer);
817 wd->queue_idle_enterer = NULL;
819 if (wd->must_recalc_idler)
821 ecore_idler_del(wd->must_recalc_idler);
822 wd->must_recalc_idler = NULL;
824 if (wd->queue) wd->queue = eina_list_free(wd->queue);
825 if (wd->reorder_move_animator)
827 ecore_animator_del(wd->reorder_move_animator);
828 wd->reorder_move_animator = NULL;
830 wd->show_item = NULL;
831 wd->reorder_old_pan_y = 0;
835 _item_unselect(Elm_Gen_Item *it)
837 if ((it->generation < it->wd->generation) || (!it->selected)) return;
838 it->selected = EINA_FALSE;
839 it->wd->selected = eina_list_remove(it->wd->selected, it);
840 evas_object_smart_callback_call(WIDGET(it), SIG_UNSELECTED, it);
844 _mouse_move(void *data,
845 Evas *evas __UNUSED__,
849 Elm_Gen_Item *it = data;
850 Evas_Event_Mouse_Move *ev = event_info;
851 Evas_Coord minw = 0, minh = 0, x, y, dx, dy, adx, ady;
852 Evas_Coord ox, oy, ow, oh, it_scrl_y, y_pos;
854 if (ev->event_flags & EVAS_EVENT_FLAG_ON_HOLD)
856 if (!it->wd->on_hold)
858 it->wd->on_hold = EINA_TRUE;
859 if (!it->wd->wasselected)
861 _item_unhighlight(it);
866 if (it->wd->multitouched)
868 it->wd->cur_x = ev->cur.canvas.x;
869 it->wd->cur_y = ev->cur.canvas.y;
872 if ((it->dragging) && (it->down))
874 if (it->wd->movements == SWIPE_MOVES) it->wd->swipe = EINA_TRUE;
877 it->wd->history[it->wd->movements].x = ev->cur.canvas.x;
878 it->wd->history[it->wd->movements].y = ev->cur.canvas.y;
879 if (abs((it->wd->history[it->wd->movements].x -
880 it->wd->history[0].x)) > 40)
881 it->wd->swipe = EINA_TRUE;
887 ecore_timer_del(it->long_timer);
888 it->long_timer = NULL;
890 evas_object_smart_callback_call(WIDGET(it), SIG_DRAG, it);
893 if ((!it->down) /* || (it->wd->on_hold)*/ || (it->wd->longpressed))
897 ecore_timer_del(it->long_timer);
898 it->long_timer = NULL;
900 if ((it->wd->reorder_mode) && (it->wd->reorder_it))
902 evas_object_geometry_get(it->wd->pan_smart, &ox, &oy, &ow, &oh);
903 it_scrl_y = ev->cur.canvas.y - it->wd->reorder_it->dy;
905 if (!it->wd->reorder_start_y)
906 it->wd->reorder_start_y = it->item->block->y + it->y;
910 else if (it_scrl_y + it->wd->reorder_it->item->h > oy + oh)
911 y_pos = oy + oh - it->wd->reorder_it->item->h;
915 _item_position(it, VIEW(it), it->item->scrl_x, y_pos);
917 if (it->wd->calc_job) ecore_job_del(it->wd->calc_job);
918 it->wd->calc_job = ecore_job_add(_calc_job, it->wd);
922 if (!it->display_only)
923 elm_coords_finger_size_adjust(1, &minw, 1, &minh);
924 evas_object_geometry_get(obj, &x, &y, NULL, NULL);
925 x = ev->cur.canvas.x - x;
926 y = ev->cur.canvas.y - y;
929 if (adx < 0) adx = -dx;
932 if (ady < 0) ady = -dy;
935 if ((adx > minw) || (ady > minh))
937 it->dragging = EINA_TRUE;
940 ecore_timer_del(it->long_timer);
941 it->long_timer = NULL;
943 if (!it->wd->wasselected)
945 _item_unhighlight(it);
951 evas_object_smart_callback_call(WIDGET(it),
952 SIG_DRAG_START_UP, it);
956 evas_object_smart_callback_call(WIDGET(it),
957 SIG_DRAG_START_LEFT, it);
959 evas_object_smart_callback_call(WIDGET(it),
960 SIG_DRAG_START_RIGHT, it);
966 evas_object_smart_callback_call(WIDGET(it),
967 SIG_DRAG_START_DOWN, it);
971 evas_object_smart_callback_call(WIDGET(it),
972 SIG_DRAG_START_LEFT, it);
974 evas_object_smart_callback_call(WIDGET(it),
975 SIG_DRAG_START_RIGHT, it);
982 _long_press(void *data)
984 Elm_Gen_Item *it = data, *it_tmp;
987 it->long_timer = NULL;
988 if ((it->disabled) || (it->dragging) || (it->display_only))
989 return ECORE_CALLBACK_CANCEL;
990 it->wd->longpressed = EINA_TRUE;
991 evas_object_smart_callback_call(WIDGET(it), SIG_LONGPRESSED, it);
992 if ((it->wd->reorder_mode) && (!it->group))
994 it->wd->reorder_it = it;
995 it->wd->reorder_start_y = 0;
997 evas_object_raise(VIEW(it));
998 elm_smart_scroller_hold_set(it->wd->scr, EINA_TRUE);
999 elm_smart_scroller_bounce_allow_set(it->wd->scr, EINA_FALSE, EINA_FALSE);
1001 list = elm_genlist_realized_items_get(it->wd->obj);
1002 EINA_LIST_FOREACH(list, l, it_tmp)
1004 if (it != it_tmp) _item_unselect(it_tmp);
1006 if (elm_genlist_item_expanded_get((Elm_Object_Item *) it))
1008 elm_genlist_item_expanded_set((Elm_Object_Item *) it, EINA_FALSE);
1009 return ECORE_CALLBACK_RENEW;
1011 edje_object_signal_emit(VIEW(it), "elm,state,reorder,enabled", "elm");
1013 return ECORE_CALLBACK_CANCEL;
1017 _swipe(Elm_Gen_Item *it)
1022 if ((it->display_only) || (it->disabled)) return;
1023 it->wd->swipe = EINA_FALSE;
1024 for (i = 0; i < it->wd->movements; i++)
1026 sum += it->wd->history[i].x;
1027 if (abs(it->wd->history[0].y - it->wd->history[i].y) > 10) return;
1030 sum /= it->wd->movements;
1031 if (abs(sum - it->wd->history[0].x) <= 10) return;
1032 evas_object_smart_callback_call(WIDGET(it), SIG_SWIPE, it);
1036 _swipe_cancel(void *data)
1038 Elm_Gen_Item *it = data;
1040 if (!it) return ECORE_CALLBACK_CANCEL;
1041 it->wd->swipe = EINA_FALSE;
1042 it->wd->movements = 0;
1043 return ECORE_CALLBACK_RENEW;
1047 _multi_cancel(void *data)
1049 Widget_Data *wd = data;
1051 if (!wd) return ECORE_CALLBACK_CANCEL;
1052 wd->multi_timeout = EINA_TRUE;
1053 return ECORE_CALLBACK_RENEW;
1057 _multi_touch_gesture_eval(void *data)
1059 Elm_Gen_Item *it = data;
1061 it->wd->multitouched = EINA_FALSE;
1062 if (it->wd->multi_timer)
1064 ecore_timer_del(it->wd->multi_timer);
1065 it->wd->multi_timer = NULL;
1067 if (it->wd->multi_timeout)
1069 it->wd->multi_timeout = EINA_FALSE;
1073 Evas_Coord minw = 0, minh = 0;
1074 Evas_Coord off_x, off_y, off_mx, off_my;
1076 elm_coords_finger_size_adjust(1, &minw, 1, &minh);
1077 off_x = abs(it->wd->cur_x - it->wd->prev_x);
1078 off_y = abs(it->wd->cur_y - it->wd->prev_y);
1079 off_mx = abs(it->wd->cur_mx - it->wd->prev_mx);
1080 off_my = abs(it->wd->cur_my - it->wd->prev_my);
1082 if (((off_x > minw) || (off_y > minh)) && ((off_mx > minw) || (off_my > minh)))
1084 if ((off_x + off_mx) > (off_y + off_my))
1086 if ((it->wd->cur_x > it->wd->prev_x) && (it->wd->cur_mx > it->wd->prev_mx))
1087 evas_object_smart_callback_call(WIDGET(it),
1088 SIG_MULTI_SWIPE_RIGHT, it);
1089 else if ((it->wd->cur_x < it->wd->prev_x) && (it->wd->cur_mx < it->wd->prev_mx))
1090 evas_object_smart_callback_call(WIDGET(it),
1091 SIG_MULTI_SWIPE_LEFT, it);
1092 else if (abs(it->wd->cur_x - it->wd->cur_mx) > abs(it->wd->prev_x - it->wd->prev_mx))
1093 evas_object_smart_callback_call(WIDGET(it),
1094 SIG_MULTI_PINCH_OUT, it);
1096 evas_object_smart_callback_call(WIDGET(it),
1097 SIG_MULTI_PINCH_IN, it);
1101 if ((it->wd->cur_y > it->wd->prev_y) && (it->wd->cur_my > it->wd->prev_my))
1102 evas_object_smart_callback_call(WIDGET(it),
1103 SIG_MULTI_SWIPE_DOWN, it);
1104 else if ((it->wd->cur_y < it->wd->prev_y) && (it->wd->cur_my < it->wd->prev_my))
1105 evas_object_smart_callback_call(WIDGET(it),
1106 SIG_MULTI_SWIPE_UP, it);
1107 else if (abs(it->wd->cur_y - it->wd->cur_my) > abs(it->wd->prev_y - it->wd->prev_my))
1108 evas_object_smart_callback_call(WIDGET(it),
1109 SIG_MULTI_PINCH_OUT, it);
1111 evas_object_smart_callback_call(WIDGET(it),
1112 SIG_MULTI_PINCH_IN, it);
1115 it->wd->multi_timeout = EINA_FALSE;
1119 _multi_down(void *data,
1120 Evas *evas __UNUSED__,
1121 Evas_Object *obj __UNUSED__,
1124 Elm_Gen_Item *it = data;
1125 Evas_Event_Multi_Down *ev = event_info;
1127 if ((it->wd->multi_device != 0) || (it->wd->multitouched) || (it->wd->multi_timeout)) return;
1128 it->wd->multi_device = ev->device;
1129 it->wd->multi_down = EINA_TRUE;
1130 it->wd->multitouched = EINA_TRUE;
1131 it->wd->prev_mx = ev->canvas.x;
1132 it->wd->prev_my = ev->canvas.y;
1133 if (!it->wd->wasselected)
1135 _item_unhighlight(it);
1138 it->wd->wasselected = EINA_FALSE;
1139 it->wd->longpressed = EINA_FALSE;
1142 ecore_timer_del(it->long_timer);
1143 it->long_timer = NULL;
1147 it->dragging = EINA_FALSE;
1148 evas_object_smart_callback_call(WIDGET(it), SIG_DRAG_STOP, it);
1150 if (it->item->swipe_timer)
1152 ecore_timer_del(it->item->swipe_timer);
1153 it->item->swipe_timer = NULL;
1155 if (it->wd->on_hold)
1157 it->wd->swipe = EINA_FALSE;
1158 it->wd->movements = 0;
1159 it->wd->on_hold = EINA_FALSE;
1164 _multi_up(void *data,
1165 Evas *evas __UNUSED__,
1166 Evas_Object *obj __UNUSED__,
1169 Elm_Gen_Item *it = data;
1170 Evas_Event_Multi_Up *ev = event_info;
1172 if (it->wd->multi_device != ev->device) return;
1173 it->wd->multi_device = 0;
1174 it->wd->multi_down = EINA_FALSE;
1175 if (it->wd->mouse_down) return;
1176 _multi_touch_gesture_eval(data);
1180 _multi_move(void *data,
1181 Evas *evas __UNUSED__,
1182 Evas_Object *obj __UNUSED__,
1185 Elm_Gen_Item *it = data;
1186 Evas_Event_Multi_Move *ev = event_info;
1188 if (it->wd->multi_device != ev->device) return;
1189 it->wd->cur_mx = ev->cur.canvas.x;
1190 it->wd->cur_my = ev->cur.canvas.y;
1194 _mouse_down(void *data,
1195 Evas *evas __UNUSED__,
1199 Elm_Gen_Item *it = data;
1200 Evas_Event_Mouse_Down *ev = event_info;
1203 if (ev->button != 1) return;
1204 if (ev->event_flags & EVAS_EVENT_FLAG_ON_HOLD)
1206 it->wd->on_hold = EINA_TRUE;
1209 it->down = EINA_TRUE;
1210 it->dragging = EINA_FALSE;
1211 evas_object_geometry_get(obj, &x, &y, NULL, NULL);
1212 it->dx = ev->canvas.x - x;
1213 it->dy = ev->canvas.y - y;
1214 it->wd->mouse_down = EINA_TRUE;
1215 if (!it->wd->multitouched)
1217 it->wd->prev_x = ev->canvas.x;
1218 it->wd->prev_y = ev->canvas.y;
1219 it->wd->multi_timeout = EINA_FALSE;
1220 if (it->wd->multi_timer) ecore_timer_del(it->wd->multi_timer);
1221 it->wd->multi_timer = ecore_timer_add(1, _multi_cancel, it->wd);
1223 it->wd->longpressed = EINA_FALSE;
1224 if (ev->event_flags & EVAS_EVENT_FLAG_ON_HOLD) it->wd->on_hold = EINA_TRUE;
1225 else it->wd->on_hold = EINA_FALSE;
1226 if (it->wd->on_hold) return;
1227 it->wd->wasselected = it->selected;
1228 _item_highlight(it);
1229 if (ev->flags & EVAS_BUTTON_DOUBLE_CLICK)
1230 if ((!it->disabled) && (!it->display_only))
1232 evas_object_smart_callback_call(WIDGET(it), SIG_CLICKED_DOUBLE, it);
1233 evas_object_smart_callback_call(WIDGET(it), SIG_ACTIVATED, it);
1235 if (it->long_timer) ecore_timer_del(it->long_timer);
1236 if (it->item->swipe_timer) ecore_timer_del(it->item->swipe_timer);
1237 it->item->swipe_timer = ecore_timer_add(0.4, _swipe_cancel, it);
1239 it->long_timer = ecore_timer_add(it->wd->longpress_timeout, _long_press,
1242 it->long_timer = NULL;
1243 it->wd->swipe = EINA_FALSE;
1244 it->wd->movements = 0;
1248 _mouse_up(void *data,
1249 Evas *evas __UNUSED__,
1250 Evas_Object *obj __UNUSED__,
1253 Elm_Gen_Item *it = data;
1254 Evas_Event_Mouse_Up *ev = event_info;
1255 Eina_Bool dragged = EINA_FALSE;
1257 if (ev->button != 1) return;
1258 it->down = EINA_FALSE;
1259 it->wd->mouse_down = EINA_FALSE;
1260 if (it->wd->multitouched)
1262 if ((!it->wd->multi) && (!it->selected) && (it->highlighted)) _item_unhighlight(it);
1263 if (it->wd->multi_down) return;
1264 _multi_touch_gesture_eval(data);
1267 if (ev->event_flags & EVAS_EVENT_FLAG_ON_HOLD) it->wd->on_hold = EINA_TRUE;
1268 else it->wd->on_hold = EINA_FALSE;
1271 ecore_timer_del(it->long_timer);
1272 it->long_timer = NULL;
1276 it->dragging = EINA_FALSE;
1277 evas_object_smart_callback_call(WIDGET(it), SIG_DRAG_STOP, it);
1280 if (it->item->swipe_timer)
1282 ecore_timer_del(it->item->swipe_timer);
1283 it->item->swipe_timer = NULL;
1285 if (it->wd->multi_timer)
1287 ecore_timer_del(it->wd->multi_timer);
1288 it->wd->multi_timer = NULL;
1289 it->wd->multi_timeout = EINA_FALSE;
1291 if (it->wd->on_hold)
1293 if (it->wd->swipe) _swipe(data);
1294 it->wd->longpressed = EINA_FALSE;
1295 it->wd->on_hold = EINA_FALSE;
1298 if ((it->wd->reorder_mode) && (it->wd->reorder_it))
1300 Evas_Coord it_scrl_y = ev->canvas.y - it->wd->reorder_it->dy;
1302 if (it->wd->reorder_rel && (it->wd->reorder_it->parent == it->wd->reorder_rel->parent))
1304 if (it_scrl_y <= it->wd->reorder_rel->item->scrl_y)
1305 _item_move_before(it->wd->reorder_it, it->wd->reorder_rel);
1307 _item_move_after(it->wd->reorder_it, it->wd->reorder_rel);
1311 if (it->wd->calc_job) ecore_job_del(it->wd->calc_job);
1312 it->wd->calc_job = ecore_job_add(_calc_job, it->wd);
1314 edje_object_signal_emit(VIEW(it), "elm,state,reorder,disabled", "elm");
1315 it->wd->reorder_it = it->wd->reorder_rel = NULL;
1316 elm_smart_scroller_hold_set(it->wd->scr, EINA_FALSE);
1317 elm_smart_scroller_bounce_allow_set(it->wd->scr, it->wd->h_bounce, it->wd->v_bounce);
1319 if (it->wd->longpressed)
1321 it->wd->longpressed = EINA_FALSE;
1322 if (!it->wd->wasselected)
1324 _item_unhighlight(it);
1327 it->wd->wasselected = EINA_FALSE;
1332 if (it->want_unrealize)
1334 _elm_genlist_item_unrealize(it, EINA_FALSE);
1335 if (it->item->block->want_unrealize)
1336 _item_block_unrealize(it->item->block);
1339 if ((it->disabled) || (dragged) || (it->display_only)) return;
1340 if (ev->event_flags & EVAS_EVENT_FLAG_ON_HOLD) return;
1345 _item_highlight(it);
1350 _item_unhighlight(it);
1358 Widget_Data *wd = it->wd;
1361 while (wd->selected)
1363 _item_unhighlight(wd->selected->data);
1364 _item_unselect(wd->selected->data);
1370 const Eina_List *l, *l_next;
1373 EINA_LIST_FOREACH_SAFE(it->wd->selected, l, l_next, it2)
1376 _item_unhighlight(it2);
1377 _item_unselect(it2);
1379 //_item_highlight(it);
1382 _item_highlight(it);
1388 _signal_expand_toggle(void *data,
1389 Evas_Object *obj __UNUSED__,
1390 const char *emission __UNUSED__,
1391 const char *source __UNUSED__)
1393 Elm_Gen_Item *it = data;
1395 if (it->item->expanded)
1396 evas_object_smart_callback_call(WIDGET(it), SIG_CONTRACT_REQUEST, it);
1398 evas_object_smart_callback_call(WIDGET(it), SIG_EXPAND_REQUEST, it);
1402 _signal_expand(void *data,
1403 Evas_Object *obj __UNUSED__,
1404 const char *emission __UNUSED__,
1405 const char *source __UNUSED__)
1407 Elm_Gen_Item *it = data;
1409 if (!it->item->expanded)
1410 evas_object_smart_callback_call(WIDGET(it), SIG_EXPAND_REQUEST, it);
1414 _signal_contract(void *data,
1415 Evas_Object *obj __UNUSED__,
1416 const char *emission __UNUSED__,
1417 const char *source __UNUSED__)
1419 Elm_Gen_Item *it = data;
1421 if (it->item->expanded)
1422 evas_object_smart_callback_call(WIDGET(it), SIG_CONTRACT_REQUEST, it);
1426 _scr_hold_timer_cb(void *data)
1428 if (!data) return ECORE_CALLBACK_CANCEL;
1429 Widget_Data *wd = data;
1430 elm_smart_scroller_hold_set(wd->scr, EINA_FALSE);
1431 wd->scr_hold_timer = NULL;
1432 return ECORE_CALLBACK_CANCEL;
1436 _mode_finished_signal_cb(void *data,
1438 const char *emission __UNUSED__,
1439 const char *source __UNUSED__)
1443 Elm_Gen_Item *it = data;
1444 if ((it->generation < it->wd->generation) || (!it->realized) || (!it->item->mode_view)) return;
1446 Evas *te = evas_object_evas_get(obj);
1448 evas_event_freeze(te);
1449 it->item->nocache = EINA_FALSE;
1450 _mode_item_unrealize(it);
1451 if (it->item->group_item)
1452 evas_object_raise(it->item->VIEW(group_item));
1453 snprintf(buf, sizeof(buf), "elm,state,%s,passive,finished", it->wd->mode_type);
1454 edje_object_signal_callback_del_full(obj, buf, "elm", _mode_finished_signal_cb, it);
1455 evas_event_thaw(te);
1456 evas_event_thaw_eval(te);
1460 _item_cache_clean(Widget_Data *wd)
1462 evas_event_freeze(evas_object_evas_get(wd->obj));
1463 while ((wd->item_cache) && (wd->item_cache_count > wd->item_cache_max))
1467 itc = EINA_INLIST_CONTAINER_GET(wd->item_cache->last, Item_Cache);
1468 wd->item_cache = eina_inlist_remove(wd->item_cache,
1469 wd->item_cache->last);
1470 wd->item_cache_count--;
1471 if (itc->spacer) evas_object_del(itc->spacer);
1472 if (itc->base_view) evas_object_del(itc->base_view);
1473 if (itc->item_style) eina_stringshare_del(itc->item_style);
1476 evas_event_thaw(evas_object_evas_get(wd->obj));
1477 evas_event_thaw_eval(evas_object_evas_get(wd->obj));
1481 _item_cache_zero(Widget_Data *wd)
1483 int pmax = wd->item_cache_max;
1484 wd->item_cache_max = 0;
1485 _item_cache_clean(wd);
1486 wd->item_cache_max = pmax;
1490 _item_cache_add(Elm_Gen_Item *it)
1494 evas_event_freeze(evas_object_evas_get(it->wd->obj));
1495 if (it->wd->item_cache_max <= 0)
1497 evas_object_del(VIEW(it));
1499 evas_object_del(it->spacer);
1501 evas_event_thaw(evas_object_evas_get(it->wd->obj));
1502 evas_event_thaw_eval(evas_object_evas_get(it->wd->obj));
1506 it->wd->item_cache_count++;
1507 itc = calloc(1, sizeof(Item_Cache));
1508 it->wd->item_cache = eina_inlist_prepend(it->wd->item_cache,
1509 EINA_INLIST_GET(itc));
1510 itc->spacer = it->spacer;
1512 itc->base_view = VIEW(it);
1514 evas_object_hide(itc->base_view);
1515 evas_object_move(itc->base_view, -9999, -9999);
1516 itc->item_style = eina_stringshare_add(it->itc->item_style);
1517 if (it->item->flags & ELM_GENLIST_ITEM_SUBITEMS) itc->tree = 1;
1518 itc->compress = (it->wd->compress);
1519 itc->selected = it->selected;
1520 itc->disabled = it->disabled;
1521 itc->expanded = it->item->expanded;
1524 ecore_timer_del(it->long_timer);
1525 it->long_timer = NULL;
1527 if (it->item->swipe_timer)
1529 ecore_timer_del(it->item->swipe_timer);
1530 it->item->swipe_timer = NULL;
1532 // FIXME: other callbacks?
1533 edje_object_signal_callback_del_full(itc->base_view,
1534 "elm,action,expand,toggle",
1535 "elm", _signal_expand_toggle, it);
1536 edje_object_signal_callback_del_full(itc->base_view, "elm,action,expand",
1538 _signal_expand, it);
1539 edje_object_signal_callback_del_full(itc->base_view, "elm,action,contract",
1540 "elm", _signal_contract, it);
1541 evas_object_event_callback_del_full(itc->base_view, EVAS_CALLBACK_MOUSE_DOWN,
1543 evas_object_event_callback_del_full(itc->base_view, EVAS_CALLBACK_MOUSE_UP,
1545 evas_object_event_callback_del_full(itc->base_view, EVAS_CALLBACK_MOUSE_MOVE,
1547 evas_object_event_callback_del_full(itc->base_view, EVAS_CALLBACK_MULTI_DOWN,
1549 evas_object_event_callback_del_full(itc->base_view, EVAS_CALLBACK_MULTI_UP,
1551 evas_object_event_callback_del_full(itc->base_view, EVAS_CALLBACK_MULTI_MOVE,
1553 _item_cache_clean(it->wd);
1554 evas_event_thaw(evas_object_evas_get(it->wd->obj));
1555 evas_event_thaw_eval(evas_object_evas_get(it->wd->obj));
1559 _item_cache_find(Elm_Gen_Item *it)
1564 if (it->item->flags & ELM_GENLIST_ITEM_SUBITEMS) tree = 1;
1565 EINA_INLIST_FOREACH(it->wd->item_cache, itc)
1567 if ((itc->selected) || (itc->disabled) || (itc->expanded))
1569 if ((itc->tree == tree) &&
1570 (itc->compress == it->wd->compress) &&
1571 (!strcmp(it->itc->item_style, itc->item_style)))
1573 it->wd->item_cache = eina_inlist_remove(it->wd->item_cache,
1574 EINA_INLIST_GET(itc));
1575 it->wd->item_cache_count--;
1583 _elm_genlist_item_index_update(Elm_Gen_Item *it)
1585 if (it->position_update || it->item->block->position_update)
1587 evas_object_smart_callback_call(WIDGET(it), SIG_INDEX_UPDATE, it);
1588 it->position_update = EINA_FALSE;
1593 _elm_genlist_item_odd_even_update(Elm_Gen_Item *it)
1595 if (!it->item->nostacking)
1597 if ((it->item->order_num_in & 0x1) ^ it->item->stacking_even)
1598 evas_object_lower(VIEW(it));
1600 evas_object_raise(VIEW(it));
1603 if (it->item->order_num_in & 0x1)
1604 edje_object_signal_emit(VIEW(it), "elm,state,odd", "elm");
1606 edje_object_signal_emit(VIEW(it), "elm,state,even", "elm");
1610 _elm_genlist_item_state_update(Elm_Gen_Item *it, Item_Cache *itc)
1614 if (it->selected != itc->selected)
1617 edje_object_signal_emit(VIEW(it),
1618 "elm,state,selected", "elm");
1620 if (it->disabled != itc->disabled)
1623 edje_object_signal_emit(VIEW(it),
1624 "elm,state,disabled", "elm");
1626 if (it->item->expanded != itc->expanded)
1628 if (it->item->expanded)
1629 edje_object_signal_emit(VIEW(it),
1630 "elm,state,expanded", "elm");
1636 edje_object_signal_emit(VIEW(it),
1637 "elm,state,selected", "elm");
1639 edje_object_signal_emit(VIEW(it),
1640 "elm,state,disabled", "elm");
1641 if (it->item->expanded)
1642 edje_object_signal_emit(VIEW(it),
1643 "elm,state,expanded", "elm");
1648 _item_cache_free(Item_Cache *itc)
1650 if (itc->spacer) evas_object_del(itc->spacer);
1651 if (itc->base_view) evas_object_del(itc->base_view);
1652 if (itc->item_style) eina_stringshare_del(itc->item_style);
1657 _item_text_realize(Elm_Gen_Item *it,
1658 Evas_Object *target,
1662 if (it->itc->func.text_get)
1667 *source = elm_widget_stringlist_get(edje_object_data_get(target, "texts"));
1668 EINA_LIST_FOREACH(*source, l, key)
1670 if (parts && fnmatch(parts, key, FNM_PERIOD))
1673 char *s = it->itc->func.text_get
1674 ((void *)it->base.data, WIDGET(it), key);
1678 edje_object_part_text_set(target, key, s);
1683 edje_object_part_text_set(target, key, "");
1690 _item_content_unrealize(Elm_Gen_Item *it,
1691 Evas_Object *target,
1695 Eina_List *res = it->content_objs;
1697 if (it->itc->func.content_get)
1701 Evas_Object *ic = NULL;
1703 EINA_LIST_FOREACH(*source, l, key)
1705 if (parts && fnmatch(parts, key, FNM_PERIOD))
1708 ic = edje_object_part_swallow_get(target, key);
1711 res = eina_list_remove(res, ic);
1712 edje_object_part_unswallow(target, ic);
1713 evas_object_del(ic);
1722 _item_content_realize(Elm_Gen_Item *it,
1723 Evas_Object *target,
1727 Eina_List *res = NULL;
1729 if (it->itc->func.content_get)
1733 Evas_Object *ic = NULL;
1735 *source = elm_widget_stringlist_get(edje_object_data_get(target, "contents"));
1737 if (parts && (eina_list_count(*source) != eina_list_count(it->content_objs)))
1738 res = it->content_objs;
1740 EINA_LIST_FOREACH(*source, l, key)
1742 if (parts && fnmatch(parts, key, FNM_PERIOD))
1745 if (it->itc->func.content_get)
1746 ic = it->itc->func.content_get
1747 ((void *)it->base.data, WIDGET(it), key);
1750 res = eina_list_append(res, ic);
1751 edje_object_part_swallow(target, key, ic);
1752 evas_object_show(ic);
1753 elm_widget_sub_object_add(WIDGET(it), ic);
1755 elm_widget_disabled_set(ic, EINA_TRUE);
1764 _item_state_realize(Elm_Gen_Item *it,
1765 Evas_Object *target,
1769 if (it->itc->func.state_get)
1775 *source = elm_widget_stringlist_get(edje_object_data_get(target, "states"));
1776 EINA_LIST_FOREACH(*source, l, key)
1778 if (parts && fnmatch(parts, key, FNM_PERIOD))
1781 Eina_Bool on = it->itc->func.state_get
1782 ((void *)it->base.data, WIDGET(it), key);
1786 snprintf(buf, sizeof(buf), "elm,state,%s,active", key);
1787 edje_object_signal_emit(target, buf, "elm");
1791 snprintf(buf, sizeof(buf), "elm,state,%s,passive", key);
1792 edje_object_signal_emit(target, buf, "elm");
1799 _item_realize(Elm_Gen_Item *it,
1803 const char *treesize;
1806 Item_Cache *itc = NULL;
1808 if (it->generation < it->wd->generation) return;
1809 //evas_event_freeze(evas_object_evas_get(it->wd->obj));
1812 if (it->item->order_num_in != in)
1814 it->item->order_num_in = in;
1815 _elm_genlist_item_odd_even_update(it);
1816 _elm_genlist_item_state_update(it, NULL);
1817 _elm_genlist_item_index_update(it);
1819 //evas_event_thaw(evas_object_evas_get(it->wd->obj));
1820 //evas_event_thaw_eval(evas_object_evas_get(it->wd->obj));
1823 it->item->order_num_in = in;
1825 if (it->item->nocache)
1826 it->item->nocache = EINA_FALSE;
1828 itc = _item_cache_find(it);
1831 VIEW(it) = itc->base_view;
1832 itc->base_view = NULL;
1833 it->spacer = itc->spacer;
1838 const char *stacking_even;
1839 const char *stacking;
1841 VIEW(it) = edje_object_add(evas_object_evas_get(WIDGET(it)));
1842 edje_object_scale_set(VIEW(it),
1843 elm_widget_scale_get(WIDGET(it)) *
1844 _elm_config->scale);
1845 evas_object_smart_member_add(VIEW(it), it->wd->pan_smart);
1846 elm_widget_sub_object_add(WIDGET(it), VIEW(it));
1848 if (it->item->flags & ELM_GENLIST_ITEM_SUBITEMS)
1849 strncpy(buf, "tree", sizeof(buf));
1850 else strncpy(buf, "item", sizeof(buf));
1851 if (it->wd->compress)
1852 strncat(buf, "_compress", sizeof(buf) - strlen(buf));
1854 strncat(buf, "/", sizeof(buf) - strlen(buf));
1855 strncat(buf, it->itc->item_style, sizeof(buf) - strlen(buf));
1857 _elm_theme_object_set(WIDGET(it), VIEW(it), "genlist", buf,
1858 elm_widget_style_get(WIDGET(it)));
1860 stacking_even = edje_object_data_get(VIEW(it), "stacking_even");
1861 if (!stacking_even) stacking_even = "above";
1862 it->item->stacking_even = !!strcmp("above", stacking_even);
1864 stacking = edje_object_data_get(VIEW(it), "stacking");
1865 if (!stacking) stacking = "yes";
1866 it->item->nostacking = !!strcmp("yes", stacking);
1868 edje_object_mirrored_set(VIEW(it),
1869 elm_widget_mirrored_get(WIDGET(it)));
1871 evas_object_rectangle_add(evas_object_evas_get(WIDGET(it)));
1872 evas_object_color_set(it->spacer, 0, 0, 0, 0);
1873 elm_widget_sub_object_add(WIDGET(it), it->spacer);
1876 _elm_genlist_item_odd_even_update(it);
1878 treesize = edje_object_data_get(VIEW(it), "treesize");
1879 if (treesize) tsize = atoi(treesize);
1880 evas_object_size_hint_min_set(it->spacer,
1881 (it->item->expanded_depth * tsize) * _elm_config->scale, 1);
1882 edje_object_part_swallow(VIEW(it), "elm.swallow.pad", it->spacer);
1885 edje_object_signal_callback_add(VIEW(it),
1886 "elm,action,expand,toggle",
1887 "elm", _signal_expand_toggle, it);
1888 edje_object_signal_callback_add(VIEW(it), "elm,action,expand",
1889 "elm", _signal_expand, it);
1890 edje_object_signal_callback_add(VIEW(it), "elm,action,contract",
1891 "elm", _signal_contract, it);
1892 evas_object_event_callback_add(VIEW(it), EVAS_CALLBACK_MOUSE_DOWN,
1894 evas_object_event_callback_add(VIEW(it), EVAS_CALLBACK_MOUSE_UP,
1896 evas_object_event_callback_add(VIEW(it), EVAS_CALLBACK_MOUSE_MOVE,
1898 evas_object_event_callback_add(VIEW(it), EVAS_CALLBACK_MULTI_DOWN,
1900 evas_object_event_callback_add(VIEW(it), EVAS_CALLBACK_MULTI_UP,
1902 evas_object_event_callback_add(VIEW(it), EVAS_CALLBACK_MULTI_MOVE,
1905 _elm_genlist_item_state_update(it, itc);
1906 _elm_genlist_item_index_update(it);
1909 if ((calc) && (it->wd->homogeneous) &&
1910 ((it->wd->item_width) ||
1911 ((it->wd->item_width) && (it->wd->group_item_width))))
1913 /* homogenous genlist shortcut */
1914 if (!it->item->mincalcd)
1918 it->item->w = it->item->minw = it->wd->group_item_width;
1919 it->item->h = it->item->minh = it->wd->group_item_height;
1923 it->item->w = it->item->minw = it->wd->item_width;
1924 it->item->h = it->item->minh = it->wd->item_height;
1926 it->item->mincalcd = EINA_TRUE;
1931 /* FIXME: If you see that assert, please notify us and we
1932 will clean our mess */
1933 assert(eina_list_count(it->content_objs) == 0);
1935 _item_text_realize(it, VIEW(it), &it->texts, NULL);
1936 it->content_objs = _item_content_realize(it, VIEW(it), &it->contents, NULL);
1937 _item_state_realize(it, VIEW(it), &it->states, NULL);
1939 if (!it->item->mincalcd)
1941 Evas_Coord mw = -1, mh = -1;
1943 if (!it->display_only)
1944 elm_coords_finger_size_adjust(1, &mw, 1, &mh);
1945 if (it->wd->height_for_width) mw = it->wd->prev_viewport_w;
1946 edje_object_size_min_restricted_calc(VIEW(it), &mw, &mh, mw,
1948 if (!it->display_only)
1949 elm_coords_finger_size_adjust(1, &mw, 1, &mh);
1950 it->item->w = it->item->minw = mw;
1951 it->item->h = it->item->minh = mh;
1952 it->item->mincalcd = EINA_TRUE;
1954 if ((!it->wd->group_item_width) && (it->group))
1956 it->wd->group_item_width = mw;
1957 it->wd->group_item_height = mh;
1959 else if ((!it->wd->item_width) && (it->item->flags == ELM_GENLIST_ITEM_NONE))
1961 it->wd->item_width = mw;
1962 it->wd->item_height = mh;
1965 if (!calc) evas_object_show(VIEW(it));
1968 if (it->tooltip.content_cb)
1970 elm_widget_item_tooltip_content_cb_set(it,
1971 it->tooltip.content_cb,
1972 it->tooltip.data, NULL);
1973 elm_widget_item_tooltip_style_set(it, it->tooltip.style);
1974 elm_widget_item_tooltip_window_mode_set(it, it->tooltip.free_size);
1977 if (it->mouse_cursor)
1978 elm_widget_item_cursor_set(it, it->mouse_cursor);
1980 it->realized = EINA_TRUE;
1981 it->want_unrealize = EINA_FALSE;
1983 if (itc) _item_cache_free(itc);
1984 //evas_event_thaw(evas_object_evas_get(it->wd->obj));
1985 //evas_event_thaw_eval(evas_object_evas_get(it->wd->obj));
1987 evas_object_smart_callback_call(WIDGET(it), SIG_REALIZED, it);
1988 edje_object_message_signal_process(VIEW(it));
1992 _item_unrealize_cb(Elm_Gen_Item *it)
1994 if (it->item->nocache)
1996 evas_object_del(VIEW(it));
1998 evas_object_del(it->spacer);
2003 edje_object_mirrored_set(VIEW(it),
2004 elm_widget_mirrored_get(WIDGET(it)));
2005 edje_object_scale_set(VIEW(it),
2006 elm_widget_scale_get(WIDGET(it))
2007 * _elm_config->scale);
2008 _item_cache_add(it);
2011 _mode_item_unrealize(it);
2013 it->realized = EINA_FALSE;
2014 it->want_unrealize = EINA_FALSE;
2018 _item_block_recalc(Item_Block *itb,
2024 Evas_Coord minw = 0, minh = 0;
2025 Eina_Bool showme = EINA_FALSE, changed = EINA_FALSE;
2028 //evas_event_freeze(evas_object_evas_get(itb->wd->obj));
2030 EINA_LIST_FOREACH(itb->items, l, it)
2032 if (it->generation < it->wd->generation) continue;
2033 showme |= it->item->showme;
2038 if (!it->item->mincalcd) changed = EINA_TRUE;
2041 _item_realize(it, in, EINA_TRUE);
2042 _elm_genlist_item_unrealize(it, EINA_TRUE);
2047 _item_realize(it, in, EINA_TRUE);
2048 _elm_genlist_item_unrealize(it, EINA_TRUE);
2052 _item_realize(it, in, EINA_FALSE);
2053 minh += it->item->minh;
2054 if (minw < it->item->minw) minw = it->item->minw;
2062 itb->changed = EINA_FALSE;
2063 itb->position_update = EINA_FALSE;
2064 //evas_event_thaw(evas_object_evas_get(itb->wd->obj));
2065 //evas_event_thaw_eval(evas_object_evas_get(itb->wd->obj));
2070 _item_block_realize(Item_Block *itb)
2072 if (itb->realized) return;
2073 itb->realized = EINA_TRUE;
2074 itb->want_unrealize = EINA_FALSE;
2078 _item_block_unrealize(Item_Block *itb)
2082 Eina_Bool dragging = EINA_FALSE;
2084 if (!itb->realized) return;
2085 evas_event_freeze(evas_object_evas_get(itb->wd->obj));
2086 EINA_LIST_FOREACH(itb->items, l, it)
2088 if (itb->must_recalc || !it->group)
2092 dragging = EINA_TRUE;
2093 it->want_unrealize = EINA_TRUE;
2096 _elm_genlist_item_unrealize(it, EINA_FALSE);
2101 itb->realized = EINA_FALSE;
2102 itb->want_unrealize = EINA_TRUE;
2105 itb->want_unrealize = EINA_FALSE;
2106 evas_event_thaw(evas_object_evas_get(itb->wd->obj));
2107 evas_event_thaw_eval(evas_object_evas_get(itb->wd->obj));
2111 _get_space_for_reorder_item(Elm_Gen_Item *it)
2113 Evas_Coord rox, roy, row, roh, oy, oh;
2114 Eina_Bool top = EINA_FALSE;
2115 Elm_Gen_Item *reorder_it = it->wd->reorder_it;
2116 if (!reorder_it) return 0;
2118 evas_object_geometry_get(it->wd->pan_smart, NULL, &oy, NULL, &oh);
2119 evas_object_geometry_get(it->wd->VIEW(reorder_it), &rox, &roy, &row, &roh);
2121 if ((it->wd->reorder_start_y < it->item->block->y) &&
2122 (roy - oy + (roh / 2) >= it->item->block->y - it->wd->pan_y))
2124 it->item->block->reorder_offset = it->wd->reorder_it->item->h * -1;
2125 if (it->item->block->count == 1)
2126 it->wd->reorder_rel = it;
2128 else if ((it->wd->reorder_start_y >= it->item->block->y) &&
2129 (roy - oy + (roh / 2) <= it->item->block->y - it->wd->pan_y))
2131 it->item->block->reorder_offset = it->wd->reorder_it->item->h;
2134 it->item->block->reorder_offset = 0;
2136 it->item->scrl_y += it->item->block->reorder_offset;
2138 top = (ELM_RECTS_INTERSECT(it->item->scrl_x, it->item->scrl_y, it->item->w, it->item->h,
2139 rox, roy + (roh / 2), row, 1));
2142 it->wd->reorder_rel = it;
2143 it->item->scrl_y += it->wd->reorder_it->item->h;
2144 return it->wd->reorder_it->item->h;
2151 _reorder_move_animator_cb(void *data)
2153 Elm_Gen_Item *it = data;
2154 Eina_Bool down = EINA_FALSE;
2156 int y, dy = it->item->h / 10 * _elm_config->scale, diff;
2158 t = ((0.0 > (t = ecore_loop_time_get()-it->wd->start_time)) ? 0.0 : t);
2160 if (t <= REORDER_EFFECT_TIME) y = (1 * sin((t / REORDER_EFFECT_TIME) * (M_PI / 2)) * dy);
2163 diff = abs(it->item->old_scrl_y - it->item->scrl_y);
2164 if (diff > it->item->h) y = diff / 2;
2166 if (it->item->old_scrl_y < it->item->scrl_y)
2168 it->item->old_scrl_y += y;
2171 else if (it->item->old_scrl_y > it->item->scrl_y)
2173 it->item->old_scrl_y -= y;
2176 _item_position(it, VIEW(it), it->item->scrl_x, it->item->old_scrl_y);
2177 _group_items_recalc(it->wd);
2179 if ((it->wd->reorder_pan_move) ||
2180 (down && it->item->old_scrl_y >= it->item->scrl_y) ||
2181 (!down && it->item->old_scrl_y <= it->item->scrl_y))
2183 it->item->old_scrl_y = it->item->scrl_y;
2184 it->item->move_effect_enabled = EINA_FALSE;
2185 it->wd->reorder_move_animator = NULL;
2186 return ECORE_CALLBACK_CANCEL;
2188 return ECORE_CALLBACK_RENEW;
2192 _item_position(Elm_Gen_Item *it,
2200 evas_event_freeze(evas_object_evas_get(it->wd->obj));
2201 evas_object_resize(view, it->item->w, it->item->h);
2202 evas_object_move(view, it_x, it_y);
2203 evas_object_show(view);
2204 evas_event_thaw(evas_object_evas_get(it->wd->obj));
2205 evas_event_thaw_eval(evas_object_evas_get(it->wd->obj));
2209 _item_block_position(Item_Block *itb,
2215 Evas_Coord y = 0, ox, oy, ow, oh, cvx, cvy, cvw, cvh;
2216 Eina_Bool vis = EINA_FALSE;
2218 evas_event_freeze(evas_object_evas_get(itb->wd->obj));
2219 evas_object_geometry_get(itb->wd->pan_smart, &ox, &oy, &ow, &oh);
2220 evas_output_viewport_get(evas_object_evas_get(itb->wd->obj), &cvx, &cvy,
2222 EINA_LIST_FOREACH(itb->items, l, it)
2224 if (it->generation < it->wd->generation) continue;
2225 else if (it->wd->reorder_it == it) continue;
2228 it->item->w = itb->w;
2229 it->item->scrl_x = itb->x + it->x - it->wd->pan_x + ox;
2230 it->item->scrl_y = itb->y + it->y - it->wd->pan_y + oy;
2232 vis = (ELM_RECTS_INTERSECT(it->item->scrl_x, it->item->scrl_y, it->item->w, it->item->h,
2233 cvx, cvy, cvw, cvh));
2236 if ((itb->realized) && (!it->realized))
2238 if (vis) _item_realize(it, in, EINA_FALSE);
2244 if (it->wd->reorder_mode)
2245 y += _get_space_for_reorder_item(it);
2246 git = it->item->group_item;
2249 if (git->item->scrl_y < oy)
2250 git->item->scrl_y = oy;
2251 if ((git->item->scrl_y + git->item->h) > (it->item->scrl_y + it->item->h))
2252 git->item->scrl_y = (it->item->scrl_y + it->item->h) - git->item->h;
2253 git->item->want_realize = EINA_TRUE;
2255 if ((it->wd->reorder_it) && (it->item->old_scrl_y != it->item->scrl_y))
2257 if (!it->item->move_effect_enabled)
2259 it->item->move_effect_enabled = EINA_TRUE;
2260 it->wd->reorder_move_animator =
2262 _reorder_move_animator_cb, it);
2265 if (!it->item->move_effect_enabled)
2267 if (it->item->mode_view)
2268 _item_position(it, it->item->mode_view, it->item->scrl_x,
2271 _item_position(it, VIEW(it), it->item->scrl_x,
2273 it->item->old_scrl_y = it->item->scrl_y;
2278 if (!it->dragging) _elm_genlist_item_unrealize(it, EINA_FALSE);
2285 if (vis) it->item->want_realize = EINA_TRUE;
2289 evas_event_thaw(evas_object_evas_get(itb->wd->obj));
2290 evas_event_thaw_eval(evas_object_evas_get(itb->wd->obj));
2294 _group_items_recalc(void *data)
2296 Widget_Data *wd = data;
2300 evas_event_freeze(evas_object_evas_get(wd->obj));
2301 EINA_LIST_FOREACH(wd->group_items, l, git)
2303 if (git->item->want_realize)
2306 _item_realize(git, 0, EINA_FALSE);
2307 evas_object_resize(VIEW(git), wd->minw, git->item->h);
2308 evas_object_move(VIEW(git), git->item->scrl_x, git->item->scrl_y);
2309 evas_object_show(VIEW(git));
2310 evas_object_raise(VIEW(git));
2312 else if (!git->item->want_realize && git->realized)
2315 _elm_genlist_item_unrealize(git, EINA_FALSE);
2318 evas_event_thaw(evas_object_evas_get(wd->obj));
2319 evas_event_thaw_eval(evas_object_evas_get(wd->obj));
2323 _must_recalc_idler(void *data)
2325 Widget_Data *wd = data;
2326 if (wd->calc_job) ecore_job_del(wd->calc_job);
2327 wd->calc_job = ecore_job_add(_calc_job, wd);
2328 wd->must_recalc_idler = NULL;
2329 return ECORE_CALLBACK_CANCEL;
2333 _scroll_item(Widget_Data *wd)
2335 Elm_Gen_Item *it = NULL;
2336 Evas_Coord gith = 0;
2337 Evas_Coord ow, oh, dx = 0, dy = 0, dw = 0, dh = 0;
2339 evas_object_geometry_get(wd->pan_smart, NULL, NULL, &ow, &oh);
2341 dx = it->x + it->item->block->x;
2342 dy = it->y + it->item->block->y;
2343 dw = it->item->block->w;
2345 switch (wd->scrollto_type)
2347 case ELM_GENLIST_ITEM_SCROLLTO_TOP:
2348 if (it->item->group_item) gith = it->item->group_item->item->h;
2351 case ELM_GENLIST_ITEM_SCROLLTO_MIDDLE:
2352 dy += (it->item->h / 2 - oh / 2);
2354 case ELM_GENLIST_ITEM_SCROLLTO_IN:
2356 if ((wd->expanded_item) &&
2357 ((wd->show_item->y + wd->show_item->item->block->y + wd->show_item->item->h)
2358 - (wd->expanded_item->y + wd->expanded_item->item->block->y) > oh))
2360 it = wd->expanded_item;
2361 if (it->item->group_item) gith = it->item->group_item->item->h;
2362 dx = it->x + it->item->block->x;
2363 dy = it->y + it->item->block->y - gith;
2364 dw = it->item->block->w;
2368 if ((it->item->group_item) && (wd->pan_y > (it->y + it->item->block->y)))
2369 gith = it->item->group_item->item->h;
2376 elm_smart_scroller_region_bring_in(wd->scr, dx, dy, dw, dh);
2378 elm_smart_scroller_child_region_show(wd->scr, dx, dy, dw, dh);
2380 it->item->showme = EINA_FALSE;
2381 wd->show_item = NULL;
2382 wd->auto_scroll_enabled = EINA_FALSE;
2383 wd->check_scroll = EINA_FALSE;
2387 _calc_job(void *data)
2389 Widget_Data *wd = data;
2390 Item_Block *itb, *chb = NULL;
2391 Evas_Coord minw = -1, minh = 0, y = 0, ow, dy = 0;
2392 Evas_Coord pan_w = 0, pan_h = 0;
2394 Eina_Bool minw_change = EINA_FALSE;
2395 Eina_Bool did_must_recalc = EINA_FALSE;
2398 evas_object_geometry_get(wd->pan_smart, NULL, NULL, &ow, &wd->h);
2402 evas_event_freeze(evas_object_evas_get(wd->obj));
2403 EINA_INLIST_FOREACH(wd->blocks, itb)
2405 Eina_Bool showme = EINA_FALSE;
2408 showme = itb->showme;
2409 itb->showme = EINA_FALSE;
2412 if (itb->realized) _item_block_unrealize(itb);
2414 if ((itb->changed) || ((itb->must_recalc) && (!did_must_recalc)))
2416 if (itb->must_recalc)
2420 EINA_LIST_FOREACH(itb->items, l, it)
2421 if (it->item->mincalcd) it->item->mincalcd = EINA_FALSE;
2422 itb->changed = EINA_TRUE;
2423 if (itb->must_recalc) did_must_recalc = EINA_TRUE;
2424 if (itb->realized) _item_block_unrealize(itb);
2425 itb->must_recalc = EINA_FALSE;
2427 showme = _item_block_recalc(itb, in, EINA_FALSE);
2433 if (minw == -1) minw = itb->minw;
2434 else if ((!itb->must_recalc) && (minw < itb->minw))
2437 minw_change = EINA_TRUE;
2443 if ((showme) && (wd->show_item) && (!wd->show_item->item->queued))
2444 wd->check_scroll = EINA_TRUE;
2448 EINA_INLIST_FOREACH(wd->blocks, itb)
2454 if ((chb) && (EINA_INLIST_GET(chb)->next))
2456 EINA_INLIST_FOREACH(EINA_INLIST_GET(chb)->next, itb)
2458 if (itb->realized) _item_block_unrealize(itb);
2461 wd->realminw = minw;
2462 if (minw < wd->w) minw = wd->w;
2463 if ((minw != wd->minw) || (minh != wd->minh))
2467 evas_object_smart_callback_call(wd->pan_smart, "changed", NULL);
2468 _sizing_eval(wd->obj);
2469 if ((wd->anchor_item) && (wd->anchor_item->item->block) && (!wd->auto_scroll_enabled))
2474 it = wd->anchor_item;
2475 it_y = wd->anchor_y;
2476 elm_smart_scroller_child_pos_set(wd->scr, wd->pan_x,
2477 it->item->block->y + it->y + it_y);
2478 wd->anchor_item = it;
2479 wd->anchor_y = it_y;
2482 if (did_must_recalc)
2484 if (!wd->must_recalc_idler)
2485 wd->must_recalc_idler = ecore_idler_add(_must_recalc_idler, wd);
2487 if (wd->check_scroll)
2489 _pan_child_size_get(wd->pan_smart, &pan_w, &pan_h);
2490 if (EINA_INLIST_GET(wd->show_item) == wd->items->last)
2491 wd->scrollto_type = ELM_GENLIST_ITEM_SCROLLTO_IN;
2492 switch (wd->scrollto_type)
2494 case ELM_GENLIST_ITEM_SCROLLTO_TOP:
2497 case ELM_GENLIST_ITEM_SCROLLTO_MIDDLE:
2500 case ELM_GENLIST_ITEM_SCROLLTO_IN:
2505 if ((pan_w > (wd->show_item->x + wd->show_item->item->block->x)) &&
2506 (pan_h > (wd->show_item->y + wd->show_item->item->block->y + dy)))
2511 wd->calc_job = NULL;
2512 evas_object_smart_changed(wd->pan_smart);
2513 evas_event_thaw(evas_object_evas_get(wd->obj));
2514 evas_event_thaw_eval(evas_object_evas_get(wd->obj));
2518 _update_job(void *data)
2520 Widget_Data *wd = data;
2524 Eina_Bool position = EINA_FALSE, recalc = EINA_FALSE;
2526 wd->update_job = NULL;
2529 evas_event_freeze(evas_object_evas_get(wd->obj));
2530 EINA_INLIST_FOREACH(wd->blocks, itb)
2532 Evas_Coord itminw, itminh;
2539 _item_block_position(itb, num);
2543 recalc = EINA_FALSE;
2544 EINA_LIST_FOREACH(itb->items, l2, it)
2546 if (it->item->updateme)
2548 itminw = it->item->minw;
2549 itminh = it->item->minh;
2551 it->item->updateme = EINA_FALSE;
2554 _elm_genlist_item_unrealize(it, EINA_FALSE);
2555 _item_realize(it, num, EINA_FALSE);
2556 position = EINA_TRUE;
2560 _item_realize(it, num, EINA_TRUE);
2561 _elm_genlist_item_unrealize(it, EINA_TRUE);
2563 if ((it->item->minw != itminw) || (it->item->minh != itminh))
2568 itb->updateme = EINA_FALSE;
2571 position = EINA_TRUE;
2572 itb->changed = EINA_TRUE;
2573 _item_block_recalc(itb, num0, EINA_FALSE);
2574 _item_block_position(itb, num0);
2579 if (wd->calc_job) ecore_job_del(wd->calc_job);
2580 wd->calc_job = ecore_job_add(_calc_job, wd);
2582 evas_event_thaw(evas_object_evas_get(wd->obj));
2583 evas_event_thaw_eval(evas_object_evas_get(wd->obj));
2587 _pan_set(Evas_Object *obj,
2591 Pan *sd = evas_object_smart_data_get(obj);
2595 // Evas_Coord ow, oh;
2596 // evas_object_geometry_get(obj, NULL, NULL, &ow, &oh);
2597 // ow = sd->wd->minw - ow;
2598 // if (ow < 0) ow = 0;
2599 // oh = sd->wd->minh - oh;
2600 // if (oh < 0) oh = 0;
2601 // if (x < 0) x = 0;
2602 // if (y < 0) y = 0;
2603 // if (x > ow) x = ow;
2604 // if (y > oh) y = oh;
2605 if ((x == sd->wd->pan_x) && (y == sd->wd->pan_y)) return;
2609 EINA_INLIST_FOREACH(sd->wd->blocks, itb)
2611 if ((itb->y + itb->h) > y)
2616 EINA_LIST_FOREACH(itb->items, l2, it)
2618 if ((itb->y + it->y) >= y)
2620 sd->wd->anchor_item = it;
2621 sd->wd->anchor_y = -(itb->y + it->y - y);
2628 if (!sd->wd->reorder_move_animator) evas_object_smart_changed(obj);
2632 _pan_get(Evas_Object *obj,
2636 Pan *sd = evas_object_smart_data_get(obj);
2639 if (x) *x = sd->wd->pan_x;
2640 if (y) *y = sd->wd->pan_y;
2644 _pan_max_get(Evas_Object *obj,
2648 Pan *sd = evas_object_smart_data_get(obj);
2652 evas_object_geometry_get(obj, NULL, NULL, &ow, &oh);
2653 ow = sd->wd->minw - ow;
2655 oh = sd->wd->minh - oh;
2662 _pan_min_get(Evas_Object *obj __UNUSED__,
2671 _pan_child_size_get(Evas_Object *obj,
2675 Pan *sd = evas_object_smart_data_get(obj);
2678 if (w) *w = sd->wd->minw;
2679 if (h) *h = sd->wd->minh;
2683 _pan_add(Evas_Object *obj)
2686 Evas_Object_Smart_Clipped_Data *cd;
2689 cd = evas_object_smart_data_get(obj);
2692 sd->__clipped_data = *cd;
2694 evas_object_smart_data_set(obj, sd);
2698 _pan_del(Evas_Object *obj)
2700 Pan *sd = evas_object_smart_data_get(obj);
2705 ecore_job_del(sd->resize_job);
2706 sd->resize_job = NULL;
2712 _pan_resize_job(void *data)
2716 _sizing_eval(sd->wd->obj);
2717 sd->resize_job = NULL;
2721 _pan_resize(Evas_Object *obj,
2725 Pan *sd = evas_object_smart_data_get(obj);
2729 evas_object_geometry_get(obj, NULL, NULL, &ow, &oh);
2730 if ((ow == w) && (oh == h)) return;
2731 if ((sd->wd->height_for_width) && (ow != w))
2734 if (sd->resize_job) ecore_job_del(sd->resize_job);
2735 sd->resize_job = ecore_job_add(_pan_resize_job, sd);
2737 sd->wd->pan_changed = EINA_TRUE;
2738 evas_object_smart_changed(obj);
2739 if (sd->wd->calc_job) ecore_job_del(sd->wd->calc_job);
2740 sd->wd->calc_job = NULL;
2742 if (sd->wd->calc_job) ecore_job_del(sd->wd->calc_job);
2743 sd->wd->calc_job = ecore_job_add(_calc_job, sd->wd);
2748 _pan_calculate(Evas_Object *obj)
2750 Pan *sd = evas_object_smart_data_get(obj);
2752 Evas_Coord ox, oy, ow, oh, cvx, cvy, cvw, cvh;
2758 evas_event_freeze(evas_object_evas_get(obj));
2760 if (sd->wd->pan_changed)
2763 sd->wd->pan_changed = EINA_FALSE;
2766 evas_object_geometry_get(obj, &ox, &oy, &ow, &oh);
2767 evas_output_viewport_get(evas_object_evas_get(obj), &cvx, &cvy, &cvw, &cvh);
2768 EINA_LIST_FOREACH(sd->wd->group_items, l, git)
2770 git->item->want_realize = EINA_FALSE;
2772 EINA_INLIST_FOREACH(sd->wd->blocks, itb)
2774 itb->w = sd->wd->minw;
2775 if (ELM_RECTS_INTERSECT(itb->x - sd->wd->pan_x + ox,
2776 itb->y - sd->wd->pan_y + oy,
2778 cvx, cvy, cvw, cvh))
2780 if ((!itb->realized) || (itb->changed))
2781 _item_block_realize(itb);
2782 _item_block_position(itb, in);
2786 if (itb->realized) _item_block_unrealize(itb);
2790 if ((!sd->wd->reorder_it) || (sd->wd->reorder_pan_move))
2791 _group_items_recalc(sd->wd);
2792 if ((sd->wd->reorder_mode) && (sd->wd->reorder_it))
2794 if (sd->wd->pan_y != sd->wd->reorder_old_pan_y)
2795 sd->wd->reorder_pan_move = EINA_TRUE;
2796 else sd->wd->reorder_pan_move = EINA_FALSE;
2797 evas_object_raise(sd->wd->VIEW(reorder_it));
2798 sd->wd->reorder_old_pan_y = sd->wd->pan_y;
2799 sd->wd->start_time = ecore_loop_time_get();
2801 _item_auto_scroll(sd->wd);
2802 evas_event_thaw(evas_object_evas_get(obj));
2803 evas_event_thaw_eval(evas_object_evas_get(obj));
2807 _pan_move(Evas_Object *obj,
2808 Evas_Coord x __UNUSED__,
2809 Evas_Coord y __UNUSED__)
2811 Pan *sd = evas_object_smart_data_get(obj);
2815 sd->wd->pan_changed = EINA_TRUE;
2816 evas_object_smart_changed(obj);
2817 if (sd->wd->calc_job) ecore_job_del(sd->wd->calc_job);
2818 sd->wd->calc_job = NULL;
2822 _hold_on(void *data __UNUSED__,
2824 void *event_info __UNUSED__)
2826 Widget_Data *wd = elm_widget_data_get(obj);
2828 elm_smart_scroller_hold_set(wd->scr, 1);
2832 _hold_off(void *data __UNUSED__,
2834 void *event_info __UNUSED__)
2836 Widget_Data *wd = elm_widget_data_get(obj);
2838 elm_smart_scroller_hold_set(wd->scr, 0);
2842 _freeze_on(void *data __UNUSED__,
2844 void *event_info __UNUSED__)
2846 Widget_Data *wd = elm_widget_data_get(obj);
2848 elm_smart_scroller_freeze_set(wd->scr, 1);
2852 _freeze_off(void *data __UNUSED__,
2854 void *event_info __UNUSED__)
2856 Widget_Data *wd = elm_widget_data_get(obj);
2858 elm_smart_scroller_freeze_set(wd->scr, 0);
2862 _scr_anim_start(void *data,
2863 Evas_Object *obj __UNUSED__,
2864 void *event_info __UNUSED__)
2866 evas_object_smart_callback_call(data, SIG_SCROLL_ANIM_START, NULL);
2870 _scr_anim_stop(void *data,
2871 Evas_Object *obj __UNUSED__,
2872 void *event_info __UNUSED__)
2874 evas_object_smart_callback_call(data, SIG_SCROLL_ANIM_STOP, NULL);
2878 _scr_drag_start(void *data,
2879 Evas_Object *obj __UNUSED__,
2880 void *event_info __UNUSED__)
2882 evas_object_smart_callback_call(data, SIG_SCROLL_DRAG_START, NULL);
2886 _scr_drag_stop(void *data,
2887 Evas_Object *obj __UNUSED__,
2888 void *event_info __UNUSED__)
2890 evas_object_smart_callback_call(data, SIG_SCROLL_DRAG_STOP, NULL);
2894 _edge_left(void *data,
2895 Evas_Object *scr __UNUSED__,
2896 void *event_info __UNUSED__)
2898 Evas_Object *obj = data;
2899 evas_object_smart_callback_call(obj, SIG_EDGE_LEFT, NULL);
2903 _edge_right(void *data,
2904 Evas_Object *scr __UNUSED__,
2905 void *event_info __UNUSED__)
2907 Evas_Object *obj = data;
2908 evas_object_smart_callback_call(obj, SIG_EDGE_RIGHT, NULL);
2912 _edge_top(void *data,
2913 Evas_Object *scr __UNUSED__,
2914 void *event_info __UNUSED__)
2916 Evas_Object *obj = data;
2917 evas_object_smart_callback_call(obj, SIG_EDGE_TOP, NULL);
2921 _edge_bottom(void *data,
2922 Evas_Object *scr __UNUSED__,
2923 void *event_info __UNUSED__)
2925 Evas_Object *obj = data;
2926 evas_object_smart_callback_call(obj, SIG_EDGE_BOTTOM, NULL);
2930 _mode_item_realize(Elm_Gen_Item *it)
2934 if ((it->item->mode_view) || (it->generation < it->wd->generation)) return;
2936 evas_event_freeze(evas_object_evas_get(it->wd->obj));
2937 it->item->mode_view = edje_object_add(evas_object_evas_get(WIDGET(it)));
2938 edje_object_scale_set(it->item->mode_view,
2939 elm_widget_scale_get(WIDGET(it)) *
2940 _elm_config->scale);
2941 evas_object_smart_member_add(it->item->mode_view, it->wd->pan_smart);
2942 elm_widget_sub_object_add(WIDGET(it), it->item->mode_view);
2944 strncpy(buf, "item", sizeof(buf));
2945 if (it->wd->compress)
2946 strncat(buf, "_compress", sizeof(buf) - strlen(buf));
2948 if (it->item->order_num_in & 0x1) strncat(buf, "_odd", sizeof(buf) - strlen(buf));
2949 strncat(buf, "/", sizeof(buf) - strlen(buf));
2950 strncat(buf, it->wd->mode_item_style, sizeof(buf) - strlen(buf));
2952 _elm_theme_object_set(WIDGET(it), it->item->mode_view, "genlist", buf,
2953 elm_widget_style_get(WIDGET(it)));
2954 edje_object_mirrored_set(it->item->mode_view,
2955 elm_widget_mirrored_get(WIDGET(it)));
2957 /* signal callback add */
2958 evas_object_event_callback_add(it->item->mode_view, EVAS_CALLBACK_MOUSE_DOWN,
2960 evas_object_event_callback_add(it->item->mode_view, EVAS_CALLBACK_MOUSE_UP,
2962 evas_object_event_callback_add(it->item->mode_view, EVAS_CALLBACK_MOUSE_MOVE,
2965 /* text_get, content_get, state_get */
2966 /* FIXME: If you see that assert, please notify us and we
2967 will clean our mess */
2968 assert(eina_list_count(it->item->mode_content_objs) == 0);
2970 _item_text_realize(it, it->item->mode_view, &it->item->mode_texts, NULL);
2971 it->item->mode_content_objs =
2972 _item_content_realize(it, it->item->mode_view,
2973 &it->item->mode_contents, NULL);
2974 _item_state_realize(it, it->item->mode_view, &it->item->mode_states, NULL);
2976 edje_object_part_swallow(it->item->mode_view,
2977 edje_object_data_get(it->item->mode_view, "mode_part"),
2980 it->want_unrealize = EINA_FALSE;
2981 evas_event_thaw(evas_object_evas_get(it->wd->obj));
2982 evas_event_thaw_eval(evas_object_evas_get(it->wd->obj));
2986 _mode_item_unrealize(Elm_Gen_Item *it)
2988 Widget_Data *wd = it->wd;
2989 Evas_Object *content;
2990 if (!it->item->mode_view) return;
2992 evas_event_freeze(evas_object_evas_get(it->wd->obj));
2993 elm_widget_stringlist_free(it->item->mode_texts);
2994 it->item->mode_texts = NULL;
2995 elm_widget_stringlist_free(it->item->mode_contents);
2996 it->item->mode_contents = NULL;
2997 elm_widget_stringlist_free(it->item->mode_states);
2999 EINA_LIST_FREE(it->item->mode_content_objs, content)
3000 evas_object_del(content);
3002 edje_object_part_unswallow(it->item->mode_view, VIEW(it));
3003 evas_object_smart_member_add(VIEW(it), wd->pan_smart);
3004 evas_object_del(it->item->mode_view);
3005 it->item->mode_view = NULL;
3007 if (wd->mode_item == it)
3008 wd->mode_item = NULL;
3009 evas_event_thaw(evas_object_evas_get(it->wd->obj));
3010 evas_event_thaw_eval(evas_object_evas_get(it->wd->obj));
3014 _item_mode_set(Elm_Gen_Item *it)
3017 Widget_Data *wd = it->wd;
3022 it->item->nocache = EINA_TRUE;
3024 if (wd->scr_hold_timer)
3026 ecore_timer_del(wd->scr_hold_timer);
3027 wd->scr_hold_timer = NULL;
3029 elm_smart_scroller_hold_set(wd->scr, EINA_TRUE);
3030 wd->scr_hold_timer = ecore_timer_add(0.1, _scr_hold_timer_cb, wd);
3032 evas_event_freeze(evas_object_evas_get(it->wd->obj));
3033 _mode_item_realize(it);
3034 if (it->item->group_item)
3035 evas_object_raise(it->item->VIEW(group_item));
3036 _item_position(it, it->item->mode_view, it->item->scrl_x, it->item->scrl_y);
3037 evas_event_thaw(evas_object_evas_get(it->wd->obj));
3038 evas_event_thaw_eval(evas_object_evas_get(it->wd->obj));
3040 snprintf(buf, sizeof(buf), "elm,state,%s,active", wd->mode_type);
3041 edje_object_signal_emit(it->item->mode_view, buf, "elm");
3045 _item_mode_unset(Widget_Data *wd)
3048 if (!wd->mode_item) return;
3049 char buf[1024], buf2[1024];
3053 it->item->nocache = EINA_TRUE;
3055 snprintf(buf, sizeof(buf), "elm,state,%s,passive", wd->mode_type);
3056 snprintf(buf2, sizeof(buf2), "elm,state,%s,passive,finished", wd->mode_type);
3058 edje_object_signal_emit(it->item->mode_view, buf, "elm");
3059 edje_object_signal_callback_add(it->item->mode_view, buf2, "elm", _mode_finished_signal_cb, it);
3061 wd->mode_item = NULL;
3065 _item_auto_scroll(Widget_Data *wd)
3068 Elm_Gen_Item *tmp_item = NULL;
3070 if ((wd->expanded_item) && (wd->auto_scroll_enabled))
3072 tmp_item = eina_list_data_get(eina_list_last(wd->expanded_item->item->items));
3073 if (!tmp_item) return;
3074 wd->show_item = tmp_item;
3075 wd->bring_in = EINA_TRUE;
3076 wd->scrollto_type = ELM_GENLIST_ITEM_SCROLLTO_IN;
3077 if ((wd->show_item->item->queued) || (!wd->show_item->item->mincalcd))
3079 wd->show_item->item->showme = EINA_TRUE;
3080 wd->auto_scroll_enabled = EINA_FALSE;
3088 elm_genlist_add(Evas_Object *parent)
3093 Evas_Coord minw, minh;
3094 static Evas_Smart *smart = NULL;
3098 static Evas_Smart_Class sc;
3100 evas_object_smart_clipped_smart_set(&_pan_sc);
3102 sc.name = "elm_genlist_pan";
3103 sc.version = EVAS_SMART_CLASS_VERSION;
3106 sc.resize = _pan_resize;
3107 sc.move = _pan_move;
3108 sc.calculate = _pan_calculate;
3109 if (!(smart = evas_smart_class_new(&sc))) return NULL;
3112 ELM_WIDGET_STANDARD_SETUP(wd, Widget_Data, parent, e, obj, NULL);
3114 ELM_SET_WIDTYPE(widtype, "genlist");
3116 elm_widget_type_set(obj, "genlist");
3117 elm_widget_sub_object_add(parent, obj);
3118 elm_widget_on_focus_hook_set(obj, _on_focus_hook, NULL);
3119 elm_widget_signal_emit_hook_set(obj, _signal_emit_hook);
3120 elm_widget_data_set(obj, wd);
3121 elm_widget_del_hook_set(obj, _del_hook);
3122 elm_widget_del_pre_hook_set(obj, _del_pre_hook);
3123 elm_widget_theme_hook_set(obj, _theme_hook);
3124 elm_widget_can_focus_set(obj, EINA_TRUE);
3125 elm_widget_event_hook_set(obj, _event_hook);
3126 elm_widget_on_show_region_hook_set(obj, _show_region_hook, obj);
3127 elm_widget_translate_hook_set(obj, _translate_hook);
3130 wd->scr = elm_smart_scroller_add(e);
3131 elm_smart_scroller_widget_set(wd->scr, obj);
3132 elm_smart_scroller_object_theme_set(obj, wd->scr, "genlist", "base",
3133 elm_widget_style_get(obj));
3134 elm_smart_scroller_bounce_allow_set(wd->scr, EINA_FALSE,
3135 _elm_config->thumbscroll_bounce_enable);
3136 elm_widget_resize_object_set(obj, wd->scr);
3138 evas_object_smart_callback_add(wd->scr, "animate,start", _scr_anim_start, obj);
3139 evas_object_smart_callback_add(wd->scr, "animate,stop", _scr_anim_stop, obj);
3140 evas_object_smart_callback_add(wd->scr, "drag,start", _scr_drag_start, obj);
3141 evas_object_smart_callback_add(wd->scr, "drag,stop", _scr_drag_stop, obj);
3142 evas_object_smart_callback_add(wd->scr, "edge,left", _edge_left, obj);
3143 evas_object_smart_callback_add(wd->scr, "edge,right", _edge_right, obj);
3144 evas_object_smart_callback_add(wd->scr, "edge,top", _edge_top, obj);
3145 evas_object_smart_callback_add(wd->scr, "edge,bottom", _edge_bottom, obj);
3148 wd->mode = ELM_LIST_SCROLL;
3149 wd->max_items_per_block = MAX_ITEMS_PER_BLOCK;
3150 wd->item_cache_max = wd->max_items_per_block * 2;
3151 wd->longpress_timeout = _elm_config->longpress_timeout;
3153 evas_object_smart_callback_add(obj, "scroll-hold-on", _hold_on, obj);
3154 evas_object_smart_callback_add(obj, "scroll-hold-off", _hold_off, obj);
3155 evas_object_smart_callback_add(obj, "scroll-freeze-on", _freeze_on, obj);
3156 evas_object_smart_callback_add(obj, "scroll-freeze-off", _freeze_off, obj);
3158 wd->pan_smart = evas_object_smart_add(e, smart);
3159 wd->pan = evas_object_smart_data_get(wd->pan_smart);
3162 elm_smart_scroller_extern_pan_set(wd->scr, wd->pan_smart,
3163 _pan_set, _pan_get, _pan_max_get,
3164 _pan_min_get, _pan_child_size_get);
3166 edje_object_size_min_calc(elm_smart_scroller_edje_object_get(wd->scr),
3168 evas_object_size_hint_min_set(obj, minw, minh);
3170 evas_object_smart_callbacks_descriptions_set(obj, _signals);
3172 _mirrored_set(obj, elm_widget_mirrored_get(obj));
3178 _item_select(Elm_Gen_Item *it)
3180 if ((it->wd->no_select) || (it->generation < it->wd->generation) || (it->mode_set)) return;
3183 it->selected = EINA_TRUE;
3184 it->wd->selected = eina_list_append(it->wd->selected, it);
3186 else if (!it->wd->always_select) return;
3188 evas_object_ref(WIDGET(it));
3191 if (it->func.func) it->func.func((void *)it->func.data, WIDGET(it), it);
3192 if (it->generation == it->wd->generation)
3193 evas_object_smart_callback_call(WIDGET(it), SIG_SELECTED, it);
3196 evas_object_unref(WIDGET(it));
3197 if ((it->wd->clear_me) && (!it->wd->walking))
3198 _elm_genlist_clear(WIDGET(it), EINA_TRUE);
3201 if ((!it->walking) && (it->generation < it->wd->generation))
3203 if (!it->relcount) it->del_cb(it);
3206 it->wd->last_selected_item = it;
3210 static Evas_Object *
3211 _item_content_get_hook(Elm_Gen_Item *it, const char *part)
3213 return edje_object_part_swallow_get(VIEW(it), part);
3217 _item_content_set_hook(Elm_Gen_Item *it, const char *part, Evas_Object *content)
3219 edje_object_part_swallow(VIEW(it), part, content);
3222 static Evas_Object *
3223 _item_content_unset_hook(Elm_Gen_Item *it, const char *part)
3227 obj = edje_object_part_swallow_get(VIEW(it), part);
3228 if (!obj) return NULL;
3229 edje_object_part_unswallow(VIEW(it), obj);
3234 _item_text_hook(Elm_Gen_Item *it, const char *part)
3236 if (!it->itc->func.text_get) return NULL;
3237 return edje_object_part_text_get(VIEW(it), part);
3241 _elm_genlist_item_new(Widget_Data *wd,
3242 const Elm_Gen_Item_Class *itc,
3244 Elm_Gen_Item *parent,
3246 const void *func_data)
3250 it = elm_widget_item_new(wd->obj, Elm_Gen_Item);
3251 if (!it) return NULL;
3253 it->generation = wd->generation;
3255 it->base.data = data;
3256 it->parent = parent;
3257 it->func.func = func;
3258 it->func.data = func_data;
3259 elm_widget_item_content_get_hook_set(it, _item_content_get_hook);
3260 elm_widget_item_content_set_hook_set(it, _item_content_set_hook);
3261 elm_widget_item_content_unset_hook_set(it, _item_content_unset_hook);
3263 it->sel_cb = (Ecore_Cb)_item_select;
3265 elm_widget_item_text_get_hook_set(it, _item_text_hook);
3269 static Elm_Gen_Item *
3270 _item_new(Widget_Data *wd,
3271 const Elm_Genlist_Item_Class *itc,
3273 Elm_Gen_Item *parent,
3274 Elm_Genlist_Item_Flags flags,
3276 const void *func_data)
3278 Elm_Gen_Item *it, *it2;
3281 it = _elm_genlist_item_new(wd, itc, data, parent, func, func_data);
3282 if (!it) return NULL;
3283 it->item = ELM_NEW(Elm_Gen_Item_Type);
3284 it->item->flags = flags;
3285 if (flags & ELM_GENLIST_ITEM_GROUP) it->group++;
3286 it->item->expanded_depth = 0;
3287 ELM_GEN_ITEM_SETUP(it);
3290 if (it->parent->group)
3291 it->item->group_item = parent;
3292 else if (it->parent->item->group_item)
3293 it->item->group_item = it->parent->item->group_item;
3295 for (it2 = it, depth = 0; it2->parent; it2 = it2->parent)
3297 if (!it2->parent->group) depth += 1;
3299 it->item->expanded_depth = depth;
3304 _item_block_new(Widget_Data *wd, Eina_Bool prepend)
3308 itb = calloc(1, sizeof(Item_Block));
3309 if (!itb) return NULL;
3313 wd->blocks = eina_inlist_prepend(wd->blocks, EINA_INLIST_GET(itb));
3314 _item_block_position_update(wd->blocks, 0);
3318 wd->blocks = eina_inlist_append(wd->blocks, EINA_INLIST_GET(itb));
3319 itb->position_update = EINA_TRUE;
3320 if (wd->blocks != EINA_INLIST_GET(itb))
3322 itb->position = ((Item_Block *) (EINA_INLIST_GET(itb)->prev))->position + 1;
3333 _item_block_add(Widget_Data *wd,
3336 Item_Block *itb = NULL;
3343 itb = calloc(1, sizeof(Item_Block));
3344 if (!itb) return EINA_FALSE;
3346 if (!it->item->rel->item->block)
3349 eina_inlist_append(wd->blocks, EINA_INLIST_GET(itb));
3350 itb->items = eina_list_append(itb->items, it);
3351 itb->position_update = EINA_TRUE;
3352 it->position = eina_list_count(itb->items);
3353 it->position_update = EINA_TRUE;
3355 if (wd->blocks != EINA_INLIST_GET(itb))
3357 itb->position = ((Item_Block *) (EINA_INLIST_GET(itb)->prev))->position + 1;
3368 tmp = eina_list_data_find_list(itb->items, it->item->rel);
3369 if (it->item->before)
3371 wd->blocks = eina_inlist_prepend_relative
3372 (wd->blocks, EINA_INLIST_GET(itb),
3373 EINA_INLIST_GET(it->item->rel->item->block));
3375 eina_list_prepend_relative_list(itb->items, it, tmp);
3377 /* Update index from where we prepended */
3378 _item_position_update(eina_list_prev(tmp), it->item->rel->position);
3379 _item_block_position_update(EINA_INLIST_GET(itb),
3380 it->item->rel->item->block->position);
3384 wd->blocks = eina_inlist_append_relative
3385 (wd->blocks, EINA_INLIST_GET(itb),
3386 EINA_INLIST_GET(it->item->rel->item->block));
3388 eina_list_append_relative_list(itb->items, it, tmp);
3390 /* Update block index from where we appended */
3391 _item_position_update(eina_list_next(tmp), it->item->rel->position + 1);
3392 _item_block_position_update(EINA_INLIST_GET(itb),
3393 it->item->rel->item->block->position + 1);
3399 if (it->item->before)
3403 itb = (Item_Block *)(wd->blocks);
3404 if (itb->count >= wd->max_items_per_block)
3406 itb = _item_block_new(wd, EINA_TRUE);
3407 if (!itb) return EINA_FALSE;
3412 itb = _item_block_new(wd, EINA_TRUE);
3413 if (!itb) return EINA_FALSE;
3415 itb->items = eina_list_prepend(itb->items, it);
3417 _item_position_update(itb->items, 0);
3423 itb = (Item_Block *)(wd->blocks->last);
3424 if (itb->count >= wd->max_items_per_block)
3426 itb = _item_block_new(wd, EINA_FALSE);
3427 if (!itb) return EINA_FALSE;
3432 itb = _item_block_new(wd, EINA_FALSE);
3433 if (!itb) return EINA_FALSE;
3435 itb->items = eina_list_append(itb->items, it);
3436 it->position = eina_list_count(itb->items);
3444 if (it->item->rel->item->queued)
3446 /* NOTE: for a strange reason eina_list and eina_inlist don't have the same property
3447 on sorted insertion order, so the queue is not always ordered like the item list.
3448 This lead to issue where we depend on an item that is not yet created. As a quick
3449 work around, we reschedule the calc of the item and stop reordering the list to
3450 prevent any nasty issue to show up here.
3452 wd->queue = eina_list_append(wd->queue, it);
3453 wd->requeued = EINA_TRUE;
3454 it->item->queued = EINA_TRUE;
3457 itb = it->item->rel->item->block;
3458 if (!itb) goto newblock;
3459 tmp = eina_list_data_find_list(itb->items, it->item->rel);
3460 if (it->item->before)
3462 itb->items = eina_list_prepend_relative_list(itb->items, it, tmp);
3463 _item_position_update(eina_list_prev(tmp), it->item->rel->position);
3467 itb->items = eina_list_append_relative_list(itb->items, it, tmp);
3468 _item_position_update(eina_list_next(tmp), it->item->rel->position + 1);
3472 itb->changed = EINA_TRUE;
3473 it->item->block = itb;
3474 if (itb->wd->calc_job) ecore_job_del(itb->wd->calc_job);
3475 itb->wd->calc_job = ecore_job_add(_calc_job, itb->wd);
3478 it->item->rel->relcount--;
3479 if ((it->item->rel->generation < it->wd->generation) && (!it->item->rel->relcount))
3480 _item_del(it->item->rel);
3481 it->item->rel = NULL;
3483 if (itb->count > itb->wd->max_items_per_block)
3488 Eina_Bool done = EINA_FALSE;
3490 newc = itb->count / 2;
3492 if (EINA_INLIST_GET(itb)->prev)
3494 Item_Block *itbp = (Item_Block *)(EINA_INLIST_GET(itb)->prev);
3496 if (itbp->count + newc < wd->max_items_per_block / 2)
3498 /* moving items to previous block */
3499 while ((itb->count > newc) && (itb->items))
3501 it2 = eina_list_data_get(itb->items);
3502 itb->items = eina_list_remove_list(itb->items, itb->items);
3505 itbp->items = eina_list_append(itbp->items, it2);
3506 it2->item->block = itbp;
3514 if (!done && EINA_INLIST_GET(itb)->next)
3516 Item_Block *itbn = (Item_Block *)(EINA_INLIST_GET(itb)->next);
3518 if (itbn->count + newc < wd->max_items_per_block / 2)
3520 /* moving items to next block */
3521 while ((itb->count > newc) && (itb->items))
3525 l = eina_list_last(itb->items);
3526 it2 = eina_list_data_get(l);
3527 itb->items = eina_list_remove_list(itb->items, l);
3530 itbn->items = eina_list_prepend(itbn->items, it2);
3531 it2->item->block = itbn;
3541 /* moving items to new block */
3542 itb2 = calloc(1, sizeof(Item_Block));
3543 if (!itb2) return EINA_FALSE;
3546 eina_inlist_append_relative(wd->blocks, EINA_INLIST_GET(itb2),
3547 EINA_INLIST_GET(itb));
3548 itb2->changed = EINA_TRUE;
3549 while ((itb->count > newc) && (itb->items))
3553 l = eina_list_last(itb->items);
3555 itb->items = eina_list_remove_list(itb->items, l);
3558 itb2->items = eina_list_prepend(itb2->items, it2);
3559 it2->item->block = itb2;
3569 _queue_process(Widget_Data *wd)
3572 Eina_Bool showme = EINA_FALSE;
3575 t0 = ecore_loop_time_get();
3576 //evas_event_freeze(evas_object_evas_get(wd->obj));
3577 for (n = 0; (wd->queue) && (n < 128); n++)
3581 it = eina_list_data_get(wd->queue);
3582 wd->queue = eina_list_remove_list(wd->queue, wd->queue);
3583 it->item->queued = EINA_FALSE;
3584 if (!_item_block_add(wd, it)) continue;
3586 _item_block_realize(it->item->block);
3587 t = ecore_time_get();
3588 if (it->item->block->changed)
3590 showme = _item_block_recalc(it->item->block, it->item->block->num, EINA_TRUE);
3591 it->item->block->changed = 0;
3592 if (wd->pan_changed)
3594 if (wd->calc_job) ecore_job_del(wd->calc_job);
3595 wd->calc_job = NULL;
3597 wd->pan_changed = EINA_FALSE;
3600 if (showme) it->item->block->showme = EINA_TRUE;
3601 /* same as eina_inlist_count > 1 */
3602 if (wd->blocks && wd->blocks->next)
3604 if ((t - t0) > (ecore_animator_frametime_get())) break;
3607 //evas_event_thaw(evas_object_evas_get(wd->obj));
3608 //evas_event_thaw_eval(evas_object_evas_get(wd->obj));
3613 _idle_process(void *data, Eina_Bool *wakeup)
3615 Widget_Data *wd = data;
3618 //static double q_start = 0.0;
3619 //if (q_start == 0.0) q_start = ecore_time_get();
3621 if (_queue_process(wd) > 0) *wakeup = EINA_TRUE;
3625 //printf("PROCESS TIME: %3.3f\n", ecore_time_get() - q_start);
3627 return ECORE_CALLBACK_CANCEL;
3629 return ECORE_CALLBACK_RENEW;
3633 _item_idle_enterer(void *data)
3635 Widget_Data *wd = data;
3636 Eina_Bool wakeup = EINA_FALSE;
3637 Eina_Bool ok = _idle_process(data, &wakeup);
3642 if (wd->calc_job) ecore_job_del(wd->calc_job);
3643 wd->calc_job = ecore_job_add(_calc_job, wd);
3645 if (ok == ECORE_CALLBACK_CANCEL) wd->queue_idle_enterer = NULL;
3650 _item_queue(Widget_Data *wd,
3654 if (it->item->queued) return;
3655 it->item->queued = EINA_TRUE;
3656 if (cb && !wd->requeued)
3657 wd->queue = eina_list_sorted_insert(wd->queue, cb, it);
3659 wd->queue = eina_list_append(wd->queue, it);
3660 // FIXME: why does a freeze then thaw here cause some genlist
3661 // elm_genlist_item_append() to be much much slower?
3662 // evas_event_freeze(evas_object_evas_get(wd->obj));
3663 while ((wd->queue) && ((!wd->blocks) || (!wd->blocks->next)))
3665 if (wd->queue_idle_enterer)
3667 ecore_idle_enterer_del(wd->queue_idle_enterer);
3668 wd->queue_idle_enterer = NULL;
3672 // evas_event_thaw(evas_object_evas_get(wd->obj));
3673 // evas_event_thaw_eval(evas_object_evas_get(wd->obj));
3674 if (!wd->queue_idle_enterer)
3675 wd->queue_idle_enterer = ecore_idle_enterer_add(_item_idle_enterer, wd);
3679 _elm_genlist_item_compare_data(const void *data, const void *data1)
3681 const Elm_Gen_Item *it = data;
3682 const Elm_Gen_Item *item1 = data1;
3684 return it->wd->item_compare_data_cb(it->base.data, item1->base.data);
3688 _elm_genlist_item_compare(const void *data, const void *data1)
3690 const Elm_Gen_Item *it, *item1;
3691 it = ELM_GEN_ITEM_FROM_INLIST(data);
3692 item1 = ELM_GEN_ITEM_FROM_INLIST(data1);
3693 return it->wd->item_compare_cb(it, item1);
3697 _elm_genlist_item_list_compare(const void *data, const void *data1)
3699 const Elm_Gen_Item *it = data;
3700 const Elm_Gen_Item *item1 = data1;
3701 return it->wd->item_compare_cb(it, item1);
3705 _item_move_after(Elm_Gen_Item *it, Elm_Gen_Item *after)
3710 it->wd->items = eina_inlist_remove(it->wd->items, EINA_INLIST_GET(it));
3711 _item_block_del(it);
3713 it->wd->items = eina_inlist_append_relative(it->wd->items, EINA_INLIST_GET(it), EINA_INLIST_GET(after));
3714 it->item->rel = after;
3715 it->item->rel->relcount++;
3716 it->item->before = EINA_FALSE;
3717 if (after->item->group_item) it->item->group_item = after->item->group_item;
3718 _item_queue(it->wd, it, NULL);
3720 evas_object_smart_callback_call(WIDGET(it), SIG_MOVED, it);
3724 _item_move_before(Elm_Gen_Item *it, Elm_Gen_Item *before)
3727 if (!before) return;
3729 it->wd->items = eina_inlist_remove(it->wd->items, EINA_INLIST_GET(it));
3730 _item_block_del(it);
3731 it->wd->items = eina_inlist_prepend_relative(it->wd->items, EINA_INLIST_GET(it), EINA_INLIST_GET(before));
3732 it->item->rel = before;
3733 it->item->rel->relcount++;
3734 it->item->before = EINA_TRUE;
3735 if (before->item->group_item) it->item->group_item = before->item->group_item;
3736 _item_queue(it->wd, it, NULL);
3738 evas_object_smart_callback_call(WIDGET(it), SIG_MOVED, it);
3741 EAPI Elm_Object_Item *
3742 elm_genlist_item_append(Evas_Object *obj,
3743 const Elm_Genlist_Item_Class *itc,
3745 Elm_Object_Item *parent,
3746 Elm_Genlist_Item_Flags flags,
3748 const void *func_data)
3750 ELM_CHECK_WIDTYPE(obj, widtype) NULL;
3751 Widget_Data *wd = elm_widget_data_get(obj);
3752 if (!wd) return NULL;
3753 Elm_Gen_Item *it = _item_new(wd, itc, data, (Elm_Gen_Item *) parent, flags,
3755 if (!it) return NULL;
3759 wd->group_items = eina_list_append(wd->group_items, it);
3760 wd->items = eina_inlist_append(wd->items, EINA_INLIST_GET(it));
3761 it->item->rel = NULL;
3765 Elm_Gen_Item *it2 = NULL;
3766 Eina_List *ll = eina_list_last(it->parent->item->items);
3767 if (ll) it2 = ll->data;
3768 it->parent->item->items = eina_list_append(it->parent->item->items, it);
3769 if (!it2) it2 = it->parent;
3771 eina_inlist_append_relative(wd->items, EINA_INLIST_GET(it),
3772 EINA_INLIST_GET(it2));
3773 it->item->rel = it2;
3774 it->item->rel->relcount++;
3776 it->item->before = EINA_FALSE;
3777 _item_queue(wd, it, NULL);
3778 return (Elm_Object_Item *) it;
3781 EAPI Elm_Object_Item *
3782 elm_genlist_item_prepend(Evas_Object *obj,
3783 const Elm_Genlist_Item_Class *itc,
3785 Elm_Object_Item *parent,
3786 Elm_Genlist_Item_Flags flags,
3788 const void *func_data)
3790 ELM_CHECK_WIDTYPE(obj, widtype) NULL;
3791 Widget_Data *wd = elm_widget_data_get(obj);
3792 if (!wd) return NULL;
3793 Elm_Gen_Item *it = _item_new(wd, itc, data, (Elm_Gen_Item *) parent, flags,
3795 if (!it) return NULL;
3799 wd->group_items = eina_list_prepend(wd->group_items, it);
3800 wd->items = eina_inlist_prepend(wd->items, EINA_INLIST_GET(it));
3801 it->item->rel = NULL;
3805 Elm_Gen_Item *it2 = NULL;
3806 Eina_List *ll = it->parent->item->items;
3807 if (ll) it2 = ll->data;
3808 it->parent->item->items = eina_list_prepend(it->parent->item->items, it);
3809 if (!it2) it2 = it->parent;
3811 eina_inlist_prepend_relative(wd->items, EINA_INLIST_GET(it),
3812 EINA_INLIST_GET(it2));
3813 it->item->rel = it2;
3814 it->item->rel->relcount++;
3816 it->item->before = EINA_TRUE;
3817 _item_queue(wd, it, NULL);
3818 return (Elm_Object_Item *) it;
3821 EAPI Elm_Object_Item *
3822 elm_genlist_item_insert_after(Evas_Object *obj,
3823 const Elm_Genlist_Item_Class *itc,
3825 Elm_Object_Item *parent,
3826 Elm_Object_Item *after,
3827 Elm_Genlist_Item_Flags flags,
3829 const void *func_data)
3831 ELM_CHECK_WIDTYPE(obj, widtype) NULL;
3832 ELM_OBJ_ITEM_CHECK_OR_RETURN(after, NULL);
3833 Widget_Data *wd = elm_widget_data_get(obj);
3834 Elm_Gen_Item *_after = (Elm_Gen_Item *) after;
3835 if (!wd) return NULL;
3836 /* It makes no sense to insert after in an empty list with after != NULL, something really bad is happening in your app. */
3837 EINA_SAFETY_ON_NULL_RETURN_VAL(wd->items, NULL);
3839 Elm_Gen_Item *it = _item_new(wd, itc, data, (Elm_Gen_Item *) parent, flags,
3841 if (!it) return NULL;
3844 if ((it->group) && (_after->group))
3845 wd->group_items = eina_list_append_relative(wd->group_items, it,
3850 it->parent->item->items =
3851 eina_list_append_relative(it->parent->item->items, it, _after);
3853 wd->items = eina_inlist_append_relative(wd->items, EINA_INLIST_GET(it),
3854 EINA_INLIST_GET(_after));
3855 it->item->rel = _after;
3856 it->item->rel->relcount++;
3857 it->item->before = EINA_FALSE;
3858 _item_queue(wd, it, NULL);
3859 return (Elm_Object_Item *) it;
3862 EAPI Elm_Object_Item *
3863 elm_genlist_item_insert_before(Evas_Object *obj,
3864 const Elm_Genlist_Item_Class *itc,
3866 Elm_Object_Item *parent,
3867 Elm_Object_Item *before,
3868 Elm_Genlist_Item_Flags flags,
3870 const void *func_data)
3872 ELM_CHECK_WIDTYPE(obj, widtype) NULL;
3873 ELM_OBJ_ITEM_CHECK_OR_RETURN(before, NULL);
3874 Widget_Data *wd = elm_widget_data_get(obj);
3875 Elm_Gen_Item *_before = (Elm_Gen_Item *) before;
3876 if (!wd) return NULL;
3877 /* It makes no sense to insert before in an empty list with before != NULL, something really bad is happening in your app. */
3878 EINA_SAFETY_ON_NULL_RETURN_VAL(wd->items, NULL);
3880 Elm_Gen_Item *it = _item_new(wd, itc, data, (Elm_Gen_Item *) parent, flags,
3882 if (!it) return NULL;
3885 if (it->group && _before->group)
3886 wd->group_items = eina_list_prepend_relative(wd->group_items, it,
3891 it->parent->item->items =
3892 eina_list_prepend_relative(it->parent->item->items, it, _before);
3894 wd->items = eina_inlist_prepend_relative(wd->items, EINA_INLIST_GET(it),
3895 EINA_INLIST_GET(_before));
3896 it->item->rel = _before;
3897 it->item->rel->relcount++;
3898 it->item->before = EINA_TRUE;
3899 _item_queue(wd, it, NULL);
3900 return (Elm_Object_Item *) it;
3903 EAPI Elm_Object_Item *
3904 elm_genlist_item_direct_sorted_insert(Evas_Object *obj,
3905 const Elm_Genlist_Item_Class *itc,
3907 Elm_Object_Item *parent,
3908 Elm_Genlist_Item_Flags flags,
3909 Eina_Compare_Cb comp,
3911 const void *func_data)
3913 ELM_CHECK_WIDTYPE(obj, widtype) NULL;
3914 Widget_Data *wd = elm_widget_data_get(obj);
3915 if (!wd) return NULL;
3916 Elm_Gen_Item *rel = NULL;
3917 Elm_Gen_Item *it = _item_new(wd, itc, data, (Elm_Gen_Item *) parent, flags,
3919 if (!it) return NULL;
3921 wd->item_compare_cb = comp;
3928 l = eina_list_search_sorted_near_list(it->parent->item->items,
3929 _elm_genlist_item_list_compare, it,
3932 rel = eina_list_data_get(l);
3936 if (cmp_result >= 0)
3938 it->parent->item->items = eina_list_prepend_relative_list(it->parent->item->items, it, l);
3939 wd->items = eina_inlist_prepend_relative(wd->items, EINA_INLIST_GET(it), EINA_INLIST_GET(rel));
3940 it->item->before = EINA_FALSE;
3942 else if (cmp_result < 0)
3944 it->parent->item->items = eina_list_append_relative_list(it->parent->item->items, it, l);
3945 wd->items = eina_inlist_append_relative(wd->items, EINA_INLIST_GET(it), EINA_INLIST_GET(rel));
3946 it->item->before = EINA_TRUE;
3953 wd->state = eina_inlist_sorted_state_new();
3954 eina_inlist_sorted_state_init(wd->state, wd->items);
3955 wd->requeued = EINA_FALSE;
3959 wd->group_items = eina_list_append(wd->group_items, it);
3961 wd->items = eina_inlist_sorted_state_insert(wd->items, EINA_INLIST_GET(it),
3962 _elm_genlist_item_compare, wd->state);
3964 if (EINA_INLIST_GET(it)->next)
3966 rel = ELM_GEN_ITEM_FROM_INLIST(EINA_INLIST_GET(it)->next);
3967 it->item->before = EINA_TRUE;
3969 else if (EINA_INLIST_GET(it)->prev)
3971 rel = ELM_GEN_ITEM_FROM_INLIST(EINA_INLIST_GET(it)->prev);
3972 it->item->before = EINA_FALSE;
3978 it->item->rel = rel;
3979 it->item->rel->relcount++;
3982 _item_queue(wd, it, _elm_genlist_item_list_compare);
3984 return (Elm_Object_Item *) it;
3987 EAPI Elm_Object_Item *
3988 elm_genlist_item_sorted_insert(Evas_Object *obj,
3989 const Elm_Genlist_Item_Class *itc,
3991 Elm_Object_Item *parent,
3992 Elm_Genlist_Item_Flags flags,
3993 Eina_Compare_Cb comp,
3995 const void *func_data)
3997 ELM_CHECK_WIDTYPE(obj, widtype) NULL;
3998 Widget_Data *wd = elm_widget_data_get(obj);
3999 wd->item_compare_data_cb = comp;
4000 return elm_genlist_item_direct_sorted_insert(obj, itc, data, parent, flags,
4001 _elm_genlist_item_compare_data,
4006 _elm_genlist_clear(Evas_Object *obj, Eina_Bool standby)
4008 Eina_Inlist *next, *l;
4010 ELM_CHECK_WIDTYPE(obj, widtype);
4011 Widget_Data *wd = elm_widget_data_get(obj);
4014 if (!standby) wd->generation++;
4018 eina_inlist_sorted_state_free(wd->state);
4022 if (wd->walking > 0)
4027 evas_event_freeze(evas_object_evas_get(wd->obj));
4028 for (l = wd->items, next = l ? l->next : NULL;
4030 l = next, next = next ? next->next : NULL)
4032 Elm_Gen_Item *it = ELM_GEN_ITEM_FROM_INLIST(l);
4034 if (it->generation < wd->generation)
4036 Elm_Gen_Item *itn = NULL;
4038 if (next) itn = ELM_GEN_ITEM_FROM_INLIST(next);
4039 if (itn) itn->walking++; /* prevent early death of subitem */
4041 if (itn) itn->walking--;
4045 wd->pan_changed = EINA_TRUE;
4048 ecore_job_del(wd->calc_job);
4049 wd->calc_job = NULL;
4051 if (wd->selected) wd->selected = eina_list_free(wd->selected);
4052 if (wd->clear_cb) wd->clear_cb(wd);
4060 evas_object_size_hint_min_set(wd->pan_smart, wd->minw, wd->minh);
4061 evas_object_smart_callback_call(wd->pan_smart, "changed", NULL);
4063 if (wd->sizing_cb) wd->sizing_cb(wd->obj);
4064 elm_smart_scroller_child_region_show(wd->scr, 0, 0, 0, 0);
4065 evas_event_thaw(evas_object_evas_get(wd->obj));
4066 evas_event_thaw_eval(evas_object_evas_get(wd->obj));
4070 elm_genlist_clear(Evas_Object *obj)
4072 _elm_genlist_clear(obj, EINA_FALSE);
4076 elm_genlist_multi_select_set(Evas_Object *obj,
4079 ELM_CHECK_WIDTYPE(obj, widtype);
4080 Widget_Data *wd = elm_widget_data_get(obj);
4086 elm_genlist_multi_select_get(const Evas_Object *obj)
4088 ELM_CHECK_WIDTYPE(obj, widtype) EINA_FALSE;
4089 Widget_Data *wd = elm_widget_data_get(obj);
4090 if (!wd) return EINA_FALSE;
4094 EAPI Elm_Object_Item *
4095 elm_genlist_selected_item_get(const Evas_Object *obj)
4097 ELM_CHECK_WIDTYPE(obj, widtype) NULL;
4098 Widget_Data *wd = elm_widget_data_get(obj);
4099 if (!wd) return NULL;
4100 if (wd->selected) return wd->selected->data;
4104 EAPI const Eina_List *
4105 elm_genlist_selected_items_get(const Evas_Object *obj)
4107 ELM_CHECK_WIDTYPE(obj, widtype) NULL;
4108 Widget_Data *wd = elm_widget_data_get(obj);
4109 if (!wd) return NULL;
4110 return wd->selected;
4114 elm_genlist_realized_items_get(const Evas_Object *obj)
4116 ELM_CHECK_WIDTYPE(obj, widtype) NULL;
4117 Widget_Data *wd = elm_widget_data_get(obj);
4118 Eina_List *list = NULL;
4120 Eina_Bool done = EINA_FALSE;
4121 if (!wd) return NULL;
4122 EINA_INLIST_FOREACH(wd->blocks, itb)
4130 EINA_LIST_FOREACH(itb->items, l, it)
4132 if (it->realized) list = eina_list_append(list, it);
4143 EAPI Elm_Object_Item *
4144 elm_genlist_at_xy_item_get(const Evas_Object *obj,
4149 ELM_CHECK_WIDTYPE(obj, widtype) NULL;
4150 Widget_Data *wd = elm_widget_data_get(obj);
4151 Evas_Coord ox, oy, ow, oh;
4154 if (!wd) return NULL;
4155 evas_object_geometry_get(wd->pan_smart, &ox, &oy, &ow, &oh);
4157 EINA_INLIST_FOREACH(wd->blocks, itb)
4162 if (!ELM_RECTS_INTERSECT(ox + itb->x - itb->wd->pan_x,
4163 oy + itb->y - itb->wd->pan_y,
4164 itb->w, itb->h, x, y, 1, 1))
4166 EINA_LIST_FOREACH(itb->items, l, it)
4168 Evas_Coord itx, ity;
4170 itx = ox + itb->x + it->x - itb->wd->pan_x;
4171 ity = oy + itb->y + it->y - itb->wd->pan_y;
4172 if (ELM_RECTS_INTERSECT(itx, ity, it->item->w, it->item->h, x, y, 1, 1))
4176 if (y <= (ity + (it->item->h / 4))) *posret = -1;
4177 else if (y >= (ity + it->item->h - (it->item->h / 4)))
4181 return (Elm_Object_Item *) it;
4183 lasty = ity + it->item->h;
4188 if (y > lasty) *posret = 1;
4194 EAPI Elm_Object_Item *
4195 elm_genlist_first_item_get(const Evas_Object *obj)
4197 ELM_CHECK_WIDTYPE(obj, widtype) NULL;
4198 Widget_Data *wd = elm_widget_data_get(obj);
4199 if (!wd) return NULL;
4200 if (!wd->items) return NULL;
4201 Elm_Gen_Item *it = ELM_GEN_ITEM_FROM_INLIST(wd->items);
4202 while ((it) && (it->generation < wd->generation))
4203 it = ELM_GEN_ITEM_FROM_INLIST(EINA_INLIST_GET(it)->next);
4204 return (Elm_Object_Item *) it;
4207 EAPI Elm_Object_Item *
4208 elm_genlist_last_item_get(const Evas_Object *obj)
4210 ELM_CHECK_WIDTYPE(obj, widtype) NULL;
4211 Widget_Data *wd = elm_widget_data_get(obj);
4212 if (!wd) return NULL;
4213 if (!wd->items) return NULL;
4214 Elm_Gen_Item *it = ELM_GEN_ITEM_FROM_INLIST(wd->items->last);
4215 while ((it) && (it->generation < wd->generation))
4216 it = ELM_GEN_ITEM_FROM_INLIST(EINA_INLIST_GET(it)->prev);
4217 return (Elm_Object_Item *) it;
4220 EAPI Elm_Object_Item *
4221 elm_genlist_item_next_get(const Elm_Object_Item *it)
4223 ELM_OBJ_ITEM_CHECK_OR_RETURN(it, NULL);
4224 Elm_Gen_Item *_it = (Elm_Gen_Item *) it;
4227 _it = ELM_GEN_ITEM_FROM_INLIST(EINA_INLIST_GET(_it)->next);
4228 if ((_it) && (_it->generation == _it->wd->generation)) break;
4230 return (Elm_Object_Item *) _it;
4233 EAPI Elm_Object_Item *
4234 elm_genlist_item_prev_get(const Elm_Object_Item *it)
4236 ELM_OBJ_ITEM_CHECK_OR_RETURN(it, NULL);
4237 Elm_Gen_Item *_it = (Elm_Gen_Item *) it;
4240 _it = ELM_GEN_ITEM_FROM_INLIST(EINA_INLIST_GET(_it)->prev);
4241 if ((_it) && (_it->generation == _it->wd->generation)) break;
4243 return (Elm_Object_Item *) _it;
4247 elm_genlist_item_genlist_get(const Elm_Object_Item *it)
4249 return elm_object_item_widget_get(it);
4252 EAPI Elm_Object_Item *
4253 elm_genlist_item_parent_get(const Elm_Object_Item *it)
4255 ELM_OBJ_ITEM_CHECK_OR_RETURN(it, NULL);
4256 return (Elm_Object_Item *) ((Elm_Gen_Item *) it)->parent;
4260 elm_genlist_item_subitems_clear(Elm_Object_Item *it)
4262 ELM_OBJ_ITEM_CHECK_OR_RETURN(it);
4263 Eina_List *tl = NULL, *l;
4265 Elm_Object_Item *it2;
4266 _it = (Elm_Gen_Item *) it;
4268 EINA_LIST_FOREACH(_it->item->items, l, it2)
4269 tl = eina_list_append(tl, it2);
4270 EINA_LIST_FREE(tl, it2)
4271 elm_genlist_item_del(it2);
4275 elm_genlist_item_selected_set(Elm_Object_Item *it,
4278 ELM_OBJ_ITEM_CHECK_OR_RETURN(it);
4279 Elm_Gen_Item *_it = (Elm_Gen_Item *) it;
4280 Widget_Data *wd = _it->wd;
4282 if ((_it->generation < wd->generation) || (_it->disabled)) return;
4283 selected = !!selected;
4284 if (_it->selected == selected) return;
4290 while (wd->selected)
4292 if (_it->unhighlight_cb) _it->unhighlight_cb(wd->selected->data);
4293 _it->unsel_cb(wd->selected->data);
4296 _it->highlight_cb(_it);
4300 if (_it->unhighlight_cb) _it->unhighlight_cb(_it);
4305 elm_genlist_item_selected_get(const Elm_Object_Item *it)
4307 ELM_OBJ_ITEM_CHECK_OR_RETURN(it, EINA_FALSE);
4308 return ((Elm_Gen_Item *) it)->selected;
4312 elm_genlist_item_expanded_set(Elm_Object_Item *it,
4315 ELM_OBJ_ITEM_CHECK_OR_RETURN(it);
4316 Elm_Gen_Item *_it = (Elm_Gen_Item *) it;
4317 if (_it->item->expanded == expanded) return;
4318 _it->item->expanded = expanded;
4319 _it->wd->expanded_item = _it;
4320 if (_it->item->expanded)
4323 edje_object_signal_emit(VIEW(_it), "elm,state,expanded", "elm");
4324 evas_object_smart_callback_call(WIDGET(_it), SIG_EXPANDED, _it);
4325 _it->wd->auto_scroll_enabled = EINA_TRUE;
4330 edje_object_signal_emit(VIEW(_it), "elm,state,contracted", "elm");
4331 evas_object_smart_callback_call(WIDGET(_it), SIG_CONTRACTED, _it);
4332 _it->wd->auto_scroll_enabled = EINA_FALSE;
4337 elm_genlist_item_expanded_get(const Elm_Object_Item *it)
4339 ELM_OBJ_ITEM_CHECK_OR_RETURN(it, EINA_FALSE);
4340 return ((Elm_Gen_Item *) it)->item->expanded;
4344 elm_genlist_item_expanded_depth_get(const Elm_Object_Item *it)
4346 ELM_OBJ_ITEM_CHECK_OR_RETURN(it, 0);
4347 return ((Elm_Gen_Item *) it)->item->expanded_depth;
4351 elm_genlist_item_disabled_set(Elm_Object_Item *it,
4354 ELM_OBJ_ITEM_CHECK_OR_RETURN(it);
4357 Elm_Gen_Item *_it = (Elm_Gen_Item *) it;
4358 if (_it->disabled == disabled) return;
4359 if (_it->generation < _it->wd->generation) return;
4360 _it->disabled = !!disabled;
4362 elm_genlist_item_selected_set(it, EINA_FALSE);
4366 edje_object_signal_emit(VIEW(_it), "elm,state,disabled", "elm");
4368 edje_object_signal_emit(VIEW(_it), "elm,state,enabled", "elm");
4369 EINA_LIST_FOREACH(_it->content_objs, l, obj)
4370 elm_widget_disabled_set(obj, disabled);
4375 elm_genlist_item_disabled_get(const Elm_Object_Item *it)
4377 ELM_OBJ_ITEM_CHECK_OR_RETURN(it, EINA_FALSE);
4378 Elm_Gen_Item *_it = (Elm_Gen_Item *) it;
4379 if (_it->generation < _it->wd->generation) return EINA_FALSE;
4380 return _it->disabled;
4384 elm_genlist_item_display_only_set(Elm_Object_Item *it,
4385 Eina_Bool display_only)
4387 ELM_OBJ_ITEM_CHECK_OR_RETURN(it);
4388 Elm_Gen_Item *_it = (Elm_Gen_Item *) it;
4389 display_only = !!display_only;
4390 if (_it->display_only == display_only) return;
4391 if (_it->generation < _it->wd->generation) return;
4392 _it->display_only = display_only;
4393 _it->item->mincalcd = EINA_FALSE;
4394 _it->item->updateme = EINA_TRUE;
4395 if (_it->item->block) _it->item->block->updateme = EINA_TRUE;
4396 if (_it->wd->update_job) ecore_job_del(_it->wd->update_job);
4397 _it->wd->update_job = ecore_job_add(_update_job, _it->wd);
4401 elm_genlist_item_display_only_get(const Elm_Object_Item *it)
4403 ELM_OBJ_ITEM_CHECK_OR_RETURN(it, EINA_FALSE);
4404 Elm_Gen_Item *_it = (Elm_Gen_Item *) it;
4405 if (_it->generation < _it->wd->generation) return EINA_FALSE;
4406 return _it->display_only;
4410 elm_genlist_item_show(Elm_Object_Item *it)
4412 ELM_OBJ_ITEM_CHECK_OR_RETURN(it);
4413 Elm_Gen_Item *_it = (Elm_Gen_Item *) it;
4414 Evas_Coord gith = 0;
4415 if (_it->generation < _it->wd->generation) return;
4416 if ((_it->item->queued) || (!_it->item->mincalcd))
4418 _it->wd->show_item = _it;
4419 _it->wd->bring_in = EINA_FALSE;
4420 _it->wd->scrollto_type = ELM_GENLIST_ITEM_SCROLLTO_IN;
4421 _it->item->showme = EINA_TRUE;
4424 if (_it->wd->show_item)
4426 _it->wd->show_item->item->showme = EINA_FALSE;
4427 _it->wd->show_item = NULL;
4429 if ((_it->item->group_item) &&
4430 (_it->wd->pan_y > (_it->y + _it->item->block->y)))
4431 gith = _it->item->group_item->item->h;
4432 elm_smart_scroller_child_region_show(_it->wd->scr,
4433 _it->x + _it->item->block->x,
4434 _it->y + _it->item->block->y - gith,
4435 _it->item->block->w, _it->item->h);
4439 elm_genlist_item_promote(Elm_Object_Item *it)
4441 ELM_OBJ_ITEM_CHECK_OR_RETURN(it);
4442 Elm_Gen_Item *_it = (Elm_Gen_Item *) it;
4443 if (_it->generation < _it->wd->generation) return;
4444 _item_move_before(_it,
4445 (Elm_Gen_Item *) elm_genlist_first_item_get(WIDGET(_it)));
4449 elm_genlist_item_demote(Elm_Object_Item *it)
4451 ELM_OBJ_ITEM_CHECK_OR_RETURN(it);
4452 Elm_Gen_Item *_it = (Elm_Gen_Item *) it;
4453 if (_it->generation < _it->wd->generation) return;
4454 _item_move_after(_it,
4455 (Elm_Gen_Item *) elm_genlist_last_item_get(WIDGET(_it)));
4459 elm_genlist_item_bring_in(Elm_Object_Item *it)
4461 ELM_OBJ_ITEM_CHECK_OR_RETURN(it);
4462 Elm_Gen_Item *_it = (Elm_Gen_Item *) it;
4463 Evas_Coord gith = 0;
4464 if (_it->generation < _it->wd->generation) return;
4465 if ((_it->item->queued) || (!_it->item->mincalcd))
4467 _it->wd->show_item = _it;
4468 _it->wd->bring_in = EINA_TRUE;
4469 _it->wd->scrollto_type = ELM_GENLIST_ITEM_SCROLLTO_IN;
4470 _it->item->showme = EINA_TRUE;
4473 if (_it->wd->show_item)
4475 _it->wd->show_item->item->showme = EINA_FALSE;
4476 _it->wd->show_item = NULL;
4478 if ((_it->item->group_item) &&
4479 (_it->wd->pan_y > (_it->y + _it->item->block->y)))
4480 gith = _it->item->group_item->item->h;
4481 elm_smart_scroller_region_bring_in(_it->wd->scr,
4482 _it->x + _it->item->block->x,
4483 _it->y + _it->item->block->y - gith,
4484 _it->item->block->w, _it->item->h);
4488 elm_genlist_item_top_show(Elm_Object_Item *it)
4490 ELM_OBJ_ITEM_CHECK_OR_RETURN(it);
4491 Elm_Gen_Item *_it = (Elm_Gen_Item *) it;
4493 Evas_Coord gith = 0;
4495 if (_it->generation < _it->wd->generation) return;
4496 if ((_it->item->queued) || (!_it->item->mincalcd))
4498 _it->wd->show_item = _it;
4499 _it->wd->bring_in = EINA_FALSE;
4500 _it->wd->scrollto_type = ELM_GENLIST_ITEM_SCROLLTO_TOP;
4501 _it->item->showme = EINA_TRUE;
4504 if (_it->wd->show_item)
4506 _it->wd->show_item->item->showme = EINA_FALSE;
4507 _it->wd->show_item = NULL;
4509 evas_object_geometry_get(_it->wd->pan_smart, NULL, NULL, &ow, &oh);
4510 if (_it->item->group_item) gith = _it->item->group_item->item->h;
4511 elm_smart_scroller_child_region_show(_it->wd->scr,
4512 _it->x + _it->item->block->x,
4513 _it->y + _it->item->block->y - gith,
4514 _it->item->block->w, oh);
4518 elm_genlist_item_top_bring_in(Elm_Object_Item *it)
4520 ELM_OBJ_ITEM_CHECK_OR_RETURN(it);
4521 Elm_Gen_Item *_it = (Elm_Gen_Item *) it;
4523 Evas_Coord gith = 0;
4525 if (_it->generation < _it->wd->generation) return;
4526 if ((_it->item->queued) || (!_it->item->mincalcd))
4528 _it->wd->show_item = _it;
4529 _it->wd->bring_in = EINA_TRUE;
4530 _it->wd->scrollto_type = ELM_GENLIST_ITEM_SCROLLTO_TOP;
4531 _it->item->showme = EINA_TRUE;
4534 if (_it->wd->show_item)
4536 _it->wd->show_item->item->showme = EINA_FALSE;
4537 _it->wd->show_item = NULL;
4539 evas_object_geometry_get(_it->wd->pan_smart, NULL, NULL, &ow, &oh);
4540 if (_it->item->group_item) gith = _it->item->group_item->item->h;
4541 elm_smart_scroller_region_bring_in(_it->wd->scr,
4542 _it->x + _it->item->block->x,
4543 _it->y + _it->item->block->y - gith,
4544 _it->item->block->w, oh);
4548 elm_genlist_item_middle_show(Elm_Object_Item *it)
4550 ELM_OBJ_ITEM_CHECK_OR_RETURN(it);
4551 Elm_Gen_Item *_it = (Elm_Gen_Item *) it;
4554 if (_it->generation < _it->wd->generation) return;
4555 if ((_it->item->queued) || (!_it->item->mincalcd))
4557 _it->wd->show_item = _it;
4558 _it->wd->bring_in = EINA_FALSE;
4559 _it->wd->scrollto_type = ELM_GENLIST_ITEM_SCROLLTO_MIDDLE;
4560 _it->item->showme = EINA_TRUE;
4563 if (_it->wd->show_item)
4565 _it->wd->show_item->item->showme = EINA_FALSE;
4566 _it->wd->show_item = NULL;
4568 evas_object_geometry_get(_it->wd->pan_smart, NULL, NULL, &ow, &oh);
4569 elm_smart_scroller_child_region_show(_it->wd->scr,
4570 _it->x + _it->item->block->x,
4571 _it->y + _it->item->block->y - oh / 2 +
4572 _it->item->h / 2, _it->item->block->w,
4577 elm_genlist_item_middle_bring_in(Elm_Object_Item *it)
4579 ELM_OBJ_ITEM_CHECK_OR_RETURN(it);
4580 Elm_Gen_Item *_it = (Elm_Gen_Item *) it;
4583 if (_it->generation < _it->wd->generation) return;
4584 if ((_it->item->queued) || (!_it->item->mincalcd))
4586 _it->wd->show_item = _it;
4587 _it->wd->bring_in = EINA_TRUE;
4588 _it->wd->scrollto_type = ELM_GENLIST_ITEM_SCROLLTO_MIDDLE;
4589 _it->item->showme = EINA_TRUE;
4592 if (_it->wd->show_item)
4594 _it->wd->show_item->item->showme = EINA_FALSE;
4595 _it->wd->show_item = NULL;
4597 evas_object_geometry_get(_it->wd->pan_smart, NULL, NULL, &ow, &oh);
4598 elm_smart_scroller_region_bring_in(_it->wd->scr,
4599 _it->x + _it->item->block->x,
4600 _it->y + _it->item->block->y - oh / 2 +
4601 _it->item->h / 2, _it->item->block->w,
4606 elm_genlist_item_del(Elm_Object_Item *it)
4608 ELM_OBJ_ITEM_CHECK_OR_RETURN(it);
4609 Elm_Gen_Item *_it = (Elm_Gen_Item *) it;
4611 if ((_it->relcount > 0) || (_it->walking > 0))
4613 elm_genlist_item_subitems_clear(it);
4614 if (_it->wd->show_item == _it) _it->wd->show_item = NULL;
4615 _elm_genlist_item_del_notserious(_it);
4616 if (_it->item->block)
4618 if (_it->realized) _elm_genlist_item_unrealize(_it, EINA_FALSE);
4619 _it->item->block->changed = EINA_TRUE;
4620 if (_it->wd->calc_job) ecore_job_del(_it->wd->calc_job);
4621 _it->wd->calc_job = ecore_job_add(_calc_job, _it->wd);
4625 _it->parent->item->items =
4626 eina_list_remove(_it->parent->item->items, it);
4635 elm_genlist_item_data_set(Elm_Object_Item *it,
4638 elm_object_item_data_set(it, (void *) data);
4642 elm_genlist_item_data_get(const Elm_Object_Item *it)
4644 return elm_object_item_data_get(it);
4648 elm_genlist_item_icons_orphan(Elm_Object_Item *it)
4650 elm_genlist_item_contents_orphan(it);
4654 elm_genlist_item_contents_orphan(Elm_Object_Item *it)
4656 ELM_OBJ_ITEM_CHECK_OR_RETURN(it);
4658 Evas_Object *content;
4659 EINA_LIST_FREE(((Elm_Gen_Item *) it)->content_objs, content)
4661 elm_widget_sub_object_del(WIDGET(it), content);
4662 evas_object_smart_member_del(content);
4663 evas_object_hide(content);
4667 EAPI const Evas_Object *
4668 elm_genlist_item_object_get(const Elm_Object_Item *it)
4670 ELM_OBJ_ITEM_CHECK_OR_RETURN(it, NULL);
4675 elm_genlist_item_update(Elm_Object_Item *it)
4677 ELM_OBJ_ITEM_CHECK_OR_RETURN(it);
4678 Elm_Gen_Item *_it = (Elm_Gen_Item *) it;
4680 if (!_it->item->block) return;
4681 if (_it->generation < _it->wd->generation) return;
4682 _it->item->mincalcd = EINA_FALSE;
4683 _it->item->updateme = EINA_TRUE;
4684 _it->item->block->updateme = EINA_TRUE;
4685 if (_it->wd->update_job) ecore_job_del(_it->wd->update_job);
4686 _it->wd->update_job = ecore_job_add(_update_job, _it->wd);
4690 elm_genlist_item_fields_update(Elm_Object_Item *it,
4692 Elm_Genlist_Item_Field_Flags itf)
4694 ELM_OBJ_ITEM_CHECK_OR_RETURN(it);
4695 Elm_Gen_Item *_it = (Elm_Gen_Item *) it;
4697 if (!_it->item->block) return;
4698 if (_it->generation < _it->wd->generation) return;
4700 if ((!itf) || (itf & ELM_GENLIST_ITEM_FIELD_LABEL))
4701 _item_text_realize(_it, _it->base.view, &_it->texts, parts);
4702 if ((!itf) || (itf & ELM_GENLIST_ITEM_FIELD_CONTENT))
4704 _it->content_objs = _item_content_unrealize(_it, _it->base.view,
4705 &_it->contents, parts);
4706 _it->content_objs = _item_content_realize(_it, _it->base.view,
4707 &_it->contents, parts);
4709 if ((!itf) || (itf & ELM_GENLIST_ITEM_FIELD_STATE))
4710 _item_state_realize(_it, _it->base.view, &_it->states, parts);
4714 elm_genlist_item_item_class_update(Elm_Object_Item *it,
4715 const Elm_Genlist_Item_Class *itc)
4717 ELM_OBJ_ITEM_CHECK_OR_RETURN(it);
4718 Elm_Gen_Item *_it = (Elm_Gen_Item *) it;
4720 if (!_it->item->block) return;
4721 EINA_SAFETY_ON_NULL_RETURN(itc);
4722 if (_it->generation < _it->wd->generation) return;
4724 _it->item->nocache = EINA_TRUE;
4725 elm_genlist_item_update(it);
4728 EAPI const Elm_Genlist_Item_Class *
4729 elm_genlist_item_item_class_get(const Elm_Object_Item *it)
4731 ELM_OBJ_ITEM_CHECK_OR_RETURN(it, NULL);
4732 Elm_Gen_Item *_it = (Elm_Gen_Item *) it;
4733 if (_it->generation < _it->wd->generation) return NULL;
4737 static Evas_Object *
4738 _elm_genlist_item_label_create(void *data,
4739 Evas_Object *obj __UNUSED__,
4740 Evas_Object *tooltip,
4741 void *it __UNUSED__)
4743 Evas_Object *label = elm_label_add(tooltip);
4746 elm_object_style_set(label, "tooltip");
4747 elm_object_text_set(label, data);
4752 _elm_genlist_item_label_del_cb(void *data,
4753 Evas_Object *obj __UNUSED__,
4754 void *event_info __UNUSED__)
4756 eina_stringshare_del(data);
4760 elm_genlist_item_tooltip_text_set(Elm_Object_Item *it,
4763 ELM_OBJ_ITEM_CHECK_OR_RETURN(it);
4764 text = eina_stringshare_add(text);
4765 elm_genlist_item_tooltip_content_cb_set(it, _elm_genlist_item_label_create,
4767 _elm_genlist_item_label_del_cb);
4771 elm_genlist_item_tooltip_content_cb_set(Elm_Object_Item *it,
4772 Elm_Tooltip_Item_Content_Cb func,
4774 Evas_Smart_Cb del_cb)
4776 ELM_OBJ_ITEM_CHECK_OR_GOTO(it, error);
4777 Elm_Gen_Item *_it = (Elm_Gen_Item *) it;
4779 if ((_it->tooltip.content_cb == func) && (_it->tooltip.data == data))
4782 if (_it->tooltip.del_cb)
4783 _it->tooltip.del_cb((void *) _it->tooltip.data, WIDGET(it), it);
4785 _it->tooltip.content_cb = func;
4786 _it->tooltip.data = data;
4787 _it->tooltip.del_cb = del_cb;
4791 elm_widget_item_tooltip_content_cb_set(_it,
4792 _it->tooltip.content_cb,
4793 _it->tooltip.data, NULL);
4794 elm_widget_item_tooltip_style_set(_it, _it->tooltip.style);
4795 elm_widget_item_tooltip_window_mode_set(_it, _it->tooltip.free_size);
4801 if (del_cb) del_cb((void *)data, NULL, NULL);
4805 elm_genlist_item_tooltip_unset(Elm_Object_Item *it)
4807 ELM_OBJ_ITEM_CHECK_OR_RETURN(it);
4808 Elm_Gen_Item *_it = (Elm_Gen_Item *) it;
4810 if ((VIEW(_it)) && (_it->tooltip.content_cb))
4811 elm_widget_item_tooltip_unset(_it);
4813 if (_it->tooltip.del_cb)
4814 _it->tooltip.del_cb((void *) _it->tooltip.data, WIDGET(_it), _it);
4815 _it->tooltip.del_cb = NULL;
4816 _it->tooltip.content_cb = NULL;
4817 _it->tooltip.data = NULL;
4818 _it->tooltip.free_size = EINA_FALSE;
4819 if (_it->tooltip.style)
4820 elm_genlist_item_tooltip_style_set(it, NULL);
4824 elm_genlist_item_tooltip_style_set(Elm_Object_Item *it,
4827 ELM_OBJ_ITEM_CHECK_OR_RETURN(it);
4828 Elm_Gen_Item *_it = (Elm_Gen_Item *) it;
4830 eina_stringshare_replace(&_it->tooltip.style, style);
4831 if (VIEW(_it)) elm_widget_item_tooltip_style_set(_it, style);
4835 elm_genlist_item_tooltip_style_get(const Elm_Object_Item *it)
4837 return elm_object_item_tooltip_style_get(it);
4841 elm_genlist_item_tooltip_window_mode_set(Elm_Object_Item *it,
4844 ELM_OBJ_ITEM_CHECK_OR_RETURN(it, EINA_FALSE);
4845 Elm_Gen_Item *_it = (Elm_Gen_Item *) it;
4847 _it->tooltip.free_size = disable;
4848 if (VIEW(_it)) return elm_widget_item_tooltip_window_mode_set(_it, disable);
4853 elm_genlist_item_tooltip_window_mode_get(const Elm_Object_Item *it)
4855 return elm_object_tooltip_window_mode_get(VIEW(it));
4859 elm_genlist_item_cursor_set(Elm_Object_Item *it,
4862 ELM_OBJ_ITEM_CHECK_OR_RETURN(it);
4863 Elm_Gen_Item *_it = (Elm_Gen_Item *) it;
4864 eina_stringshare_replace(&_it->mouse_cursor, cursor);
4865 if (VIEW(_it)) elm_widget_item_cursor_set(_it, cursor);
4869 elm_genlist_item_cursor_get(const Elm_Object_Item *it)
4871 ELM_OBJ_ITEM_CHECK_OR_RETURN(it, NULL);
4872 return elm_widget_item_cursor_get(it);
4876 elm_genlist_item_cursor_unset(Elm_Object_Item *it)
4878 ELM_OBJ_ITEM_CHECK_OR_RETURN(it);
4879 Elm_Gen_Item *_it = (Elm_Gen_Item *) it;
4881 if (!_it->mouse_cursor) return;
4883 if (VIEW(_it)) elm_widget_item_cursor_unset(_it);
4885 eina_stringshare_del(_it->mouse_cursor);
4886 _it->mouse_cursor = NULL;
4890 elm_genlist_item_cursor_style_set(Elm_Object_Item *it,
4893 ELM_OBJ_ITEM_CHECK_OR_RETURN(it);
4894 elm_widget_item_cursor_style_set(it, style);
4898 elm_genlist_item_cursor_style_get(const Elm_Object_Item *it)
4900 ELM_OBJ_ITEM_CHECK_OR_RETURN(it, NULL);
4901 return elm_widget_item_cursor_style_get(it);
4905 elm_genlist_item_cursor_engine_only_set(Elm_Object_Item *it,
4906 Eina_Bool engine_only)
4908 ELM_OBJ_ITEM_CHECK_OR_RETURN(it);
4909 elm_widget_item_cursor_engine_only_set(it, engine_only);
4913 elm_genlist_item_cursor_engine_only_get(const Elm_Object_Item *it)
4915 ELM_OBJ_ITEM_CHECK_OR_RETURN(it, EINA_FALSE);
4916 return elm_widget_item_cursor_engine_only_get(it);
4920 elm_genlist_item_index_get(Elm_Object_Item *it)
4922 ELM_OBJ_ITEM_CHECK_OR_RETURN(it, -1);
4923 Elm_Gen_Item *_it = (Elm_Gen_Item *) it;
4925 if (_it->item->block)
4926 return _it->position + _it->item->block->position;
4931 elm_genlist_mode_set(Evas_Object *obj,
4934 ELM_CHECK_WIDTYPE(obj, widtype);
4935 Widget_Data *wd = elm_widget_data_get(obj);
4937 if (wd->mode == mode) return;
4943 elm_genlist_horizontal_set(Evas_Object *obj,
4946 elm_genlist_mode_set(obj, mode);
4950 elm_genlist_horizontal_mode_set(Evas_Object *obj,
4953 elm_genlist_mode_set(obj, mode);
4957 elm_genlist_mode_get(const Evas_Object *obj)
4959 ELM_CHECK_WIDTYPE(obj, widtype) ELM_LIST_LAST;
4960 Widget_Data *wd = elm_widget_data_get(obj);
4961 if (!wd) return ELM_LIST_LAST;
4966 elm_genlist_horizontal_get(const Evas_Object *obj)
4968 return elm_genlist_mode_get(obj);
4972 elm_genlist_horizontal_mode_get(const Evas_Object *obj)
4974 return elm_genlist_mode_get(obj);
4978 elm_genlist_always_select_mode_set(Evas_Object *obj,
4979 Eina_Bool always_select)
4981 ELM_CHECK_WIDTYPE(obj, widtype);
4982 Widget_Data *wd = elm_widget_data_get(obj);
4984 wd->always_select = always_select;
4988 elm_genlist_always_select_mode_get(const Evas_Object *obj)
4990 ELM_CHECK_WIDTYPE(obj, widtype) EINA_FALSE;
4991 Widget_Data *wd = elm_widget_data_get(obj);
4992 if (!wd) return EINA_FALSE;
4993 return wd->always_select;
4997 elm_genlist_no_select_mode_set(Evas_Object *obj,
4998 Eina_Bool no_select)
5000 ELM_CHECK_WIDTYPE(obj, widtype);
5001 Widget_Data *wd = elm_widget_data_get(obj);
5003 wd->no_select = no_select;
5007 elm_genlist_no_select_mode_get(const Evas_Object *obj)
5009 ELM_CHECK_WIDTYPE(obj, widtype) EINA_FALSE;
5010 Widget_Data *wd = elm_widget_data_get(obj);
5011 if (!wd) return EINA_FALSE;
5012 return wd->no_select;
5016 elm_genlist_compress_mode_set(Evas_Object *obj,
5019 ELM_CHECK_WIDTYPE(obj, widtype);
5020 Widget_Data *wd = elm_widget_data_get(obj);
5022 wd->compress = compress;
5023 if (!compress) elm_genlist_homogeneous_set(obj, EINA_FALSE);
5027 elm_genlist_compress_mode_get(const Evas_Object *obj)
5029 ELM_CHECK_WIDTYPE(obj, widtype) EINA_FALSE;
5030 Widget_Data *wd = elm_widget_data_get(obj);
5031 if (!wd) return EINA_FALSE;
5032 return wd->compress;
5036 elm_genlist_height_for_width_mode_set(Evas_Object *obj,
5037 Eina_Bool height_for_width)
5039 ELM_CHECK_WIDTYPE(obj, widtype);
5040 Widget_Data *wd = elm_widget_data_get(obj);
5042 wd->height_for_width = !!height_for_width;
5043 if (wd->height_for_width)
5045 elm_genlist_homogeneous_set(obj, EINA_FALSE);
5046 elm_genlist_compress_mode_set(obj, EINA_TRUE);
5051 elm_genlist_height_for_width_mode_get(const Evas_Object *obj)
5053 ELM_CHECK_WIDTYPE(obj, widtype) EINA_FALSE;
5054 Widget_Data *wd = elm_widget_data_get(obj);
5055 if (!wd) return EINA_FALSE;
5056 return wd->height_for_width;
5060 elm_genlist_bounce_set(Evas_Object *obj,
5064 ELM_CHECK_WIDTYPE(obj, widtype);
5065 Widget_Data *wd = elm_widget_data_get(obj);
5067 elm_smart_scroller_bounce_allow_set(wd->scr, h_bounce, v_bounce);
5068 wd->h_bounce = h_bounce;
5069 wd->v_bounce = v_bounce;
5073 elm_genlist_bounce_get(const Evas_Object *obj,
5074 Eina_Bool *h_bounce,
5075 Eina_Bool *v_bounce)
5077 ELM_CHECK_WIDTYPE(obj, widtype);
5078 Widget_Data *wd = elm_widget_data_get(obj);
5080 if (h_bounce) *h_bounce = wd->h_bounce;
5081 if (v_bounce) *v_bounce = wd->v_bounce;
5085 elm_genlist_homogeneous_set(Evas_Object *obj,
5086 Eina_Bool homogeneous)
5088 ELM_CHECK_WIDTYPE(obj, widtype);
5089 Widget_Data *wd = elm_widget_data_get(obj);
5091 if (homogeneous) elm_genlist_compress_mode_set(obj, EINA_TRUE);
5092 wd->homogeneous = homogeneous;
5096 elm_genlist_homogeneous_get(const Evas_Object *obj)
5098 ELM_CHECK_WIDTYPE(obj, widtype) EINA_FALSE;
5099 Widget_Data *wd = elm_widget_data_get(obj);
5100 if (!wd) return EINA_FALSE;
5101 return wd->homogeneous;
5105 elm_genlist_block_count_set(Evas_Object *obj,
5108 ELM_CHECK_WIDTYPE(obj, widtype);
5109 Widget_Data *wd = elm_widget_data_get(obj);
5111 wd->max_items_per_block = n;
5112 wd->item_cache_max = wd->max_items_per_block * 2;
5113 _item_cache_clean(wd);
5117 elm_genlist_block_count_get(const Evas_Object *obj)
5119 ELM_CHECK_WIDTYPE(obj, widtype) 0;
5120 Widget_Data *wd = elm_widget_data_get(obj);
5122 return wd->max_items_per_block;
5126 elm_genlist_longpress_timeout_set(Evas_Object *obj,
5129 ELM_CHECK_WIDTYPE(obj, widtype);
5130 Widget_Data *wd = elm_widget_data_get(obj);
5132 wd->longpress_timeout = timeout;
5136 elm_genlist_longpress_timeout_get(const Evas_Object *obj)
5138 ELM_CHECK_WIDTYPE(obj, widtype) 0;
5139 Widget_Data *wd = elm_widget_data_get(obj);
5141 return wd->longpress_timeout;
5145 elm_genlist_scroller_policy_set(Evas_Object *obj,
5146 Elm_Scroller_Policy policy_h,
5147 Elm_Scroller_Policy policy_v)
5149 ELM_CHECK_WIDTYPE(obj, widtype);
5150 Widget_Data *wd = elm_widget_data_get(obj);
5151 if ((!wd) || (!wd->scr)) return;
5152 if ((policy_h >= ELM_SCROLLER_POLICY_LAST) ||
5153 (policy_v >= ELM_SCROLLER_POLICY_LAST))
5155 elm_smart_scroller_policy_set(wd->scr, policy_h, policy_v);
5159 elm_genlist_scroller_policy_get(const Evas_Object *obj,
5160 Elm_Scroller_Policy *policy_h,
5161 Elm_Scroller_Policy *policy_v)
5163 ELM_CHECK_WIDTYPE(obj, widtype);
5164 Widget_Data *wd = elm_widget_data_get(obj);
5165 Elm_Smart_Scroller_Policy s_policy_h, s_policy_v;
5166 if ((!wd) || (!wd->scr)) return;
5167 elm_smart_scroller_policy_get(wd->scr, &s_policy_h, &s_policy_v);
5168 if (policy_h) *policy_h = (Elm_Scroller_Policy)s_policy_h;
5169 if (policy_v) *policy_v = (Elm_Scroller_Policy)s_policy_v;
5173 elm_genlist_realized_items_update(Evas_Object *obj)
5175 ELM_CHECK_WIDTYPE(obj, widtype);
5177 Eina_List *list, *l;
5178 Elm_Object_Item *it;
5180 list = elm_genlist_realized_items_get(obj);
5181 EINA_LIST_FOREACH(list, l, it)
5182 elm_genlist_item_update(it);
5186 elm_genlist_item_mode_set(Elm_Object_Item *it,
5187 const char *mode_type,
5190 ELM_OBJ_ITEM_CHECK_OR_RETURN(it);
5191 Elm_Gen_Item *_it = (Elm_Gen_Item *) it;
5193 Widget_Data *wd = _it->wd;
5195 Elm_Object_Item *it2;
5198 if (!mode_type) return;
5199 if ((_it->generation < _it->wd->generation) || (_it->disabled)) return;
5201 if ((wd->mode_item == _it) &&
5202 (!strcmp(mode_type, wd->mode_type)) &&
5205 if (!wd->mode_item_style) return;
5206 _it->mode_set = mode_set;
5210 EINA_LIST_FOREACH(wd->selected, l, it2)
5211 if (((Elm_Gen_Item *) it2)->realized)
5212 elm_genlist_item_selected_set(it2, EINA_FALSE);
5216 it2 = elm_genlist_selected_item_get(wd->obj);
5217 if ((it2) && (((Elm_Gen_Item *) it2)->realized))
5218 elm_genlist_item_selected_set(it2, EINA_FALSE);
5221 if (((wd->mode_type) && (strcmp(mode_type, wd->mode_type))) ||
5223 ((_it == wd->mode_item) && (!mode_set)))
5224 _item_mode_unset(wd);
5226 eina_stringshare_replace(&wd->mode_type, mode_type);
5227 if (mode_set) _item_mode_set(_it);
5232 elm_genlist_mode_item_style_get(const Evas_Object *obj)
5234 ELM_CHECK_WIDTYPE(obj, widtype) NULL;
5235 Widget_Data *wd = elm_widget_data_get(obj);
5236 if (!wd) return NULL;
5237 return wd->mode_item_style;
5241 elm_genlist_mode_item_style_set(Evas_Object *obj, const char *style)
5243 ELM_CHECK_WIDTYPE(obj, widtype);
5244 Widget_Data *wd = elm_widget_data_get(obj);
5246 if ((style == wd->mode_item_style) || (style && wd->mode_item_style &&
5247 (!strcmp(style, wd->mode_item_style))))
5249 eina_stringshare_replace(&wd->mode_item_style, style);
5250 elm_genlist_realized_items_update(obj);
5254 elm_genlist_mode_type_get(const Evas_Object *obj)
5256 ELM_CHECK_WIDTYPE(obj, widtype) NULL;
5257 Widget_Data *wd = elm_widget_data_get(obj);
5258 if (!wd) return NULL;
5259 return wd->mode_type;
5262 EAPI const Elm_Object_Item *
5263 elm_genlist_mode_item_get(const Evas_Object *obj)
5265 ELM_CHECK_WIDTYPE(obj, widtype) NULL;
5266 Widget_Data *wd = elm_widget_data_get(obj);
5267 if (!wd) return NULL;
5268 return (Elm_Object_Item *) wd->mode_item;
5272 elm_genlist_reorder_mode_set(Evas_Object *obj,
5273 Eina_Bool reorder_mode)
5275 ELM_CHECK_WIDTYPE(obj, widtype);
5276 Widget_Data *wd = elm_widget_data_get(obj);
5278 wd->reorder_mode = reorder_mode;
5282 elm_genlist_reorder_mode_get(const Evas_Object *obj)
5284 ELM_CHECK_WIDTYPE(obj, widtype) EINA_FALSE;
5285 Widget_Data *wd = elm_widget_data_get(obj);
5286 if (!wd) return EINA_FALSE;
5287 return wd->reorder_mode;
5290 /* for gengrid as of now */
5292 _elm_genlist_page_relative_set(Evas_Object *obj,
5296 Evas_Coord pagesize_h;
5297 Evas_Coord pagesize_v;
5299 ELM_CHECK_WIDTYPE(obj, widtype);
5300 Widget_Data *wd = elm_widget_data_get(obj);
5303 elm_smart_scroller_paging_get(wd->scr, NULL, NULL, &pagesize_h, &pagesize_v);
5304 elm_smart_scroller_paging_set(wd->scr, h_pagerel, v_pagerel, pagesize_h,
5308 /* for gengrid as of now */
5310 _elm_genlist_page_relative_get(const Evas_Object *obj,
5314 ELM_CHECK_WIDTYPE(obj, widtype);
5315 Widget_Data *wd = elm_widget_data_get(obj);
5318 elm_smart_scroller_paging_get(wd->scr, h_pagerel, v_pagerel, NULL, NULL);
5321 /* for gengrid as of now */
5323 _elm_genlist_page_size_set(Evas_Object *obj,
5324 Evas_Coord h_pagesize,
5325 Evas_Coord v_pagesize)
5330 ELM_CHECK_WIDTYPE(obj, widtype);
5331 Widget_Data *wd = elm_widget_data_get(obj);
5333 elm_smart_scroller_paging_get(wd->scr, &pagerel_h, &pagerel_v, NULL, NULL);
5334 elm_smart_scroller_paging_set(wd->scr, pagerel_h, pagerel_v, h_pagesize,
5338 /* for gengrid as of now */
5340 _elm_genlist_current_page_get(const Evas_Object *obj,
5344 ELM_CHECK_WIDTYPE(obj, widtype);
5345 Widget_Data *wd = elm_widget_data_get(obj);
5348 elm_smart_scroller_current_page_get(wd->scr, h_pagenumber, v_pagenumber);
5351 /* for gengrid as of now */
5353 _elm_genlist_last_page_get(const Evas_Object *obj,
5357 ELM_CHECK_WIDTYPE(obj, widtype);
5358 Widget_Data *wd = elm_widget_data_get(obj);
5361 elm_smart_scroller_last_page_get(wd->scr, h_pagenumber, v_pagenumber);
5364 /* for gengrid as of now */
5366 _elm_genlist_page_show(const Evas_Object *obj,
5370 ELM_CHECK_WIDTYPE(obj, widtype);
5371 Widget_Data *wd = elm_widget_data_get(obj);
5374 elm_smart_scroller_page_show(wd->scr, h_pagenumber, v_pagenumber);
5377 /* for gengrid as of now */
5379 _elm_genlist_page_bring_in(const Evas_Object *obj,
5383 ELM_CHECK_WIDTYPE(obj, widtype);
5384 Widget_Data *wd = elm_widget_data_get(obj);
5387 elm_smart_scroller_page_bring_in(wd->scr, h_pagenumber, v_pagenumber);
5391 _elm_genlist_item_widget_get(const Elm_Gen_Item *it)
5393 ELM_WIDGET_ITEM_WIDTYPE_CHECK_OR_RETURN(it, NULL);
5398 _elm_genlist_item_unrealize(Elm_Gen_Item *it,
5401 Evas_Object *content;
5403 if (!it->realized) return;
5404 if (it->wd->reorder_it == it) return;
5405 evas_event_freeze(evas_object_evas_get(WIDGET(it)));
5407 evas_object_smart_callback_call(WIDGET(it), SIG_UNREALIZED, it);
5410 ecore_timer_del(it->long_timer);
5411 it->long_timer = NULL;
5414 elm_widget_stringlist_free(it->texts);
5416 elm_widget_stringlist_free(it->contents);
5417 it->contents = NULL;
5418 elm_widget_stringlist_free(it->states);
5421 EINA_LIST_FREE(it->content_objs, content)
5422 evas_object_del(content);
5424 it->unrealize_cb(it);
5426 it->realized = EINA_FALSE;
5427 it->want_unrealize = EINA_FALSE;
5428 evas_event_thaw(evas_object_evas_get(WIDGET(it)));
5429 evas_event_thaw_eval(evas_object_evas_get(WIDGET(it)));
5433 _elm_genlist_item_del_notserious(Elm_Gen_Item *it)
5435 elm_widget_item_pre_notify_del(it);
5436 it->generation = it->wd->generation - 1; /* This means that the item is deleted */
5437 if (it->selected) it->wd->selected = eina_list_remove(it->wd->selected, it);
5439 if (it->itc->func.del)
5440 it->itc->func.del((void *)it->base.data, WIDGET(it));
5444 _elm_genlist_item_del_serious(Elm_Gen_Item *it)
5446 _elm_genlist_item_del_notserious(it);
5447 it->wd->items = eina_inlist_remove(it->wd->items, EINA_INLIST_GET(it));
5448 if (it->tooltip.del_cb)
5449 it->tooltip.del_cb((void *)it->tooltip.data, WIDGET(it), it);
5450 it->wd->walking -= it->walking;
5451 if (it->long_timer) ecore_timer_del(it->long_timer);
5453 it->wd->group_items = eina_list_remove(it->wd->group_items, it);
5457 eina_inlist_sorted_state_free(it->wd->state);
5458 it->wd->state = NULL;
5460 if (it->wd->calc_job) ecore_job_del(it->wd->calc_job);
5461 it->wd->calc_job = ecore_job_add(it->wd->calc_cb, it->wd);
5465 if (it->wd->last_selected_item == it)
5466 it->wd->last_selected_item = NULL;
5467 elm_widget_item_del(it);