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 Eina_List *edit_texts, *edit_contents, *edit_states, *edit_content_objs;
37 Ecore_Timer *swipe_timer;
38 Evas_Coord scrl_x, scrl_y, old_scrl_y;
41 Evas_Object *mode_view;
47 Eina_Bool want_realize : 1;
48 Eina_Bool expanded : 1;
49 Eina_Bool mincalcd : 1;
52 Eina_Bool updateme : 1;
53 Eina_Bool nocache : 1;
54 Eina_Bool stacking_even : 1;
55 Eina_Bool nostacking : 1;
56 Eina_Bool move_effect_enabled : 1;
57 Eina_Bool edit_mode_item_realized : 1;
68 Evas_Coord x, y, w, h, minw, minh;
70 int item_position_stamp;
72 Eina_Bool position_update : 1;
73 Eina_Bool want_unrealize : 1;
74 Eina_Bool realized : 1;
75 Eina_Bool changed : 1;
76 Eina_Bool updateme : 1;
78 Eina_Bool must_recalc : 1;
85 Evas_Object *base_view, *spacer;
87 const char *item_style; // it->itc->item_style
88 Eina_Bool tree : 1; // it->group
89 Eina_Bool compress : 1; // it->wd->compress
91 Eina_Bool selected : 1; // it->selected
92 Eina_Bool disabled : 1; // it->disabled
93 Eina_Bool expanded : 1; // it->item->expanded
96 static const char *widtype = NULL;
97 static void _item_cache_zero(Widget_Data *wd);
98 static void _del_hook(Evas_Object *obj);
99 static void _mirrored_set(Evas_Object *obj,
101 static void _theme_hook(Evas_Object *obj);
102 static void _show_region_hook(void *data,
104 static void _sizing_eval(Evas_Object *obj);
105 static void _item_realize(Elm_Gen_Item *it,
108 static void _item_unrealize_cb(Elm_Gen_Item *it);
109 static void _item_block_unrealize(Item_Block *itb);
110 static void _calc_job(void *data);
111 static void _on_focus_hook(void *data,
113 static Eina_Bool _item_multi_select_up(Widget_Data *wd);
114 static Eina_Bool _item_multi_select_down(Widget_Data *wd);
115 static Eina_Bool _item_single_select_up(Widget_Data *wd);
116 static Eina_Bool _item_single_select_down(Widget_Data *wd);
117 static Eina_Bool _event_hook(Evas_Object *obj,
119 Evas_Callback_Type type,
121 static void _signal_emit_hook(Evas_Object *obj,
122 const char *emission,
124 static Eina_Bool _deselect_all_items(Widget_Data *wd);
125 static void _pan_calculate(Evas_Object *obj);
126 static void _pan_max_get(Evas_Object *obj,
129 static void _item_position(Elm_Gen_Item *it,
133 static void _mode_item_realize(Elm_Gen_Item *it);
134 static void _mode_item_unrealize(Elm_Gen_Item *it);
135 static void _item_mode_set(Elm_Gen_Item *it);
136 static void _item_mode_unset(Widget_Data *wd);
137 static void _edit_mode_item_position(Elm_Gen_Item *it, int itx, int ity);
138 static void _edit_mode_item_realize(Elm_Gen_Item *it, Eina_Bool effect_on);
139 static void _edit_mode_item_unrealize(Elm_Gen_Item *it);
140 static void _group_items_recalc(void *data);
141 static void _item_move_after(Elm_Gen_Item *it,
142 Elm_Gen_Item *after);
143 static void _item_move_before(Elm_Gen_Item *it,
144 Elm_Gen_Item *before);
145 static void _item_auto_scroll(Widget_Data *wd);
146 static void _elm_genlist_clear(Evas_Object *obj,
148 static void _pan_child_size_get(Evas_Object *obj,
152 static Evas_Smart_Class _pan_sc = EVAS_SMART_CLASS_INIT_VERSION;
154 static const char SIG_ACTIVATED[] = "activated";
155 static const char SIG_CLICKED_DOUBLE[] = "clicked,double";
156 static const char SIG_SELECTED[] = "selected";
157 static const char SIG_UNSELECTED[] = "unselected";
158 static const char SIG_EXPANDED[] = "expanded";
159 static const char SIG_CONTRACTED[] = "contracted";
160 static const char SIG_EXPAND_REQUEST[] = "expand,request";
161 static const char SIG_CONTRACT_REQUEST[] = "contract,request";
162 static const char SIG_REALIZED[] = "realized";
163 static const char SIG_UNREALIZED[] = "unrealized";
164 static const char SIG_DRAG_START_UP[] = "drag,start,up";
165 static const char SIG_DRAG_START_DOWN[] = "drag,start,down";
166 static const char SIG_DRAG_START_LEFT[] = "drag,start,left";
167 static const char SIG_DRAG_START_RIGHT[] = "drag,start,right";
168 static const char SIG_DRAG_STOP[] = "drag,stop";
169 static const char SIG_DRAG[] = "drag";
170 static const char SIG_LONGPRESSED[] = "longpressed";
171 static const char SIG_SCROLL_ANIM_START[] = "scroll,anim,start";
172 static const char SIG_SCROLL_ANIM_STOP[] = "scroll,anim,stop";
173 static const char SIG_SCROLL_DRAG_START[] = "scroll,drag,start";
174 static const char SIG_SCROLL_DRAG_STOP[] = "scroll,drag,stop";
175 static const char SIG_EDGE_TOP[] = "edge,top";
176 static const char SIG_EDGE_BOTTOM[] = "edge,bottom";
177 static const char SIG_EDGE_LEFT[] = "edge,left";
178 static const char SIG_EDGE_RIGHT[] = "edge,right";
179 static const char SIG_MULTI_SWIPE_LEFT[] = "multi,swipe,left";
180 static const char SIG_MULTI_SWIPE_RIGHT[] = "multi,swipe,right";
181 static const char SIG_MULTI_SWIPE_UP[] = "multi,swipe,up";
182 static const char SIG_MULTI_SWIPE_DOWN[] = "multi,swipe,down";
183 static const char SIG_MULTI_PINCH_OUT[] = "multi,pinch,out";
184 static const char SIG_MULTI_PINCH_IN[] = "multi,pinch,in";
185 static const char SIG_SWIPE[] = "swipe";
186 static const char SIG_MOVED[] = "moved";
187 static const char SIG_INDEX_UPDATE[] = "index,update";
189 static const Evas_Smart_Cb_Description _signals[] = {
190 {SIG_CLICKED_DOUBLE, ""},
193 {SIG_UNSELECTED, ""},
195 {SIG_CONTRACTED, ""},
196 {SIG_EXPAND_REQUEST, ""},
197 {SIG_CONTRACT_REQUEST, ""},
199 {SIG_UNREALIZED, ""},
200 {SIG_DRAG_START_UP, ""},
201 {SIG_DRAG_START_DOWN, ""},
202 {SIG_DRAG_START_LEFT, ""},
203 {SIG_DRAG_START_RIGHT, ""},
206 {SIG_LONGPRESSED, ""},
207 {SIG_SCROLL_ANIM_START, ""},
208 {SIG_SCROLL_ANIM_STOP, ""},
209 {SIG_SCROLL_DRAG_START, ""},
210 {SIG_SCROLL_DRAG_STOP, ""},
212 {SIG_EDGE_BOTTOM, ""},
214 {SIG_EDGE_RIGHT, ""},
215 {SIG_MULTI_SWIPE_LEFT, ""},
216 {SIG_MULTI_SWIPE_RIGHT, ""},
217 {SIG_MULTI_SWIPE_UP, ""},
218 {SIG_MULTI_SWIPE_DOWN, ""},
219 {SIG_MULTI_PINCH_OUT, ""},
220 {SIG_MULTI_PINCH_IN, ""},
227 #undef ELM_CHECK_WIDTYPE
228 #define ELM_CHECK_WIDTYPE(obj, widtype) \
229 if ((!obj) || (!elm_genlist_type_check((obj), __func__))) return
230 #undef ELM_WIDGET_ITEM_WIDTYPE_CHECK_OR_RETURN
231 #define ELM_WIDGET_ITEM_WIDTYPE_CHECK_OR_RETURN(it, ...) \
232 ELM_WIDGET_ITEM_CHECK_OR_RETURN((Elm_Widget_Item *)it, __VA_ARGS__); \
233 ELM_CHECK_WIDTYPE(WIDGET((it)), widtype) __VA_ARGS__;
235 static const char *_gengrid = NULL;
236 static const char *_genlist = NULL;
238 /* THIS FUNCTION IS HACKY AND TEMPORARY!!! */
240 elm_genlist_type_check(const Evas_Object *obj,
243 const char *provided, *expected = "(unknown)";
244 static int abort_on_warn = -1;
245 provided = elm_widget_type_get(obj);
246 if (!_genlist) _genlist = eina_stringshare_add("genlist");
247 if (!_gengrid) _gengrid = eina_stringshare_add("gengrid");
248 if (EINA_LIKELY(provided == _genlist) || EINA_LIKELY(provided == _gengrid))
250 if ((!provided) || (!provided[0]))
252 provided = evas_object_type_get(obj);
253 if ((!provided) || (!provided[0]))
254 provided = "(unknown)";
256 ERR("Passing Object: %p in function: %s, of type: '%s' when expecting type: '%s'", obj, func, provided, expected);
257 if (abort_on_warn == -1)
259 if (getenv("ELM_ERROR_ABORT")) abort_on_warn = 1;
260 else abort_on_warn = 0;
262 if (abort_on_warn == 1) abort();
267 _event_hook(Evas_Object *obj,
268 Evas_Object *src __UNUSED__,
269 Evas_Callback_Type type,
272 if (type != EVAS_CALLBACK_KEY_DOWN) return EINA_FALSE;
273 Evas_Event_Key_Down *ev = event_info;
274 Widget_Data *wd = elm_widget_data_get(obj);
275 Evas_Coord pan_max_x = 0, pan_max_y = 0;
276 if (!wd) return EINA_FALSE;
277 if (!wd->items) return EINA_FALSE;
278 if (ev->event_flags & EVAS_EVENT_FLAG_ON_HOLD) return EINA_FALSE;
279 if (elm_widget_disabled_get(obj)) return EINA_FALSE;
281 Elm_Object_Item *it = NULL;
284 Evas_Coord step_x = 0;
285 Evas_Coord step_y = 0;
288 Evas_Coord page_x = 0;
289 Evas_Coord page_y = 0;
291 elm_smart_scroller_child_pos_get(wd->scr, &x, &y);
292 elm_smart_scroller_step_size_get(wd->scr, &step_x, &step_y);
293 elm_smart_scroller_page_size_get(wd->scr, &page_x, &page_y);
294 elm_smart_scroller_child_viewport_size_get(wd->scr, &v_w, &v_h);
296 if ((!strcmp(ev->keyname, "Left")) || (!strcmp(ev->keyname, "KP_Left")))
300 else if ((!strcmp(ev->keyname, "Right")) || (!strcmp(ev->keyname, "KP_Right")))
304 else if ((!strcmp(ev->keyname, "Up")) || (!strcmp(ev->keyname, "KP_Up")))
306 if (((evas_key_modifier_is_set(ev->modifiers, "Shift")) &&
307 (_item_multi_select_up(wd)))
308 || (_item_single_select_up(wd)))
310 ev->event_flags |= EVAS_EVENT_FLAG_ON_HOLD;
316 else if ((!strcmp(ev->keyname, "Down")) || (!strcmp(ev->keyname, "KP_Down")))
318 if (((evas_key_modifier_is_set(ev->modifiers, "Shift")) &&
319 (_item_multi_select_down(wd)))
320 || (_item_single_select_down(wd)))
322 ev->event_flags |= EVAS_EVENT_FLAG_ON_HOLD;
328 else if ((!strcmp(ev->keyname, "Home")) || (!strcmp(ev->keyname, "KP_Home")))
330 it = elm_genlist_first_item_get(obj);
331 elm_genlist_item_bring_in(it);
332 ev->event_flags |= EVAS_EVENT_FLAG_ON_HOLD;
335 else if ((!strcmp(ev->keyname, "End")) || (!strcmp(ev->keyname, "KP_End")))
337 it = elm_genlist_last_item_get(obj);
338 elm_genlist_item_bring_in(it);
339 ev->event_flags |= EVAS_EVENT_FLAG_ON_HOLD;
342 else if ((!strcmp(ev->keyname, "Prior")) || (!strcmp(ev->keyname, "KP_Prior")))
345 y -= -(page_y * v_h) / 100;
349 else if ((!strcmp(ev->keyname, "Next")) || (!strcmp(ev->keyname, "KP_Next")))
352 y += -(page_y * v_h) / 100;
356 else if (!strcmp(ev->keyname, "Escape"))
358 if (!_deselect_all_items(wd)) return EINA_FALSE;
359 ev->event_flags |= EVAS_EVENT_FLAG_ON_HOLD;
362 else if (((!strcmp(ev->keyname, "Return")) ||
363 (!strcmp(ev->keyname, "KP_Enter")) ||
364 (!strcmp(ev->keyname, "space")))
365 && (!wd->multi) && (wd->selected))
367 it = elm_genlist_selected_item_get(obj);
368 elm_genlist_item_expanded_set(it,
369 !elm_genlist_item_expanded_get(it));
370 evas_object_smart_callback_call(WIDGET(it), SIG_ACTIVATED, it);
372 else return EINA_FALSE;
374 ev->event_flags |= EVAS_EVENT_FLAG_ON_HOLD;
375 _pan_max_get(wd->pan_smart, &pan_max_x, &pan_max_y);
377 if (x > pan_max_x) x = pan_max_x;
379 if (y > pan_max_y) y = pan_max_y;
380 elm_smart_scroller_child_pos_set(wd->scr, x, y);
385 _deselect_all_items(Widget_Data *wd)
387 if (!wd->selected) return EINA_FALSE;
389 elm_genlist_item_selected_set(wd->selected->data, EINA_FALSE);
395 _item_multi_select_up(Widget_Data *wd)
397 if (!wd->selected) return EINA_FALSE;
398 if (!wd->multi) return EINA_FALSE;
400 Elm_Object_Item *prev = elm_genlist_item_prev_get(wd->last_selected_item);
401 if (!prev) return EINA_TRUE;
403 if (elm_genlist_item_selected_get(prev))
405 elm_genlist_item_selected_set(wd->last_selected_item, EINA_FALSE);
406 wd->last_selected_item = prev;
407 elm_genlist_item_show(wd->last_selected_item);
411 elm_genlist_item_selected_set(prev, EINA_TRUE);
412 elm_genlist_item_show(prev);
418 _item_multi_select_down(Widget_Data *wd)
420 if (!wd->selected) return EINA_FALSE;
421 if (!wd->multi) return EINA_FALSE;
423 Elm_Object_Item *next;
424 next = elm_genlist_item_next_get(wd->last_selected_item);
425 if (!next) return EINA_TRUE;
427 if (elm_genlist_item_selected_get(next))
429 elm_genlist_item_selected_set(wd->last_selected_item, EINA_FALSE);
430 wd->last_selected_item = next;
431 elm_genlist_item_show(wd->last_selected_item);
435 elm_genlist_item_selected_set(next, EINA_TRUE);
436 elm_genlist_item_show(next);
442 _item_single_select_up(Widget_Data *wd)
447 prev = ELM_GEN_ITEM_FROM_INLIST(wd->items->last);
448 while ((prev) && (prev->generation < wd->generation))
449 prev = ELM_GEN_ITEM_FROM_INLIST(EINA_INLIST_GET(prev)->prev);
451 else prev = (Elm_Gen_Item *) elm_genlist_item_prev_get(wd->last_selected_item);
453 if (!prev) return EINA_FALSE;
455 _deselect_all_items(wd);
457 elm_genlist_item_selected_set((Elm_Object_Item *) prev, EINA_TRUE);
458 elm_genlist_item_show((Elm_Object_Item *) prev);
463 _item_single_select_down(Widget_Data *wd)
468 next = ELM_GEN_ITEM_FROM_INLIST(wd->items);
469 while ((next) && (next->generation < wd->generation))
470 next = ELM_GEN_ITEM_FROM_INLIST(EINA_INLIST_GET(next)->next);
472 else next = (Elm_Gen_Item *) elm_genlist_item_next_get(wd->last_selected_item);
474 if (!next) return EINA_FALSE;
476 _deselect_all_items(wd);
478 elm_genlist_item_selected_set((Elm_Object_Item *) next, EINA_TRUE);
479 elm_genlist_item_show((Elm_Object_Item *) next);
484 _on_focus_hook(void *data __UNUSED__,
487 Widget_Data *wd = elm_widget_data_get(obj);
489 if (elm_widget_focus_get(obj))
491 elm_object_signal_emit(wd->obj, "elm,action,focus", "elm");
492 evas_object_focus_set(wd->obj, EINA_TRUE);
493 if ((wd->selected) && (!wd->last_selected_item))
494 wd->last_selected_item = eina_list_data_get(wd->selected);
498 elm_object_signal_emit(wd->obj, "elm,action,unfocus", "elm");
499 evas_object_focus_set(wd->obj, EINA_FALSE);
504 _del_hook(Evas_Object *obj)
506 Widget_Data *wd = elm_widget_data_get(obj);
508 _item_cache_zero(wd);
509 if (wd->calc_job) ecore_job_del(wd->calc_job);
510 if (wd->update_job) ecore_job_del(wd->update_job);
511 if (wd->queue_idle_enterer) ecore_idle_enterer_del(wd->queue_idle_enterer);
512 if (wd->must_recalc_idler) ecore_idler_del(wd->must_recalc_idler);
513 if (wd->multi_timer) ecore_timer_del(wd->multi_timer);
514 if (wd->mode_type) eina_stringshare_del(wd->mode_type);
515 if (wd->scr_hold_timer) ecore_timer_del(wd->scr_hold_timer);
520 _del_pre_hook(Evas_Object *obj)
522 Widget_Data *wd = elm_widget_data_get(obj);
524 if (wd->edit_mode) elm_genlist_edit_mode_set(wd->obj, EINA_FALSE);
525 elm_genlist_clear(obj);
526 evas_object_del(wd->pan_smart);
527 wd->pan_smart = NULL;
531 _mirrored_set(Evas_Object *obj,
534 Widget_Data *wd = elm_widget_data_get(obj);
536 _item_cache_zero(wd);
537 elm_smart_scroller_mirrored_set(wd->scr, rtl);
541 _theme_hook(Evas_Object *obj)
543 Widget_Data *wd = elm_widget_data_get(obj);
546 evas_event_freeze(evas_object_evas_get(wd->obj));
547 _item_cache_zero(wd);
548 _elm_widget_mirrored_reload(obj);
549 _mirrored_set(obj, elm_widget_mirrored_get(obj));
550 elm_smart_scroller_object_theme_set(obj, wd->scr, "genlist", "base",
551 elm_widget_style_get(obj));
552 edje_object_scale_set(wd->scr, elm_widget_scale_get(obj) * _elm_config->scale);
553 wd->item_width = wd->item_height = 0;
554 wd->group_item_width = wd->group_item_height = 0;
555 wd->minw = wd->minh = wd->realminw = 0;
556 EINA_INLIST_FOREACH(wd->blocks, itb)
561 if (itb->realized) _item_block_unrealize(itb);
562 EINA_LIST_FOREACH(itb->items, l, it)
563 it->item->mincalcd = EINA_FALSE;
565 itb->changed = EINA_TRUE;
567 if (wd->calc_job) ecore_job_del(wd->calc_job);
568 wd->calc_job = ecore_job_add(_calc_job, wd);
570 evas_event_thaw(evas_object_evas_get(wd->obj));
571 evas_event_thaw_eval(evas_object_evas_get(wd->obj));
575 _show_region_hook(void *data,
578 Widget_Data *wd = elm_widget_data_get(data);
579 Evas_Coord x, y, w, h;
581 elm_widget_show_region_get(obj, &x, &y, &w, &h);
582 //x & y are screen coordinates, Add with pan coordinates
585 elm_smart_scroller_child_region_show(wd->scr, x, y, w, h);
589 _translate_hook(Evas_Object *obj)
591 evas_object_smart_callback_call(obj, "language,changed", NULL);
595 _sizing_eval(Evas_Object *obj)
597 Widget_Data *wd = elm_widget_data_get(obj);
598 Evas_Coord minw = -1, minh = -1, maxw = -1, maxh = -1;
600 evas_object_size_hint_min_get(wd->scr, &minw, &minh);
601 evas_object_size_hint_max_get(wd->scr, &maxw, &maxh);
603 if (wd->height_for_width)
607 elm_smart_scroller_child_viewport_size_get(wd->scr, &vw, &vh);
608 if ((vw != 0) && (vw != wd->prev_viewport_w))
612 wd->prev_viewport_w = vw;
613 EINA_INLIST_FOREACH(wd->blocks, itb)
615 itb->must_recalc = EINA_TRUE;
617 if (wd->calc_job) ecore_job_del(wd->calc_job);
618 wd->calc_job = ecore_job_add(_calc_job, wd);
621 if (wd->mode == ELM_LIST_LIMIT)
627 elm_smart_scroller_child_viewport_size_get(wd->scr, &vmw, &vmh);
628 edje_object_size_min_calc
629 (elm_smart_scroller_edje_object_get(wd->scr), &vmw, &vmh);
636 edje_object_size_min_calc
637 (elm_smart_scroller_edje_object_get(wd->scr), &vmw, &vmh);
641 evas_object_size_hint_min_set(obj, minw, minh);
642 evas_object_size_hint_max_set(obj, maxw, maxh);
646 _signal_emit_hook(Evas_Object *obj,
647 const char *emission,
650 Widget_Data *wd = elm_widget_data_get(obj);
651 edje_object_signal_emit(elm_smart_scroller_edje_object_get(wd->scr),
656 _item_highlight(Elm_Gen_Item *it)
658 const char *selectraise;
659 if ((it->wd->no_select) || (it->generation < it->wd->generation) ||
660 (it->highlighted) || elm_widget_item_disabled_get(it) ||
661 (it->display_only) || (it->item->mode_view))
663 edje_object_signal_emit(VIEW(it), "elm,state,selected", "elm");
664 if (it->edit_obj) edje_object_signal_emit(it->edit_obj, "elm,state,selected", "elm");
665 selectraise = edje_object_data_get(VIEW(it), "selectraise");
666 if ((selectraise) && (!strcmp(selectraise, "on")))
668 if (it->edit_obj) evas_object_raise(it->edit_obj);
669 else evas_object_raise(VIEW(it));
670 if ((it->item->group_item) && (it->item->group_item->realized))
671 evas_object_raise(it->item->VIEW(group_item));
673 it->highlighted = EINA_TRUE;
677 _item_unhighlight(Elm_Gen_Item *it)
679 if ((it->generation < it->wd->generation) || (!it->highlighted)) return;
680 edje_object_signal_emit(VIEW(it), "elm,state,unselected", "elm");
681 if (it->edit_obj) edje_object_signal_emit(it->edit_obj, "elm,state,unselected", "elm");
682 if (!it->item->nostacking)
684 if ((it->item->order_num_in & 0x1) ^ it->item->stacking_even)
686 if (it->edit_obj) evas_object_lower(it->edit_obj);
687 else evas_object_lower(VIEW(it));
691 if (it->edit_obj) evas_object_raise(it->edit_obj);
692 else evas_object_raise(VIEW(it));
695 it->highlighted = EINA_FALSE;
699 _item_block_position_update(Eina_Inlist *list, int idx)
703 EINA_INLIST_FOREACH(list, tmp)
705 tmp->position = idx++;
706 tmp->position_update = EINA_TRUE;
711 _item_position_update(Eina_List *list, int idx)
716 EINA_LIST_FOREACH(list, l, it)
718 it->position = idx++;
719 it->position_update = EINA_TRUE;
724 _item_block_del(Elm_Gen_Item *it)
727 Item_Block *itb = it->item->block;
729 itb->items = eina_list_remove(itb->items, it);
731 itb->changed = EINA_TRUE;
732 if (it->wd->calc_job) ecore_job_del(it->wd->calc_job);
733 it->wd->calc_job = ecore_job_add(_calc_job, it->wd);
736 il = EINA_INLIST_GET(itb);
737 Item_Block *itbn = (Item_Block *)(il->next);
739 it->parent->item->items = eina_list_remove(it->parent->item->items, it);
742 _item_block_position_update(il->next, itb->position);
743 it->wd->blocks = eina_inlist_remove(it->wd->blocks, il);
746 if (itbn) itbn->changed = EINA_TRUE;
750 if (itb->count < itb->wd->max_items_per_block/2)
752 il = EINA_INLIST_GET(itb);
753 Item_Block *itbp = (Item_Block *)(il->prev);
754 Item_Block *itbn = (Item_Block *)(il->next);
755 if ((itbp) && ((itbp->count + itb->count) < itb->wd->max_items_per_block + itb->wd->max_items_per_block/2))
759 EINA_LIST_FREE(itb->items, it2)
761 it2->item->block = itbp;
762 itbp->items = eina_list_append(itbp->items, it2);
764 itbp->changed = EINA_TRUE;
766 _item_block_position_update(EINA_INLIST_GET(itb)->next,
768 it->wd->blocks = eina_inlist_remove(it->wd->blocks,
769 EINA_INLIST_GET(itb));
772 else if ((itbn) && ((itbn->count + itb->count) < itb->wd->max_items_per_block + itb->wd->max_items_per_block/2))
776 Eina_List *last = eina_list_last(itb->items);
777 Elm_Gen_Item *it2 = last->data;
779 it2->item->block = itbn;
780 itb->items = eina_list_remove_list(itb->items, last);
781 itbn->items = eina_list_prepend(itbn->items, it2);
783 itbn->changed = EINA_TRUE;
785 _item_block_position_update(EINA_INLIST_GET(itb)->next,
788 eina_inlist_remove(it->wd->blocks, EINA_INLIST_GET(itb));
796 _item_del(Elm_Gen_Item *it)
798 Evas_Object *obj = WIDGET(it);
800 evas_event_freeze(evas_object_evas_get(obj));
801 elm_genlist_item_subitems_clear((Elm_Object_Item *) it);
802 if (it->wd->show_item == it) it->wd->show_item = NULL;
803 if (it->realized) _elm_genlist_item_unrealize(it, EINA_FALSE);
804 if (it->item->edit_mode_item_realized) _edit_mode_item_unrealize(it);
805 if (it->item->block) _item_block_del(it);
806 if (it->item->queued)
807 it->wd->queue = eina_list_remove(it->wd->queue, it);
808 if (it->wd->anchor_item == it)
810 it->wd->anchor_item = ELM_GEN_ITEM_FROM_INLIST(EINA_INLIST_GET(it)->next);
811 if (!it->wd->anchor_item)
812 it->wd->anchor_item = ELM_GEN_ITEM_FROM_INLIST(EINA_INLIST_GET(it)->prev);
815 it->parent->item->items = eina_list_remove(it->parent->item->items, it);
816 if (it->item->swipe_timer) ecore_timer_del(it->item->swipe_timer);
817 _elm_genlist_item_del_serious(it);
818 elm_genlist_item_class_unref((Elm_Genlist_Item_Class *)it->itc);
819 evas_event_thaw(evas_object_evas_get(obj));
820 evas_event_thaw_eval(evas_object_evas_get(obj));
824 _clear_cb(Widget_Data *wd)
826 wd->anchor_item = NULL;
829 Item_Block *itb = (Item_Block *)(wd->blocks);
831 wd->blocks = eina_inlist_remove(wd->blocks, wd->blocks);
832 if (itb->items) eina_list_free(itb->items);
835 if (wd->queue_idle_enterer)
837 ecore_idle_enterer_del(wd->queue_idle_enterer);
838 wd->queue_idle_enterer = NULL;
840 if (wd->must_recalc_idler)
842 ecore_idler_del(wd->must_recalc_idler);
843 wd->must_recalc_idler = NULL;
845 if (wd->queue) wd->queue = eina_list_free(wd->queue);
846 if (wd->reorder_move_animator)
848 ecore_animator_del(wd->reorder_move_animator);
849 wd->reorder_move_animator = NULL;
851 wd->show_item = NULL;
852 wd->reorder_old_pan_y = 0;
856 _item_unselect(Elm_Gen_Item *it)
858 if ((it->generation < it->wd->generation) || (!it->selected)) return;
859 it->selected = EINA_FALSE;
860 it->wd->selected = eina_list_remove(it->wd->selected, it);
861 evas_object_smart_callback_call(WIDGET(it), SIG_UNSELECTED, it);
865 _mouse_move(void *data,
866 Evas *evas __UNUSED__,
870 Elm_Gen_Item *it = data;
871 Evas_Event_Mouse_Move *ev = event_info;
872 Evas_Coord minw = 0, minh = 0, x, y, dx, dy, adx, ady;
873 Evas_Coord ox, oy, ow, oh, it_scrl_y, y_pos;
875 if (ev->event_flags & EVAS_EVENT_FLAG_ON_HOLD)
877 if (!it->wd->on_hold)
879 it->wd->on_hold = EINA_TRUE;
880 if (!it->wd->wasselected)
882 _item_unhighlight(it);
887 if (it->wd->multitouched)
889 it->wd->cur_x = ev->cur.canvas.x;
890 it->wd->cur_y = ev->cur.canvas.y;
893 if ((it->dragging) && (it->down))
895 if (it->wd->movements == SWIPE_MOVES) it->wd->swipe = EINA_TRUE;
898 it->wd->history[it->wd->movements].x = ev->cur.canvas.x;
899 it->wd->history[it->wd->movements].y = ev->cur.canvas.y;
900 if (abs((it->wd->history[it->wd->movements].x -
901 it->wd->history[0].x)) > 40)
902 it->wd->swipe = EINA_TRUE;
908 ecore_timer_del(it->long_timer);
909 it->long_timer = NULL;
911 evas_object_smart_callback_call(WIDGET(it), SIG_DRAG, it);
914 if ((!it->down) /* || (it->wd->on_hold)*/ || (it->wd->longpressed))
918 ecore_timer_del(it->long_timer);
919 it->long_timer = NULL;
921 if ((it->wd->reorder_mode) && (it->wd->reorder_it))
923 evas_object_geometry_get(it->wd->pan_smart, &ox, &oy, &ow, &oh);
924 it_scrl_y = ev->cur.canvas.y - it->wd->reorder_it->dy;
926 if (!it->wd->reorder_start_y)
927 it->wd->reorder_start_y = it->item->block->y + it->y;
931 else if (it_scrl_y + it->wd->reorder_it->item->h > oy + oh)
932 y_pos = oy + oh - it->wd->reorder_it->item->h;
937 _item_position(it, it->edit_obj, it->item->scrl_x, y_pos);
939 _item_position(it, VIEW(it), it->item->scrl_x, y_pos);
941 if (it->wd->calc_job) ecore_job_del(it->wd->calc_job);
942 it->wd->calc_job = ecore_job_add(_calc_job, it->wd);
946 if (!it->display_only)
947 elm_coords_finger_size_adjust(1, &minw, 1, &minh);
948 evas_object_geometry_get(obj, &x, &y, NULL, NULL);
949 x = ev->cur.canvas.x - x;
950 y = ev->cur.canvas.y - y;
953 if (adx < 0) adx = -dx;
956 if (ady < 0) ady = -dy;
959 if ((adx > minw) || (ady > minh))
961 it->dragging = EINA_TRUE;
964 ecore_timer_del(it->long_timer);
965 it->long_timer = NULL;
967 if (!it->wd->wasselected)
969 _item_unhighlight(it);
975 evas_object_smart_callback_call(WIDGET(it),
976 SIG_DRAG_START_UP, it);
980 evas_object_smart_callback_call(WIDGET(it),
981 SIG_DRAG_START_LEFT, it);
983 evas_object_smart_callback_call(WIDGET(it),
984 SIG_DRAG_START_RIGHT, it);
990 evas_object_smart_callback_call(WIDGET(it),
991 SIG_DRAG_START_DOWN, it);
995 evas_object_smart_callback_call(WIDGET(it),
996 SIG_DRAG_START_LEFT, it);
998 evas_object_smart_callback_call(WIDGET(it),
999 SIG_DRAG_START_RIGHT, it);
1006 _long_press(void *data)
1008 Elm_Gen_Item *it = data, *it_tmp;
1009 Eina_List *list, *l;
1011 it->long_timer = NULL;
1012 if (elm_widget_item_disabled_get(it) || (it->dragging) || (it->display_only))
1013 return ECORE_CALLBACK_CANCEL;
1014 it->wd->longpressed = EINA_TRUE;
1015 evas_object_smart_callback_call(WIDGET(it), SIG_LONGPRESSED, it);
1016 if ((it->wd->reorder_mode) && (!it->group))
1018 it->wd->reorder_it = it;
1019 it->wd->reorder_start_y = 0;
1021 evas_object_raise(it->edit_obj);
1023 evas_object_raise(VIEW(it));
1025 elm_smart_scroller_hold_set(it->wd->scr, EINA_TRUE);
1026 elm_smart_scroller_bounce_allow_set(it->wd->scr, EINA_FALSE, EINA_FALSE);
1028 list = elm_genlist_realized_items_get(it->wd->obj);
1029 EINA_LIST_FOREACH(list, l, it_tmp)
1031 if (it != it_tmp) _item_unselect(it_tmp);
1033 if (elm_genlist_item_expanded_get((Elm_Object_Item *) it))
1035 elm_genlist_item_expanded_set((Elm_Object_Item *) it, EINA_FALSE);
1036 return ECORE_CALLBACK_RENEW;
1039 if (!it->wd->edit_mode)
1040 edje_object_signal_emit(VIEW(it), "elm,state,reorder,enabled", "elm");
1042 return ECORE_CALLBACK_CANCEL;
1046 _swipe(Elm_Gen_Item *it)
1051 if ((it->display_only) || elm_widget_item_disabled_get(it)) return;
1052 it->wd->swipe = EINA_FALSE;
1053 for (i = 0; i < it->wd->movements; i++)
1055 sum += it->wd->history[i].x;
1056 if (abs(it->wd->history[0].y - it->wd->history[i].y) > 10) return;
1059 sum /= it->wd->movements;
1060 if (abs(sum - it->wd->history[0].x) <= 10) return;
1061 evas_object_smart_callback_call(WIDGET(it), SIG_SWIPE, it);
1065 _swipe_cancel(void *data)
1067 Elm_Gen_Item *it = data;
1069 if (!it) return ECORE_CALLBACK_CANCEL;
1070 it->wd->swipe = EINA_FALSE;
1071 it->wd->movements = 0;
1072 return ECORE_CALLBACK_RENEW;
1076 _multi_cancel(void *data)
1078 Widget_Data *wd = data;
1080 if (!wd) return ECORE_CALLBACK_CANCEL;
1081 wd->multi_timeout = EINA_TRUE;
1082 return ECORE_CALLBACK_RENEW;
1086 _multi_touch_gesture_eval(void *data)
1088 Elm_Gen_Item *it = data;
1090 it->wd->multitouched = EINA_FALSE;
1091 if (it->wd->multi_timer)
1093 ecore_timer_del(it->wd->multi_timer);
1094 it->wd->multi_timer = NULL;
1096 if (it->wd->multi_timeout)
1098 it->wd->multi_timeout = EINA_FALSE;
1102 Evas_Coord minw = 0, minh = 0;
1103 Evas_Coord off_x, off_y, off_mx, off_my;
1105 elm_coords_finger_size_adjust(1, &minw, 1, &minh);
1106 off_x = abs(it->wd->cur_x - it->wd->prev_x);
1107 off_y = abs(it->wd->cur_y - it->wd->prev_y);
1108 off_mx = abs(it->wd->cur_mx - it->wd->prev_mx);
1109 off_my = abs(it->wd->cur_my - it->wd->prev_my);
1111 if (((off_x > minw) || (off_y > minh)) && ((off_mx > minw) || (off_my > minh)))
1113 if ((off_x + off_mx) > (off_y + off_my))
1115 if ((it->wd->cur_x > it->wd->prev_x) && (it->wd->cur_mx > it->wd->prev_mx))
1116 evas_object_smart_callback_call(WIDGET(it),
1117 SIG_MULTI_SWIPE_RIGHT, it);
1118 else if ((it->wd->cur_x < it->wd->prev_x) && (it->wd->cur_mx < it->wd->prev_mx))
1119 evas_object_smart_callback_call(WIDGET(it),
1120 SIG_MULTI_SWIPE_LEFT, it);
1121 else if (abs(it->wd->cur_x - it->wd->cur_mx) > abs(it->wd->prev_x - it->wd->prev_mx))
1122 evas_object_smart_callback_call(WIDGET(it),
1123 SIG_MULTI_PINCH_OUT, it);
1125 evas_object_smart_callback_call(WIDGET(it),
1126 SIG_MULTI_PINCH_IN, it);
1130 if ((it->wd->cur_y > it->wd->prev_y) && (it->wd->cur_my > it->wd->prev_my))
1131 evas_object_smart_callback_call(WIDGET(it),
1132 SIG_MULTI_SWIPE_DOWN, it);
1133 else if ((it->wd->cur_y < it->wd->prev_y) && (it->wd->cur_my < it->wd->prev_my))
1134 evas_object_smart_callback_call(WIDGET(it),
1135 SIG_MULTI_SWIPE_UP, it);
1136 else if (abs(it->wd->cur_y - it->wd->cur_my) > abs(it->wd->prev_y - it->wd->prev_my))
1137 evas_object_smart_callback_call(WIDGET(it),
1138 SIG_MULTI_PINCH_OUT, it);
1140 evas_object_smart_callback_call(WIDGET(it),
1141 SIG_MULTI_PINCH_IN, it);
1144 it->wd->multi_timeout = EINA_FALSE;
1148 _multi_down(void *data,
1149 Evas *evas __UNUSED__,
1150 Evas_Object *obj __UNUSED__,
1153 Elm_Gen_Item *it = data;
1154 Evas_Event_Multi_Down *ev = event_info;
1156 if ((it->wd->multi_device != 0) || (it->wd->multitouched) || (it->wd->multi_timeout)) return;
1157 it->wd->multi_device = ev->device;
1158 it->wd->multi_down = EINA_TRUE;
1159 it->wd->multitouched = EINA_TRUE;
1160 it->wd->prev_mx = ev->canvas.x;
1161 it->wd->prev_my = ev->canvas.y;
1162 if (!it->wd->wasselected)
1164 _item_unhighlight(it);
1167 it->wd->wasselected = EINA_FALSE;
1168 it->wd->longpressed = EINA_FALSE;
1171 ecore_timer_del(it->long_timer);
1172 it->long_timer = NULL;
1176 it->dragging = EINA_FALSE;
1177 evas_object_smart_callback_call(WIDGET(it), SIG_DRAG_STOP, it);
1179 if (it->item->swipe_timer)
1181 ecore_timer_del(it->item->swipe_timer);
1182 it->item->swipe_timer = NULL;
1184 if (it->wd->on_hold)
1186 it->wd->swipe = EINA_FALSE;
1187 it->wd->movements = 0;
1188 it->wd->on_hold = EINA_FALSE;
1193 _multi_up(void *data,
1194 Evas *evas __UNUSED__,
1195 Evas_Object *obj __UNUSED__,
1198 Elm_Gen_Item *it = data;
1199 Evas_Event_Multi_Up *ev = event_info;
1201 if (it->wd->multi_device != ev->device) return;
1202 it->wd->multi_device = 0;
1203 it->wd->multi_down = EINA_FALSE;
1204 if (it->wd->mouse_down) return;
1205 _multi_touch_gesture_eval(data);
1209 _multi_move(void *data,
1210 Evas *evas __UNUSED__,
1211 Evas_Object *obj __UNUSED__,
1214 Elm_Gen_Item *it = data;
1215 Evas_Event_Multi_Move *ev = event_info;
1217 if (it->wd->multi_device != ev->device) return;
1218 it->wd->cur_mx = ev->cur.canvas.x;
1219 it->wd->cur_my = ev->cur.canvas.y;
1223 _mouse_down(void *data,
1224 Evas *evas __UNUSED__,
1228 Elm_Gen_Item *it = data;
1229 Evas_Event_Mouse_Down *ev = event_info;
1232 if (ev->button != 1) return;
1233 if (ev->event_flags & EVAS_EVENT_FLAG_ON_HOLD)
1235 it->wd->on_hold = EINA_TRUE;
1238 it->down = EINA_TRUE;
1239 it->dragging = EINA_FALSE;
1240 evas_object_geometry_get(obj, &x, &y, NULL, NULL);
1241 it->dx = ev->canvas.x - x;
1242 it->dy = ev->canvas.y - y;
1243 it->wd->mouse_down = EINA_TRUE;
1244 if (!it->wd->multitouched)
1246 it->wd->prev_x = ev->canvas.x;
1247 it->wd->prev_y = ev->canvas.y;
1248 it->wd->multi_timeout = EINA_FALSE;
1249 if (it->wd->multi_timer) ecore_timer_del(it->wd->multi_timer);
1250 it->wd->multi_timer = ecore_timer_add(1, _multi_cancel, it->wd);
1252 it->wd->longpressed = EINA_FALSE;
1253 if (ev->event_flags & EVAS_EVENT_FLAG_ON_HOLD) it->wd->on_hold = EINA_TRUE;
1254 else it->wd->on_hold = EINA_FALSE;
1255 if (it->wd->on_hold) return;
1256 it->wd->wasselected = it->selected;
1257 _item_highlight(it);
1258 if (ev->flags & EVAS_BUTTON_DOUBLE_CLICK)
1259 if ((!elm_widget_item_disabled_get(it)) && (!it->display_only))
1261 evas_object_smart_callback_call(WIDGET(it), SIG_CLICKED_DOUBLE, it);
1262 evas_object_smart_callback_call(WIDGET(it), SIG_ACTIVATED, it);
1264 if (it->long_timer) ecore_timer_del(it->long_timer);
1265 if (it->item->swipe_timer) ecore_timer_del(it->item->swipe_timer);
1266 it->item->swipe_timer = ecore_timer_add(0.4, _swipe_cancel, it);
1268 it->long_timer = ecore_timer_add(it->wd->longpress_timeout, _long_press,
1271 it->long_timer = NULL;
1272 it->wd->swipe = EINA_FALSE;
1273 it->wd->movements = 0;
1277 _mouse_up(void *data,
1278 Evas *evas __UNUSED__,
1279 Evas_Object *obj __UNUSED__,
1282 Elm_Gen_Item *it = data;
1283 Evas_Event_Mouse_Up *ev = event_info;
1284 Eina_Bool dragged = EINA_FALSE;
1286 if (ev->button != 1) return;
1287 it->down = EINA_FALSE;
1288 it->wd->mouse_down = EINA_FALSE;
1289 if (it->wd->multitouched)
1291 if ((!it->wd->multi) && (!it->selected) && (it->highlighted)) _item_unhighlight(it);
1292 if (it->wd->multi_down) return;
1293 _multi_touch_gesture_eval(data);
1296 if (ev->event_flags & EVAS_EVENT_FLAG_ON_HOLD) it->wd->on_hold = EINA_TRUE;
1297 else it->wd->on_hold = EINA_FALSE;
1300 ecore_timer_del(it->long_timer);
1301 it->long_timer = NULL;
1305 it->dragging = EINA_FALSE;
1306 evas_object_smart_callback_call(WIDGET(it), SIG_DRAG_STOP, it);
1309 if (it->item->swipe_timer)
1311 ecore_timer_del(it->item->swipe_timer);
1312 it->item->swipe_timer = NULL;
1314 if (it->wd->multi_timer)
1316 ecore_timer_del(it->wd->multi_timer);
1317 it->wd->multi_timer = NULL;
1318 it->wd->multi_timeout = EINA_FALSE;
1320 if (it->wd->on_hold)
1322 if (it->wd->swipe) _swipe(data);
1323 it->wd->longpressed = EINA_FALSE;
1324 it->wd->on_hold = EINA_FALSE;
1327 if ((it->wd->reorder_mode) && (it->wd->reorder_it))
1329 Evas_Coord it_scrl_y = ev->canvas.y - it->wd->reorder_it->dy;
1331 if (it->wd->reorder_rel && (it->wd->reorder_it->parent == it->wd->reorder_rel->parent))
1333 if (it_scrl_y <= it->wd->reorder_rel->item->scrl_y)
1334 _item_move_before(it->wd->reorder_it, it->wd->reorder_rel);
1336 _item_move_after(it->wd->reorder_it, it->wd->reorder_rel);
1340 if (it->wd->calc_job) ecore_job_del(it->wd->calc_job);
1341 it->wd->calc_job = ecore_job_add(_calc_job, it->wd);
1343 edje_object_signal_emit(VIEW(it), "elm,state,reorder,disabled", "elm");
1344 it->wd->reorder_it = it->wd->reorder_rel = NULL;
1345 elm_smart_scroller_hold_set(it->wd->scr, EINA_FALSE);
1346 elm_smart_scroller_bounce_allow_set(it->wd->scr, it->wd->h_bounce, it->wd->v_bounce);
1348 if (it->wd->longpressed)
1350 it->wd->longpressed = EINA_FALSE;
1351 if (!it->wd->wasselected)
1353 _item_unhighlight(it);
1356 it->wd->wasselected = EINA_FALSE;
1361 if (it->want_unrealize)
1363 _elm_genlist_item_unrealize(it, EINA_FALSE);
1364 if (it->item->block->want_unrealize)
1365 _item_block_unrealize(it->item->block);
1368 if (elm_widget_item_disabled_get(it) || (dragged) || (it->display_only))
1370 if (ev->event_flags & EVAS_EVENT_FLAG_ON_HOLD) return;
1375 _item_highlight(it);
1380 _item_unhighlight(it);
1388 Widget_Data *wd = it->wd;
1391 while (wd->selected)
1393 _item_unhighlight(wd->selected->data);
1394 _item_unselect(wd->selected->data);
1400 const Eina_List *l, *l_next;
1403 EINA_LIST_FOREACH_SAFE(it->wd->selected, l, l_next, it2)
1406 _item_unhighlight(it2);
1407 _item_unselect(it2);
1409 //_item_highlight(it);
1412 _item_highlight(it);
1418 _signal_expand_toggle(void *data,
1419 Evas_Object *obj __UNUSED__,
1420 const char *emission __UNUSED__,
1421 const char *source __UNUSED__)
1423 Elm_Gen_Item *it = data;
1425 if (it->item->expanded)
1426 evas_object_smart_callback_call(WIDGET(it), SIG_CONTRACT_REQUEST, it);
1428 evas_object_smart_callback_call(WIDGET(it), SIG_EXPAND_REQUEST, it);
1432 _signal_expand(void *data,
1433 Evas_Object *obj __UNUSED__,
1434 const char *emission __UNUSED__,
1435 const char *source __UNUSED__)
1437 Elm_Gen_Item *it = data;
1439 if (!it->item->expanded)
1440 evas_object_smart_callback_call(WIDGET(it), SIG_EXPAND_REQUEST, it);
1444 _signal_contract(void *data,
1445 Evas_Object *obj __UNUSED__,
1446 const char *emission __UNUSED__,
1447 const char *source __UNUSED__)
1449 Elm_Gen_Item *it = data;
1451 if (it->item->expanded)
1452 evas_object_smart_callback_call(WIDGET(it), SIG_CONTRACT_REQUEST, it);
1456 _scr_hold_timer_cb(void *data)
1458 if (!data) return ECORE_CALLBACK_CANCEL;
1459 Widget_Data *wd = data;
1460 elm_smart_scroller_hold_set(wd->scr, EINA_FALSE);
1461 wd->scr_hold_timer = NULL;
1462 return ECORE_CALLBACK_CANCEL;
1466 _mode_finished_signal_cb(void *data,
1468 const char *emission __UNUSED__,
1469 const char *source __UNUSED__)
1473 Elm_Gen_Item *it = data;
1474 if ((it->generation < it->wd->generation) || (!it->realized) || (!it->item->mode_view)) return;
1476 Evas *te = evas_object_evas_get(obj);
1478 evas_event_freeze(te);
1479 it->item->nocache = EINA_FALSE;
1480 _mode_item_unrealize(it);
1481 if (it->item->group_item)
1482 evas_object_raise(it->item->VIEW(group_item));
1483 snprintf(buf, sizeof(buf), "elm,state,%s,passive,finished", it->wd->mode_type);
1484 edje_object_signal_callback_del_full(obj, buf, "elm", _mode_finished_signal_cb, it);
1485 evas_event_thaw(te);
1486 evas_event_thaw_eval(te);
1490 _item_cache_clean(Widget_Data *wd)
1492 evas_event_freeze(evas_object_evas_get(wd->obj));
1493 while ((wd->item_cache) && (wd->item_cache_count > wd->item_cache_max))
1497 itc = EINA_INLIST_CONTAINER_GET(wd->item_cache->last, Item_Cache);
1498 wd->item_cache = eina_inlist_remove(wd->item_cache,
1499 wd->item_cache->last);
1500 wd->item_cache_count--;
1501 if (itc->spacer) evas_object_del(itc->spacer);
1502 if (itc->base_view) evas_object_del(itc->base_view);
1503 if (itc->item_style) eina_stringshare_del(itc->item_style);
1506 evas_event_thaw(evas_object_evas_get(wd->obj));
1507 evas_event_thaw_eval(evas_object_evas_get(wd->obj));
1511 _item_cache_zero(Widget_Data *wd)
1513 int pmax = wd->item_cache_max;
1514 wd->item_cache_max = 0;
1515 _item_cache_clean(wd);
1516 wd->item_cache_max = pmax;
1520 _item_cache_add(Elm_Gen_Item *it)
1524 evas_event_freeze(evas_object_evas_get(it->wd->obj));
1525 if (it->wd->item_cache_max <= 0)
1527 evas_object_del(VIEW(it));
1529 evas_object_del(it->spacer);
1531 evas_event_thaw(evas_object_evas_get(it->wd->obj));
1532 evas_event_thaw_eval(evas_object_evas_get(it->wd->obj));
1536 it->wd->item_cache_count++;
1537 itc = calloc(1, sizeof(Item_Cache));
1540 evas_event_thaw(evas_object_evas_get(it->wd->obj));
1541 evas_event_thaw_eval(evas_object_evas_get(it->wd->obj));
1544 it->wd->item_cache = eina_inlist_prepend(it->wd->item_cache,
1545 EINA_INLIST_GET(itc));
1546 itc->spacer = it->spacer;
1548 itc->base_view = VIEW(it);
1550 edje_object_signal_emit(itc->base_view, "elm,state,unselected", "elm");
1551 evas_object_hide(itc->base_view);
1552 evas_object_move(itc->base_view, -9999, -9999);
1553 itc->item_style = eina_stringshare_add(it->itc->item_style);
1554 if (it->item->flags & ELM_GENLIST_ITEM_SUBITEMS) itc->tree = 1;
1555 itc->compress = (it->wd->compress);
1556 itc->selected = it->selected;
1557 itc->disabled = elm_widget_item_disabled_get(it);
1558 itc->expanded = it->item->expanded;
1561 ecore_timer_del(it->long_timer);
1562 it->long_timer = NULL;
1564 if (it->item->swipe_timer)
1566 ecore_timer_del(it->item->swipe_timer);
1567 it->item->swipe_timer = NULL;
1569 // FIXME: other callbacks?
1570 edje_object_signal_callback_del_full(itc->base_view,
1571 "elm,action,expand,toggle",
1572 "elm", _signal_expand_toggle, it);
1573 edje_object_signal_callback_del_full(itc->base_view, "elm,action,expand",
1575 _signal_expand, it);
1576 edje_object_signal_callback_del_full(itc->base_view, "elm,action,contract",
1577 "elm", _signal_contract, it);
1578 evas_object_event_callback_del_full(itc->base_view, EVAS_CALLBACK_MOUSE_DOWN,
1580 evas_object_event_callback_del_full(itc->base_view, EVAS_CALLBACK_MOUSE_UP,
1582 evas_object_event_callback_del_full(itc->base_view, EVAS_CALLBACK_MOUSE_MOVE,
1584 evas_object_event_callback_del_full(itc->base_view, EVAS_CALLBACK_MULTI_DOWN,
1586 evas_object_event_callback_del_full(itc->base_view, EVAS_CALLBACK_MULTI_UP,
1588 evas_object_event_callback_del_full(itc->base_view, EVAS_CALLBACK_MULTI_MOVE,
1590 _item_cache_clean(it->wd);
1591 evas_event_thaw(evas_object_evas_get(it->wd->obj));
1592 evas_event_thaw_eval(evas_object_evas_get(it->wd->obj));
1596 _item_cache_find(Elm_Gen_Item *it)
1601 if (it->item->flags & ELM_GENLIST_ITEM_SUBITEMS) tree = 1;
1602 EINA_INLIST_FOREACH(it->wd->item_cache, itc)
1604 if ((itc->selected) || (itc->disabled) || (itc->expanded))
1606 if ((itc->tree == tree) &&
1607 (itc->compress == it->wd->compress) &&
1608 (!strcmp(it->itc->item_style, itc->item_style)))
1610 it->wd->item_cache = eina_inlist_remove(it->wd->item_cache,
1611 EINA_INLIST_GET(itc));
1612 it->wd->item_cache_count--;
1620 _elm_genlist_item_index_update(Elm_Gen_Item *it)
1622 if (it->position_update || it->item->block->position_update)
1624 evas_object_smart_callback_call(WIDGET(it), SIG_INDEX_UPDATE, it);
1625 it->position_update = EINA_FALSE;
1630 _elm_genlist_item_odd_even_update(Elm_Gen_Item *it)
1632 if (!it->item->nostacking)
1634 if ((it->item->order_num_in & 0x1) ^ it->item->stacking_even)
1636 if (it->edit_obj) evas_object_lower(it->edit_obj);
1637 else evas_object_lower(VIEW(it));
1641 if (it->edit_obj) evas_object_raise(it->edit_obj);
1642 else evas_object_raise(VIEW(it));
1646 if (it->item->order_num_in & 0x1)
1648 edje_object_signal_emit(VIEW(it), "elm,state,odd", "elm");
1649 if (it->edit_obj) edje_object_signal_emit(it->edit_obj, "elm,state,odd", "elm");
1653 edje_object_signal_emit(VIEW(it), "elm,state,even", "elm");
1654 if (it->edit_obj) edje_object_signal_emit(it->edit_obj, "elm,state,even", "elm");
1659 _elm_genlist_item_state_update(Elm_Gen_Item *it, Item_Cache *itc)
1663 if (it->selected != itc->selected)
1666 edje_object_signal_emit(VIEW(it),
1667 "elm,state,selected", "elm");
1670 edje_object_signal_emit(it->edit_obj,
1671 "elm,state,selected", "elm");
1673 if (elm_widget_item_disabled_get(it) != itc->disabled)
1675 if (elm_widget_item_disabled_get(it))
1676 edje_object_signal_emit(VIEW(it),
1677 "elm,state,disabled", "elm");
1679 edje_object_signal_emit(it->edit_obj,
1680 "elm,state,disabled", "elm");
1682 if (it->item->expanded != itc->expanded)
1684 if (it->item->expanded)
1685 edje_object_signal_emit(VIEW(it),
1686 "elm,state,expanded", "elm");
1688 edje_object_signal_emit(it->edit_obj,
1689 "elm,state,expanded", "elm");
1696 edje_object_signal_emit(VIEW(it),
1697 "elm,state,selected", "elm");
1699 edje_object_signal_emit(it->edit_obj,
1700 "elm,state,selected", "elm");
1703 if (elm_widget_item_disabled_get(it))
1705 edje_object_signal_emit(VIEW(it),
1706 "elm,state,disabled", "elm");
1708 edje_object_signal_emit(it->edit_obj,
1709 "elm,state,disabled", "elm");
1711 if (it->item->expanded)
1713 edje_object_signal_emit(VIEW(it),
1714 "elm,state,expanded", "elm");
1716 edje_object_signal_emit(it->edit_obj,
1717 "elm,state,expanded", "elm");
1723 _item_cache_free(Item_Cache *itc)
1725 if (itc->spacer) evas_object_del(itc->spacer);
1726 if (itc->base_view) evas_object_del(itc->base_view);
1727 if (itc->item_style) eina_stringshare_del(itc->item_style);
1732 _item_text_realize(Elm_Gen_Item *it,
1733 Evas_Object *target,
1737 if (it->itc->func.text_get)
1742 *source = elm_widget_stringlist_get(edje_object_data_get(target, "texts"));
1743 EINA_LIST_FOREACH(*source, l, key)
1745 if (parts && fnmatch(parts, key, FNM_PERIOD))
1748 char *s = it->itc->func.text_get
1749 ((void *)it->base.data, WIDGET(it), key);
1753 edje_object_part_text_set(target, key, s);
1758 edje_object_part_text_set(target, key, "");
1765 _item_content_unrealize(Elm_Gen_Item *it,
1766 Evas_Object *target,
1770 Eina_List *res = it->content_objs;
1772 if (it->itc->func.content_get)
1776 Evas_Object *ic = NULL;
1778 EINA_LIST_FOREACH(*source, l, key)
1780 if (parts && fnmatch(parts, key, FNM_PERIOD))
1783 ic = edje_object_part_swallow_get(target, key);
1786 res = eina_list_remove(res, ic);
1787 edje_object_part_unswallow(target, ic);
1788 evas_object_del(ic);
1797 _item_content_realize(Elm_Gen_Item *it,
1798 Evas_Object *target,
1802 Eina_List *res = NULL;
1804 if (it->itc->func.content_get)
1808 Evas_Object *ic = NULL;
1810 *source = elm_widget_stringlist_get(edje_object_data_get(target, "contents"));
1812 if (parts && (eina_list_count(*source) != eina_list_count(it->content_objs)))
1813 res = it->content_objs;
1815 EINA_LIST_FOREACH(*source, l, key)
1817 if (parts && fnmatch(parts, key, FNM_PERIOD))
1820 if (it->itc->func.content_get)
1821 ic = it->itc->func.content_get
1822 ((void *)it->base.data, WIDGET(it), key);
1825 res = eina_list_append(res, ic);
1826 edje_object_part_swallow(target, key, ic);
1827 evas_object_show(ic);
1828 elm_widget_sub_object_add(WIDGET(it), ic);
1829 if (elm_widget_item_disabled_get(it))
1830 elm_widget_disabled_set(ic, EINA_TRUE);
1839 _item_state_realize(Elm_Gen_Item *it,
1840 Evas_Object *target,
1844 if (it->itc->func.state_get)
1850 *source = elm_widget_stringlist_get(edje_object_data_get(target, "states"));
1851 EINA_LIST_FOREACH(*source, l, key)
1853 if (parts && fnmatch(parts, key, FNM_PERIOD))
1856 Eina_Bool on = it->itc->func.state_get
1857 ((void *)it->base.data, WIDGET(it), key);
1861 snprintf(buf, sizeof(buf), "elm,state,%s,active", key);
1862 edje_object_signal_emit(target, buf, "elm");
1866 snprintf(buf, sizeof(buf), "elm,state,%s,passive", key);
1867 edje_object_signal_emit(target, buf, "elm");
1874 _item_realize(Elm_Gen_Item *it,
1878 const char *treesize;
1881 Item_Cache *itc = NULL;
1883 if (it->generation < it->wd->generation) return;
1884 //evas_event_freeze(evas_object_evas_get(it->wd->obj));
1887 if (it->item->order_num_in != in)
1889 it->item->order_num_in = in;
1890 _elm_genlist_item_odd_even_update(it);
1891 _elm_genlist_item_state_update(it, NULL);
1892 _elm_genlist_item_index_update(it);
1894 //evas_event_thaw(evas_object_evas_get(it->wd->obj));
1895 //evas_event_thaw_eval(evas_object_evas_get(it->wd->obj));
1898 it->item->order_num_in = in;
1900 if (it->item->nocache)
1901 it->item->nocache = EINA_FALSE;
1903 itc = _item_cache_find(it);
1906 VIEW(it) = itc->base_view;
1907 itc->base_view = NULL;
1908 it->spacer = itc->spacer;
1913 const char *stacking_even;
1914 const char *stacking;
1916 VIEW(it) = edje_object_add(evas_object_evas_get(WIDGET(it)));
1917 edje_object_scale_set(VIEW(it),
1918 elm_widget_scale_get(WIDGET(it)) *
1919 _elm_config->scale);
1920 evas_object_smart_member_add(VIEW(it), it->wd->pan_smart);
1921 elm_widget_sub_object_add(WIDGET(it), VIEW(it));
1923 if (it->item->flags & ELM_GENLIST_ITEM_SUBITEMS)
1924 strncpy(buf, "tree", sizeof(buf));
1925 else strncpy(buf, "item", sizeof(buf));
1926 if (it->wd->compress)
1927 strncat(buf, "_compress", sizeof(buf) - strlen(buf));
1929 strncat(buf, "/", sizeof(buf) - strlen(buf));
1930 strncat(buf, it->itc->item_style, sizeof(buf) - strlen(buf));
1932 _elm_theme_object_set(WIDGET(it), VIEW(it), "genlist", buf,
1933 elm_widget_style_get(WIDGET(it)));
1935 stacking_even = edje_object_data_get(VIEW(it), "stacking_even");
1936 if (!stacking_even) stacking_even = "above";
1937 it->item->stacking_even = !!strcmp("above", stacking_even);
1939 stacking = edje_object_data_get(VIEW(it), "stacking");
1940 if (!stacking) stacking = "yes";
1941 it->item->nostacking = !!strcmp("yes", stacking);
1943 edje_object_mirrored_set(VIEW(it),
1944 elm_widget_mirrored_get(WIDGET(it)));
1946 evas_object_rectangle_add(evas_object_evas_get(WIDGET(it)));
1947 evas_object_color_set(it->spacer, 0, 0, 0, 0);
1948 elm_widget_sub_object_add(WIDGET(it), it->spacer);
1951 _elm_genlist_item_odd_even_update(it);
1953 treesize = edje_object_data_get(VIEW(it), "treesize");
1954 if (treesize) tsize = atoi(treesize);
1955 evas_object_size_hint_min_set(it->spacer,
1956 (it->item->expanded_depth * tsize) * _elm_config->scale, 1);
1957 edje_object_part_swallow(VIEW(it), "elm.swallow.pad", it->spacer);
1960 edje_object_signal_callback_add(VIEW(it),
1961 "elm,action,expand,toggle",
1962 "elm", _signal_expand_toggle, it);
1963 edje_object_signal_callback_add(VIEW(it), "elm,action,expand",
1964 "elm", _signal_expand, it);
1965 edje_object_signal_callback_add(VIEW(it), "elm,action,contract",
1966 "elm", _signal_contract, it);
1967 evas_object_event_callback_add(VIEW(it), EVAS_CALLBACK_MOUSE_DOWN,
1969 evas_object_event_callback_add(VIEW(it), EVAS_CALLBACK_MOUSE_UP,
1971 evas_object_event_callback_add(VIEW(it), EVAS_CALLBACK_MOUSE_MOVE,
1973 evas_object_event_callback_add(VIEW(it), EVAS_CALLBACK_MULTI_DOWN,
1975 evas_object_event_callback_add(VIEW(it), EVAS_CALLBACK_MULTI_UP,
1977 evas_object_event_callback_add(VIEW(it), EVAS_CALLBACK_MULTI_MOVE,
1980 if ((it->wd->edit_mode) && (!it->edit_obj) &&
1981 (it->item->flags != ELM_GENLIST_ITEM_GROUP) && (it->itc->edit_item_style))
1982 _edit_mode_item_realize(it, EINA_FALSE);
1984 _elm_genlist_item_state_update(it, itc);
1985 _elm_genlist_item_index_update(it);
1988 if ((calc) && (it->wd->homogeneous) &&
1989 ((it->wd->item_width) ||
1990 ((it->wd->item_width) && (it->wd->group_item_width))))
1992 /* homogenous genlist shortcut */
1993 if (!it->item->mincalcd)
1997 it->item->w = it->item->minw = it->wd->group_item_width;
1998 it->item->h = it->item->minh = it->wd->group_item_height;
2002 it->item->w = it->item->minw = it->wd->item_width;
2003 it->item->h = it->item->minh = it->wd->item_height;
2005 it->item->mincalcd = EINA_TRUE;
2010 /* FIXME: If you see that assert, please notify us and we
2011 will clean our mess */
2012 assert(eina_list_count(it->content_objs) == 0);
2014 _item_text_realize(it, VIEW(it), &it->texts, NULL);
2015 it->content_objs = _item_content_realize(it, VIEW(it), &it->contents, NULL);
2016 _item_state_realize(it, VIEW(it), &it->states, NULL);
2018 if (!it->item->mincalcd)
2020 Evas_Coord mw = -1, mh = -1;
2022 if (!it->display_only)
2023 elm_coords_finger_size_adjust(1, &mw, 1, &mh);
2024 if (it->wd->height_for_width) mw = it->wd->prev_viewport_w;
2025 edje_object_size_min_restricted_calc(VIEW(it), &mw, &mh, mw,
2027 if (!it->display_only)
2028 elm_coords_finger_size_adjust(1, &mw, 1, &mh);
2029 it->item->w = it->item->minw = mw;
2030 it->item->h = it->item->minh = mh;
2031 it->item->mincalcd = EINA_TRUE;
2033 if ((!it->wd->group_item_width) && (it->group))
2035 it->wd->group_item_width = mw;
2036 it->wd->group_item_height = mh;
2038 else if ((!it->wd->item_width) && (it->item->flags == ELM_GENLIST_ITEM_NONE))
2040 it->wd->item_width = mw;
2041 it->wd->item_height = mh;
2044 if (!calc) evas_object_show(VIEW(it));
2047 if (it->tooltip.content_cb)
2049 elm_widget_item_tooltip_content_cb_set(it,
2050 it->tooltip.content_cb,
2051 it->tooltip.data, NULL);
2052 elm_widget_item_tooltip_style_set(it, it->tooltip.style);
2053 elm_widget_item_tooltip_window_mode_set(it, it->tooltip.free_size);
2056 if (it->mouse_cursor)
2057 elm_widget_item_cursor_set(it, it->mouse_cursor);
2059 it->realized = EINA_TRUE;
2060 it->want_unrealize = EINA_FALSE;
2062 if (itc) _item_cache_free(itc);
2063 //evas_event_thaw(evas_object_evas_get(it->wd->obj));
2064 //evas_event_thaw_eval(evas_object_evas_get(it->wd->obj));
2066 evas_object_smart_callback_call(WIDGET(it), SIG_REALIZED, it);
2068 if ((!calc) && (it->wd->edit_mode) && (it->item->flags != ELM_GENLIST_ITEM_GROUP))
2070 if (it->itc->edit_item_style)
2072 if (!it->edit_obj) _edit_mode_item_realize(it, EINA_FALSE);
2073 edje_object_message_signal_process(it->edit_obj);
2076 edje_object_message_signal_process(VIEW(it));
2080 _item_unrealize_cb(Elm_Gen_Item *it)
2082 if (it->item->nocache)
2084 evas_object_del(VIEW(it));
2086 evas_object_del(it->spacer);
2091 edje_object_mirrored_set(VIEW(it),
2092 elm_widget_mirrored_get(WIDGET(it)));
2093 edje_object_scale_set(VIEW(it),
2094 elm_widget_scale_get(WIDGET(it))
2095 * _elm_config->scale);
2096 _item_cache_add(it);
2099 _mode_item_unrealize(it);
2101 it->realized = EINA_FALSE;
2102 it->want_unrealize = EINA_FALSE;
2103 if (it->wd->edit_mode) _edit_mode_item_unrealize(it);
2107 _item_block_recalc(Item_Block *itb,
2113 Evas_Coord minw = 0, minh = 0;
2114 Eina_Bool showme = EINA_FALSE, changed = EINA_FALSE;
2117 //evas_event_freeze(evas_object_evas_get(itb->wd->obj));
2119 EINA_LIST_FOREACH(itb->items, l, it)
2121 if (it->generation < it->wd->generation) continue;
2122 showme |= it->item->showme;
2127 if (!it->item->mincalcd) changed = EINA_TRUE;
2130 _item_realize(it, in, EINA_TRUE);
2131 _elm_genlist_item_unrealize(it, EINA_TRUE);
2136 _item_realize(it, in, EINA_TRUE);
2137 _elm_genlist_item_unrealize(it, EINA_TRUE);
2141 _item_realize(it, in, EINA_FALSE);
2142 minh += it->item->minh;
2143 if (minw < it->item->minw) minw = it->item->minw;
2151 itb->changed = EINA_FALSE;
2152 itb->position_update = EINA_FALSE;
2153 //evas_event_thaw(evas_object_evas_get(itb->wd->obj));
2154 //evas_event_thaw_eval(evas_object_evas_get(itb->wd->obj));
2159 _item_block_realize(Item_Block *itb)
2161 if (itb->realized) return;
2162 itb->realized = EINA_TRUE;
2163 itb->want_unrealize = EINA_FALSE;
2167 _item_block_unrealize(Item_Block *itb)
2171 Eina_Bool dragging = EINA_FALSE;
2173 if (!itb->realized) return;
2174 evas_event_freeze(evas_object_evas_get(itb->wd->obj));
2175 EINA_LIST_FOREACH(itb->items, l, it)
2177 if (itb->must_recalc || !it->group)
2181 dragging = EINA_TRUE;
2182 it->want_unrealize = EINA_TRUE;
2185 _elm_genlist_item_unrealize(it, EINA_FALSE);
2190 itb->realized = EINA_FALSE;
2191 itb->want_unrealize = EINA_TRUE;
2194 itb->want_unrealize = EINA_FALSE;
2195 evas_event_thaw(evas_object_evas_get(itb->wd->obj));
2196 evas_event_thaw_eval(evas_object_evas_get(itb->wd->obj));
2200 _get_space_for_reorder_item(Elm_Gen_Item *it)
2202 Evas_Coord rox, roy, row, roh, oy, oh;
2203 Eina_Bool top = EINA_FALSE;
2204 Elm_Gen_Item *reorder_it = it->wd->reorder_it;
2205 if (!reorder_it) return 0;
2207 evas_object_geometry_get(it->wd->pan_smart, NULL, &oy, NULL, &oh);
2208 evas_object_geometry_get(it->wd->VIEW(reorder_it), &rox, &roy, &row, &roh);
2210 if ((it->wd->reorder_start_y < it->item->block->y) &&
2211 (roy - oy + (roh / 2) >= it->item->block->y - it->wd->pan_y))
2213 it->item->block->reorder_offset = it->wd->reorder_it->item->h * -1;
2214 if (it->item->block->count == 1)
2215 it->wd->reorder_rel = it;
2217 else if ((it->wd->reorder_start_y >= it->item->block->y) &&
2218 (roy - oy + (roh / 2) <= it->item->block->y - it->wd->pan_y))
2220 it->item->block->reorder_offset = it->wd->reorder_it->item->h;
2223 it->item->block->reorder_offset = 0;
2225 it->item->scrl_y += it->item->block->reorder_offset;
2227 top = (ELM_RECTS_INTERSECT(it->item->scrl_x, it->item->scrl_y, it->item->w, it->item->h,
2228 rox, roy + (roh / 2), row, 1));
2231 it->wd->reorder_rel = it;
2232 it->item->scrl_y += it->wd->reorder_it->item->h;
2233 return it->wd->reorder_it->item->h;
2240 _reorder_move_animator_cb(void *data)
2242 Elm_Gen_Item *it = data;
2243 Eina_Bool down = EINA_FALSE;
2245 int y, dy = it->item->h / 10 * _elm_config->scale, diff;
2247 t = ((0.0 > (t = ecore_loop_time_get()-it->wd->start_time)) ? 0.0 : t);
2249 if (t <= REORDER_EFFECT_TIME) y = (1 * sin((t / REORDER_EFFECT_TIME) * (M_PI / 2)) * dy);
2252 diff = abs(it->item->old_scrl_y - it->item->scrl_y);
2253 if (diff > it->item->h) y = diff / 2;
2255 if (it->item->old_scrl_y < it->item->scrl_y)
2257 it->item->old_scrl_y += y;
2260 else if (it->item->old_scrl_y > it->item->scrl_y)
2262 it->item->old_scrl_y -= y;
2267 _item_position(it, it->edit_obj, it->item->scrl_x, it->item->old_scrl_y);
2269 _item_position(it, VIEW(it), it->item->scrl_x, it->item->old_scrl_y);
2270 _group_items_recalc(it->wd);
2272 if ((it->wd->reorder_pan_move) ||
2273 (down && it->item->old_scrl_y >= it->item->scrl_y) ||
2274 (!down && it->item->old_scrl_y <= it->item->scrl_y))
2276 it->item->old_scrl_y = it->item->scrl_y;
2277 it->item->move_effect_enabled = EINA_FALSE;
2278 it->wd->reorder_move_animator = NULL;
2279 return ECORE_CALLBACK_CANCEL;
2281 return ECORE_CALLBACK_RENEW;
2285 _item_position(Elm_Gen_Item *it,
2293 evas_event_freeze(evas_object_evas_get(it->wd->obj));
2294 evas_object_resize(view, it->item->w, it->item->h);
2295 evas_object_move(view, it_x, it_y);
2296 evas_object_show(view);
2297 evas_event_thaw(evas_object_evas_get(it->wd->obj));
2298 evas_event_thaw_eval(evas_object_evas_get(it->wd->obj));
2302 _item_block_position(Item_Block *itb,
2308 Evas_Coord y = 0, ox, oy, ow, oh, cvx, cvy, cvw, cvh;
2309 Eina_Bool vis = EINA_FALSE;
2311 evas_event_freeze(evas_object_evas_get(itb->wd->obj));
2312 evas_object_geometry_get(itb->wd->pan_smart, &ox, &oy, &ow, &oh);
2313 evas_output_viewport_get(evas_object_evas_get(itb->wd->obj), &cvx, &cvy,
2315 EINA_LIST_FOREACH(itb->items, l, it)
2317 if (it->generation < it->wd->generation) continue;
2318 else if (it->wd->reorder_it == it) continue;
2321 it->item->w = itb->w;
2322 it->item->scrl_x = itb->x + it->x - it->wd->pan_x + ox;
2323 it->item->scrl_y = itb->y + it->y - it->wd->pan_y + oy;
2325 vis = (ELM_RECTS_INTERSECT(it->item->scrl_x, it->item->scrl_y, it->item->w, it->item->h,
2326 cvx, cvy, cvw, cvh));
2329 if ((itb->realized) && (!it->realized))
2331 if (vis) _item_realize(it, in, EINA_FALSE);
2337 if (it->wd->reorder_mode)
2338 y += _get_space_for_reorder_item(it);
2339 git = it->item->group_item;
2342 if (git->item->scrl_y < oy)
2343 git->item->scrl_y = oy;
2344 if ((git->item->scrl_y + git->item->h) > (it->item->scrl_y + it->item->h))
2345 git->item->scrl_y = (it->item->scrl_y + it->item->h) - git->item->h;
2346 git->item->want_realize = EINA_TRUE;
2348 if ((it->wd->reorder_it) && (it->item->old_scrl_y != it->item->scrl_y))
2350 if (!it->item->move_effect_enabled)
2352 it->item->move_effect_enabled = EINA_TRUE;
2353 it->wd->reorder_move_animator =
2355 _reorder_move_animator_cb, it);
2358 if (!it->item->move_effect_enabled)
2360 if ((it->wd->edit_mode) && (it->itc->edit_item_style))
2361 _edit_mode_item_position(it, it->item->scrl_x,
2365 if (it->item->mode_view)
2366 _item_position(it, it->item->mode_view,
2370 _item_position(it, VIEW(it), it->item->scrl_x,
2373 it->item->old_scrl_y = it->item->scrl_y;
2378 if (!it->dragging) _elm_genlist_item_unrealize(it, EINA_FALSE);
2385 if (vis) it->item->want_realize = EINA_TRUE;
2389 evas_event_thaw(evas_object_evas_get(itb->wd->obj));
2390 evas_event_thaw_eval(evas_object_evas_get(itb->wd->obj));
2394 _group_items_recalc(void *data)
2396 Widget_Data *wd = data;
2400 evas_event_freeze(evas_object_evas_get(wd->obj));
2401 EINA_LIST_FOREACH(wd->group_items, l, git)
2403 if (git->item->want_realize)
2406 _item_realize(git, 0, EINA_FALSE);
2407 evas_object_resize(VIEW(git), wd->minw, git->item->h);
2408 evas_object_move(VIEW(git), git->item->scrl_x, git->item->scrl_y);
2409 evas_object_show(VIEW(git));
2410 evas_object_raise(VIEW(git));
2412 else if (!git->item->want_realize && git->realized)
2415 _elm_genlist_item_unrealize(git, EINA_FALSE);
2418 evas_event_thaw(evas_object_evas_get(wd->obj));
2419 evas_event_thaw_eval(evas_object_evas_get(wd->obj));
2423 _must_recalc_idler(void *data)
2425 Widget_Data *wd = data;
2426 if (wd->calc_job) ecore_job_del(wd->calc_job);
2427 wd->calc_job = ecore_job_add(_calc_job, wd);
2428 wd->must_recalc_idler = NULL;
2429 return ECORE_CALLBACK_CANCEL;
2433 _scroll_item(Widget_Data *wd)
2435 Elm_Gen_Item *it = NULL;
2436 Evas_Coord gith = 0;
2437 Evas_Coord ow, oh, dx = 0, dy = 0, dw = 0, dh = 0;
2439 evas_object_geometry_get(wd->pan_smart, NULL, NULL, &ow, &oh);
2441 dx = it->x + it->item->block->x;
2442 dy = it->y + it->item->block->y;
2443 dw = it->item->block->w;
2445 switch (wd->scrollto_type)
2447 case ELM_GENLIST_ITEM_SCROLLTO_TOP:
2448 if (it->item->group_item) gith = it->item->group_item->item->h;
2451 case ELM_GENLIST_ITEM_SCROLLTO_MIDDLE:
2452 dy += (it->item->h / 2 - oh / 2);
2454 case ELM_GENLIST_ITEM_SCROLLTO_IN:
2456 if ((wd->expanded_item) &&
2457 ((wd->show_item->y + wd->show_item->item->block->y + wd->show_item->item->h)
2458 - (wd->expanded_item->y + wd->expanded_item->item->block->y) > oh))
2460 it = wd->expanded_item;
2461 if (it->item->group_item) gith = it->item->group_item->item->h;
2462 dx = it->x + it->item->block->x;
2463 dy = it->y + it->item->block->y - gith;
2464 dw = it->item->block->w;
2468 if ((it->item->group_item) && (wd->pan_y > (it->y + it->item->block->y)))
2469 gith = it->item->group_item->item->h;
2476 elm_smart_scroller_region_bring_in(wd->scr, dx, dy, dw, dh);
2478 elm_smart_scroller_child_region_show(wd->scr, dx, dy, dw, dh);
2480 it->item->showme = EINA_FALSE;
2481 wd->show_item = NULL;
2482 wd->auto_scroll_enabled = EINA_FALSE;
2483 wd->check_scroll = EINA_FALSE;
2487 _calc_job(void *data)
2489 Widget_Data *wd = data;
2490 Item_Block *itb, *chb = NULL;
2491 Evas_Coord minw = -1, minh = 0, y = 0, ow, dy = 0, vw;
2492 Evas_Coord pan_w = 0, pan_h = 0;
2494 Eina_Bool minw_change = EINA_FALSE;
2495 Eina_Bool did_must_recalc = EINA_FALSE;
2498 evas_object_geometry_get(wd->pan_smart, NULL, NULL, &ow, &wd->h);
2499 elm_smart_scroller_child_viewport_size_get(wd->scr, &vw, NULL);
2504 evas_event_freeze(evas_object_evas_get(wd->obj));
2505 EINA_INLIST_FOREACH(wd->blocks, itb)
2507 Eina_Bool showme = EINA_FALSE;
2510 showme = itb->showme;
2511 itb->showme = EINA_FALSE;
2514 if (itb->realized) _item_block_unrealize(itb);
2516 if ((itb->changed) || ((itb->must_recalc) && (!did_must_recalc)))
2518 if (itb->must_recalc)
2522 EINA_LIST_FOREACH(itb->items, l, it)
2523 if (it->item->mincalcd) it->item->mincalcd = EINA_FALSE;
2524 itb->changed = EINA_TRUE;
2525 if (itb->must_recalc) did_must_recalc = EINA_TRUE;
2526 if (itb->realized) _item_block_unrealize(itb);
2527 itb->must_recalc = EINA_FALSE;
2529 showme = _item_block_recalc(itb, in, EINA_FALSE);
2535 if (minw == -1) minw = itb->minw;
2536 else if ((!itb->must_recalc) && (minw < itb->minw))
2539 minw_change = EINA_TRUE;
2544 minw_change = EINA_TRUE;
2550 if ((showme) && (wd->show_item) && (!wd->show_item->item->queued))
2551 wd->check_scroll = EINA_TRUE;
2555 EINA_INLIST_FOREACH(wd->blocks, itb)
2561 if ((chb) && (EINA_INLIST_GET(chb)->next))
2563 EINA_INLIST_FOREACH(EINA_INLIST_GET(chb)->next, itb)
2565 if (itb->realized) _item_block_unrealize(itb);
2568 wd->realminw = minw;
2569 if (minw < wd->w) minw = wd->w;
2570 if ((minw != wd->minw) || (minh != wd->minh))
2574 evas_object_smart_callback_call(wd->pan_smart, "changed", NULL);
2575 _sizing_eval(wd->obj);
2576 if ((wd->anchor_item) && (wd->anchor_item->item->block) && (!wd->auto_scroll_enabled))
2581 it = wd->anchor_item;
2582 it_y = wd->anchor_y;
2583 elm_smart_scroller_child_pos_set(wd->scr, wd->pan_x,
2584 it->item->block->y + it->y + it_y);
2585 wd->anchor_item = it;
2586 wd->anchor_y = it_y;
2589 if (did_must_recalc)
2591 if (!wd->must_recalc_idler)
2592 wd->must_recalc_idler = ecore_idler_add(_must_recalc_idler, wd);
2594 if (wd->check_scroll)
2596 _pan_child_size_get(wd->pan_smart, &pan_w, &pan_h);
2597 if (EINA_INLIST_GET(wd->show_item) == wd->items->last)
2598 wd->scrollto_type = ELM_GENLIST_ITEM_SCROLLTO_IN;
2599 switch (wd->scrollto_type)
2601 case ELM_GENLIST_ITEM_SCROLLTO_TOP:
2604 case ELM_GENLIST_ITEM_SCROLLTO_MIDDLE:
2607 case ELM_GENLIST_ITEM_SCROLLTO_IN:
2612 if ((pan_w > (wd->show_item->x + wd->show_item->item->block->x)) &&
2613 (pan_h > (wd->show_item->y + wd->show_item->item->block->y + dy)))
2618 wd->calc_job = NULL;
2619 evas_object_smart_changed(wd->pan_smart);
2620 evas_event_thaw(evas_object_evas_get(wd->obj));
2621 evas_event_thaw_eval(evas_object_evas_get(wd->obj));
2625 _update_job(void *data)
2627 Widget_Data *wd = data;
2631 Eina_Bool position = EINA_FALSE, recalc = EINA_FALSE;
2633 wd->update_job = NULL;
2636 evas_event_freeze(evas_object_evas_get(wd->obj));
2637 EINA_INLIST_FOREACH(wd->blocks, itb)
2639 Evas_Coord itminw, itminh;
2646 _item_block_position(itb, num);
2650 recalc = EINA_FALSE;
2651 EINA_LIST_FOREACH(itb->items, l2, it)
2653 if (it->item->updateme)
2655 itminw = it->item->minw;
2656 itminh = it->item->minh;
2658 it->item->updateme = EINA_FALSE;
2661 _elm_genlist_item_unrealize(it, EINA_FALSE);
2662 _item_realize(it, num, EINA_FALSE);
2663 position = EINA_TRUE;
2667 _item_realize(it, num, EINA_TRUE);
2668 _elm_genlist_item_unrealize(it, EINA_TRUE);
2670 if ((it->item->minw != itminw) || (it->item->minh != itminh))
2675 itb->updateme = EINA_FALSE;
2678 position = EINA_TRUE;
2679 itb->changed = EINA_TRUE;
2680 _item_block_recalc(itb, num0, EINA_FALSE);
2681 _item_block_position(itb, num0);
2686 if (wd->calc_job) ecore_job_del(wd->calc_job);
2687 wd->calc_job = ecore_job_add(_calc_job, wd);
2689 evas_event_thaw(evas_object_evas_get(wd->obj));
2690 evas_event_thaw_eval(evas_object_evas_get(wd->obj));
2694 _pan_set(Evas_Object *obj,
2698 Pan *sd = evas_object_smart_data_get(obj);
2702 // Evas_Coord ow, oh;
2703 // evas_object_geometry_get(obj, NULL, NULL, &ow, &oh);
2704 // ow = sd->wd->minw - ow;
2705 // if (ow < 0) ow = 0;
2706 // oh = sd->wd->minh - oh;
2707 // if (oh < 0) oh = 0;
2708 // if (x < 0) x = 0;
2709 // if (y < 0) y = 0;
2710 // if (x > ow) x = ow;
2711 // if (y > oh) y = oh;
2712 if ((x == sd->wd->pan_x) && (y == sd->wd->pan_y)) return;
2716 EINA_INLIST_FOREACH(sd->wd->blocks, itb)
2718 if ((itb->y + itb->h) > y)
2723 EINA_LIST_FOREACH(itb->items, l2, it)
2725 if ((itb->y + it->y) >= y)
2727 sd->wd->anchor_item = it;
2728 sd->wd->anchor_y = -(itb->y + it->y - y);
2735 if (!sd->wd->reorder_move_animator) evas_object_smart_changed(obj);
2739 _pan_get(Evas_Object *obj,
2743 Pan *sd = evas_object_smart_data_get(obj);
2746 if (x) *x = sd->wd->pan_x;
2747 if (y) *y = sd->wd->pan_y;
2751 _pan_max_get(Evas_Object *obj,
2755 Pan *sd = evas_object_smart_data_get(obj);
2759 evas_object_geometry_get(obj, NULL, NULL, &ow, &oh);
2760 ow = sd->wd->minw - ow;
2762 oh = sd->wd->minh - oh;
2769 _pan_min_get(Evas_Object *obj __UNUSED__,
2778 _pan_child_size_get(Evas_Object *obj,
2782 Pan *sd = evas_object_smart_data_get(obj);
2785 if (w) *w = sd->wd->minw;
2786 if (h) *h = sd->wd->minh;
2790 _pan_add(Evas_Object *obj)
2793 Evas_Object_Smart_Clipped_Data *cd;
2796 cd = evas_object_smart_data_get(obj);
2799 sd->__clipped_data = *cd;
2801 evas_object_smart_data_set(obj, sd);
2805 _pan_del(Evas_Object *obj)
2807 Pan *sd = evas_object_smart_data_get(obj);
2812 ecore_job_del(sd->resize_job);
2813 sd->resize_job = NULL;
2819 _pan_resize_job(void *data)
2823 _sizing_eval(sd->wd->obj);
2824 sd->resize_job = NULL;
2828 _pan_resize(Evas_Object *obj,
2832 Pan *sd = evas_object_smart_data_get(obj);
2836 evas_object_geometry_get(obj, NULL, NULL, &ow, &oh);
2837 if ((ow == w) && (oh == h)) return;
2838 if ((sd->wd->height_for_width) && (ow != w))
2841 if (sd->resize_job) ecore_job_del(sd->resize_job);
2842 sd->resize_job = ecore_job_add(_pan_resize_job, sd);
2844 sd->wd->pan_changed = EINA_TRUE;
2845 evas_object_smart_changed(obj);
2846 if (sd->wd->calc_job) ecore_job_del(sd->wd->calc_job);
2847 sd->wd->calc_job = NULL;
2849 if (sd->wd->calc_job) ecore_job_del(sd->wd->calc_job);
2850 sd->wd->calc_job = ecore_job_add(_calc_job, sd->wd);
2855 _pan_calculate(Evas_Object *obj)
2857 Pan *sd = evas_object_smart_data_get(obj);
2859 Evas_Coord ox, oy, ow, oh, cvx, cvy, cvw, cvh;
2865 evas_event_freeze(evas_object_evas_get(obj));
2867 if (sd->wd->pan_changed)
2870 sd->wd->pan_changed = EINA_FALSE;
2873 evas_object_geometry_get(obj, &ox, &oy, &ow, &oh);
2874 evas_output_viewport_get(evas_object_evas_get(obj), &cvx, &cvy, &cvw, &cvh);
2875 EINA_LIST_FOREACH(sd->wd->group_items, l, git)
2877 git->item->want_realize = EINA_FALSE;
2879 EINA_INLIST_FOREACH(sd->wd->blocks, itb)
2881 itb->w = sd->wd->minw;
2882 if (ELM_RECTS_INTERSECT(itb->x - sd->wd->pan_x + ox,
2883 itb->y - sd->wd->pan_y + oy,
2885 cvx, cvy, cvw, cvh))
2887 if ((!itb->realized) || (itb->changed))
2888 _item_block_realize(itb);
2889 _item_block_position(itb, in);
2893 if (itb->realized) _item_block_unrealize(itb);
2897 if ((!sd->wd->reorder_it) || (sd->wd->reorder_pan_move))
2898 _group_items_recalc(sd->wd);
2899 if ((sd->wd->reorder_mode) && (sd->wd->reorder_it))
2901 if (sd->wd->pan_y != sd->wd->reorder_old_pan_y)
2902 sd->wd->reorder_pan_move = EINA_TRUE;
2903 else sd->wd->reorder_pan_move = EINA_FALSE;
2904 evas_object_raise(sd->wd->VIEW(reorder_it));
2905 sd->wd->reorder_old_pan_y = sd->wd->pan_y;
2906 sd->wd->start_time = ecore_loop_time_get();
2908 _item_auto_scroll(sd->wd);
2909 evas_event_thaw(evas_object_evas_get(obj));
2910 evas_event_thaw_eval(evas_object_evas_get(obj));
2914 _pan_move(Evas_Object *obj,
2915 Evas_Coord x __UNUSED__,
2916 Evas_Coord y __UNUSED__)
2918 Pan *sd = evas_object_smart_data_get(obj);
2922 sd->wd->pan_changed = EINA_TRUE;
2923 evas_object_smart_changed(obj);
2924 if (sd->wd->calc_job) ecore_job_del(sd->wd->calc_job);
2925 sd->wd->calc_job = NULL;
2929 _hold_on(void *data __UNUSED__,
2931 void *event_info __UNUSED__)
2933 Widget_Data *wd = elm_widget_data_get(obj);
2935 elm_smart_scroller_hold_set(wd->scr, 1);
2939 _hold_off(void *data __UNUSED__,
2941 void *event_info __UNUSED__)
2943 Widget_Data *wd = elm_widget_data_get(obj);
2945 elm_smart_scroller_hold_set(wd->scr, 0);
2949 _freeze_on(void *data __UNUSED__,
2951 void *event_info __UNUSED__)
2953 Widget_Data *wd = elm_widget_data_get(obj);
2955 elm_smart_scroller_freeze_set(wd->scr, 1);
2959 _freeze_off(void *data __UNUSED__,
2961 void *event_info __UNUSED__)
2963 Widget_Data *wd = elm_widget_data_get(obj);
2965 elm_smart_scroller_freeze_set(wd->scr, 0);
2969 _scr_anim_start(void *data,
2970 Evas_Object *obj __UNUSED__,
2971 void *event_info __UNUSED__)
2973 evas_object_smart_callback_call(data, SIG_SCROLL_ANIM_START, NULL);
2977 _scr_anim_stop(void *data,
2978 Evas_Object *obj __UNUSED__,
2979 void *event_info __UNUSED__)
2981 evas_object_smart_callback_call(data, SIG_SCROLL_ANIM_STOP, NULL);
2985 _scr_drag_start(void *data,
2986 Evas_Object *obj __UNUSED__,
2987 void *event_info __UNUSED__)
2989 evas_object_smart_callback_call(data, SIG_SCROLL_DRAG_START, NULL);
2993 _scr_drag_stop(void *data,
2994 Evas_Object *obj __UNUSED__,
2995 void *event_info __UNUSED__)
2997 evas_object_smart_callback_call(data, SIG_SCROLL_DRAG_STOP, NULL);
3001 _edge_left(void *data,
3002 Evas_Object *scr __UNUSED__,
3003 void *event_info __UNUSED__)
3005 Evas_Object *obj = data;
3006 evas_object_smart_callback_call(obj, SIG_EDGE_LEFT, NULL);
3010 _edge_right(void *data,
3011 Evas_Object *scr __UNUSED__,
3012 void *event_info __UNUSED__)
3014 Evas_Object *obj = data;
3015 evas_object_smart_callback_call(obj, SIG_EDGE_RIGHT, NULL);
3019 _edge_top(void *data,
3020 Evas_Object *scr __UNUSED__,
3021 void *event_info __UNUSED__)
3023 Evas_Object *obj = data;
3024 evas_object_smart_callback_call(obj, SIG_EDGE_TOP, NULL);
3028 _edge_bottom(void *data,
3029 Evas_Object *scr __UNUSED__,
3030 void *event_info __UNUSED__)
3032 Evas_Object *obj = data;
3033 evas_object_smart_callback_call(obj, SIG_EDGE_BOTTOM, NULL);
3037 _mode_item_realize(Elm_Gen_Item *it)
3041 if ((it->item->mode_view) || (it->generation < it->wd->generation)) return;
3043 evas_event_freeze(evas_object_evas_get(it->wd->obj));
3044 it->item->mode_view = edje_object_add(evas_object_evas_get(WIDGET(it)));
3045 edje_object_scale_set(it->item->mode_view,
3046 elm_widget_scale_get(WIDGET(it)) *
3047 _elm_config->scale);
3048 evas_object_smart_member_add(it->item->mode_view, it->wd->pan_smart);
3049 elm_widget_sub_object_add(WIDGET(it), it->item->mode_view);
3051 strncpy(buf, "item", sizeof(buf));
3052 if (it->wd->compress)
3053 strncat(buf, "_compress", sizeof(buf) - strlen(buf));
3055 if (it->item->order_num_in & 0x1) strncat(buf, "_odd", sizeof(buf) - strlen(buf));
3056 strncat(buf, "/", sizeof(buf) - strlen(buf));
3057 strncat(buf, it->itc->mode_item_style, sizeof(buf) - strlen(buf));
3059 _elm_theme_object_set(WIDGET(it), it->item->mode_view, "genlist", buf,
3060 elm_widget_style_get(WIDGET(it)));
3061 edje_object_mirrored_set(it->item->mode_view,
3062 elm_widget_mirrored_get(WIDGET(it)));
3064 /* signal callback add */
3065 evas_object_event_callback_add(it->item->mode_view, EVAS_CALLBACK_MOUSE_DOWN,
3067 evas_object_event_callback_add(it->item->mode_view, EVAS_CALLBACK_MOUSE_UP,
3069 evas_object_event_callback_add(it->item->mode_view, EVAS_CALLBACK_MOUSE_MOVE,
3072 /* text_get, content_get, state_get */
3073 /* FIXME: If you see that assert, please notify us and we
3074 will clean our mess */
3075 assert(eina_list_count(it->item->mode_content_objs) == 0);
3077 _item_text_realize(it, it->item->mode_view, &it->item->mode_texts, NULL);
3078 it->item->mode_content_objs =
3079 _item_content_realize(it, it->item->mode_view,
3080 &it->item->mode_contents, NULL);
3081 _item_state_realize(it, it->item->mode_view, &it->item->mode_states, NULL);
3083 edje_object_part_swallow(it->item->mode_view,
3084 edje_object_data_get(it->item->mode_view, "mode_part"),
3087 it->want_unrealize = EINA_FALSE;
3088 evas_event_thaw(evas_object_evas_get(it->wd->obj));
3089 evas_event_thaw_eval(evas_object_evas_get(it->wd->obj));
3093 _mode_item_unrealize(Elm_Gen_Item *it)
3095 Widget_Data *wd = it->wd;
3096 Evas_Object *content;
3097 if (!it->item->mode_view) return;
3099 evas_event_freeze(evas_object_evas_get(it->wd->obj));
3100 elm_widget_stringlist_free(it->item->mode_texts);
3101 it->item->mode_texts = NULL;
3102 elm_widget_stringlist_free(it->item->mode_contents);
3103 it->item->mode_contents = NULL;
3104 elm_widget_stringlist_free(it->item->mode_states);
3106 EINA_LIST_FREE(it->item->mode_content_objs, content)
3107 evas_object_del(content);
3109 edje_object_part_unswallow(it->item->mode_view, VIEW(it));
3110 evas_object_smart_member_add(VIEW(it), wd->pan_smart);
3111 evas_object_del(it->item->mode_view);
3112 it->item->mode_view = NULL;
3114 if (wd->mode_item == it)
3115 wd->mode_item = NULL;
3116 evas_event_thaw(evas_object_evas_get(it->wd->obj));
3117 evas_event_thaw_eval(evas_object_evas_get(it->wd->obj));
3121 _item_mode_set(Elm_Gen_Item *it)
3124 Widget_Data *wd = it->wd;
3129 it->item->nocache = EINA_TRUE;
3131 if (wd->scr_hold_timer)
3133 ecore_timer_del(wd->scr_hold_timer);
3134 wd->scr_hold_timer = NULL;
3136 elm_smart_scroller_hold_set(wd->scr, EINA_TRUE);
3137 wd->scr_hold_timer = ecore_timer_add(0.1, _scr_hold_timer_cb, wd);
3139 evas_event_freeze(evas_object_evas_get(it->wd->obj));
3140 _mode_item_realize(it);
3141 if (it->item->group_item)
3142 evas_object_raise(it->item->VIEW(group_item));
3143 _item_position(it, it->item->mode_view, it->item->scrl_x, it->item->scrl_y);
3144 evas_event_thaw(evas_object_evas_get(it->wd->obj));
3145 evas_event_thaw_eval(evas_object_evas_get(it->wd->obj));
3147 snprintf(buf, sizeof(buf), "elm,state,%s,active", wd->mode_type);
3148 edje_object_signal_emit(it->item->mode_view, buf, "elm");
3152 _item_mode_unset(Widget_Data *wd)
3155 if (!wd->mode_item) return;
3156 char buf[1024], buf2[1024];
3160 it->item->nocache = EINA_TRUE;
3162 snprintf(buf, sizeof(buf), "elm,state,%s,passive", wd->mode_type);
3163 snprintf(buf2, sizeof(buf2), "elm,state,%s,passive,finished", wd->mode_type);
3165 edje_object_signal_emit(it->item->mode_view, buf, "elm");
3166 edje_object_signal_callback_add(it->item->mode_view, buf2, "elm", _mode_finished_signal_cb, it);
3168 wd->mode_item = NULL;
3172 _edit_mode_item_position(Elm_Gen_Item *it, int itx, int ity)
3174 if ((!it) || (!it->wd->edit_mode)) return;
3175 evas_object_resize(it->edit_obj, it->item->w, it->item->h);
3176 evas_object_move(it->edit_obj, itx, ity);
3180 _edit_mode_item_realize(Elm_Gen_Item *it, Eina_Bool effect_on)
3183 const char *stacking_even;
3184 const char *stacking;
3186 if ((!it) || (it->item->edit_mode_item_realized) ||
3187 (it->generation < it->wd->generation))
3190 it->edit_obj = edje_object_add(evas_object_evas_get(WIDGET(it)));
3191 edje_object_scale_set(it->edit_obj, elm_widget_scale_get(WIDGET(it)) *
3192 _elm_config->scale);
3193 evas_object_smart_member_add(it->edit_obj, it->wd->pan_smart);
3194 elm_widget_sub_object_add(WIDGET(it), it->edit_obj);
3196 if (it->item->flags & ELM_GENLIST_ITEM_SUBITEMS)
3197 strncpy(buf, "tree", sizeof(buf));
3198 else strncpy(buf, "item", sizeof(buf));
3199 if (it->wd->compress)
3200 strncat(buf, "_compress", sizeof(buf) - strlen(buf));
3202 strncat(buf, "/", sizeof(buf) - strlen(buf));
3203 strncat(buf, it->itc->edit_item_style, sizeof(buf) - strlen(buf));
3205 _elm_theme_object_set(WIDGET(it), it->edit_obj, "genlist", buf,
3206 elm_widget_style_get(WIDGET(it)));
3208 stacking_even = edje_object_data_get(VIEW(it), "stacking_even");
3209 if (!stacking_even) stacking_even = "above";
3210 it->item->stacking_even = !!strcmp("above", stacking_even);
3212 stacking = edje_object_data_get(VIEW(it), "stacking");
3213 if (!stacking) stacking = "yes";
3214 it->item->nostacking = !!strcmp("yes", stacking);
3216 edje_object_mirrored_set(it->edit_obj,
3217 elm_widget_mirrored_get(WIDGET(it)));
3219 _elm_genlist_item_odd_even_update(it);
3220 _elm_genlist_item_state_update(it, NULL);
3222 if (effect_on) edje_object_signal_emit(it->edit_obj, "elm,state,edit,enabled,effect", "elm");
3223 else edje_object_signal_emit(it->edit_obj, "elm,state,edit,enabled", "elm");
3225 evas_object_event_callback_add(it->edit_obj, EVAS_CALLBACK_MOUSE_DOWN,
3227 evas_object_event_callback_add(it->edit_obj, EVAS_CALLBACK_MOUSE_UP,
3229 evas_object_event_callback_add(it->edit_obj, EVAS_CALLBACK_MOUSE_MOVE,
3231 evas_object_event_callback_add(it->edit_obj, EVAS_CALLBACK_MULTI_DOWN,
3233 evas_object_event_callback_add(it->edit_obj, EVAS_CALLBACK_MULTI_UP,
3235 evas_object_event_callback_add(it->edit_obj, EVAS_CALLBACK_MULTI_MOVE,
3238 _item_text_realize(it, it->edit_obj, &it->item->edit_texts, NULL);
3239 it->item->edit_content_objs =
3240 _item_content_realize(it, it->edit_obj, &it->item->edit_contents, NULL);
3241 _item_state_realize(it, it->edit_obj, &it->item->edit_states, NULL);
3242 edje_object_part_swallow(it->edit_obj, "elm.swallow.edit.content", VIEW(it));
3244 _edit_mode_item_position(it, it->item->scrl_x, it->item->scrl_y);
3245 evas_object_show(it->edit_obj);
3247 it->item->edit_mode_item_realized = EINA_TRUE;
3248 it->want_unrealize = EINA_FALSE;
3252 _edit_mode_item_unrealize(Elm_Gen_Item *it)
3255 if ((!it) || (!it->item->edit_mode_item_realized)) return;
3257 edje_object_part_unswallow(it->edit_obj, VIEW(it));
3258 evas_object_smart_member_add(VIEW(it), it->wd->pan_smart);
3259 elm_widget_sub_object_add(WIDGET(it), VIEW(it));
3260 _elm_genlist_item_odd_even_update(it);
3261 _elm_genlist_item_state_update(it, NULL);
3263 evas_object_del(it->edit_obj);
3264 it->edit_obj = NULL;
3265 elm_widget_stringlist_free(it->item->edit_texts);
3266 it->item->edit_texts = NULL;
3267 elm_widget_stringlist_free(it->item->edit_contents);
3268 it->item->edit_contents = NULL;
3269 elm_widget_stringlist_free(it->item->edit_states);
3270 it->item->edit_states = NULL;
3271 EINA_LIST_FREE(it->item->edit_content_objs, icon)
3272 evas_object_del(icon);
3273 edje_object_message_signal_process(it->edit_obj);
3275 evas_object_event_callback_del_full(it->edit_obj, EVAS_CALLBACK_MOUSE_DOWN,
3277 evas_object_event_callback_del_full(it->edit_obj, EVAS_CALLBACK_MOUSE_UP,
3279 evas_object_event_callback_del_full(it->edit_obj, EVAS_CALLBACK_MOUSE_MOVE,
3281 evas_object_event_callback_del_full(it->edit_obj, EVAS_CALLBACK_MULTI_DOWN,
3283 evas_object_event_callback_del_full(it->edit_obj, EVAS_CALLBACK_MULTI_UP,
3285 evas_object_event_callback_del_full(it->edit_obj, EVAS_CALLBACK_MULTI_MOVE,
3287 it->item->edit_mode_item_realized = EINA_FALSE;
3291 _item_auto_scroll(Widget_Data *wd)
3294 Elm_Gen_Item *tmp_item = NULL;
3296 if ((wd->expanded_item) && (wd->auto_scroll_enabled))
3298 tmp_item = eina_list_data_get(eina_list_last(wd->expanded_item->item->items));
3299 if (!tmp_item) return;
3300 wd->show_item = tmp_item;
3301 wd->bring_in = EINA_TRUE;
3302 wd->scrollto_type = ELM_GENLIST_ITEM_SCROLLTO_IN;
3303 if ((wd->show_item->item->queued) || (!wd->show_item->item->mincalcd))
3305 wd->show_item->item->showme = EINA_TRUE;
3306 wd->auto_scroll_enabled = EINA_FALSE;
3314 elm_genlist_add(Evas_Object *parent)
3319 Evas_Coord minw, minh;
3320 static Evas_Smart *smart = NULL;
3324 static Evas_Smart_Class sc;
3326 evas_object_smart_clipped_smart_set(&_pan_sc);
3328 sc.name = "elm_genlist_pan";
3329 sc.version = EVAS_SMART_CLASS_VERSION;
3332 sc.resize = _pan_resize;
3333 sc.move = _pan_move;
3334 sc.calculate = _pan_calculate;
3335 if (!(smart = evas_smart_class_new(&sc))) return NULL;
3338 ELM_WIDGET_STANDARD_SETUP(wd, Widget_Data, parent, e, obj, NULL);
3340 ELM_SET_WIDTYPE(widtype, "genlist");
3342 elm_widget_type_set(obj, "genlist");
3343 elm_widget_sub_object_add(parent, obj);
3344 elm_widget_on_focus_hook_set(obj, _on_focus_hook, NULL);
3345 elm_widget_signal_emit_hook_set(obj, _signal_emit_hook);
3346 elm_widget_data_set(obj, wd);
3347 elm_widget_del_hook_set(obj, _del_hook);
3348 elm_widget_del_pre_hook_set(obj, _del_pre_hook);
3349 elm_widget_theme_hook_set(obj, _theme_hook);
3350 elm_widget_can_focus_set(obj, EINA_TRUE);
3351 elm_widget_event_hook_set(obj, _event_hook);
3352 elm_widget_on_show_region_hook_set(obj, _show_region_hook, obj);
3353 elm_widget_translate_hook_set(obj, _translate_hook);
3356 wd->scr = elm_smart_scroller_add(e);
3357 elm_smart_scroller_widget_set(wd->scr, obj);
3358 elm_smart_scroller_object_theme_set(obj, wd->scr, "genlist", "base",
3359 elm_widget_style_get(obj));
3360 elm_smart_scroller_bounce_allow_set(wd->scr, EINA_FALSE,
3361 _elm_config->thumbscroll_bounce_enable);
3362 elm_widget_resize_object_set(obj, wd->scr);
3364 evas_object_smart_callback_add(wd->scr, "animate,start", _scr_anim_start, obj);
3365 evas_object_smart_callback_add(wd->scr, "animate,stop", _scr_anim_stop, obj);
3366 evas_object_smart_callback_add(wd->scr, "drag,start", _scr_drag_start, obj);
3367 evas_object_smart_callback_add(wd->scr, "drag,stop", _scr_drag_stop, obj);
3368 evas_object_smart_callback_add(wd->scr, "edge,left", _edge_left, obj);
3369 evas_object_smart_callback_add(wd->scr, "edge,right", _edge_right, obj);
3370 evas_object_smart_callback_add(wd->scr, "edge,top", _edge_top, obj);
3371 evas_object_smart_callback_add(wd->scr, "edge,bottom", _edge_bottom, obj);
3374 wd->mode = ELM_LIST_SCROLL;
3375 wd->max_items_per_block = MAX_ITEMS_PER_BLOCK;
3376 wd->item_cache_max = wd->max_items_per_block * 2;
3377 wd->longpress_timeout = _elm_config->longpress_timeout;
3379 evas_object_smart_callback_add(obj, "scroll-hold-on", _hold_on, obj);
3380 evas_object_smart_callback_add(obj, "scroll-hold-off", _hold_off, obj);
3381 evas_object_smart_callback_add(obj, "scroll-freeze-on", _freeze_on, obj);
3382 evas_object_smart_callback_add(obj, "scroll-freeze-off", _freeze_off, obj);
3384 wd->pan_smart = evas_object_smart_add(e, smart);
3385 wd->pan = evas_object_smart_data_get(wd->pan_smart);
3388 elm_smart_scroller_extern_pan_set(wd->scr, wd->pan_smart,
3389 _pan_set, _pan_get, _pan_max_get,
3390 _pan_min_get, _pan_child_size_get);
3392 edje_object_size_min_calc(elm_smart_scroller_edje_object_get(wd->scr),
3394 evas_object_size_hint_min_set(obj, minw, minh);
3396 evas_object_smart_callbacks_descriptions_set(obj, _signals);
3398 _mirrored_set(obj, elm_widget_mirrored_get(obj));
3404 _item_select(Elm_Gen_Item *it)
3406 if ((it->wd->no_select) || (it->generation < it->wd->generation) || (it->mode_set)) return;
3409 it->selected = EINA_TRUE;
3410 it->wd->selected = eina_list_append(it->wd->selected, it);
3412 else if (!it->wd->always_select) return;
3414 evas_object_ref(WIDGET(it));
3417 if (it->func.func) it->func.func((void *)it->func.data, WIDGET(it), it);
3418 if (it->generation == it->wd->generation)
3419 evas_object_smart_callback_call(WIDGET(it), SIG_SELECTED, it);
3422 evas_object_unref(WIDGET(it));
3423 if ((it->wd->clear_me) && (!it->wd->walking))
3424 _elm_genlist_clear(WIDGET(it), EINA_TRUE);
3427 if ((!it->walking) && (it->generation < it->wd->generation))
3432 elm_widget_item_free(it);
3436 it->wd->last_selected_item = (Elm_Object_Item *) it;
3440 static Evas_Object *
3441 _item_content_get_hook(Elm_Gen_Item *it, const char *part)
3443 return edje_object_part_swallow_get(VIEW(it), part);
3447 _item_content_set_hook(Elm_Gen_Item *it, const char *part, Evas_Object *content)
3449 if (content && part)
3451 it->content_objs = eina_list_append(it->content_objs, content);
3452 edje_object_part_swallow(VIEW(it), part, content);
3456 static Evas_Object *
3457 _item_content_unset_hook(Elm_Gen_Item *it, const char *part)
3460 obj = edje_object_part_swallow_get(VIEW(it), part);
3461 if (!obj) return NULL;
3462 it->content_objs = eina_list_remove(it->content_objs, obj);
3463 edje_object_part_unswallow(VIEW(it), obj);
3468 _item_text_hook(Elm_Gen_Item *it, const char *part)
3470 if (!it->itc->func.text_get) return NULL;
3471 return edje_object_part_text_get(VIEW(it), part);
3475 _item_disable_hook(Elm_Object_Item *it)
3477 ELM_OBJ_ITEM_CHECK_OR_RETURN(it);
3480 Elm_Gen_Item *_it = (Elm_Gen_Item *) it;
3482 if (_it->generation < _it->wd->generation) return;
3485 elm_genlist_item_selected_set(it, EINA_FALSE);
3489 if (elm_widget_item_disabled_get(it))
3491 edje_object_signal_emit(VIEW(_it), "elm,state,disabled", "elm");
3493 edje_object_signal_emit(_it->edit_obj, "elm,state,disabled", "elm");
3497 edje_object_signal_emit(VIEW(_it), "elm,state,enabled", "elm");
3499 edje_object_signal_emit(_it->edit_obj, "elm,state,enabled", "elm");
3501 EINA_LIST_FOREACH(_it->content_objs, l, obj)
3502 elm_widget_disabled_set(obj, elm_widget_item_disabled_get(_it));
3507 _item_del_pre_hook(Elm_Object_Item *it)
3509 ELM_OBJ_ITEM_CHECK_OR_RETURN(it, EINA_FALSE);
3510 Elm_Gen_Item *_it = (Elm_Gen_Item *) it;
3512 if ((_it->relcount > 0) || (_it->walking > 0))
3514 elm_genlist_item_subitems_clear(it);
3515 if (_it->wd->show_item == _it) _it->wd->show_item = NULL;
3516 _elm_genlist_item_del_notserious(_it);
3517 if (_it->item->block)
3519 if (_it->realized) _elm_genlist_item_unrealize(_it, EINA_FALSE);
3520 _it->item->block->changed = EINA_TRUE;
3521 if (_it->wd->calc_job) ecore_job_del(_it->wd->calc_job);
3522 _it->wd->calc_job = ecore_job_add(_calc_job, _it->wd);
3526 _it->parent->item->items =
3527 eina_list_remove(_it->parent->item->items, it);
3537 _elm_genlist_item_new(Widget_Data *wd,
3538 const Elm_Gen_Item_Class *itc,
3540 Elm_Gen_Item *parent,
3542 const void *func_data)
3546 it = elm_widget_item_new(wd->obj, Elm_Gen_Item);
3547 if (!it) return NULL;
3549 it->generation = wd->generation;
3551 elm_genlist_item_class_ref((Elm_Genlist_Item_Class *)itc);
3552 it->base.data = data;
3553 it->parent = parent;
3554 it->func.func = func;
3555 it->func.data = func_data;
3556 elm_widget_item_content_get_hook_set(it, _item_content_get_hook);
3557 elm_widget_item_content_set_hook_set(it, _item_content_set_hook);
3558 elm_widget_item_content_unset_hook_set(it, _item_content_unset_hook);
3559 elm_widget_item_disable_hook_set(it, _item_disable_hook);
3560 elm_widget_item_del_pre_hook_set(it, _item_del_pre_hook);
3562 it->sel_cb = (Ecore_Cb)_item_select;
3564 elm_widget_item_text_get_hook_set(it, _item_text_hook);
3568 static Elm_Gen_Item *
3569 _item_new(Widget_Data *wd,
3570 const Elm_Genlist_Item_Class *itc,
3572 Elm_Gen_Item *parent,
3573 Elm_Genlist_Item_Flags flags,
3575 const void *func_data)
3577 Elm_Gen_Item *it, *it2;
3580 it = _elm_genlist_item_new(wd, itc, data, parent, func, func_data);
3581 if (!it) return NULL;
3582 it->item = ELM_NEW(Elm_Gen_Item_Type);
3583 it->item->flags = flags;
3584 if (flags & ELM_GENLIST_ITEM_GROUP) it->group++;
3585 it->item->expanded_depth = 0;
3586 ELM_GEN_ITEM_SETUP(it);
3589 if (it->parent->group)
3590 it->item->group_item = parent;
3591 else if (it->parent->item->group_item)
3592 it->item->group_item = it->parent->item->group_item;
3594 for (it2 = it, depth = 0; it2->parent; it2 = it2->parent)
3596 if (!it2->parent->group) depth += 1;
3598 it->item->expanded_depth = depth;
3604 _item_block_new(Widget_Data *wd, Eina_Bool prepend)
3608 itb = calloc(1, sizeof(Item_Block));
3609 if (!itb) return NULL;
3613 wd->blocks = eina_inlist_prepend(wd->blocks, EINA_INLIST_GET(itb));
3614 _item_block_position_update(wd->blocks, 0);
3618 wd->blocks = eina_inlist_append(wd->blocks, EINA_INLIST_GET(itb));
3619 itb->position_update = EINA_TRUE;
3620 if (wd->blocks != EINA_INLIST_GET(itb))
3622 itb->position = ((Item_Block *) (EINA_INLIST_GET(itb)->prev))->position + 1;
3633 _item_block_add(Widget_Data *wd,
3636 Item_Block *itb = NULL;
3643 itb = calloc(1, sizeof(Item_Block));
3644 if (!itb) return EINA_FALSE;
3646 if (!it->item->rel->item->block)
3649 eina_inlist_append(wd->blocks, EINA_INLIST_GET(itb));
3650 itb->items = eina_list_append(itb->items, it);
3651 itb->position_update = EINA_TRUE;
3652 it->position = eina_list_count(itb->items);
3653 it->position_update = EINA_TRUE;
3655 if (wd->blocks != EINA_INLIST_GET(itb))
3657 itb->position = ((Item_Block *) (EINA_INLIST_GET(itb)->prev))->position + 1;
3668 tmp = eina_list_data_find_list(itb->items, it->item->rel);
3669 if (it->item->before)
3671 wd->blocks = eina_inlist_prepend_relative
3672 (wd->blocks, EINA_INLIST_GET(itb),
3673 EINA_INLIST_GET(it->item->rel->item->block));
3675 eina_list_prepend_relative_list(itb->items, it, tmp);
3677 /* Update index from where we prepended */
3678 _item_position_update(eina_list_prev(tmp), it->item->rel->position);
3679 _item_block_position_update(EINA_INLIST_GET(itb),
3680 it->item->rel->item->block->position);
3684 wd->blocks = eina_inlist_append_relative
3685 (wd->blocks, EINA_INLIST_GET(itb),
3686 EINA_INLIST_GET(it->item->rel->item->block));
3688 eina_list_append_relative_list(itb->items, it, tmp);
3690 /* Update block index from where we appended */
3691 _item_position_update(eina_list_next(tmp), it->item->rel->position + 1);
3692 _item_block_position_update(EINA_INLIST_GET(itb),
3693 it->item->rel->item->block->position + 1);
3699 if (it->item->before)
3703 itb = (Item_Block *)(wd->blocks);
3704 if (itb->count >= wd->max_items_per_block)
3706 itb = _item_block_new(wd, EINA_TRUE);
3707 if (!itb) return EINA_FALSE;
3712 itb = _item_block_new(wd, EINA_TRUE);
3713 if (!itb) return EINA_FALSE;
3715 itb->items = eina_list_prepend(itb->items, it);
3717 _item_position_update(itb->items, 0);
3723 itb = (Item_Block *)(wd->blocks->last);
3724 if (itb->count >= wd->max_items_per_block)
3726 itb = _item_block_new(wd, EINA_FALSE);
3727 if (!itb) return EINA_FALSE;
3732 itb = _item_block_new(wd, EINA_FALSE);
3733 if (!itb) return EINA_FALSE;
3735 itb->items = eina_list_append(itb->items, it);
3736 it->position = eina_list_count(itb->items);
3744 if (it->item->rel->item->queued)
3746 /* NOTE: for a strange reason eina_list and eina_inlist don't have the same property
3747 on sorted insertion order, so the queue is not always ordered like the item list.
3748 This lead to issue where we depend on an item that is not yet created. As a quick
3749 work around, we reschedule the calc of the item and stop reordering the list to
3750 prevent any nasty issue to show up here.
3752 wd->queue = eina_list_append(wd->queue, it);
3753 wd->requeued = EINA_TRUE;
3754 it->item->queued = EINA_TRUE;
3757 itb = it->item->rel->item->block;
3758 if (!itb) goto newblock;
3759 tmp = eina_list_data_find_list(itb->items, it->item->rel);
3760 if (it->item->before)
3762 itb->items = eina_list_prepend_relative_list(itb->items, it, tmp);
3763 _item_position_update(eina_list_prev(tmp), it->item->rel->position);
3767 itb->items = eina_list_append_relative_list(itb->items, it, tmp);
3768 _item_position_update(eina_list_next(tmp), it->item->rel->position + 1);
3772 itb->changed = EINA_TRUE;
3773 it->item->block = itb;
3774 if (itb->wd->calc_job) ecore_job_del(itb->wd->calc_job);
3775 itb->wd->calc_job = ecore_job_add(_calc_job, itb->wd);
3778 it->item->rel->relcount--;
3779 if ((it->item->rel->generation < it->wd->generation) && (!it->item->rel->relcount))
3781 _item_del(it->item->rel);
3782 elm_widget_item_free(it->item->rel);
3784 it->item->rel = NULL;
3786 if (itb->count > itb->wd->max_items_per_block)
3791 Eina_Bool done = EINA_FALSE;
3793 newc = itb->count / 2;
3795 if (EINA_INLIST_GET(itb)->prev)
3797 Item_Block *itbp = (Item_Block *)(EINA_INLIST_GET(itb)->prev);
3799 if (itbp->count + newc < wd->max_items_per_block / 2)
3801 /* moving items to previous block */
3802 while ((itb->count > newc) && (itb->items))
3804 it2 = eina_list_data_get(itb->items);
3805 itb->items = eina_list_remove_list(itb->items, itb->items);
3808 itbp->items = eina_list_append(itbp->items, it2);
3809 it2->item->block = itbp;
3817 if (!done && EINA_INLIST_GET(itb)->next)
3819 Item_Block *itbn = (Item_Block *)(EINA_INLIST_GET(itb)->next);
3821 if (itbn->count + newc < wd->max_items_per_block / 2)
3823 /* moving items to next block */
3824 while ((itb->count > newc) && (itb->items))
3828 l = eina_list_last(itb->items);
3829 it2 = eina_list_data_get(l);
3830 itb->items = eina_list_remove_list(itb->items, l);
3833 itbn->items = eina_list_prepend(itbn->items, it2);
3834 it2->item->block = itbn;
3844 /* moving items to new block */
3845 itb2 = calloc(1, sizeof(Item_Block));
3846 if (!itb2) return EINA_FALSE;
3849 eina_inlist_append_relative(wd->blocks, EINA_INLIST_GET(itb2),
3850 EINA_INLIST_GET(itb));
3851 itb2->changed = EINA_TRUE;
3852 while ((itb->count > newc) && (itb->items))
3856 l = eina_list_last(itb->items);
3858 itb->items = eina_list_remove_list(itb->items, l);
3861 itb2->items = eina_list_prepend(itb2->items, it2);
3862 it2->item->block = itb2;
3872 _queue_process(Widget_Data *wd)
3875 Eina_Bool showme = EINA_FALSE;
3878 t0 = ecore_loop_time_get();
3879 //evas_event_freeze(evas_object_evas_get(wd->obj));
3880 for (n = 0; (wd->queue) && (n < 128); n++)
3884 it = eina_list_data_get(wd->queue);
3885 wd->queue = eina_list_remove_list(wd->queue, wd->queue);
3886 it->item->queued = EINA_FALSE;
3887 if (!_item_block_add(wd, it)) continue;
3889 _item_block_realize(it->item->block);
3890 t = ecore_time_get();
3891 if (it->item->block->changed)
3893 showme = _item_block_recalc(it->item->block, it->item->block->num, EINA_TRUE);
3894 it->item->block->changed = 0;
3895 if (wd->pan_changed)
3897 if (wd->calc_job) ecore_job_del(wd->calc_job);
3898 wd->calc_job = NULL;
3900 wd->pan_changed = EINA_FALSE;
3903 if (showme) it->item->block->showme = EINA_TRUE;
3904 /* same as eina_inlist_count > 1 */
3905 if (wd->blocks && wd->blocks->next)
3907 if ((t - t0) > (ecore_animator_frametime_get())) break;
3910 //evas_event_thaw(evas_object_evas_get(wd->obj));
3911 //evas_event_thaw_eval(evas_object_evas_get(wd->obj));
3916 _idle_process(void *data, Eina_Bool *wakeup)
3918 Widget_Data *wd = data;
3921 //static double q_start = 0.0;
3922 //if (q_start == 0.0) q_start = ecore_time_get();
3924 if (_queue_process(wd) > 0) *wakeup = EINA_TRUE;
3928 //printf("PROCESS TIME: %3.3f\n", ecore_time_get() - q_start);
3930 return ECORE_CALLBACK_CANCEL;
3932 return ECORE_CALLBACK_RENEW;
3936 _item_idle_enterer(void *data)
3938 Widget_Data *wd = data;
3939 Eina_Bool wakeup = EINA_FALSE;
3940 Eina_Bool ok = _idle_process(data, &wakeup);
3945 if (wd->calc_job) ecore_job_del(wd->calc_job);
3946 wd->calc_job = ecore_job_add(_calc_job, wd);
3948 if (ok == ECORE_CALLBACK_CANCEL) wd->queue_idle_enterer = NULL;
3953 _item_queue(Widget_Data *wd,
3957 if (it->item->queued) return;
3958 it->item->queued = EINA_TRUE;
3959 if (cb && !wd->requeued)
3960 wd->queue = eina_list_sorted_insert(wd->queue, cb, it);
3962 wd->queue = eina_list_append(wd->queue, it);
3963 // FIXME: why does a freeze then thaw here cause some genlist
3964 // elm_genlist_item_append() to be much much slower?
3965 // evas_event_freeze(evas_object_evas_get(wd->obj));
3966 while ((wd->queue) && ((!wd->blocks) || (!wd->blocks->next)))
3968 if (wd->queue_idle_enterer)
3970 ecore_idle_enterer_del(wd->queue_idle_enterer);
3971 wd->queue_idle_enterer = NULL;
3975 // evas_event_thaw(evas_object_evas_get(wd->obj));
3976 // evas_event_thaw_eval(evas_object_evas_get(wd->obj));
3977 if (!wd->queue_idle_enterer)
3978 wd->queue_idle_enterer = ecore_idle_enterer_add(_item_idle_enterer, wd);
3982 _elm_genlist_item_compare_data(const void *data, const void *data1)
3984 const Elm_Gen_Item *it = data;
3985 const Elm_Gen_Item *item1 = data1;
3987 return it->wd->item_compare_data_cb(it->base.data, item1->base.data);
3991 _elm_genlist_item_compare(const void *data, const void *data1)
3993 const Elm_Gen_Item *it, *item1;
3994 it = ELM_GEN_ITEM_FROM_INLIST(data);
3995 item1 = ELM_GEN_ITEM_FROM_INLIST(data1);
3996 return it->wd->item_compare_cb(it, item1);
4000 _elm_genlist_item_list_compare(const void *data, const void *data1)
4002 const Elm_Gen_Item *it = data;
4003 const Elm_Gen_Item *item1 = data1;
4004 return it->wd->item_compare_cb(it, item1);
4008 _item_move_after(Elm_Gen_Item *it, Elm_Gen_Item *after)
4013 it->wd->items = eina_inlist_remove(it->wd->items, EINA_INLIST_GET(it));
4014 _item_block_del(it);
4016 it->wd->items = eina_inlist_append_relative(it->wd->items, EINA_INLIST_GET(it), EINA_INLIST_GET(after));
4017 it->item->rel = after;
4018 it->item->rel->relcount++;
4019 it->item->before = EINA_FALSE;
4020 if (after->item->group_item) it->item->group_item = after->item->group_item;
4021 _item_queue(it->wd, it, NULL);
4023 evas_object_smart_callback_call(WIDGET(it), SIG_MOVED, it);
4027 _item_move_before(Elm_Gen_Item *it, Elm_Gen_Item *before)
4030 if (!before) return;
4032 it->wd->items = eina_inlist_remove(it->wd->items, EINA_INLIST_GET(it));
4033 _item_block_del(it);
4034 it->wd->items = eina_inlist_prepend_relative(it->wd->items, EINA_INLIST_GET(it), EINA_INLIST_GET(before));
4035 it->item->rel = before;
4036 it->item->rel->relcount++;
4037 it->item->before = EINA_TRUE;
4038 if (before->item->group_item) it->item->group_item = before->item->group_item;
4039 _item_queue(it->wd, it, NULL);
4041 evas_object_smart_callback_call(WIDGET(it), SIG_MOVED, it);
4045 elm_genlist_items_count(const Evas_Object *obj)
4047 ELM_CHECK_WIDTYPE(obj, widtype) 0;
4048 Widget_Data *wd = elm_widget_data_get(obj);
4050 return wd->item_count;
4053 EAPI Elm_Object_Item *
4054 elm_genlist_item_append(Evas_Object *obj,
4055 const Elm_Genlist_Item_Class *itc,
4057 Elm_Object_Item *parent,
4058 Elm_Genlist_Item_Flags flags,
4060 const void *func_data)
4062 ELM_CHECK_WIDTYPE(obj, widtype) NULL;
4063 Widget_Data *wd = elm_widget_data_get(obj);
4064 if (!wd) return NULL;
4065 Elm_Gen_Item *it = _item_new(wd, itc, data, (Elm_Gen_Item *) parent, flags,
4067 if (!it) return NULL;
4071 wd->group_items = eina_list_append(wd->group_items, it);
4072 wd->items = eina_inlist_append(wd->items, EINA_INLIST_GET(it));
4073 it->item->rel = NULL;
4077 Elm_Gen_Item *it2 = NULL;
4078 Eina_List *ll = eina_list_last(it->parent->item->items);
4079 if (ll) it2 = ll->data;
4080 it->parent->item->items = eina_list_append(it->parent->item->items, it);
4081 if (!it2) it2 = it->parent;
4083 eina_inlist_append_relative(wd->items, EINA_INLIST_GET(it),
4084 EINA_INLIST_GET(it2));
4085 it->item->rel = it2;
4086 it->item->rel->relcount++;
4088 it->item->before = EINA_FALSE;
4089 _item_queue(wd, it, NULL);
4090 return (Elm_Object_Item *) it;
4093 EAPI Elm_Object_Item *
4094 elm_genlist_item_prepend(Evas_Object *obj,
4095 const Elm_Genlist_Item_Class *itc,
4097 Elm_Object_Item *parent,
4098 Elm_Genlist_Item_Flags flags,
4100 const void *func_data)
4102 ELM_CHECK_WIDTYPE(obj, widtype) NULL;
4103 Widget_Data *wd = elm_widget_data_get(obj);
4104 if (!wd) return NULL;
4105 Elm_Gen_Item *it = _item_new(wd, itc, data, (Elm_Gen_Item *) parent, flags,
4107 if (!it) return NULL;
4111 wd->group_items = eina_list_prepend(wd->group_items, it);
4112 wd->items = eina_inlist_prepend(wd->items, EINA_INLIST_GET(it));
4113 it->item->rel = NULL;
4117 Elm_Gen_Item *it2 = NULL;
4118 Eina_List *ll = it->parent->item->items;
4119 if (ll) it2 = ll->data;
4120 it->parent->item->items = eina_list_prepend(it->parent->item->items, it);
4121 if (!it2) it2 = it->parent;
4123 eina_inlist_prepend_relative(wd->items, EINA_INLIST_GET(it),
4124 EINA_INLIST_GET(it2));
4125 it->item->rel = it2;
4126 it->item->rel->relcount++;
4128 it->item->before = EINA_TRUE;
4129 _item_queue(wd, it, NULL);
4130 return (Elm_Object_Item *) it;
4133 EAPI Elm_Object_Item *
4134 elm_genlist_item_insert_after(Evas_Object *obj,
4135 const Elm_Genlist_Item_Class *itc,
4137 Elm_Object_Item *parent,
4138 Elm_Object_Item *after,
4139 Elm_Genlist_Item_Flags flags,
4141 const void *func_data)
4143 ELM_CHECK_WIDTYPE(obj, widtype) NULL;
4144 ELM_OBJ_ITEM_CHECK_OR_RETURN(after, NULL);
4145 Widget_Data *wd = elm_widget_data_get(obj);
4146 Elm_Gen_Item *_after = (Elm_Gen_Item *) after;
4147 if (!wd) return NULL;
4148 /* It makes no sense to insert after in an empty list with after != NULL, something really bad is happening in your app. */
4149 EINA_SAFETY_ON_NULL_RETURN_VAL(wd->items, NULL);
4151 Elm_Gen_Item *it = _item_new(wd, itc, data, (Elm_Gen_Item *) parent, flags,
4153 if (!it) return NULL;
4156 if ((it->group) && (_after->group))
4157 wd->group_items = eina_list_append_relative(wd->group_items, it,
4162 it->parent->item->items =
4163 eina_list_append_relative(it->parent->item->items, it, _after);
4165 wd->items = eina_inlist_append_relative(wd->items, EINA_INLIST_GET(it),
4166 EINA_INLIST_GET(_after));
4167 it->item->rel = _after;
4168 it->item->rel->relcount++;
4169 it->item->before = EINA_FALSE;
4170 _item_queue(wd, it, NULL);
4171 return (Elm_Object_Item *) it;
4174 EAPI Elm_Object_Item *
4175 elm_genlist_item_insert_before(Evas_Object *obj,
4176 const Elm_Genlist_Item_Class *itc,
4178 Elm_Object_Item *parent,
4179 Elm_Object_Item *before,
4180 Elm_Genlist_Item_Flags flags,
4182 const void *func_data)
4184 ELM_CHECK_WIDTYPE(obj, widtype) NULL;
4185 ELM_OBJ_ITEM_CHECK_OR_RETURN(before, NULL);
4186 Widget_Data *wd = elm_widget_data_get(obj);
4187 Elm_Gen_Item *_before = (Elm_Gen_Item *) before;
4188 if (!wd) return NULL;
4189 /* It makes no sense to insert before in an empty list with before != NULL, something really bad is happening in your app. */
4190 EINA_SAFETY_ON_NULL_RETURN_VAL(wd->items, NULL);
4192 Elm_Gen_Item *it = _item_new(wd, itc, data, (Elm_Gen_Item *) parent, flags,
4194 if (!it) return NULL;
4197 if (it->group && _before->group)
4198 wd->group_items = eina_list_prepend_relative(wd->group_items, it,
4203 it->parent->item->items =
4204 eina_list_prepend_relative(it->parent->item->items, it, _before);
4206 wd->items = eina_inlist_prepend_relative(wd->items, EINA_INLIST_GET(it),
4207 EINA_INLIST_GET(_before));
4208 it->item->rel = _before;
4209 it->item->rel->relcount++;
4210 it->item->before = EINA_TRUE;
4211 _item_queue(wd, it, NULL);
4212 return (Elm_Object_Item *) it;
4215 EAPI Elm_Object_Item *
4216 elm_genlist_item_direct_sorted_insert(Evas_Object *obj,
4217 const Elm_Genlist_Item_Class *itc,
4219 Elm_Object_Item *parent,
4220 Elm_Genlist_Item_Flags flags,
4221 Eina_Compare_Cb comp,
4223 const void *func_data)
4225 ELM_CHECK_WIDTYPE(obj, widtype) NULL;
4226 Widget_Data *wd = elm_widget_data_get(obj);
4227 if (!wd) return NULL;
4228 Elm_Gen_Item *rel = NULL;
4229 Elm_Gen_Item *it = _item_new(wd, itc, data, (Elm_Gen_Item *) parent, flags,
4231 if (!it) return NULL;
4233 wd->item_compare_cb = comp;
4240 l = eina_list_search_sorted_near_list(it->parent->item->items,
4241 _elm_genlist_item_list_compare, it,
4244 rel = eina_list_data_get(l);
4248 if (cmp_result >= 0)
4250 it->parent->item->items = eina_list_prepend_relative_list(it->parent->item->items, it, l);
4251 wd->items = eina_inlist_prepend_relative(wd->items, EINA_INLIST_GET(it), EINA_INLIST_GET(rel));
4252 it->item->before = EINA_FALSE;
4254 else if (cmp_result < 0)
4256 it->parent->item->items = eina_list_append_relative_list(it->parent->item->items, it, l);
4257 wd->items = eina_inlist_append_relative(wd->items, EINA_INLIST_GET(it), EINA_INLIST_GET(rel));
4258 it->item->before = EINA_TRUE;
4265 wd->state = eina_inlist_sorted_state_new();
4266 eina_inlist_sorted_state_init(wd->state, wd->items);
4267 wd->requeued = EINA_FALSE;
4271 wd->group_items = eina_list_append(wd->group_items, it);
4273 wd->items = eina_inlist_sorted_state_insert(wd->items, EINA_INLIST_GET(it),
4274 _elm_genlist_item_compare, wd->state);
4276 if (EINA_INLIST_GET(it)->next)
4278 rel = ELM_GEN_ITEM_FROM_INLIST(EINA_INLIST_GET(it)->next);
4279 it->item->before = EINA_TRUE;
4281 else if (EINA_INLIST_GET(it)->prev)
4283 rel = ELM_GEN_ITEM_FROM_INLIST(EINA_INLIST_GET(it)->prev);
4284 it->item->before = EINA_FALSE;
4290 it->item->rel = rel;
4291 it->item->rel->relcount++;
4294 _item_queue(wd, it, _elm_genlist_item_list_compare);
4296 return (Elm_Object_Item *) it;
4299 EAPI Elm_Object_Item *
4300 elm_genlist_item_sorted_insert(Evas_Object *obj,
4301 const Elm_Genlist_Item_Class *itc,
4303 Elm_Object_Item *parent,
4304 Elm_Genlist_Item_Flags flags,
4305 Eina_Compare_Cb comp,
4307 const void *func_data)
4309 ELM_CHECK_WIDTYPE(obj, widtype) NULL;
4310 Widget_Data *wd = elm_widget_data_get(obj);
4311 wd->item_compare_data_cb = comp;
4312 return elm_genlist_item_direct_sorted_insert(obj, itc, data, parent, flags,
4313 _elm_genlist_item_compare_data,
4318 _elm_genlist_clear(Evas_Object *obj, Eina_Bool standby)
4320 Eina_Inlist *next, *l;
4322 ELM_CHECK_WIDTYPE(obj, widtype);
4323 Widget_Data *wd = elm_widget_data_get(obj);
4326 if (!standby) wd->generation++;
4330 eina_inlist_sorted_state_free(wd->state);
4334 if (wd->walking > 0)
4339 evas_event_freeze(evas_object_evas_get(wd->obj));
4340 for (l = wd->items, next = l ? l->next : NULL;
4342 l = next, next = next ? next->next : NULL)
4344 Elm_Gen_Item *it = ELM_GEN_ITEM_FROM_INLIST(l);
4346 if (it->generation < wd->generation)
4348 Elm_Gen_Item *itn = NULL;
4350 if (next) itn = ELM_GEN_ITEM_FROM_INLIST(next);
4351 if (itn) itn->walking++; /* prevent early death of subitem */
4353 elm_widget_item_free(it);
4354 if (itn) itn->walking--;
4358 wd->pan_changed = EINA_TRUE;
4361 ecore_job_del(wd->calc_job);
4362 wd->calc_job = NULL;
4364 if (wd->selected) wd->selected = eina_list_free(wd->selected);
4365 if (wd->clear_cb) wd->clear_cb(wd);
4372 evas_object_size_hint_min_set(wd->pan_smart, wd->minw, wd->minh);
4373 evas_object_smart_callback_call(wd->pan_smart, "changed", NULL);
4375 if (wd->sizing_cb) wd->sizing_cb(wd->obj);
4376 elm_smart_scroller_child_region_show(wd->scr, 0, 0, 0, 0);
4377 evas_event_thaw(evas_object_evas_get(wd->obj));
4378 evas_event_thaw_eval(evas_object_evas_get(wd->obj));
4382 elm_genlist_clear(Evas_Object *obj)
4384 _elm_genlist_clear(obj, EINA_FALSE);
4388 elm_genlist_multi_select_set(Evas_Object *obj,
4391 ELM_CHECK_WIDTYPE(obj, widtype);
4392 Widget_Data *wd = elm_widget_data_get(obj);
4398 elm_genlist_multi_select_get(const Evas_Object *obj)
4400 ELM_CHECK_WIDTYPE(obj, widtype) EINA_FALSE;
4401 Widget_Data *wd = elm_widget_data_get(obj);
4402 if (!wd) return EINA_FALSE;
4406 EAPI Elm_Object_Item *
4407 elm_genlist_selected_item_get(const Evas_Object *obj)
4409 ELM_CHECK_WIDTYPE(obj, widtype) NULL;
4410 Widget_Data *wd = elm_widget_data_get(obj);
4411 if (!wd) return NULL;
4412 if (wd->selected) return wd->selected->data;
4416 EAPI const Eina_List *
4417 elm_genlist_selected_items_get(const Evas_Object *obj)
4419 ELM_CHECK_WIDTYPE(obj, widtype) NULL;
4420 Widget_Data *wd = elm_widget_data_get(obj);
4421 if (!wd) return NULL;
4422 return wd->selected;
4426 elm_genlist_realized_items_get(const Evas_Object *obj)
4428 ELM_CHECK_WIDTYPE(obj, widtype) NULL;
4429 Widget_Data *wd = elm_widget_data_get(obj);
4430 Eina_List *list = NULL;
4432 Eina_Bool done = EINA_FALSE;
4433 if (!wd) return NULL;
4434 EINA_INLIST_FOREACH(wd->blocks, itb)
4442 EINA_LIST_FOREACH(itb->items, l, it)
4444 if (it->realized) list = eina_list_append(list, it);
4455 EAPI Elm_Object_Item *
4456 elm_genlist_at_xy_item_get(const Evas_Object *obj,
4461 ELM_CHECK_WIDTYPE(obj, widtype) NULL;
4462 Widget_Data *wd = elm_widget_data_get(obj);
4463 Evas_Coord ox, oy, ow, oh;
4466 if (!wd) return NULL;
4467 evas_object_geometry_get(wd->pan_smart, &ox, &oy, &ow, &oh);
4469 EINA_INLIST_FOREACH(wd->blocks, itb)
4474 if (!ELM_RECTS_INTERSECT(ox + itb->x - itb->wd->pan_x,
4475 oy + itb->y - itb->wd->pan_y,
4476 itb->w, itb->h, x, y, 1, 1))
4478 EINA_LIST_FOREACH(itb->items, l, it)
4480 Evas_Coord itx, ity;
4482 itx = ox + itb->x + it->x - itb->wd->pan_x;
4483 ity = oy + itb->y + it->y - itb->wd->pan_y;
4484 if (ELM_RECTS_INTERSECT(itx, ity, it->item->w, it->item->h, x, y, 1, 1))
4488 if (y <= (ity + (it->item->h / 4))) *posret = -1;
4489 else if (y >= (ity + it->item->h - (it->item->h / 4)))
4493 return (Elm_Object_Item *) it;
4495 lasty = ity + it->item->h;
4500 if (y > lasty) *posret = 1;
4506 EAPI Elm_Object_Item *
4507 elm_genlist_first_item_get(const Evas_Object *obj)
4509 ELM_CHECK_WIDTYPE(obj, widtype) NULL;
4510 Widget_Data *wd = elm_widget_data_get(obj);
4511 if (!wd) return NULL;
4512 if (!wd->items) return NULL;
4513 Elm_Gen_Item *it = ELM_GEN_ITEM_FROM_INLIST(wd->items);
4514 while ((it) && (it->generation < wd->generation))
4515 it = ELM_GEN_ITEM_FROM_INLIST(EINA_INLIST_GET(it)->next);
4516 return (Elm_Object_Item *) it;
4519 EAPI Elm_Object_Item *
4520 elm_genlist_last_item_get(const Evas_Object *obj)
4522 ELM_CHECK_WIDTYPE(obj, widtype) NULL;
4523 Widget_Data *wd = elm_widget_data_get(obj);
4524 if (!wd) return NULL;
4525 if (!wd->items) return NULL;
4526 Elm_Gen_Item *it = ELM_GEN_ITEM_FROM_INLIST(wd->items->last);
4527 while ((it) && (it->generation < wd->generation))
4528 it = ELM_GEN_ITEM_FROM_INLIST(EINA_INLIST_GET(it)->prev);
4529 return (Elm_Object_Item *) it;
4532 EAPI Elm_Object_Item *
4533 elm_genlist_item_next_get(const Elm_Object_Item *it)
4535 ELM_OBJ_ITEM_CHECK_OR_RETURN(it, NULL);
4536 Elm_Gen_Item *_it = (Elm_Gen_Item *) it;
4539 _it = ELM_GEN_ITEM_FROM_INLIST(EINA_INLIST_GET(_it)->next);
4540 if ((_it) && (_it->generation == _it->wd->generation)) break;
4542 return (Elm_Object_Item *) _it;
4545 EAPI Elm_Object_Item *
4546 elm_genlist_item_prev_get(const Elm_Object_Item *it)
4548 ELM_OBJ_ITEM_CHECK_OR_RETURN(it, NULL);
4549 Elm_Gen_Item *_it = (Elm_Gen_Item *) it;
4552 _it = ELM_GEN_ITEM_FROM_INLIST(EINA_INLIST_GET(_it)->prev);
4553 if ((_it) && (_it->generation == _it->wd->generation)) break;
4555 return (Elm_Object_Item *) _it;
4559 elm_genlist_item_genlist_get(const Elm_Object_Item *it)
4561 return elm_object_item_widget_get(it);
4564 EAPI Elm_Object_Item *
4565 elm_genlist_item_parent_get(const Elm_Object_Item *it)
4567 ELM_OBJ_ITEM_CHECK_OR_RETURN(it, NULL);
4568 return (Elm_Object_Item *) ((Elm_Gen_Item *) it)->parent;
4572 elm_genlist_item_subitems_clear(Elm_Object_Item *it)
4574 ELM_OBJ_ITEM_CHECK_OR_RETURN(it);
4575 Eina_List *tl = NULL, *l;
4577 Elm_Object_Item *it2;
4578 _it = (Elm_Gen_Item *) it;
4580 EINA_LIST_FOREACH(_it->item->items, l, it2)
4581 tl = eina_list_append(tl, it2);
4582 EINA_LIST_FREE(tl, it2)
4583 elm_object_item_del(it2);
4587 elm_genlist_item_selected_set(Elm_Object_Item *it,
4590 ELM_OBJ_ITEM_CHECK_OR_RETURN(it);
4591 Elm_Gen_Item *_it = (Elm_Gen_Item *) it;
4592 Widget_Data *wd = _it->wd;
4594 if ((_it->generation < wd->generation) || elm_widget_item_disabled_get(_it))
4596 selected = !!selected;
4597 if (_it->selected == selected) return;
4603 while (wd->selected)
4605 if (_it->unhighlight_cb) _it->unhighlight_cb(wd->selected->data);
4606 _it->unsel_cb(wd->selected->data);
4609 _it->highlight_cb(_it);
4613 if (_it->unhighlight_cb) _it->unhighlight_cb(_it);
4618 elm_genlist_item_selected_get(const Elm_Object_Item *it)
4620 ELM_OBJ_ITEM_CHECK_OR_RETURN(it, EINA_FALSE);
4621 return ((Elm_Gen_Item *) it)->selected;
4625 elm_genlist_item_expanded_set(Elm_Object_Item *it,
4628 ELM_OBJ_ITEM_CHECK_OR_RETURN(it);
4629 Elm_Gen_Item *_it = (Elm_Gen_Item *) it;
4630 if (_it->item->expanded == expanded) return;
4631 _it->item->expanded = expanded;
4632 _it->wd->expanded_item = _it;
4633 if (_it->item->expanded)
4636 edje_object_signal_emit(VIEW(_it), "elm,state,expanded", "elm");
4637 evas_object_smart_callback_call(WIDGET(_it), SIG_EXPANDED, _it);
4638 _it->wd->auto_scroll_enabled = EINA_TRUE;
4643 edje_object_signal_emit(VIEW(_it), "elm,state,contracted", "elm");
4644 evas_object_smart_callback_call(WIDGET(_it), SIG_CONTRACTED, _it);
4645 _it->wd->auto_scroll_enabled = EINA_FALSE;
4650 elm_genlist_item_expanded_get(const Elm_Object_Item *it)
4652 ELM_OBJ_ITEM_CHECK_OR_RETURN(it, EINA_FALSE);
4653 return ((Elm_Gen_Item *) it)->item->expanded;
4657 elm_genlist_item_expanded_depth_get(const Elm_Object_Item *it)
4659 ELM_OBJ_ITEM_CHECK_OR_RETURN(it, 0);
4660 return ((Elm_Gen_Item *) it)->item->expanded_depth;
4664 elm_genlist_item_disabled_set(Elm_Object_Item *it,
4667 elm_object_item_disabled_set(it, disabled);
4671 elm_genlist_item_disabled_get(const Elm_Object_Item *it)
4673 return elm_object_item_disabled_get(it);
4677 elm_genlist_item_display_only_set(Elm_Object_Item *it,
4678 Eina_Bool display_only)
4680 ELM_OBJ_ITEM_CHECK_OR_RETURN(it);
4681 Elm_Gen_Item *_it = (Elm_Gen_Item *) it;
4682 display_only = !!display_only;
4683 if (_it->display_only == display_only) return;
4684 if (_it->generation < _it->wd->generation) return;
4685 _it->display_only = display_only;
4686 _it->item->mincalcd = EINA_FALSE;
4687 _it->item->updateme = EINA_TRUE;
4688 if (_it->item->block) _it->item->block->updateme = EINA_TRUE;
4689 if (_it->wd->update_job) ecore_job_del(_it->wd->update_job);
4690 _it->wd->update_job = ecore_job_add(_update_job, _it->wd);
4694 elm_genlist_item_display_only_get(const Elm_Object_Item *it)
4696 ELM_OBJ_ITEM_CHECK_OR_RETURN(it, EINA_FALSE);
4697 Elm_Gen_Item *_it = (Elm_Gen_Item *) it;
4698 if (_it->generation < _it->wd->generation) return EINA_FALSE;
4699 return _it->display_only;
4703 elm_genlist_item_show(Elm_Object_Item *it)
4705 ELM_OBJ_ITEM_CHECK_OR_RETURN(it);
4706 Elm_Gen_Item *_it = (Elm_Gen_Item *) it;
4707 Evas_Coord gith = 0;
4708 if (_it->generation < _it->wd->generation) return;
4709 if ((_it->item->queued) || (!_it->item->mincalcd))
4711 _it->wd->show_item = _it;
4712 _it->wd->bring_in = EINA_FALSE;
4713 _it->wd->scrollto_type = ELM_GENLIST_ITEM_SCROLLTO_IN;
4714 _it->item->showme = EINA_TRUE;
4717 if (_it->wd->show_item)
4719 _it->wd->show_item->item->showme = EINA_FALSE;
4720 _it->wd->show_item = NULL;
4722 if ((_it->item->group_item) &&
4723 (_it->wd->pan_y > (_it->y + _it->item->block->y)))
4724 gith = _it->item->group_item->item->h;
4725 elm_smart_scroller_child_region_show(_it->wd->scr,
4726 _it->x + _it->item->block->x,
4727 _it->y + _it->item->block->y - gith,
4728 _it->item->block->w, _it->item->h);
4732 elm_genlist_item_promote(Elm_Object_Item *it)
4734 ELM_OBJ_ITEM_CHECK_OR_RETURN(it);
4735 Elm_Gen_Item *_it = (Elm_Gen_Item *) it;
4736 if (_it->generation < _it->wd->generation) return;
4737 _item_move_before(_it,
4738 (Elm_Gen_Item *) elm_genlist_first_item_get(WIDGET(_it)));
4742 elm_genlist_item_demote(Elm_Object_Item *it)
4744 ELM_OBJ_ITEM_CHECK_OR_RETURN(it);
4745 Elm_Gen_Item *_it = (Elm_Gen_Item *) it;
4746 if (_it->generation < _it->wd->generation) return;
4747 _item_move_after(_it,
4748 (Elm_Gen_Item *) elm_genlist_last_item_get(WIDGET(_it)));
4752 elm_genlist_item_bring_in(Elm_Object_Item *it)
4754 ELM_OBJ_ITEM_CHECK_OR_RETURN(it);
4755 Elm_Gen_Item *_it = (Elm_Gen_Item *) it;
4756 Evas_Coord gith = 0;
4757 if (_it->generation < _it->wd->generation) return;
4758 if ((_it->item->queued) || (!_it->item->mincalcd))
4760 _it->wd->show_item = _it;
4761 _it->wd->bring_in = EINA_TRUE;
4762 _it->wd->scrollto_type = ELM_GENLIST_ITEM_SCROLLTO_IN;
4763 _it->item->showme = EINA_TRUE;
4766 if (_it->wd->show_item)
4768 _it->wd->show_item->item->showme = EINA_FALSE;
4769 _it->wd->show_item = NULL;
4771 if ((_it->item->group_item) &&
4772 (_it->wd->pan_y > (_it->y + _it->item->block->y)))
4773 gith = _it->item->group_item->item->h;
4774 elm_smart_scroller_region_bring_in(_it->wd->scr,
4775 _it->x + _it->item->block->x,
4776 _it->y + _it->item->block->y - gith,
4777 _it->item->block->w, _it->item->h);
4781 elm_genlist_item_top_show(Elm_Object_Item *it)
4783 ELM_OBJ_ITEM_CHECK_OR_RETURN(it);
4784 Elm_Gen_Item *_it = (Elm_Gen_Item *) it;
4786 Evas_Coord gith = 0;
4788 if (_it->generation < _it->wd->generation) return;
4789 if ((_it->item->queued) || (!_it->item->mincalcd))
4791 _it->wd->show_item = _it;
4792 _it->wd->bring_in = EINA_FALSE;
4793 _it->wd->scrollto_type = ELM_GENLIST_ITEM_SCROLLTO_TOP;
4794 _it->item->showme = EINA_TRUE;
4797 if (_it->wd->show_item)
4799 _it->wd->show_item->item->showme = EINA_FALSE;
4800 _it->wd->show_item = NULL;
4802 evas_object_geometry_get(_it->wd->pan_smart, NULL, NULL, &ow, &oh);
4803 if (_it->item->group_item) gith = _it->item->group_item->item->h;
4804 elm_smart_scroller_child_region_show(_it->wd->scr,
4805 _it->x + _it->item->block->x,
4806 _it->y + _it->item->block->y - gith,
4807 _it->item->block->w, oh);
4811 elm_genlist_item_top_bring_in(Elm_Object_Item *it)
4813 ELM_OBJ_ITEM_CHECK_OR_RETURN(it);
4814 Elm_Gen_Item *_it = (Elm_Gen_Item *) it;
4816 Evas_Coord gith = 0;
4818 if (_it->generation < _it->wd->generation) return;
4819 if ((_it->item->queued) || (!_it->item->mincalcd))
4821 _it->wd->show_item = _it;
4822 _it->wd->bring_in = EINA_TRUE;
4823 _it->wd->scrollto_type = ELM_GENLIST_ITEM_SCROLLTO_TOP;
4824 _it->item->showme = EINA_TRUE;
4827 if (_it->wd->show_item)
4829 _it->wd->show_item->item->showme = EINA_FALSE;
4830 _it->wd->show_item = NULL;
4832 evas_object_geometry_get(_it->wd->pan_smart, NULL, NULL, &ow, &oh);
4833 if (_it->item->group_item) gith = _it->item->group_item->item->h;
4834 elm_smart_scroller_region_bring_in(_it->wd->scr,
4835 _it->x + _it->item->block->x,
4836 _it->y + _it->item->block->y - gith,
4837 _it->item->block->w, oh);
4841 elm_genlist_item_middle_show(Elm_Object_Item *it)
4843 ELM_OBJ_ITEM_CHECK_OR_RETURN(it);
4844 Elm_Gen_Item *_it = (Elm_Gen_Item *) it;
4847 if (_it->generation < _it->wd->generation) return;
4848 if ((_it->item->queued) || (!_it->item->mincalcd))
4850 _it->wd->show_item = _it;
4851 _it->wd->bring_in = EINA_FALSE;
4852 _it->wd->scrollto_type = ELM_GENLIST_ITEM_SCROLLTO_MIDDLE;
4853 _it->item->showme = EINA_TRUE;
4856 if (_it->wd->show_item)
4858 _it->wd->show_item->item->showme = EINA_FALSE;
4859 _it->wd->show_item = NULL;
4861 evas_object_geometry_get(_it->wd->pan_smart, NULL, NULL, &ow, &oh);
4862 elm_smart_scroller_child_region_show(_it->wd->scr,
4863 _it->x + _it->item->block->x,
4864 _it->y + _it->item->block->y - oh / 2 +
4865 _it->item->h / 2, _it->item->block->w,
4870 elm_genlist_item_middle_bring_in(Elm_Object_Item *it)
4872 ELM_OBJ_ITEM_CHECK_OR_RETURN(it);
4873 Elm_Gen_Item *_it = (Elm_Gen_Item *) it;
4876 if (_it->generation < _it->wd->generation) return;
4877 if ((_it->item->queued) || (!_it->item->mincalcd))
4879 _it->wd->show_item = _it;
4880 _it->wd->bring_in = EINA_TRUE;
4881 _it->wd->scrollto_type = ELM_GENLIST_ITEM_SCROLLTO_MIDDLE;
4882 _it->item->showme = EINA_TRUE;
4885 if (_it->wd->show_item)
4887 _it->wd->show_item->item->showme = EINA_FALSE;
4888 _it->wd->show_item = NULL;
4890 evas_object_geometry_get(_it->wd->pan_smart, NULL, NULL, &ow, &oh);
4891 elm_smart_scroller_region_bring_in(_it->wd->scr,
4892 _it->x + _it->item->block->x,
4893 _it->y + _it->item->block->y - oh / 2 +
4894 _it->item->h / 2, _it->item->block->w,
4899 elm_genlist_item_del(Elm_Object_Item *it)
4901 elm_object_item_del(it);
4905 elm_genlist_item_data_set(Elm_Object_Item *it,
4908 elm_object_item_data_set(it, (void *) data);
4912 elm_genlist_item_data_get(const Elm_Object_Item *it)
4914 return elm_object_item_data_get(it);
4918 elm_genlist_item_icons_orphan(Elm_Object_Item *it)
4920 elm_genlist_item_contents_orphan(it);
4924 elm_genlist_item_contents_orphan(Elm_Object_Item *it)
4926 ELM_OBJ_ITEM_CHECK_OR_RETURN(it);
4928 Evas_Object *content;
4929 EINA_LIST_FREE(((Elm_Gen_Item *) it)->content_objs, content)
4931 elm_widget_sub_object_del(WIDGET(it), content);
4932 evas_object_smart_member_del(content);
4933 evas_object_hide(content);
4937 EAPI const Evas_Object *
4938 elm_genlist_item_object_get(const Elm_Object_Item *it)
4940 ELM_OBJ_ITEM_CHECK_OR_RETURN(it, NULL);
4945 elm_genlist_item_update(Elm_Object_Item *it)
4947 ELM_OBJ_ITEM_CHECK_OR_RETURN(it);
4948 Elm_Gen_Item *_it = (Elm_Gen_Item *) it;
4950 if (!_it->item->block) return;
4951 if (_it->generation < _it->wd->generation) return;
4952 _it->item->mincalcd = EINA_FALSE;
4953 _it->item->updateme = EINA_TRUE;
4954 _it->item->block->updateme = EINA_TRUE;
4955 if (_it->wd->update_job) ecore_job_del(_it->wd->update_job);
4956 _it->wd->update_job = ecore_job_add(_update_job, _it->wd);
4960 elm_genlist_item_fields_update(Elm_Object_Item *it,
4962 Elm_Genlist_Item_Field_Flags itf)
4964 ELM_OBJ_ITEM_CHECK_OR_RETURN(it);
4965 Elm_Gen_Item *_it = (Elm_Gen_Item *) it;
4967 if (!_it->item->block) return;
4968 if (_it->generation < _it->wd->generation) return;
4970 if ((!itf) || (itf & ELM_GENLIST_ITEM_FIELD_LABEL))
4971 _item_text_realize(_it, VIEW(_it), &_it->texts, parts);
4972 if ((!itf) || (itf & ELM_GENLIST_ITEM_FIELD_CONTENT))
4974 _it->content_objs = _item_content_unrealize(_it, VIEW(_it),
4975 &_it->contents, parts);
4976 _it->content_objs = _item_content_realize(_it, VIEW(_it),
4977 &_it->contents, parts);
4979 if ((!itf) || (itf & ELM_GENLIST_ITEM_FIELD_STATE))
4980 _item_state_realize(_it, VIEW(_it), &_it->states, parts);
4984 elm_genlist_item_item_class_update(Elm_Object_Item *it,
4985 const Elm_Genlist_Item_Class *itc)
4987 ELM_OBJ_ITEM_CHECK_OR_RETURN(it);
4988 Elm_Gen_Item *_it = (Elm_Gen_Item *) it;
4990 if (!_it->item->block) return;
4991 EINA_SAFETY_ON_NULL_RETURN(itc);
4992 if (_it->generation < _it->wd->generation) return;
4994 _it->item->nocache = EINA_TRUE;
4995 elm_genlist_item_update(it);
4998 EAPI const Elm_Genlist_Item_Class *
4999 elm_genlist_item_item_class_get(const Elm_Object_Item *it)
5001 ELM_OBJ_ITEM_CHECK_OR_RETURN(it, NULL);
5002 Elm_Gen_Item *_it = (Elm_Gen_Item *) it;
5003 if (_it->generation < _it->wd->generation) return NULL;
5007 static Evas_Object *
5008 _elm_genlist_item_label_create(void *data,
5009 Evas_Object *obj __UNUSED__,
5010 Evas_Object *tooltip,
5011 void *it __UNUSED__)
5013 Evas_Object *label = elm_label_add(tooltip);
5016 elm_object_style_set(label, "tooltip");
5017 elm_object_text_set(label, data);
5022 _elm_genlist_item_label_del_cb(void *data,
5023 Evas_Object *obj __UNUSED__,
5024 void *event_info __UNUSED__)
5026 eina_stringshare_del(data);
5030 elm_genlist_item_tooltip_text_set(Elm_Object_Item *it,
5033 ELM_OBJ_ITEM_CHECK_OR_RETURN(it);
5034 text = eina_stringshare_add(text);
5035 elm_genlist_item_tooltip_content_cb_set(it, _elm_genlist_item_label_create,
5037 _elm_genlist_item_label_del_cb);
5041 elm_genlist_item_tooltip_content_cb_set(Elm_Object_Item *it,
5042 Elm_Tooltip_Item_Content_Cb func,
5044 Evas_Smart_Cb del_cb)
5046 ELM_OBJ_ITEM_CHECK_OR_GOTO(it, error);
5047 Elm_Gen_Item *_it = (Elm_Gen_Item *) it;
5049 if ((_it->tooltip.content_cb == func) && (_it->tooltip.data == data))
5052 if (_it->tooltip.del_cb)
5053 _it->tooltip.del_cb((void *) _it->tooltip.data, WIDGET(it), it);
5055 _it->tooltip.content_cb = func;
5056 _it->tooltip.data = data;
5057 _it->tooltip.del_cb = del_cb;
5061 elm_widget_item_tooltip_content_cb_set(_it,
5062 _it->tooltip.content_cb,
5063 _it->tooltip.data, NULL);
5064 elm_widget_item_tooltip_style_set(_it, _it->tooltip.style);
5065 elm_widget_item_tooltip_window_mode_set(_it, _it->tooltip.free_size);
5071 if (del_cb) del_cb((void *)data, NULL, NULL);
5075 elm_genlist_item_tooltip_unset(Elm_Object_Item *it)
5077 ELM_OBJ_ITEM_CHECK_OR_RETURN(it);
5078 Elm_Gen_Item *_it = (Elm_Gen_Item *) it;
5080 if ((VIEW(_it)) && (_it->tooltip.content_cb))
5081 elm_widget_item_tooltip_unset(_it);
5083 if (_it->tooltip.del_cb)
5084 _it->tooltip.del_cb((void *) _it->tooltip.data, WIDGET(_it), _it);
5085 _it->tooltip.del_cb = NULL;
5086 _it->tooltip.content_cb = NULL;
5087 _it->tooltip.data = NULL;
5088 _it->tooltip.free_size = EINA_FALSE;
5089 if (_it->tooltip.style)
5090 elm_genlist_item_tooltip_style_set(it, NULL);
5094 elm_genlist_item_tooltip_style_set(Elm_Object_Item *it,
5097 ELM_OBJ_ITEM_CHECK_OR_RETURN(it);
5098 Elm_Gen_Item *_it = (Elm_Gen_Item *) it;
5100 eina_stringshare_replace(&_it->tooltip.style, style);
5101 if (VIEW(_it)) elm_widget_item_tooltip_style_set(_it, style);
5105 elm_genlist_item_tooltip_style_get(const Elm_Object_Item *it)
5107 return elm_object_item_tooltip_style_get(it);
5111 elm_genlist_item_tooltip_window_mode_set(Elm_Object_Item *it,
5114 ELM_OBJ_ITEM_CHECK_OR_RETURN(it, EINA_FALSE);
5115 Elm_Gen_Item *_it = (Elm_Gen_Item *) it;
5117 _it->tooltip.free_size = disable;
5118 if (VIEW(_it)) return elm_widget_item_tooltip_window_mode_set(_it, disable);
5123 elm_genlist_item_tooltip_window_mode_get(const Elm_Object_Item *it)
5125 return elm_object_tooltip_window_mode_get(VIEW(it));
5129 elm_genlist_item_cursor_set(Elm_Object_Item *it,
5132 ELM_OBJ_ITEM_CHECK_OR_RETURN(it);
5133 Elm_Gen_Item *_it = (Elm_Gen_Item *) it;
5134 eina_stringshare_replace(&_it->mouse_cursor, cursor);
5135 if (VIEW(_it)) elm_widget_item_cursor_set(_it, cursor);
5139 elm_genlist_item_cursor_get(const Elm_Object_Item *it)
5141 ELM_OBJ_ITEM_CHECK_OR_RETURN(it, NULL);
5142 return elm_widget_item_cursor_get(it);
5146 elm_genlist_item_cursor_unset(Elm_Object_Item *it)
5148 ELM_OBJ_ITEM_CHECK_OR_RETURN(it);
5149 Elm_Gen_Item *_it = (Elm_Gen_Item *) it;
5151 if (!_it->mouse_cursor) return;
5153 if (VIEW(_it)) elm_widget_item_cursor_unset(_it);
5155 eina_stringshare_del(_it->mouse_cursor);
5156 _it->mouse_cursor = NULL;
5160 elm_genlist_item_cursor_style_set(Elm_Object_Item *it,
5163 ELM_OBJ_ITEM_CHECK_OR_RETURN(it);
5164 elm_widget_item_cursor_style_set(it, style);
5168 elm_genlist_item_cursor_style_get(const Elm_Object_Item *it)
5170 ELM_OBJ_ITEM_CHECK_OR_RETURN(it, NULL);
5171 return elm_widget_item_cursor_style_get(it);
5175 elm_genlist_item_cursor_engine_only_set(Elm_Object_Item *it,
5176 Eina_Bool engine_only)
5178 ELM_OBJ_ITEM_CHECK_OR_RETURN(it);
5179 elm_widget_item_cursor_engine_only_set(it, engine_only);
5183 elm_genlist_item_cursor_engine_only_get(const Elm_Object_Item *it)
5185 ELM_OBJ_ITEM_CHECK_OR_RETURN(it, EINA_FALSE);
5186 return elm_widget_item_cursor_engine_only_get(it);
5190 elm_genlist_item_index_get(Elm_Object_Item *it)
5192 ELM_OBJ_ITEM_CHECK_OR_RETURN(it, -1);
5193 Elm_Gen_Item *_it = (Elm_Gen_Item *) it;
5195 if (_it->item->block)
5196 return _it->position + _it->item->block->position;
5201 elm_genlist_mode_set(Evas_Object *obj,
5204 ELM_CHECK_WIDTYPE(obj, widtype);
5205 Widget_Data *wd = elm_widget_data_get(obj);
5207 if (wd->mode == mode) return;
5213 elm_genlist_horizontal_set(Evas_Object *obj,
5216 elm_genlist_mode_set(obj, mode);
5220 elm_genlist_horizontal_mode_set(Evas_Object *obj,
5223 elm_genlist_mode_set(obj, mode);
5227 elm_genlist_mode_get(const Evas_Object *obj)
5229 ELM_CHECK_WIDTYPE(obj, widtype) ELM_LIST_LAST;
5230 Widget_Data *wd = elm_widget_data_get(obj);
5231 if (!wd) return ELM_LIST_LAST;
5236 elm_genlist_horizontal_get(const Evas_Object *obj)
5238 return elm_genlist_mode_get(obj);
5242 elm_genlist_horizontal_mode_get(const Evas_Object *obj)
5244 return elm_genlist_mode_get(obj);
5248 elm_genlist_always_select_mode_set(Evas_Object *obj,
5249 Eina_Bool always_select)
5251 ELM_CHECK_WIDTYPE(obj, widtype);
5252 Widget_Data *wd = elm_widget_data_get(obj);
5254 wd->always_select = always_select;
5258 elm_genlist_always_select_mode_get(const Evas_Object *obj)
5260 ELM_CHECK_WIDTYPE(obj, widtype) EINA_FALSE;
5261 Widget_Data *wd = elm_widget_data_get(obj);
5262 if (!wd) return EINA_FALSE;
5263 return wd->always_select;
5267 elm_genlist_no_select_mode_set(Evas_Object *obj,
5268 Eina_Bool no_select)
5270 ELM_CHECK_WIDTYPE(obj, widtype);
5271 Widget_Data *wd = elm_widget_data_get(obj);
5273 wd->no_select = no_select;
5277 elm_genlist_no_select_mode_get(const Evas_Object *obj)
5279 ELM_CHECK_WIDTYPE(obj, widtype) EINA_FALSE;
5280 Widget_Data *wd = elm_widget_data_get(obj);
5281 if (!wd) return EINA_FALSE;
5282 return wd->no_select;
5286 elm_genlist_compress_mode_set(Evas_Object *obj,
5289 ELM_CHECK_WIDTYPE(obj, widtype);
5290 Widget_Data *wd = elm_widget_data_get(obj);
5292 wd->compress = compress;
5293 if (!compress) elm_genlist_homogeneous_set(obj, EINA_FALSE);
5297 elm_genlist_compress_mode_get(const Evas_Object *obj)
5299 ELM_CHECK_WIDTYPE(obj, widtype) EINA_FALSE;
5300 Widget_Data *wd = elm_widget_data_get(obj);
5301 if (!wd) return EINA_FALSE;
5302 return wd->compress;
5306 elm_genlist_height_for_width_mode_set(Evas_Object *obj,
5307 Eina_Bool height_for_width)
5309 ELM_CHECK_WIDTYPE(obj, widtype);
5310 Widget_Data *wd = elm_widget_data_get(obj);
5312 wd->height_for_width = !!height_for_width;
5313 if (wd->height_for_width)
5315 elm_genlist_homogeneous_set(obj, EINA_FALSE);
5316 elm_genlist_compress_mode_set(obj, EINA_TRUE);
5321 elm_genlist_height_for_width_mode_get(const Evas_Object *obj)
5323 ELM_CHECK_WIDTYPE(obj, widtype) EINA_FALSE;
5324 Widget_Data *wd = elm_widget_data_get(obj);
5325 if (!wd) return EINA_FALSE;
5326 return wd->height_for_width;
5330 elm_genlist_bounce_set(Evas_Object *obj,
5334 ELM_CHECK_WIDTYPE(obj, widtype);
5335 Widget_Data *wd = elm_widget_data_get(obj);
5337 elm_smart_scroller_bounce_allow_set(wd->scr, h_bounce, v_bounce);
5338 wd->h_bounce = h_bounce;
5339 wd->v_bounce = v_bounce;
5343 elm_genlist_bounce_get(const Evas_Object *obj,
5344 Eina_Bool *h_bounce,
5345 Eina_Bool *v_bounce)
5347 ELM_CHECK_WIDTYPE(obj, widtype);
5348 Widget_Data *wd = elm_widget_data_get(obj);
5350 if (h_bounce) *h_bounce = wd->h_bounce;
5351 if (v_bounce) *v_bounce = wd->v_bounce;
5355 elm_genlist_homogeneous_set(Evas_Object *obj,
5356 Eina_Bool homogeneous)
5358 ELM_CHECK_WIDTYPE(obj, widtype);
5359 Widget_Data *wd = elm_widget_data_get(obj);
5361 if (homogeneous) elm_genlist_compress_mode_set(obj, EINA_TRUE);
5362 wd->homogeneous = homogeneous;
5366 elm_genlist_homogeneous_get(const Evas_Object *obj)
5368 ELM_CHECK_WIDTYPE(obj, widtype) EINA_FALSE;
5369 Widget_Data *wd = elm_widget_data_get(obj);
5370 if (!wd) return EINA_FALSE;
5371 return wd->homogeneous;
5375 elm_genlist_block_count_set(Evas_Object *obj,
5378 ELM_CHECK_WIDTYPE(obj, widtype);
5379 Widget_Data *wd = elm_widget_data_get(obj);
5381 wd->max_items_per_block = n;
5382 wd->item_cache_max = wd->max_items_per_block * 2;
5383 _item_cache_clean(wd);
5387 elm_genlist_block_count_get(const Evas_Object *obj)
5389 ELM_CHECK_WIDTYPE(obj, widtype) 0;
5390 Widget_Data *wd = elm_widget_data_get(obj);
5392 return wd->max_items_per_block;
5396 elm_genlist_longpress_timeout_set(Evas_Object *obj,
5399 ELM_CHECK_WIDTYPE(obj, widtype);
5400 Widget_Data *wd = elm_widget_data_get(obj);
5402 wd->longpress_timeout = timeout;
5406 elm_genlist_longpress_timeout_get(const Evas_Object *obj)
5408 ELM_CHECK_WIDTYPE(obj, widtype) 0;
5409 Widget_Data *wd = elm_widget_data_get(obj);
5411 return wd->longpress_timeout;
5415 elm_genlist_scroller_policy_set(Evas_Object *obj,
5416 Elm_Scroller_Policy policy_h,
5417 Elm_Scroller_Policy policy_v)
5419 ELM_CHECK_WIDTYPE(obj, widtype);
5420 Widget_Data *wd = elm_widget_data_get(obj);
5421 if ((!wd) || (!wd->scr)) return;
5422 if ((policy_h >= ELM_SCROLLER_POLICY_LAST) ||
5423 (policy_v >= ELM_SCROLLER_POLICY_LAST))
5425 elm_smart_scroller_policy_set(wd->scr, policy_h, policy_v);
5429 elm_genlist_scroller_policy_get(const Evas_Object *obj,
5430 Elm_Scroller_Policy *policy_h,
5431 Elm_Scroller_Policy *policy_v)
5433 ELM_CHECK_WIDTYPE(obj, widtype);
5434 Widget_Data *wd = elm_widget_data_get(obj);
5435 Elm_Smart_Scroller_Policy s_policy_h, s_policy_v;
5436 if ((!wd) || (!wd->scr)) return;
5437 elm_smart_scroller_policy_get(wd->scr, &s_policy_h, &s_policy_v);
5438 if (policy_h) *policy_h = (Elm_Scroller_Policy)s_policy_h;
5439 if (policy_v) *policy_v = (Elm_Scroller_Policy)s_policy_v;
5443 elm_genlist_realized_items_update(Evas_Object *obj)
5445 ELM_CHECK_WIDTYPE(obj, widtype);
5447 Eina_List *list, *l;
5448 Elm_Object_Item *it;
5450 list = elm_genlist_realized_items_get(obj);
5451 EINA_LIST_FOREACH(list, l, it)
5452 elm_genlist_item_update(it);
5456 elm_genlist_item_mode_set(Elm_Object_Item *it,
5457 const char *mode_type,
5460 ELM_OBJ_ITEM_CHECK_OR_RETURN(it);
5461 Elm_Gen_Item *_it = (Elm_Gen_Item *) it;
5463 Widget_Data *wd = _it->wd;
5465 Elm_Object_Item *it2;
5468 if (!mode_type) return;
5469 if ((_it->generation < _it->wd->generation) ||
5470 elm_widget_item_disabled_get(_it)) return;
5471 if (wd->edit_mode) return;
5473 if ((wd->mode_item == _it) &&
5474 (!strcmp(mode_type, wd->mode_type)) &&
5477 if (!_it->itc->mode_item_style) return;
5478 _it->mode_set = mode_set;
5482 EINA_LIST_FOREACH(wd->selected, l, it2)
5483 if (((Elm_Gen_Item *) it2)->realized)
5484 elm_genlist_item_selected_set(it2, EINA_FALSE);
5488 it2 = elm_genlist_selected_item_get(wd->obj);
5489 if ((it2) && (((Elm_Gen_Item *) it2)->realized))
5490 elm_genlist_item_selected_set(it2, EINA_FALSE);
5493 if (((wd->mode_type) && (strcmp(mode_type, wd->mode_type))) ||
5495 ((_it == wd->mode_item) && (!mode_set)))
5496 _item_mode_unset(wd);
5498 eina_stringshare_replace(&wd->mode_type, mode_type);
5499 if (mode_set) _item_mode_set(_it);
5503 elm_genlist_mode_item_style_get(const Evas_Object *obj)
5505 ELM_CHECK_WIDTYPE(obj, widtype) NULL;
5506 Widget_Data *wd = elm_widget_data_get(obj);
5507 if (!wd) return NULL;
5508 return wd->mode_item->itc->mode_item_style;
5512 elm_genlist_mode_item_style_set(Evas_Object *obj, const char *style)
5514 ELM_CHECK_WIDTYPE(obj, widtype);
5515 Widget_Data *wd = elm_widget_data_get(obj);
5517 if ((style == wd->mode_item->itc->mode_item_style) ||
5518 (style && wd->mode_item->itc->mode_item_style &&
5519 (!strcmp(style, wd->mode_item->itc->mode_item_style))))
5521 eina_stringshare_replace((const char**)&wd->mode_item->itc->mode_item_style, style);
5522 elm_genlist_realized_items_update(obj);
5526 elm_genlist_mode_type_get(const Evas_Object *obj)
5528 ELM_CHECK_WIDTYPE(obj, widtype) NULL;
5529 Widget_Data *wd = elm_widget_data_get(obj);
5530 if (!wd) return NULL;
5531 return wd->mode_type;
5534 EAPI const Elm_Object_Item *
5535 elm_genlist_mode_item_get(const Evas_Object *obj)
5537 ELM_CHECK_WIDTYPE(obj, widtype) NULL;
5538 Widget_Data *wd = elm_widget_data_get(obj);
5539 if (!wd) return NULL;
5540 return (Elm_Object_Item *) wd->mode_item;
5544 elm_genlist_edit_mode_get(const Evas_Object *obj)
5546 ELM_CHECK_WIDTYPE(obj, widtype) EINA_FALSE;
5547 Widget_Data *wd = elm_widget_data_get(obj);
5548 if (!wd) return EINA_FALSE;
5550 return wd->edit_mode;
5554 elm_genlist_edit_mode_set(Evas_Object *obj, Eina_Bool edit_mode)
5556 ELM_CHECK_WIDTYPE(obj, widtype);
5557 Eina_List *list, *l;
5560 Widget_Data *wd = elm_widget_data_get(obj);
5562 if (wd->edit_mode == edit_mode) return;
5564 wd->edit_mode = !!edit_mode;
5565 list = elm_genlist_realized_items_get(obj);
5568 EINA_LIST_FOREACH(list, l, it)
5570 if (it->item->flags != ELM_GENLIST_ITEM_GROUP)
5571 _edit_mode_item_unrealize(it);
5573 _item_cache_zero(wd);
5577 EINA_LIST_FOREACH(list, l, it)
5579 if (it->item->flags != ELM_GENLIST_ITEM_GROUP)
5581 if (it->selected) _item_unselect(it);
5582 if (it->itc->edit_item_style)
5583 _edit_mode_item_realize(it, EINA_TRUE);
5587 if (wd->calc_job) ecore_job_del(wd->calc_job);
5588 wd->calc_job = ecore_job_add(_calc_job, wd);
5592 elm_genlist_reorder_mode_set(Evas_Object *obj,
5593 Eina_Bool reorder_mode)
5595 ELM_CHECK_WIDTYPE(obj, widtype);
5596 Widget_Data *wd = elm_widget_data_get(obj);
5598 wd->reorder_mode = reorder_mode;
5602 elm_genlist_reorder_mode_get(const Evas_Object *obj)
5604 ELM_CHECK_WIDTYPE(obj, widtype) EINA_FALSE;
5605 Widget_Data *wd = elm_widget_data_get(obj);
5606 if (!wd) return EINA_FALSE;
5607 return wd->reorder_mode;
5610 EAPI Elm_Genlist_Item_Flags
5611 elm_genlist_item_flags_get(const Elm_Object_Item *it)
5613 ELM_OBJ_ITEM_CHECK_OR_RETURN(it, ELM_GENLIST_ITEM_MAX);
5614 Elm_Gen_Item *_it = (Elm_Gen_Item *) it;
5615 return _it->item->flags;
5618 EAPI Elm_Genlist_Item_Class *
5619 elm_genlist_item_class_new(void)
5621 Elm_Genlist_Item_Class *itc;
5623 itc = calloc(1, sizeof(Elm_Genlist_Item_Class));
5626 itc->version = ELM_GENLIST_ITEM_CLASS_VERSION;
5628 itc->delete_me = EINA_FALSE;
5634 elm_genlist_item_class_free(Elm_Genlist_Item_Class *itc)
5636 if (itc && (itc->version == ELM_GENLIST_ITEM_CLASS_VERSION))
5638 if (!itc->delete_me) itc->delete_me = EINA_TRUE;
5639 if (itc->refcount > 0) elm_genlist_item_class_unref(itc);
5649 elm_genlist_item_class_ref(Elm_Genlist_Item_Class *itc)
5651 if (itc && (itc->version == ELM_GENLIST_ITEM_CLASS_VERSION))
5654 if (itc->refcount == 0) itc->refcount--;
5659 elm_genlist_item_class_unref(Elm_Genlist_Item_Class *itc)
5661 if (itc && (itc->version == ELM_GENLIST_ITEM_CLASS_VERSION))
5663 if (itc->refcount > 0) itc->refcount--;
5664 if (itc->delete_me && (!itc->refcount))
5665 elm_genlist_item_class_free(itc);
5669 /* for gengrid as of now */
5671 _elm_genlist_page_relative_set(Evas_Object *obj,
5675 Evas_Coord pagesize_h;
5676 Evas_Coord pagesize_v;
5678 ELM_CHECK_WIDTYPE(obj, widtype);
5679 Widget_Data *wd = elm_widget_data_get(obj);
5682 elm_smart_scroller_paging_get(wd->scr, NULL, NULL, &pagesize_h, &pagesize_v);
5683 elm_smart_scroller_paging_set(wd->scr, h_pagerel, v_pagerel, pagesize_h,
5687 /* for gengrid as of now */
5689 _elm_genlist_page_relative_get(const Evas_Object *obj,
5693 ELM_CHECK_WIDTYPE(obj, widtype);
5694 Widget_Data *wd = elm_widget_data_get(obj);
5697 elm_smart_scroller_paging_get(wd->scr, h_pagerel, v_pagerel, NULL, NULL);
5700 /* for gengrid as of now */
5702 _elm_genlist_page_size_set(Evas_Object *obj,
5703 Evas_Coord h_pagesize,
5704 Evas_Coord v_pagesize)
5709 ELM_CHECK_WIDTYPE(obj, widtype);
5710 Widget_Data *wd = elm_widget_data_get(obj);
5712 elm_smart_scroller_paging_get(wd->scr, &pagerel_h, &pagerel_v, NULL, NULL);
5713 elm_smart_scroller_paging_set(wd->scr, pagerel_h, pagerel_v, h_pagesize,
5717 /* for gengrid as of now */
5719 _elm_genlist_current_page_get(const Evas_Object *obj,
5723 ELM_CHECK_WIDTYPE(obj, widtype);
5724 Widget_Data *wd = elm_widget_data_get(obj);
5727 elm_smart_scroller_current_page_get(wd->scr, h_pagenumber, v_pagenumber);
5730 /* for gengrid as of now */
5732 _elm_genlist_last_page_get(const Evas_Object *obj,
5736 ELM_CHECK_WIDTYPE(obj, widtype);
5737 Widget_Data *wd = elm_widget_data_get(obj);
5740 elm_smart_scroller_last_page_get(wd->scr, h_pagenumber, v_pagenumber);
5743 /* for gengrid as of now */
5745 _elm_genlist_page_show(const Evas_Object *obj,
5749 ELM_CHECK_WIDTYPE(obj, widtype);
5750 Widget_Data *wd = elm_widget_data_get(obj);
5753 elm_smart_scroller_page_show(wd->scr, h_pagenumber, v_pagenumber);
5756 /* for gengrid as of now */
5758 _elm_genlist_page_bring_in(const Evas_Object *obj,
5762 ELM_CHECK_WIDTYPE(obj, widtype);
5763 Widget_Data *wd = elm_widget_data_get(obj);
5766 elm_smart_scroller_page_bring_in(wd->scr, h_pagenumber, v_pagenumber);
5770 _elm_genlist_item_unrealize(Elm_Gen_Item *it,
5773 Evas_Object *content;
5775 if (!it->realized) return;
5776 if (it->wd->reorder_it == it) return;
5778 evas_event_freeze(evas_object_evas_get(WIDGET(it)));
5780 evas_object_smart_callback_call(WIDGET(it), SIG_UNREALIZED, it);
5783 ecore_timer_del(it->long_timer);
5784 it->long_timer = NULL;
5787 elm_widget_stringlist_free(it->texts);
5789 elm_widget_stringlist_free(it->contents);
5790 it->contents = NULL;
5791 elm_widget_stringlist_free(it->states);
5794 EINA_LIST_FREE(it->content_objs, content)
5795 evas_object_del(content);
5797 it->unrealize_cb(it);
5799 it->realized = EINA_FALSE;
5800 it->want_unrealize = EINA_FALSE;
5801 evas_event_thaw(evas_object_evas_get(WIDGET(it)));
5802 evas_event_thaw_eval(evas_object_evas_get(WIDGET(it)));
5806 _elm_genlist_item_del_notserious(Elm_Gen_Item *it)
5808 elm_widget_item_pre_notify_del(it);
5809 it->generation = it->wd->generation - 1; /* This means that the item is deleted */
5810 if (it->selected) it->wd->selected = eina_list_remove(it->wd->selected, it);
5812 if (it->itc->func.del)
5813 it->itc->func.del((void *)it->base.data, WIDGET(it));
5817 _elm_genlist_item_del_serious(Elm_Gen_Item *it)
5819 _elm_genlist_item_del_notserious(it);
5820 it->wd->items = eina_inlist_remove(it->wd->items, EINA_INLIST_GET(it));
5821 if (it->tooltip.del_cb)
5822 it->tooltip.del_cb((void *)it->tooltip.data, WIDGET(it), it);
5823 it->wd->walking -= it->walking;
5824 if (it->long_timer) ecore_timer_del(it->long_timer);
5826 it->wd->group_items = eina_list_remove(it->wd->group_items, it);
5830 eina_inlist_sorted_state_free(it->wd->state);
5831 it->wd->state = NULL;
5833 if (it->wd->calc_job) ecore_job_del(it->wd->calc_job);
5834 it->wd->calc_job = ecore_job_add(it->wd->calc_cb, it->wd);
5838 if (it->wd->last_selected_item == (Elm_Object_Item *) it)
5839 it->wd->last_selected_item = NULL;
5840 it->wd->item_count--;