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)
3479 Elm_Gen_Item *_it = (Elm_Gen_Item *) it;
3481 if (_it->generation < _it->wd->generation) return;
3484 elm_genlist_item_selected_set(it, EINA_FALSE);
3488 if (elm_widget_item_disabled_get(it))
3490 edje_object_signal_emit(VIEW(_it), "elm,state,disabled", "elm");
3492 edje_object_signal_emit(_it->edit_obj, "elm,state,disabled", "elm");
3496 edje_object_signal_emit(VIEW(_it), "elm,state,enabled", "elm");
3498 edje_object_signal_emit(_it->edit_obj, "elm,state,enabled", "elm");
3500 EINA_LIST_FOREACH(_it->content_objs, l, obj)
3501 elm_widget_disabled_set(obj, elm_widget_item_disabled_get(_it));
3506 _item_del_pre_hook(Elm_Object_Item *it)
3508 Elm_Gen_Item *_it = (Elm_Gen_Item *) it;
3510 if ((_it->relcount > 0) || (_it->walking > 0))
3512 elm_genlist_item_subitems_clear(it);
3513 if (_it->wd->show_item == _it) _it->wd->show_item = NULL;
3514 _elm_genlist_item_del_notserious(_it);
3515 if (_it->item->block)
3517 if (_it->realized) _elm_genlist_item_unrealize(_it, EINA_FALSE);
3518 _it->item->block->changed = EINA_TRUE;
3519 if (_it->wd->calc_job) ecore_job_del(_it->wd->calc_job);
3520 _it->wd->calc_job = ecore_job_add(_calc_job, _it->wd);
3524 _it->parent->item->items =
3525 eina_list_remove(_it->parent->item->items, it);
3535 _elm_genlist_item_new(Widget_Data *wd,
3536 const Elm_Gen_Item_Class *itc,
3538 Elm_Gen_Item *parent,
3540 const void *func_data)
3544 it = elm_widget_item_new(wd->obj, Elm_Gen_Item);
3545 if (!it) return NULL;
3547 it->generation = wd->generation;
3549 elm_genlist_item_class_ref((Elm_Genlist_Item_Class *)itc);
3550 it->base.data = data;
3551 it->parent = parent;
3552 it->func.func = func;
3553 it->func.data = func_data;
3554 elm_widget_item_content_get_hook_set(it, _item_content_get_hook);
3555 elm_widget_item_content_set_hook_set(it, _item_content_set_hook);
3556 elm_widget_item_content_unset_hook_set(it, _item_content_unset_hook);
3557 elm_widget_item_disable_hook_set(it, _item_disable_hook);
3558 elm_widget_item_del_pre_hook_set(it, _item_del_pre_hook);
3560 it->sel_cb = (Ecore_Cb)_item_select;
3562 elm_widget_item_text_get_hook_set(it, _item_text_hook);
3566 static Elm_Gen_Item *
3567 _item_new(Widget_Data *wd,
3568 const Elm_Genlist_Item_Class *itc,
3570 Elm_Gen_Item *parent,
3571 Elm_Genlist_Item_Flags flags,
3573 const void *func_data)
3575 Elm_Gen_Item *it, *it2;
3578 it = _elm_genlist_item_new(wd, itc, data, parent, func, func_data);
3579 if (!it) return NULL;
3580 it->item = ELM_NEW(Elm_Gen_Item_Type);
3581 it->item->flags = flags;
3582 if (flags & ELM_GENLIST_ITEM_GROUP) it->group++;
3583 it->item->expanded_depth = 0;
3584 ELM_GEN_ITEM_SETUP(it);
3587 if (it->parent->group)
3588 it->item->group_item = parent;
3589 else if (it->parent->item->group_item)
3590 it->item->group_item = it->parent->item->group_item;
3592 for (it2 = it, depth = 0; it2->parent; it2 = it2->parent)
3594 if (!it2->parent->group) depth += 1;
3596 it->item->expanded_depth = depth;
3602 _item_block_new(Widget_Data *wd, Eina_Bool prepend)
3606 itb = calloc(1, sizeof(Item_Block));
3607 if (!itb) return NULL;
3611 wd->blocks = eina_inlist_prepend(wd->blocks, EINA_INLIST_GET(itb));
3612 _item_block_position_update(wd->blocks, 0);
3616 wd->blocks = eina_inlist_append(wd->blocks, EINA_INLIST_GET(itb));
3617 itb->position_update = EINA_TRUE;
3618 if (wd->blocks != EINA_INLIST_GET(itb))
3620 itb->position = ((Item_Block *) (EINA_INLIST_GET(itb)->prev))->position + 1;
3631 _item_block_add(Widget_Data *wd,
3634 Item_Block *itb = NULL;
3641 itb = calloc(1, sizeof(Item_Block));
3642 if (!itb) return EINA_FALSE;
3644 if (!it->item->rel->item->block)
3647 eina_inlist_append(wd->blocks, EINA_INLIST_GET(itb));
3648 itb->items = eina_list_append(itb->items, it);
3649 itb->position_update = EINA_TRUE;
3650 it->position = eina_list_count(itb->items);
3651 it->position_update = EINA_TRUE;
3653 if (wd->blocks != EINA_INLIST_GET(itb))
3655 itb->position = ((Item_Block *) (EINA_INLIST_GET(itb)->prev))->position + 1;
3666 tmp = eina_list_data_find_list(itb->items, it->item->rel);
3667 if (it->item->before)
3669 wd->blocks = eina_inlist_prepend_relative
3670 (wd->blocks, EINA_INLIST_GET(itb),
3671 EINA_INLIST_GET(it->item->rel->item->block));
3673 eina_list_prepend_relative_list(itb->items, it, tmp);
3675 /* Update index from where we prepended */
3676 _item_position_update(eina_list_prev(tmp), it->item->rel->position);
3677 _item_block_position_update(EINA_INLIST_GET(itb),
3678 it->item->rel->item->block->position);
3682 wd->blocks = eina_inlist_append_relative
3683 (wd->blocks, EINA_INLIST_GET(itb),
3684 EINA_INLIST_GET(it->item->rel->item->block));
3686 eina_list_append_relative_list(itb->items, it, tmp);
3688 /* Update block index from where we appended */
3689 _item_position_update(eina_list_next(tmp), it->item->rel->position + 1);
3690 _item_block_position_update(EINA_INLIST_GET(itb),
3691 it->item->rel->item->block->position + 1);
3697 if (it->item->before)
3701 itb = (Item_Block *)(wd->blocks);
3702 if (itb->count >= wd->max_items_per_block)
3704 itb = _item_block_new(wd, EINA_TRUE);
3705 if (!itb) return EINA_FALSE;
3710 itb = _item_block_new(wd, EINA_TRUE);
3711 if (!itb) return EINA_FALSE;
3713 itb->items = eina_list_prepend(itb->items, it);
3715 _item_position_update(itb->items, 0);
3721 itb = (Item_Block *)(wd->blocks->last);
3722 if (itb->count >= wd->max_items_per_block)
3724 itb = _item_block_new(wd, EINA_FALSE);
3725 if (!itb) return EINA_FALSE;
3730 itb = _item_block_new(wd, EINA_FALSE);
3731 if (!itb) return EINA_FALSE;
3733 itb->items = eina_list_append(itb->items, it);
3734 it->position = eina_list_count(itb->items);
3742 if (it->item->rel->item->queued)
3744 /* NOTE: for a strange reason eina_list and eina_inlist don't have the same property
3745 on sorted insertion order, so the queue is not always ordered like the item list.
3746 This lead to issue where we depend on an item that is not yet created. As a quick
3747 work around, we reschedule the calc of the item and stop reordering the list to
3748 prevent any nasty issue to show up here.
3750 wd->queue = eina_list_append(wd->queue, it);
3751 wd->requeued = EINA_TRUE;
3752 it->item->queued = EINA_TRUE;
3755 itb = it->item->rel->item->block;
3756 if (!itb) goto newblock;
3757 tmp = eina_list_data_find_list(itb->items, it->item->rel);
3758 if (it->item->before)
3760 itb->items = eina_list_prepend_relative_list(itb->items, it, tmp);
3761 _item_position_update(eina_list_prev(tmp), it->item->rel->position);
3765 itb->items = eina_list_append_relative_list(itb->items, it, tmp);
3766 _item_position_update(eina_list_next(tmp), it->item->rel->position + 1);
3770 itb->changed = EINA_TRUE;
3771 it->item->block = itb;
3772 if (itb->wd->calc_job) ecore_job_del(itb->wd->calc_job);
3773 itb->wd->calc_job = ecore_job_add(_calc_job, itb->wd);
3776 it->item->rel->relcount--;
3777 if ((it->item->rel->generation < it->wd->generation) && (!it->item->rel->relcount))
3779 _item_del(it->item->rel);
3780 elm_widget_item_free(it->item->rel);
3782 it->item->rel = NULL;
3784 if (itb->count > itb->wd->max_items_per_block)
3789 Eina_Bool done = EINA_FALSE;
3791 newc = itb->count / 2;
3793 if (EINA_INLIST_GET(itb)->prev)
3795 Item_Block *itbp = (Item_Block *)(EINA_INLIST_GET(itb)->prev);
3797 if (itbp->count + newc < wd->max_items_per_block / 2)
3799 /* moving items to previous block */
3800 while ((itb->count > newc) && (itb->items))
3802 it2 = eina_list_data_get(itb->items);
3803 itb->items = eina_list_remove_list(itb->items, itb->items);
3806 itbp->items = eina_list_append(itbp->items, it2);
3807 it2->item->block = itbp;
3815 if (!done && EINA_INLIST_GET(itb)->next)
3817 Item_Block *itbn = (Item_Block *)(EINA_INLIST_GET(itb)->next);
3819 if (itbn->count + newc < wd->max_items_per_block / 2)
3821 /* moving items to next block */
3822 while ((itb->count > newc) && (itb->items))
3826 l = eina_list_last(itb->items);
3827 it2 = eina_list_data_get(l);
3828 itb->items = eina_list_remove_list(itb->items, l);
3831 itbn->items = eina_list_prepend(itbn->items, it2);
3832 it2->item->block = itbn;
3842 /* moving items to new block */
3843 itb2 = calloc(1, sizeof(Item_Block));
3844 if (!itb2) return EINA_FALSE;
3847 eina_inlist_append_relative(wd->blocks, EINA_INLIST_GET(itb2),
3848 EINA_INLIST_GET(itb));
3849 itb2->changed = EINA_TRUE;
3850 while ((itb->count > newc) && (itb->items))
3854 l = eina_list_last(itb->items);
3856 itb->items = eina_list_remove_list(itb->items, l);
3859 itb2->items = eina_list_prepend(itb2->items, it2);
3860 it2->item->block = itb2;
3870 _queue_process(Widget_Data *wd)
3873 Eina_Bool showme = EINA_FALSE;
3876 t0 = ecore_loop_time_get();
3877 //evas_event_freeze(evas_object_evas_get(wd->obj));
3878 for (n = 0; (wd->queue) && (n < 128); n++)
3882 it = eina_list_data_get(wd->queue);
3883 wd->queue = eina_list_remove_list(wd->queue, wd->queue);
3884 it->item->queued = EINA_FALSE;
3885 if (!_item_block_add(wd, it)) continue;
3887 _item_block_realize(it->item->block);
3888 t = ecore_time_get();
3889 if (it->item->block->changed)
3891 showme = _item_block_recalc(it->item->block, it->item->block->num, EINA_TRUE);
3892 it->item->block->changed = 0;
3893 if (wd->pan_changed)
3895 if (wd->calc_job) ecore_job_del(wd->calc_job);
3896 wd->calc_job = NULL;
3898 wd->pan_changed = EINA_FALSE;
3901 if (showme) it->item->block->showme = EINA_TRUE;
3902 /* same as eina_inlist_count > 1 */
3903 if (wd->blocks && wd->blocks->next)
3905 if ((t - t0) > (ecore_animator_frametime_get())) break;
3908 //evas_event_thaw(evas_object_evas_get(wd->obj));
3909 //evas_event_thaw_eval(evas_object_evas_get(wd->obj));
3914 _idle_process(void *data, Eina_Bool *wakeup)
3916 Widget_Data *wd = data;
3919 //static double q_start = 0.0;
3920 //if (q_start == 0.0) q_start = ecore_time_get();
3922 if (_queue_process(wd) > 0) *wakeup = EINA_TRUE;
3926 //printf("PROCESS TIME: %3.3f\n", ecore_time_get() - q_start);
3928 return ECORE_CALLBACK_CANCEL;
3930 return ECORE_CALLBACK_RENEW;
3934 _item_idle_enterer(void *data)
3936 Widget_Data *wd = data;
3937 Eina_Bool wakeup = EINA_FALSE;
3938 Eina_Bool ok = _idle_process(data, &wakeup);
3943 if (wd->calc_job) ecore_job_del(wd->calc_job);
3944 wd->calc_job = ecore_job_add(_calc_job, wd);
3946 if (ok == ECORE_CALLBACK_CANCEL) wd->queue_idle_enterer = NULL;
3951 _item_queue(Widget_Data *wd,
3955 if (it->item->queued) return;
3956 it->item->queued = EINA_TRUE;
3957 if (cb && !wd->requeued)
3958 wd->queue = eina_list_sorted_insert(wd->queue, cb, it);
3960 wd->queue = eina_list_append(wd->queue, it);
3961 // FIXME: why does a freeze then thaw here cause some genlist
3962 // elm_genlist_item_append() to be much much slower?
3963 // evas_event_freeze(evas_object_evas_get(wd->obj));
3964 while ((wd->queue) && ((!wd->blocks) || (!wd->blocks->next)))
3966 if (wd->queue_idle_enterer)
3968 ecore_idle_enterer_del(wd->queue_idle_enterer);
3969 wd->queue_idle_enterer = NULL;
3973 // evas_event_thaw(evas_object_evas_get(wd->obj));
3974 // evas_event_thaw_eval(evas_object_evas_get(wd->obj));
3975 if (!wd->queue_idle_enterer)
3976 wd->queue_idle_enterer = ecore_idle_enterer_add(_item_idle_enterer, wd);
3980 _elm_genlist_item_compare_data(const void *data, const void *data1)
3982 const Elm_Gen_Item *it = data;
3983 const Elm_Gen_Item *item1 = data1;
3985 return it->wd->item_compare_data_cb(it->base.data, item1->base.data);
3989 _elm_genlist_item_compare(const void *data, const void *data1)
3991 const Elm_Gen_Item *it, *item1;
3992 it = ELM_GEN_ITEM_FROM_INLIST(data);
3993 item1 = ELM_GEN_ITEM_FROM_INLIST(data1);
3994 return it->wd->item_compare_cb(it, item1);
3998 _elm_genlist_item_list_compare(const void *data, const void *data1)
4000 const Elm_Gen_Item *it = data;
4001 const Elm_Gen_Item *item1 = data1;
4002 return it->wd->item_compare_cb(it, item1);
4006 _item_move_after(Elm_Gen_Item *it, Elm_Gen_Item *after)
4011 it->wd->items = eina_inlist_remove(it->wd->items, EINA_INLIST_GET(it));
4012 _item_block_del(it);
4014 it->wd->items = eina_inlist_append_relative(it->wd->items, EINA_INLIST_GET(it), EINA_INLIST_GET(after));
4015 it->item->rel = after;
4016 it->item->rel->relcount++;
4017 it->item->before = EINA_FALSE;
4018 if (after->item->group_item) it->item->group_item = after->item->group_item;
4019 _item_queue(it->wd, it, NULL);
4021 evas_object_smart_callback_call(WIDGET(it), SIG_MOVED, it);
4025 _item_move_before(Elm_Gen_Item *it, Elm_Gen_Item *before)
4028 if (!before) return;
4030 it->wd->items = eina_inlist_remove(it->wd->items, EINA_INLIST_GET(it));
4031 _item_block_del(it);
4032 it->wd->items = eina_inlist_prepend_relative(it->wd->items, EINA_INLIST_GET(it), EINA_INLIST_GET(before));
4033 it->item->rel = before;
4034 it->item->rel->relcount++;
4035 it->item->before = EINA_TRUE;
4036 if (before->item->group_item) it->item->group_item = before->item->group_item;
4037 _item_queue(it->wd, it, NULL);
4039 evas_object_smart_callback_call(WIDGET(it), SIG_MOVED, it);
4043 elm_genlist_items_count(const Evas_Object *obj)
4045 ELM_CHECK_WIDTYPE(obj, widtype) 0;
4046 Widget_Data *wd = elm_widget_data_get(obj);
4048 return wd->item_count;
4051 EAPI Elm_Object_Item *
4052 elm_genlist_item_append(Evas_Object *obj,
4053 const Elm_Genlist_Item_Class *itc,
4055 Elm_Object_Item *parent,
4056 Elm_Genlist_Item_Flags flags,
4058 const void *func_data)
4060 ELM_CHECK_WIDTYPE(obj, widtype) NULL;
4061 Widget_Data *wd = elm_widget_data_get(obj);
4062 if (!wd) return NULL;
4063 Elm_Gen_Item *it = _item_new(wd, itc, data, (Elm_Gen_Item *) parent, flags,
4065 if (!it) return NULL;
4069 wd->group_items = eina_list_append(wd->group_items, it);
4070 wd->items = eina_inlist_append(wd->items, EINA_INLIST_GET(it));
4071 it->item->rel = NULL;
4075 Elm_Gen_Item *it2 = NULL;
4076 Eina_List *ll = eina_list_last(it->parent->item->items);
4077 if (ll) it2 = ll->data;
4078 it->parent->item->items = eina_list_append(it->parent->item->items, it);
4079 if (!it2) it2 = it->parent;
4081 eina_inlist_append_relative(wd->items, EINA_INLIST_GET(it),
4082 EINA_INLIST_GET(it2));
4083 it->item->rel = it2;
4084 it->item->rel->relcount++;
4086 it->item->before = EINA_FALSE;
4087 _item_queue(wd, it, NULL);
4088 return (Elm_Object_Item *) it;
4091 EAPI Elm_Object_Item *
4092 elm_genlist_item_prepend(Evas_Object *obj,
4093 const Elm_Genlist_Item_Class *itc,
4095 Elm_Object_Item *parent,
4096 Elm_Genlist_Item_Flags flags,
4098 const void *func_data)
4100 ELM_CHECK_WIDTYPE(obj, widtype) NULL;
4101 Widget_Data *wd = elm_widget_data_get(obj);
4102 if (!wd) return NULL;
4103 Elm_Gen_Item *it = _item_new(wd, itc, data, (Elm_Gen_Item *) parent, flags,
4105 if (!it) return NULL;
4109 wd->group_items = eina_list_prepend(wd->group_items, it);
4110 wd->items = eina_inlist_prepend(wd->items, EINA_INLIST_GET(it));
4111 it->item->rel = NULL;
4115 Elm_Gen_Item *it2 = NULL;
4116 Eina_List *ll = it->parent->item->items;
4117 if (ll) it2 = ll->data;
4118 it->parent->item->items = eina_list_prepend(it->parent->item->items, it);
4119 if (!it2) it2 = it->parent;
4121 eina_inlist_prepend_relative(wd->items, EINA_INLIST_GET(it),
4122 EINA_INLIST_GET(it2));
4123 it->item->rel = it2;
4124 it->item->rel->relcount++;
4126 it->item->before = EINA_TRUE;
4127 _item_queue(wd, it, NULL);
4128 return (Elm_Object_Item *) it;
4131 EAPI Elm_Object_Item *
4132 elm_genlist_item_insert_after(Evas_Object *obj,
4133 const Elm_Genlist_Item_Class *itc,
4135 Elm_Object_Item *parent,
4136 Elm_Object_Item *after,
4137 Elm_Genlist_Item_Flags flags,
4139 const void *func_data)
4141 ELM_CHECK_WIDTYPE(obj, widtype) NULL;
4142 ELM_OBJ_ITEM_CHECK_OR_RETURN(after, NULL);
4143 Widget_Data *wd = elm_widget_data_get(obj);
4144 Elm_Gen_Item *_after = (Elm_Gen_Item *) after;
4145 if (!wd) return NULL;
4146 /* It makes no sense to insert after in an empty list with after != NULL, something really bad is happening in your app. */
4147 EINA_SAFETY_ON_NULL_RETURN_VAL(wd->items, NULL);
4149 Elm_Gen_Item *it = _item_new(wd, itc, data, (Elm_Gen_Item *) parent, flags,
4151 if (!it) return NULL;
4154 if ((it->group) && (_after->group))
4155 wd->group_items = eina_list_append_relative(wd->group_items, it,
4160 it->parent->item->items =
4161 eina_list_append_relative(it->parent->item->items, it, _after);
4163 wd->items = eina_inlist_append_relative(wd->items, EINA_INLIST_GET(it),
4164 EINA_INLIST_GET(_after));
4165 it->item->rel = _after;
4166 it->item->rel->relcount++;
4167 it->item->before = EINA_FALSE;
4168 _item_queue(wd, it, NULL);
4169 return (Elm_Object_Item *) it;
4172 EAPI Elm_Object_Item *
4173 elm_genlist_item_insert_before(Evas_Object *obj,
4174 const Elm_Genlist_Item_Class *itc,
4176 Elm_Object_Item *parent,
4177 Elm_Object_Item *before,
4178 Elm_Genlist_Item_Flags flags,
4180 const void *func_data)
4182 ELM_CHECK_WIDTYPE(obj, widtype) NULL;
4183 ELM_OBJ_ITEM_CHECK_OR_RETURN(before, NULL);
4184 Widget_Data *wd = elm_widget_data_get(obj);
4185 Elm_Gen_Item *_before = (Elm_Gen_Item *) before;
4186 if (!wd) return NULL;
4187 /* It makes no sense to insert before in an empty list with before != NULL, something really bad is happening in your app. */
4188 EINA_SAFETY_ON_NULL_RETURN_VAL(wd->items, NULL);
4190 Elm_Gen_Item *it = _item_new(wd, itc, data, (Elm_Gen_Item *) parent, flags,
4192 if (!it) return NULL;
4195 if (it->group && _before->group)
4196 wd->group_items = eina_list_prepend_relative(wd->group_items, it,
4201 it->parent->item->items =
4202 eina_list_prepend_relative(it->parent->item->items, it, _before);
4204 wd->items = eina_inlist_prepend_relative(wd->items, EINA_INLIST_GET(it),
4205 EINA_INLIST_GET(_before));
4206 it->item->rel = _before;
4207 it->item->rel->relcount++;
4208 it->item->before = EINA_TRUE;
4209 _item_queue(wd, it, NULL);
4210 return (Elm_Object_Item *) it;
4213 EAPI Elm_Object_Item *
4214 elm_genlist_item_direct_sorted_insert(Evas_Object *obj,
4215 const Elm_Genlist_Item_Class *itc,
4217 Elm_Object_Item *parent,
4218 Elm_Genlist_Item_Flags flags,
4219 Eina_Compare_Cb comp,
4221 const void *func_data)
4223 ELM_CHECK_WIDTYPE(obj, widtype) NULL;
4224 Widget_Data *wd = elm_widget_data_get(obj);
4225 if (!wd) return NULL;
4226 Elm_Gen_Item *rel = NULL;
4227 Elm_Gen_Item *it = _item_new(wd, itc, data, (Elm_Gen_Item *) parent, flags,
4229 if (!it) return NULL;
4231 wd->item_compare_cb = comp;
4238 l = eina_list_search_sorted_near_list(it->parent->item->items,
4239 _elm_genlist_item_list_compare, it,
4242 rel = eina_list_data_get(l);
4246 if (cmp_result >= 0)
4248 it->parent->item->items = eina_list_prepend_relative_list(it->parent->item->items, it, l);
4249 wd->items = eina_inlist_prepend_relative(wd->items, EINA_INLIST_GET(it), EINA_INLIST_GET(rel));
4250 it->item->before = EINA_FALSE;
4252 else if (cmp_result < 0)
4254 it->parent->item->items = eina_list_append_relative_list(it->parent->item->items, it, l);
4255 wd->items = eina_inlist_append_relative(wd->items, EINA_INLIST_GET(it), EINA_INLIST_GET(rel));
4256 it->item->before = EINA_TRUE;
4263 wd->state = eina_inlist_sorted_state_new();
4264 eina_inlist_sorted_state_init(wd->state, wd->items);
4265 wd->requeued = EINA_FALSE;
4269 wd->group_items = eina_list_append(wd->group_items, it);
4271 wd->items = eina_inlist_sorted_state_insert(wd->items, EINA_INLIST_GET(it),
4272 _elm_genlist_item_compare, wd->state);
4274 if (EINA_INLIST_GET(it)->next)
4276 rel = ELM_GEN_ITEM_FROM_INLIST(EINA_INLIST_GET(it)->next);
4277 it->item->before = EINA_TRUE;
4279 else if (EINA_INLIST_GET(it)->prev)
4281 rel = ELM_GEN_ITEM_FROM_INLIST(EINA_INLIST_GET(it)->prev);
4282 it->item->before = EINA_FALSE;
4288 it->item->rel = rel;
4289 it->item->rel->relcount++;
4292 _item_queue(wd, it, _elm_genlist_item_list_compare);
4294 return (Elm_Object_Item *) it;
4297 EAPI Elm_Object_Item *
4298 elm_genlist_item_sorted_insert(Evas_Object *obj,
4299 const Elm_Genlist_Item_Class *itc,
4301 Elm_Object_Item *parent,
4302 Elm_Genlist_Item_Flags flags,
4303 Eina_Compare_Cb comp,
4305 const void *func_data)
4307 ELM_CHECK_WIDTYPE(obj, widtype) NULL;
4308 Widget_Data *wd = elm_widget_data_get(obj);
4309 wd->item_compare_data_cb = comp;
4310 return elm_genlist_item_direct_sorted_insert(obj, itc, data, parent, flags,
4311 _elm_genlist_item_compare_data,
4316 _elm_genlist_clear(Evas_Object *obj, Eina_Bool standby)
4318 Eina_Inlist *next, *l;
4320 ELM_CHECK_WIDTYPE(obj, widtype);
4321 Widget_Data *wd = elm_widget_data_get(obj);
4324 if (!standby) wd->generation++;
4328 eina_inlist_sorted_state_free(wd->state);
4332 if (wd->walking > 0)
4337 evas_event_freeze(evas_object_evas_get(wd->obj));
4338 for (l = wd->items, next = l ? l->next : NULL;
4340 l = next, next = next ? next->next : NULL)
4342 Elm_Gen_Item *it = ELM_GEN_ITEM_FROM_INLIST(l);
4344 if (it->generation < wd->generation)
4346 Elm_Gen_Item *itn = NULL;
4348 if (next) itn = ELM_GEN_ITEM_FROM_INLIST(next);
4349 if (itn) itn->walking++; /* prevent early death of subitem */
4351 elm_widget_item_free(it);
4352 if (itn) itn->walking--;
4356 wd->pan_changed = EINA_TRUE;
4359 ecore_job_del(wd->calc_job);
4360 wd->calc_job = NULL;
4362 if (wd->selected) wd->selected = eina_list_free(wd->selected);
4363 if (wd->clear_cb) wd->clear_cb(wd);
4370 evas_object_size_hint_min_set(wd->pan_smart, wd->minw, wd->minh);
4371 evas_object_smart_callback_call(wd->pan_smart, "changed", NULL);
4373 if (wd->sizing_cb) wd->sizing_cb(wd->obj);
4374 elm_smart_scroller_child_region_show(wd->scr, 0, 0, 0, 0);
4375 evas_event_thaw(evas_object_evas_get(wd->obj));
4376 evas_event_thaw_eval(evas_object_evas_get(wd->obj));
4380 elm_genlist_clear(Evas_Object *obj)
4382 _elm_genlist_clear(obj, EINA_FALSE);
4386 elm_genlist_multi_select_set(Evas_Object *obj,
4389 ELM_CHECK_WIDTYPE(obj, widtype);
4390 Widget_Data *wd = elm_widget_data_get(obj);
4396 elm_genlist_multi_select_get(const Evas_Object *obj)
4398 ELM_CHECK_WIDTYPE(obj, widtype) EINA_FALSE;
4399 Widget_Data *wd = elm_widget_data_get(obj);
4400 if (!wd) return EINA_FALSE;
4404 EAPI Elm_Object_Item *
4405 elm_genlist_selected_item_get(const Evas_Object *obj)
4407 ELM_CHECK_WIDTYPE(obj, widtype) NULL;
4408 Widget_Data *wd = elm_widget_data_get(obj);
4409 if (!wd) return NULL;
4410 if (wd->selected) return wd->selected->data;
4414 EAPI const Eina_List *
4415 elm_genlist_selected_items_get(const Evas_Object *obj)
4417 ELM_CHECK_WIDTYPE(obj, widtype) NULL;
4418 Widget_Data *wd = elm_widget_data_get(obj);
4419 if (!wd) return NULL;
4420 return wd->selected;
4424 elm_genlist_realized_items_get(const Evas_Object *obj)
4426 ELM_CHECK_WIDTYPE(obj, widtype) NULL;
4427 Widget_Data *wd = elm_widget_data_get(obj);
4428 Eina_List *list = NULL;
4430 Eina_Bool done = EINA_FALSE;
4431 if (!wd) return NULL;
4432 EINA_INLIST_FOREACH(wd->blocks, itb)
4440 EINA_LIST_FOREACH(itb->items, l, it)
4442 if (it->realized) list = eina_list_append(list, it);
4453 EAPI Elm_Object_Item *
4454 elm_genlist_at_xy_item_get(const Evas_Object *obj,
4459 ELM_CHECK_WIDTYPE(obj, widtype) NULL;
4460 Widget_Data *wd = elm_widget_data_get(obj);
4461 Evas_Coord ox, oy, ow, oh;
4464 if (!wd) return NULL;
4465 evas_object_geometry_get(wd->pan_smart, &ox, &oy, &ow, &oh);
4467 EINA_INLIST_FOREACH(wd->blocks, itb)
4472 if (!ELM_RECTS_INTERSECT(ox + itb->x - itb->wd->pan_x,
4473 oy + itb->y - itb->wd->pan_y,
4474 itb->w, itb->h, x, y, 1, 1))
4476 EINA_LIST_FOREACH(itb->items, l, it)
4478 Evas_Coord itx, ity;
4480 itx = ox + itb->x + it->x - itb->wd->pan_x;
4481 ity = oy + itb->y + it->y - itb->wd->pan_y;
4482 if (ELM_RECTS_INTERSECT(itx, ity, it->item->w, it->item->h, x, y, 1, 1))
4486 if (y <= (ity + (it->item->h / 4))) *posret = -1;
4487 else if (y >= (ity + it->item->h - (it->item->h / 4)))
4491 return (Elm_Object_Item *) it;
4493 lasty = ity + it->item->h;
4498 if (y > lasty) *posret = 1;
4504 EAPI Elm_Object_Item *
4505 elm_genlist_first_item_get(const Evas_Object *obj)
4507 ELM_CHECK_WIDTYPE(obj, widtype) NULL;
4508 Widget_Data *wd = elm_widget_data_get(obj);
4509 if (!wd) return NULL;
4510 if (!wd->items) return NULL;
4511 Elm_Gen_Item *it = ELM_GEN_ITEM_FROM_INLIST(wd->items);
4512 while ((it) && (it->generation < wd->generation))
4513 it = ELM_GEN_ITEM_FROM_INLIST(EINA_INLIST_GET(it)->next);
4514 return (Elm_Object_Item *) it;
4517 EAPI Elm_Object_Item *
4518 elm_genlist_last_item_get(const Evas_Object *obj)
4520 ELM_CHECK_WIDTYPE(obj, widtype) NULL;
4521 Widget_Data *wd = elm_widget_data_get(obj);
4522 if (!wd) return NULL;
4523 if (!wd->items) return NULL;
4524 Elm_Gen_Item *it = ELM_GEN_ITEM_FROM_INLIST(wd->items->last);
4525 while ((it) && (it->generation < wd->generation))
4526 it = ELM_GEN_ITEM_FROM_INLIST(EINA_INLIST_GET(it)->prev);
4527 return (Elm_Object_Item *) it;
4530 EAPI Elm_Object_Item *
4531 elm_genlist_item_next_get(const Elm_Object_Item *it)
4533 ELM_OBJ_ITEM_CHECK_OR_RETURN(it, NULL);
4534 Elm_Gen_Item *_it = (Elm_Gen_Item *) it;
4537 _it = ELM_GEN_ITEM_FROM_INLIST(EINA_INLIST_GET(_it)->next);
4538 if ((_it) && (_it->generation == _it->wd->generation)) break;
4540 return (Elm_Object_Item *) _it;
4543 EAPI Elm_Object_Item *
4544 elm_genlist_item_prev_get(const Elm_Object_Item *it)
4546 ELM_OBJ_ITEM_CHECK_OR_RETURN(it, NULL);
4547 Elm_Gen_Item *_it = (Elm_Gen_Item *) it;
4550 _it = ELM_GEN_ITEM_FROM_INLIST(EINA_INLIST_GET(_it)->prev);
4551 if ((_it) && (_it->generation == _it->wd->generation)) break;
4553 return (Elm_Object_Item *) _it;
4557 elm_genlist_item_genlist_get(const Elm_Object_Item *it)
4559 return elm_object_item_widget_get(it);
4562 EAPI Elm_Object_Item *
4563 elm_genlist_item_parent_get(const Elm_Object_Item *it)
4565 ELM_OBJ_ITEM_CHECK_OR_RETURN(it, NULL);
4566 return (Elm_Object_Item *) ((Elm_Gen_Item *) it)->parent;
4570 elm_genlist_item_subitems_clear(Elm_Object_Item *it)
4572 ELM_OBJ_ITEM_CHECK_OR_RETURN(it);
4573 Eina_List *tl = NULL, *l;
4575 Elm_Object_Item *it2;
4576 _it = (Elm_Gen_Item *) it;
4578 EINA_LIST_FOREACH(_it->item->items, l, it2)
4579 tl = eina_list_append(tl, it2);
4580 EINA_LIST_FREE(tl, it2)
4581 elm_object_item_del(it2);
4585 elm_genlist_item_selected_set(Elm_Object_Item *it,
4588 ELM_OBJ_ITEM_CHECK_OR_RETURN(it);
4589 Elm_Gen_Item *_it = (Elm_Gen_Item *) it;
4590 Widget_Data *wd = _it->wd;
4592 if ((_it->generation < wd->generation) || elm_widget_item_disabled_get(_it))
4594 selected = !!selected;
4595 if (_it->selected == selected) return;
4601 while (wd->selected)
4603 if (_it->unhighlight_cb) _it->unhighlight_cb(wd->selected->data);
4604 _it->unsel_cb(wd->selected->data);
4607 _it->highlight_cb(_it);
4611 if (_it->unhighlight_cb) _it->unhighlight_cb(_it);
4616 elm_genlist_item_selected_get(const Elm_Object_Item *it)
4618 ELM_OBJ_ITEM_CHECK_OR_RETURN(it, EINA_FALSE);
4619 return ((Elm_Gen_Item *) it)->selected;
4623 elm_genlist_item_expanded_set(Elm_Object_Item *it,
4626 ELM_OBJ_ITEM_CHECK_OR_RETURN(it);
4627 Elm_Gen_Item *_it = (Elm_Gen_Item *) it;
4628 if (_it->item->expanded == expanded) return;
4629 _it->item->expanded = expanded;
4630 _it->wd->expanded_item = _it;
4631 if (_it->item->expanded)
4634 edje_object_signal_emit(VIEW(_it), "elm,state,expanded", "elm");
4635 evas_object_smart_callback_call(WIDGET(_it), SIG_EXPANDED, _it);
4636 _it->wd->auto_scroll_enabled = EINA_TRUE;
4641 edje_object_signal_emit(VIEW(_it), "elm,state,contracted", "elm");
4642 evas_object_smart_callback_call(WIDGET(_it), SIG_CONTRACTED, _it);
4643 _it->wd->auto_scroll_enabled = EINA_FALSE;
4648 elm_genlist_item_expanded_get(const Elm_Object_Item *it)
4650 ELM_OBJ_ITEM_CHECK_OR_RETURN(it, EINA_FALSE);
4651 return ((Elm_Gen_Item *) it)->item->expanded;
4655 elm_genlist_item_expanded_depth_get(const Elm_Object_Item *it)
4657 ELM_OBJ_ITEM_CHECK_OR_RETURN(it, 0);
4658 return ((Elm_Gen_Item *) it)->item->expanded_depth;
4662 elm_genlist_item_disabled_set(Elm_Object_Item *it,
4665 elm_object_item_disabled_set(it, disabled);
4669 elm_genlist_item_disabled_get(const Elm_Object_Item *it)
4671 return elm_object_item_disabled_get(it);
4675 elm_genlist_item_display_only_set(Elm_Object_Item *it,
4676 Eina_Bool display_only)
4678 ELM_OBJ_ITEM_CHECK_OR_RETURN(it);
4679 Elm_Gen_Item *_it = (Elm_Gen_Item *) it;
4680 display_only = !!display_only;
4681 if (_it->display_only == display_only) return;
4682 if (_it->generation < _it->wd->generation) return;
4683 _it->display_only = display_only;
4684 _it->item->mincalcd = EINA_FALSE;
4685 _it->item->updateme = EINA_TRUE;
4686 if (_it->item->block) _it->item->block->updateme = EINA_TRUE;
4687 if (_it->wd->update_job) ecore_job_del(_it->wd->update_job);
4688 _it->wd->update_job = ecore_job_add(_update_job, _it->wd);
4692 elm_genlist_item_display_only_get(const Elm_Object_Item *it)
4694 ELM_OBJ_ITEM_CHECK_OR_RETURN(it, EINA_FALSE);
4695 Elm_Gen_Item *_it = (Elm_Gen_Item *) it;
4696 if (_it->generation < _it->wd->generation) return EINA_FALSE;
4697 return _it->display_only;
4701 elm_genlist_item_show(Elm_Object_Item *it)
4703 ELM_OBJ_ITEM_CHECK_OR_RETURN(it);
4704 Elm_Gen_Item *_it = (Elm_Gen_Item *) it;
4705 Evas_Coord gith = 0;
4706 if (_it->generation < _it->wd->generation) return;
4707 if ((_it->item->queued) || (!_it->item->mincalcd))
4709 _it->wd->show_item = _it;
4710 _it->wd->bring_in = EINA_FALSE;
4711 _it->wd->scrollto_type = ELM_GENLIST_ITEM_SCROLLTO_IN;
4712 _it->item->showme = EINA_TRUE;
4715 if (_it->wd->show_item)
4717 _it->wd->show_item->item->showme = EINA_FALSE;
4718 _it->wd->show_item = NULL;
4720 if ((_it->item->group_item) &&
4721 (_it->wd->pan_y > (_it->y + _it->item->block->y)))
4722 gith = _it->item->group_item->item->h;
4723 elm_smart_scroller_child_region_show(_it->wd->scr,
4724 _it->x + _it->item->block->x,
4725 _it->y + _it->item->block->y - gith,
4726 _it->item->block->w, _it->item->h);
4730 elm_genlist_item_promote(Elm_Object_Item *it)
4732 ELM_OBJ_ITEM_CHECK_OR_RETURN(it);
4733 Elm_Gen_Item *_it = (Elm_Gen_Item *) it;
4734 if (_it->generation < _it->wd->generation) return;
4735 _item_move_before(_it,
4736 (Elm_Gen_Item *) elm_genlist_first_item_get(WIDGET(_it)));
4740 elm_genlist_item_demote(Elm_Object_Item *it)
4742 ELM_OBJ_ITEM_CHECK_OR_RETURN(it);
4743 Elm_Gen_Item *_it = (Elm_Gen_Item *) it;
4744 if (_it->generation < _it->wd->generation) return;
4745 _item_move_after(_it,
4746 (Elm_Gen_Item *) elm_genlist_last_item_get(WIDGET(_it)));
4750 elm_genlist_item_bring_in(Elm_Object_Item *it)
4752 ELM_OBJ_ITEM_CHECK_OR_RETURN(it);
4753 Elm_Gen_Item *_it = (Elm_Gen_Item *) it;
4754 Evas_Coord gith = 0;
4755 if (_it->generation < _it->wd->generation) return;
4756 if ((_it->item->queued) || (!_it->item->mincalcd))
4758 _it->wd->show_item = _it;
4759 _it->wd->bring_in = EINA_TRUE;
4760 _it->wd->scrollto_type = ELM_GENLIST_ITEM_SCROLLTO_IN;
4761 _it->item->showme = EINA_TRUE;
4764 if (_it->wd->show_item)
4766 _it->wd->show_item->item->showme = EINA_FALSE;
4767 _it->wd->show_item = NULL;
4769 if ((_it->item->group_item) &&
4770 (_it->wd->pan_y > (_it->y + _it->item->block->y)))
4771 gith = _it->item->group_item->item->h;
4772 elm_smart_scroller_region_bring_in(_it->wd->scr,
4773 _it->x + _it->item->block->x,
4774 _it->y + _it->item->block->y - gith,
4775 _it->item->block->w, _it->item->h);
4779 elm_genlist_item_top_show(Elm_Object_Item *it)
4781 ELM_OBJ_ITEM_CHECK_OR_RETURN(it);
4782 Elm_Gen_Item *_it = (Elm_Gen_Item *) it;
4784 Evas_Coord gith = 0;
4786 if (_it->generation < _it->wd->generation) return;
4787 if ((_it->item->queued) || (!_it->item->mincalcd))
4789 _it->wd->show_item = _it;
4790 _it->wd->bring_in = EINA_FALSE;
4791 _it->wd->scrollto_type = ELM_GENLIST_ITEM_SCROLLTO_TOP;
4792 _it->item->showme = EINA_TRUE;
4795 if (_it->wd->show_item)
4797 _it->wd->show_item->item->showme = EINA_FALSE;
4798 _it->wd->show_item = NULL;
4800 evas_object_geometry_get(_it->wd->pan_smart, NULL, NULL, &ow, &oh);
4801 if (_it->item->group_item) gith = _it->item->group_item->item->h;
4802 elm_smart_scroller_child_region_show(_it->wd->scr,
4803 _it->x + _it->item->block->x,
4804 _it->y + _it->item->block->y - gith,
4805 _it->item->block->w, oh);
4809 elm_genlist_item_top_bring_in(Elm_Object_Item *it)
4811 ELM_OBJ_ITEM_CHECK_OR_RETURN(it);
4812 Elm_Gen_Item *_it = (Elm_Gen_Item *) it;
4814 Evas_Coord gith = 0;
4816 if (_it->generation < _it->wd->generation) return;
4817 if ((_it->item->queued) || (!_it->item->mincalcd))
4819 _it->wd->show_item = _it;
4820 _it->wd->bring_in = EINA_TRUE;
4821 _it->wd->scrollto_type = ELM_GENLIST_ITEM_SCROLLTO_TOP;
4822 _it->item->showme = EINA_TRUE;
4825 if (_it->wd->show_item)
4827 _it->wd->show_item->item->showme = EINA_FALSE;
4828 _it->wd->show_item = NULL;
4830 evas_object_geometry_get(_it->wd->pan_smart, NULL, NULL, &ow, &oh);
4831 if (_it->item->group_item) gith = _it->item->group_item->item->h;
4832 elm_smart_scroller_region_bring_in(_it->wd->scr,
4833 _it->x + _it->item->block->x,
4834 _it->y + _it->item->block->y - gith,
4835 _it->item->block->w, oh);
4839 elm_genlist_item_middle_show(Elm_Object_Item *it)
4841 ELM_OBJ_ITEM_CHECK_OR_RETURN(it);
4842 Elm_Gen_Item *_it = (Elm_Gen_Item *) it;
4845 if (_it->generation < _it->wd->generation) return;
4846 if ((_it->item->queued) || (!_it->item->mincalcd))
4848 _it->wd->show_item = _it;
4849 _it->wd->bring_in = EINA_FALSE;
4850 _it->wd->scrollto_type = ELM_GENLIST_ITEM_SCROLLTO_MIDDLE;
4851 _it->item->showme = EINA_TRUE;
4854 if (_it->wd->show_item)
4856 _it->wd->show_item->item->showme = EINA_FALSE;
4857 _it->wd->show_item = NULL;
4859 evas_object_geometry_get(_it->wd->pan_smart, NULL, NULL, &ow, &oh);
4860 elm_smart_scroller_child_region_show(_it->wd->scr,
4861 _it->x + _it->item->block->x,
4862 _it->y + _it->item->block->y - oh / 2 +
4863 _it->item->h / 2, _it->item->block->w,
4868 elm_genlist_item_middle_bring_in(Elm_Object_Item *it)
4870 ELM_OBJ_ITEM_CHECK_OR_RETURN(it);
4871 Elm_Gen_Item *_it = (Elm_Gen_Item *) it;
4874 if (_it->generation < _it->wd->generation) return;
4875 if ((_it->item->queued) || (!_it->item->mincalcd))
4877 _it->wd->show_item = _it;
4878 _it->wd->bring_in = EINA_TRUE;
4879 _it->wd->scrollto_type = ELM_GENLIST_ITEM_SCROLLTO_MIDDLE;
4880 _it->item->showme = EINA_TRUE;
4883 if (_it->wd->show_item)
4885 _it->wd->show_item->item->showme = EINA_FALSE;
4886 _it->wd->show_item = NULL;
4888 evas_object_geometry_get(_it->wd->pan_smart, NULL, NULL, &ow, &oh);
4889 elm_smart_scroller_region_bring_in(_it->wd->scr,
4890 _it->x + _it->item->block->x,
4891 _it->y + _it->item->block->y - oh / 2 +
4892 _it->item->h / 2, _it->item->block->w,
4897 elm_genlist_item_del(Elm_Object_Item *it)
4899 elm_object_item_del(it);
4903 elm_genlist_item_data_set(Elm_Object_Item *it,
4906 elm_object_item_data_set(it, (void *) data);
4910 elm_genlist_item_data_get(const Elm_Object_Item *it)
4912 return elm_object_item_data_get(it);
4916 elm_genlist_item_icons_orphan(Elm_Object_Item *it)
4918 elm_genlist_item_contents_orphan(it);
4922 elm_genlist_item_contents_orphan(Elm_Object_Item *it)
4924 ELM_OBJ_ITEM_CHECK_OR_RETURN(it);
4926 Evas_Object *content;
4927 EINA_LIST_FREE(((Elm_Gen_Item *) it)->content_objs, content)
4929 elm_widget_sub_object_del(WIDGET(it), content);
4930 evas_object_smart_member_del(content);
4931 evas_object_hide(content);
4935 EAPI const Evas_Object *
4936 elm_genlist_item_object_get(const Elm_Object_Item *it)
4938 ELM_OBJ_ITEM_CHECK_OR_RETURN(it, NULL);
4943 elm_genlist_item_update(Elm_Object_Item *it)
4945 ELM_OBJ_ITEM_CHECK_OR_RETURN(it);
4946 Elm_Gen_Item *_it = (Elm_Gen_Item *) it;
4948 if (!_it->item->block) return;
4949 if (_it->generation < _it->wd->generation) return;
4950 _it->item->mincalcd = EINA_FALSE;
4951 _it->item->updateme = EINA_TRUE;
4952 _it->item->block->updateme = EINA_TRUE;
4953 if (_it->wd->update_job) ecore_job_del(_it->wd->update_job);
4954 _it->wd->update_job = ecore_job_add(_update_job, _it->wd);
4958 elm_genlist_item_fields_update(Elm_Object_Item *it,
4960 Elm_Genlist_Item_Field_Flags itf)
4962 ELM_OBJ_ITEM_CHECK_OR_RETURN(it);
4963 Elm_Gen_Item *_it = (Elm_Gen_Item *) it;
4965 if (!_it->item->block) return;
4966 if (_it->generation < _it->wd->generation) return;
4968 if ((!itf) || (itf & ELM_GENLIST_ITEM_FIELD_LABEL))
4969 _item_text_realize(_it, VIEW(_it), &_it->texts, parts);
4970 if ((!itf) || (itf & ELM_GENLIST_ITEM_FIELD_CONTENT))
4972 _it->content_objs = _item_content_unrealize(_it, VIEW(_it),
4973 &_it->contents, parts);
4974 _it->content_objs = _item_content_realize(_it, VIEW(_it),
4975 &_it->contents, parts);
4977 if ((!itf) || (itf & ELM_GENLIST_ITEM_FIELD_STATE))
4978 _item_state_realize(_it, VIEW(_it), &_it->states, parts);
4982 elm_genlist_item_item_class_update(Elm_Object_Item *it,
4983 const Elm_Genlist_Item_Class *itc)
4985 ELM_OBJ_ITEM_CHECK_OR_RETURN(it);
4986 Elm_Gen_Item *_it = (Elm_Gen_Item *) it;
4988 if (!_it->item->block) return;
4989 EINA_SAFETY_ON_NULL_RETURN(itc);
4990 if (_it->generation < _it->wd->generation) return;
4992 _it->item->nocache = EINA_TRUE;
4993 elm_genlist_item_update(it);
4996 EAPI const Elm_Genlist_Item_Class *
4997 elm_genlist_item_item_class_get(const Elm_Object_Item *it)
4999 ELM_OBJ_ITEM_CHECK_OR_RETURN(it, NULL);
5000 Elm_Gen_Item *_it = (Elm_Gen_Item *) it;
5001 if (_it->generation < _it->wd->generation) return NULL;
5005 static Evas_Object *
5006 _elm_genlist_item_label_create(void *data,
5007 Evas_Object *obj __UNUSED__,
5008 Evas_Object *tooltip,
5009 void *it __UNUSED__)
5011 Evas_Object *label = elm_label_add(tooltip);
5014 elm_object_style_set(label, "tooltip");
5015 elm_object_text_set(label, data);
5020 _elm_genlist_item_label_del_cb(void *data,
5021 Evas_Object *obj __UNUSED__,
5022 void *event_info __UNUSED__)
5024 eina_stringshare_del(data);
5028 elm_genlist_item_tooltip_text_set(Elm_Object_Item *it,
5031 ELM_OBJ_ITEM_CHECK_OR_RETURN(it);
5032 text = eina_stringshare_add(text);
5033 elm_genlist_item_tooltip_content_cb_set(it, _elm_genlist_item_label_create,
5035 _elm_genlist_item_label_del_cb);
5039 elm_genlist_item_tooltip_content_cb_set(Elm_Object_Item *it,
5040 Elm_Tooltip_Item_Content_Cb func,
5042 Evas_Smart_Cb del_cb)
5044 ELM_OBJ_ITEM_CHECK_OR_GOTO(it, error);
5045 Elm_Gen_Item *_it = (Elm_Gen_Item *) it;
5047 if ((_it->tooltip.content_cb == func) && (_it->tooltip.data == data))
5050 if (_it->tooltip.del_cb)
5051 _it->tooltip.del_cb((void *) _it->tooltip.data, WIDGET(it), it);
5053 _it->tooltip.content_cb = func;
5054 _it->tooltip.data = data;
5055 _it->tooltip.del_cb = del_cb;
5059 elm_widget_item_tooltip_content_cb_set(_it,
5060 _it->tooltip.content_cb,
5061 _it->tooltip.data, NULL);
5062 elm_widget_item_tooltip_style_set(_it, _it->tooltip.style);
5063 elm_widget_item_tooltip_window_mode_set(_it, _it->tooltip.free_size);
5069 if (del_cb) del_cb((void *)data, NULL, NULL);
5073 elm_genlist_item_tooltip_unset(Elm_Object_Item *it)
5075 ELM_OBJ_ITEM_CHECK_OR_RETURN(it);
5076 Elm_Gen_Item *_it = (Elm_Gen_Item *) it;
5078 if ((VIEW(_it)) && (_it->tooltip.content_cb))
5079 elm_widget_item_tooltip_unset(_it);
5081 if (_it->tooltip.del_cb)
5082 _it->tooltip.del_cb((void *) _it->tooltip.data, WIDGET(_it), _it);
5083 _it->tooltip.del_cb = NULL;
5084 _it->tooltip.content_cb = NULL;
5085 _it->tooltip.data = NULL;
5086 _it->tooltip.free_size = EINA_FALSE;
5087 if (_it->tooltip.style)
5088 elm_genlist_item_tooltip_style_set(it, NULL);
5092 elm_genlist_item_tooltip_style_set(Elm_Object_Item *it,
5095 ELM_OBJ_ITEM_CHECK_OR_RETURN(it);
5096 Elm_Gen_Item *_it = (Elm_Gen_Item *) it;
5098 eina_stringshare_replace(&_it->tooltip.style, style);
5099 if (VIEW(_it)) elm_widget_item_tooltip_style_set(_it, style);
5103 elm_genlist_item_tooltip_style_get(const Elm_Object_Item *it)
5105 return elm_object_item_tooltip_style_get(it);
5109 elm_genlist_item_tooltip_window_mode_set(Elm_Object_Item *it,
5112 ELM_OBJ_ITEM_CHECK_OR_RETURN(it, EINA_FALSE);
5113 Elm_Gen_Item *_it = (Elm_Gen_Item *) it;
5115 _it->tooltip.free_size = disable;
5116 if (VIEW(_it)) return elm_widget_item_tooltip_window_mode_set(_it, disable);
5121 elm_genlist_item_tooltip_window_mode_get(const Elm_Object_Item *it)
5123 return elm_object_tooltip_window_mode_get(VIEW(it));
5127 elm_genlist_item_cursor_set(Elm_Object_Item *it,
5130 ELM_OBJ_ITEM_CHECK_OR_RETURN(it);
5131 Elm_Gen_Item *_it = (Elm_Gen_Item *) it;
5132 eina_stringshare_replace(&_it->mouse_cursor, cursor);
5133 if (VIEW(_it)) elm_widget_item_cursor_set(_it, cursor);
5137 elm_genlist_item_cursor_get(const Elm_Object_Item *it)
5139 return elm_widget_item_cursor_get(it);
5143 elm_genlist_item_cursor_unset(Elm_Object_Item *it)
5145 ELM_OBJ_ITEM_CHECK_OR_RETURN(it);
5146 Elm_Gen_Item *_it = (Elm_Gen_Item *) it;
5148 if (!_it->mouse_cursor) return;
5150 if (VIEW(_it)) elm_widget_item_cursor_unset(_it);
5152 eina_stringshare_del(_it->mouse_cursor);
5153 _it->mouse_cursor = NULL;
5157 elm_genlist_item_cursor_style_set(Elm_Object_Item *it,
5160 elm_widget_item_cursor_style_set(it, style);
5164 elm_genlist_item_cursor_style_get(const Elm_Object_Item *it)
5166 return elm_widget_item_cursor_style_get(it);
5170 elm_genlist_item_cursor_engine_only_set(Elm_Object_Item *it,
5171 Eina_Bool engine_only)
5173 elm_widget_item_cursor_engine_only_set(it, engine_only);
5177 elm_genlist_item_cursor_engine_only_get(const Elm_Object_Item *it)
5179 return elm_widget_item_cursor_engine_only_get(it);
5183 elm_genlist_item_index_get(Elm_Object_Item *it)
5185 ELM_OBJ_ITEM_CHECK_OR_RETURN(it, -1);
5186 Elm_Gen_Item *_it = (Elm_Gen_Item *) it;
5188 if (_it->item->block)
5189 return _it->position + _it->item->block->position;
5194 elm_genlist_mode_set(Evas_Object *obj,
5197 ELM_CHECK_WIDTYPE(obj, widtype);
5198 Widget_Data *wd = elm_widget_data_get(obj);
5200 if (wd->mode == mode) return;
5206 elm_genlist_horizontal_set(Evas_Object *obj,
5209 elm_genlist_mode_set(obj, mode);
5213 elm_genlist_horizontal_mode_set(Evas_Object *obj,
5216 elm_genlist_mode_set(obj, mode);
5220 elm_genlist_mode_get(const Evas_Object *obj)
5222 ELM_CHECK_WIDTYPE(obj, widtype) ELM_LIST_LAST;
5223 Widget_Data *wd = elm_widget_data_get(obj);
5224 if (!wd) return ELM_LIST_LAST;
5229 elm_genlist_horizontal_get(const Evas_Object *obj)
5231 return elm_genlist_mode_get(obj);
5235 elm_genlist_horizontal_mode_get(const Evas_Object *obj)
5237 return elm_genlist_mode_get(obj);
5241 elm_genlist_always_select_mode_set(Evas_Object *obj,
5242 Eina_Bool always_select)
5244 ELM_CHECK_WIDTYPE(obj, widtype);
5245 Widget_Data *wd = elm_widget_data_get(obj);
5247 wd->always_select = always_select;
5251 elm_genlist_always_select_mode_get(const Evas_Object *obj)
5253 ELM_CHECK_WIDTYPE(obj, widtype) EINA_FALSE;
5254 Widget_Data *wd = elm_widget_data_get(obj);
5255 if (!wd) return EINA_FALSE;
5256 return wd->always_select;
5260 elm_genlist_no_select_mode_set(Evas_Object *obj,
5261 Eina_Bool no_select)
5263 ELM_CHECK_WIDTYPE(obj, widtype);
5264 Widget_Data *wd = elm_widget_data_get(obj);
5266 wd->no_select = no_select;
5270 elm_genlist_no_select_mode_get(const Evas_Object *obj)
5272 ELM_CHECK_WIDTYPE(obj, widtype) EINA_FALSE;
5273 Widget_Data *wd = elm_widget_data_get(obj);
5274 if (!wd) return EINA_FALSE;
5275 return wd->no_select;
5279 elm_genlist_compress_mode_set(Evas_Object *obj,
5282 ELM_CHECK_WIDTYPE(obj, widtype);
5283 Widget_Data *wd = elm_widget_data_get(obj);
5285 wd->compress = compress;
5286 if (!compress) elm_genlist_homogeneous_set(obj, EINA_FALSE);
5290 elm_genlist_compress_mode_get(const Evas_Object *obj)
5292 ELM_CHECK_WIDTYPE(obj, widtype) EINA_FALSE;
5293 Widget_Data *wd = elm_widget_data_get(obj);
5294 if (!wd) return EINA_FALSE;
5295 return wd->compress;
5299 elm_genlist_height_for_width_mode_set(Evas_Object *obj,
5300 Eina_Bool height_for_width)
5302 ELM_CHECK_WIDTYPE(obj, widtype);
5303 Widget_Data *wd = elm_widget_data_get(obj);
5305 wd->height_for_width = !!height_for_width;
5306 if (wd->height_for_width)
5308 elm_genlist_homogeneous_set(obj, EINA_FALSE);
5309 elm_genlist_compress_mode_set(obj, EINA_TRUE);
5314 elm_genlist_height_for_width_mode_get(const Evas_Object *obj)
5316 ELM_CHECK_WIDTYPE(obj, widtype) EINA_FALSE;
5317 Widget_Data *wd = elm_widget_data_get(obj);
5318 if (!wd) return EINA_FALSE;
5319 return wd->height_for_width;
5323 elm_genlist_bounce_set(Evas_Object *obj,
5327 ELM_CHECK_WIDTYPE(obj, widtype);
5328 Widget_Data *wd = elm_widget_data_get(obj);
5330 elm_smart_scroller_bounce_allow_set(wd->scr, h_bounce, v_bounce);
5331 wd->h_bounce = h_bounce;
5332 wd->v_bounce = v_bounce;
5336 elm_genlist_bounce_get(const Evas_Object *obj,
5337 Eina_Bool *h_bounce,
5338 Eina_Bool *v_bounce)
5340 ELM_CHECK_WIDTYPE(obj, widtype);
5341 Widget_Data *wd = elm_widget_data_get(obj);
5343 if (h_bounce) *h_bounce = wd->h_bounce;
5344 if (v_bounce) *v_bounce = wd->v_bounce;
5348 elm_genlist_homogeneous_set(Evas_Object *obj,
5349 Eina_Bool homogeneous)
5351 ELM_CHECK_WIDTYPE(obj, widtype);
5352 Widget_Data *wd = elm_widget_data_get(obj);
5354 if (homogeneous) elm_genlist_compress_mode_set(obj, EINA_TRUE);
5355 wd->homogeneous = homogeneous;
5359 elm_genlist_homogeneous_get(const Evas_Object *obj)
5361 ELM_CHECK_WIDTYPE(obj, widtype) EINA_FALSE;
5362 Widget_Data *wd = elm_widget_data_get(obj);
5363 if (!wd) return EINA_FALSE;
5364 return wd->homogeneous;
5368 elm_genlist_block_count_set(Evas_Object *obj,
5371 ELM_CHECK_WIDTYPE(obj, widtype);
5372 Widget_Data *wd = elm_widget_data_get(obj);
5374 wd->max_items_per_block = n;
5375 wd->item_cache_max = wd->max_items_per_block * 2;
5376 _item_cache_clean(wd);
5380 elm_genlist_block_count_get(const Evas_Object *obj)
5382 ELM_CHECK_WIDTYPE(obj, widtype) 0;
5383 Widget_Data *wd = elm_widget_data_get(obj);
5385 return wd->max_items_per_block;
5389 elm_genlist_longpress_timeout_set(Evas_Object *obj,
5392 ELM_CHECK_WIDTYPE(obj, widtype);
5393 Widget_Data *wd = elm_widget_data_get(obj);
5395 wd->longpress_timeout = timeout;
5399 elm_genlist_longpress_timeout_get(const Evas_Object *obj)
5401 ELM_CHECK_WIDTYPE(obj, widtype) 0;
5402 Widget_Data *wd = elm_widget_data_get(obj);
5404 return wd->longpress_timeout;
5408 elm_genlist_scroller_policy_set(Evas_Object *obj,
5409 Elm_Scroller_Policy policy_h,
5410 Elm_Scroller_Policy policy_v)
5412 ELM_CHECK_WIDTYPE(obj, widtype);
5413 Widget_Data *wd = elm_widget_data_get(obj);
5414 if ((!wd) || (!wd->scr)) return;
5415 if ((policy_h >= ELM_SCROLLER_POLICY_LAST) ||
5416 (policy_v >= ELM_SCROLLER_POLICY_LAST))
5418 elm_smart_scroller_policy_set(wd->scr, policy_h, policy_v);
5422 elm_genlist_scroller_policy_get(const Evas_Object *obj,
5423 Elm_Scroller_Policy *policy_h,
5424 Elm_Scroller_Policy *policy_v)
5426 ELM_CHECK_WIDTYPE(obj, widtype);
5427 Widget_Data *wd = elm_widget_data_get(obj);
5428 Elm_Smart_Scroller_Policy s_policy_h, s_policy_v;
5429 if ((!wd) || (!wd->scr)) return;
5430 elm_smart_scroller_policy_get(wd->scr, &s_policy_h, &s_policy_v);
5431 if (policy_h) *policy_h = (Elm_Scroller_Policy)s_policy_h;
5432 if (policy_v) *policy_v = (Elm_Scroller_Policy)s_policy_v;
5436 elm_genlist_realized_items_update(Evas_Object *obj)
5438 ELM_CHECK_WIDTYPE(obj, widtype);
5440 Eina_List *list, *l;
5441 Elm_Object_Item *it;
5443 list = elm_genlist_realized_items_get(obj);
5444 EINA_LIST_FOREACH(list, l, it)
5445 elm_genlist_item_update(it);
5449 elm_genlist_item_mode_set(Elm_Object_Item *it,
5450 const char *mode_type,
5453 ELM_OBJ_ITEM_CHECK_OR_RETURN(it);
5454 Elm_Gen_Item *_it = (Elm_Gen_Item *) it;
5456 Widget_Data *wd = _it->wd;
5458 Elm_Object_Item *it2;
5461 if (!mode_type) return;
5462 if ((_it->generation < _it->wd->generation) ||
5463 elm_widget_item_disabled_get(_it)) return;
5464 if (wd->edit_mode) return;
5466 if ((wd->mode_item == _it) &&
5467 (!strcmp(mode_type, wd->mode_type)) &&
5470 if (!_it->itc->mode_item_style) return;
5471 _it->mode_set = mode_set;
5475 EINA_LIST_FOREACH(wd->selected, l, it2)
5476 if (((Elm_Gen_Item *) it2)->realized)
5477 elm_genlist_item_selected_set(it2, EINA_FALSE);
5481 it2 = elm_genlist_selected_item_get(wd->obj);
5482 if ((it2) && (((Elm_Gen_Item *) it2)->realized))
5483 elm_genlist_item_selected_set(it2, EINA_FALSE);
5486 if (((wd->mode_type) && (strcmp(mode_type, wd->mode_type))) ||
5488 ((_it == wd->mode_item) && (!mode_set)))
5489 _item_mode_unset(wd);
5491 eina_stringshare_replace(&wd->mode_type, mode_type);
5492 if (mode_set) _item_mode_set(_it);
5496 elm_genlist_mode_item_style_get(const Evas_Object *obj)
5498 ELM_CHECK_WIDTYPE(obj, widtype) NULL;
5499 Widget_Data *wd = elm_widget_data_get(obj);
5500 if (!wd) return NULL;
5501 return wd->mode_item->itc->mode_item_style;
5505 elm_genlist_mode_item_style_set(Evas_Object *obj, const char *style)
5507 ELM_CHECK_WIDTYPE(obj, widtype);
5508 Widget_Data *wd = elm_widget_data_get(obj);
5510 if ((style == wd->mode_item->itc->mode_item_style) ||
5511 (style && wd->mode_item->itc->mode_item_style &&
5512 (!strcmp(style, wd->mode_item->itc->mode_item_style))))
5514 eina_stringshare_replace((const char**)&wd->mode_item->itc->mode_item_style, style);
5515 elm_genlist_realized_items_update(obj);
5519 elm_genlist_mode_type_get(const Evas_Object *obj)
5521 ELM_CHECK_WIDTYPE(obj, widtype) NULL;
5522 Widget_Data *wd = elm_widget_data_get(obj);
5523 if (!wd) return NULL;
5524 return wd->mode_type;
5527 EAPI const Elm_Object_Item *
5528 elm_genlist_mode_item_get(const Evas_Object *obj)
5530 ELM_CHECK_WIDTYPE(obj, widtype) NULL;
5531 Widget_Data *wd = elm_widget_data_get(obj);
5532 if (!wd) return NULL;
5533 return (Elm_Object_Item *) wd->mode_item;
5537 elm_genlist_edit_mode_get(const Evas_Object *obj)
5539 ELM_CHECK_WIDTYPE(obj, widtype) EINA_FALSE;
5540 Widget_Data *wd = elm_widget_data_get(obj);
5541 if (!wd) return EINA_FALSE;
5543 return wd->edit_mode;
5547 elm_genlist_edit_mode_set(Evas_Object *obj, Eina_Bool edit_mode)
5549 ELM_CHECK_WIDTYPE(obj, widtype);
5550 Eina_List *list, *l;
5553 Widget_Data *wd = elm_widget_data_get(obj);
5555 if (wd->edit_mode == edit_mode) return;
5557 wd->edit_mode = !!edit_mode;
5558 list = elm_genlist_realized_items_get(obj);
5561 EINA_LIST_FOREACH(list, l, it)
5563 if (it->item->flags != ELM_GENLIST_ITEM_GROUP)
5564 _edit_mode_item_unrealize(it);
5566 _item_cache_zero(wd);
5570 EINA_LIST_FOREACH(list, l, it)
5572 if (it->item->flags != ELM_GENLIST_ITEM_GROUP)
5574 if (it->selected) _item_unselect(it);
5575 if (it->itc->edit_item_style)
5576 _edit_mode_item_realize(it, EINA_TRUE);
5580 if (wd->calc_job) ecore_job_del(wd->calc_job);
5581 wd->calc_job = ecore_job_add(_calc_job, wd);
5585 elm_genlist_reorder_mode_set(Evas_Object *obj,
5586 Eina_Bool reorder_mode)
5588 ELM_CHECK_WIDTYPE(obj, widtype);
5589 Widget_Data *wd = elm_widget_data_get(obj);
5591 wd->reorder_mode = reorder_mode;
5595 elm_genlist_reorder_mode_get(const Evas_Object *obj)
5597 ELM_CHECK_WIDTYPE(obj, widtype) EINA_FALSE;
5598 Widget_Data *wd = elm_widget_data_get(obj);
5599 if (!wd) return EINA_FALSE;
5600 return wd->reorder_mode;
5603 EAPI Elm_Genlist_Item_Flags
5604 elm_genlist_item_flags_get(const Elm_Object_Item *it)
5606 ELM_OBJ_ITEM_CHECK_OR_RETURN(it, ELM_GENLIST_ITEM_MAX);
5607 Elm_Gen_Item *_it = (Elm_Gen_Item *) it;
5608 return _it->item->flags;
5611 EAPI Elm_Genlist_Item_Class *
5612 elm_genlist_item_class_new(void)
5614 Elm_Genlist_Item_Class *itc;
5616 itc = calloc(1, sizeof(Elm_Genlist_Item_Class));
5619 itc->version = ELM_GENLIST_ITEM_CLASS_VERSION;
5621 itc->delete_me = EINA_FALSE;
5627 elm_genlist_item_class_free(Elm_Genlist_Item_Class *itc)
5629 if (itc && (itc->version == ELM_GENLIST_ITEM_CLASS_VERSION))
5631 if (!itc->delete_me) itc->delete_me = EINA_TRUE;
5632 if (itc->refcount > 0) elm_genlist_item_class_unref(itc);
5642 elm_genlist_item_class_ref(Elm_Genlist_Item_Class *itc)
5644 if (itc && (itc->version == ELM_GENLIST_ITEM_CLASS_VERSION))
5647 if (itc->refcount == 0) itc->refcount--;
5652 elm_genlist_item_class_unref(Elm_Genlist_Item_Class *itc)
5654 if (itc && (itc->version == ELM_GENLIST_ITEM_CLASS_VERSION))
5656 if (itc->refcount > 0) itc->refcount--;
5657 if (itc->delete_me && (!itc->refcount))
5658 elm_genlist_item_class_free(itc);
5662 /* for gengrid as of now */
5664 _elm_genlist_page_relative_set(Evas_Object *obj,
5668 Evas_Coord pagesize_h;
5669 Evas_Coord pagesize_v;
5671 ELM_CHECK_WIDTYPE(obj, widtype);
5672 Widget_Data *wd = elm_widget_data_get(obj);
5675 elm_smart_scroller_paging_get(wd->scr, NULL, NULL, &pagesize_h, &pagesize_v);
5676 elm_smart_scroller_paging_set(wd->scr, h_pagerel, v_pagerel, pagesize_h,
5680 /* for gengrid as of now */
5682 _elm_genlist_page_relative_get(const Evas_Object *obj,
5686 ELM_CHECK_WIDTYPE(obj, widtype);
5687 Widget_Data *wd = elm_widget_data_get(obj);
5690 elm_smart_scroller_paging_get(wd->scr, h_pagerel, v_pagerel, NULL, NULL);
5693 /* for gengrid as of now */
5695 _elm_genlist_page_size_set(Evas_Object *obj,
5696 Evas_Coord h_pagesize,
5697 Evas_Coord v_pagesize)
5702 ELM_CHECK_WIDTYPE(obj, widtype);
5703 Widget_Data *wd = elm_widget_data_get(obj);
5705 elm_smart_scroller_paging_get(wd->scr, &pagerel_h, &pagerel_v, NULL, NULL);
5706 elm_smart_scroller_paging_set(wd->scr, pagerel_h, pagerel_v, h_pagesize,
5710 /* for gengrid as of now */
5712 _elm_genlist_current_page_get(const Evas_Object *obj,
5716 ELM_CHECK_WIDTYPE(obj, widtype);
5717 Widget_Data *wd = elm_widget_data_get(obj);
5720 elm_smart_scroller_current_page_get(wd->scr, h_pagenumber, v_pagenumber);
5723 /* for gengrid as of now */
5725 _elm_genlist_last_page_get(const Evas_Object *obj,
5729 ELM_CHECK_WIDTYPE(obj, widtype);
5730 Widget_Data *wd = elm_widget_data_get(obj);
5733 elm_smart_scroller_last_page_get(wd->scr, h_pagenumber, v_pagenumber);
5736 /* for gengrid as of now */
5738 _elm_genlist_page_show(const Evas_Object *obj,
5742 ELM_CHECK_WIDTYPE(obj, widtype);
5743 Widget_Data *wd = elm_widget_data_get(obj);
5746 elm_smart_scroller_page_show(wd->scr, h_pagenumber, v_pagenumber);
5749 /* for gengrid as of now */
5751 _elm_genlist_page_bring_in(const Evas_Object *obj,
5755 ELM_CHECK_WIDTYPE(obj, widtype);
5756 Widget_Data *wd = elm_widget_data_get(obj);
5759 elm_smart_scroller_page_bring_in(wd->scr, h_pagenumber, v_pagenumber);
5763 _elm_genlist_item_unrealize(Elm_Gen_Item *it,
5766 Evas_Object *content;
5768 if (!it->realized) return;
5769 if (it->wd->reorder_it == it) return;
5771 evas_event_freeze(evas_object_evas_get(WIDGET(it)));
5773 evas_object_smart_callback_call(WIDGET(it), SIG_UNREALIZED, it);
5776 ecore_timer_del(it->long_timer);
5777 it->long_timer = NULL;
5780 elm_widget_stringlist_free(it->texts);
5782 elm_widget_stringlist_free(it->contents);
5783 it->contents = NULL;
5784 elm_widget_stringlist_free(it->states);
5787 EINA_LIST_FREE(it->content_objs, content)
5788 evas_object_del(content);
5790 it->unrealize_cb(it);
5792 it->realized = EINA_FALSE;
5793 it->want_unrealize = EINA_FALSE;
5794 evas_event_thaw(evas_object_evas_get(WIDGET(it)));
5795 evas_event_thaw_eval(evas_object_evas_get(WIDGET(it)));
5799 _elm_genlist_item_del_notserious(Elm_Gen_Item *it)
5801 elm_widget_item_pre_notify_del(it);
5802 it->generation = it->wd->generation - 1; /* This means that the item is deleted */
5803 if (it->selected) it->wd->selected = eina_list_remove(it->wd->selected, it);
5805 if (it->itc->func.del)
5806 it->itc->func.del((void *)it->base.data, WIDGET(it));
5810 _elm_genlist_item_del_serious(Elm_Gen_Item *it)
5812 _elm_genlist_item_del_notserious(it);
5813 it->wd->items = eina_inlist_remove(it->wd->items, EINA_INLIST_GET(it));
5814 if (it->tooltip.del_cb)
5815 it->tooltip.del_cb((void *)it->tooltip.data, WIDGET(it), it);
5816 it->wd->walking -= it->walking;
5817 if (it->long_timer) ecore_timer_del(it->long_timer);
5819 it->wd->group_items = eina_list_remove(it->wd->group_items, it);
5823 eina_inlist_sorted_state_free(it->wd->state);
5824 it->wd->state = NULL;
5826 if (it->wd->calc_job) ecore_job_del(it->wd->calc_job);
5827 it->wd->calc_job = ecore_job_add(it->wd->calc_cb, it->wd);
5831 if (it->wd->last_selected_item == (Elm_Object_Item *) it)
5832 it->wd->last_selected_item = NULL;
5833 it->wd->item_count--;