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->itc->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;
3380 _item_block_new(Widget_Data *wd, Eina_Bool prepend)
3384 itb = calloc(1, sizeof(Item_Block));
3385 if (!itb) return NULL;
3389 wd->blocks = eina_inlist_prepend(wd->blocks, EINA_INLIST_GET(itb));
3390 _item_block_position_update(wd->blocks, 0);
3394 wd->blocks = eina_inlist_append(wd->blocks, EINA_INLIST_GET(itb));
3395 itb->position_update = EINA_TRUE;
3396 if (wd->blocks != EINA_INLIST_GET(itb))
3398 itb->position = ((Item_Block *) (EINA_INLIST_GET(itb)->prev))->position + 1;
3409 _item_block_add(Widget_Data *wd,
3412 Item_Block *itb = NULL;
3419 itb = calloc(1, sizeof(Item_Block));
3420 if (!itb) return EINA_FALSE;
3422 if (!it->item->rel->item->block)
3425 eina_inlist_append(wd->blocks, EINA_INLIST_GET(itb));
3426 itb->items = eina_list_append(itb->items, it);
3427 itb->position_update = EINA_TRUE;
3428 it->position = eina_list_count(itb->items);
3429 it->position_update = EINA_TRUE;
3431 if (wd->blocks != EINA_INLIST_GET(itb))
3433 itb->position = ((Item_Block *) (EINA_INLIST_GET(itb)->prev))->position + 1;
3444 tmp = eina_list_data_find_list(itb->items, it->item->rel);
3445 if (it->item->before)
3447 wd->blocks = eina_inlist_prepend_relative
3448 (wd->blocks, EINA_INLIST_GET(itb),
3449 EINA_INLIST_GET(it->item->rel->item->block));
3451 eina_list_prepend_relative_list(itb->items, it, tmp);
3453 /* Update index from where we prepended */
3454 _item_position_update(eina_list_prev(tmp), it->item->rel->position);
3455 _item_block_position_update(EINA_INLIST_GET(itb),
3456 it->item->rel->item->block->position);
3460 wd->blocks = eina_inlist_append_relative
3461 (wd->blocks, EINA_INLIST_GET(itb),
3462 EINA_INLIST_GET(it->item->rel->item->block));
3464 eina_list_append_relative_list(itb->items, it, tmp);
3466 /* Update block index from where we appended */
3467 _item_position_update(eina_list_next(tmp), it->item->rel->position + 1);
3468 _item_block_position_update(EINA_INLIST_GET(itb),
3469 it->item->rel->item->block->position + 1);
3475 if (it->item->before)
3479 itb = (Item_Block *)(wd->blocks);
3480 if (itb->count >= wd->max_items_per_block)
3482 itb = _item_block_new(wd, EINA_TRUE);
3483 if (!itb) return EINA_FALSE;
3488 itb = _item_block_new(wd, EINA_TRUE);
3489 if (!itb) return EINA_FALSE;
3491 itb->items = eina_list_prepend(itb->items, it);
3493 _item_position_update(itb->items, 0);
3499 itb = (Item_Block *)(wd->blocks->last);
3500 if (itb->count >= wd->max_items_per_block)
3502 itb = _item_block_new(wd, EINA_FALSE);
3503 if (!itb) return EINA_FALSE;
3508 itb = _item_block_new(wd, EINA_FALSE);
3509 if (!itb) return EINA_FALSE;
3511 itb->items = eina_list_append(itb->items, it);
3512 it->position = eina_list_count(itb->items);
3520 if (it->item->rel->item->queued)
3522 /* NOTE: for a strange reason eina_list and eina_inlist don't have the same property
3523 on sorted insertion order, so the queue is not always ordered like the item list.
3524 This lead to issue where we depend on an item that is not yet created. As a quick
3525 work around, we reschedule the calc of the item and stop reordering the list to
3526 prevent any nasty issue to show up here.
3528 wd->queue = eina_list_append(wd->queue, it);
3529 wd->requeued = EINA_TRUE;
3530 it->item->queued = EINA_TRUE;
3533 itb = it->item->rel->item->block;
3534 if (!itb) goto newblock;
3535 tmp = eina_list_data_find_list(itb->items, it->item->rel);
3536 if (it->item->before)
3538 itb->items = eina_list_prepend_relative_list(itb->items, it, tmp);
3539 _item_position_update(eina_list_prev(tmp), it->item->rel->position);
3543 itb->items = eina_list_append_relative_list(itb->items, it, tmp);
3544 _item_position_update(eina_list_next(tmp), it->item->rel->position + 1);
3548 itb->changed = EINA_TRUE;
3549 it->item->block = itb;
3550 if (itb->wd->calc_job) ecore_job_del(itb->wd->calc_job);
3551 itb->wd->calc_job = ecore_job_add(_calc_job, itb->wd);
3554 it->item->rel->relcount--;
3555 if ((it->item->rel->generation < it->wd->generation) && (!it->item->rel->relcount))
3557 _item_del(it->item->rel);
3558 elm_widget_item_free(it->item->rel);
3560 it->item->rel = NULL;
3562 if (itb->count > itb->wd->max_items_per_block)
3567 Eina_Bool done = EINA_FALSE;
3569 newc = itb->count / 2;
3571 if (EINA_INLIST_GET(itb)->prev)
3573 Item_Block *itbp = (Item_Block *)(EINA_INLIST_GET(itb)->prev);
3575 if (itbp->count + newc < wd->max_items_per_block / 2)
3577 /* moving items to previous block */
3578 while ((itb->count > newc) && (itb->items))
3580 it2 = eina_list_data_get(itb->items);
3581 itb->items = eina_list_remove_list(itb->items, itb->items);
3584 itbp->items = eina_list_append(itbp->items, it2);
3585 it2->item->block = itbp;
3593 if (!done && EINA_INLIST_GET(itb)->next)
3595 Item_Block *itbn = (Item_Block *)(EINA_INLIST_GET(itb)->next);
3597 if (itbn->count + newc < wd->max_items_per_block / 2)
3599 /* moving items to next block */
3600 while ((itb->count > newc) && (itb->items))
3604 l = eina_list_last(itb->items);
3605 it2 = eina_list_data_get(l);
3606 itb->items = eina_list_remove_list(itb->items, l);
3609 itbn->items = eina_list_prepend(itbn->items, it2);
3610 it2->item->block = itbn;
3620 /* moving items to new block */
3621 itb2 = calloc(1, sizeof(Item_Block));
3622 if (!itb2) return EINA_FALSE;
3625 eina_inlist_append_relative(wd->blocks, EINA_INLIST_GET(itb2),
3626 EINA_INLIST_GET(itb));
3627 itb2->changed = EINA_TRUE;
3628 while ((itb->count > newc) && (itb->items))
3632 l = eina_list_last(itb->items);
3634 itb->items = eina_list_remove_list(itb->items, l);
3637 itb2->items = eina_list_prepend(itb2->items, it2);
3638 it2->item->block = itb2;
3648 _queue_process(Widget_Data *wd)
3651 Eina_Bool showme = EINA_FALSE;
3654 t0 = ecore_loop_time_get();
3655 //evas_event_freeze(evas_object_evas_get(wd->obj));
3656 for (n = 0; (wd->queue) && (n < 128); n++)
3660 it = eina_list_data_get(wd->queue);
3661 wd->queue = eina_list_remove_list(wd->queue, wd->queue);
3662 it->item->queued = EINA_FALSE;
3663 if (!_item_block_add(wd, it)) continue;
3665 _item_block_realize(it->item->block);
3666 t = ecore_time_get();
3667 if (it->item->block->changed)
3669 showme = _item_block_recalc(it->item->block, it->item->block->num, EINA_TRUE);
3670 it->item->block->changed = 0;
3671 if (wd->pan_changed)
3673 if (wd->calc_job) ecore_job_del(wd->calc_job);
3674 wd->calc_job = NULL;
3676 wd->pan_changed = EINA_FALSE;
3679 if (showme) it->item->block->showme = EINA_TRUE;
3680 /* same as eina_inlist_count > 1 */
3681 if (wd->blocks && wd->blocks->next)
3683 if ((t - t0) > (ecore_animator_frametime_get())) break;
3686 //evas_event_thaw(evas_object_evas_get(wd->obj));
3687 //evas_event_thaw_eval(evas_object_evas_get(wd->obj));
3692 _idle_process(void *data, Eina_Bool *wakeup)
3694 Widget_Data *wd = data;
3697 //static double q_start = 0.0;
3698 //if (q_start == 0.0) q_start = ecore_time_get();
3700 if (_queue_process(wd) > 0) *wakeup = EINA_TRUE;
3704 //printf("PROCESS TIME: %3.3f\n", ecore_time_get() - q_start);
3706 return ECORE_CALLBACK_CANCEL;
3708 return ECORE_CALLBACK_RENEW;
3712 _item_idle_enterer(void *data)
3714 Widget_Data *wd = data;
3715 Eina_Bool wakeup = EINA_FALSE;
3716 Eina_Bool ok = _idle_process(data, &wakeup);
3721 if (wd->calc_job) ecore_job_del(wd->calc_job);
3722 wd->calc_job = ecore_job_add(_calc_job, wd);
3724 if (ok == ECORE_CALLBACK_CANCEL) wd->queue_idle_enterer = NULL;
3729 _item_queue(Widget_Data *wd,
3733 if (it->item->queued) return;
3734 it->item->queued = EINA_TRUE;
3735 if (cb && !wd->requeued)
3736 wd->queue = eina_list_sorted_insert(wd->queue, cb, it);
3738 wd->queue = eina_list_append(wd->queue, it);
3739 // FIXME: why does a freeze then thaw here cause some genlist
3740 // elm_genlist_item_append() to be much much slower?
3741 // evas_event_freeze(evas_object_evas_get(wd->obj));
3742 while ((wd->queue) && ((!wd->blocks) || (!wd->blocks->next)))
3744 if (wd->queue_idle_enterer)
3746 ecore_idle_enterer_del(wd->queue_idle_enterer);
3747 wd->queue_idle_enterer = NULL;
3751 // evas_event_thaw(evas_object_evas_get(wd->obj));
3752 // evas_event_thaw_eval(evas_object_evas_get(wd->obj));
3753 if (!wd->queue_idle_enterer)
3754 wd->queue_idle_enterer = ecore_idle_enterer_add(_item_idle_enterer, wd);
3758 _elm_genlist_item_compare_data(const void *data, const void *data1)
3760 const Elm_Gen_Item *it = data;
3761 const Elm_Gen_Item *item1 = data1;
3763 return it->wd->item_compare_data_cb(it->base.data, item1->base.data);
3767 _elm_genlist_item_compare(const void *data, const void *data1)
3769 const Elm_Gen_Item *it, *item1;
3770 it = ELM_GEN_ITEM_FROM_INLIST(data);
3771 item1 = ELM_GEN_ITEM_FROM_INLIST(data1);
3772 return it->wd->item_compare_cb(it, item1);
3776 _elm_genlist_item_list_compare(const void *data, const void *data1)
3778 const Elm_Gen_Item *it = data;
3779 const Elm_Gen_Item *item1 = data1;
3780 return it->wd->item_compare_cb(it, item1);
3784 _item_move_after(Elm_Gen_Item *it, Elm_Gen_Item *after)
3789 it->wd->items = eina_inlist_remove(it->wd->items, EINA_INLIST_GET(it));
3790 _item_block_del(it);
3792 it->wd->items = eina_inlist_append_relative(it->wd->items, EINA_INLIST_GET(it), EINA_INLIST_GET(after));
3793 it->item->rel = after;
3794 it->item->rel->relcount++;
3795 it->item->before = EINA_FALSE;
3796 if (after->item->group_item) it->item->group_item = after->item->group_item;
3797 _item_queue(it->wd, it, NULL);
3799 evas_object_smart_callback_call(WIDGET(it), SIG_MOVED, it);
3803 _item_move_before(Elm_Gen_Item *it, Elm_Gen_Item *before)
3806 if (!before) return;
3808 it->wd->items = eina_inlist_remove(it->wd->items, EINA_INLIST_GET(it));
3809 _item_block_del(it);
3810 it->wd->items = eina_inlist_prepend_relative(it->wd->items, EINA_INLIST_GET(it), EINA_INLIST_GET(before));
3811 it->item->rel = before;
3812 it->item->rel->relcount++;
3813 it->item->before = EINA_TRUE;
3814 if (before->item->group_item) it->item->group_item = before->item->group_item;
3815 _item_queue(it->wd, it, NULL);
3817 evas_object_smart_callback_call(WIDGET(it), SIG_MOVED, it);
3821 elm_genlist_items_count(const Evas_Object *obj)
3823 ELM_CHECK_WIDTYPE(obj, widtype) 0;
3824 Widget_Data *wd = elm_widget_data_get(obj);
3826 return wd->item_count;
3829 EAPI Elm_Object_Item *
3830 elm_genlist_item_append(Evas_Object *obj,
3831 const Elm_Genlist_Item_Class *itc,
3833 Elm_Object_Item *parent,
3834 Elm_Genlist_Item_Flags flags,
3836 const void *func_data)
3838 ELM_CHECK_WIDTYPE(obj, widtype) NULL;
3839 Widget_Data *wd = elm_widget_data_get(obj);
3840 if (!wd) return NULL;
3841 Elm_Gen_Item *it = _item_new(wd, itc, data, (Elm_Gen_Item *) parent, flags,
3843 if (!it) return NULL;
3847 wd->group_items = eina_list_append(wd->group_items, it);
3848 wd->items = eina_inlist_append(wd->items, EINA_INLIST_GET(it));
3849 it->item->rel = NULL;
3853 Elm_Gen_Item *it2 = NULL;
3854 Eina_List *ll = eina_list_last(it->parent->item->items);
3855 if (ll) it2 = ll->data;
3856 it->parent->item->items = eina_list_append(it->parent->item->items, it);
3857 if (!it2) it2 = it->parent;
3859 eina_inlist_append_relative(wd->items, EINA_INLIST_GET(it),
3860 EINA_INLIST_GET(it2));
3861 it->item->rel = it2;
3862 it->item->rel->relcount++;
3864 it->item->before = EINA_FALSE;
3865 _item_queue(wd, it, NULL);
3866 return (Elm_Object_Item *) it;
3869 EAPI Elm_Object_Item *
3870 elm_genlist_item_prepend(Evas_Object *obj,
3871 const Elm_Genlist_Item_Class *itc,
3873 Elm_Object_Item *parent,
3874 Elm_Genlist_Item_Flags flags,
3876 const void *func_data)
3878 ELM_CHECK_WIDTYPE(obj, widtype) NULL;
3879 Widget_Data *wd = elm_widget_data_get(obj);
3880 if (!wd) return NULL;
3881 Elm_Gen_Item *it = _item_new(wd, itc, data, (Elm_Gen_Item *) parent, flags,
3883 if (!it) return NULL;
3887 wd->group_items = eina_list_prepend(wd->group_items, it);
3888 wd->items = eina_inlist_prepend(wd->items, EINA_INLIST_GET(it));
3889 it->item->rel = NULL;
3893 Elm_Gen_Item *it2 = NULL;
3894 Eina_List *ll = it->parent->item->items;
3895 if (ll) it2 = ll->data;
3896 it->parent->item->items = eina_list_prepend(it->parent->item->items, it);
3897 if (!it2) it2 = it->parent;
3899 eina_inlist_prepend_relative(wd->items, EINA_INLIST_GET(it),
3900 EINA_INLIST_GET(it2));
3901 it->item->rel = it2;
3902 it->item->rel->relcount++;
3904 it->item->before = EINA_TRUE;
3905 _item_queue(wd, it, NULL);
3906 return (Elm_Object_Item *) it;
3909 EAPI Elm_Object_Item *
3910 elm_genlist_item_insert_after(Evas_Object *obj,
3911 const Elm_Genlist_Item_Class *itc,
3913 Elm_Object_Item *parent,
3914 Elm_Object_Item *after,
3915 Elm_Genlist_Item_Flags flags,
3917 const void *func_data)
3919 ELM_CHECK_WIDTYPE(obj, widtype) NULL;
3920 ELM_OBJ_ITEM_CHECK_OR_RETURN(after, NULL);
3921 Widget_Data *wd = elm_widget_data_get(obj);
3922 Elm_Gen_Item *_after = (Elm_Gen_Item *) after;
3923 if (!wd) return NULL;
3924 /* It makes no sense to insert after in an empty list with after != NULL, something really bad is happening in your app. */
3925 EINA_SAFETY_ON_NULL_RETURN_VAL(wd->items, NULL);
3927 Elm_Gen_Item *it = _item_new(wd, itc, data, (Elm_Gen_Item *) parent, flags,
3929 if (!it) return NULL;
3932 if ((it->group) && (_after->group))
3933 wd->group_items = eina_list_append_relative(wd->group_items, it,
3938 it->parent->item->items =
3939 eina_list_append_relative(it->parent->item->items, it, _after);
3941 wd->items = eina_inlist_append_relative(wd->items, EINA_INLIST_GET(it),
3942 EINA_INLIST_GET(_after));
3943 it->item->rel = _after;
3944 it->item->rel->relcount++;
3945 it->item->before = EINA_FALSE;
3946 _item_queue(wd, it, NULL);
3947 return (Elm_Object_Item *) it;
3950 EAPI Elm_Object_Item *
3951 elm_genlist_item_insert_before(Evas_Object *obj,
3952 const Elm_Genlist_Item_Class *itc,
3954 Elm_Object_Item *parent,
3955 Elm_Object_Item *before,
3956 Elm_Genlist_Item_Flags flags,
3958 const void *func_data)
3960 ELM_CHECK_WIDTYPE(obj, widtype) NULL;
3961 ELM_OBJ_ITEM_CHECK_OR_RETURN(before, NULL);
3962 Widget_Data *wd = elm_widget_data_get(obj);
3963 Elm_Gen_Item *_before = (Elm_Gen_Item *) before;
3964 if (!wd) return NULL;
3965 /* It makes no sense to insert before in an empty list with before != NULL, something really bad is happening in your app. */
3966 EINA_SAFETY_ON_NULL_RETURN_VAL(wd->items, NULL);
3968 Elm_Gen_Item *it = _item_new(wd, itc, data, (Elm_Gen_Item *) parent, flags,
3970 if (!it) return NULL;
3973 if (it->group && _before->group)
3974 wd->group_items = eina_list_prepend_relative(wd->group_items, it,
3979 it->parent->item->items =
3980 eina_list_prepend_relative(it->parent->item->items, it, _before);
3982 wd->items = eina_inlist_prepend_relative(wd->items, EINA_INLIST_GET(it),
3983 EINA_INLIST_GET(_before));
3984 it->item->rel = _before;
3985 it->item->rel->relcount++;
3986 it->item->before = EINA_TRUE;
3987 _item_queue(wd, it, NULL);
3988 return (Elm_Object_Item *) it;
3991 EAPI Elm_Object_Item *
3992 elm_genlist_item_direct_sorted_insert(Evas_Object *obj,
3993 const Elm_Genlist_Item_Class *itc,
3995 Elm_Object_Item *parent,
3996 Elm_Genlist_Item_Flags flags,
3997 Eina_Compare_Cb comp,
3999 const void *func_data)
4001 ELM_CHECK_WIDTYPE(obj, widtype) NULL;
4002 Widget_Data *wd = elm_widget_data_get(obj);
4003 if (!wd) return NULL;
4004 Elm_Gen_Item *rel = NULL;
4005 Elm_Gen_Item *it = _item_new(wd, itc, data, (Elm_Gen_Item *) parent, flags,
4007 if (!it) return NULL;
4009 wd->item_compare_cb = comp;
4016 l = eina_list_search_sorted_near_list(it->parent->item->items,
4017 _elm_genlist_item_list_compare, it,
4020 rel = eina_list_data_get(l);
4024 if (cmp_result >= 0)
4026 it->parent->item->items = eina_list_prepend_relative_list(it->parent->item->items, it, l);
4027 wd->items = eina_inlist_prepend_relative(wd->items, EINA_INLIST_GET(it), EINA_INLIST_GET(rel));
4028 it->item->before = EINA_FALSE;
4030 else if (cmp_result < 0)
4032 it->parent->item->items = eina_list_append_relative_list(it->parent->item->items, it, l);
4033 wd->items = eina_inlist_append_relative(wd->items, EINA_INLIST_GET(it), EINA_INLIST_GET(rel));
4034 it->item->before = EINA_TRUE;
4041 wd->state = eina_inlist_sorted_state_new();
4042 eina_inlist_sorted_state_init(wd->state, wd->items);
4043 wd->requeued = EINA_FALSE;
4047 wd->group_items = eina_list_append(wd->group_items, it);
4049 wd->items = eina_inlist_sorted_state_insert(wd->items, EINA_INLIST_GET(it),
4050 _elm_genlist_item_compare, wd->state);
4052 if (EINA_INLIST_GET(it)->next)
4054 rel = ELM_GEN_ITEM_FROM_INLIST(EINA_INLIST_GET(it)->next);
4055 it->item->before = EINA_TRUE;
4057 else if (EINA_INLIST_GET(it)->prev)
4059 rel = ELM_GEN_ITEM_FROM_INLIST(EINA_INLIST_GET(it)->prev);
4060 it->item->before = EINA_FALSE;
4066 it->item->rel = rel;
4067 it->item->rel->relcount++;
4070 _item_queue(wd, it, _elm_genlist_item_list_compare);
4072 return (Elm_Object_Item *) it;
4075 EAPI Elm_Object_Item *
4076 elm_genlist_item_sorted_insert(Evas_Object *obj,
4077 const Elm_Genlist_Item_Class *itc,
4079 Elm_Object_Item *parent,
4080 Elm_Genlist_Item_Flags flags,
4081 Eina_Compare_Cb comp,
4083 const void *func_data)
4085 ELM_CHECK_WIDTYPE(obj, widtype) NULL;
4086 Widget_Data *wd = elm_widget_data_get(obj);
4087 wd->item_compare_data_cb = comp;
4088 return elm_genlist_item_direct_sorted_insert(obj, itc, data, parent, flags,
4089 _elm_genlist_item_compare_data,
4094 _elm_genlist_clear(Evas_Object *obj, Eina_Bool standby)
4096 Eina_Inlist *next, *l;
4098 ELM_CHECK_WIDTYPE(obj, widtype);
4099 Widget_Data *wd = elm_widget_data_get(obj);
4102 if (!standby) wd->generation++;
4106 eina_inlist_sorted_state_free(wd->state);
4110 if (wd->walking > 0)
4115 evas_event_freeze(evas_object_evas_get(wd->obj));
4116 for (l = wd->items, next = l ? l->next : NULL;
4118 l = next, next = next ? next->next : NULL)
4120 Elm_Gen_Item *it = ELM_GEN_ITEM_FROM_INLIST(l);
4122 if (it->generation < wd->generation)
4124 Elm_Gen_Item *itn = NULL;
4126 if (next) itn = ELM_GEN_ITEM_FROM_INLIST(next);
4127 if (itn) itn->walking++; /* prevent early death of subitem */
4129 elm_widget_item_free(it);
4130 if (itn) itn->walking--;
4134 wd->pan_changed = EINA_TRUE;
4137 ecore_job_del(wd->calc_job);
4138 wd->calc_job = NULL;
4140 if (wd->selected) wd->selected = eina_list_free(wd->selected);
4141 if (wd->clear_cb) wd->clear_cb(wd);
4148 evas_object_size_hint_min_set(wd->pan_smart, wd->minw, wd->minh);
4149 evas_object_smart_callback_call(wd->pan_smart, "changed", NULL);
4151 if (wd->sizing_cb) wd->sizing_cb(wd->obj);
4152 elm_smart_scroller_child_region_show(wd->scr, 0, 0, 0, 0);
4153 evas_event_thaw(evas_object_evas_get(wd->obj));
4154 evas_event_thaw_eval(evas_object_evas_get(wd->obj));
4158 elm_genlist_clear(Evas_Object *obj)
4160 _elm_genlist_clear(obj, EINA_FALSE);
4164 elm_genlist_multi_select_set(Evas_Object *obj,
4167 ELM_CHECK_WIDTYPE(obj, widtype);
4168 Widget_Data *wd = elm_widget_data_get(obj);
4174 elm_genlist_multi_select_get(const Evas_Object *obj)
4176 ELM_CHECK_WIDTYPE(obj, widtype) EINA_FALSE;
4177 Widget_Data *wd = elm_widget_data_get(obj);
4178 if (!wd) return EINA_FALSE;
4182 EAPI Elm_Object_Item *
4183 elm_genlist_selected_item_get(const Evas_Object *obj)
4185 ELM_CHECK_WIDTYPE(obj, widtype) NULL;
4186 Widget_Data *wd = elm_widget_data_get(obj);
4187 if (!wd) return NULL;
4188 if (wd->selected) return wd->selected->data;
4192 EAPI const Eina_List *
4193 elm_genlist_selected_items_get(const Evas_Object *obj)
4195 ELM_CHECK_WIDTYPE(obj, widtype) NULL;
4196 Widget_Data *wd = elm_widget_data_get(obj);
4197 if (!wd) return NULL;
4198 return wd->selected;
4202 elm_genlist_realized_items_get(const Evas_Object *obj)
4204 ELM_CHECK_WIDTYPE(obj, widtype) NULL;
4205 Widget_Data *wd = elm_widget_data_get(obj);
4206 Eina_List *list = NULL;
4208 Eina_Bool done = EINA_FALSE;
4209 if (!wd) return NULL;
4210 EINA_INLIST_FOREACH(wd->blocks, itb)
4218 EINA_LIST_FOREACH(itb->items, l, it)
4220 if (it->realized) list = eina_list_append(list, it);
4231 EAPI Elm_Object_Item *
4232 elm_genlist_at_xy_item_get(const Evas_Object *obj,
4237 ELM_CHECK_WIDTYPE(obj, widtype) NULL;
4238 Widget_Data *wd = elm_widget_data_get(obj);
4239 Evas_Coord ox, oy, ow, oh;
4242 if (!wd) return NULL;
4243 evas_object_geometry_get(wd->pan_smart, &ox, &oy, &ow, &oh);
4245 EINA_INLIST_FOREACH(wd->blocks, itb)
4250 if (!ELM_RECTS_INTERSECT(ox + itb->x - itb->wd->pan_x,
4251 oy + itb->y - itb->wd->pan_y,
4252 itb->w, itb->h, x, y, 1, 1))
4254 EINA_LIST_FOREACH(itb->items, l, it)
4256 Evas_Coord itx, ity;
4258 itx = ox + itb->x + it->x - itb->wd->pan_x;
4259 ity = oy + itb->y + it->y - itb->wd->pan_y;
4260 if (ELM_RECTS_INTERSECT(itx, ity, it->item->w, it->item->h, x, y, 1, 1))
4264 if (y <= (ity + (it->item->h / 4))) *posret = -1;
4265 else if (y >= (ity + it->item->h - (it->item->h / 4)))
4269 return (Elm_Object_Item *) it;
4271 lasty = ity + it->item->h;
4276 if (y > lasty) *posret = 1;
4282 EAPI Elm_Object_Item *
4283 elm_genlist_first_item_get(const Evas_Object *obj)
4285 ELM_CHECK_WIDTYPE(obj, widtype) NULL;
4286 Widget_Data *wd = elm_widget_data_get(obj);
4287 if (!wd) return NULL;
4288 if (!wd->items) return NULL;
4289 Elm_Gen_Item *it = ELM_GEN_ITEM_FROM_INLIST(wd->items);
4290 while ((it) && (it->generation < wd->generation))
4291 it = ELM_GEN_ITEM_FROM_INLIST(EINA_INLIST_GET(it)->next);
4292 return (Elm_Object_Item *) it;
4295 EAPI Elm_Object_Item *
4296 elm_genlist_last_item_get(const Evas_Object *obj)
4298 ELM_CHECK_WIDTYPE(obj, widtype) NULL;
4299 Widget_Data *wd = elm_widget_data_get(obj);
4300 if (!wd) return NULL;
4301 if (!wd->items) return NULL;
4302 Elm_Gen_Item *it = ELM_GEN_ITEM_FROM_INLIST(wd->items->last);
4303 while ((it) && (it->generation < wd->generation))
4304 it = ELM_GEN_ITEM_FROM_INLIST(EINA_INLIST_GET(it)->prev);
4305 return (Elm_Object_Item *) it;
4308 EAPI Elm_Object_Item *
4309 elm_genlist_item_next_get(const Elm_Object_Item *it)
4311 ELM_OBJ_ITEM_CHECK_OR_RETURN(it, NULL);
4312 Elm_Gen_Item *_it = (Elm_Gen_Item *) it;
4315 _it = ELM_GEN_ITEM_FROM_INLIST(EINA_INLIST_GET(_it)->next);
4316 if ((_it) && (_it->generation == _it->wd->generation)) break;
4318 return (Elm_Object_Item *) _it;
4321 EAPI Elm_Object_Item *
4322 elm_genlist_item_prev_get(const Elm_Object_Item *it)
4324 ELM_OBJ_ITEM_CHECK_OR_RETURN(it, NULL);
4325 Elm_Gen_Item *_it = (Elm_Gen_Item *) it;
4328 _it = ELM_GEN_ITEM_FROM_INLIST(EINA_INLIST_GET(_it)->prev);
4329 if ((_it) && (_it->generation == _it->wd->generation)) break;
4331 return (Elm_Object_Item *) _it;
4335 elm_genlist_item_genlist_get(const Elm_Object_Item *it)
4337 return elm_object_item_widget_get(it);
4340 EAPI Elm_Object_Item *
4341 elm_genlist_item_parent_get(const Elm_Object_Item *it)
4343 ELM_OBJ_ITEM_CHECK_OR_RETURN(it, NULL);
4344 return (Elm_Object_Item *) ((Elm_Gen_Item *) it)->parent;
4348 elm_genlist_item_subitems_clear(Elm_Object_Item *it)
4350 ELM_OBJ_ITEM_CHECK_OR_RETURN(it);
4351 Eina_List *tl = NULL, *l;
4353 Elm_Object_Item *it2;
4354 _it = (Elm_Gen_Item *) it;
4356 EINA_LIST_FOREACH(_it->item->items, l, it2)
4357 tl = eina_list_append(tl, it2);
4358 EINA_LIST_FREE(tl, it2)
4359 elm_object_item_del(it2);
4363 elm_genlist_item_selected_set(Elm_Object_Item *it,
4366 ELM_OBJ_ITEM_CHECK_OR_RETURN(it);
4367 Elm_Gen_Item *_it = (Elm_Gen_Item *) it;
4368 Widget_Data *wd = _it->wd;
4370 if ((_it->generation < wd->generation) || elm_widget_item_disabled_get(_it))
4372 selected = !!selected;
4373 if (_it->selected == selected) return;
4379 while (wd->selected)
4381 if (_it->unhighlight_cb) _it->unhighlight_cb(wd->selected->data);
4382 _it->unsel_cb(wd->selected->data);
4385 _it->highlight_cb(_it);
4389 if (_it->unhighlight_cb) _it->unhighlight_cb(_it);
4394 elm_genlist_item_selected_get(const Elm_Object_Item *it)
4396 ELM_OBJ_ITEM_CHECK_OR_RETURN(it, EINA_FALSE);
4397 return ((Elm_Gen_Item *) it)->selected;
4401 elm_genlist_item_expanded_set(Elm_Object_Item *it,
4404 ELM_OBJ_ITEM_CHECK_OR_RETURN(it);
4405 Elm_Gen_Item *_it = (Elm_Gen_Item *) it;
4406 if (_it->item->expanded == expanded) return;
4407 _it->item->expanded = expanded;
4408 _it->wd->expanded_item = _it;
4409 if (_it->item->expanded)
4412 edje_object_signal_emit(VIEW(_it), "elm,state,expanded", "elm");
4413 evas_object_smart_callback_call(WIDGET(_it), SIG_EXPANDED, _it);
4414 _it->wd->auto_scroll_enabled = EINA_TRUE;
4419 edje_object_signal_emit(VIEW(_it), "elm,state,contracted", "elm");
4420 evas_object_smart_callback_call(WIDGET(_it), SIG_CONTRACTED, _it);
4421 _it->wd->auto_scroll_enabled = EINA_FALSE;
4426 elm_genlist_item_expanded_get(const Elm_Object_Item *it)
4428 ELM_OBJ_ITEM_CHECK_OR_RETURN(it, EINA_FALSE);
4429 return ((Elm_Gen_Item *) it)->item->expanded;
4433 elm_genlist_item_expanded_depth_get(const Elm_Object_Item *it)
4435 ELM_OBJ_ITEM_CHECK_OR_RETURN(it, 0);
4436 return ((Elm_Gen_Item *) it)->item->expanded_depth;
4440 elm_genlist_item_disabled_set(Elm_Object_Item *it,
4443 elm_object_item_disabled_set(it, disabled);
4447 elm_genlist_item_disabled_get(const Elm_Object_Item *it)
4449 return elm_object_item_disabled_get(it);
4453 elm_genlist_item_display_only_set(Elm_Object_Item *it,
4454 Eina_Bool display_only)
4456 ELM_OBJ_ITEM_CHECK_OR_RETURN(it);
4457 Elm_Gen_Item *_it = (Elm_Gen_Item *) it;
4458 display_only = !!display_only;
4459 if (_it->display_only == display_only) return;
4460 if (_it->generation < _it->wd->generation) return;
4461 _it->display_only = display_only;
4462 _it->item->mincalcd = EINA_FALSE;
4463 _it->item->updateme = EINA_TRUE;
4464 if (_it->item->block) _it->item->block->updateme = EINA_TRUE;
4465 if (_it->wd->update_job) ecore_job_del(_it->wd->update_job);
4466 _it->wd->update_job = ecore_job_add(_update_job, _it->wd);
4470 elm_genlist_item_display_only_get(const Elm_Object_Item *it)
4472 ELM_OBJ_ITEM_CHECK_OR_RETURN(it, EINA_FALSE);
4473 Elm_Gen_Item *_it = (Elm_Gen_Item *) it;
4474 if (_it->generation < _it->wd->generation) return EINA_FALSE;
4475 return _it->display_only;
4479 elm_genlist_item_show(Elm_Object_Item *it)
4481 ELM_OBJ_ITEM_CHECK_OR_RETURN(it);
4482 Elm_Gen_Item *_it = (Elm_Gen_Item *) it;
4483 Evas_Coord gith = 0;
4484 if (_it->generation < _it->wd->generation) return;
4485 if ((_it->item->queued) || (!_it->item->mincalcd))
4487 _it->wd->show_item = _it;
4488 _it->wd->bring_in = EINA_FALSE;
4489 _it->wd->scrollto_type = ELM_GENLIST_ITEM_SCROLLTO_IN;
4490 _it->item->showme = EINA_TRUE;
4493 if (_it->wd->show_item)
4495 _it->wd->show_item->item->showme = EINA_FALSE;
4496 _it->wd->show_item = NULL;
4498 if ((_it->item->group_item) &&
4499 (_it->wd->pan_y > (_it->y + _it->item->block->y)))
4500 gith = _it->item->group_item->item->h;
4501 elm_smart_scroller_child_region_show(_it->wd->scr,
4502 _it->x + _it->item->block->x,
4503 _it->y + _it->item->block->y - gith,
4504 _it->item->block->w, _it->item->h);
4508 elm_genlist_item_promote(Elm_Object_Item *it)
4510 ELM_OBJ_ITEM_CHECK_OR_RETURN(it);
4511 Elm_Gen_Item *_it = (Elm_Gen_Item *) it;
4512 if (_it->generation < _it->wd->generation) return;
4513 _item_move_before(_it,
4514 (Elm_Gen_Item *) elm_genlist_first_item_get(WIDGET(_it)));
4518 elm_genlist_item_demote(Elm_Object_Item *it)
4520 ELM_OBJ_ITEM_CHECK_OR_RETURN(it);
4521 Elm_Gen_Item *_it = (Elm_Gen_Item *) it;
4522 if (_it->generation < _it->wd->generation) return;
4523 _item_move_after(_it,
4524 (Elm_Gen_Item *) elm_genlist_last_item_get(WIDGET(_it)));
4528 elm_genlist_item_bring_in(Elm_Object_Item *it)
4530 ELM_OBJ_ITEM_CHECK_OR_RETURN(it);
4531 Elm_Gen_Item *_it = (Elm_Gen_Item *) it;
4532 Evas_Coord gith = 0;
4533 if (_it->generation < _it->wd->generation) return;
4534 if ((_it->item->queued) || (!_it->item->mincalcd))
4536 _it->wd->show_item = _it;
4537 _it->wd->bring_in = EINA_TRUE;
4538 _it->wd->scrollto_type = ELM_GENLIST_ITEM_SCROLLTO_IN;
4539 _it->item->showme = EINA_TRUE;
4542 if (_it->wd->show_item)
4544 _it->wd->show_item->item->showme = EINA_FALSE;
4545 _it->wd->show_item = NULL;
4547 if ((_it->item->group_item) &&
4548 (_it->wd->pan_y > (_it->y + _it->item->block->y)))
4549 gith = _it->item->group_item->item->h;
4550 elm_smart_scroller_region_bring_in(_it->wd->scr,
4551 _it->x + _it->item->block->x,
4552 _it->y + _it->item->block->y - gith,
4553 _it->item->block->w, _it->item->h);
4557 elm_genlist_item_top_show(Elm_Object_Item *it)
4559 ELM_OBJ_ITEM_CHECK_OR_RETURN(it);
4560 Elm_Gen_Item *_it = (Elm_Gen_Item *) it;
4562 Evas_Coord gith = 0;
4564 if (_it->generation < _it->wd->generation) return;
4565 if ((_it->item->queued) || (!_it->item->mincalcd))
4567 _it->wd->show_item = _it;
4568 _it->wd->bring_in = EINA_FALSE;
4569 _it->wd->scrollto_type = ELM_GENLIST_ITEM_SCROLLTO_TOP;
4570 _it->item->showme = EINA_TRUE;
4573 if (_it->wd->show_item)
4575 _it->wd->show_item->item->showme = EINA_FALSE;
4576 _it->wd->show_item = NULL;
4578 evas_object_geometry_get(_it->wd->pan_smart, NULL, NULL, &ow, &oh);
4579 if (_it->item->group_item) gith = _it->item->group_item->item->h;
4580 elm_smart_scroller_child_region_show(_it->wd->scr,
4581 _it->x + _it->item->block->x,
4582 _it->y + _it->item->block->y - gith,
4583 _it->item->block->w, oh);
4587 elm_genlist_item_top_bring_in(Elm_Object_Item *it)
4589 ELM_OBJ_ITEM_CHECK_OR_RETURN(it);
4590 Elm_Gen_Item *_it = (Elm_Gen_Item *) it;
4592 Evas_Coord gith = 0;
4594 if (_it->generation < _it->wd->generation) return;
4595 if ((_it->item->queued) || (!_it->item->mincalcd))
4597 _it->wd->show_item = _it;
4598 _it->wd->bring_in = EINA_TRUE;
4599 _it->wd->scrollto_type = ELM_GENLIST_ITEM_SCROLLTO_TOP;
4600 _it->item->showme = EINA_TRUE;
4603 if (_it->wd->show_item)
4605 _it->wd->show_item->item->showme = EINA_FALSE;
4606 _it->wd->show_item = NULL;
4608 evas_object_geometry_get(_it->wd->pan_smart, NULL, NULL, &ow, &oh);
4609 if (_it->item->group_item) gith = _it->item->group_item->item->h;
4610 elm_smart_scroller_region_bring_in(_it->wd->scr,
4611 _it->x + _it->item->block->x,
4612 _it->y + _it->item->block->y - gith,
4613 _it->item->block->w, oh);
4617 elm_genlist_item_middle_show(Elm_Object_Item *it)
4619 ELM_OBJ_ITEM_CHECK_OR_RETURN(it);
4620 Elm_Gen_Item *_it = (Elm_Gen_Item *) it;
4623 if (_it->generation < _it->wd->generation) return;
4624 if ((_it->item->queued) || (!_it->item->mincalcd))
4626 _it->wd->show_item = _it;
4627 _it->wd->bring_in = EINA_FALSE;
4628 _it->wd->scrollto_type = ELM_GENLIST_ITEM_SCROLLTO_MIDDLE;
4629 _it->item->showme = EINA_TRUE;
4632 if (_it->wd->show_item)
4634 _it->wd->show_item->item->showme = EINA_FALSE;
4635 _it->wd->show_item = NULL;
4637 evas_object_geometry_get(_it->wd->pan_smart, NULL, NULL, &ow, &oh);
4638 elm_smart_scroller_child_region_show(_it->wd->scr,
4639 _it->x + _it->item->block->x,
4640 _it->y + _it->item->block->y - oh / 2 +
4641 _it->item->h / 2, _it->item->block->w,
4646 elm_genlist_item_middle_bring_in(Elm_Object_Item *it)
4648 ELM_OBJ_ITEM_CHECK_OR_RETURN(it);
4649 Elm_Gen_Item *_it = (Elm_Gen_Item *) it;
4652 if (_it->generation < _it->wd->generation) return;
4653 if ((_it->item->queued) || (!_it->item->mincalcd))
4655 _it->wd->show_item = _it;
4656 _it->wd->bring_in = EINA_TRUE;
4657 _it->wd->scrollto_type = ELM_GENLIST_ITEM_SCROLLTO_MIDDLE;
4658 _it->item->showme = EINA_TRUE;
4661 if (_it->wd->show_item)
4663 _it->wd->show_item->item->showme = EINA_FALSE;
4664 _it->wd->show_item = NULL;
4666 evas_object_geometry_get(_it->wd->pan_smart, NULL, NULL, &ow, &oh);
4667 elm_smart_scroller_region_bring_in(_it->wd->scr,
4668 _it->x + _it->item->block->x,
4669 _it->y + _it->item->block->y - oh / 2 +
4670 _it->item->h / 2, _it->item->block->w,
4675 elm_genlist_item_del(Elm_Object_Item *it)
4677 elm_object_item_del(it);
4681 elm_genlist_item_data_set(Elm_Object_Item *it,
4684 elm_object_item_data_set(it, (void *) data);
4688 elm_genlist_item_data_get(const Elm_Object_Item *it)
4690 return elm_object_item_data_get(it);
4694 elm_genlist_item_icons_orphan(Elm_Object_Item *it)
4696 elm_genlist_item_contents_orphan(it);
4700 elm_genlist_item_contents_orphan(Elm_Object_Item *it)
4702 ELM_OBJ_ITEM_CHECK_OR_RETURN(it);
4704 Evas_Object *content;
4705 EINA_LIST_FREE(((Elm_Gen_Item *) it)->content_objs, content)
4707 elm_widget_sub_object_del(WIDGET(it), content);
4708 evas_object_smart_member_del(content);
4709 evas_object_hide(content);
4713 EAPI const Evas_Object *
4714 elm_genlist_item_object_get(const Elm_Object_Item *it)
4716 ELM_OBJ_ITEM_CHECK_OR_RETURN(it, NULL);
4721 elm_genlist_item_update(Elm_Object_Item *it)
4723 ELM_OBJ_ITEM_CHECK_OR_RETURN(it);
4724 Elm_Gen_Item *_it = (Elm_Gen_Item *) it;
4726 if (!_it->item->block) return;
4727 if (_it->generation < _it->wd->generation) return;
4728 _it->item->mincalcd = EINA_FALSE;
4729 _it->item->updateme = EINA_TRUE;
4730 _it->item->block->updateme = EINA_TRUE;
4731 if (_it->wd->update_job) ecore_job_del(_it->wd->update_job);
4732 _it->wd->update_job = ecore_job_add(_update_job, _it->wd);
4736 elm_genlist_item_fields_update(Elm_Object_Item *it,
4738 Elm_Genlist_Item_Field_Flags itf)
4740 ELM_OBJ_ITEM_CHECK_OR_RETURN(it);
4741 Elm_Gen_Item *_it = (Elm_Gen_Item *) it;
4743 if (!_it->item->block) return;
4744 if (_it->generation < _it->wd->generation) return;
4746 if ((!itf) || (itf & ELM_GENLIST_ITEM_FIELD_LABEL))
4747 _item_text_realize(_it, _it->base.view, &_it->texts, parts);
4748 if ((!itf) || (itf & ELM_GENLIST_ITEM_FIELD_CONTENT))
4750 _it->content_objs = _item_content_unrealize(_it, _it->base.view,
4751 &_it->contents, parts);
4752 _it->content_objs = _item_content_realize(_it, _it->base.view,
4753 &_it->contents, parts);
4755 if ((!itf) || (itf & ELM_GENLIST_ITEM_FIELD_STATE))
4756 _item_state_realize(_it, _it->base.view, &_it->states, parts);
4760 elm_genlist_item_item_class_update(Elm_Object_Item *it,
4761 const Elm_Genlist_Item_Class *itc)
4763 ELM_OBJ_ITEM_CHECK_OR_RETURN(it);
4764 Elm_Gen_Item *_it = (Elm_Gen_Item *) it;
4766 if (!_it->item->block) return;
4767 EINA_SAFETY_ON_NULL_RETURN(itc);
4768 if (_it->generation < _it->wd->generation) return;
4770 _it->item->nocache = EINA_TRUE;
4771 elm_genlist_item_update(it);
4774 EAPI const Elm_Genlist_Item_Class *
4775 elm_genlist_item_item_class_get(const Elm_Object_Item *it)
4777 ELM_OBJ_ITEM_CHECK_OR_RETURN(it, NULL);
4778 Elm_Gen_Item *_it = (Elm_Gen_Item *) it;
4779 if (_it->generation < _it->wd->generation) return NULL;
4783 static Evas_Object *
4784 _elm_genlist_item_label_create(void *data,
4785 Evas_Object *obj __UNUSED__,
4786 Evas_Object *tooltip,
4787 void *it __UNUSED__)
4789 Evas_Object *label = elm_label_add(tooltip);
4792 elm_object_style_set(label, "tooltip");
4793 elm_object_text_set(label, data);
4798 _elm_genlist_item_label_del_cb(void *data,
4799 Evas_Object *obj __UNUSED__,
4800 void *event_info __UNUSED__)
4802 eina_stringshare_del(data);
4806 elm_genlist_item_tooltip_text_set(Elm_Object_Item *it,
4809 ELM_OBJ_ITEM_CHECK_OR_RETURN(it);
4810 text = eina_stringshare_add(text);
4811 elm_genlist_item_tooltip_content_cb_set(it, _elm_genlist_item_label_create,
4813 _elm_genlist_item_label_del_cb);
4817 elm_genlist_item_tooltip_content_cb_set(Elm_Object_Item *it,
4818 Elm_Tooltip_Item_Content_Cb func,
4820 Evas_Smart_Cb del_cb)
4822 ELM_OBJ_ITEM_CHECK_OR_GOTO(it, error);
4823 Elm_Gen_Item *_it = (Elm_Gen_Item *) it;
4825 if ((_it->tooltip.content_cb == func) && (_it->tooltip.data == data))
4828 if (_it->tooltip.del_cb)
4829 _it->tooltip.del_cb((void *) _it->tooltip.data, WIDGET(it), it);
4831 _it->tooltip.content_cb = func;
4832 _it->tooltip.data = data;
4833 _it->tooltip.del_cb = del_cb;
4837 elm_widget_item_tooltip_content_cb_set(_it,
4838 _it->tooltip.content_cb,
4839 _it->tooltip.data, NULL);
4840 elm_widget_item_tooltip_style_set(_it, _it->tooltip.style);
4841 elm_widget_item_tooltip_window_mode_set(_it, _it->tooltip.free_size);
4847 if (del_cb) del_cb((void *)data, NULL, NULL);
4851 elm_genlist_item_tooltip_unset(Elm_Object_Item *it)
4853 ELM_OBJ_ITEM_CHECK_OR_RETURN(it);
4854 Elm_Gen_Item *_it = (Elm_Gen_Item *) it;
4856 if ((VIEW(_it)) && (_it->tooltip.content_cb))
4857 elm_widget_item_tooltip_unset(_it);
4859 if (_it->tooltip.del_cb)
4860 _it->tooltip.del_cb((void *) _it->tooltip.data, WIDGET(_it), _it);
4861 _it->tooltip.del_cb = NULL;
4862 _it->tooltip.content_cb = NULL;
4863 _it->tooltip.data = NULL;
4864 _it->tooltip.free_size = EINA_FALSE;
4865 if (_it->tooltip.style)
4866 elm_genlist_item_tooltip_style_set(it, NULL);
4870 elm_genlist_item_tooltip_style_set(Elm_Object_Item *it,
4873 ELM_OBJ_ITEM_CHECK_OR_RETURN(it);
4874 Elm_Gen_Item *_it = (Elm_Gen_Item *) it;
4876 eina_stringshare_replace(&_it->tooltip.style, style);
4877 if (VIEW(_it)) elm_widget_item_tooltip_style_set(_it, style);
4881 elm_genlist_item_tooltip_style_get(const Elm_Object_Item *it)
4883 return elm_object_item_tooltip_style_get(it);
4887 elm_genlist_item_tooltip_window_mode_set(Elm_Object_Item *it,
4890 ELM_OBJ_ITEM_CHECK_OR_RETURN(it, EINA_FALSE);
4891 Elm_Gen_Item *_it = (Elm_Gen_Item *) it;
4893 _it->tooltip.free_size = disable;
4894 if (VIEW(_it)) return elm_widget_item_tooltip_window_mode_set(_it, disable);
4899 elm_genlist_item_tooltip_window_mode_get(const Elm_Object_Item *it)
4901 return elm_object_tooltip_window_mode_get(VIEW(it));
4905 elm_genlist_item_cursor_set(Elm_Object_Item *it,
4908 ELM_OBJ_ITEM_CHECK_OR_RETURN(it);
4909 Elm_Gen_Item *_it = (Elm_Gen_Item *) it;
4910 eina_stringshare_replace(&_it->mouse_cursor, cursor);
4911 if (VIEW(_it)) elm_widget_item_cursor_set(_it, cursor);
4915 elm_genlist_item_cursor_get(const Elm_Object_Item *it)
4917 ELM_OBJ_ITEM_CHECK_OR_RETURN(it, NULL);
4918 return elm_widget_item_cursor_get(it);
4922 elm_genlist_item_cursor_unset(Elm_Object_Item *it)
4924 ELM_OBJ_ITEM_CHECK_OR_RETURN(it);
4925 Elm_Gen_Item *_it = (Elm_Gen_Item *) it;
4927 if (!_it->mouse_cursor) return;
4929 if (VIEW(_it)) elm_widget_item_cursor_unset(_it);
4931 eina_stringshare_del(_it->mouse_cursor);
4932 _it->mouse_cursor = NULL;
4936 elm_genlist_item_cursor_style_set(Elm_Object_Item *it,
4939 ELM_OBJ_ITEM_CHECK_OR_RETURN(it);
4940 elm_widget_item_cursor_style_set(it, style);
4944 elm_genlist_item_cursor_style_get(const Elm_Object_Item *it)
4946 ELM_OBJ_ITEM_CHECK_OR_RETURN(it, NULL);
4947 return elm_widget_item_cursor_style_get(it);
4951 elm_genlist_item_cursor_engine_only_set(Elm_Object_Item *it,
4952 Eina_Bool engine_only)
4954 ELM_OBJ_ITEM_CHECK_OR_RETURN(it);
4955 elm_widget_item_cursor_engine_only_set(it, engine_only);
4959 elm_genlist_item_cursor_engine_only_get(const Elm_Object_Item *it)
4961 ELM_OBJ_ITEM_CHECK_OR_RETURN(it, EINA_FALSE);
4962 return elm_widget_item_cursor_engine_only_get(it);
4966 elm_genlist_item_index_get(Elm_Object_Item *it)
4968 ELM_OBJ_ITEM_CHECK_OR_RETURN(it, -1);
4969 Elm_Gen_Item *_it = (Elm_Gen_Item *) it;
4971 if (_it->item->block)
4972 return _it->position + _it->item->block->position;
4977 elm_genlist_mode_set(Evas_Object *obj,
4980 ELM_CHECK_WIDTYPE(obj, widtype);
4981 Widget_Data *wd = elm_widget_data_get(obj);
4983 if (wd->mode == mode) return;
4989 elm_genlist_horizontal_set(Evas_Object *obj,
4992 elm_genlist_mode_set(obj, mode);
4996 elm_genlist_horizontal_mode_set(Evas_Object *obj,
4999 elm_genlist_mode_set(obj, mode);
5003 elm_genlist_mode_get(const Evas_Object *obj)
5005 ELM_CHECK_WIDTYPE(obj, widtype) ELM_LIST_LAST;
5006 Widget_Data *wd = elm_widget_data_get(obj);
5007 if (!wd) return ELM_LIST_LAST;
5012 elm_genlist_horizontal_get(const Evas_Object *obj)
5014 return elm_genlist_mode_get(obj);
5018 elm_genlist_horizontal_mode_get(const Evas_Object *obj)
5020 return elm_genlist_mode_get(obj);
5024 elm_genlist_always_select_mode_set(Evas_Object *obj,
5025 Eina_Bool always_select)
5027 ELM_CHECK_WIDTYPE(obj, widtype);
5028 Widget_Data *wd = elm_widget_data_get(obj);
5030 wd->always_select = always_select;
5034 elm_genlist_always_select_mode_get(const Evas_Object *obj)
5036 ELM_CHECK_WIDTYPE(obj, widtype) EINA_FALSE;
5037 Widget_Data *wd = elm_widget_data_get(obj);
5038 if (!wd) return EINA_FALSE;
5039 return wd->always_select;
5043 elm_genlist_no_select_mode_set(Evas_Object *obj,
5044 Eina_Bool no_select)
5046 ELM_CHECK_WIDTYPE(obj, widtype);
5047 Widget_Data *wd = elm_widget_data_get(obj);
5049 wd->no_select = no_select;
5053 elm_genlist_no_select_mode_get(const Evas_Object *obj)
5055 ELM_CHECK_WIDTYPE(obj, widtype) EINA_FALSE;
5056 Widget_Data *wd = elm_widget_data_get(obj);
5057 if (!wd) return EINA_FALSE;
5058 return wd->no_select;
5062 elm_genlist_compress_mode_set(Evas_Object *obj,
5065 ELM_CHECK_WIDTYPE(obj, widtype);
5066 Widget_Data *wd = elm_widget_data_get(obj);
5068 wd->compress = compress;
5069 if (!compress) elm_genlist_homogeneous_set(obj, EINA_FALSE);
5073 elm_genlist_compress_mode_get(const Evas_Object *obj)
5075 ELM_CHECK_WIDTYPE(obj, widtype) EINA_FALSE;
5076 Widget_Data *wd = elm_widget_data_get(obj);
5077 if (!wd) return EINA_FALSE;
5078 return wd->compress;
5082 elm_genlist_height_for_width_mode_set(Evas_Object *obj,
5083 Eina_Bool height_for_width)
5085 ELM_CHECK_WIDTYPE(obj, widtype);
5086 Widget_Data *wd = elm_widget_data_get(obj);
5088 wd->height_for_width = !!height_for_width;
5089 if (wd->height_for_width)
5091 elm_genlist_homogeneous_set(obj, EINA_FALSE);
5092 elm_genlist_compress_mode_set(obj, EINA_TRUE);
5097 elm_genlist_height_for_width_mode_get(const Evas_Object *obj)
5099 ELM_CHECK_WIDTYPE(obj, widtype) EINA_FALSE;
5100 Widget_Data *wd = elm_widget_data_get(obj);
5101 if (!wd) return EINA_FALSE;
5102 return wd->height_for_width;
5106 elm_genlist_bounce_set(Evas_Object *obj,
5110 ELM_CHECK_WIDTYPE(obj, widtype);
5111 Widget_Data *wd = elm_widget_data_get(obj);
5113 elm_smart_scroller_bounce_allow_set(wd->scr, h_bounce, v_bounce);
5114 wd->h_bounce = h_bounce;
5115 wd->v_bounce = v_bounce;
5119 elm_genlist_bounce_get(const Evas_Object *obj,
5120 Eina_Bool *h_bounce,
5121 Eina_Bool *v_bounce)
5123 ELM_CHECK_WIDTYPE(obj, widtype);
5124 Widget_Data *wd = elm_widget_data_get(obj);
5126 if (h_bounce) *h_bounce = wd->h_bounce;
5127 if (v_bounce) *v_bounce = wd->v_bounce;
5131 elm_genlist_homogeneous_set(Evas_Object *obj,
5132 Eina_Bool homogeneous)
5134 ELM_CHECK_WIDTYPE(obj, widtype);
5135 Widget_Data *wd = elm_widget_data_get(obj);
5137 if (homogeneous) elm_genlist_compress_mode_set(obj, EINA_TRUE);
5138 wd->homogeneous = homogeneous;
5142 elm_genlist_homogeneous_get(const Evas_Object *obj)
5144 ELM_CHECK_WIDTYPE(obj, widtype) EINA_FALSE;
5145 Widget_Data *wd = elm_widget_data_get(obj);
5146 if (!wd) return EINA_FALSE;
5147 return wd->homogeneous;
5151 elm_genlist_block_count_set(Evas_Object *obj,
5154 ELM_CHECK_WIDTYPE(obj, widtype);
5155 Widget_Data *wd = elm_widget_data_get(obj);
5157 wd->max_items_per_block = n;
5158 wd->item_cache_max = wd->max_items_per_block * 2;
5159 _item_cache_clean(wd);
5163 elm_genlist_block_count_get(const Evas_Object *obj)
5165 ELM_CHECK_WIDTYPE(obj, widtype) 0;
5166 Widget_Data *wd = elm_widget_data_get(obj);
5168 return wd->max_items_per_block;
5172 elm_genlist_longpress_timeout_set(Evas_Object *obj,
5175 ELM_CHECK_WIDTYPE(obj, widtype);
5176 Widget_Data *wd = elm_widget_data_get(obj);
5178 wd->longpress_timeout = timeout;
5182 elm_genlist_longpress_timeout_get(const Evas_Object *obj)
5184 ELM_CHECK_WIDTYPE(obj, widtype) 0;
5185 Widget_Data *wd = elm_widget_data_get(obj);
5187 return wd->longpress_timeout;
5191 elm_genlist_scroller_policy_set(Evas_Object *obj,
5192 Elm_Scroller_Policy policy_h,
5193 Elm_Scroller_Policy policy_v)
5195 ELM_CHECK_WIDTYPE(obj, widtype);
5196 Widget_Data *wd = elm_widget_data_get(obj);
5197 if ((!wd) || (!wd->scr)) return;
5198 if ((policy_h >= ELM_SCROLLER_POLICY_LAST) ||
5199 (policy_v >= ELM_SCROLLER_POLICY_LAST))
5201 elm_smart_scroller_policy_set(wd->scr, policy_h, policy_v);
5205 elm_genlist_scroller_policy_get(const Evas_Object *obj,
5206 Elm_Scroller_Policy *policy_h,
5207 Elm_Scroller_Policy *policy_v)
5209 ELM_CHECK_WIDTYPE(obj, widtype);
5210 Widget_Data *wd = elm_widget_data_get(obj);
5211 Elm_Smart_Scroller_Policy s_policy_h, s_policy_v;
5212 if ((!wd) || (!wd->scr)) return;
5213 elm_smart_scroller_policy_get(wd->scr, &s_policy_h, &s_policy_v);
5214 if (policy_h) *policy_h = (Elm_Scroller_Policy)s_policy_h;
5215 if (policy_v) *policy_v = (Elm_Scroller_Policy)s_policy_v;
5219 elm_genlist_realized_items_update(Evas_Object *obj)
5221 ELM_CHECK_WIDTYPE(obj, widtype);
5223 Eina_List *list, *l;
5224 Elm_Object_Item *it;
5226 list = elm_genlist_realized_items_get(obj);
5227 EINA_LIST_FOREACH(list, l, it)
5228 elm_genlist_item_update(it);
5232 elm_genlist_item_mode_set(Elm_Object_Item *it,
5233 const char *mode_type,
5236 ELM_OBJ_ITEM_CHECK_OR_RETURN(it);
5237 Elm_Gen_Item *_it = (Elm_Gen_Item *) it;
5239 Widget_Data *wd = _it->wd;
5241 Elm_Object_Item *it2;
5244 if (!mode_type) return;
5245 if ((_it->generation < _it->wd->generation) ||
5246 elm_widget_item_disabled_get(_it)) return;
5248 if ((wd->mode_item == _it) &&
5249 (!strcmp(mode_type, wd->mode_type)) &&
5252 if (!_it->itc->mode_item_style) return;
5253 _it->mode_set = mode_set;
5257 EINA_LIST_FOREACH(wd->selected, l, it2)
5258 if (((Elm_Gen_Item *) it2)->realized)
5259 elm_genlist_item_selected_set(it2, EINA_FALSE);
5263 it2 = elm_genlist_selected_item_get(wd->obj);
5264 if ((it2) && (((Elm_Gen_Item *) it2)->realized))
5265 elm_genlist_item_selected_set(it2, EINA_FALSE);
5268 if (((wd->mode_type) && (strcmp(mode_type, wd->mode_type))) ||
5270 ((_it == wd->mode_item) && (!mode_set)))
5271 _item_mode_unset(wd);
5273 eina_stringshare_replace(&wd->mode_type, mode_type);
5274 if (mode_set) _item_mode_set(_it);
5278 elm_genlist_mode_item_style_get(const Evas_Object *obj)
5280 ELM_CHECK_WIDTYPE(obj, widtype) NULL;
5281 Widget_Data *wd = elm_widget_data_get(obj);
5282 if (!wd) return NULL;
5283 return wd->mode_item->itc->mode_item_style;
5287 elm_genlist_mode_item_style_set(Evas_Object *obj, const char *style)
5289 ELM_CHECK_WIDTYPE(obj, widtype);
5290 Widget_Data *wd = elm_widget_data_get(obj);
5292 if ((style == wd->mode_item->itc->mode_item_style) ||
5293 (style && wd->mode_item->itc->mode_item_style &&
5294 (!strcmp(style, wd->mode_item->itc->mode_item_style))))
5296 eina_stringshare_replace((const char**)&wd->mode_item->itc->mode_item_style, style);
5297 elm_genlist_realized_items_update(obj);
5301 elm_genlist_mode_type_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 wd->mode_type;
5309 EAPI const Elm_Object_Item *
5310 elm_genlist_mode_item_get(const Evas_Object *obj)
5312 ELM_CHECK_WIDTYPE(obj, widtype) NULL;
5313 Widget_Data *wd = elm_widget_data_get(obj);
5314 if (!wd) return NULL;
5315 return (Elm_Object_Item *) wd->mode_item;
5319 elm_genlist_reorder_mode_set(Evas_Object *obj,
5320 Eina_Bool reorder_mode)
5322 ELM_CHECK_WIDTYPE(obj, widtype);
5323 Widget_Data *wd = elm_widget_data_get(obj);
5325 wd->reorder_mode = reorder_mode;
5329 elm_genlist_reorder_mode_get(const Evas_Object *obj)
5331 ELM_CHECK_WIDTYPE(obj, widtype) EINA_FALSE;
5332 Widget_Data *wd = elm_widget_data_get(obj);
5333 if (!wd) return EINA_FALSE;
5334 return wd->reorder_mode;
5337 EAPI Elm_Genlist_Item_Flags
5338 elm_genlist_item_flags_get(const Elm_Object_Item *it)
5340 ELM_OBJ_ITEM_CHECK_OR_RETURN(it, ELM_GENLIST_ITEM_MAX);
5341 Elm_Gen_Item *_it = (Elm_Gen_Item *) it;
5342 return _it->item->flags;
5345 EAPI Elm_Genlist_Item_Class *
5346 elm_genlist_item_class_new(void)
5348 Elm_Genlist_Item_Class *itc;
5350 itc = calloc(1, sizeof(Elm_Genlist_Item_Class));
5353 itc->version = ELM_GENLIST_ITEM_CLASS_VERSION;
5355 itc->delete_me = EINA_FALSE;
5361 elm_genlist_item_class_free(Elm_Genlist_Item_Class *itc)
5363 if (itc && (itc->version == ELM_GENLIST_ITEM_CLASS_VERSION))
5365 if (!itc->delete_me) itc->delete_me = EINA_TRUE;
5366 if (itc->refcount > 0) elm_genlist_item_class_unref(itc);
5376 elm_genlist_item_class_ref(Elm_Genlist_Item_Class *itc)
5378 if (itc && (itc->version == ELM_GENLIST_ITEM_CLASS_VERSION))
5381 if (itc->refcount == 0) itc->refcount--;
5386 elm_genlist_item_class_unref(Elm_Genlist_Item_Class *itc)
5388 if (itc && (itc->version == ELM_GENLIST_ITEM_CLASS_VERSION))
5390 if (itc->refcount > 0) itc->refcount--;
5391 if (itc->delete_me && (!itc->refcount))
5392 elm_genlist_item_class_free(itc);
5396 /* for gengrid as of now */
5398 _elm_genlist_page_relative_set(Evas_Object *obj,
5402 Evas_Coord pagesize_h;
5403 Evas_Coord pagesize_v;
5405 ELM_CHECK_WIDTYPE(obj, widtype);
5406 Widget_Data *wd = elm_widget_data_get(obj);
5409 elm_smart_scroller_paging_get(wd->scr, NULL, NULL, &pagesize_h, &pagesize_v);
5410 elm_smart_scroller_paging_set(wd->scr, h_pagerel, v_pagerel, pagesize_h,
5414 /* for gengrid as of now */
5416 _elm_genlist_page_relative_get(const Evas_Object *obj,
5420 ELM_CHECK_WIDTYPE(obj, widtype);
5421 Widget_Data *wd = elm_widget_data_get(obj);
5424 elm_smart_scroller_paging_get(wd->scr, h_pagerel, v_pagerel, NULL, NULL);
5427 /* for gengrid as of now */
5429 _elm_genlist_page_size_set(Evas_Object *obj,
5430 Evas_Coord h_pagesize,
5431 Evas_Coord v_pagesize)
5436 ELM_CHECK_WIDTYPE(obj, widtype);
5437 Widget_Data *wd = elm_widget_data_get(obj);
5439 elm_smart_scroller_paging_get(wd->scr, &pagerel_h, &pagerel_v, NULL, NULL);
5440 elm_smart_scroller_paging_set(wd->scr, pagerel_h, pagerel_v, h_pagesize,
5444 /* for gengrid as of now */
5446 _elm_genlist_current_page_get(const Evas_Object *obj,
5450 ELM_CHECK_WIDTYPE(obj, widtype);
5451 Widget_Data *wd = elm_widget_data_get(obj);
5454 elm_smart_scroller_current_page_get(wd->scr, h_pagenumber, v_pagenumber);
5457 /* for gengrid as of now */
5459 _elm_genlist_last_page_get(const Evas_Object *obj,
5463 ELM_CHECK_WIDTYPE(obj, widtype);
5464 Widget_Data *wd = elm_widget_data_get(obj);
5467 elm_smart_scroller_last_page_get(wd->scr, h_pagenumber, v_pagenumber);
5470 /* for gengrid as of now */
5472 _elm_genlist_page_show(const Evas_Object *obj,
5476 ELM_CHECK_WIDTYPE(obj, widtype);
5477 Widget_Data *wd = elm_widget_data_get(obj);
5480 elm_smart_scroller_page_show(wd->scr, h_pagenumber, v_pagenumber);
5483 /* for gengrid as of now */
5485 _elm_genlist_page_bring_in(const Evas_Object *obj,
5489 ELM_CHECK_WIDTYPE(obj, widtype);
5490 Widget_Data *wd = elm_widget_data_get(obj);
5493 elm_smart_scroller_page_bring_in(wd->scr, h_pagenumber, v_pagenumber);
5497 _elm_genlist_item_unrealize(Elm_Gen_Item *it,
5500 Evas_Object *content;
5502 if (!it->realized) return;
5503 if (it->wd->reorder_it == it) return;
5504 evas_event_freeze(evas_object_evas_get(WIDGET(it)));
5506 evas_object_smart_callback_call(WIDGET(it), SIG_UNREALIZED, it);
5509 ecore_timer_del(it->long_timer);
5510 it->long_timer = NULL;
5513 elm_widget_stringlist_free(it->texts);
5515 elm_widget_stringlist_free(it->contents);
5516 it->contents = NULL;
5517 elm_widget_stringlist_free(it->states);
5520 EINA_LIST_FREE(it->content_objs, content)
5521 evas_object_del(content);
5523 it->unrealize_cb(it);
5525 it->realized = EINA_FALSE;
5526 it->want_unrealize = EINA_FALSE;
5527 evas_event_thaw(evas_object_evas_get(WIDGET(it)));
5528 evas_event_thaw_eval(evas_object_evas_get(WIDGET(it)));
5532 _elm_genlist_item_del_notserious(Elm_Gen_Item *it)
5534 elm_widget_item_pre_notify_del(it);
5535 it->generation = it->wd->generation - 1; /* This means that the item is deleted */
5536 if (it->selected) it->wd->selected = eina_list_remove(it->wd->selected, it);
5538 if (it->itc->func.del)
5539 it->itc->func.del((void *)it->base.data, WIDGET(it));
5543 _elm_genlist_item_del_serious(Elm_Gen_Item *it)
5545 _elm_genlist_item_del_notserious(it);
5546 it->wd->items = eina_inlist_remove(it->wd->items, EINA_INLIST_GET(it));
5547 if (it->tooltip.del_cb)
5548 it->tooltip.del_cb((void *)it->tooltip.data, WIDGET(it), it);
5549 it->wd->walking -= it->walking;
5550 if (it->long_timer) ecore_timer_del(it->long_timer);
5552 it->wd->group_items = eina_list_remove(it->wd->group_items, it);
5556 eina_inlist_sorted_state_free(it->wd->state);
5557 it->wd->state = NULL;
5559 if (it->wd->calc_job) ecore_job_del(it->wd->calc_job);
5560 it->wd->calc_job = ecore_job_add(it->wd->calc_cb, it->wd);
5564 if (it->wd->last_selected_item == (Elm_Object_Item *) it)
5565 it->wd->last_selected_item = NULL;
5566 it->wd->item_count--;