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(wd->last_selected_item);
396 if (!prev) return EINA_TRUE;
398 if (elm_genlist_item_selected_get(prev))
400 elm_genlist_item_selected_set(wd->last_selected_item, EINA_FALSE);
401 wd->last_selected_item = prev;
402 elm_genlist_item_show(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(wd->last_selected_item);
420 if (!next) return EINA_TRUE;
422 if (elm_genlist_item_selected_get(next))
424 elm_genlist_item_selected_set(wd->last_selected_item, EINA_FALSE);
425 wd->last_selected_item = next;
426 elm_genlist_item_show(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(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(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) ||
653 (it->highlighted) || elm_widget_item_disabled_get(it) ||
654 (it->display_only) || (it->item->mode_view))
656 edje_object_signal_emit(VIEW(it), "elm,state,selected", "elm");
657 selectraise = edje_object_data_get(VIEW(it), "selectraise");
658 if ((selectraise) && (!strcmp(selectraise, "on")))
660 evas_object_raise(VIEW(it));
661 if ((it->item->group_item) && (it->item->group_item->realized))
662 evas_object_raise(it->item->VIEW(group_item));
664 it->highlighted = EINA_TRUE;
668 _item_unhighlight(Elm_Gen_Item *it)
670 if ((it->generation < it->wd->generation) || (!it->highlighted)) return;
671 edje_object_signal_emit(VIEW(it), "elm,state,unselected", "elm");
672 if (!it->item->nostacking)
674 if ((it->item->order_num_in & 0x1) ^ it->item->stacking_even) evas_object_lower(VIEW(it));
675 else evas_object_raise(VIEW(it));
677 it->highlighted = EINA_FALSE;
681 _item_block_position_update(Eina_Inlist *list, int idx)
685 EINA_INLIST_FOREACH(list, tmp)
687 tmp->position = idx++;
688 tmp->position_update = EINA_TRUE;
693 _item_position_update(Eina_List *list, int idx)
698 EINA_LIST_FOREACH(list, l, it)
700 it->position = idx++;
701 it->position_update = EINA_TRUE;
706 _item_block_del(Elm_Gen_Item *it)
709 Item_Block *itb = it->item->block;
711 itb->items = eina_list_remove(itb->items, it);
713 itb->changed = EINA_TRUE;
714 if (it->wd->calc_job) ecore_job_del(it->wd->calc_job);
715 it->wd->calc_job = ecore_job_add(_calc_job, it->wd);
718 il = EINA_INLIST_GET(itb);
719 Item_Block *itbn = (Item_Block *)(il->next);
721 it->parent->item->items = eina_list_remove(it->parent->item->items, it);
724 _item_block_position_update(il->next, itb->position);
725 it->wd->blocks = eina_inlist_remove(it->wd->blocks, il);
728 if (itbn) itbn->changed = EINA_TRUE;
732 if (itb->count < itb->wd->max_items_per_block/2)
734 il = EINA_INLIST_GET(itb);
735 Item_Block *itbp = (Item_Block *)(il->prev);
736 Item_Block *itbn = (Item_Block *)(il->next);
737 if ((itbp) && ((itbp->count + itb->count) < itb->wd->max_items_per_block + itb->wd->max_items_per_block/2))
741 EINA_LIST_FREE(itb->items, it2)
743 it2->item->block = itbp;
744 itbp->items = eina_list_append(itbp->items, it2);
746 itbp->changed = EINA_TRUE;
748 _item_block_position_update(EINA_INLIST_GET(itb)->next,
750 it->wd->blocks = eina_inlist_remove(it->wd->blocks,
751 EINA_INLIST_GET(itb));
754 else if ((itbn) && ((itbn->count + itb->count) < itb->wd->max_items_per_block + itb->wd->max_items_per_block/2))
758 Eina_List *last = eina_list_last(itb->items);
759 Elm_Gen_Item *it2 = last->data;
761 it2->item->block = itbn;
762 itb->items = eina_list_remove_list(itb->items, last);
763 itbn->items = eina_list_prepend(itbn->items, it2);
765 itbn->changed = EINA_TRUE;
767 _item_block_position_update(EINA_INLIST_GET(itb)->next,
770 eina_inlist_remove(it->wd->blocks, EINA_INLIST_GET(itb));
778 _item_del(Elm_Gen_Item *it)
780 Evas_Object *obj = WIDGET(it);
782 evas_event_freeze(evas_object_evas_get(obj));
783 elm_genlist_item_subitems_clear((Elm_Object_Item *) it);
784 if (it->wd->show_item == it) it->wd->show_item = NULL;
785 if (it->realized) _elm_genlist_item_unrealize(it, EINA_FALSE);
786 if (it->item->block) _item_block_del(it);
787 if (it->item->queued)
788 it->wd->queue = eina_list_remove(it->wd->queue, it);
789 if (it->wd->anchor_item == it)
791 it->wd->anchor_item = ELM_GEN_ITEM_FROM_INLIST(EINA_INLIST_GET(it)->next);
792 if (!it->wd->anchor_item)
793 it->wd->anchor_item = ELM_GEN_ITEM_FROM_INLIST(EINA_INLIST_GET(it)->prev);
796 it->parent->item->items = eina_list_remove(it->parent->item->items, it);
797 if (it->item->swipe_timer) ecore_timer_del(it->item->swipe_timer);
798 _elm_genlist_item_del_serious(it);
799 elm_genlist_item_class_unref((Elm_Genlist_Item_Class *)it->itc);
800 evas_event_thaw(evas_object_evas_get(obj));
801 evas_event_thaw_eval(evas_object_evas_get(obj));
805 _clear_cb(Widget_Data *wd)
807 wd->anchor_item = NULL;
810 Item_Block *itb = (Item_Block *)(wd->blocks);
812 wd->blocks = eina_inlist_remove(wd->blocks, wd->blocks);
813 if (itb->items) eina_list_free(itb->items);
816 if (wd->queue_idle_enterer)
818 ecore_idle_enterer_del(wd->queue_idle_enterer);
819 wd->queue_idle_enterer = NULL;
821 if (wd->must_recalc_idler)
823 ecore_idler_del(wd->must_recalc_idler);
824 wd->must_recalc_idler = NULL;
826 if (wd->queue) wd->queue = eina_list_free(wd->queue);
827 if (wd->reorder_move_animator)
829 ecore_animator_del(wd->reorder_move_animator);
830 wd->reorder_move_animator = NULL;
832 wd->show_item = NULL;
833 wd->reorder_old_pan_y = 0;
837 _item_unselect(Elm_Gen_Item *it)
839 if ((it->generation < it->wd->generation) || (!it->selected)) return;
840 it->selected = EINA_FALSE;
841 it->wd->selected = eina_list_remove(it->wd->selected, it);
842 evas_object_smart_callback_call(WIDGET(it), SIG_UNSELECTED, it);
846 _mouse_move(void *data,
847 Evas *evas __UNUSED__,
851 Elm_Gen_Item *it = data;
852 Evas_Event_Mouse_Move *ev = event_info;
853 Evas_Coord minw = 0, minh = 0, x, y, dx, dy, adx, ady;
854 Evas_Coord ox, oy, ow, oh, it_scrl_y, y_pos;
856 if (ev->event_flags & EVAS_EVENT_FLAG_ON_HOLD)
858 if (!it->wd->on_hold)
860 it->wd->on_hold = EINA_TRUE;
861 if (!it->wd->wasselected)
863 _item_unhighlight(it);
868 if (it->wd->multitouched)
870 it->wd->cur_x = ev->cur.canvas.x;
871 it->wd->cur_y = ev->cur.canvas.y;
874 if ((it->dragging) && (it->down))
876 if (it->wd->movements == SWIPE_MOVES) it->wd->swipe = EINA_TRUE;
879 it->wd->history[it->wd->movements].x = ev->cur.canvas.x;
880 it->wd->history[it->wd->movements].y = ev->cur.canvas.y;
881 if (abs((it->wd->history[it->wd->movements].x -
882 it->wd->history[0].x)) > 40)
883 it->wd->swipe = EINA_TRUE;
889 ecore_timer_del(it->long_timer);
890 it->long_timer = NULL;
892 evas_object_smart_callback_call(WIDGET(it), SIG_DRAG, it);
895 if ((!it->down) /* || (it->wd->on_hold)*/ || (it->wd->longpressed))
899 ecore_timer_del(it->long_timer);
900 it->long_timer = NULL;
902 if ((it->wd->reorder_mode) && (it->wd->reorder_it))
904 evas_object_geometry_get(it->wd->pan_smart, &ox, &oy, &ow, &oh);
905 it_scrl_y = ev->cur.canvas.y - it->wd->reorder_it->dy;
907 if (!it->wd->reorder_start_y)
908 it->wd->reorder_start_y = it->item->block->y + it->y;
912 else if (it_scrl_y + it->wd->reorder_it->item->h > oy + oh)
913 y_pos = oy + oh - it->wd->reorder_it->item->h;
917 _item_position(it, VIEW(it), it->item->scrl_x, y_pos);
919 if (it->wd->calc_job) ecore_job_del(it->wd->calc_job);
920 it->wd->calc_job = ecore_job_add(_calc_job, it->wd);
924 if (!it->display_only)
925 elm_coords_finger_size_adjust(1, &minw, 1, &minh);
926 evas_object_geometry_get(obj, &x, &y, NULL, NULL);
927 x = ev->cur.canvas.x - x;
928 y = ev->cur.canvas.y - y;
931 if (adx < 0) adx = -dx;
934 if (ady < 0) ady = -dy;
937 if ((adx > minw) || (ady > minh))
939 it->dragging = EINA_TRUE;
942 ecore_timer_del(it->long_timer);
943 it->long_timer = NULL;
945 if (!it->wd->wasselected)
947 _item_unhighlight(it);
953 evas_object_smart_callback_call(WIDGET(it),
954 SIG_DRAG_START_UP, it);
958 evas_object_smart_callback_call(WIDGET(it),
959 SIG_DRAG_START_LEFT, it);
961 evas_object_smart_callback_call(WIDGET(it),
962 SIG_DRAG_START_RIGHT, it);
968 evas_object_smart_callback_call(WIDGET(it),
969 SIG_DRAG_START_DOWN, it);
973 evas_object_smart_callback_call(WIDGET(it),
974 SIG_DRAG_START_LEFT, it);
976 evas_object_smart_callback_call(WIDGET(it),
977 SIG_DRAG_START_RIGHT, it);
984 _long_press(void *data)
986 Elm_Gen_Item *it = data, *it_tmp;
989 it->long_timer = NULL;
990 if (elm_widget_item_disabled_get(it) || (it->dragging) || (it->display_only))
991 return ECORE_CALLBACK_CANCEL;
992 it->wd->longpressed = EINA_TRUE;
993 evas_object_smart_callback_call(WIDGET(it), SIG_LONGPRESSED, it);
994 if ((it->wd->reorder_mode) && (!it->group))
996 it->wd->reorder_it = it;
997 it->wd->reorder_start_y = 0;
999 evas_object_raise(VIEW(it));
1000 elm_smart_scroller_hold_set(it->wd->scr, EINA_TRUE);
1001 elm_smart_scroller_bounce_allow_set(it->wd->scr, EINA_FALSE, EINA_FALSE);
1003 list = elm_genlist_realized_items_get(it->wd->obj);
1004 EINA_LIST_FOREACH(list, l, it_tmp)
1006 if (it != it_tmp) _item_unselect(it_tmp);
1008 if (elm_genlist_item_expanded_get((Elm_Object_Item *) it))
1010 elm_genlist_item_expanded_set((Elm_Object_Item *) it, EINA_FALSE);
1011 return ECORE_CALLBACK_RENEW;
1013 edje_object_signal_emit(VIEW(it), "elm,state,reorder,enabled", "elm");
1015 return ECORE_CALLBACK_CANCEL;
1019 _swipe(Elm_Gen_Item *it)
1024 if ((it->display_only) || elm_widget_item_disabled_get(it)) return;
1025 it->wd->swipe = EINA_FALSE;
1026 for (i = 0; i < it->wd->movements; i++)
1028 sum += it->wd->history[i].x;
1029 if (abs(it->wd->history[0].y - it->wd->history[i].y) > 10) return;
1032 sum /= it->wd->movements;
1033 if (abs(sum - it->wd->history[0].x) <= 10) return;
1034 evas_object_smart_callback_call(WIDGET(it), SIG_SWIPE, it);
1038 _swipe_cancel(void *data)
1040 Elm_Gen_Item *it = data;
1042 if (!it) return ECORE_CALLBACK_CANCEL;
1043 it->wd->swipe = EINA_FALSE;
1044 it->wd->movements = 0;
1045 return ECORE_CALLBACK_RENEW;
1049 _multi_cancel(void *data)
1051 Widget_Data *wd = data;
1053 if (!wd) return ECORE_CALLBACK_CANCEL;
1054 wd->multi_timeout = EINA_TRUE;
1055 return ECORE_CALLBACK_RENEW;
1059 _multi_touch_gesture_eval(void *data)
1061 Elm_Gen_Item *it = data;
1063 it->wd->multitouched = EINA_FALSE;
1064 if (it->wd->multi_timer)
1066 ecore_timer_del(it->wd->multi_timer);
1067 it->wd->multi_timer = NULL;
1069 if (it->wd->multi_timeout)
1071 it->wd->multi_timeout = EINA_FALSE;
1075 Evas_Coord minw = 0, minh = 0;
1076 Evas_Coord off_x, off_y, off_mx, off_my;
1078 elm_coords_finger_size_adjust(1, &minw, 1, &minh);
1079 off_x = abs(it->wd->cur_x - it->wd->prev_x);
1080 off_y = abs(it->wd->cur_y - it->wd->prev_y);
1081 off_mx = abs(it->wd->cur_mx - it->wd->prev_mx);
1082 off_my = abs(it->wd->cur_my - it->wd->prev_my);
1084 if (((off_x > minw) || (off_y > minh)) && ((off_mx > minw) || (off_my > minh)))
1086 if ((off_x + off_mx) > (off_y + off_my))
1088 if ((it->wd->cur_x > it->wd->prev_x) && (it->wd->cur_mx > it->wd->prev_mx))
1089 evas_object_smart_callback_call(WIDGET(it),
1090 SIG_MULTI_SWIPE_RIGHT, it);
1091 else if ((it->wd->cur_x < it->wd->prev_x) && (it->wd->cur_mx < it->wd->prev_mx))
1092 evas_object_smart_callback_call(WIDGET(it),
1093 SIG_MULTI_SWIPE_LEFT, it);
1094 else if (abs(it->wd->cur_x - it->wd->cur_mx) > abs(it->wd->prev_x - it->wd->prev_mx))
1095 evas_object_smart_callback_call(WIDGET(it),
1096 SIG_MULTI_PINCH_OUT, it);
1098 evas_object_smart_callback_call(WIDGET(it),
1099 SIG_MULTI_PINCH_IN, it);
1103 if ((it->wd->cur_y > it->wd->prev_y) && (it->wd->cur_my > it->wd->prev_my))
1104 evas_object_smart_callback_call(WIDGET(it),
1105 SIG_MULTI_SWIPE_DOWN, it);
1106 else if ((it->wd->cur_y < it->wd->prev_y) && (it->wd->cur_my < it->wd->prev_my))
1107 evas_object_smart_callback_call(WIDGET(it),
1108 SIG_MULTI_SWIPE_UP, it);
1109 else if (abs(it->wd->cur_y - it->wd->cur_my) > abs(it->wd->prev_y - it->wd->prev_my))
1110 evas_object_smart_callback_call(WIDGET(it),
1111 SIG_MULTI_PINCH_OUT, it);
1113 evas_object_smart_callback_call(WIDGET(it),
1114 SIG_MULTI_PINCH_IN, it);
1117 it->wd->multi_timeout = EINA_FALSE;
1121 _multi_down(void *data,
1122 Evas *evas __UNUSED__,
1123 Evas_Object *obj __UNUSED__,
1126 Elm_Gen_Item *it = data;
1127 Evas_Event_Multi_Down *ev = event_info;
1129 if ((it->wd->multi_device != 0) || (it->wd->multitouched) || (it->wd->multi_timeout)) return;
1130 it->wd->multi_device = ev->device;
1131 it->wd->multi_down = EINA_TRUE;
1132 it->wd->multitouched = EINA_TRUE;
1133 it->wd->prev_mx = ev->canvas.x;
1134 it->wd->prev_my = ev->canvas.y;
1135 if (!it->wd->wasselected)
1137 _item_unhighlight(it);
1140 it->wd->wasselected = EINA_FALSE;
1141 it->wd->longpressed = EINA_FALSE;
1144 ecore_timer_del(it->long_timer);
1145 it->long_timer = NULL;
1149 it->dragging = EINA_FALSE;
1150 evas_object_smart_callback_call(WIDGET(it), SIG_DRAG_STOP, it);
1152 if (it->item->swipe_timer)
1154 ecore_timer_del(it->item->swipe_timer);
1155 it->item->swipe_timer = NULL;
1157 if (it->wd->on_hold)
1159 it->wd->swipe = EINA_FALSE;
1160 it->wd->movements = 0;
1161 it->wd->on_hold = EINA_FALSE;
1166 _multi_up(void *data,
1167 Evas *evas __UNUSED__,
1168 Evas_Object *obj __UNUSED__,
1171 Elm_Gen_Item *it = data;
1172 Evas_Event_Multi_Up *ev = event_info;
1174 if (it->wd->multi_device != ev->device) return;
1175 it->wd->multi_device = 0;
1176 it->wd->multi_down = EINA_FALSE;
1177 if (it->wd->mouse_down) return;
1178 _multi_touch_gesture_eval(data);
1182 _multi_move(void *data,
1183 Evas *evas __UNUSED__,
1184 Evas_Object *obj __UNUSED__,
1187 Elm_Gen_Item *it = data;
1188 Evas_Event_Multi_Move *ev = event_info;
1190 if (it->wd->multi_device != ev->device) return;
1191 it->wd->cur_mx = ev->cur.canvas.x;
1192 it->wd->cur_my = ev->cur.canvas.y;
1196 _mouse_down(void *data,
1197 Evas *evas __UNUSED__,
1201 Elm_Gen_Item *it = data;
1202 Evas_Event_Mouse_Down *ev = event_info;
1205 if (ev->button != 1) return;
1206 if (ev->event_flags & EVAS_EVENT_FLAG_ON_HOLD)
1208 it->wd->on_hold = EINA_TRUE;
1211 it->down = EINA_TRUE;
1212 it->dragging = EINA_FALSE;
1213 evas_object_geometry_get(obj, &x, &y, NULL, NULL);
1214 it->dx = ev->canvas.x - x;
1215 it->dy = ev->canvas.y - y;
1216 it->wd->mouse_down = EINA_TRUE;
1217 if (!it->wd->multitouched)
1219 it->wd->prev_x = ev->canvas.x;
1220 it->wd->prev_y = ev->canvas.y;
1221 it->wd->multi_timeout = EINA_FALSE;
1222 if (it->wd->multi_timer) ecore_timer_del(it->wd->multi_timer);
1223 it->wd->multi_timer = ecore_timer_add(1, _multi_cancel, it->wd);
1225 it->wd->longpressed = EINA_FALSE;
1226 if (ev->event_flags & EVAS_EVENT_FLAG_ON_HOLD) it->wd->on_hold = EINA_TRUE;
1227 else it->wd->on_hold = EINA_FALSE;
1228 if (it->wd->on_hold) return;
1229 it->wd->wasselected = it->selected;
1230 _item_highlight(it);
1231 if (ev->flags & EVAS_BUTTON_DOUBLE_CLICK)
1232 if ((!elm_widget_item_disabled_get(it)) && (!it->display_only))
1234 evas_object_smart_callback_call(WIDGET(it), SIG_CLICKED_DOUBLE, it);
1235 evas_object_smart_callback_call(WIDGET(it), SIG_ACTIVATED, it);
1237 if (it->long_timer) ecore_timer_del(it->long_timer);
1238 if (it->item->swipe_timer) ecore_timer_del(it->item->swipe_timer);
1239 it->item->swipe_timer = ecore_timer_add(0.4, _swipe_cancel, it);
1241 it->long_timer = ecore_timer_add(it->wd->longpress_timeout, _long_press,
1244 it->long_timer = NULL;
1245 it->wd->swipe = EINA_FALSE;
1246 it->wd->movements = 0;
1250 _mouse_up(void *data,
1251 Evas *evas __UNUSED__,
1252 Evas_Object *obj __UNUSED__,
1255 Elm_Gen_Item *it = data;
1256 Evas_Event_Mouse_Up *ev = event_info;
1257 Eina_Bool dragged = EINA_FALSE;
1259 if (ev->button != 1) return;
1260 it->down = EINA_FALSE;
1261 it->wd->mouse_down = EINA_FALSE;
1262 if (it->wd->multitouched)
1264 if ((!it->wd->multi) && (!it->selected) && (it->highlighted)) _item_unhighlight(it);
1265 if (it->wd->multi_down) return;
1266 _multi_touch_gesture_eval(data);
1269 if (ev->event_flags & EVAS_EVENT_FLAG_ON_HOLD) it->wd->on_hold = EINA_TRUE;
1270 else it->wd->on_hold = EINA_FALSE;
1273 ecore_timer_del(it->long_timer);
1274 it->long_timer = NULL;
1278 it->dragging = EINA_FALSE;
1279 evas_object_smart_callback_call(WIDGET(it), SIG_DRAG_STOP, it);
1282 if (it->item->swipe_timer)
1284 ecore_timer_del(it->item->swipe_timer);
1285 it->item->swipe_timer = NULL;
1287 if (it->wd->multi_timer)
1289 ecore_timer_del(it->wd->multi_timer);
1290 it->wd->multi_timer = NULL;
1291 it->wd->multi_timeout = EINA_FALSE;
1293 if (it->wd->on_hold)
1295 if (it->wd->swipe) _swipe(data);
1296 it->wd->longpressed = EINA_FALSE;
1297 it->wd->on_hold = EINA_FALSE;
1300 if ((it->wd->reorder_mode) && (it->wd->reorder_it))
1302 Evas_Coord it_scrl_y = ev->canvas.y - it->wd->reorder_it->dy;
1304 if (it->wd->reorder_rel && (it->wd->reorder_it->parent == it->wd->reorder_rel->parent))
1306 if (it_scrl_y <= it->wd->reorder_rel->item->scrl_y)
1307 _item_move_before(it->wd->reorder_it, it->wd->reorder_rel);
1309 _item_move_after(it->wd->reorder_it, it->wd->reorder_rel);
1313 if (it->wd->calc_job) ecore_job_del(it->wd->calc_job);
1314 it->wd->calc_job = ecore_job_add(_calc_job, it->wd);
1316 edje_object_signal_emit(VIEW(it), "elm,state,reorder,disabled", "elm");
1317 it->wd->reorder_it = it->wd->reorder_rel = NULL;
1318 elm_smart_scroller_hold_set(it->wd->scr, EINA_FALSE);
1319 elm_smart_scroller_bounce_allow_set(it->wd->scr, it->wd->h_bounce, it->wd->v_bounce);
1321 if (it->wd->longpressed)
1323 it->wd->longpressed = EINA_FALSE;
1324 if (!it->wd->wasselected)
1326 _item_unhighlight(it);
1329 it->wd->wasselected = EINA_FALSE;
1334 if (it->want_unrealize)
1336 _elm_genlist_item_unrealize(it, EINA_FALSE);
1337 if (it->item->block->want_unrealize)
1338 _item_block_unrealize(it->item->block);
1341 if (elm_widget_item_disabled_get(it) || (dragged) || (it->display_only))
1343 if (ev->event_flags & EVAS_EVENT_FLAG_ON_HOLD) return;
1348 _item_highlight(it);
1353 _item_unhighlight(it);
1361 Widget_Data *wd = it->wd;
1364 while (wd->selected)
1366 _item_unhighlight(wd->selected->data);
1367 _item_unselect(wd->selected->data);
1373 const Eina_List *l, *l_next;
1376 EINA_LIST_FOREACH_SAFE(it->wd->selected, l, l_next, it2)
1379 _item_unhighlight(it2);
1380 _item_unselect(it2);
1382 //_item_highlight(it);
1385 _item_highlight(it);
1391 _signal_expand_toggle(void *data,
1392 Evas_Object *obj __UNUSED__,
1393 const char *emission __UNUSED__,
1394 const char *source __UNUSED__)
1396 Elm_Gen_Item *it = data;
1398 if (it->item->expanded)
1399 evas_object_smart_callback_call(WIDGET(it), SIG_CONTRACT_REQUEST, it);
1401 evas_object_smart_callback_call(WIDGET(it), SIG_EXPAND_REQUEST, it);
1405 _signal_expand(void *data,
1406 Evas_Object *obj __UNUSED__,
1407 const char *emission __UNUSED__,
1408 const char *source __UNUSED__)
1410 Elm_Gen_Item *it = data;
1412 if (!it->item->expanded)
1413 evas_object_smart_callback_call(WIDGET(it), SIG_EXPAND_REQUEST, it);
1417 _signal_contract(void *data,
1418 Evas_Object *obj __UNUSED__,
1419 const char *emission __UNUSED__,
1420 const char *source __UNUSED__)
1422 Elm_Gen_Item *it = data;
1424 if (it->item->expanded)
1425 evas_object_smart_callback_call(WIDGET(it), SIG_CONTRACT_REQUEST, it);
1429 _scr_hold_timer_cb(void *data)
1431 if (!data) return ECORE_CALLBACK_CANCEL;
1432 Widget_Data *wd = data;
1433 elm_smart_scroller_hold_set(wd->scr, EINA_FALSE);
1434 wd->scr_hold_timer = NULL;
1435 return ECORE_CALLBACK_CANCEL;
1439 _mode_finished_signal_cb(void *data,
1441 const char *emission __UNUSED__,
1442 const char *source __UNUSED__)
1446 Elm_Gen_Item *it = data;
1447 if ((it->generation < it->wd->generation) || (!it->realized) || (!it->item->mode_view)) return;
1449 Evas *te = evas_object_evas_get(obj);
1451 evas_event_freeze(te);
1452 it->item->nocache = EINA_FALSE;
1453 _mode_item_unrealize(it);
1454 if (it->item->group_item)
1455 evas_object_raise(it->item->VIEW(group_item));
1456 snprintf(buf, sizeof(buf), "elm,state,%s,passive,finished", it->wd->mode_type);
1457 edje_object_signal_callback_del_full(obj, buf, "elm", _mode_finished_signal_cb, it);
1458 evas_event_thaw(te);
1459 evas_event_thaw_eval(te);
1463 _item_cache_clean(Widget_Data *wd)
1465 evas_event_freeze(evas_object_evas_get(wd->obj));
1466 while ((wd->item_cache) && (wd->item_cache_count > wd->item_cache_max))
1470 itc = EINA_INLIST_CONTAINER_GET(wd->item_cache->last, Item_Cache);
1471 wd->item_cache = eina_inlist_remove(wd->item_cache,
1472 wd->item_cache->last);
1473 wd->item_cache_count--;
1474 if (itc->spacer) evas_object_del(itc->spacer);
1475 if (itc->base_view) evas_object_del(itc->base_view);
1476 if (itc->item_style) eina_stringshare_del(itc->item_style);
1479 evas_event_thaw(evas_object_evas_get(wd->obj));
1480 evas_event_thaw_eval(evas_object_evas_get(wd->obj));
1484 _item_cache_zero(Widget_Data *wd)
1486 int pmax = wd->item_cache_max;
1487 wd->item_cache_max = 0;
1488 _item_cache_clean(wd);
1489 wd->item_cache_max = pmax;
1493 _item_cache_add(Elm_Gen_Item *it)
1497 evas_event_freeze(evas_object_evas_get(it->wd->obj));
1498 if (it->wd->item_cache_max <= 0)
1500 evas_object_del(VIEW(it));
1502 evas_object_del(it->spacer);
1504 evas_event_thaw(evas_object_evas_get(it->wd->obj));
1505 evas_event_thaw_eval(evas_object_evas_get(it->wd->obj));
1509 it->wd->item_cache_count++;
1510 itc = calloc(1, sizeof(Item_Cache));
1511 it->wd->item_cache = eina_inlist_prepend(it->wd->item_cache,
1512 EINA_INLIST_GET(itc));
1513 itc->spacer = it->spacer;
1515 itc->base_view = VIEW(it);
1517 evas_object_hide(itc->base_view);
1518 evas_object_move(itc->base_view, -9999, -9999);
1519 itc->item_style = eina_stringshare_add(it->itc->item_style);
1520 if (it->item->flags & ELM_GENLIST_ITEM_SUBITEMS) itc->tree = 1;
1521 itc->compress = (it->wd->compress);
1522 itc->selected = it->selected;
1523 itc->disabled = elm_widget_item_disabled_get(it);
1524 itc->expanded = it->item->expanded;
1527 ecore_timer_del(it->long_timer);
1528 it->long_timer = NULL;
1530 if (it->item->swipe_timer)
1532 ecore_timer_del(it->item->swipe_timer);
1533 it->item->swipe_timer = NULL;
1535 // FIXME: other callbacks?
1536 edje_object_signal_callback_del_full(itc->base_view,
1537 "elm,action,expand,toggle",
1538 "elm", _signal_expand_toggle, it);
1539 edje_object_signal_callback_del_full(itc->base_view, "elm,action,expand",
1541 _signal_expand, it);
1542 edje_object_signal_callback_del_full(itc->base_view, "elm,action,contract",
1543 "elm", _signal_contract, it);
1544 evas_object_event_callback_del_full(itc->base_view, EVAS_CALLBACK_MOUSE_DOWN,
1546 evas_object_event_callback_del_full(itc->base_view, EVAS_CALLBACK_MOUSE_UP,
1548 evas_object_event_callback_del_full(itc->base_view, EVAS_CALLBACK_MOUSE_MOVE,
1550 evas_object_event_callback_del_full(itc->base_view, EVAS_CALLBACK_MULTI_DOWN,
1552 evas_object_event_callback_del_full(itc->base_view, EVAS_CALLBACK_MULTI_UP,
1554 evas_object_event_callback_del_full(itc->base_view, EVAS_CALLBACK_MULTI_MOVE,
1556 _item_cache_clean(it->wd);
1557 evas_event_thaw(evas_object_evas_get(it->wd->obj));
1558 evas_event_thaw_eval(evas_object_evas_get(it->wd->obj));
1562 _item_cache_find(Elm_Gen_Item *it)
1567 if (it->item->flags & ELM_GENLIST_ITEM_SUBITEMS) tree = 1;
1568 EINA_INLIST_FOREACH(it->wd->item_cache, itc)
1570 if ((itc->selected) || (itc->disabled) || (itc->expanded))
1572 if ((itc->tree == tree) &&
1573 (itc->compress == it->wd->compress) &&
1574 (!strcmp(it->itc->item_style, itc->item_style)))
1576 it->wd->item_cache = eina_inlist_remove(it->wd->item_cache,
1577 EINA_INLIST_GET(itc));
1578 it->wd->item_cache_count--;
1586 _elm_genlist_item_index_update(Elm_Gen_Item *it)
1588 if (it->position_update || it->item->block->position_update)
1590 evas_object_smart_callback_call(WIDGET(it), SIG_INDEX_UPDATE, it);
1591 it->position_update = EINA_FALSE;
1596 _elm_genlist_item_odd_even_update(Elm_Gen_Item *it)
1598 if (!it->item->nostacking)
1600 if ((it->item->order_num_in & 0x1) ^ it->item->stacking_even)
1601 evas_object_lower(VIEW(it));
1603 evas_object_raise(VIEW(it));
1606 if (it->item->order_num_in & 0x1)
1607 edje_object_signal_emit(VIEW(it), "elm,state,odd", "elm");
1609 edje_object_signal_emit(VIEW(it), "elm,state,even", "elm");
1613 _elm_genlist_item_state_update(Elm_Gen_Item *it, Item_Cache *itc)
1617 if (it->selected != itc->selected)
1620 edje_object_signal_emit(VIEW(it),
1621 "elm,state,selected", "elm");
1623 if (elm_widget_item_disabled_get(it) != itc->disabled)
1625 if (elm_widget_item_disabled_get(it))
1626 edje_object_signal_emit(VIEW(it),
1627 "elm,state,disabled", "elm");
1629 if (it->item->expanded != itc->expanded)
1631 if (it->item->expanded)
1632 edje_object_signal_emit(VIEW(it),
1633 "elm,state,expanded", "elm");
1639 edje_object_signal_emit(VIEW(it),
1640 "elm,state,selected", "elm");
1641 if (elm_widget_item_disabled_get(it))
1642 edje_object_signal_emit(VIEW(it),
1643 "elm,state,disabled", "elm");
1644 if (it->item->expanded)
1645 edje_object_signal_emit(VIEW(it),
1646 "elm,state,expanded", "elm");
1651 _item_cache_free(Item_Cache *itc)
1653 if (itc->spacer) evas_object_del(itc->spacer);
1654 if (itc->base_view) evas_object_del(itc->base_view);
1655 if (itc->item_style) eina_stringshare_del(itc->item_style);
1660 _item_text_realize(Elm_Gen_Item *it,
1661 Evas_Object *target,
1665 if (it->itc->func.text_get)
1670 *source = elm_widget_stringlist_get(edje_object_data_get(target, "texts"));
1671 EINA_LIST_FOREACH(*source, l, key)
1673 if (parts && fnmatch(parts, key, FNM_PERIOD))
1676 char *s = it->itc->func.text_get
1677 ((void *)it->base.data, WIDGET(it), key);
1681 edje_object_part_text_set(target, key, s);
1686 edje_object_part_text_set(target, key, "");
1693 _item_content_unrealize(Elm_Gen_Item *it,
1694 Evas_Object *target,
1698 Eina_List *res = it->content_objs;
1700 if (it->itc->func.content_get)
1704 Evas_Object *ic = NULL;
1706 EINA_LIST_FOREACH(*source, l, key)
1708 if (parts && fnmatch(parts, key, FNM_PERIOD))
1711 ic = edje_object_part_swallow_get(target, key);
1714 res = eina_list_remove(res, ic);
1715 edje_object_part_unswallow(target, ic);
1716 evas_object_del(ic);
1725 _item_content_realize(Elm_Gen_Item *it,
1726 Evas_Object *target,
1730 Eina_List *res = NULL;
1732 if (it->itc->func.content_get)
1736 Evas_Object *ic = NULL;
1738 *source = elm_widget_stringlist_get(edje_object_data_get(target, "contents"));
1740 if (parts && (eina_list_count(*source) != eina_list_count(it->content_objs)))
1741 res = it->content_objs;
1743 EINA_LIST_FOREACH(*source, l, key)
1745 if (parts && fnmatch(parts, key, FNM_PERIOD))
1748 if (it->itc->func.content_get)
1749 ic = it->itc->func.content_get
1750 ((void *)it->base.data, WIDGET(it), key);
1753 res = eina_list_append(res, ic);
1754 edje_object_part_swallow(target, key, ic);
1755 evas_object_show(ic);
1756 elm_widget_sub_object_add(WIDGET(it), ic);
1757 if (elm_widget_item_disabled_get(it))
1758 elm_widget_disabled_set(ic, EINA_TRUE);
1767 _item_state_realize(Elm_Gen_Item *it,
1768 Evas_Object *target,
1772 if (it->itc->func.state_get)
1778 *source = elm_widget_stringlist_get(edje_object_data_get(target, "states"));
1779 EINA_LIST_FOREACH(*source, l, key)
1781 if (parts && fnmatch(parts, key, FNM_PERIOD))
1784 Eina_Bool on = it->itc->func.state_get
1785 ((void *)it->base.data, WIDGET(it), key);
1789 snprintf(buf, sizeof(buf), "elm,state,%s,active", key);
1790 edje_object_signal_emit(target, buf, "elm");
1794 snprintf(buf, sizeof(buf), "elm,state,%s,passive", key);
1795 edje_object_signal_emit(target, buf, "elm");
1802 _item_realize(Elm_Gen_Item *it,
1806 const char *treesize;
1809 Item_Cache *itc = NULL;
1811 if (it->generation < it->wd->generation) return;
1812 //evas_event_freeze(evas_object_evas_get(it->wd->obj));
1815 if (it->item->order_num_in != in)
1817 it->item->order_num_in = in;
1818 _elm_genlist_item_odd_even_update(it);
1819 _elm_genlist_item_state_update(it, NULL);
1820 _elm_genlist_item_index_update(it);
1822 //evas_event_thaw(evas_object_evas_get(it->wd->obj));
1823 //evas_event_thaw_eval(evas_object_evas_get(it->wd->obj));
1826 it->item->order_num_in = in;
1828 if (it->item->nocache)
1829 it->item->nocache = EINA_FALSE;
1831 itc = _item_cache_find(it);
1834 VIEW(it) = itc->base_view;
1835 itc->base_view = NULL;
1836 it->spacer = itc->spacer;
1841 const char *stacking_even;
1842 const char *stacking;
1844 VIEW(it) = edje_object_add(evas_object_evas_get(WIDGET(it)));
1845 edje_object_scale_set(VIEW(it),
1846 elm_widget_scale_get(WIDGET(it)) *
1847 _elm_config->scale);
1848 evas_object_smart_member_add(VIEW(it), it->wd->pan_smart);
1849 elm_widget_sub_object_add(WIDGET(it), VIEW(it));
1851 if (it->item->flags & ELM_GENLIST_ITEM_SUBITEMS)
1852 strncpy(buf, "tree", sizeof(buf));
1853 else strncpy(buf, "item", sizeof(buf));
1854 if (it->wd->compress)
1855 strncat(buf, "_compress", sizeof(buf) - strlen(buf));
1857 strncat(buf, "/", sizeof(buf) - strlen(buf));
1858 strncat(buf, it->itc->item_style, sizeof(buf) - strlen(buf));
1860 _elm_theme_object_set(WIDGET(it), VIEW(it), "genlist", buf,
1861 elm_widget_style_get(WIDGET(it)));
1863 stacking_even = edje_object_data_get(VIEW(it), "stacking_even");
1864 if (!stacking_even) stacking_even = "above";
1865 it->item->stacking_even = !!strcmp("above", stacking_even);
1867 stacking = edje_object_data_get(VIEW(it), "stacking");
1868 if (!stacking) stacking = "yes";
1869 it->item->nostacking = !!strcmp("yes", stacking);
1871 edje_object_mirrored_set(VIEW(it),
1872 elm_widget_mirrored_get(WIDGET(it)));
1874 evas_object_rectangle_add(evas_object_evas_get(WIDGET(it)));
1875 evas_object_color_set(it->spacer, 0, 0, 0, 0);
1876 elm_widget_sub_object_add(WIDGET(it), it->spacer);
1879 _elm_genlist_item_odd_even_update(it);
1881 treesize = edje_object_data_get(VIEW(it), "treesize");
1882 if (treesize) tsize = atoi(treesize);
1883 evas_object_size_hint_min_set(it->spacer,
1884 (it->item->expanded_depth * tsize) * _elm_config->scale, 1);
1885 edje_object_part_swallow(VIEW(it), "elm.swallow.pad", it->spacer);
1888 edje_object_signal_callback_add(VIEW(it),
1889 "elm,action,expand,toggle",
1890 "elm", _signal_expand_toggle, it);
1891 edje_object_signal_callback_add(VIEW(it), "elm,action,expand",
1892 "elm", _signal_expand, it);
1893 edje_object_signal_callback_add(VIEW(it), "elm,action,contract",
1894 "elm", _signal_contract, it);
1895 evas_object_event_callback_add(VIEW(it), EVAS_CALLBACK_MOUSE_DOWN,
1897 evas_object_event_callback_add(VIEW(it), EVAS_CALLBACK_MOUSE_UP,
1899 evas_object_event_callback_add(VIEW(it), EVAS_CALLBACK_MOUSE_MOVE,
1901 evas_object_event_callback_add(VIEW(it), EVAS_CALLBACK_MULTI_DOWN,
1903 evas_object_event_callback_add(VIEW(it), EVAS_CALLBACK_MULTI_UP,
1905 evas_object_event_callback_add(VIEW(it), EVAS_CALLBACK_MULTI_MOVE,
1908 _elm_genlist_item_state_update(it, itc);
1909 _elm_genlist_item_index_update(it);
1912 if ((calc) && (it->wd->homogeneous) &&
1913 ((it->wd->item_width) ||
1914 ((it->wd->item_width) && (it->wd->group_item_width))))
1916 /* homogenous genlist shortcut */
1917 if (!it->item->mincalcd)
1921 it->item->w = it->item->minw = it->wd->group_item_width;
1922 it->item->h = it->item->minh = it->wd->group_item_height;
1926 it->item->w = it->item->minw = it->wd->item_width;
1927 it->item->h = it->item->minh = it->wd->item_height;
1929 it->item->mincalcd = EINA_TRUE;
1934 /* FIXME: If you see that assert, please notify us and we
1935 will clean our mess */
1936 assert(eina_list_count(it->content_objs) == 0);
1938 _item_text_realize(it, VIEW(it), &it->texts, NULL);
1939 it->content_objs = _item_content_realize(it, VIEW(it), &it->contents, NULL);
1940 _item_state_realize(it, VIEW(it), &it->states, NULL);
1942 if (!it->item->mincalcd)
1944 Evas_Coord mw = -1, mh = -1;
1946 if (!it->display_only)
1947 elm_coords_finger_size_adjust(1, &mw, 1, &mh);
1948 if (it->wd->height_for_width) mw = it->wd->prev_viewport_w;
1949 edje_object_size_min_restricted_calc(VIEW(it), &mw, &mh, mw,
1951 if (!it->display_only)
1952 elm_coords_finger_size_adjust(1, &mw, 1, &mh);
1953 it->item->w = it->item->minw = mw;
1954 it->item->h = it->item->minh = mh;
1955 it->item->mincalcd = EINA_TRUE;
1957 if ((!it->wd->group_item_width) && (it->group))
1959 it->wd->group_item_width = mw;
1960 it->wd->group_item_height = mh;
1962 else if ((!it->wd->item_width) && (it->item->flags == ELM_GENLIST_ITEM_NONE))
1964 it->wd->item_width = mw;
1965 it->wd->item_height = mh;
1968 if (!calc) evas_object_show(VIEW(it));
1971 if (it->tooltip.content_cb)
1973 elm_widget_item_tooltip_content_cb_set(it,
1974 it->tooltip.content_cb,
1975 it->tooltip.data, NULL);
1976 elm_widget_item_tooltip_style_set(it, it->tooltip.style);
1977 elm_widget_item_tooltip_window_mode_set(it, it->tooltip.free_size);
1980 if (it->mouse_cursor)
1981 elm_widget_item_cursor_set(it, it->mouse_cursor);
1983 it->realized = EINA_TRUE;
1984 it->want_unrealize = EINA_FALSE;
1986 if (itc) _item_cache_free(itc);
1987 //evas_event_thaw(evas_object_evas_get(it->wd->obj));
1988 //evas_event_thaw_eval(evas_object_evas_get(it->wd->obj));
1990 evas_object_smart_callback_call(WIDGET(it), SIG_REALIZED, it);
1991 edje_object_message_signal_process(VIEW(it));
1995 _item_unrealize_cb(Elm_Gen_Item *it)
1997 if (it->item->nocache)
1999 evas_object_del(VIEW(it));
2001 evas_object_del(it->spacer);
2006 edje_object_mirrored_set(VIEW(it),
2007 elm_widget_mirrored_get(WIDGET(it)));
2008 edje_object_scale_set(VIEW(it),
2009 elm_widget_scale_get(WIDGET(it))
2010 * _elm_config->scale);
2011 _item_cache_add(it);
2014 _mode_item_unrealize(it);
2016 it->realized = EINA_FALSE;
2017 it->want_unrealize = EINA_FALSE;
2021 _item_block_recalc(Item_Block *itb,
2027 Evas_Coord minw = 0, minh = 0;
2028 Eina_Bool showme = EINA_FALSE, changed = EINA_FALSE;
2031 //evas_event_freeze(evas_object_evas_get(itb->wd->obj));
2033 EINA_LIST_FOREACH(itb->items, l, it)
2035 if (it->generation < it->wd->generation) continue;
2036 showme |= it->item->showme;
2041 if (!it->item->mincalcd) changed = EINA_TRUE;
2044 _item_realize(it, in, EINA_TRUE);
2045 _elm_genlist_item_unrealize(it, EINA_TRUE);
2050 _item_realize(it, in, EINA_TRUE);
2051 _elm_genlist_item_unrealize(it, EINA_TRUE);
2055 _item_realize(it, in, EINA_FALSE);
2056 minh += it->item->minh;
2057 if (minw < it->item->minw) minw = it->item->minw;
2065 itb->changed = EINA_FALSE;
2066 itb->position_update = EINA_FALSE;
2067 //evas_event_thaw(evas_object_evas_get(itb->wd->obj));
2068 //evas_event_thaw_eval(evas_object_evas_get(itb->wd->obj));
2073 _item_block_realize(Item_Block *itb)
2075 if (itb->realized) return;
2076 itb->realized = EINA_TRUE;
2077 itb->want_unrealize = EINA_FALSE;
2081 _item_block_unrealize(Item_Block *itb)
2085 Eina_Bool dragging = EINA_FALSE;
2087 if (!itb->realized) return;
2088 evas_event_freeze(evas_object_evas_get(itb->wd->obj));
2089 EINA_LIST_FOREACH(itb->items, l, it)
2091 if (itb->must_recalc || !it->group)
2095 dragging = EINA_TRUE;
2096 it->want_unrealize = EINA_TRUE;
2099 _elm_genlist_item_unrealize(it, EINA_FALSE);
2104 itb->realized = EINA_FALSE;
2105 itb->want_unrealize = EINA_TRUE;
2108 itb->want_unrealize = EINA_FALSE;
2109 evas_event_thaw(evas_object_evas_get(itb->wd->obj));
2110 evas_event_thaw_eval(evas_object_evas_get(itb->wd->obj));
2114 _get_space_for_reorder_item(Elm_Gen_Item *it)
2116 Evas_Coord rox, roy, row, roh, oy, oh;
2117 Eina_Bool top = EINA_FALSE;
2118 Elm_Gen_Item *reorder_it = it->wd->reorder_it;
2119 if (!reorder_it) return 0;
2121 evas_object_geometry_get(it->wd->pan_smart, NULL, &oy, NULL, &oh);
2122 evas_object_geometry_get(it->wd->VIEW(reorder_it), &rox, &roy, &row, &roh);
2124 if ((it->wd->reorder_start_y < it->item->block->y) &&
2125 (roy - oy + (roh / 2) >= it->item->block->y - it->wd->pan_y))
2127 it->item->block->reorder_offset = it->wd->reorder_it->item->h * -1;
2128 if (it->item->block->count == 1)
2129 it->wd->reorder_rel = it;
2131 else if ((it->wd->reorder_start_y >= it->item->block->y) &&
2132 (roy - oy + (roh / 2) <= it->item->block->y - it->wd->pan_y))
2134 it->item->block->reorder_offset = it->wd->reorder_it->item->h;
2137 it->item->block->reorder_offset = 0;
2139 it->item->scrl_y += it->item->block->reorder_offset;
2141 top = (ELM_RECTS_INTERSECT(it->item->scrl_x, it->item->scrl_y, it->item->w, it->item->h,
2142 rox, roy + (roh / 2), row, 1));
2145 it->wd->reorder_rel = it;
2146 it->item->scrl_y += it->wd->reorder_it->item->h;
2147 return it->wd->reorder_it->item->h;
2154 _reorder_move_animator_cb(void *data)
2156 Elm_Gen_Item *it = data;
2157 Eina_Bool down = EINA_FALSE;
2159 int y, dy = it->item->h / 10 * _elm_config->scale, diff;
2161 t = ((0.0 > (t = ecore_loop_time_get()-it->wd->start_time)) ? 0.0 : t);
2163 if (t <= REORDER_EFFECT_TIME) y = (1 * sin((t / REORDER_EFFECT_TIME) * (M_PI / 2)) * dy);
2166 diff = abs(it->item->old_scrl_y - it->item->scrl_y);
2167 if (diff > it->item->h) y = diff / 2;
2169 if (it->item->old_scrl_y < it->item->scrl_y)
2171 it->item->old_scrl_y += y;
2174 else if (it->item->old_scrl_y > it->item->scrl_y)
2176 it->item->old_scrl_y -= y;
2179 _item_position(it, VIEW(it), it->item->scrl_x, it->item->old_scrl_y);
2180 _group_items_recalc(it->wd);
2182 if ((it->wd->reorder_pan_move) ||
2183 (down && it->item->old_scrl_y >= it->item->scrl_y) ||
2184 (!down && it->item->old_scrl_y <= it->item->scrl_y))
2186 it->item->old_scrl_y = it->item->scrl_y;
2187 it->item->move_effect_enabled = EINA_FALSE;
2188 it->wd->reorder_move_animator = NULL;
2189 return ECORE_CALLBACK_CANCEL;
2191 return ECORE_CALLBACK_RENEW;
2195 _item_position(Elm_Gen_Item *it,
2203 evas_event_freeze(evas_object_evas_get(it->wd->obj));
2204 evas_object_resize(view, it->item->w, it->item->h);
2205 evas_object_move(view, it_x, it_y);
2206 evas_object_show(view);
2207 evas_event_thaw(evas_object_evas_get(it->wd->obj));
2208 evas_event_thaw_eval(evas_object_evas_get(it->wd->obj));
2212 _item_block_position(Item_Block *itb,
2218 Evas_Coord y = 0, ox, oy, ow, oh, cvx, cvy, cvw, cvh;
2219 Eina_Bool vis = EINA_FALSE;
2221 evas_event_freeze(evas_object_evas_get(itb->wd->obj));
2222 evas_object_geometry_get(itb->wd->pan_smart, &ox, &oy, &ow, &oh);
2223 evas_output_viewport_get(evas_object_evas_get(itb->wd->obj), &cvx, &cvy,
2225 EINA_LIST_FOREACH(itb->items, l, it)
2227 if (it->generation < it->wd->generation) continue;
2228 else if (it->wd->reorder_it == it) continue;
2231 it->item->w = itb->w;
2232 it->item->scrl_x = itb->x + it->x - it->wd->pan_x + ox;
2233 it->item->scrl_y = itb->y + it->y - it->wd->pan_y + oy;
2235 vis = (ELM_RECTS_INTERSECT(it->item->scrl_x, it->item->scrl_y, it->item->w, it->item->h,
2236 cvx, cvy, cvw, cvh));
2239 if ((itb->realized) && (!it->realized))
2241 if (vis) _item_realize(it, in, EINA_FALSE);
2247 if (it->wd->reorder_mode)
2248 y += _get_space_for_reorder_item(it);
2249 git = it->item->group_item;
2252 if (git->item->scrl_y < oy)
2253 git->item->scrl_y = oy;
2254 if ((git->item->scrl_y + git->item->h) > (it->item->scrl_y + it->item->h))
2255 git->item->scrl_y = (it->item->scrl_y + it->item->h) - git->item->h;
2256 git->item->want_realize = EINA_TRUE;
2258 if ((it->wd->reorder_it) && (it->item->old_scrl_y != it->item->scrl_y))
2260 if (!it->item->move_effect_enabled)
2262 it->item->move_effect_enabled = EINA_TRUE;
2263 it->wd->reorder_move_animator =
2265 _reorder_move_animator_cb, it);
2268 if (!it->item->move_effect_enabled)
2270 if (it->item->mode_view)
2271 _item_position(it, it->item->mode_view, it->item->scrl_x,
2274 _item_position(it, VIEW(it), it->item->scrl_x,
2276 it->item->old_scrl_y = it->item->scrl_y;
2281 if (!it->dragging) _elm_genlist_item_unrealize(it, EINA_FALSE);
2288 if (vis) it->item->want_realize = EINA_TRUE;
2292 evas_event_thaw(evas_object_evas_get(itb->wd->obj));
2293 evas_event_thaw_eval(evas_object_evas_get(itb->wd->obj));
2297 _group_items_recalc(void *data)
2299 Widget_Data *wd = data;
2303 evas_event_freeze(evas_object_evas_get(wd->obj));
2304 EINA_LIST_FOREACH(wd->group_items, l, git)
2306 if (git->item->want_realize)
2309 _item_realize(git, 0, EINA_FALSE);
2310 evas_object_resize(VIEW(git), wd->minw, git->item->h);
2311 evas_object_move(VIEW(git), git->item->scrl_x, git->item->scrl_y);
2312 evas_object_show(VIEW(git));
2313 evas_object_raise(VIEW(git));
2315 else if (!git->item->want_realize && git->realized)
2318 _elm_genlist_item_unrealize(git, EINA_FALSE);
2321 evas_event_thaw(evas_object_evas_get(wd->obj));
2322 evas_event_thaw_eval(evas_object_evas_get(wd->obj));
2326 _must_recalc_idler(void *data)
2328 Widget_Data *wd = data;
2329 if (wd->calc_job) ecore_job_del(wd->calc_job);
2330 wd->calc_job = ecore_job_add(_calc_job, wd);
2331 wd->must_recalc_idler = NULL;
2332 return ECORE_CALLBACK_CANCEL;
2336 _scroll_item(Widget_Data *wd)
2338 Elm_Gen_Item *it = NULL;
2339 Evas_Coord gith = 0;
2340 Evas_Coord ow, oh, dx = 0, dy = 0, dw = 0, dh = 0;
2342 evas_object_geometry_get(wd->pan_smart, NULL, NULL, &ow, &oh);
2344 dx = it->x + it->item->block->x;
2345 dy = it->y + it->item->block->y;
2346 dw = it->item->block->w;
2348 switch (wd->scrollto_type)
2350 case ELM_GENLIST_ITEM_SCROLLTO_TOP:
2351 if (it->item->group_item) gith = it->item->group_item->item->h;
2354 case ELM_GENLIST_ITEM_SCROLLTO_MIDDLE:
2355 dy += (it->item->h / 2 - oh / 2);
2357 case ELM_GENLIST_ITEM_SCROLLTO_IN:
2359 if ((wd->expanded_item) &&
2360 ((wd->show_item->y + wd->show_item->item->block->y + wd->show_item->item->h)
2361 - (wd->expanded_item->y + wd->expanded_item->item->block->y) > oh))
2363 it = wd->expanded_item;
2364 if (it->item->group_item) gith = it->item->group_item->item->h;
2365 dx = it->x + it->item->block->x;
2366 dy = it->y + it->item->block->y - gith;
2367 dw = it->item->block->w;
2371 if ((it->item->group_item) && (wd->pan_y > (it->y + it->item->block->y)))
2372 gith = it->item->group_item->item->h;
2379 elm_smart_scroller_region_bring_in(wd->scr, dx, dy, dw, dh);
2381 elm_smart_scroller_child_region_show(wd->scr, dx, dy, dw, dh);
2383 it->item->showme = EINA_FALSE;
2384 wd->show_item = NULL;
2385 wd->auto_scroll_enabled = EINA_FALSE;
2386 wd->check_scroll = EINA_FALSE;
2390 _calc_job(void *data)
2392 Widget_Data *wd = data;
2393 Item_Block *itb, *chb = NULL;
2394 Evas_Coord minw = -1, minh = 0, y = 0, ow, dy = 0, vw;
2395 Evas_Coord pan_w = 0, pan_h = 0;
2397 Eina_Bool minw_change = EINA_FALSE;
2398 Eina_Bool did_must_recalc = EINA_FALSE;
2401 evas_object_geometry_get(wd->pan_smart, NULL, NULL, &ow, &wd->h);
2402 elm_smart_scroller_child_viewport_size_get(wd->scr, &vw, NULL);
2407 evas_event_freeze(evas_object_evas_get(wd->obj));
2408 EINA_INLIST_FOREACH(wd->blocks, itb)
2410 Eina_Bool showme = EINA_FALSE;
2413 showme = itb->showme;
2414 itb->showme = EINA_FALSE;
2417 if (itb->realized) _item_block_unrealize(itb);
2419 if ((itb->changed) || ((itb->must_recalc) && (!did_must_recalc)))
2421 if (itb->must_recalc)
2425 EINA_LIST_FOREACH(itb->items, l, it)
2426 if (it->item->mincalcd) it->item->mincalcd = EINA_FALSE;
2427 itb->changed = EINA_TRUE;
2428 if (itb->must_recalc) did_must_recalc = EINA_TRUE;
2429 if (itb->realized) _item_block_unrealize(itb);
2430 itb->must_recalc = EINA_FALSE;
2432 showme = _item_block_recalc(itb, in, EINA_FALSE);
2438 if (minw == -1) minw = itb->minw;
2439 else if ((!itb->must_recalc) && (minw < itb->minw))
2442 minw_change = EINA_TRUE;
2447 minw_change = EINA_TRUE;
2453 if ((showme) && (wd->show_item) && (!wd->show_item->item->queued))
2454 wd->check_scroll = EINA_TRUE;
2458 EINA_INLIST_FOREACH(wd->blocks, itb)
2464 if ((chb) && (EINA_INLIST_GET(chb)->next))
2466 EINA_INLIST_FOREACH(EINA_INLIST_GET(chb)->next, itb)
2468 if (itb->realized) _item_block_unrealize(itb);
2471 wd->realminw = minw;
2472 if (minw < wd->w) minw = wd->w;
2473 if ((minw != wd->minw) || (minh != wd->minh))
2477 evas_object_smart_callback_call(wd->pan_smart, "changed", NULL);
2478 _sizing_eval(wd->obj);
2479 if ((wd->anchor_item) && (wd->anchor_item->item->block) && (!wd->auto_scroll_enabled))
2484 it = wd->anchor_item;
2485 it_y = wd->anchor_y;
2486 elm_smart_scroller_child_pos_set(wd->scr, wd->pan_x,
2487 it->item->block->y + it->y + it_y);
2488 wd->anchor_item = it;
2489 wd->anchor_y = it_y;
2492 if (did_must_recalc)
2494 if (!wd->must_recalc_idler)
2495 wd->must_recalc_idler = ecore_idler_add(_must_recalc_idler, wd);
2497 if (wd->check_scroll)
2499 _pan_child_size_get(wd->pan_smart, &pan_w, &pan_h);
2500 if (EINA_INLIST_GET(wd->show_item) == wd->items->last)
2501 wd->scrollto_type = ELM_GENLIST_ITEM_SCROLLTO_IN;
2502 switch (wd->scrollto_type)
2504 case ELM_GENLIST_ITEM_SCROLLTO_TOP:
2507 case ELM_GENLIST_ITEM_SCROLLTO_MIDDLE:
2510 case ELM_GENLIST_ITEM_SCROLLTO_IN:
2515 if ((pan_w > (wd->show_item->x + wd->show_item->item->block->x)) &&
2516 (pan_h > (wd->show_item->y + wd->show_item->item->block->y + dy)))
2521 wd->calc_job = NULL;
2522 evas_object_smart_changed(wd->pan_smart);
2523 evas_event_thaw(evas_object_evas_get(wd->obj));
2524 evas_event_thaw_eval(evas_object_evas_get(wd->obj));
2528 _update_job(void *data)
2530 Widget_Data *wd = data;
2534 Eina_Bool position = EINA_FALSE, recalc = EINA_FALSE;
2536 wd->update_job = NULL;
2539 evas_event_freeze(evas_object_evas_get(wd->obj));
2540 EINA_INLIST_FOREACH(wd->blocks, itb)
2542 Evas_Coord itminw, itminh;
2549 _item_block_position(itb, num);
2553 recalc = EINA_FALSE;
2554 EINA_LIST_FOREACH(itb->items, l2, it)
2556 if (it->item->updateme)
2558 itminw = it->item->minw;
2559 itminh = it->item->minh;
2561 it->item->updateme = EINA_FALSE;
2564 _elm_genlist_item_unrealize(it, EINA_FALSE);
2565 _item_realize(it, num, EINA_FALSE);
2566 position = EINA_TRUE;
2570 _item_realize(it, num, EINA_TRUE);
2571 _elm_genlist_item_unrealize(it, EINA_TRUE);
2573 if ((it->item->minw != itminw) || (it->item->minh != itminh))
2578 itb->updateme = EINA_FALSE;
2581 position = EINA_TRUE;
2582 itb->changed = EINA_TRUE;
2583 _item_block_recalc(itb, num0, EINA_FALSE);
2584 _item_block_position(itb, num0);
2589 if (wd->calc_job) ecore_job_del(wd->calc_job);
2590 wd->calc_job = ecore_job_add(_calc_job, wd);
2592 evas_event_thaw(evas_object_evas_get(wd->obj));
2593 evas_event_thaw_eval(evas_object_evas_get(wd->obj));
2597 _pan_set(Evas_Object *obj,
2601 Pan *sd = evas_object_smart_data_get(obj);
2605 // Evas_Coord ow, oh;
2606 // evas_object_geometry_get(obj, NULL, NULL, &ow, &oh);
2607 // ow = sd->wd->minw - ow;
2608 // if (ow < 0) ow = 0;
2609 // oh = sd->wd->minh - oh;
2610 // if (oh < 0) oh = 0;
2611 // if (x < 0) x = 0;
2612 // if (y < 0) y = 0;
2613 // if (x > ow) x = ow;
2614 // if (y > oh) y = oh;
2615 if ((x == sd->wd->pan_x) && (y == sd->wd->pan_y)) return;
2619 EINA_INLIST_FOREACH(sd->wd->blocks, itb)
2621 if ((itb->y + itb->h) > y)
2626 EINA_LIST_FOREACH(itb->items, l2, it)
2628 if ((itb->y + it->y) >= y)
2630 sd->wd->anchor_item = it;
2631 sd->wd->anchor_y = -(itb->y + it->y - y);
2638 if (!sd->wd->reorder_move_animator) evas_object_smart_changed(obj);
2642 _pan_get(Evas_Object *obj,
2646 Pan *sd = evas_object_smart_data_get(obj);
2649 if (x) *x = sd->wd->pan_x;
2650 if (y) *y = sd->wd->pan_y;
2654 _pan_max_get(Evas_Object *obj,
2658 Pan *sd = evas_object_smart_data_get(obj);
2662 evas_object_geometry_get(obj, NULL, NULL, &ow, &oh);
2663 ow = sd->wd->minw - ow;
2665 oh = sd->wd->minh - oh;
2672 _pan_min_get(Evas_Object *obj __UNUSED__,
2681 _pan_child_size_get(Evas_Object *obj,
2685 Pan *sd = evas_object_smart_data_get(obj);
2688 if (w) *w = sd->wd->minw;
2689 if (h) *h = sd->wd->minh;
2693 _pan_add(Evas_Object *obj)
2696 Evas_Object_Smart_Clipped_Data *cd;
2699 cd = evas_object_smart_data_get(obj);
2702 sd->__clipped_data = *cd;
2704 evas_object_smart_data_set(obj, sd);
2708 _pan_del(Evas_Object *obj)
2710 Pan *sd = evas_object_smart_data_get(obj);
2715 ecore_job_del(sd->resize_job);
2716 sd->resize_job = NULL;
2722 _pan_resize_job(void *data)
2726 _sizing_eval(sd->wd->obj);
2727 sd->resize_job = NULL;
2731 _pan_resize(Evas_Object *obj,
2735 Pan *sd = evas_object_smart_data_get(obj);
2739 evas_object_geometry_get(obj, NULL, NULL, &ow, &oh);
2740 if ((ow == w) && (oh == h)) return;
2741 if ((sd->wd->height_for_width) && (ow != w))
2744 if (sd->resize_job) ecore_job_del(sd->resize_job);
2745 sd->resize_job = ecore_job_add(_pan_resize_job, sd);
2747 sd->wd->pan_changed = EINA_TRUE;
2748 evas_object_smart_changed(obj);
2749 if (sd->wd->calc_job) ecore_job_del(sd->wd->calc_job);
2750 sd->wd->calc_job = NULL;
2752 if (sd->wd->calc_job) ecore_job_del(sd->wd->calc_job);
2753 sd->wd->calc_job = ecore_job_add(_calc_job, sd->wd);
2758 _pan_calculate(Evas_Object *obj)
2760 Pan *sd = evas_object_smart_data_get(obj);
2762 Evas_Coord ox, oy, ow, oh, cvx, cvy, cvw, cvh;
2768 evas_event_freeze(evas_object_evas_get(obj));
2770 if (sd->wd->pan_changed)
2773 sd->wd->pan_changed = EINA_FALSE;
2776 evas_object_geometry_get(obj, &ox, &oy, &ow, &oh);
2777 evas_output_viewport_get(evas_object_evas_get(obj), &cvx, &cvy, &cvw, &cvh);
2778 EINA_LIST_FOREACH(sd->wd->group_items, l, git)
2780 git->item->want_realize = EINA_FALSE;
2782 EINA_INLIST_FOREACH(sd->wd->blocks, itb)
2784 itb->w = sd->wd->minw;
2785 if (ELM_RECTS_INTERSECT(itb->x - sd->wd->pan_x + ox,
2786 itb->y - sd->wd->pan_y + oy,
2788 cvx, cvy, cvw, cvh))
2790 if ((!itb->realized) || (itb->changed))
2791 _item_block_realize(itb);
2792 _item_block_position(itb, in);
2796 if (itb->realized) _item_block_unrealize(itb);
2800 if ((!sd->wd->reorder_it) || (sd->wd->reorder_pan_move))
2801 _group_items_recalc(sd->wd);
2802 if ((sd->wd->reorder_mode) && (sd->wd->reorder_it))
2804 if (sd->wd->pan_y != sd->wd->reorder_old_pan_y)
2805 sd->wd->reorder_pan_move = EINA_TRUE;
2806 else sd->wd->reorder_pan_move = EINA_FALSE;
2807 evas_object_raise(sd->wd->VIEW(reorder_it));
2808 sd->wd->reorder_old_pan_y = sd->wd->pan_y;
2809 sd->wd->start_time = ecore_loop_time_get();
2811 _item_auto_scroll(sd->wd);
2812 evas_event_thaw(evas_object_evas_get(obj));
2813 evas_event_thaw_eval(evas_object_evas_get(obj));
2817 _pan_move(Evas_Object *obj,
2818 Evas_Coord x __UNUSED__,
2819 Evas_Coord y __UNUSED__)
2821 Pan *sd = evas_object_smart_data_get(obj);
2825 sd->wd->pan_changed = EINA_TRUE;
2826 evas_object_smart_changed(obj);
2827 if (sd->wd->calc_job) ecore_job_del(sd->wd->calc_job);
2828 sd->wd->calc_job = NULL;
2832 _hold_on(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, 1);
2842 _hold_off(void *data __UNUSED__,
2844 void *event_info __UNUSED__)
2846 Widget_Data *wd = elm_widget_data_get(obj);
2848 elm_smart_scroller_hold_set(wd->scr, 0);
2852 _freeze_on(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, 1);
2862 _freeze_off(void *data __UNUSED__,
2864 void *event_info __UNUSED__)
2866 Widget_Data *wd = elm_widget_data_get(obj);
2868 elm_smart_scroller_freeze_set(wd->scr, 0);
2872 _scr_anim_start(void *data,
2873 Evas_Object *obj __UNUSED__,
2874 void *event_info __UNUSED__)
2876 evas_object_smart_callback_call(data, SIG_SCROLL_ANIM_START, NULL);
2880 _scr_anim_stop(void *data,
2881 Evas_Object *obj __UNUSED__,
2882 void *event_info __UNUSED__)
2884 evas_object_smart_callback_call(data, SIG_SCROLL_ANIM_STOP, NULL);
2888 _scr_drag_start(void *data,
2889 Evas_Object *obj __UNUSED__,
2890 void *event_info __UNUSED__)
2892 evas_object_smart_callback_call(data, SIG_SCROLL_DRAG_START, NULL);
2896 _scr_drag_stop(void *data,
2897 Evas_Object *obj __UNUSED__,
2898 void *event_info __UNUSED__)
2900 evas_object_smart_callback_call(data, SIG_SCROLL_DRAG_STOP, NULL);
2904 _edge_left(void *data,
2905 Evas_Object *scr __UNUSED__,
2906 void *event_info __UNUSED__)
2908 Evas_Object *obj = data;
2909 evas_object_smart_callback_call(obj, SIG_EDGE_LEFT, NULL);
2913 _edge_right(void *data,
2914 Evas_Object *scr __UNUSED__,
2915 void *event_info __UNUSED__)
2917 Evas_Object *obj = data;
2918 evas_object_smart_callback_call(obj, SIG_EDGE_RIGHT, NULL);
2922 _edge_top(void *data,
2923 Evas_Object *scr __UNUSED__,
2924 void *event_info __UNUSED__)
2926 Evas_Object *obj = data;
2927 evas_object_smart_callback_call(obj, SIG_EDGE_TOP, NULL);
2931 _edge_bottom(void *data,
2932 Evas_Object *scr __UNUSED__,
2933 void *event_info __UNUSED__)
2935 Evas_Object *obj = data;
2936 evas_object_smart_callback_call(obj, SIG_EDGE_BOTTOM, NULL);
2940 _mode_item_realize(Elm_Gen_Item *it)
2944 if ((it->item->mode_view) || (it->generation < it->wd->generation)) return;
2946 evas_event_freeze(evas_object_evas_get(it->wd->obj));
2947 it->item->mode_view = edje_object_add(evas_object_evas_get(WIDGET(it)));
2948 edje_object_scale_set(it->item->mode_view,
2949 elm_widget_scale_get(WIDGET(it)) *
2950 _elm_config->scale);
2951 evas_object_smart_member_add(it->item->mode_view, it->wd->pan_smart);
2952 elm_widget_sub_object_add(WIDGET(it), it->item->mode_view);
2954 strncpy(buf, "item", sizeof(buf));
2955 if (it->wd->compress)
2956 strncat(buf, "_compress", sizeof(buf) - strlen(buf));
2958 if (it->item->order_num_in & 0x1) strncat(buf, "_odd", sizeof(buf) - strlen(buf));
2959 strncat(buf, "/", sizeof(buf) - strlen(buf));
2960 strncat(buf, it->wd->mode_item_style, sizeof(buf) - strlen(buf));
2962 _elm_theme_object_set(WIDGET(it), it->item->mode_view, "genlist", buf,
2963 elm_widget_style_get(WIDGET(it)));
2964 edje_object_mirrored_set(it->item->mode_view,
2965 elm_widget_mirrored_get(WIDGET(it)));
2967 /* signal callback add */
2968 evas_object_event_callback_add(it->item->mode_view, EVAS_CALLBACK_MOUSE_DOWN,
2970 evas_object_event_callback_add(it->item->mode_view, EVAS_CALLBACK_MOUSE_UP,
2972 evas_object_event_callback_add(it->item->mode_view, EVAS_CALLBACK_MOUSE_MOVE,
2975 /* text_get, content_get, state_get */
2976 /* FIXME: If you see that assert, please notify us and we
2977 will clean our mess */
2978 assert(eina_list_count(it->item->mode_content_objs) == 0);
2980 _item_text_realize(it, it->item->mode_view, &it->item->mode_texts, NULL);
2981 it->item->mode_content_objs =
2982 _item_content_realize(it, it->item->mode_view,
2983 &it->item->mode_contents, NULL);
2984 _item_state_realize(it, it->item->mode_view, &it->item->mode_states, NULL);
2986 edje_object_part_swallow(it->item->mode_view,
2987 edje_object_data_get(it->item->mode_view, "mode_part"),
2990 it->want_unrealize = EINA_FALSE;
2991 evas_event_thaw(evas_object_evas_get(it->wd->obj));
2992 evas_event_thaw_eval(evas_object_evas_get(it->wd->obj));
2996 _mode_item_unrealize(Elm_Gen_Item *it)
2998 Widget_Data *wd = it->wd;
2999 Evas_Object *content;
3000 if (!it->item->mode_view) return;
3002 evas_event_freeze(evas_object_evas_get(it->wd->obj));
3003 elm_widget_stringlist_free(it->item->mode_texts);
3004 it->item->mode_texts = NULL;
3005 elm_widget_stringlist_free(it->item->mode_contents);
3006 it->item->mode_contents = NULL;
3007 elm_widget_stringlist_free(it->item->mode_states);
3009 EINA_LIST_FREE(it->item->mode_content_objs, content)
3010 evas_object_del(content);
3012 edje_object_part_unswallow(it->item->mode_view, VIEW(it));
3013 evas_object_smart_member_add(VIEW(it), wd->pan_smart);
3014 evas_object_del(it->item->mode_view);
3015 it->item->mode_view = NULL;
3017 if (wd->mode_item == it)
3018 wd->mode_item = NULL;
3019 evas_event_thaw(evas_object_evas_get(it->wd->obj));
3020 evas_event_thaw_eval(evas_object_evas_get(it->wd->obj));
3024 _item_mode_set(Elm_Gen_Item *it)
3027 Widget_Data *wd = it->wd;
3032 it->item->nocache = EINA_TRUE;
3034 if (wd->scr_hold_timer)
3036 ecore_timer_del(wd->scr_hold_timer);
3037 wd->scr_hold_timer = NULL;
3039 elm_smart_scroller_hold_set(wd->scr, EINA_TRUE);
3040 wd->scr_hold_timer = ecore_timer_add(0.1, _scr_hold_timer_cb, wd);
3042 evas_event_freeze(evas_object_evas_get(it->wd->obj));
3043 _mode_item_realize(it);
3044 if (it->item->group_item)
3045 evas_object_raise(it->item->VIEW(group_item));
3046 _item_position(it, it->item->mode_view, it->item->scrl_x, it->item->scrl_y);
3047 evas_event_thaw(evas_object_evas_get(it->wd->obj));
3048 evas_event_thaw_eval(evas_object_evas_get(it->wd->obj));
3050 snprintf(buf, sizeof(buf), "elm,state,%s,active", wd->mode_type);
3051 edje_object_signal_emit(it->item->mode_view, buf, "elm");
3055 _item_mode_unset(Widget_Data *wd)
3058 if (!wd->mode_item) return;
3059 char buf[1024], buf2[1024];
3063 it->item->nocache = EINA_TRUE;
3065 snprintf(buf, sizeof(buf), "elm,state,%s,passive", wd->mode_type);
3066 snprintf(buf2, sizeof(buf2), "elm,state,%s,passive,finished", wd->mode_type);
3068 edje_object_signal_emit(it->item->mode_view, buf, "elm");
3069 edje_object_signal_callback_add(it->item->mode_view, buf2, "elm", _mode_finished_signal_cb, it);
3071 wd->mode_item = NULL;
3075 _item_auto_scroll(Widget_Data *wd)
3078 Elm_Gen_Item *tmp_item = NULL;
3080 if ((wd->expanded_item) && (wd->auto_scroll_enabled))
3082 tmp_item = eina_list_data_get(eina_list_last(wd->expanded_item->item->items));
3083 if (!tmp_item) return;
3084 wd->show_item = tmp_item;
3085 wd->bring_in = EINA_TRUE;
3086 wd->scrollto_type = ELM_GENLIST_ITEM_SCROLLTO_IN;
3087 if ((wd->show_item->item->queued) || (!wd->show_item->item->mincalcd))
3089 wd->show_item->item->showme = EINA_TRUE;
3090 wd->auto_scroll_enabled = EINA_FALSE;
3098 elm_genlist_add(Evas_Object *parent)
3103 Evas_Coord minw, minh;
3104 static Evas_Smart *smart = NULL;
3108 static Evas_Smart_Class sc;
3110 evas_object_smart_clipped_smart_set(&_pan_sc);
3112 sc.name = "elm_genlist_pan";
3113 sc.version = EVAS_SMART_CLASS_VERSION;
3116 sc.resize = _pan_resize;
3117 sc.move = _pan_move;
3118 sc.calculate = _pan_calculate;
3119 if (!(smart = evas_smart_class_new(&sc))) return NULL;
3122 ELM_WIDGET_STANDARD_SETUP(wd, Widget_Data, parent, e, obj, NULL);
3124 ELM_SET_WIDTYPE(widtype, "genlist");
3126 elm_widget_type_set(obj, "genlist");
3127 elm_widget_sub_object_add(parent, obj);
3128 elm_widget_on_focus_hook_set(obj, _on_focus_hook, NULL);
3129 elm_widget_signal_emit_hook_set(obj, _signal_emit_hook);
3130 elm_widget_data_set(obj, wd);
3131 elm_widget_del_hook_set(obj, _del_hook);
3132 elm_widget_del_pre_hook_set(obj, _del_pre_hook);
3133 elm_widget_theme_hook_set(obj, _theme_hook);
3134 elm_widget_can_focus_set(obj, EINA_TRUE);
3135 elm_widget_event_hook_set(obj, _event_hook);
3136 elm_widget_on_show_region_hook_set(obj, _show_region_hook, obj);
3137 elm_widget_translate_hook_set(obj, _translate_hook);
3140 wd->scr = elm_smart_scroller_add(e);
3141 elm_smart_scroller_widget_set(wd->scr, obj);
3142 elm_smart_scroller_object_theme_set(obj, wd->scr, "genlist", "base",
3143 elm_widget_style_get(obj));
3144 elm_smart_scroller_bounce_allow_set(wd->scr, EINA_FALSE,
3145 _elm_config->thumbscroll_bounce_enable);
3146 elm_widget_resize_object_set(obj, wd->scr);
3148 evas_object_smart_callback_add(wd->scr, "animate,start", _scr_anim_start, obj);
3149 evas_object_smart_callback_add(wd->scr, "animate,stop", _scr_anim_stop, obj);
3150 evas_object_smart_callback_add(wd->scr, "drag,start", _scr_drag_start, obj);
3151 evas_object_smart_callback_add(wd->scr, "drag,stop", _scr_drag_stop, obj);
3152 evas_object_smart_callback_add(wd->scr, "edge,left", _edge_left, obj);
3153 evas_object_smart_callback_add(wd->scr, "edge,right", _edge_right, obj);
3154 evas_object_smart_callback_add(wd->scr, "edge,top", _edge_top, obj);
3155 evas_object_smart_callback_add(wd->scr, "edge,bottom", _edge_bottom, obj);
3158 wd->mode = ELM_LIST_SCROLL;
3159 wd->max_items_per_block = MAX_ITEMS_PER_BLOCK;
3160 wd->item_cache_max = wd->max_items_per_block * 2;
3161 wd->longpress_timeout = _elm_config->longpress_timeout;
3163 evas_object_smart_callback_add(obj, "scroll-hold-on", _hold_on, obj);
3164 evas_object_smart_callback_add(obj, "scroll-hold-off", _hold_off, obj);
3165 evas_object_smart_callback_add(obj, "scroll-freeze-on", _freeze_on, obj);
3166 evas_object_smart_callback_add(obj, "scroll-freeze-off", _freeze_off, obj);
3168 wd->pan_smart = evas_object_smart_add(e, smart);
3169 wd->pan = evas_object_smart_data_get(wd->pan_smart);
3172 elm_smart_scroller_extern_pan_set(wd->scr, wd->pan_smart,
3173 _pan_set, _pan_get, _pan_max_get,
3174 _pan_min_get, _pan_child_size_get);
3176 edje_object_size_min_calc(elm_smart_scroller_edje_object_get(wd->scr),
3178 evas_object_size_hint_min_set(obj, minw, minh);
3180 evas_object_smart_callbacks_descriptions_set(obj, _signals);
3182 _mirrored_set(obj, elm_widget_mirrored_get(obj));
3188 _item_select(Elm_Gen_Item *it)
3190 if ((it->wd->no_select) || (it->generation < it->wd->generation) || (it->mode_set)) return;
3193 it->selected = EINA_TRUE;
3194 it->wd->selected = eina_list_append(it->wd->selected, it);
3196 else if (!it->wd->always_select) return;
3198 evas_object_ref(WIDGET(it));
3201 if (it->func.func) it->func.func((void *)it->func.data, WIDGET(it), it);
3202 if (it->generation == it->wd->generation)
3203 evas_object_smart_callback_call(WIDGET(it), SIG_SELECTED, it);
3206 evas_object_unref(WIDGET(it));
3207 if ((it->wd->clear_me) && (!it->wd->walking))
3208 _elm_genlist_clear(WIDGET(it), EINA_TRUE);
3211 if ((!it->walking) && (it->generation < it->wd->generation))
3216 elm_widget_item_free(it);
3220 it->wd->last_selected_item = (Elm_Object_Item *) it;
3224 static Evas_Object *
3225 _item_content_get_hook(Elm_Gen_Item *it, const char *part)
3227 return edje_object_part_swallow_get(VIEW(it), part);
3231 _item_content_set_hook(Elm_Gen_Item *it, const char *part, Evas_Object *content)
3233 if (content && part)
3235 it->content_objs = eina_list_append(it->content_objs, content);
3236 edje_object_part_swallow(VIEW(it), part, content);
3240 static Evas_Object *
3241 _item_content_unset_hook(Elm_Gen_Item *it, const char *part)
3244 obj = edje_object_part_swallow_get(VIEW(it), part);
3245 if (!obj) return NULL;
3246 it->content_objs = eina_list_remove(it->content_objs, obj);
3247 edje_object_part_unswallow(VIEW(it), obj);
3252 _item_text_hook(Elm_Gen_Item *it, const char *part)
3254 if (!it->itc->func.text_get) return NULL;
3255 return edje_object_part_text_get(VIEW(it), part);
3259 _item_disable_hook(Elm_Object_Item *it)
3261 ELM_OBJ_ITEM_CHECK_OR_RETURN(it);
3264 Elm_Gen_Item *_it = (Elm_Gen_Item *) it;
3266 if (_it->generation < _it->wd->generation) return;
3269 elm_genlist_item_selected_set(it, EINA_FALSE);
3273 if (elm_widget_item_disabled_get(it))
3274 edje_object_signal_emit(VIEW(_it), "elm,state,disabled", "elm");
3276 edje_object_signal_emit(VIEW(_it), "elm,state,enabled", "elm");
3277 EINA_LIST_FOREACH(_it->content_objs, l, obj)
3278 elm_widget_disabled_set(obj, elm_widget_item_disabled_get(_it));
3283 _item_del_pre_hook(Elm_Object_Item *it)
3285 ELM_OBJ_ITEM_CHECK_OR_RETURN(it, EINA_FALSE);
3286 Elm_Gen_Item *_it = (Elm_Gen_Item *) it;
3288 if ((_it->relcount > 0) || (_it->walking > 0))
3290 elm_genlist_item_subitems_clear(it);
3291 if (_it->wd->show_item == _it) _it->wd->show_item = NULL;
3292 _elm_genlist_item_del_notserious(_it);
3293 if (_it->item->block)
3295 if (_it->realized) _elm_genlist_item_unrealize(_it, EINA_FALSE);
3296 _it->item->block->changed = EINA_TRUE;
3297 if (_it->wd->calc_job) ecore_job_del(_it->wd->calc_job);
3298 _it->wd->calc_job = ecore_job_add(_calc_job, _it->wd);
3302 _it->parent->item->items =
3303 eina_list_remove(_it->parent->item->items, it);
3313 _elm_genlist_item_new(Widget_Data *wd,
3314 const Elm_Gen_Item_Class *itc,
3316 Elm_Gen_Item *parent,
3318 const void *func_data)
3322 it = elm_widget_item_new(wd->obj, Elm_Gen_Item);
3323 if (!it) return NULL;
3325 it->generation = wd->generation;
3327 elm_genlist_item_class_ref((Elm_Genlist_Item_Class *)itc);
3328 it->base.data = data;
3329 it->parent = parent;
3330 it->func.func = func;
3331 it->func.data = func_data;
3332 elm_widget_item_content_get_hook_set(it, _item_content_get_hook);
3333 elm_widget_item_content_set_hook_set(it, _item_content_set_hook);
3334 elm_widget_item_content_unset_hook_set(it, _item_content_unset_hook);
3335 elm_widget_item_disable_hook_set(it, _item_disable_hook);
3336 elm_widget_item_del_pre_hook_set(it, _item_del_pre_hook);
3338 it->sel_cb = (Ecore_Cb)_item_select;
3340 elm_widget_item_text_get_hook_set(it, _item_text_hook);
3344 static Elm_Gen_Item *
3345 _item_new(Widget_Data *wd,
3346 const Elm_Genlist_Item_Class *itc,
3348 Elm_Gen_Item *parent,
3349 Elm_Genlist_Item_Flags flags,
3351 const void *func_data)
3353 Elm_Gen_Item *it, *it2;
3356 it = _elm_genlist_item_new(wd, itc, data, parent, func, func_data);
3357 if (!it) return NULL;
3358 it->item = ELM_NEW(Elm_Gen_Item_Type);
3359 it->item->flags = flags;
3360 if (flags & ELM_GENLIST_ITEM_GROUP) it->group++;
3361 it->item->expanded_depth = 0;
3362 ELM_GEN_ITEM_SETUP(it);
3365 if (it->parent->group)
3366 it->item->group_item = parent;
3367 else if (it->parent->item->group_item)
3368 it->item->group_item = it->parent->item->group_item;
3370 for (it2 = it, depth = 0; it2->parent; it2 = it2->parent)
3372 if (!it2->parent->group) depth += 1;
3374 it->item->expanded_depth = depth;
3379 _item_block_new(Widget_Data *wd, Eina_Bool prepend)
3383 itb = calloc(1, sizeof(Item_Block));
3384 if (!itb) return NULL;
3388 wd->blocks = eina_inlist_prepend(wd->blocks, EINA_INLIST_GET(itb));
3389 _item_block_position_update(wd->blocks, 0);
3393 wd->blocks = eina_inlist_append(wd->blocks, EINA_INLIST_GET(itb));
3394 itb->position_update = EINA_TRUE;
3395 if (wd->blocks != EINA_INLIST_GET(itb))
3397 itb->position = ((Item_Block *) (EINA_INLIST_GET(itb)->prev))->position + 1;
3408 _item_block_add(Widget_Data *wd,
3411 Item_Block *itb = NULL;
3418 itb = calloc(1, sizeof(Item_Block));
3419 if (!itb) return EINA_FALSE;
3421 if (!it->item->rel->item->block)
3424 eina_inlist_append(wd->blocks, EINA_INLIST_GET(itb));
3425 itb->items = eina_list_append(itb->items, it);
3426 itb->position_update = EINA_TRUE;
3427 it->position = eina_list_count(itb->items);
3428 it->position_update = EINA_TRUE;
3430 if (wd->blocks != EINA_INLIST_GET(itb))
3432 itb->position = ((Item_Block *) (EINA_INLIST_GET(itb)->prev))->position + 1;
3443 tmp = eina_list_data_find_list(itb->items, it->item->rel);
3444 if (it->item->before)
3446 wd->blocks = eina_inlist_prepend_relative
3447 (wd->blocks, EINA_INLIST_GET(itb),
3448 EINA_INLIST_GET(it->item->rel->item->block));
3450 eina_list_prepend_relative_list(itb->items, it, tmp);
3452 /* Update index from where we prepended */
3453 _item_position_update(eina_list_prev(tmp), it->item->rel->position);
3454 _item_block_position_update(EINA_INLIST_GET(itb),
3455 it->item->rel->item->block->position);
3459 wd->blocks = eina_inlist_append_relative
3460 (wd->blocks, EINA_INLIST_GET(itb),
3461 EINA_INLIST_GET(it->item->rel->item->block));
3463 eina_list_append_relative_list(itb->items, it, tmp);
3465 /* Update block index from where we appended */
3466 _item_position_update(eina_list_next(tmp), it->item->rel->position + 1);
3467 _item_block_position_update(EINA_INLIST_GET(itb),
3468 it->item->rel->item->block->position + 1);
3474 if (it->item->before)
3478 itb = (Item_Block *)(wd->blocks);
3479 if (itb->count >= wd->max_items_per_block)
3481 itb = _item_block_new(wd, EINA_TRUE);
3482 if (!itb) return EINA_FALSE;
3487 itb = _item_block_new(wd, EINA_TRUE);
3488 if (!itb) return EINA_FALSE;
3490 itb->items = eina_list_prepend(itb->items, it);
3492 _item_position_update(itb->items, 0);
3498 itb = (Item_Block *)(wd->blocks->last);
3499 if (itb->count >= wd->max_items_per_block)
3501 itb = _item_block_new(wd, EINA_FALSE);
3502 if (!itb) return EINA_FALSE;
3507 itb = _item_block_new(wd, EINA_FALSE);
3508 if (!itb) return EINA_FALSE;
3510 itb->items = eina_list_append(itb->items, it);
3511 it->position = eina_list_count(itb->items);
3519 if (it->item->rel->item->queued)
3521 /* NOTE: for a strange reason eina_list and eina_inlist don't have the same property
3522 on sorted insertion order, so the queue is not always ordered like the item list.
3523 This lead to issue where we depend on an item that is not yet created. As a quick
3524 work around, we reschedule the calc of the item and stop reordering the list to
3525 prevent any nasty issue to show up here.
3527 wd->queue = eina_list_append(wd->queue, it);
3528 wd->requeued = EINA_TRUE;
3529 it->item->queued = EINA_TRUE;
3532 itb = it->item->rel->item->block;
3533 if (!itb) goto newblock;
3534 tmp = eina_list_data_find_list(itb->items, it->item->rel);
3535 if (it->item->before)
3537 itb->items = eina_list_prepend_relative_list(itb->items, it, tmp);
3538 _item_position_update(eina_list_prev(tmp), it->item->rel->position);
3542 itb->items = eina_list_append_relative_list(itb->items, it, tmp);
3543 _item_position_update(eina_list_next(tmp), it->item->rel->position + 1);
3547 itb->changed = EINA_TRUE;
3548 it->item->block = itb;
3549 if (itb->wd->calc_job) ecore_job_del(itb->wd->calc_job);
3550 itb->wd->calc_job = ecore_job_add(_calc_job, itb->wd);
3553 it->item->rel->relcount--;
3554 if ((it->item->rel->generation < it->wd->generation) && (!it->item->rel->relcount))
3556 _item_del(it->item->rel);
3557 elm_widget_item_free(it->item->rel);
3559 it->item->rel = NULL;
3561 if (itb->count > itb->wd->max_items_per_block)
3566 Eina_Bool done = EINA_FALSE;
3568 newc = itb->count / 2;
3570 if (EINA_INLIST_GET(itb)->prev)
3572 Item_Block *itbp = (Item_Block *)(EINA_INLIST_GET(itb)->prev);
3574 if (itbp->count + newc < wd->max_items_per_block / 2)
3576 /* moving items to previous block */
3577 while ((itb->count > newc) && (itb->items))
3579 it2 = eina_list_data_get(itb->items);
3580 itb->items = eina_list_remove_list(itb->items, itb->items);
3583 itbp->items = eina_list_append(itbp->items, it2);
3584 it2->item->block = itbp;
3592 if (!done && EINA_INLIST_GET(itb)->next)
3594 Item_Block *itbn = (Item_Block *)(EINA_INLIST_GET(itb)->next);
3596 if (itbn->count + newc < wd->max_items_per_block / 2)
3598 /* moving items to next block */
3599 while ((itb->count > newc) && (itb->items))
3603 l = eina_list_last(itb->items);
3604 it2 = eina_list_data_get(l);
3605 itb->items = eina_list_remove_list(itb->items, l);
3608 itbn->items = eina_list_prepend(itbn->items, it2);
3609 it2->item->block = itbn;
3619 /* moving items to new block */
3620 itb2 = calloc(1, sizeof(Item_Block));
3621 if (!itb2) return EINA_FALSE;
3624 eina_inlist_append_relative(wd->blocks, EINA_INLIST_GET(itb2),
3625 EINA_INLIST_GET(itb));
3626 itb2->changed = EINA_TRUE;
3627 while ((itb->count > newc) && (itb->items))
3631 l = eina_list_last(itb->items);
3633 itb->items = eina_list_remove_list(itb->items, l);
3636 itb2->items = eina_list_prepend(itb2->items, it2);
3637 it2->item->block = itb2;
3647 _queue_process(Widget_Data *wd)
3650 Eina_Bool showme = EINA_FALSE;
3653 t0 = ecore_loop_time_get();
3654 //evas_event_freeze(evas_object_evas_get(wd->obj));
3655 for (n = 0; (wd->queue) && (n < 128); n++)
3659 it = eina_list_data_get(wd->queue);
3660 wd->queue = eina_list_remove_list(wd->queue, wd->queue);
3661 it->item->queued = EINA_FALSE;
3662 if (!_item_block_add(wd, it)) continue;
3664 _item_block_realize(it->item->block);
3665 t = ecore_time_get();
3666 if (it->item->block->changed)
3668 showme = _item_block_recalc(it->item->block, it->item->block->num, EINA_TRUE);
3669 it->item->block->changed = 0;
3670 if (wd->pan_changed)
3672 if (wd->calc_job) ecore_job_del(wd->calc_job);
3673 wd->calc_job = NULL;
3675 wd->pan_changed = EINA_FALSE;
3678 if (showme) it->item->block->showme = EINA_TRUE;
3679 /* same as eina_inlist_count > 1 */
3680 if (wd->blocks && wd->blocks->next)
3682 if ((t - t0) > (ecore_animator_frametime_get())) break;
3685 //evas_event_thaw(evas_object_evas_get(wd->obj));
3686 //evas_event_thaw_eval(evas_object_evas_get(wd->obj));
3691 _idle_process(void *data, Eina_Bool *wakeup)
3693 Widget_Data *wd = data;
3696 //static double q_start = 0.0;
3697 //if (q_start == 0.0) q_start = ecore_time_get();
3699 if (_queue_process(wd) > 0) *wakeup = EINA_TRUE;
3703 //printf("PROCESS TIME: %3.3f\n", ecore_time_get() - q_start);
3705 return ECORE_CALLBACK_CANCEL;
3707 return ECORE_CALLBACK_RENEW;
3711 _item_idle_enterer(void *data)
3713 Widget_Data *wd = data;
3714 Eina_Bool wakeup = EINA_FALSE;
3715 Eina_Bool ok = _idle_process(data, &wakeup);
3720 if (wd->calc_job) ecore_job_del(wd->calc_job);
3721 wd->calc_job = ecore_job_add(_calc_job, wd);
3723 if (ok == ECORE_CALLBACK_CANCEL) wd->queue_idle_enterer = NULL;
3728 _item_queue(Widget_Data *wd,
3732 if (it->item->queued) return;
3733 it->item->queued = EINA_TRUE;
3734 if (cb && !wd->requeued)
3735 wd->queue = eina_list_sorted_insert(wd->queue, cb, it);
3737 wd->queue = eina_list_append(wd->queue, it);
3738 // FIXME: why does a freeze then thaw here cause some genlist
3739 // elm_genlist_item_append() to be much much slower?
3740 // evas_event_freeze(evas_object_evas_get(wd->obj));
3741 while ((wd->queue) && ((!wd->blocks) || (!wd->blocks->next)))
3743 if (wd->queue_idle_enterer)
3745 ecore_idle_enterer_del(wd->queue_idle_enterer);
3746 wd->queue_idle_enterer = NULL;
3750 // evas_event_thaw(evas_object_evas_get(wd->obj));
3751 // evas_event_thaw_eval(evas_object_evas_get(wd->obj));
3752 if (!wd->queue_idle_enterer)
3753 wd->queue_idle_enterer = ecore_idle_enterer_add(_item_idle_enterer, wd);
3757 _elm_genlist_item_compare_data(const void *data, const void *data1)
3759 const Elm_Gen_Item *it = data;
3760 const Elm_Gen_Item *item1 = data1;
3762 return it->wd->item_compare_data_cb(it->base.data, item1->base.data);
3766 _elm_genlist_item_compare(const void *data, const void *data1)
3768 const Elm_Gen_Item *it, *item1;
3769 it = ELM_GEN_ITEM_FROM_INLIST(data);
3770 item1 = ELM_GEN_ITEM_FROM_INLIST(data1);
3771 return it->wd->item_compare_cb(it, item1);
3775 _elm_genlist_item_list_compare(const void *data, const void *data1)
3777 const Elm_Gen_Item *it = data;
3778 const Elm_Gen_Item *item1 = data1;
3779 return it->wd->item_compare_cb(it, item1);
3783 _item_move_after(Elm_Gen_Item *it, Elm_Gen_Item *after)
3788 it->wd->items = eina_inlist_remove(it->wd->items, EINA_INLIST_GET(it));
3789 _item_block_del(it);
3791 it->wd->items = eina_inlist_append_relative(it->wd->items, EINA_INLIST_GET(it), EINA_INLIST_GET(after));
3792 it->item->rel = after;
3793 it->item->rel->relcount++;
3794 it->item->before = EINA_FALSE;
3795 if (after->item->group_item) it->item->group_item = after->item->group_item;
3796 _item_queue(it->wd, it, NULL);
3798 evas_object_smart_callback_call(WIDGET(it), SIG_MOVED, it);
3802 _item_move_before(Elm_Gen_Item *it, Elm_Gen_Item *before)
3805 if (!before) return;
3807 it->wd->items = eina_inlist_remove(it->wd->items, EINA_INLIST_GET(it));
3808 _item_block_del(it);
3809 it->wd->items = eina_inlist_prepend_relative(it->wd->items, EINA_INLIST_GET(it), EINA_INLIST_GET(before));
3810 it->item->rel = before;
3811 it->item->rel->relcount++;
3812 it->item->before = EINA_TRUE;
3813 if (before->item->group_item) it->item->group_item = before->item->group_item;
3814 _item_queue(it->wd, it, NULL);
3816 evas_object_smart_callback_call(WIDGET(it), SIG_MOVED, it);
3819 EAPI Elm_Object_Item *
3820 elm_genlist_item_append(Evas_Object *obj,
3821 const Elm_Genlist_Item_Class *itc,
3823 Elm_Object_Item *parent,
3824 Elm_Genlist_Item_Flags flags,
3826 const void *func_data)
3828 ELM_CHECK_WIDTYPE(obj, widtype) NULL;
3829 Widget_Data *wd = elm_widget_data_get(obj);
3830 if (!wd) return NULL;
3831 Elm_Gen_Item *it = _item_new(wd, itc, data, (Elm_Gen_Item *) parent, flags,
3833 if (!it) return NULL;
3837 wd->group_items = eina_list_append(wd->group_items, it);
3838 wd->items = eina_inlist_append(wd->items, EINA_INLIST_GET(it));
3839 it->item->rel = NULL;
3843 Elm_Gen_Item *it2 = NULL;
3844 Eina_List *ll = eina_list_last(it->parent->item->items);
3845 if (ll) it2 = ll->data;
3846 it->parent->item->items = eina_list_append(it->parent->item->items, it);
3847 if (!it2) it2 = it->parent;
3849 eina_inlist_append_relative(wd->items, EINA_INLIST_GET(it),
3850 EINA_INLIST_GET(it2));
3851 it->item->rel = it2;
3852 it->item->rel->relcount++;
3854 it->item->before = EINA_FALSE;
3855 _item_queue(wd, it, NULL);
3856 return (Elm_Object_Item *) it;
3859 EAPI Elm_Object_Item *
3860 elm_genlist_item_prepend(Evas_Object *obj,
3861 const Elm_Genlist_Item_Class *itc,
3863 Elm_Object_Item *parent,
3864 Elm_Genlist_Item_Flags flags,
3866 const void *func_data)
3868 ELM_CHECK_WIDTYPE(obj, widtype) NULL;
3869 Widget_Data *wd = elm_widget_data_get(obj);
3870 if (!wd) return NULL;
3871 Elm_Gen_Item *it = _item_new(wd, itc, data, (Elm_Gen_Item *) parent, flags,
3873 if (!it) return NULL;
3877 wd->group_items = eina_list_prepend(wd->group_items, it);
3878 wd->items = eina_inlist_prepend(wd->items, EINA_INLIST_GET(it));
3879 it->item->rel = NULL;
3883 Elm_Gen_Item *it2 = NULL;
3884 Eina_List *ll = it->parent->item->items;
3885 if (ll) it2 = ll->data;
3886 it->parent->item->items = eina_list_prepend(it->parent->item->items, it);
3887 if (!it2) it2 = it->parent;
3889 eina_inlist_prepend_relative(wd->items, EINA_INLIST_GET(it),
3890 EINA_INLIST_GET(it2));
3891 it->item->rel = it2;
3892 it->item->rel->relcount++;
3894 it->item->before = EINA_TRUE;
3895 _item_queue(wd, it, NULL);
3896 return (Elm_Object_Item *) it;
3899 EAPI Elm_Object_Item *
3900 elm_genlist_item_insert_after(Evas_Object *obj,
3901 const Elm_Genlist_Item_Class *itc,
3903 Elm_Object_Item *parent,
3904 Elm_Object_Item *after,
3905 Elm_Genlist_Item_Flags flags,
3907 const void *func_data)
3909 ELM_CHECK_WIDTYPE(obj, widtype) NULL;
3910 ELM_OBJ_ITEM_CHECK_OR_RETURN(after, NULL);
3911 Widget_Data *wd = elm_widget_data_get(obj);
3912 Elm_Gen_Item *_after = (Elm_Gen_Item *) after;
3913 if (!wd) return NULL;
3914 /* It makes no sense to insert after in an empty list with after != NULL, something really bad is happening in your app. */
3915 EINA_SAFETY_ON_NULL_RETURN_VAL(wd->items, NULL);
3917 Elm_Gen_Item *it = _item_new(wd, itc, data, (Elm_Gen_Item *) parent, flags,
3919 if (!it) return NULL;
3922 if ((it->group) && (_after->group))
3923 wd->group_items = eina_list_append_relative(wd->group_items, it,
3928 it->parent->item->items =
3929 eina_list_append_relative(it->parent->item->items, it, _after);
3931 wd->items = eina_inlist_append_relative(wd->items, EINA_INLIST_GET(it),
3932 EINA_INLIST_GET(_after));
3933 it->item->rel = _after;
3934 it->item->rel->relcount++;
3935 it->item->before = EINA_FALSE;
3936 _item_queue(wd, it, NULL);
3937 return (Elm_Object_Item *) it;
3940 EAPI Elm_Object_Item *
3941 elm_genlist_item_insert_before(Evas_Object *obj,
3942 const Elm_Genlist_Item_Class *itc,
3944 Elm_Object_Item *parent,
3945 Elm_Object_Item *before,
3946 Elm_Genlist_Item_Flags flags,
3948 const void *func_data)
3950 ELM_CHECK_WIDTYPE(obj, widtype) NULL;
3951 ELM_OBJ_ITEM_CHECK_OR_RETURN(before, NULL);
3952 Widget_Data *wd = elm_widget_data_get(obj);
3953 Elm_Gen_Item *_before = (Elm_Gen_Item *) before;
3954 if (!wd) return NULL;
3955 /* It makes no sense to insert before in an empty list with before != NULL, something really bad is happening in your app. */
3956 EINA_SAFETY_ON_NULL_RETURN_VAL(wd->items, NULL);
3958 Elm_Gen_Item *it = _item_new(wd, itc, data, (Elm_Gen_Item *) parent, flags,
3960 if (!it) return NULL;
3963 if (it->group && _before->group)
3964 wd->group_items = eina_list_prepend_relative(wd->group_items, it,
3969 it->parent->item->items =
3970 eina_list_prepend_relative(it->parent->item->items, it, _before);
3972 wd->items = eina_inlist_prepend_relative(wd->items, EINA_INLIST_GET(it),
3973 EINA_INLIST_GET(_before));
3974 it->item->rel = _before;
3975 it->item->rel->relcount++;
3976 it->item->before = EINA_TRUE;
3977 _item_queue(wd, it, NULL);
3978 return (Elm_Object_Item *) it;
3981 EAPI Elm_Object_Item *
3982 elm_genlist_item_direct_sorted_insert(Evas_Object *obj,
3983 const Elm_Genlist_Item_Class *itc,
3985 Elm_Object_Item *parent,
3986 Elm_Genlist_Item_Flags flags,
3987 Eina_Compare_Cb comp,
3989 const void *func_data)
3991 ELM_CHECK_WIDTYPE(obj, widtype) NULL;
3992 Widget_Data *wd = elm_widget_data_get(obj);
3993 if (!wd) return NULL;
3994 Elm_Gen_Item *rel = NULL;
3995 Elm_Gen_Item *it = _item_new(wd, itc, data, (Elm_Gen_Item *) parent, flags,
3997 if (!it) return NULL;
3999 wd->item_compare_cb = comp;
4006 l = eina_list_search_sorted_near_list(it->parent->item->items,
4007 _elm_genlist_item_list_compare, it,
4010 rel = eina_list_data_get(l);
4014 if (cmp_result >= 0)
4016 it->parent->item->items = eina_list_prepend_relative_list(it->parent->item->items, it, l);
4017 wd->items = eina_inlist_prepend_relative(wd->items, EINA_INLIST_GET(it), EINA_INLIST_GET(rel));
4018 it->item->before = EINA_FALSE;
4020 else if (cmp_result < 0)
4022 it->parent->item->items = eina_list_append_relative_list(it->parent->item->items, it, l);
4023 wd->items = eina_inlist_append_relative(wd->items, EINA_INLIST_GET(it), EINA_INLIST_GET(rel));
4024 it->item->before = EINA_TRUE;
4031 wd->state = eina_inlist_sorted_state_new();
4032 eina_inlist_sorted_state_init(wd->state, wd->items);
4033 wd->requeued = EINA_FALSE;
4037 wd->group_items = eina_list_append(wd->group_items, it);
4039 wd->items = eina_inlist_sorted_state_insert(wd->items, EINA_INLIST_GET(it),
4040 _elm_genlist_item_compare, wd->state);
4042 if (EINA_INLIST_GET(it)->next)
4044 rel = ELM_GEN_ITEM_FROM_INLIST(EINA_INLIST_GET(it)->next);
4045 it->item->before = EINA_TRUE;
4047 else if (EINA_INLIST_GET(it)->prev)
4049 rel = ELM_GEN_ITEM_FROM_INLIST(EINA_INLIST_GET(it)->prev);
4050 it->item->before = EINA_FALSE;
4056 it->item->rel = rel;
4057 it->item->rel->relcount++;
4060 _item_queue(wd, it, _elm_genlist_item_list_compare);
4062 return (Elm_Object_Item *) it;
4065 EAPI Elm_Object_Item *
4066 elm_genlist_item_sorted_insert(Evas_Object *obj,
4067 const Elm_Genlist_Item_Class *itc,
4069 Elm_Object_Item *parent,
4070 Elm_Genlist_Item_Flags flags,
4071 Eina_Compare_Cb comp,
4073 const void *func_data)
4075 ELM_CHECK_WIDTYPE(obj, widtype) NULL;
4076 Widget_Data *wd = elm_widget_data_get(obj);
4077 wd->item_compare_data_cb = comp;
4078 return elm_genlist_item_direct_sorted_insert(obj, itc, data, parent, flags,
4079 _elm_genlist_item_compare_data,
4084 _elm_genlist_clear(Evas_Object *obj, Eina_Bool standby)
4086 Eina_Inlist *next, *l;
4088 ELM_CHECK_WIDTYPE(obj, widtype);
4089 Widget_Data *wd = elm_widget_data_get(obj);
4092 if (!standby) wd->generation++;
4096 eina_inlist_sorted_state_free(wd->state);
4100 if (wd->walking > 0)
4105 evas_event_freeze(evas_object_evas_get(wd->obj));
4106 for (l = wd->items, next = l ? l->next : NULL;
4108 l = next, next = next ? next->next : NULL)
4110 Elm_Gen_Item *it = ELM_GEN_ITEM_FROM_INLIST(l);
4112 if (it->generation < wd->generation)
4114 Elm_Gen_Item *itn = NULL;
4116 if (next) itn = ELM_GEN_ITEM_FROM_INLIST(next);
4117 if (itn) itn->walking++; /* prevent early death of subitem */
4119 elm_widget_item_free(it);
4120 if (itn) itn->walking--;
4124 wd->pan_changed = EINA_TRUE;
4127 ecore_job_del(wd->calc_job);
4128 wd->calc_job = NULL;
4130 if (wd->selected) wd->selected = eina_list_free(wd->selected);
4131 if (wd->clear_cb) wd->clear_cb(wd);
4139 evas_object_size_hint_min_set(wd->pan_smart, wd->minw, wd->minh);
4140 evas_object_smart_callback_call(wd->pan_smart, "changed", NULL);
4142 if (wd->sizing_cb) wd->sizing_cb(wd->obj);
4143 elm_smart_scroller_child_region_show(wd->scr, 0, 0, 0, 0);
4144 evas_event_thaw(evas_object_evas_get(wd->obj));
4145 evas_event_thaw_eval(evas_object_evas_get(wd->obj));
4149 elm_genlist_clear(Evas_Object *obj)
4151 _elm_genlist_clear(obj, EINA_FALSE);
4155 elm_genlist_multi_select_set(Evas_Object *obj,
4158 ELM_CHECK_WIDTYPE(obj, widtype);
4159 Widget_Data *wd = elm_widget_data_get(obj);
4165 elm_genlist_multi_select_get(const Evas_Object *obj)
4167 ELM_CHECK_WIDTYPE(obj, widtype) EINA_FALSE;
4168 Widget_Data *wd = elm_widget_data_get(obj);
4169 if (!wd) return EINA_FALSE;
4173 EAPI Elm_Object_Item *
4174 elm_genlist_selected_item_get(const Evas_Object *obj)
4176 ELM_CHECK_WIDTYPE(obj, widtype) NULL;
4177 Widget_Data *wd = elm_widget_data_get(obj);
4178 if (!wd) return NULL;
4179 if (wd->selected) return wd->selected->data;
4183 EAPI const Eina_List *
4184 elm_genlist_selected_items_get(const Evas_Object *obj)
4186 ELM_CHECK_WIDTYPE(obj, widtype) NULL;
4187 Widget_Data *wd = elm_widget_data_get(obj);
4188 if (!wd) return NULL;
4189 return wd->selected;
4193 elm_genlist_realized_items_get(const Evas_Object *obj)
4195 ELM_CHECK_WIDTYPE(obj, widtype) NULL;
4196 Widget_Data *wd = elm_widget_data_get(obj);
4197 Eina_List *list = NULL;
4199 Eina_Bool done = EINA_FALSE;
4200 if (!wd) return NULL;
4201 EINA_INLIST_FOREACH(wd->blocks, itb)
4209 EINA_LIST_FOREACH(itb->items, l, it)
4211 if (it->realized) list = eina_list_append(list, it);
4222 EAPI Elm_Object_Item *
4223 elm_genlist_at_xy_item_get(const Evas_Object *obj,
4228 ELM_CHECK_WIDTYPE(obj, widtype) NULL;
4229 Widget_Data *wd = elm_widget_data_get(obj);
4230 Evas_Coord ox, oy, ow, oh;
4233 if (!wd) return NULL;
4234 evas_object_geometry_get(wd->pan_smart, &ox, &oy, &ow, &oh);
4236 EINA_INLIST_FOREACH(wd->blocks, itb)
4241 if (!ELM_RECTS_INTERSECT(ox + itb->x - itb->wd->pan_x,
4242 oy + itb->y - itb->wd->pan_y,
4243 itb->w, itb->h, x, y, 1, 1))
4245 EINA_LIST_FOREACH(itb->items, l, it)
4247 Evas_Coord itx, ity;
4249 itx = ox + itb->x + it->x - itb->wd->pan_x;
4250 ity = oy + itb->y + it->y - itb->wd->pan_y;
4251 if (ELM_RECTS_INTERSECT(itx, ity, it->item->w, it->item->h, x, y, 1, 1))
4255 if (y <= (ity + (it->item->h / 4))) *posret = -1;
4256 else if (y >= (ity + it->item->h - (it->item->h / 4)))
4260 return (Elm_Object_Item *) it;
4262 lasty = ity + it->item->h;
4267 if (y > lasty) *posret = 1;
4273 EAPI Elm_Object_Item *
4274 elm_genlist_first_item_get(const Evas_Object *obj)
4276 ELM_CHECK_WIDTYPE(obj, widtype) NULL;
4277 Widget_Data *wd = elm_widget_data_get(obj);
4278 if (!wd) return NULL;
4279 if (!wd->items) return NULL;
4280 Elm_Gen_Item *it = ELM_GEN_ITEM_FROM_INLIST(wd->items);
4281 while ((it) && (it->generation < wd->generation))
4282 it = ELM_GEN_ITEM_FROM_INLIST(EINA_INLIST_GET(it)->next);
4283 return (Elm_Object_Item *) it;
4286 EAPI Elm_Object_Item *
4287 elm_genlist_last_item_get(const Evas_Object *obj)
4289 ELM_CHECK_WIDTYPE(obj, widtype) NULL;
4290 Widget_Data *wd = elm_widget_data_get(obj);
4291 if (!wd) return NULL;
4292 if (!wd->items) return NULL;
4293 Elm_Gen_Item *it = ELM_GEN_ITEM_FROM_INLIST(wd->items->last);
4294 while ((it) && (it->generation < wd->generation))
4295 it = ELM_GEN_ITEM_FROM_INLIST(EINA_INLIST_GET(it)->prev);
4296 return (Elm_Object_Item *) it;
4299 EAPI Elm_Object_Item *
4300 elm_genlist_item_next_get(const Elm_Object_Item *it)
4302 ELM_OBJ_ITEM_CHECK_OR_RETURN(it, NULL);
4303 Elm_Gen_Item *_it = (Elm_Gen_Item *) it;
4306 _it = ELM_GEN_ITEM_FROM_INLIST(EINA_INLIST_GET(_it)->next);
4307 if ((_it) && (_it->generation == _it->wd->generation)) break;
4309 return (Elm_Object_Item *) _it;
4312 EAPI Elm_Object_Item *
4313 elm_genlist_item_prev_get(const Elm_Object_Item *it)
4315 ELM_OBJ_ITEM_CHECK_OR_RETURN(it, NULL);
4316 Elm_Gen_Item *_it = (Elm_Gen_Item *) it;
4319 _it = ELM_GEN_ITEM_FROM_INLIST(EINA_INLIST_GET(_it)->prev);
4320 if ((_it) && (_it->generation == _it->wd->generation)) break;
4322 return (Elm_Object_Item *) _it;
4326 elm_genlist_item_genlist_get(const Elm_Object_Item *it)
4328 return elm_object_item_widget_get(it);
4331 EAPI Elm_Object_Item *
4332 elm_genlist_item_parent_get(const Elm_Object_Item *it)
4334 ELM_OBJ_ITEM_CHECK_OR_RETURN(it, NULL);
4335 return (Elm_Object_Item *) ((Elm_Gen_Item *) it)->parent;
4339 elm_genlist_item_subitems_clear(Elm_Object_Item *it)
4341 ELM_OBJ_ITEM_CHECK_OR_RETURN(it);
4342 Eina_List *tl = NULL, *l;
4344 Elm_Object_Item *it2;
4345 _it = (Elm_Gen_Item *) it;
4347 EINA_LIST_FOREACH(_it->item->items, l, it2)
4348 tl = eina_list_append(tl, it2);
4349 EINA_LIST_FREE(tl, it2)
4350 elm_object_item_del(it2);
4354 elm_genlist_item_selected_set(Elm_Object_Item *it,
4357 ELM_OBJ_ITEM_CHECK_OR_RETURN(it);
4358 Elm_Gen_Item *_it = (Elm_Gen_Item *) it;
4359 Widget_Data *wd = _it->wd;
4361 if ((_it->generation < wd->generation) || elm_widget_item_disabled_get(_it))
4363 selected = !!selected;
4364 if (_it->selected == selected) return;
4370 while (wd->selected)
4372 if (_it->unhighlight_cb) _it->unhighlight_cb(wd->selected->data);
4373 _it->unsel_cb(wd->selected->data);
4376 _it->highlight_cb(_it);
4380 if (_it->unhighlight_cb) _it->unhighlight_cb(_it);
4385 elm_genlist_item_selected_get(const Elm_Object_Item *it)
4387 ELM_OBJ_ITEM_CHECK_OR_RETURN(it, EINA_FALSE);
4388 return ((Elm_Gen_Item *) it)->selected;
4392 elm_genlist_item_expanded_set(Elm_Object_Item *it,
4395 ELM_OBJ_ITEM_CHECK_OR_RETURN(it);
4396 Elm_Gen_Item *_it = (Elm_Gen_Item *) it;
4397 if (_it->item->expanded == expanded) return;
4398 _it->item->expanded = expanded;
4399 _it->wd->expanded_item = _it;
4400 if (_it->item->expanded)
4403 edje_object_signal_emit(VIEW(_it), "elm,state,expanded", "elm");
4404 evas_object_smart_callback_call(WIDGET(_it), SIG_EXPANDED, _it);
4405 _it->wd->auto_scroll_enabled = EINA_TRUE;
4410 edje_object_signal_emit(VIEW(_it), "elm,state,contracted", "elm");
4411 evas_object_smart_callback_call(WIDGET(_it), SIG_CONTRACTED, _it);
4412 _it->wd->auto_scroll_enabled = EINA_FALSE;
4417 elm_genlist_item_expanded_get(const Elm_Object_Item *it)
4419 ELM_OBJ_ITEM_CHECK_OR_RETURN(it, EINA_FALSE);
4420 return ((Elm_Gen_Item *) it)->item->expanded;
4424 elm_genlist_item_expanded_depth_get(const Elm_Object_Item *it)
4426 ELM_OBJ_ITEM_CHECK_OR_RETURN(it, 0);
4427 return ((Elm_Gen_Item *) it)->item->expanded_depth;
4431 elm_genlist_item_disabled_set(Elm_Object_Item *it,
4434 elm_object_item_disabled_set(it, disabled);
4438 elm_genlist_item_disabled_get(const Elm_Object_Item *it)
4440 return elm_object_item_disabled_get(it);
4444 elm_genlist_item_display_only_set(Elm_Object_Item *it,
4445 Eina_Bool display_only)
4447 ELM_OBJ_ITEM_CHECK_OR_RETURN(it);
4448 Elm_Gen_Item *_it = (Elm_Gen_Item *) it;
4449 display_only = !!display_only;
4450 if (_it->display_only == display_only) return;
4451 if (_it->generation < _it->wd->generation) return;
4452 _it->display_only = display_only;
4453 _it->item->mincalcd = EINA_FALSE;
4454 _it->item->updateme = EINA_TRUE;
4455 if (_it->item->block) _it->item->block->updateme = EINA_TRUE;
4456 if (_it->wd->update_job) ecore_job_del(_it->wd->update_job);
4457 _it->wd->update_job = ecore_job_add(_update_job, _it->wd);
4461 elm_genlist_item_display_only_get(const Elm_Object_Item *it)
4463 ELM_OBJ_ITEM_CHECK_OR_RETURN(it, EINA_FALSE);
4464 Elm_Gen_Item *_it = (Elm_Gen_Item *) it;
4465 if (_it->generation < _it->wd->generation) return EINA_FALSE;
4466 return _it->display_only;
4470 elm_genlist_item_show(Elm_Object_Item *it)
4472 ELM_OBJ_ITEM_CHECK_OR_RETURN(it);
4473 Elm_Gen_Item *_it = (Elm_Gen_Item *) it;
4474 Evas_Coord gith = 0;
4475 if (_it->generation < _it->wd->generation) return;
4476 if ((_it->item->queued) || (!_it->item->mincalcd))
4478 _it->wd->show_item = _it;
4479 _it->wd->bring_in = EINA_FALSE;
4480 _it->wd->scrollto_type = ELM_GENLIST_ITEM_SCROLLTO_IN;
4481 _it->item->showme = EINA_TRUE;
4484 if (_it->wd->show_item)
4486 _it->wd->show_item->item->showme = EINA_FALSE;
4487 _it->wd->show_item = NULL;
4489 if ((_it->item->group_item) &&
4490 (_it->wd->pan_y > (_it->y + _it->item->block->y)))
4491 gith = _it->item->group_item->item->h;
4492 elm_smart_scroller_child_region_show(_it->wd->scr,
4493 _it->x + _it->item->block->x,
4494 _it->y + _it->item->block->y - gith,
4495 _it->item->block->w, _it->item->h);
4499 elm_genlist_item_promote(Elm_Object_Item *it)
4501 ELM_OBJ_ITEM_CHECK_OR_RETURN(it);
4502 Elm_Gen_Item *_it = (Elm_Gen_Item *) it;
4503 if (_it->generation < _it->wd->generation) return;
4504 _item_move_before(_it,
4505 (Elm_Gen_Item *) elm_genlist_first_item_get(WIDGET(_it)));
4509 elm_genlist_item_demote(Elm_Object_Item *it)
4511 ELM_OBJ_ITEM_CHECK_OR_RETURN(it);
4512 Elm_Gen_Item *_it = (Elm_Gen_Item *) it;
4513 if (_it->generation < _it->wd->generation) return;
4514 _item_move_after(_it,
4515 (Elm_Gen_Item *) elm_genlist_last_item_get(WIDGET(_it)));
4519 elm_genlist_item_bring_in(Elm_Object_Item *it)
4521 ELM_OBJ_ITEM_CHECK_OR_RETURN(it);
4522 Elm_Gen_Item *_it = (Elm_Gen_Item *) it;
4523 Evas_Coord gith = 0;
4524 if (_it->generation < _it->wd->generation) return;
4525 if ((_it->item->queued) || (!_it->item->mincalcd))
4527 _it->wd->show_item = _it;
4528 _it->wd->bring_in = EINA_TRUE;
4529 _it->wd->scrollto_type = ELM_GENLIST_ITEM_SCROLLTO_IN;
4530 _it->item->showme = EINA_TRUE;
4533 if (_it->wd->show_item)
4535 _it->wd->show_item->item->showme = EINA_FALSE;
4536 _it->wd->show_item = NULL;
4538 if ((_it->item->group_item) &&
4539 (_it->wd->pan_y > (_it->y + _it->item->block->y)))
4540 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, _it->item->h);
4548 elm_genlist_item_top_show(Elm_Object_Item *it)
4550 ELM_OBJ_ITEM_CHECK_OR_RETURN(it);
4551 Elm_Gen_Item *_it = (Elm_Gen_Item *) it;
4553 Evas_Coord gith = 0;
4555 if (_it->generation < _it->wd->generation) return;
4556 if ((_it->item->queued) || (!_it->item->mincalcd))
4558 _it->wd->show_item = _it;
4559 _it->wd->bring_in = EINA_FALSE;
4560 _it->wd->scrollto_type = ELM_GENLIST_ITEM_SCROLLTO_TOP;
4561 _it->item->showme = EINA_TRUE;
4564 if (_it->wd->show_item)
4566 _it->wd->show_item->item->showme = EINA_FALSE;
4567 _it->wd->show_item = NULL;
4569 evas_object_geometry_get(_it->wd->pan_smart, NULL, NULL, &ow, &oh);
4570 if (_it->item->group_item) gith = _it->item->group_item->item->h;
4571 elm_smart_scroller_child_region_show(_it->wd->scr,
4572 _it->x + _it->item->block->x,
4573 _it->y + _it->item->block->y - gith,
4574 _it->item->block->w, oh);
4578 elm_genlist_item_top_bring_in(Elm_Object_Item *it)
4580 ELM_OBJ_ITEM_CHECK_OR_RETURN(it);
4581 Elm_Gen_Item *_it = (Elm_Gen_Item *) it;
4583 Evas_Coord gith = 0;
4585 if (_it->generation < _it->wd->generation) return;
4586 if ((_it->item->queued) || (!_it->item->mincalcd))
4588 _it->wd->show_item = _it;
4589 _it->wd->bring_in = EINA_TRUE;
4590 _it->wd->scrollto_type = ELM_GENLIST_ITEM_SCROLLTO_TOP;
4591 _it->item->showme = EINA_TRUE;
4594 if (_it->wd->show_item)
4596 _it->wd->show_item->item->showme = EINA_FALSE;
4597 _it->wd->show_item = NULL;
4599 evas_object_geometry_get(_it->wd->pan_smart, NULL, NULL, &ow, &oh);
4600 if (_it->item->group_item) gith = _it->item->group_item->item->h;
4601 elm_smart_scroller_region_bring_in(_it->wd->scr,
4602 _it->x + _it->item->block->x,
4603 _it->y + _it->item->block->y - gith,
4604 _it->item->block->w, oh);
4608 elm_genlist_item_middle_show(Elm_Object_Item *it)
4610 ELM_OBJ_ITEM_CHECK_OR_RETURN(it);
4611 Elm_Gen_Item *_it = (Elm_Gen_Item *) it;
4614 if (_it->generation < _it->wd->generation) return;
4615 if ((_it->item->queued) || (!_it->item->mincalcd))
4617 _it->wd->show_item = _it;
4618 _it->wd->bring_in = EINA_FALSE;
4619 _it->wd->scrollto_type = ELM_GENLIST_ITEM_SCROLLTO_MIDDLE;
4620 _it->item->showme = EINA_TRUE;
4623 if (_it->wd->show_item)
4625 _it->wd->show_item->item->showme = EINA_FALSE;
4626 _it->wd->show_item = NULL;
4628 evas_object_geometry_get(_it->wd->pan_smart, NULL, NULL, &ow, &oh);
4629 elm_smart_scroller_child_region_show(_it->wd->scr,
4630 _it->x + _it->item->block->x,
4631 _it->y + _it->item->block->y - oh / 2 +
4632 _it->item->h / 2, _it->item->block->w,
4637 elm_genlist_item_middle_bring_in(Elm_Object_Item *it)
4639 ELM_OBJ_ITEM_CHECK_OR_RETURN(it);
4640 Elm_Gen_Item *_it = (Elm_Gen_Item *) it;
4643 if (_it->generation < _it->wd->generation) return;
4644 if ((_it->item->queued) || (!_it->item->mincalcd))
4646 _it->wd->show_item = _it;
4647 _it->wd->bring_in = EINA_TRUE;
4648 _it->wd->scrollto_type = ELM_GENLIST_ITEM_SCROLLTO_MIDDLE;
4649 _it->item->showme = EINA_TRUE;
4652 if (_it->wd->show_item)
4654 _it->wd->show_item->item->showme = EINA_FALSE;
4655 _it->wd->show_item = NULL;
4657 evas_object_geometry_get(_it->wd->pan_smart, NULL, NULL, &ow, &oh);
4658 elm_smart_scroller_region_bring_in(_it->wd->scr,
4659 _it->x + _it->item->block->x,
4660 _it->y + _it->item->block->y - oh / 2 +
4661 _it->item->h / 2, _it->item->block->w,
4666 elm_genlist_item_del(Elm_Object_Item *it)
4668 elm_object_item_del(it);
4672 elm_genlist_item_data_set(Elm_Object_Item *it,
4675 elm_object_item_data_set(it, (void *) data);
4679 elm_genlist_item_data_get(const Elm_Object_Item *it)
4681 return elm_object_item_data_get(it);
4685 elm_genlist_item_icons_orphan(Elm_Object_Item *it)
4687 elm_genlist_item_contents_orphan(it);
4691 elm_genlist_item_contents_orphan(Elm_Object_Item *it)
4693 ELM_OBJ_ITEM_CHECK_OR_RETURN(it);
4695 Evas_Object *content;
4696 EINA_LIST_FREE(((Elm_Gen_Item *) it)->content_objs, content)
4698 elm_widget_sub_object_del(WIDGET(it), content);
4699 evas_object_smart_member_del(content);
4700 evas_object_hide(content);
4704 EAPI const Evas_Object *
4705 elm_genlist_item_object_get(const Elm_Object_Item *it)
4707 ELM_OBJ_ITEM_CHECK_OR_RETURN(it, NULL);
4712 elm_genlist_item_update(Elm_Object_Item *it)
4714 ELM_OBJ_ITEM_CHECK_OR_RETURN(it);
4715 Elm_Gen_Item *_it = (Elm_Gen_Item *) it;
4717 if (!_it->item->block) return;
4718 if (_it->generation < _it->wd->generation) return;
4719 _it->item->mincalcd = EINA_FALSE;
4720 _it->item->updateme = EINA_TRUE;
4721 _it->item->block->updateme = EINA_TRUE;
4722 if (_it->wd->update_job) ecore_job_del(_it->wd->update_job);
4723 _it->wd->update_job = ecore_job_add(_update_job, _it->wd);
4727 elm_genlist_item_fields_update(Elm_Object_Item *it,
4729 Elm_Genlist_Item_Field_Flags itf)
4731 ELM_OBJ_ITEM_CHECK_OR_RETURN(it);
4732 Elm_Gen_Item *_it = (Elm_Gen_Item *) it;
4734 if (!_it->item->block) return;
4735 if (_it->generation < _it->wd->generation) return;
4737 if ((!itf) || (itf & ELM_GENLIST_ITEM_FIELD_LABEL))
4738 _item_text_realize(_it, _it->base.view, &_it->texts, parts);
4739 if ((!itf) || (itf & ELM_GENLIST_ITEM_FIELD_CONTENT))
4741 _it->content_objs = _item_content_unrealize(_it, _it->base.view,
4742 &_it->contents, parts);
4743 _it->content_objs = _item_content_realize(_it, _it->base.view,
4744 &_it->contents, parts);
4746 if ((!itf) || (itf & ELM_GENLIST_ITEM_FIELD_STATE))
4747 _item_state_realize(_it, _it->base.view, &_it->states, parts);
4751 elm_genlist_item_item_class_update(Elm_Object_Item *it,
4752 const Elm_Genlist_Item_Class *itc)
4754 ELM_OBJ_ITEM_CHECK_OR_RETURN(it);
4755 Elm_Gen_Item *_it = (Elm_Gen_Item *) it;
4757 if (!_it->item->block) return;
4758 EINA_SAFETY_ON_NULL_RETURN(itc);
4759 if (_it->generation < _it->wd->generation) return;
4761 _it->item->nocache = EINA_TRUE;
4762 elm_genlist_item_update(it);
4765 EAPI const Elm_Genlist_Item_Class *
4766 elm_genlist_item_item_class_get(const Elm_Object_Item *it)
4768 ELM_OBJ_ITEM_CHECK_OR_RETURN(it, NULL);
4769 Elm_Gen_Item *_it = (Elm_Gen_Item *) it;
4770 if (_it->generation < _it->wd->generation) return NULL;
4774 static Evas_Object *
4775 _elm_genlist_item_label_create(void *data,
4776 Evas_Object *obj __UNUSED__,
4777 Evas_Object *tooltip,
4778 void *it __UNUSED__)
4780 Evas_Object *label = elm_label_add(tooltip);
4783 elm_object_style_set(label, "tooltip");
4784 elm_object_text_set(label, data);
4789 _elm_genlist_item_label_del_cb(void *data,
4790 Evas_Object *obj __UNUSED__,
4791 void *event_info __UNUSED__)
4793 eina_stringshare_del(data);
4797 elm_genlist_item_tooltip_text_set(Elm_Object_Item *it,
4800 ELM_OBJ_ITEM_CHECK_OR_RETURN(it);
4801 text = eina_stringshare_add(text);
4802 elm_genlist_item_tooltip_content_cb_set(it, _elm_genlist_item_label_create,
4804 _elm_genlist_item_label_del_cb);
4808 elm_genlist_item_tooltip_content_cb_set(Elm_Object_Item *it,
4809 Elm_Tooltip_Item_Content_Cb func,
4811 Evas_Smart_Cb del_cb)
4813 ELM_OBJ_ITEM_CHECK_OR_GOTO(it, error);
4814 Elm_Gen_Item *_it = (Elm_Gen_Item *) it;
4816 if ((_it->tooltip.content_cb == func) && (_it->tooltip.data == data))
4819 if (_it->tooltip.del_cb)
4820 _it->tooltip.del_cb((void *) _it->tooltip.data, WIDGET(it), it);
4822 _it->tooltip.content_cb = func;
4823 _it->tooltip.data = data;
4824 _it->tooltip.del_cb = del_cb;
4828 elm_widget_item_tooltip_content_cb_set(_it,
4829 _it->tooltip.content_cb,
4830 _it->tooltip.data, NULL);
4831 elm_widget_item_tooltip_style_set(_it, _it->tooltip.style);
4832 elm_widget_item_tooltip_window_mode_set(_it, _it->tooltip.free_size);
4838 if (del_cb) del_cb((void *)data, NULL, NULL);
4842 elm_genlist_item_tooltip_unset(Elm_Object_Item *it)
4844 ELM_OBJ_ITEM_CHECK_OR_RETURN(it);
4845 Elm_Gen_Item *_it = (Elm_Gen_Item *) it;
4847 if ((VIEW(_it)) && (_it->tooltip.content_cb))
4848 elm_widget_item_tooltip_unset(_it);
4850 if (_it->tooltip.del_cb)
4851 _it->tooltip.del_cb((void *) _it->tooltip.data, WIDGET(_it), _it);
4852 _it->tooltip.del_cb = NULL;
4853 _it->tooltip.content_cb = NULL;
4854 _it->tooltip.data = NULL;
4855 _it->tooltip.free_size = EINA_FALSE;
4856 if (_it->tooltip.style)
4857 elm_genlist_item_tooltip_style_set(it, NULL);
4861 elm_genlist_item_tooltip_style_set(Elm_Object_Item *it,
4864 ELM_OBJ_ITEM_CHECK_OR_RETURN(it);
4865 Elm_Gen_Item *_it = (Elm_Gen_Item *) it;
4867 eina_stringshare_replace(&_it->tooltip.style, style);
4868 if (VIEW(_it)) elm_widget_item_tooltip_style_set(_it, style);
4872 elm_genlist_item_tooltip_style_get(const Elm_Object_Item *it)
4874 return elm_object_item_tooltip_style_get(it);
4878 elm_genlist_item_tooltip_window_mode_set(Elm_Object_Item *it,
4881 ELM_OBJ_ITEM_CHECK_OR_RETURN(it, EINA_FALSE);
4882 Elm_Gen_Item *_it = (Elm_Gen_Item *) it;
4884 _it->tooltip.free_size = disable;
4885 if (VIEW(_it)) return elm_widget_item_tooltip_window_mode_set(_it, disable);
4890 elm_genlist_item_tooltip_window_mode_get(const Elm_Object_Item *it)
4892 return elm_object_tooltip_window_mode_get(VIEW(it));
4896 elm_genlist_item_cursor_set(Elm_Object_Item *it,
4899 ELM_OBJ_ITEM_CHECK_OR_RETURN(it);
4900 Elm_Gen_Item *_it = (Elm_Gen_Item *) it;
4901 eina_stringshare_replace(&_it->mouse_cursor, cursor);
4902 if (VIEW(_it)) elm_widget_item_cursor_set(_it, cursor);
4906 elm_genlist_item_cursor_get(const Elm_Object_Item *it)
4908 ELM_OBJ_ITEM_CHECK_OR_RETURN(it, NULL);
4909 return elm_widget_item_cursor_get(it);
4913 elm_genlist_item_cursor_unset(Elm_Object_Item *it)
4915 ELM_OBJ_ITEM_CHECK_OR_RETURN(it);
4916 Elm_Gen_Item *_it = (Elm_Gen_Item *) it;
4918 if (!_it->mouse_cursor) return;
4920 if (VIEW(_it)) elm_widget_item_cursor_unset(_it);
4922 eina_stringshare_del(_it->mouse_cursor);
4923 _it->mouse_cursor = NULL;
4927 elm_genlist_item_cursor_style_set(Elm_Object_Item *it,
4930 ELM_OBJ_ITEM_CHECK_OR_RETURN(it);
4931 elm_widget_item_cursor_style_set(it, style);
4935 elm_genlist_item_cursor_style_get(const Elm_Object_Item *it)
4937 ELM_OBJ_ITEM_CHECK_OR_RETURN(it, NULL);
4938 return elm_widget_item_cursor_style_get(it);
4942 elm_genlist_item_cursor_engine_only_set(Elm_Object_Item *it,
4943 Eina_Bool engine_only)
4945 ELM_OBJ_ITEM_CHECK_OR_RETURN(it);
4946 elm_widget_item_cursor_engine_only_set(it, engine_only);
4950 elm_genlist_item_cursor_engine_only_get(const Elm_Object_Item *it)
4952 ELM_OBJ_ITEM_CHECK_OR_RETURN(it, EINA_FALSE);
4953 return elm_widget_item_cursor_engine_only_get(it);
4957 elm_genlist_item_index_get(Elm_Object_Item *it)
4959 ELM_OBJ_ITEM_CHECK_OR_RETURN(it, -1);
4960 Elm_Gen_Item *_it = (Elm_Gen_Item *) it;
4962 if (_it->item->block)
4963 return _it->position + _it->item->block->position;
4968 elm_genlist_mode_set(Evas_Object *obj,
4971 ELM_CHECK_WIDTYPE(obj, widtype);
4972 Widget_Data *wd = elm_widget_data_get(obj);
4974 if (wd->mode == mode) return;
4980 elm_genlist_horizontal_set(Evas_Object *obj,
4983 elm_genlist_mode_set(obj, mode);
4987 elm_genlist_horizontal_mode_set(Evas_Object *obj,
4990 elm_genlist_mode_set(obj, mode);
4994 elm_genlist_mode_get(const Evas_Object *obj)
4996 ELM_CHECK_WIDTYPE(obj, widtype) ELM_LIST_LAST;
4997 Widget_Data *wd = elm_widget_data_get(obj);
4998 if (!wd) return ELM_LIST_LAST;
5003 elm_genlist_horizontal_get(const Evas_Object *obj)
5005 return elm_genlist_mode_get(obj);
5009 elm_genlist_horizontal_mode_get(const Evas_Object *obj)
5011 return elm_genlist_mode_get(obj);
5015 elm_genlist_always_select_mode_set(Evas_Object *obj,
5016 Eina_Bool always_select)
5018 ELM_CHECK_WIDTYPE(obj, widtype);
5019 Widget_Data *wd = elm_widget_data_get(obj);
5021 wd->always_select = always_select;
5025 elm_genlist_always_select_mode_get(const Evas_Object *obj)
5027 ELM_CHECK_WIDTYPE(obj, widtype) EINA_FALSE;
5028 Widget_Data *wd = elm_widget_data_get(obj);
5029 if (!wd) return EINA_FALSE;
5030 return wd->always_select;
5034 elm_genlist_no_select_mode_set(Evas_Object *obj,
5035 Eina_Bool no_select)
5037 ELM_CHECK_WIDTYPE(obj, widtype);
5038 Widget_Data *wd = elm_widget_data_get(obj);
5040 wd->no_select = no_select;
5044 elm_genlist_no_select_mode_get(const Evas_Object *obj)
5046 ELM_CHECK_WIDTYPE(obj, widtype) EINA_FALSE;
5047 Widget_Data *wd = elm_widget_data_get(obj);
5048 if (!wd) return EINA_FALSE;
5049 return wd->no_select;
5053 elm_genlist_compress_mode_set(Evas_Object *obj,
5056 ELM_CHECK_WIDTYPE(obj, widtype);
5057 Widget_Data *wd = elm_widget_data_get(obj);
5059 wd->compress = compress;
5060 if (!compress) elm_genlist_homogeneous_set(obj, EINA_FALSE);
5064 elm_genlist_compress_mode_get(const Evas_Object *obj)
5066 ELM_CHECK_WIDTYPE(obj, widtype) EINA_FALSE;
5067 Widget_Data *wd = elm_widget_data_get(obj);
5068 if (!wd) return EINA_FALSE;
5069 return wd->compress;
5073 elm_genlist_height_for_width_mode_set(Evas_Object *obj,
5074 Eina_Bool height_for_width)
5076 ELM_CHECK_WIDTYPE(obj, widtype);
5077 Widget_Data *wd = elm_widget_data_get(obj);
5079 wd->height_for_width = !!height_for_width;
5080 if (wd->height_for_width)
5082 elm_genlist_homogeneous_set(obj, EINA_FALSE);
5083 elm_genlist_compress_mode_set(obj, EINA_TRUE);
5088 elm_genlist_height_for_width_mode_get(const Evas_Object *obj)
5090 ELM_CHECK_WIDTYPE(obj, widtype) EINA_FALSE;
5091 Widget_Data *wd = elm_widget_data_get(obj);
5092 if (!wd) return EINA_FALSE;
5093 return wd->height_for_width;
5097 elm_genlist_bounce_set(Evas_Object *obj,
5101 ELM_CHECK_WIDTYPE(obj, widtype);
5102 Widget_Data *wd = elm_widget_data_get(obj);
5104 elm_smart_scroller_bounce_allow_set(wd->scr, h_bounce, v_bounce);
5105 wd->h_bounce = h_bounce;
5106 wd->v_bounce = v_bounce;
5110 elm_genlist_bounce_get(const Evas_Object *obj,
5111 Eina_Bool *h_bounce,
5112 Eina_Bool *v_bounce)
5114 ELM_CHECK_WIDTYPE(obj, widtype);
5115 Widget_Data *wd = elm_widget_data_get(obj);
5117 if (h_bounce) *h_bounce = wd->h_bounce;
5118 if (v_bounce) *v_bounce = wd->v_bounce;
5122 elm_genlist_homogeneous_set(Evas_Object *obj,
5123 Eina_Bool homogeneous)
5125 ELM_CHECK_WIDTYPE(obj, widtype);
5126 Widget_Data *wd = elm_widget_data_get(obj);
5128 if (homogeneous) elm_genlist_compress_mode_set(obj, EINA_TRUE);
5129 wd->homogeneous = homogeneous;
5133 elm_genlist_homogeneous_get(const Evas_Object *obj)
5135 ELM_CHECK_WIDTYPE(obj, widtype) EINA_FALSE;
5136 Widget_Data *wd = elm_widget_data_get(obj);
5137 if (!wd) return EINA_FALSE;
5138 return wd->homogeneous;
5142 elm_genlist_block_count_set(Evas_Object *obj,
5145 ELM_CHECK_WIDTYPE(obj, widtype);
5146 Widget_Data *wd = elm_widget_data_get(obj);
5148 wd->max_items_per_block = n;
5149 wd->item_cache_max = wd->max_items_per_block * 2;
5150 _item_cache_clean(wd);
5154 elm_genlist_block_count_get(const Evas_Object *obj)
5156 ELM_CHECK_WIDTYPE(obj, widtype) 0;
5157 Widget_Data *wd = elm_widget_data_get(obj);
5159 return wd->max_items_per_block;
5163 elm_genlist_longpress_timeout_set(Evas_Object *obj,
5166 ELM_CHECK_WIDTYPE(obj, widtype);
5167 Widget_Data *wd = elm_widget_data_get(obj);
5169 wd->longpress_timeout = timeout;
5173 elm_genlist_longpress_timeout_get(const Evas_Object *obj)
5175 ELM_CHECK_WIDTYPE(obj, widtype) 0;
5176 Widget_Data *wd = elm_widget_data_get(obj);
5178 return wd->longpress_timeout;
5182 elm_genlist_scroller_policy_set(Evas_Object *obj,
5183 Elm_Scroller_Policy policy_h,
5184 Elm_Scroller_Policy policy_v)
5186 ELM_CHECK_WIDTYPE(obj, widtype);
5187 Widget_Data *wd = elm_widget_data_get(obj);
5188 if ((!wd) || (!wd->scr)) return;
5189 if ((policy_h >= ELM_SCROLLER_POLICY_LAST) ||
5190 (policy_v >= ELM_SCROLLER_POLICY_LAST))
5192 elm_smart_scroller_policy_set(wd->scr, policy_h, policy_v);
5196 elm_genlist_scroller_policy_get(const Evas_Object *obj,
5197 Elm_Scroller_Policy *policy_h,
5198 Elm_Scroller_Policy *policy_v)
5200 ELM_CHECK_WIDTYPE(obj, widtype);
5201 Widget_Data *wd = elm_widget_data_get(obj);
5202 Elm_Smart_Scroller_Policy s_policy_h, s_policy_v;
5203 if ((!wd) || (!wd->scr)) return;
5204 elm_smart_scroller_policy_get(wd->scr, &s_policy_h, &s_policy_v);
5205 if (policy_h) *policy_h = (Elm_Scroller_Policy)s_policy_h;
5206 if (policy_v) *policy_v = (Elm_Scroller_Policy)s_policy_v;
5210 elm_genlist_realized_items_update(Evas_Object *obj)
5212 ELM_CHECK_WIDTYPE(obj, widtype);
5214 Eina_List *list, *l;
5215 Elm_Object_Item *it;
5217 list = elm_genlist_realized_items_get(obj);
5218 EINA_LIST_FOREACH(list, l, it)
5219 elm_genlist_item_update(it);
5223 elm_genlist_item_mode_set(Elm_Object_Item *it,
5224 const char *mode_type,
5227 ELM_OBJ_ITEM_CHECK_OR_RETURN(it);
5228 Elm_Gen_Item *_it = (Elm_Gen_Item *) it;
5230 Widget_Data *wd = _it->wd;
5232 Elm_Object_Item *it2;
5235 if (!mode_type) return;
5236 if ((_it->generation < _it->wd->generation) ||
5237 elm_widget_item_disabled_get(_it)) return;
5239 if ((wd->mode_item == _it) &&
5240 (!strcmp(mode_type, wd->mode_type)) &&
5243 if (!wd->mode_item_style) return;
5244 _it->mode_set = mode_set;
5248 EINA_LIST_FOREACH(wd->selected, l, it2)
5249 if (((Elm_Gen_Item *) it2)->realized)
5250 elm_genlist_item_selected_set(it2, EINA_FALSE);
5254 it2 = elm_genlist_selected_item_get(wd->obj);
5255 if ((it2) && (((Elm_Gen_Item *) it2)->realized))
5256 elm_genlist_item_selected_set(it2, EINA_FALSE);
5259 if (((wd->mode_type) && (strcmp(mode_type, wd->mode_type))) ||
5261 ((_it == wd->mode_item) && (!mode_set)))
5262 _item_mode_unset(wd);
5264 eina_stringshare_replace(&wd->mode_type, mode_type);
5265 if (mode_set) _item_mode_set(_it);
5270 elm_genlist_mode_item_style_get(const Evas_Object *obj)
5272 ELM_CHECK_WIDTYPE(obj, widtype) NULL;
5273 Widget_Data *wd = elm_widget_data_get(obj);
5274 if (!wd) return NULL;
5275 return wd->mode_item_style;
5279 elm_genlist_mode_item_style_set(Evas_Object *obj, const char *style)
5281 ELM_CHECK_WIDTYPE(obj, widtype);
5282 Widget_Data *wd = elm_widget_data_get(obj);
5284 if ((style == wd->mode_item_style) || (style && wd->mode_item_style &&
5285 (!strcmp(style, wd->mode_item_style))))
5287 eina_stringshare_replace(&wd->mode_item_style, style);
5288 elm_genlist_realized_items_update(obj);
5292 elm_genlist_mode_type_get(const Evas_Object *obj)
5294 ELM_CHECK_WIDTYPE(obj, widtype) NULL;
5295 Widget_Data *wd = elm_widget_data_get(obj);
5296 if (!wd) return NULL;
5297 return wd->mode_type;
5300 EAPI const Elm_Object_Item *
5301 elm_genlist_mode_item_get(const Evas_Object *obj)
5303 ELM_CHECK_WIDTYPE(obj, widtype) NULL;
5304 Widget_Data *wd = elm_widget_data_get(obj);
5305 if (!wd) return NULL;
5306 return (Elm_Object_Item *) wd->mode_item;
5310 elm_genlist_reorder_mode_set(Evas_Object *obj,
5311 Eina_Bool reorder_mode)
5313 ELM_CHECK_WIDTYPE(obj, widtype);
5314 Widget_Data *wd = elm_widget_data_get(obj);
5316 wd->reorder_mode = reorder_mode;
5320 elm_genlist_reorder_mode_get(const Evas_Object *obj)
5322 ELM_CHECK_WIDTYPE(obj, widtype) EINA_FALSE;
5323 Widget_Data *wd = elm_widget_data_get(obj);
5324 if (!wd) return EINA_FALSE;
5325 return wd->reorder_mode;
5328 EAPI Elm_Genlist_Item_Flags
5329 elm_genlist_item_flags_get(const Elm_Object_Item *it)
5331 ELM_OBJ_ITEM_CHECK_OR_RETURN(it, ELM_GENLIST_ITEM_MAX);
5332 Elm_Gen_Item *_it = (Elm_Gen_Item *) it;
5333 return _it->item->flags;
5336 EAPI Elm_Genlist_Item_Class *
5337 elm_genlist_item_class_new(void)
5339 Elm_Genlist_Item_Class *itc;
5341 itc = calloc(1, sizeof(Elm_Genlist_Item_Class));
5344 itc->version = ELM_GENLIST_ITEM_CLASS_VERSION;
5346 itc->delete_me = EINA_FALSE;
5352 elm_genlist_item_class_free(Elm_Genlist_Item_Class *itc)
5354 if (itc && (itc->version == ELM_GENLIST_ITEM_CLASS_VERSION))
5356 if (!itc->delete_me) itc->delete_me = EINA_TRUE;
5357 if (itc->refcount > 0) elm_genlist_item_class_unref(itc);
5367 elm_genlist_item_class_ref(Elm_Genlist_Item_Class *itc)
5369 if (itc && (itc->version == ELM_GENLIST_ITEM_CLASS_VERSION))
5372 if (itc->refcount == 0) itc->refcount--;
5377 elm_genlist_item_class_unref(Elm_Genlist_Item_Class *itc)
5379 if (itc && (itc->version == ELM_GENLIST_ITEM_CLASS_VERSION))
5381 if (itc->refcount > 0) itc->refcount--;
5382 if (itc->delete_me && (!itc->refcount))
5383 elm_genlist_item_class_free(itc);
5387 /* for gengrid as of now */
5389 _elm_genlist_page_relative_set(Evas_Object *obj,
5393 Evas_Coord pagesize_h;
5394 Evas_Coord pagesize_v;
5396 ELM_CHECK_WIDTYPE(obj, widtype);
5397 Widget_Data *wd = elm_widget_data_get(obj);
5400 elm_smart_scroller_paging_get(wd->scr, NULL, NULL, &pagesize_h, &pagesize_v);
5401 elm_smart_scroller_paging_set(wd->scr, h_pagerel, v_pagerel, pagesize_h,
5405 /* for gengrid as of now */
5407 _elm_genlist_page_relative_get(const Evas_Object *obj,
5411 ELM_CHECK_WIDTYPE(obj, widtype);
5412 Widget_Data *wd = elm_widget_data_get(obj);
5415 elm_smart_scroller_paging_get(wd->scr, h_pagerel, v_pagerel, NULL, NULL);
5418 /* for gengrid as of now */
5420 _elm_genlist_page_size_set(Evas_Object *obj,
5421 Evas_Coord h_pagesize,
5422 Evas_Coord v_pagesize)
5427 ELM_CHECK_WIDTYPE(obj, widtype);
5428 Widget_Data *wd = elm_widget_data_get(obj);
5430 elm_smart_scroller_paging_get(wd->scr, &pagerel_h, &pagerel_v, NULL, NULL);
5431 elm_smart_scroller_paging_set(wd->scr, pagerel_h, pagerel_v, h_pagesize,
5435 /* for gengrid as of now */
5437 _elm_genlist_current_page_get(const Evas_Object *obj,
5441 ELM_CHECK_WIDTYPE(obj, widtype);
5442 Widget_Data *wd = elm_widget_data_get(obj);
5445 elm_smart_scroller_current_page_get(wd->scr, h_pagenumber, v_pagenumber);
5448 /* for gengrid as of now */
5450 _elm_genlist_last_page_get(const Evas_Object *obj,
5454 ELM_CHECK_WIDTYPE(obj, widtype);
5455 Widget_Data *wd = elm_widget_data_get(obj);
5458 elm_smart_scroller_last_page_get(wd->scr, h_pagenumber, v_pagenumber);
5461 /* for gengrid as of now */
5463 _elm_genlist_page_show(const Evas_Object *obj,
5467 ELM_CHECK_WIDTYPE(obj, widtype);
5468 Widget_Data *wd = elm_widget_data_get(obj);
5471 elm_smart_scroller_page_show(wd->scr, h_pagenumber, v_pagenumber);
5474 /* for gengrid as of now */
5476 _elm_genlist_page_bring_in(const Evas_Object *obj,
5480 ELM_CHECK_WIDTYPE(obj, widtype);
5481 Widget_Data *wd = elm_widget_data_get(obj);
5484 elm_smart_scroller_page_bring_in(wd->scr, h_pagenumber, v_pagenumber);
5488 _elm_genlist_item_unrealize(Elm_Gen_Item *it,
5491 Evas_Object *content;
5493 if (!it->realized) return;
5494 if (it->wd->reorder_it == it) return;
5495 evas_event_freeze(evas_object_evas_get(WIDGET(it)));
5497 evas_object_smart_callback_call(WIDGET(it), SIG_UNREALIZED, it);
5500 ecore_timer_del(it->long_timer);
5501 it->long_timer = NULL;
5504 elm_widget_stringlist_free(it->texts);
5506 elm_widget_stringlist_free(it->contents);
5507 it->contents = NULL;
5508 elm_widget_stringlist_free(it->states);
5511 EINA_LIST_FREE(it->content_objs, content)
5512 evas_object_del(content);
5514 it->unrealize_cb(it);
5516 it->realized = EINA_FALSE;
5517 it->want_unrealize = EINA_FALSE;
5518 evas_event_thaw(evas_object_evas_get(WIDGET(it)));
5519 evas_event_thaw_eval(evas_object_evas_get(WIDGET(it)));
5523 _elm_genlist_item_del_notserious(Elm_Gen_Item *it)
5525 elm_widget_item_pre_notify_del(it);
5526 it->generation = it->wd->generation - 1; /* This means that the item is deleted */
5527 if (it->selected) it->wd->selected = eina_list_remove(it->wd->selected, it);
5529 if (it->itc->func.del)
5530 it->itc->func.del((void *)it->base.data, WIDGET(it));
5534 _elm_genlist_item_del_serious(Elm_Gen_Item *it)
5536 _elm_genlist_item_del_notserious(it);
5537 it->wd->items = eina_inlist_remove(it->wd->items, EINA_INLIST_GET(it));
5538 if (it->tooltip.del_cb)
5539 it->tooltip.del_cb((void *)it->tooltip.data, WIDGET(it), it);
5540 it->wd->walking -= it->walking;
5541 if (it->long_timer) ecore_timer_del(it->long_timer);
5543 it->wd->group_items = eina_list_remove(it->wd->group_items, it);
5547 eina_inlist_sorted_state_free(it->wd->state);
5548 it->wd->state = NULL;
5550 if (it->wd->calc_job) ecore_job_del(it->wd->calc_job);
5551 it->wd->calc_job = ecore_job_add(it->wd->calc_cb, it->wd);
5555 if (it->wd->last_selected_item == (Elm_Object_Item *) it)
5556 it->wd->last_selected_item = NULL;