3 #include <Elementary.h>
4 #include <Elementary_Cursor.h>
6 #include "els_scroller.h"
7 #include "elm_gen_common.h"
9 // internally allocated
10 #define CLASS_ALLOCATED 0x3a70f11f
12 #define MAX_ITEMS_PER_BLOCK 32
13 #define REORDER_EFFECT_TIME 0.5
15 #define ELM_GEN_SETUP(wd) \
16 (wd)->calc_cb = (Ecore_Cb)_calc_job; \
17 (wd)->clear_cb = (Ecore_Cb)_clear_cb; \
18 (wd)->sizing_cb = (Ecore_Cb)_sizing_eval
20 #define ELM_GEN_ITEM_SETUP(it) \
21 (it)->del_cb = (Ecore_Cb)_item_del; \
22 (it)->highlight_cb = (Ecore_Cb)_item_highlight; \
23 (it)->unsel_cb = (Ecore_Cb)_item_unselect; \
24 (it)->unhighlight_cb = (Ecore_Cb)_item_unhighlight; \
25 (it)->unrealize_cb = (Ecore_Cb)_item_unrealize_cb
27 #define ELM_GENLIST_CHECK_ITC_VER(itc) \
32 ERR("Genlist_Item_Class(itc) is NULL"); \
35 if ((itc->version != ELM_GENLIST_ITEM_CLASS_VERSION) && \
36 (itc->version != CLASS_ALLOCATED)) \
38 ERR("Genlist_Item_Class version mismatched! current = (%d), required = (%d) or (%d)", itc->version, ELM_GENLIST_ITEM_CLASS_VERSION, CLASS_ALLOCATED); \
44 typedef struct _Item_Block Item_Block;
45 typedef struct _Item_Cache Item_Cache;
47 struct Elm_Gen_Item_Type
52 Evas_Coord w, h, minw, minh;
53 Elm_Gen_Item *group_item;
54 Elm_Genlist_Item_Type type;
55 Eina_List *mode_texts, *mode_contents, *mode_states, *mode_content_objs;
56 Eina_List *edit_texts, *edit_contents, *edit_states, *edit_content_objs;
57 Ecore_Timer *swipe_timer;
58 Evas_Coord scrl_x, scrl_y, old_scrl_y;
61 Evas_Object *mode_view;
67 Eina_Bool want_realize : 1;
68 Eina_Bool expanded : 1;
69 Eina_Bool mincalcd : 1;
72 Eina_Bool updateme : 1;
73 Eina_Bool nocache : 1; /* do not use cache for this item */
74 Eina_Bool nocache_once : 1; /* do not use cache for this item only once */
75 Eina_Bool stacking_even : 1;
76 Eina_Bool nostacking : 1;
77 Eina_Bool move_effect_enabled : 1;
78 Eina_Bool decorate_mode_item_realized : 1;
79 Eina_Bool tree_effect_finished : 1; /* tree effect */
90 Evas_Coord x, y, w, h, minw, minh;
92 int item_position_stamp;
94 Eina_Bool position_update : 1;
95 Eina_Bool want_unrealize : 1;
96 Eina_Bool realized : 1;
97 Eina_Bool changed : 1;
98 Eina_Bool updateme : 1;
99 Eina_Bool changeme : 1;
100 Eina_Bool showme : 1;
101 Eina_Bool must_recalc : 1;
108 Evas_Object *base_view, *spacer;
110 const char *item_style; // it->itc->item_style
111 Eina_Bool tree : 1; // it->group
113 Eina_Bool selected : 1; // it->selected
114 Eina_Bool disabled : 1; // it->disabled
115 Eina_Bool expanded : 1; // it->item->expanded
118 static const char *widtype = NULL;
119 static void _item_cache_zero(Widget_Data *wd);
120 static void _del_hook(Evas_Object *obj);
121 static void _mirrored_set(Evas_Object *obj,
123 static void _theme_hook(Evas_Object *obj);
124 static void _show_region_hook(void *data,
126 static void _sizing_eval(Evas_Object *obj);
127 static void _item_realize(Elm_Gen_Item *it,
130 static void _item_unrealize_cb(Elm_Gen_Item *it);
131 static void _item_block_unrealize(Item_Block *itb);
132 static void _calc_job(void *data);
133 static void _on_focus_hook(void *data,
135 static void _changed_size_hints(void *data, Evas *e, Evas_Object *obj, void *event_info);
136 static void _changed_job(void *data);
137 static Eina_Bool _item_multi_select_up(Widget_Data *wd);
138 static Eina_Bool _item_multi_select_down(Widget_Data *wd);
139 static Eina_Bool _item_single_select_up(Widget_Data *wd);
140 static Eina_Bool _item_single_select_down(Widget_Data *wd);
141 static Eina_Bool _event_hook(Evas_Object *obj,
143 Evas_Callback_Type type,
145 static void _signal_emit_hook(Evas_Object *obj,
146 const char *emission,
148 static Eina_Bool _deselect_all_items(Widget_Data *wd);
149 static void _pan_calculate(Evas_Object *obj);
150 static void _pan_max_get(Evas_Object *obj,
153 static void _item_position(Elm_Gen_Item *it,
157 static void _mode_item_realize(Elm_Gen_Item *it);
158 static void _mode_item_unrealize(Elm_Gen_Item *it);
159 static void _item_mode_set(Elm_Gen_Item *it);
160 static void _item_mode_unset(Widget_Data *wd);
161 static void _decorate_mode_item_position(Elm_Gen_Item *it, int itx, int ity);
162 static void _decorate_mode_item_realize(Elm_Gen_Item *it, Eina_Bool effect_on);
163 static void _decorate_mode_item_unrealize(Elm_Gen_Item *it);
164 static void _group_items_recalc(void *data);
165 static void _item_move_after(Elm_Gen_Item *it,
166 Elm_Gen_Item *after);
167 static void _item_move_before(Elm_Gen_Item *it,
168 Elm_Gen_Item *before);
169 static void _item_auto_scroll(Widget_Data *wd);
170 static void _elm_genlist_clear(Evas_Object *obj,
172 static void _pan_child_size_get(Evas_Object *obj,
175 static Evas_Object* _create_tray_alpha_bg(const Evas_Object *obj);
176 static void _item_contract_emit(Elm_Gen_Item *it);
177 static int _item_tree_effect_before(Elm_Gen_Item *it);
178 static void _item_tree_effect(Widget_Data *wd, int y);
179 static void _item_tree_effect_finish(Widget_Data *wd);
180 static Eina_Bool _item_moving_effect_timer_cb(void *data);
182 static Evas_Smart_Class _pan_sc = EVAS_SMART_CLASS_INIT_VERSION;
184 static const char SIG_ACTIVATED[] = "activated";
185 static const char SIG_CLICKED_DOUBLE[] = "clicked,double";
186 static const char SIG_SELECTED[] = "selected";
187 static const char SIG_UNSELECTED[] = "unselected";
188 static const char SIG_EXPANDED[] = "expanded";
189 static const char SIG_CONTRACTED[] = "contracted";
190 static const char SIG_EXPAND_REQUEST[] = "expand,request";
191 static const char SIG_CONTRACT_REQUEST[] = "contract,request";
192 static const char SIG_REALIZED[] = "realized";
193 static const char SIG_UNREALIZED[] = "unrealized";
194 static const char SIG_DRAG_START_UP[] = "drag,start,up";
195 static const char SIG_DRAG_START_DOWN[] = "drag,start,down";
196 static const char SIG_DRAG_START_LEFT[] = "drag,start,left";
197 static const char SIG_DRAG_START_RIGHT[] = "drag,start,right";
198 static const char SIG_DRAG_STOP[] = "drag,stop";
199 static const char SIG_DRAG[] = "drag";
200 static const char SIG_LONGPRESSED[] = "longpressed";
201 static const char SIG_SCROLL_ANIM_START[] = "scroll,anim,start";
202 static const char SIG_SCROLL_ANIM_STOP[] = "scroll,anim,stop";
203 static const char SIG_SCROLL_DRAG_START[] = "scroll,drag,start";
204 static const char SIG_SCROLL_DRAG_STOP[] = "scroll,drag,stop";
205 static const char SIG_EDGE_TOP[] = "edge,top";
206 static const char SIG_EDGE_BOTTOM[] = "edge,bottom";
207 static const char SIG_EDGE_LEFT[] = "edge,left";
208 static const char SIG_EDGE_RIGHT[] = "edge,right";
209 static const char SIG_MULTI_SWIPE_LEFT[] = "multi,swipe,left";
210 static const char SIG_MULTI_SWIPE_RIGHT[] = "multi,swipe,right";
211 static const char SIG_MULTI_SWIPE_UP[] = "multi,swipe,up";
212 static const char SIG_MULTI_SWIPE_DOWN[] = "multi,swipe,down";
213 static const char SIG_MULTI_PINCH_OUT[] = "multi,pinch,out";
214 static const char SIG_MULTI_PINCH_IN[] = "multi,pinch,in";
215 static const char SIG_SWIPE[] = "swipe";
216 static const char SIG_MOVED[] = "moved";
217 static const char SIG_INDEX_UPDATE[] = "index,update";
218 static const char SIG_TREE_EFFECT_FINISHED [] = "tree,effect,finished";
220 static const Evas_Smart_Cb_Description _signals[] = {
221 {SIG_CLICKED_DOUBLE, ""},
224 {SIG_UNSELECTED, ""},
226 {SIG_CONTRACTED, ""},
227 {SIG_EXPAND_REQUEST, ""},
228 {SIG_CONTRACT_REQUEST, ""},
230 {SIG_UNREALIZED, ""},
231 {SIG_DRAG_START_UP, ""},
232 {SIG_DRAG_START_DOWN, ""},
233 {SIG_DRAG_START_LEFT, ""},
234 {SIG_DRAG_START_RIGHT, ""},
237 {SIG_LONGPRESSED, ""},
238 {SIG_SCROLL_ANIM_START, ""},
239 {SIG_SCROLL_ANIM_STOP, ""},
240 {SIG_SCROLL_DRAG_START, ""},
241 {SIG_SCROLL_DRAG_STOP, ""},
243 {SIG_EDGE_BOTTOM, ""},
245 {SIG_EDGE_RIGHT, ""},
246 {SIG_MULTI_SWIPE_LEFT, ""},
247 {SIG_MULTI_SWIPE_RIGHT, ""},
248 {SIG_MULTI_SWIPE_UP, ""},
249 {SIG_MULTI_SWIPE_DOWN, ""},
250 {SIG_MULTI_PINCH_OUT, ""},
251 {SIG_MULTI_PINCH_IN, ""},
254 {SIG_TREE_EFFECT_FINISHED, ""},
259 #undef ELM_CHECK_WIDTYPE
260 #define ELM_CHECK_WIDTYPE(obj, widtype) \
261 if ((!obj) || (!elm_genlist_type_check((obj), __func__))) return
262 #undef ELM_WIDGET_ITEM_WIDTYPE_CHECK_OR_RETURN
263 #define ELM_WIDGET_ITEM_WIDTYPE_CHECK_OR_RETURN(it, ...) \
264 ELM_WIDGET_ITEM_CHECK_OR_RETURN((Elm_Widget_Item *)it, __VA_ARGS__); \
265 ELM_CHECK_WIDTYPE(WIDGET((it)), widtype) __VA_ARGS__;
267 static const char *_gengrid = NULL;
268 static const char *_genlist = NULL;
270 /* THIS FUNCTION IS HACKY AND TEMPORARY!!! */
272 elm_genlist_type_check(const Evas_Object *obj,
275 const char *provided, *expected = "(unknown)";
276 static int abort_on_warn = -1;
277 provided = elm_widget_type_get(obj);
278 if (!_genlist) _genlist = eina_stringshare_add("genlist");
279 if (!_gengrid) _gengrid = eina_stringshare_add("gengrid");
280 if (EINA_LIKELY(provided == _genlist) || EINA_LIKELY(provided == _gengrid))
282 if ((!provided) || (!provided[0]))
284 provided = evas_object_type_get(obj);
285 if ((!provided) || (!provided[0]))
286 provided = "(unknown)";
288 ERR("Passing Object: %p in function: %s, of type: '%s' when expecting type: '%s'", obj, func, provided, expected);
289 if (abort_on_warn == -1)
291 if (getenv("ELM_ERROR_ABORT")) abort_on_warn = 1;
292 else abort_on_warn = 0;
294 if (abort_on_warn == 1) abort();
299 _event_hook(Evas_Object *obj,
300 Evas_Object *src __UNUSED__,
301 Evas_Callback_Type type,
304 if (type != EVAS_CALLBACK_KEY_DOWN) return EINA_FALSE;
305 Evas_Event_Key_Down *ev = event_info;
306 Widget_Data *wd = elm_widget_data_get(obj);
307 Evas_Coord pan_max_x = 0, pan_max_y = 0;
308 if (!wd) return EINA_FALSE;
309 if (!wd->items) return EINA_FALSE;
310 if (ev->event_flags & EVAS_EVENT_FLAG_ON_HOLD) return EINA_FALSE;
311 if (elm_widget_disabled_get(obj)) return EINA_FALSE;
313 Elm_Object_Item *it = NULL;
316 Evas_Coord step_x = 0;
317 Evas_Coord step_y = 0;
320 Evas_Coord page_x = 0;
321 Evas_Coord page_y = 0;
323 elm_smart_scroller_child_pos_get(wd->scr, &x, &y);
324 elm_smart_scroller_step_size_get(wd->scr, &step_x, &step_y);
325 elm_smart_scroller_page_size_get(wd->scr, &page_x, &page_y);
326 elm_smart_scroller_child_viewport_size_get(wd->scr, &v_w, &v_h);
328 if ((!strcmp(ev->keyname, "Left")) || (!strcmp(ev->keyname, "KP_Left")))
332 else if ((!strcmp(ev->keyname, "Right")) || (!strcmp(ev->keyname, "KP_Right")))
336 else if ((!strcmp(ev->keyname, "Up")) || (!strcmp(ev->keyname, "KP_Up")))
338 if (((evas_key_modifier_is_set(ev->modifiers, "Shift")) &&
339 (_item_multi_select_up(wd)))
340 || (_item_single_select_up(wd)))
342 ev->event_flags |= EVAS_EVENT_FLAG_ON_HOLD;
348 else if ((!strcmp(ev->keyname, "Down")) || (!strcmp(ev->keyname, "KP_Down")))
350 if (((evas_key_modifier_is_set(ev->modifiers, "Shift")) &&
351 (_item_multi_select_down(wd)))
352 || (_item_single_select_down(wd)))
354 ev->event_flags |= EVAS_EVENT_FLAG_ON_HOLD;
360 else if ((!strcmp(ev->keyname, "Home")) || (!strcmp(ev->keyname, "KP_Home")))
362 it = elm_genlist_first_item_get(obj);
363 elm_genlist_item_bring_in(it, ELM_GENLIST_ITEM_SCROLLTO_IN);
364 elm_genlist_item_selected_set(it, EINA_TRUE);
365 ev->event_flags |= EVAS_EVENT_FLAG_ON_HOLD;
368 else if ((!strcmp(ev->keyname, "End")) || (!strcmp(ev->keyname, "KP_End")))
370 it = elm_genlist_last_item_get(obj);
371 elm_genlist_item_bring_in(it, ELM_GENLIST_ITEM_SCROLLTO_IN);
372 elm_genlist_item_selected_set(it, EINA_TRUE);
373 ev->event_flags |= EVAS_EVENT_FLAG_ON_HOLD;
376 else if ((!strcmp(ev->keyname, "Prior")) || (!strcmp(ev->keyname, "KP_Prior")))
379 y -= -(page_y * v_h) / 100;
383 else if ((!strcmp(ev->keyname, "Next")) || (!strcmp(ev->keyname, "KP_Next")))
386 y += -(page_y * v_h) / 100;
390 else if (!strcmp(ev->keyname, "Escape"))
392 if (!_deselect_all_items(wd)) return EINA_FALSE;
393 ev->event_flags |= EVAS_EVENT_FLAG_ON_HOLD;
396 else if (((!strcmp(ev->keyname, "Return")) ||
397 (!strcmp(ev->keyname, "KP_Enter")) ||
398 (!strcmp(ev->keyname, "space")))
399 && (!wd->multi) && (wd->selected))
401 it = elm_genlist_selected_item_get(obj);
402 elm_genlist_item_expanded_set(it,
403 !elm_genlist_item_expanded_get(it));
404 evas_object_smart_callback_call(WIDGET(it), SIG_ACTIVATED, it);
406 else return EINA_FALSE;
408 ev->event_flags |= EVAS_EVENT_FLAG_ON_HOLD;
409 _pan_max_get(wd->pan_smart, &pan_max_x, &pan_max_y);
411 if (x > pan_max_x) x = pan_max_x;
413 if (y > pan_max_y) y = pan_max_y;
414 elm_smart_scroller_child_pos_set(wd->scr, x, y);
419 _deselect_all_items(Widget_Data *wd)
421 if (!wd->selected) return EINA_FALSE;
423 elm_genlist_item_selected_set(wd->selected->data, EINA_FALSE);
429 _item_multi_select_up(Widget_Data *wd)
431 if (!wd->selected) return EINA_FALSE;
432 if (!wd->multi) return EINA_FALSE;
434 Elm_Object_Item *prev = elm_genlist_item_prev_get(wd->last_selected_item);
435 if (!prev) return EINA_TRUE;
437 if (elm_genlist_item_selected_get(prev))
439 elm_genlist_item_selected_set(wd->last_selected_item, EINA_FALSE);
440 wd->last_selected_item = prev;
441 elm_genlist_item_show(wd->last_selected_item, ELM_GENLIST_ITEM_SCROLLTO_IN);
445 elm_genlist_item_selected_set(prev, EINA_TRUE);
446 elm_genlist_item_show(prev, ELM_GENLIST_ITEM_SCROLLTO_IN);
452 _item_multi_select_down(Widget_Data *wd)
454 if (!wd->selected) return EINA_FALSE;
455 if (!wd->multi) return EINA_FALSE;
457 Elm_Object_Item *next;
458 next = elm_genlist_item_next_get(wd->last_selected_item);
459 if (!next) return EINA_TRUE;
461 if (elm_genlist_item_selected_get(next))
463 elm_genlist_item_selected_set(wd->last_selected_item, EINA_FALSE);
464 wd->last_selected_item = next;
465 elm_genlist_item_show(wd->last_selected_item, ELM_GENLIST_ITEM_SCROLLTO_IN);
469 elm_genlist_item_selected_set(next, EINA_TRUE);
470 elm_genlist_item_show(next, ELM_GENLIST_ITEM_SCROLLTO_IN);
476 _item_single_select_up(Widget_Data *wd)
481 prev = ELM_GEN_ITEM_FROM_INLIST(wd->items->last);
482 while ((prev) && (prev->generation < wd->generation))
483 prev = ELM_GEN_ITEM_FROM_INLIST(EINA_INLIST_GET(prev)->prev);
485 else prev = (Elm_Gen_Item *) elm_genlist_item_prev_get(wd->last_selected_item);
487 if (!prev) return EINA_FALSE;
489 _deselect_all_items(wd);
491 elm_genlist_item_selected_set((Elm_Object_Item *) prev, EINA_TRUE);
492 elm_genlist_item_show((Elm_Object_Item *) prev, ELM_GENLIST_ITEM_SCROLLTO_IN);
497 _item_single_select_down(Widget_Data *wd)
502 next = ELM_GEN_ITEM_FROM_INLIST(wd->items);
503 while ((next) && (next->generation < wd->generation))
504 next = ELM_GEN_ITEM_FROM_INLIST(EINA_INLIST_GET(next)->next);
506 else next = (Elm_Gen_Item *) elm_genlist_item_next_get(wd->last_selected_item);
508 if (!next) return EINA_FALSE;
510 _deselect_all_items(wd);
512 elm_genlist_item_selected_set((Elm_Object_Item *) next, EINA_TRUE);
513 elm_genlist_item_show((Elm_Object_Item *) next, ELM_GENLIST_ITEM_SCROLLTO_IN);
518 _on_focus_hook(void *data __UNUSED__,
521 Widget_Data *wd = elm_widget_data_get(obj);
523 if (elm_widget_focus_get(obj))
525 elm_object_signal_emit(wd->obj, "elm,action,focus", "elm");
526 evas_object_focus_set(wd->obj, EINA_TRUE);
527 if ((wd->items) && (wd->selected) && (!wd->last_selected_item))
528 wd->last_selected_item = eina_list_data_get(wd->selected);
532 elm_object_signal_emit(wd->obj, "elm,action,unfocus", "elm");
533 evas_object_focus_set(wd->obj, EINA_FALSE);
538 _del_hook(Evas_Object *obj)
540 Widget_Data *wd = elm_widget_data_get(obj);
542 _item_cache_zero(wd);
543 if (wd->calc_job) ecore_job_del(wd->calc_job);
544 if (wd->update_job) ecore_job_del(wd->update_job);
545 if (wd->queue_idle_enterer) ecore_idle_enterer_del(wd->queue_idle_enterer);
546 if (wd->changed_job) ecore_job_del(wd->changed_job);
547 if (wd->must_recalc_idler) ecore_idler_del(wd->must_recalc_idler);
548 if (wd->multi_timer) ecore_timer_del(wd->multi_timer);
549 if (wd->mode_type) eina_stringshare_del(wd->mode_type);
550 if (wd->scr_hold_timer) ecore_timer_del(wd->scr_hold_timer);
555 _del_pre_hook(Evas_Object *obj)
557 Widget_Data *wd = elm_widget_data_get(obj);
559 if (wd->decorate_mode) elm_genlist_decorate_mode_set(wd->obj, EINA_FALSE);
560 elm_genlist_clear(obj);
561 evas_object_del(wd->pan_smart);
562 wd->pan_smart = NULL;
566 _mirrored_set(Evas_Object *obj,
569 Widget_Data *wd = elm_widget_data_get(obj);
571 _item_cache_zero(wd);
572 elm_smart_scroller_mirrored_set(wd->scr, rtl);
576 _theme_hook(Evas_Object *obj)
578 Widget_Data *wd = elm_widget_data_get(obj);
581 evas_event_freeze(evas_object_evas_get(wd->obj));
582 _item_cache_zero(wd);
583 _elm_widget_mirrored_reload(obj);
584 _mirrored_set(obj, elm_widget_mirrored_get(obj));
585 elm_smart_scroller_object_theme_set(obj, wd->scr, "genlist", "base",
586 elm_widget_style_get(obj));
587 //edje_object_scale_set(wd->scr, elm_widget_scale_get(obj) * _elm_config->scale);
588 wd->item_width = wd->item_height = 0;
589 wd->group_item_width = wd->group_item_height = 0;
590 wd->minw = wd->minh = wd->realminw = 0;
591 EINA_INLIST_FOREACH(wd->blocks, itb)
596 if (itb->realized) _item_block_unrealize(itb);
597 EINA_LIST_FOREACH(itb->items, l, it)
598 it->item->mincalcd = EINA_FALSE;
600 itb->changed = EINA_TRUE;
602 if (wd->calc_job) ecore_job_del(wd->calc_job);
603 wd->calc_job = ecore_job_add(_calc_job, wd);
605 evas_event_thaw(evas_object_evas_get(wd->obj));
606 evas_event_thaw_eval(evas_object_evas_get(wd->obj));
610 _show_region_hook(void *data,
613 Widget_Data *wd = elm_widget_data_get(data);
614 Evas_Coord x, y, w, h;
616 elm_widget_show_region_get(obj, &x, &y, &w, &h);
617 //x & y are screen coordinates, Add with pan coordinates
620 elm_smart_scroller_child_region_show(wd->scr, x, y, w, h);
624 _translate_hook(Evas_Object *obj)
626 evas_object_smart_callback_call(obj, "language,changed", NULL);
630 _sizing_eval(Evas_Object *obj)
632 Widget_Data *wd = elm_widget_data_get(obj);
633 Evas_Coord minw = -1, minh = -1, maxw = -1, maxh = -1;
635 evas_object_size_hint_min_get(wd->scr, &minw, &minh);
636 evas_object_size_hint_max_get(wd->scr, &maxw, &maxh);
638 if (wd->mode == ELM_LIST_COMPRESS)
642 elm_smart_scroller_child_viewport_size_get(wd->scr, &vw, &vh);
643 if ((vw != 0) && (vw != wd->prev_viewport_w))
647 wd->prev_viewport_w = vw;
648 EINA_INLIST_FOREACH(wd->blocks, itb)
650 itb->must_recalc = EINA_TRUE;
652 if (wd->calc_job) ecore_job_del(wd->calc_job);
653 wd->calc_job = ecore_job_add(_calc_job, wd);
656 else if (wd->mode == ELM_LIST_LIMIT)
662 elm_smart_scroller_child_viewport_size_get(wd->scr, &vmw, &vmh);
663 edje_object_size_min_calc
664 (elm_smart_scroller_edje_object_get(wd->scr), &vmw, &vmh);
671 edje_object_size_min_calc
672 (elm_smart_scroller_edje_object_get(wd->scr), &vmw, &vmh);
676 evas_object_size_hint_min_set(obj, minw, minh);
677 evas_object_size_hint_max_set(obj, maxw, maxh);
681 _signal_emit_hook(Evas_Object *obj,
682 const char *emission,
685 Widget_Data *wd = elm_widget_data_get(obj);
686 edje_object_signal_emit(elm_smart_scroller_edje_object_get(wd->scr),
691 _item_highlight(Elm_Gen_Item *it)
693 const char *selectraise;
694 if ((it->wd->select_mode == ELM_OBJECT_SELECT_MODE_NONE) ||
695 (it->wd->no_highlight) ||
696 (it->generation < it->wd->generation) ||
697 (it->highlighted) || elm_widget_item_disabled_get(it) ||
698 (it->select_mode == ELM_OBJECT_SELECT_MODE_NONE) || (it->item->mode_view) ||
699 (it->select_mode == ELM_OBJECT_SELECT_MODE_DISPLAY_ONLY))
701 edje_object_signal_emit(VIEW(it), "elm,state,selected", "elm");
702 if (it->edit_obj) edje_object_signal_emit(it->edit_obj, "elm,state,selected", "elm");
703 selectraise = edje_object_data_get(VIEW(it), "selectraise");
704 if ((selectraise) && (!strcmp(selectraise, "on")))
706 if (it->edit_obj) evas_object_raise(it->edit_obj);
707 else evas_object_raise(VIEW(it));
710 if ((it->item->group_item) && (it->item->group_item->realized))
711 evas_object_raise(it->item->VIEW(group_item));
714 it->highlighted = EINA_TRUE;
718 _item_unhighlight(Elm_Gen_Item *it)
720 if ((it->generation < it->wd->generation) || (!it->highlighted)) return;
721 edje_object_signal_emit(VIEW(it), "elm,state,unselected", "elm");
722 if (it->edit_obj) edje_object_signal_emit(it->edit_obj, "elm,state,unselected", "elm");
723 if (!it->item->nostacking)
725 if ((it->item->order_num_in & 0x1) ^ it->item->stacking_even)
727 if (it->edit_obj) evas_object_lower(it->edit_obj);
728 else evas_object_lower(VIEW(it));
732 if (it->edit_obj) evas_object_raise(it->edit_obj);
733 else evas_object_raise(VIEW(it));
736 it->highlighted = EINA_FALSE;
740 _item_block_position_update(Eina_Inlist *list, int idx)
744 EINA_INLIST_FOREACH(list, tmp)
746 tmp->position = idx++;
747 tmp->position_update = EINA_TRUE;
752 _item_position_update(Eina_List *list, int idx)
757 EINA_LIST_FOREACH(list, l, it)
759 it->position = idx++;
760 it->position_update = EINA_TRUE;
765 _item_block_del(Elm_Gen_Item *it)
768 Item_Block *itb = it->item->block;
770 itb->items = eina_list_remove(itb->items, it);
772 itb->changed = EINA_TRUE;
773 if (!it->wd->reorder_deleted)
775 if (it->wd->calc_job) ecore_job_del(it->wd->calc_job);
776 it->wd->calc_job = ecore_job_add(_calc_job, it->wd);
780 il = EINA_INLIST_GET(itb);
781 Item_Block *itbn = (Item_Block *)(il->next);
783 it->parent->item->items = eina_list_remove(it->parent->item->items, it);
786 _item_block_position_update(il->next, itb->position);
787 it->wd->blocks = eina_inlist_remove(it->wd->blocks, il);
790 if (itbn) itbn->changed = EINA_TRUE;
794 if (itb->count < itb->wd->max_items_per_block/2)
796 il = EINA_INLIST_GET(itb);
797 Item_Block *itbp = (Item_Block *)(il->prev);
798 Item_Block *itbn = (Item_Block *)(il->next);
799 if ((itbp) && ((itbp->count + itb->count) < itb->wd->max_items_per_block + itb->wd->max_items_per_block/2))
803 EINA_LIST_FREE(itb->items, it2)
805 it2->item->block = itbp;
806 itbp->items = eina_list_append(itbp->items, it2);
808 itbp->changed = EINA_TRUE;
810 _item_block_position_update(EINA_INLIST_GET(itb)->next,
812 it->wd->blocks = eina_inlist_remove(it->wd->blocks,
813 EINA_INLIST_GET(itb));
815 block_changed = EINA_TRUE;
817 else if ((itbn) && ((itbn->count + itb->count) < itb->wd->max_items_per_block + itb->wd->max_items_per_block/2))
821 Eina_List *last = eina_list_last(itb->items);
822 Elm_Gen_Item *it2 = last->data;
824 it2->item->block = itbn;
825 itb->items = eina_list_remove_list(itb->items, last);
826 itbn->items = eina_list_prepend(itbn->items, it2);
828 itbn->changed = EINA_TRUE;
830 _item_block_position_update(EINA_INLIST_GET(itb)->next,
833 eina_inlist_remove(it->wd->blocks, EINA_INLIST_GET(itb));
835 block_changed = EINA_TRUE;
841 it->wd->pan_changed = EINA_TRUE;
842 evas_object_smart_changed(it->wd->pan_smart);
843 if (it->wd->calc_job) ecore_job_del(it->wd->calc_job);
844 it->wd->calc_job = NULL;
849 _item_subitems_clear(Elm_Gen_Item *it)
851 ELM_OBJ_ITEM_CHECK_OR_RETURN(it);
852 Eina_List *tl = NULL, *l;
853 Elm_Object_Item *it2;
855 EINA_LIST_FOREACH(it->item->items, l, it2)
856 tl = eina_list_append(tl, it2);
857 EINA_LIST_FREE(tl, it2)
858 elm_object_item_del(it2);
862 _item_del(Elm_Gen_Item *it)
864 Evas_Object *obj = WIDGET(it);
866 evas_event_freeze(evas_object_evas_get(obj));
867 elm_genlist_item_subitems_clear((Elm_Object_Item *)it);
868 if (it->wd->show_item == it) it->wd->show_item = NULL;
869 if (it->realized) _elm_genlist_item_unrealize(it, EINA_FALSE);
870 if (it->item->decorate_mode_item_realized) _decorate_mode_item_unrealize(it);
871 if (it->item->block) _item_block_del(it);
872 if (it->item->queued)
873 it->wd->queue = eina_list_remove(it->wd->queue, it);
874 if (it->wd->anchor_item == it)
876 it->wd->anchor_item = ELM_GEN_ITEM_FROM_INLIST(EINA_INLIST_GET(it)->next);
877 if (!it->wd->anchor_item)
878 it->wd->anchor_item = ELM_GEN_ITEM_FROM_INLIST(EINA_INLIST_GET(it)->prev);
880 if (it->wd->expanded_item == it) it->wd->expanded_item = NULL;
882 it->parent->item->items = eina_list_remove(it->parent->item->items, it);
883 if (it->item->swipe_timer) ecore_timer_del(it->item->swipe_timer);
884 _elm_genlist_item_del_serious(it);
885 elm_genlist_item_class_unref((Elm_Genlist_Item_Class *)it->itc);
886 evas_event_thaw(evas_object_evas_get(obj));
887 evas_event_thaw_eval(evas_object_evas_get(obj));
891 _clear_cb(Widget_Data *wd)
893 wd->anchor_item = NULL;
896 Item_Block *itb = (Item_Block *)(wd->blocks);
898 wd->blocks = eina_inlist_remove(wd->blocks, wd->blocks);
899 if (itb->items) eina_list_free(itb->items);
902 if (wd->queue_idle_enterer)
904 ecore_idle_enterer_del(wd->queue_idle_enterer);
905 wd->queue_idle_enterer = NULL;
907 if (wd->must_recalc_idler)
909 ecore_idler_del(wd->must_recalc_idler);
910 wd->must_recalc_idler = NULL;
912 if (wd->queue) wd->queue = eina_list_free(wd->queue);
913 if (wd->reorder_move_animator)
915 ecore_animator_del(wd->reorder_move_animator);
916 wd->reorder_move_animator = NULL;
918 wd->show_item = NULL;
919 wd->reorder_old_pan_y = 0;
923 _item_unselect(Elm_Gen_Item *it)
925 if ((it->generation < it->wd->generation) || (!it->selected)) return;
926 it->selected = EINA_FALSE;
927 it->wd->selected = eina_list_remove(it->wd->selected, it);
928 evas_object_smart_callback_call(WIDGET(it), SIG_UNSELECTED, it);
932 _mouse_move(void *data,
933 Evas *evas __UNUSED__,
937 Elm_Gen_Item *it = data;
938 Evas_Event_Mouse_Move *ev = event_info;
939 Evas_Coord minw = 0, minh = 0, x, y, dx, dy, adx, ady;
940 Evas_Coord ox, oy, ow, oh, it_scrl_y, y_pos;
942 if (ev->event_flags & EVAS_EVENT_FLAG_ON_HOLD)
944 if (!it->wd->on_hold)
946 it->wd->on_hold = EINA_TRUE;
947 if ((!it->wd->wasselected) && (!it->flipped))
949 _item_unhighlight(it);
954 if (it->wd->multitouched)
956 it->wd->cur_x = ev->cur.canvas.x;
957 it->wd->cur_y = ev->cur.canvas.y;
960 if ((it->dragging) && (it->down))
962 if (it->wd->movements == SWIPE_MOVES) it->wd->swipe = EINA_TRUE;
965 it->wd->history[it->wd->movements].x = ev->cur.canvas.x;
966 it->wd->history[it->wd->movements].y = ev->cur.canvas.y;
967 if (abs((it->wd->history[it->wd->movements].x -
968 it->wd->history[0].x)) > 40)
969 it->wd->swipe = EINA_TRUE;
975 ecore_timer_del(it->long_timer);
976 it->long_timer = NULL;
978 evas_object_smart_callback_call(WIDGET(it), SIG_DRAG, it);
981 if ((!it->down) /* || (it->wd->on_hold)*/ || (it->wd->longpressed))
985 ecore_timer_del(it->long_timer);
986 it->long_timer = NULL;
988 if ((it->wd->reorder_mode) && (it->wd->reorder_it))
990 evas_object_geometry_get(it->wd->pan_smart, &ox, &oy, &ow, &oh);
991 it_scrl_y = ev->cur.canvas.y - it->wd->reorder_it->dy;
993 if (!it->wd->reorder_start_y)
994 it->wd->reorder_start_y = it->item->block->y + it->y;
998 else if (it_scrl_y + it->wd->reorder_it->item->h > oy + oh)
999 y_pos = oy + oh - it->wd->reorder_it->item->h;
1004 _item_position(it, it->edit_obj, it->item->scrl_x, y_pos);
1006 _item_position(it, VIEW(it), it->item->scrl_x, y_pos);
1008 if (it->wd->calc_job) ecore_job_del(it->wd->calc_job);
1009 it->wd->calc_job = ecore_job_add(_calc_job, it->wd);
1013 if (it->select_mode != ELM_OBJECT_SELECT_MODE_DISPLAY_ONLY)
1014 elm_coords_finger_size_adjust(1, &minw, 1, &minh);
1015 evas_object_geometry_get(obj, &x, &y, NULL, NULL);
1016 x = ev->cur.canvas.x - x;
1017 y = ev->cur.canvas.y - y;
1020 if (adx < 0) adx = -dx;
1023 if (ady < 0) ady = -dy;
1026 if ((adx > minw) || (ady > minh))
1028 it->dragging = EINA_TRUE;
1031 ecore_timer_del(it->long_timer);
1032 it->long_timer = NULL;
1034 if ((!it->wd->wasselected) && (!it->flipped))
1036 _item_unhighlight(it);
1041 if ((ady > adx) && (!it->wd->drag_started))
1042 evas_object_smart_callback_call(WIDGET(it),
1043 SIG_DRAG_START_UP, it);
1047 evas_object_smart_callback_call(WIDGET(it),
1048 SIG_DRAG_START_LEFT, it);
1050 evas_object_smart_callback_call(WIDGET(it),
1051 SIG_DRAG_START_RIGHT, it);
1056 if ((ady > adx) && (!it->wd->drag_started))
1057 evas_object_smart_callback_call(WIDGET(it),
1058 SIG_DRAG_START_DOWN, it);
1062 evas_object_smart_callback_call(WIDGET(it),
1063 SIG_DRAG_START_LEFT, it);
1065 evas_object_smart_callback_call(WIDGET(it),
1066 SIG_DRAG_START_RIGHT, it);
1073 _long_press(void *data)
1075 Elm_Gen_Item *it = data, *it_tmp;
1076 Eina_List *list, *l;
1078 it->long_timer = NULL;
1079 if (elm_widget_item_disabled_get(it) || (it->dragging) ||
1080 (it->select_mode == ELM_OBJECT_SELECT_MODE_DISPLAY_ONLY))
1081 return ECORE_CALLBACK_CANCEL;
1082 it->wd->longpressed = EINA_TRUE;
1083 evas_object_smart_callback_call(WIDGET(it), SIG_LONGPRESSED, it);
1084 if ((it->wd->reorder_mode) && (!it->group))
1086 it->wd->reorder_it = it;
1087 it->wd->reorder_start_y = 0;
1089 evas_object_raise(it->edit_obj);
1091 evas_object_raise(VIEW(it));
1093 elm_smart_scroller_hold_set(it->wd->scr, EINA_TRUE);
1094 elm_smart_scroller_bounce_allow_set(it->wd->scr, EINA_FALSE, EINA_FALSE);
1096 list = elm_genlist_realized_items_get(it->wd->obj);
1097 EINA_LIST_FOREACH(list, l, it_tmp)
1099 if (it != it_tmp) _item_unselect(it_tmp);
1103 EINA_LIST_FOREACH(it->items, l, it_tmp)
1105 if (elm_genlist_item_expanded_get((Elm_Object_Item *) it_tmp))
1107 elm_genlist_item_expanded_set((Elm_Object_Item *)it_tmp,
1109 return ECORE_CALLBACK_RENEW;
1113 if (elm_genlist_item_expanded_get((Elm_Object_Item *)it))
1115 elm_genlist_item_expanded_set((Elm_Object_Item *)it, EINA_FALSE);
1116 return ECORE_CALLBACK_RENEW;
1119 if (!it->wd->decorate_mode)
1120 edje_object_signal_emit(VIEW(it), "elm,state,reorder,enabled", "elm");
1122 return ECORE_CALLBACK_CANCEL;
1126 _swipe(Elm_Gen_Item *it)
1131 if ((it->select_mode == ELM_OBJECT_SELECT_MODE_DISPLAY_ONLY) ||
1132 elm_widget_item_disabled_get(it)) return;
1133 it->wd->swipe = EINA_FALSE;
1134 for (i = 0; i < it->wd->movements; i++)
1136 sum += it->wd->history[i].x;
1137 if (abs(it->wd->history[0].y - it->wd->history[i].y) > 10) return;
1140 sum /= it->wd->movements;
1141 if (abs(sum - it->wd->history[0].x) <= 10) return;
1142 evas_object_smart_callback_call(WIDGET(it), SIG_SWIPE, it);
1146 _swipe_cancel(void *data)
1148 Elm_Gen_Item *it = data;
1150 if (!it) return ECORE_CALLBACK_CANCEL;
1151 it->wd->swipe = EINA_FALSE;
1152 it->wd->movements = 0;
1153 return ECORE_CALLBACK_RENEW;
1157 _multi_cancel(void *data)
1159 Widget_Data *wd = data;
1161 if (!wd) return ECORE_CALLBACK_CANCEL;
1162 wd->multi_timeout = EINA_TRUE;
1163 return ECORE_CALLBACK_RENEW;
1167 _multi_touch_gesture_eval(void *data)
1169 Elm_Gen_Item *it = data;
1171 it->wd->multitouched = EINA_FALSE;
1172 if (it->wd->multi_timer)
1174 ecore_timer_del(it->wd->multi_timer);
1175 it->wd->multi_timer = NULL;
1177 if (it->wd->multi_timeout)
1179 it->wd->multi_timeout = EINA_FALSE;
1183 Evas_Coord minw = 0, minh = 0;
1184 Evas_Coord off_x, off_y, off_mx, off_my;
1186 elm_coords_finger_size_adjust(1, &minw, 1, &minh);
1187 off_x = abs(it->wd->cur_x - it->wd->prev_x);
1188 off_y = abs(it->wd->cur_y - it->wd->prev_y);
1189 off_mx = abs(it->wd->cur_mx - it->wd->prev_mx);
1190 off_my = abs(it->wd->cur_my - it->wd->prev_my);
1192 if (((off_x > minw) || (off_y > minh)) && ((off_mx > minw) || (off_my > minh)))
1194 if ((off_x + off_mx) > (off_y + off_my))
1196 if ((it->wd->cur_x > it->wd->prev_x) && (it->wd->cur_mx > it->wd->prev_mx))
1197 evas_object_smart_callback_call(WIDGET(it),
1198 SIG_MULTI_SWIPE_RIGHT, it);
1199 else if ((it->wd->cur_x < it->wd->prev_x) && (it->wd->cur_mx < it->wd->prev_mx))
1200 evas_object_smart_callback_call(WIDGET(it),
1201 SIG_MULTI_SWIPE_LEFT, it);
1202 else if (abs(it->wd->cur_x - it->wd->cur_mx) > abs(it->wd->prev_x - it->wd->prev_mx))
1203 evas_object_smart_callback_call(WIDGET(it),
1204 SIG_MULTI_PINCH_OUT, it);
1206 evas_object_smart_callback_call(WIDGET(it),
1207 SIG_MULTI_PINCH_IN, it);
1211 if ((it->wd->cur_y > it->wd->prev_y) && (it->wd->cur_my > it->wd->prev_my))
1212 evas_object_smart_callback_call(WIDGET(it),
1213 SIG_MULTI_SWIPE_DOWN, it);
1214 else if ((it->wd->cur_y < it->wd->prev_y) && (it->wd->cur_my < it->wd->prev_my))
1215 evas_object_smart_callback_call(WIDGET(it),
1216 SIG_MULTI_SWIPE_UP, it);
1217 else if (abs(it->wd->cur_y - it->wd->cur_my) > abs(it->wd->prev_y - it->wd->prev_my))
1218 evas_object_smart_callback_call(WIDGET(it),
1219 SIG_MULTI_PINCH_OUT, it);
1221 evas_object_smart_callback_call(WIDGET(it),
1222 SIG_MULTI_PINCH_IN, it);
1225 it->wd->multi_timeout = EINA_FALSE;
1229 _multi_down(void *data,
1230 Evas *evas __UNUSED__,
1231 Evas_Object *obj __UNUSED__,
1234 Elm_Gen_Item *it = data;
1235 Evas_Event_Multi_Down *ev = event_info;
1237 if ((it->wd->multi_device != 0) || (it->wd->multitouched) || (it->wd->multi_timeout)) return;
1238 it->wd->multi_device = ev->device;
1239 it->wd->multi_down = EINA_TRUE;
1240 it->wd->multitouched = EINA_TRUE;
1241 it->wd->prev_mx = ev->canvas.x;
1242 it->wd->prev_my = ev->canvas.y;
1243 if (!it->wd->wasselected)
1245 _item_unhighlight(it);
1248 it->wd->wasselected = EINA_FALSE;
1249 it->wd->longpressed = EINA_FALSE;
1252 ecore_timer_del(it->long_timer);
1253 it->long_timer = NULL;
1257 it->dragging = EINA_FALSE;
1258 evas_object_smart_callback_call(WIDGET(it), SIG_DRAG_STOP, it);
1260 if (it->item->swipe_timer)
1262 ecore_timer_del(it->item->swipe_timer);
1263 it->item->swipe_timer = NULL;
1265 if (it->wd->on_hold)
1267 it->wd->swipe = EINA_FALSE;
1268 it->wd->movements = 0;
1269 it->wd->on_hold = EINA_FALSE;
1274 _multi_up(void *data,
1275 Evas *evas __UNUSED__,
1276 Evas_Object *obj __UNUSED__,
1279 Elm_Gen_Item *it = data;
1280 Evas_Event_Multi_Up *ev = event_info;
1282 if (it->wd->multi_device != ev->device) return;
1283 it->wd->multi_device = 0;
1284 it->wd->multi_down = EINA_FALSE;
1285 if (it->wd->mouse_down) return;
1286 _multi_touch_gesture_eval(data);
1290 _multi_move(void *data,
1291 Evas *evas __UNUSED__,
1292 Evas_Object *obj __UNUSED__,
1295 Elm_Gen_Item *it = data;
1296 Evas_Event_Multi_Move *ev = event_info;
1298 if (it->wd->multi_device != ev->device) return;
1299 it->wd->cur_mx = ev->cur.canvas.x;
1300 it->wd->cur_my = ev->cur.canvas.y;
1304 _mouse_down(void *data,
1305 Evas *evas __UNUSED__,
1309 Elm_Gen_Item *it = data;
1310 Evas_Event_Mouse_Down *ev = event_info;
1313 if (ev->button != 1) return;
1316 EINA_LIST_FOREACH(it->content_objs, l, iobj)
1318 elm_widget_tree_unfocusable_set(iobj, EINA_FALSE);
1320 it->can_focus = EINA_TRUE;
1322 if (ev->event_flags & EVAS_EVENT_FLAG_ON_HOLD)
1324 it->wd->on_hold = EINA_TRUE;
1327 it->down = EINA_TRUE;
1328 it->dragging = EINA_FALSE;
1329 evas_object_geometry_get(obj, &x, &y, NULL, NULL);
1330 it->dx = ev->canvas.x - x;
1331 it->dy = ev->canvas.y - y;
1332 it->wd->mouse_down = EINA_TRUE;
1333 if (!it->wd->multitouched)
1335 it->wd->prev_x = ev->canvas.x;
1336 it->wd->prev_y = ev->canvas.y;
1337 it->wd->multi_timeout = EINA_FALSE;
1338 if (it->wd->multi_timer) ecore_timer_del(it->wd->multi_timer);
1339 it->wd->multi_timer = ecore_timer_add(1, _multi_cancel, it->wd);
1341 it->wd->longpressed = EINA_FALSE;
1342 if (ev->event_flags & EVAS_EVENT_FLAG_ON_HOLD) it->wd->on_hold = EINA_TRUE;
1343 else it->wd->on_hold = EINA_FALSE;
1344 if (it->wd->on_hold) return;
1345 it->wd->wasselected = it->selected;
1346 _item_highlight(it);
1347 if (ev->flags & EVAS_BUTTON_DOUBLE_CLICK)
1348 if ((!elm_widget_item_disabled_get(it)) &&
1349 (it->select_mode != ELM_OBJECT_SELECT_MODE_DISPLAY_ONLY))
1351 evas_object_smart_callback_call(WIDGET(it), SIG_CLICKED_DOUBLE, it);
1352 evas_object_smart_callback_call(WIDGET(it), SIG_ACTIVATED, it);
1354 if (it->long_timer) ecore_timer_del(it->long_timer);
1355 if (it->item->swipe_timer) ecore_timer_del(it->item->swipe_timer);
1356 it->item->swipe_timer = ecore_timer_add(0.4, _swipe_cancel, it);
1358 it->long_timer = ecore_timer_add(it->wd->longpress_timeout, _long_press,
1361 it->long_timer = NULL;
1362 it->wd->swipe = EINA_FALSE;
1363 it->wd->movements = 0;
1367 _mouse_up(void *data,
1368 Evas *evas __UNUSED__,
1369 Evas_Object *obj __UNUSED__,
1372 Elm_Gen_Item *it = data;
1373 Evas_Event_Mouse_Up *ev = event_info;
1374 Eina_Bool dragged = EINA_FALSE;
1376 if (ev->button != 1) return;
1377 it->down = EINA_FALSE;
1378 it->wd->mouse_down = EINA_FALSE;
1379 if (it->wd->multitouched)
1381 if ((!it->wd->multi) && (!it->selected) && (it->highlighted)) _item_unhighlight(it);
1382 if (it->wd->multi_down) return;
1383 _multi_touch_gesture_eval(data);
1386 if (ev->event_flags & EVAS_EVENT_FLAG_ON_HOLD) it->wd->on_hold = EINA_TRUE;
1387 else it->wd->on_hold = EINA_FALSE;
1390 ecore_timer_del(it->long_timer);
1391 it->long_timer = NULL;
1395 it->dragging = EINA_FALSE;
1396 evas_object_smart_callback_call(WIDGET(it), SIG_DRAG_STOP, it);
1399 if (it->item->swipe_timer)
1401 ecore_timer_del(it->item->swipe_timer);
1402 it->item->swipe_timer = NULL;
1404 if (it->wd->multi_timer)
1406 ecore_timer_del(it->wd->multi_timer);
1407 it->wd->multi_timer = NULL;
1408 it->wd->multi_timeout = EINA_FALSE;
1410 if (it->wd->on_hold)
1412 if (it->wd->swipe) _swipe(data);
1413 it->wd->longpressed = EINA_FALSE;
1414 it->wd->on_hold = EINA_FALSE;
1417 if ((it->wd->reorder_mode) && (it->wd->reorder_it))
1419 Evas_Coord it_scrl_y = ev->canvas.y - it->wd->reorder_it->dy;
1421 if (it->wd->reorder_rel && (it->wd->reorder_it->parent == it->wd->reorder_rel->parent))
1423 if (it_scrl_y <= it->wd->reorder_rel->item->scrl_y)
1424 _item_move_before(it->wd->reorder_it, it->wd->reorder_rel);
1426 _item_move_after(it->wd->reorder_it, it->wd->reorder_rel);
1430 if (it->wd->calc_job) ecore_job_del(it->wd->calc_job);
1431 it->wd->calc_job = ecore_job_add(_calc_job, it->wd);
1433 it->wd->reorder_deleted = EINA_FALSE;
1434 edje_object_signal_emit(VIEW(it), "elm,state,reorder,disabled", "elm");
1435 it->wd->reorder_it = it->wd->reorder_rel = NULL;
1436 elm_smart_scroller_hold_set(it->wd->scr, EINA_FALSE);
1437 elm_smart_scroller_bounce_allow_set(it->wd->scr, it->wd->h_bounce, it->wd->v_bounce);
1439 if (it->wd->longpressed)
1441 it->wd->longpressed = EINA_FALSE;
1442 if ((!it->wd->wasselected) && (!it->flipped))
1444 _item_unhighlight(it);
1447 it->wd->wasselected = EINA_FALSE;
1452 if (it->want_unrealize)
1454 _elm_genlist_item_unrealize(it, EINA_FALSE);
1455 if (it->item->block->want_unrealize)
1456 _item_block_unrealize(it->item->block);
1459 if (elm_widget_item_disabled_get(it) || (dragged) ||
1460 (it->select_mode == ELM_OBJECT_SELECT_MODE_DISPLAY_ONLY))
1462 if (ev->event_flags & EVAS_EVENT_FLAG_ON_HOLD) return;
1467 _item_highlight(it);
1472 _item_unhighlight(it);
1480 Widget_Data *wd = it->wd;
1483 while (wd->selected)
1485 _item_unhighlight(wd->selected->data);
1486 _item_unselect(wd->selected->data);
1492 const Eina_List *l, *l_next;
1495 EINA_LIST_FOREACH_SAFE(it->wd->selected, l, l_next, it2)
1498 _item_unhighlight(it2);
1499 _item_unselect(it2);
1501 //_item_highlight(it);
1504 _item_highlight(it);
1510 _mouse_down_scroller(void *data,
1511 Evas *evas __UNUSED__,
1512 Evas_Object *obj __UNUSED__,
1513 void *event_info __UNUSED__)
1515 Widget_Data *wd = elm_widget_data_get(data);
1518 wd->drag_started = EINA_FALSE;
1522 _mouse_up_scroller(void *data,
1523 Evas *evas __UNUSED__,
1524 Evas_Object *obj __UNUSED__,
1525 void *event_info __UNUSED__)
1527 Widget_Data *wd = elm_widget_data_get(data);
1530 wd->drag_started = EINA_FALSE;
1534 _mouse_move_scroller(void *data,
1535 Evas *evas __UNUSED__,
1536 Evas_Object *obj __UNUSED__,
1539 Widget_Data *wd = elm_widget_data_get(data);
1540 Evas_Event_Mouse_Move *ev = event_info;
1541 Evas_Coord minw = 0, minh = 0, dx, dy, adx, ady;
1544 if (wd->drag_started) return;
1546 elm_coords_finger_size_adjust(1, &minw, 1, &minh);
1547 dx = ev->cur.canvas.x - ev->prev.canvas.x;
1548 dy = ev->cur.canvas.y - ev->prev.canvas.y;
1551 if (adx < 0) adx = -dx;
1552 if (ady < 0) ady = -dy;
1553 if (((ady < minh) && (ady > minh / 2)) && (ady > adx))
1557 evas_object_smart_callback_call(data, SIG_DRAG_START_UP, NULL);
1558 wd->drag_started = EINA_TRUE;
1562 evas_object_smart_callback_call(data, SIG_DRAG_START_DOWN, NULL);
1563 wd->drag_started = EINA_TRUE;
1569 _signal_expand_toggle(void *data,
1570 Evas_Object *obj __UNUSED__,
1571 const char *emission __UNUSED__,
1572 const char *source __UNUSED__)
1574 Elm_Gen_Item *it = data;
1576 if (it->item->expanded)
1577 evas_object_smart_callback_call(WIDGET(it), SIG_CONTRACT_REQUEST, it);
1579 evas_object_smart_callback_call(WIDGET(it), SIG_EXPAND_REQUEST, it);
1583 _signal_expand(void *data,
1584 Evas_Object *obj __UNUSED__,
1585 const char *emission __UNUSED__,
1586 const char *source __UNUSED__)
1588 Elm_Gen_Item *it = data;
1590 if (!it->item->expanded)
1591 evas_object_smart_callback_call(WIDGET(it), SIG_EXPAND_REQUEST, it);
1595 _signal_contract(void *data,
1596 Evas_Object *obj __UNUSED__,
1597 const char *emission __UNUSED__,
1598 const char *source __UNUSED__)
1600 Elm_Gen_Item *it = data;
1602 if (it->item->expanded)
1603 evas_object_smart_callback_call(WIDGET(it), SIG_CONTRACT_REQUEST, it);
1607 _scr_hold_timer_cb(void *data)
1609 if (!data) return ECORE_CALLBACK_CANCEL;
1610 Widget_Data *wd = data;
1611 elm_smart_scroller_hold_set(wd->scr, EINA_FALSE);
1612 wd->scr_hold_timer = NULL;
1613 return ECORE_CALLBACK_CANCEL;
1617 _mode_finished_signal_cb(void *data,
1619 const char *emission __UNUSED__,
1620 const char *source __UNUSED__)
1624 Elm_Gen_Item *it = data;
1625 if ((it->generation < it->wd->generation) || (!it->realized) || (!it->item->mode_view)) return;
1627 Evas *te = evas_object_evas_get(obj);
1629 evas_event_freeze(te);
1630 it->item->nocache_once = EINA_FALSE;
1631 _mode_item_unrealize(it);
1632 //FIXME: group raise
1634 if (it->item->group_item)
1635 evas_object_raise(it->item->VIEW(group_item));
1637 snprintf(buf, sizeof(buf), "elm,state,%s,passive,finished", it->wd->mode_type);
1638 edje_object_signal_callback_del_full(obj, buf, "elm", _mode_finished_signal_cb, it);
1639 evas_event_thaw(te);
1640 evas_event_thaw_eval(te);
1644 _item_cache_clean(Widget_Data *wd)
1646 evas_event_freeze(evas_object_evas_get(wd->obj));
1647 while ((wd->item_cache) && (wd->item_cache_count > wd->item_cache_max))
1651 itc = EINA_INLIST_CONTAINER_GET(wd->item_cache->last, Item_Cache);
1652 wd->item_cache = eina_inlist_remove(wd->item_cache,
1653 wd->item_cache->last);
1654 wd->item_cache_count--;
1655 if (itc->spacer) evas_object_del(itc->spacer);
1656 if (itc->base_view) evas_object_del(itc->base_view);
1657 if (itc->item_style) eina_stringshare_del(itc->item_style);
1660 evas_event_thaw(evas_object_evas_get(wd->obj));
1661 evas_event_thaw_eval(evas_object_evas_get(wd->obj));
1665 _item_cache_zero(Widget_Data *wd)
1667 int pmax = wd->item_cache_max;
1668 wd->item_cache_max = 0;
1669 _item_cache_clean(wd);
1670 wd->item_cache_max = pmax;
1674 _item_cache_add(Elm_Gen_Item *it)
1678 evas_event_freeze(evas_object_evas_get(it->wd->obj));
1679 if (it->wd->item_cache_max <= 0)
1681 evas_object_del(VIEW(it));
1683 evas_object_del(it->spacer);
1685 evas_event_thaw(evas_object_evas_get(it->wd->obj));
1686 evas_event_thaw_eval(evas_object_evas_get(it->wd->obj));
1690 it->wd->item_cache_count++;
1691 itc = calloc(1, sizeof(Item_Cache));
1694 evas_event_thaw(evas_object_evas_get(it->wd->obj));
1695 evas_event_thaw_eval(evas_object_evas_get(it->wd->obj));
1698 it->wd->item_cache = eina_inlist_prepend(it->wd->item_cache,
1699 EINA_INLIST_GET(itc));
1700 itc->spacer = it->spacer;
1702 itc->base_view = VIEW(it);
1704 edje_object_signal_emit(itc->base_view, "elm,state,unselected", "elm");
1705 evas_object_hide(itc->base_view);
1706 evas_object_move(itc->base_view, -9999, -9999);
1707 itc->item_style = eina_stringshare_add(it->itc->item_style);
1708 if (it->item->type & ELM_GENLIST_ITEM_TREE) itc->tree = 1;
1709 itc->selected = it->selected;
1710 itc->disabled = elm_widget_item_disabled_get(it);
1711 itc->expanded = it->item->expanded;
1714 ecore_timer_del(it->long_timer);
1715 it->long_timer = NULL;
1717 if (it->item->swipe_timer)
1719 ecore_timer_del(it->item->swipe_timer);
1720 it->item->swipe_timer = NULL;
1722 // FIXME: other callbacks?
1723 edje_object_signal_callback_del_full(itc->base_view,
1724 "elm,action,expand,toggle",
1725 "elm", _signal_expand_toggle, it);
1726 edje_object_signal_callback_del_full(itc->base_view, "elm,action,expand",
1728 _signal_expand, it);
1729 edje_object_signal_callback_del_full(itc->base_view, "elm,action,contract",
1730 "elm", _signal_contract, it);
1731 evas_object_event_callback_del_full(itc->base_view, EVAS_CALLBACK_MOUSE_DOWN,
1733 evas_object_event_callback_del_full(itc->base_view, EVAS_CALLBACK_MOUSE_UP,
1735 evas_object_event_callback_del_full(itc->base_view, EVAS_CALLBACK_MOUSE_MOVE,
1737 evas_object_event_callback_del_full(itc->base_view, EVAS_CALLBACK_MULTI_DOWN,
1739 evas_object_event_callback_del_full(itc->base_view, EVAS_CALLBACK_MULTI_UP,
1741 evas_object_event_callback_del_full(itc->base_view, EVAS_CALLBACK_MULTI_MOVE,
1743 _item_cache_clean(it->wd);
1744 evas_event_thaw(evas_object_evas_get(it->wd->obj));
1745 evas_event_thaw_eval(evas_object_evas_get(it->wd->obj));
1749 _item_cache_find(Elm_Gen_Item *it)
1754 if (it->item->type & ELM_GENLIST_ITEM_TREE) tree = 1;
1755 EINA_INLIST_FOREACH(it->wd->item_cache, itc)
1757 if ((itc->selected) || (itc->disabled) || (itc->expanded))
1759 if ((itc->tree == tree) &&
1760 (((!it->itc->item_style) && (!itc->item_style)) ||
1761 (it->itc->item_style && itc->item_style &&
1762 (!strcmp(it->itc->item_style, itc->item_style)))))
1764 it->wd->item_cache = eina_inlist_remove(it->wd->item_cache,
1765 EINA_INLIST_GET(itc));
1766 it->wd->item_cache_count--;
1774 _elm_genlist_item_index_update(Elm_Gen_Item *it)
1776 if (it->position_update || it->item->block->position_update)
1778 evas_object_smart_callback_call(WIDGET(it), SIG_INDEX_UPDATE, it);
1779 it->position_update = EINA_FALSE;
1784 _elm_genlist_item_odd_even_update(Elm_Gen_Item *it)
1786 if (!it->item->nostacking)
1788 if ((it->item->order_num_in & 0x1) ^ it->item->stacking_even)
1790 if (it->edit_obj) evas_object_lower(it->edit_obj);
1791 else evas_object_lower(VIEW(it));
1795 if (it->edit_obj) evas_object_raise(it->edit_obj);
1796 else evas_object_raise(VIEW(it));
1800 if (it->item->order_num_in & 0x1)
1802 edje_object_signal_emit(VIEW(it), "elm,state,odd", "elm");
1803 if (it->edit_obj) edje_object_signal_emit(it->edit_obj, "elm,state,odd", "elm");
1807 edje_object_signal_emit(VIEW(it), "elm,state,even", "elm");
1808 if (it->edit_obj) edje_object_signal_emit(it->edit_obj, "elm,state,even", "elm");
1813 _elm_genlist_item_state_update(Elm_Gen_Item *it, Item_Cache *itc)
1817 if (it->selected != itc->selected)
1821 edje_object_signal_emit(VIEW(it),
1822 "elm,state,selected", "elm");
1824 edje_object_signal_emit(it->edit_obj,
1825 "elm,state,selected", "elm");
1828 if (elm_widget_item_disabled_get(it) != itc->disabled)
1830 if (elm_widget_item_disabled_get(it))
1832 edje_object_signal_emit(VIEW(it),
1833 "elm,state,disabled", "elm");
1835 edje_object_signal_emit(it->edit_obj,
1836 "elm,state,disabled", "elm");
1839 if (it->item->expanded != itc->expanded)
1841 if (it->item->expanded)
1843 edje_object_signal_emit(VIEW(it),
1844 "elm,state,expanded", "elm");
1846 edje_object_signal_emit(it->edit_obj,
1847 "elm,state,expanded", "elm");
1855 edje_object_signal_emit(VIEW(it),
1856 "elm,state,selected", "elm");
1858 edje_object_signal_emit(it->edit_obj,
1859 "elm,state,selected", "elm");
1862 if (elm_widget_item_disabled_get(it))
1864 edje_object_signal_emit(VIEW(it),
1865 "elm,state,disabled", "elm");
1867 edje_object_signal_emit(it->edit_obj,
1868 "elm,state,disabled", "elm");
1870 if (it->item->expanded)
1872 edje_object_signal_emit(VIEW(it),
1873 "elm,state,expanded", "elm");
1875 edje_object_signal_emit(it->edit_obj,
1876 "elm,state,expanded", "elm");
1882 _content_focused(void *data, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
1884 Elm_Genlist_Item *it = data;
1885 if (it) it->defer_unrealize = EINA_TRUE;
1889 _content_unfocused(void *data, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
1891 Elm_Genlist_Item *it = data;
1892 if (it) it->defer_unrealize = EINA_FALSE;
1897 _item_mode_content_realize(Elm_Gen_Item *it,
1898 Evas_Object *target,
1901 Eina_List **contents_list,
1902 const char *contents_part)
1905 Eina_List *res = NULL;
1907 if (it->itc->func.content_get)
1912 *source = elm_widget_stringlist_get(edje_object_data_get(target, contents_part));
1913 if (parts && (eina_list_count(*source) != eina_list_count(*contents_list)))
1914 res = *contents_list;
1915 EINA_LIST_FOREACH(*source, l, key)
1917 if (parts && fnmatch(parts, key, FNM_PERIOD))
1920 Evas_Object *ic = it->itc->func.content_get
1921 ((void *)it->base.data, WIDGET(it), l->data);
1925 res = eina_list_append(res, ic);
1926 edje_object_part_swallow(target, key, ic);
1927 evas_object_show(ic);
1928 elm_widget_sub_object_add(WIDGET(it), ic);
1929 if (it->mode_view || it->wd->edit_mode)
1931 if (elm_widget_item_disabled_get(it))
1932 elm_widget_disabled_set(ic, EINA_TRUE);
1934 else if (it->renamed)
1936 // FIXME: if entry calcuates its cursor position correctly and conformant works,
1937 // genlist does not need to handle this focus thing.
1938 evas_object_smart_callback_add(ic, "focused", _content_focused, it);
1939 evas_object_smart_callback_add(ic, "unfocused", _content_unfocused, it);
1949 _item_mode_content_unrealize(Elm_Gen_Item *it,
1950 Evas_Object *target,
1953 Eina_List **contents_list)
1955 Eina_List *res = *contents_list;
1957 if (it->itc->func.content_get)
1961 Evas_Object *ic = NULL;
1963 EINA_LIST_FOREACH(*source, l, key)
1965 if (parts && fnmatch(parts, key, FNM_PERIOD))
1968 ic = edje_object_part_swallow_get(target, key);
1971 res = eina_list_remove(res, ic);
1972 edje_object_part_unswallow(target, ic);
1973 evas_object_del(ic);
1982 _item_cache_free(Item_Cache *itc)
1984 if (itc->spacer) evas_object_del(itc->spacer);
1985 if (itc->base_view) evas_object_del(itc->base_view);
1986 eina_stringshare_del(itc->item_style);
1991 _item_text_realize(Elm_Gen_Item *it,
1992 Evas_Object *target,
1996 if (it->itc->func.text_get)
2001 *source = elm_widget_stringlist_get(edje_object_data_get(target, "texts"));
2002 EINA_LIST_FOREACH(*source, l, key)
2004 if (parts && fnmatch(parts, key, FNM_PERIOD))
2007 char *s = it->itc->func.text_get
2008 ((void *)it->base.data, WIDGET(it), key);
2012 edje_object_part_text_set(target, key, s);
2017 edje_object_part_text_set(target, key, "");
2024 _item_content_unrealize(Elm_Gen_Item *it,
2025 Evas_Object *target,
2029 Eina_List *res = it->content_objs;
2031 if (it->itc->func.content_get)
2035 Evas_Object *ic = NULL;
2037 EINA_LIST_FOREACH(*source, l, key)
2039 if (parts && fnmatch(parts, key, FNM_PERIOD))
2042 ic = edje_object_part_swallow_get(target, key);
2045 res = eina_list_remove(res, ic);
2046 edje_object_part_unswallow(target, ic);
2047 evas_object_del(ic);
2056 _item_content_realize(Elm_Gen_Item *it,
2057 Evas_Object *target,
2061 Eina_List *res = NULL;
2063 if (it->itc->func.content_get)
2067 Evas_Object *ic = NULL;
2069 *source = elm_widget_stringlist_get(edje_object_data_get(target, "contents"));
2071 if (parts && (eina_list_count(*source) != eina_list_count(it->content_objs)))
2072 res = it->content_objs;
2074 EINA_LIST_FOREACH(*source, l, key)
2076 if (parts && fnmatch(parts, key, FNM_PERIOD))
2079 if (it->itc->func.content_get)
2080 ic = it->itc->func.content_get
2081 ((void *)it->base.data, WIDGET(it), key);
2084 res = eina_list_append(res, ic);
2085 edje_object_part_swallow(target, key, ic);
2086 evas_object_show(ic);
2087 elm_widget_sub_object_add(WIDGET(it), ic);
2088 evas_object_event_callback_add(ic,
2089 EVAS_CALLBACK_CHANGED_SIZE_HINTS,
2090 _changed_size_hints, it);
2093 // FIXME: if entry calcuates its cursor position correctly and conformant works,
2094 // genlist does not need to handle this focus thing.
2095 evas_object_smart_callback_add(ic, "focused", _content_focused, it);
2096 evas_object_smart_callback_add(ic, "unfocused", _content_unfocused, it);
2099 if (elm_widget_item_disabled_get(it))
2100 elm_widget_disabled_set(ic, EINA_TRUE);
2109 _item_state_realize(Elm_Gen_Item *it,
2110 Evas_Object *target,
2114 if (it->itc->func.state_get)
2120 *source = elm_widget_stringlist_get(edje_object_data_get(target, "states"));
2121 EINA_LIST_FOREACH(*source, l, key)
2123 if (parts && fnmatch(parts, key, FNM_PERIOD))
2126 Eina_Bool on = it->itc->func.state_get
2127 ((void *)it->base.data, WIDGET(it), key);
2131 snprintf(buf, sizeof(buf), "elm,state,%s,active", key);
2132 edje_object_signal_emit(target, buf, "elm");
2136 snprintf(buf, sizeof(buf), "elm,state,%s,passive", key);
2137 edje_object_signal_emit(target, buf, "elm");
2144 _item_flips_realize(Elm_Gen_Item *it,
2145 Evas_Object *target,
2148 Eina_List *res = NULL;
2150 if (it->itc->func.content_get)
2154 Evas_Object *ic = NULL;
2156 *source = elm_widget_stringlist_get(edje_object_data_get(target, "flips"));
2158 EINA_LIST_FOREACH(*source, l, key)
2160 if (it->itc->func.content_get)
2161 ic = it->itc->func.content_get
2162 ((void *)it->base.data, WIDGET(it), key);
2165 res = eina_list_append(res, ic);
2166 edje_object_part_swallow(target, key, ic);
2167 evas_object_show(ic);
2168 elm_widget_sub_object_add(WIDGET(it), ic);
2169 // FIXME: if entry calcuates its cursor position correctly and conformant works,
2170 // genlist does not need to handle this focus thing.
2171 evas_object_smart_callback_add(ic, "focused", _content_focused, it);
2172 evas_object_smart_callback_add(ic, "unfocused", _content_unfocused, it);
2173 if (elm_widget_item_disabled_get(it))
2174 elm_widget_disabled_set(ic, EINA_TRUE);
2183 _item_realize(Elm_Gen_Item *it,
2187 const char *treesize;
2190 Item_Cache *itc = NULL;
2192 if (it->generation < it->wd->generation) return;
2193 //evas_event_freeze(evas_object_evas_get(it->wd->obj));
2196 if (it->item->order_num_in != in)
2198 it->item->order_num_in = in;
2199 _elm_genlist_item_odd_even_update(it);
2200 _elm_genlist_item_state_update(it, NULL);
2201 _elm_genlist_item_index_update(it);
2203 //evas_event_thaw(evas_object_evas_get(it->wd->obj));
2204 //evas_event_thaw_eval(evas_object_evas_get(it->wd->obj));
2207 it->item->order_num_in = in;
2208 if (it->wd->move_effect_mode == ELM_GENLIST_ITEM_MOVE_EFFECT_DELETE) calc = EINA_FALSE;
2210 if ((it->item->nocache_once) && (!it->flipped))
2211 it->item->nocache_once = EINA_FALSE;
2212 else if (!it->item->nocache)
2213 itc = _item_cache_find(it);
2214 if (itc && (!it->wd->tree_effect_enabled))
2216 VIEW(it) = itc->base_view;
2217 itc->base_view = NULL;
2218 it->spacer = itc->spacer;
2223 const char *stacking_even;
2224 const char *stacking;
2226 VIEW(it) = edje_object_add(evas_object_evas_get(WIDGET(it)));
2227 edje_object_scale_set(VIEW(it),
2228 elm_widget_scale_get(WIDGET(it)) *
2229 _elm_config->scale);
2230 evas_object_smart_member_add(VIEW(it), it->wd->pan_smart);
2231 elm_widget_sub_object_add(WIDGET(it), VIEW(it));
2233 if (it->item->type & ELM_GENLIST_ITEM_TREE)
2234 snprintf(buf, sizeof(buf), "tree%s/%s", it->wd->mode == ELM_LIST_COMPRESS ? "_compress" : "", it->itc->item_style ?: "default");
2236 snprintf(buf, sizeof(buf), "item%s/%s", it->wd->mode == ELM_LIST_COMPRESS ? "_compress" : "", it->itc->item_style ?: "default");
2238 _elm_theme_object_set(WIDGET(it), VIEW(it), "genlist", buf,
2239 elm_widget_style_get(WIDGET(it)));
2241 stacking_even = edje_object_data_get(VIEW(it), "stacking_even");
2242 if (!stacking_even) stacking_even = "above";
2243 it->item->stacking_even = !!strcmp("above", stacking_even);
2245 stacking = edje_object_data_get(VIEW(it), "stacking");
2246 if (!stacking) stacking = "yes";
2247 it->item->nostacking = !!strcmp("yes", stacking);
2249 edje_object_mirrored_set(VIEW(it),
2250 elm_widget_mirrored_get(WIDGET(it)));
2252 evas_object_rectangle_add(evas_object_evas_get(WIDGET(it)));
2253 evas_object_color_set(it->spacer, 0, 0, 0, 0);
2254 elm_widget_sub_object_add(WIDGET(it), it->spacer);
2257 _elm_genlist_item_odd_even_update(it);
2259 treesize = edje_object_data_get(VIEW(it), "treesize");
2260 if (treesize) tsize = atoi(treesize);
2261 evas_object_size_hint_min_set(it->spacer,
2262 (it->item->expanded_depth * tsize) * _elm_config->scale, 1);
2263 edje_object_part_swallow(VIEW(it), "elm.swallow.pad", it->spacer);
2266 edje_object_signal_callback_add(VIEW(it),
2267 "elm,action,expand,toggle",
2268 "elm", _signal_expand_toggle, it);
2269 edje_object_signal_callback_add(VIEW(it), "elm,action,expand",
2270 "elm", _signal_expand, it);
2271 edje_object_signal_callback_add(VIEW(it), "elm,action,contract",
2272 "elm", _signal_contract, it);
2273 evas_object_event_callback_add(VIEW(it), EVAS_CALLBACK_MOUSE_DOWN,
2275 evas_object_event_callback_add(VIEW(it), EVAS_CALLBACK_MOUSE_UP,
2277 evas_object_event_callback_add(VIEW(it), EVAS_CALLBACK_MOUSE_MOVE,
2279 evas_object_event_callback_add(VIEW(it), EVAS_CALLBACK_MULTI_DOWN,
2281 evas_object_event_callback_add(VIEW(it), EVAS_CALLBACK_MULTI_UP,
2283 evas_object_event_callback_add(VIEW(it), EVAS_CALLBACK_MULTI_MOVE,
2286 if ((it->wd->decorate_mode) && (!it->edit_obj) &&
2287 (it->item->type != ELM_GENLIST_ITEM_GROUP) && (it->itc->edit_item_style))
2288 _decorate_mode_item_realize(it, EINA_FALSE);
2290 _elm_genlist_item_state_update(it, itc);
2291 _elm_genlist_item_index_update(it);
2294 if ((calc) && (it->wd->homogeneous) &&
2295 ((it->wd->item_width) ||
2296 ((it->wd->item_width) && (it->wd->group_item_width))))
2298 /* homogenous genlist shortcut */
2299 if (!it->item->mincalcd)
2303 it->item->w = it->item->minw = it->wd->group_item_width;
2304 it->item->h = it->item->minh = it->wd->group_item_height;
2308 it->item->w = it->item->minw = it->wd->item_width;
2309 it->item->h = it->item->minh = it->wd->item_height;
2311 it->item->mincalcd = EINA_TRUE;
2316 /* FIXME: If you see that assert, please notify us and we
2317 will clean our mess */
2318 assert(eina_list_count(it->content_objs) == 0);
2320 _item_text_realize(it, VIEW(it), &it->texts, NULL);
2321 it->content_objs = _item_content_realize(it, VIEW(it), &it->contents, NULL);
2322 _item_state_realize(it, VIEW(it), &it->states, NULL);
2325 edje_object_signal_emit(VIEW(it), "elm,state,flip,enabled", "elm");
2326 it->content_objs = _item_flips_realize(it, VIEW(it), &it->contents);
2329 if (!it->item->mincalcd)
2331 Evas_Coord mw = -1, mh = -1;
2333 if (it->select_mode != ELM_OBJECT_SELECT_MODE_DISPLAY_ONLY)
2334 elm_coords_finger_size_adjust(1, &mw, 1, &mh);
2335 if (it->wd->mode == ELM_LIST_COMPRESS) mw = it->wd->prev_viewport_w;
2336 edje_object_size_min_restricted_calc(VIEW(it), &mw, &mh, mw,
2338 if (it->select_mode != ELM_OBJECT_SELECT_MODE_DISPLAY_ONLY)
2339 elm_coords_finger_size_adjust(1, &mw, 1, &mh);
2340 it->item->w = it->item->minw = mw;
2341 it->item->h = it->item->minh = mh;
2342 it->item->mincalcd = EINA_TRUE;
2344 if ((!it->wd->group_item_width) && (it->group))
2346 it->wd->group_item_width = mw;
2347 it->wd->group_item_height = mh;
2349 else if ((!it->wd->item_width) && (it->item->type == ELM_GENLIST_ITEM_NONE))
2351 it->wd->item_width = mw;
2352 it->wd->item_height = mh;
2355 if (!calc) evas_object_show(VIEW(it));
2358 if (it->tooltip.content_cb)
2360 elm_widget_item_tooltip_content_cb_set(it,
2361 it->tooltip.content_cb,
2362 it->tooltip.data, NULL);
2363 elm_widget_item_tooltip_style_set(it, it->tooltip.style);
2364 elm_widget_item_tooltip_window_mode_set(it, it->tooltip.free_size);
2367 if (it->mouse_cursor)
2368 elm_widget_item_cursor_set(it, it->mouse_cursor);
2370 it->realized = EINA_TRUE;
2371 it->want_unrealize = EINA_FALSE;
2373 if (itc) _item_cache_free(itc);
2374 //evas_event_thaw(evas_object_evas_get(it->wd->obj));
2375 //evas_event_thaw_eval(evas_object_evas_get(it->wd->obj));
2377 evas_object_smart_callback_call(WIDGET(it), SIG_REALIZED, it);
2379 if ((!calc) && (it->wd->decorate_mode) && (it->item->type != ELM_GENLIST_ITEM_GROUP))
2381 if (it->itc->edit_item_style)
2383 if (!it->edit_obj) _decorate_mode_item_realize(it, EINA_FALSE);
2384 edje_object_message_signal_process(it->edit_obj);
2387 edje_object_message_signal_process(VIEW(it));
2391 _item_unrealize_cb(Elm_Gen_Item *it)
2393 if (it->item->nocache_once || it->item->nocache)
2395 evas_object_del(VIEW(it));
2397 evas_object_del(it->spacer);
2402 edje_object_mirrored_set(VIEW(it),
2403 elm_widget_mirrored_get(WIDGET(it)));
2404 edje_object_scale_set(VIEW(it),
2405 elm_widget_scale_get(WIDGET(it))
2406 * _elm_config->scale);
2407 _item_cache_add(it);
2410 _mode_item_unrealize(it);
2412 it->realized = EINA_FALSE;
2413 it->want_unrealize = EINA_FALSE;
2414 if (it->wd->decorate_mode) _decorate_mode_item_unrealize(it);
2418 _item_block_recalc(Item_Block *itb,
2424 Evas_Coord minw = 0, minh = 0;
2425 Eina_Bool showme = EINA_FALSE, changed = EINA_FALSE;
2428 //evas_event_freeze(evas_object_evas_get(itb->wd->obj));
2430 EINA_LIST_FOREACH(itb->items, l, it)
2432 if (it->generation < it->wd->generation) continue;
2433 showme |= it->item->showme;
2438 if (!it->item->mincalcd) changed = EINA_TRUE;
2441 _item_realize(it, in, EINA_TRUE);
2442 _elm_genlist_item_unrealize(it, EINA_TRUE);
2447 _item_realize(it, in, EINA_TRUE);
2448 _elm_genlist_item_unrealize(it, EINA_TRUE);
2452 _item_realize(it, in, EINA_FALSE);
2453 minh += it->item->minh;
2454 if (minw < it->item->minw) minw = it->item->minw;
2462 itb->changed = EINA_FALSE;
2463 itb->position_update = EINA_FALSE;
2464 //evas_event_thaw(evas_object_evas_get(itb->wd->obj));
2465 //evas_event_thaw_eval(evas_object_evas_get(itb->wd->obj));
2470 _item_block_realize(Item_Block *itb)
2472 if (itb->realized) return;
2473 itb->realized = EINA_TRUE;
2474 itb->want_unrealize = EINA_FALSE;
2478 _item_block_unrealize(Item_Block *itb)
2482 Eina_Bool dragging = EINA_FALSE;
2484 if (!itb->realized) return;
2485 evas_event_freeze(evas_object_evas_get(itb->wd->obj));
2486 EINA_LIST_FOREACH(itb->items, l, it)
2488 if (itb->must_recalc || !it->group)
2492 dragging = EINA_TRUE;
2493 it->want_unrealize = EINA_TRUE;
2496 _elm_genlist_item_unrealize(it, EINA_FALSE);
2501 itb->realized = EINA_FALSE;
2502 itb->want_unrealize = EINA_TRUE;
2505 itb->want_unrealize = EINA_FALSE;
2506 evas_event_thaw(evas_object_evas_get(itb->wd->obj));
2507 evas_event_thaw_eval(evas_object_evas_get(itb->wd->obj));
2511 _get_space_for_reorder_item(Elm_Gen_Item *it)
2513 Evas_Coord rox, roy, row, roh, oy, oh;
2514 Eina_Bool top = EINA_FALSE;
2515 Elm_Gen_Item *reorder_it = it->wd->reorder_it;
2516 if (!reorder_it) return 0;
2518 evas_object_geometry_get(it->wd->pan_smart, NULL, &oy, NULL, &oh);
2519 evas_object_geometry_get(it->wd->VIEW(reorder_it), &rox, &roy, &row, &roh);
2521 if ((it->wd->reorder_start_y < it->item->block->y) &&
2522 (roy - oy + (roh / 2) >= it->item->block->y - it->wd->pan_y))
2524 it->item->block->reorder_offset = it->wd->reorder_it->item->h * -1;
2525 if (it->item->block->count == 1)
2526 it->wd->reorder_rel = it;
2528 else if ((it->wd->reorder_start_y >= it->item->block->y) &&
2529 (roy - oy + (roh / 2) <= it->item->block->y - it->wd->pan_y))
2531 it->item->block->reorder_offset = it->wd->reorder_it->item->h;
2534 it->item->block->reorder_offset = 0;
2536 it->item->scrl_y += it->item->block->reorder_offset;
2538 top = (ELM_RECTS_INTERSECT(it->item->scrl_x, it->item->scrl_y, it->item->w, it->item->h,
2539 rox, roy + (roh / 2), row, 1));
2542 it->wd->reorder_rel = it;
2543 it->item->scrl_y += it->wd->reorder_it->item->h;
2544 return it->wd->reorder_it->item->h;
2551 _reorder_move_animator_cb(void *data)
2553 Elm_Gen_Item *it = data;
2554 Eina_Bool down = EINA_FALSE;
2556 int y, dy = it->item->h / 10 * _elm_config->scale, diff;
2558 t = ((0.0 > (t = ecore_loop_time_get()-it->wd->start_time)) ? 0.0 : t);
2560 if (t <= REORDER_EFFECT_TIME) y = (1 * sin((t / REORDER_EFFECT_TIME) * (M_PI / 2)) * dy);
2563 diff = abs(it->item->old_scrl_y - it->item->scrl_y);
2564 if (diff > it->item->h) y = diff / 2;
2566 if (it->item->old_scrl_y < it->item->scrl_y)
2568 it->item->old_scrl_y += y;
2571 else if (it->item->old_scrl_y > it->item->scrl_y)
2573 it->item->old_scrl_y -= y;
2578 _item_position(it, it->edit_obj, it->item->scrl_x, it->item->old_scrl_y);
2580 _item_position(it, VIEW(it), it->item->scrl_x, it->item->old_scrl_y);
2581 //FIXME : group raise
2583 _group_items_recalc(it->wd);
2586 if ((it->wd->reorder_pan_move) ||
2587 (down && it->item->old_scrl_y >= it->item->scrl_y) ||
2588 (!down && it->item->old_scrl_y <= it->item->scrl_y))
2590 it->item->old_scrl_y = it->item->scrl_y;
2591 it->item->move_effect_enabled = EINA_FALSE;
2592 it->wd->reorder_move_animator = NULL;
2593 return ECORE_CALLBACK_CANCEL;
2595 return ECORE_CALLBACK_RENEW;
2599 _item_position(Elm_Gen_Item *it,
2607 evas_event_freeze(evas_object_evas_get(it->wd->obj));
2608 evas_object_resize(view, it->item->w, it->item->h);
2609 evas_object_move(view, it_x, it_y);
2610 evas_object_show(view);
2611 evas_event_thaw(evas_object_evas_get(it->wd->obj));
2612 evas_event_thaw_eval(evas_object_evas_get(it->wd->obj));
2616 _item_block_position(Item_Block *itb,
2620 Elm_Genlist_Item *it;
2621 Evas_Coord y = 0, ox, oy, ow, oh, cvx, cvy, cvw, cvh;
2622 Evas_Coord minh = 0;
2625 evas_event_freeze(evas_object_evas_get(itb->wd->obj));
2626 evas_object_geometry_get(itb->wd->pan_smart, &ox, &oy, &ow, &oh);
2627 evas_output_viewport_get(evas_object_evas_get(itb->wd->obj), &cvx, &cvy,
2629 EINA_LIST_FOREACH(itb->items, l, it)
2631 if (it->generation < it->wd->generation) continue;
2632 else if (it->wd->reorder_it == it) continue;
2637 it->scrl_x = itb->x + it->x - it->wd->pan_x + ox;
2638 it->scrl_y = itb->y + it->y - it->wd->pan_y + oy;
2640 vis = (ELM_RECTS_INTERSECT(it->scrl_x, it->scrl_y, it->w, it->h,
2641 cvx, cvy, cvw, cvh));
2642 if ((itb->realized) && (!it->realized))
2644 if (vis) _item_realize(it, in, EINA_FALSE);
2650 if (it->wd->reorder_mode)
2651 y += _get_space_for_reorder_item(it);
2652 if ((it->wd->reorder_it) && (it->old_scrl_y != it->scrl_y))
2654 if (!it->move_effect_enabled)
2656 it->move_effect_enabled = EINA_TRUE;
2657 it->wd->reorder_move_animator =
2659 _reorder_move_animator_cb, it);
2662 if (!it->move_effect_enabled)
2663 if (!it->wd->effect_mode || it->wd->move_effect_mode == ELM_GENLIST_ITEM_MOVE_EFFECT_NONE || ((it->wd->move_effect_mode != ELM_GENLIST_ITEM_MOVE_EFFECT_DELETE) && it->parent == it->wd->expanded_item))
2665 if (it->wd->edit_mode && it->itc->edit_item_style)
2667 _item_position(it, it->edit_obj, it->scrl_x, it->scrl_y);
2671 if((!it->wd->effect_mode || it->wd->move_effect_mode == ELM_GENLIST_ITEM_MOVE_EFFECT_NONE) || ((it->wd->move_effect_mode != ELM_GENLIST_ITEM_MOVE_EFFECT_NONE) && (it->old_scrl_y == it->scrl_y)))
2674 _item_position(it, it->mode_view, it->scrl_x,
2677 _item_position(it, VIEW(it), it->scrl_x,
2682 evas_object_resize(VIEW(it), it->w, it->h);
2683 evas_object_move(VIEW(it), it->scrl_x, it->scrl_y);
2684 evas_object_hide(VIEW(it));
2691 if ((!it->dragging && (!it->wd->item_moving_effect_timer)) ||
2692 (it->wd->expanded_item && (it->wd->expanded_item->block != itb)))
2693 _item_unrealize(it, EINA_FALSE);
2697 if (!it->wd->effect_mode || it->wd->move_effect_mode == ELM_GENLIST_ITEM_MOVE_EFFECT_NONE || ((it->wd->move_effect_mode != ELM_GENLIST_ITEM_MOVE_EFFECT_DELETE) && it->parent == it->wd->expanded_item))
2699 it->old_scrl_y = it->scrl_y;
2704 if (!itb->wd->reorder_it) itb->minh = minh;
2705 evas_event_thaw(evas_object_evas_get(itb->wd->obj));
2706 evas_event_thaw_eval(evas_object_evas_get(itb->wd->obj));
2709 //FIXME : group raise
2712 _item_block_position(Item_Block *itb,
2718 Evas_Coord y = 0, ox, oy, ow, oh, cvx, cvy, cvw, cvh;
2719 Eina_Bool vis = EINA_FALSE;
2721 evas_event_freeze(evas_object_evas_get(itb->wd->obj));
2722 evas_object_geometry_get(itb->wd->pan_smart, &ox, &oy, &ow, &oh);
2723 evas_output_viewport_get(evas_object_evas_get(itb->wd->obj), &cvx, &cvy,
2725 EINA_LIST_FOREACH(itb->items, l, it)
2727 if (it->generation < it->wd->generation) continue;
2728 else if (it->wd->reorder_it == it) continue;
2731 it->item->w = itb->w;
2732 it->item->scrl_x = itb->x + it->x - it->wd->pan_x + ox;
2733 it->item->scrl_y = itb->y + it->y - it->wd->pan_y + oy;
2735 vis = (ELM_RECTS_INTERSECT(it->item->scrl_x, it->item->scrl_y, it->item->w, it->item->h,
2736 cvx, cvy, cvw, cvh));
2739 if ((itb->realized) && (!it->realized))
2741 if (vis) _item_realize(it, in, EINA_FALSE);
2745 if (vis || it->dragging)
2747 if (it->wd->reorder_mode)
2748 y += _get_space_for_reorder_item(it);
2749 git = it->item->group_item;
2752 if (git->item->scrl_y < oy)
2753 git->item->scrl_y = oy;
2754 if ((git->item->scrl_y + git->item->h) > (it->item->scrl_y + it->item->h))
2755 git->item->scrl_y = (it->item->scrl_y + it->item->h) - git->item->h;
2756 git->item->want_realize = EINA_TRUE;
2758 if ((it->wd->reorder_it) && (it->item->old_scrl_y != it->item->scrl_y))
2760 if (!it->item->move_effect_enabled)
2762 it->item->move_effect_enabled = EINA_TRUE;
2763 it->wd->reorder_move_animator =
2765 _reorder_move_animator_cb, it);
2768 if (!it->item->move_effect_enabled)
2770 if ((it->wd->decorate_mode) && (it->itc->edit_item_style))
2771 _decorate_mode_item_position(it, it->item->scrl_x,
2775 if (it->item->mode_view)
2776 _item_position(it, it->item->mode_view,
2780 _item_position(it, VIEW(it), it->item->scrl_x,
2783 it->item->old_scrl_y = it->item->scrl_y;
2788 if (!it->wd->item_moving_effect_timer)
2789 _elm_genlist_item_unrealize(it, EINA_FALSE);
2796 if (vis) it->item->want_realize = EINA_TRUE;
2800 evas_event_thaw(evas_object_evas_get(itb->wd->obj));
2801 evas_event_thaw_eval(evas_object_evas_get(itb->wd->obj));
2806 _group_items_recalc(void *data)
2808 Widget_Data *wd = data;
2812 evas_event_freeze(evas_object_evas_get(wd->obj));
2813 EINA_LIST_FOREACH(wd->group_items, l, git)
2815 if (git->item->want_realize)
2818 _item_realize(git, 0, EINA_FALSE);
2819 evas_object_resize(VIEW(git), wd->minw, git->item->h);
2820 evas_object_move(VIEW(git), git->item->scrl_x, git->item->scrl_y);
2821 evas_object_show(VIEW(git));
2822 evas_object_raise(VIEW(git));
2824 else if (!git->item->want_realize && git->realized)
2827 _elm_genlist_item_unrealize(git, EINA_FALSE);
2830 evas_event_thaw(evas_object_evas_get(wd->obj));
2831 evas_event_thaw_eval(evas_object_evas_get(wd->obj));
2835 _changed_size_hints(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
2837 Elm_Genlist_Item *it = data;
2839 it->mincalcd = EINA_FALSE;
2840 it->block->changeme = EINA_TRUE;
2841 if (it->wd->changed_job) ecore_job_del(it->wd->changed_job);
2842 it->wd->changed_job = ecore_job_add(_changed_job, it->wd);
2846 _must_recalc_idler(void *data)
2848 Widget_Data *wd = data;
2849 if (wd->calc_job) ecore_job_del(wd->calc_job);
2850 wd->calc_job = ecore_job_add(_calc_job, wd);
2851 wd->must_recalc_idler = NULL;
2852 return ECORE_CALLBACK_CANCEL;
2856 _scroll_item(Widget_Data *wd)
2858 Elm_Gen_Item *it = NULL;
2859 Evas_Coord gith = 0;
2860 Evas_Coord ow, oh, dx = 0, dy = 0, dw = 0, dh = 0;
2861 if (!wd->show_item) return;
2863 evas_object_geometry_get(wd->pan_smart, NULL, NULL, &ow, &oh);
2865 dx = it->x + it->item->block->x;
2866 dy = it->y + it->item->block->y;
2867 dw = it->item->block->w;
2869 switch (wd->scrollto_type)
2871 case ELM_GENLIST_ITEM_SCROLLTO_TOP:
2872 //FIXME: group raise
2874 if (it->item->group_item) gith = it->item->group_item->item->h;
2878 case ELM_GENLIST_ITEM_SCROLLTO_MIDDLE:
2879 dy += (it->item->h / 2 - oh / 2);
2881 case ELM_GENLIST_ITEM_SCROLLTO_IN:
2883 if ((wd->expanded_item) &&
2884 ((wd->show_item->y + wd->show_item->item->block->y + wd->show_item->item->h)
2885 - (wd->expanded_item->y + wd->expanded_item->item->block->y) > oh))
2887 it = wd->expanded_item;
2888 dx = it->x + it->item->block->x;
2889 dy = it->y + it->item->block->y;
2890 //FIXME: group raise
2892 if (it->item->group_item) gith = it->item->group_item->item->h;
2893 dx = it->x + it->item->block->x;
2894 dy = it->y + it->item->block->y - gith;
2896 dw = it->item->block->w;
2900 //FIXME: group raise
2902 if ((it->item->group_item) && (wd->pan_y > (it->y + it->item->block->y)))
2903 gith = it->item->group_item->item->h;
2911 elm_smart_scroller_region_bring_in(wd->scr, dx, dy, dw, dh);
2913 elm_smart_scroller_child_region_show(wd->scr, dx, dy, dw, dh);
2915 it->item->showme = EINA_FALSE;
2916 wd->show_item = NULL;
2917 wd->auto_scroll_enabled = EINA_FALSE;
2918 wd->check_scroll = EINA_FALSE;
2922 _calc_job(void *data)
2924 Widget_Data *wd = data;
2925 Item_Block *itb, *chb = NULL;
2926 Evas_Coord minw = -1, minh = 0, y = 0, ow, dy = 0, vw;
2927 Evas_Coord pan_w = 0, pan_h = 0;
2929 Eina_Bool minw_change = EINA_FALSE;
2930 Eina_Bool did_must_recalc = EINA_FALSE;
2932 ELM_CHECK_WIDTYPE(wd->obj,widtype);
2934 evas_object_geometry_get(wd->pan_smart, NULL, NULL, &ow, &wd->h);
2935 elm_smart_scroller_child_viewport_size_get(wd->scr, &vw, NULL);
2940 evas_event_freeze(evas_object_evas_get(wd->obj));
2941 EINA_INLIST_FOREACH(wd->blocks, itb)
2943 Eina_Bool showme = EINA_FALSE;
2946 showme = itb->showme;
2947 itb->showme = EINA_FALSE;
2950 if (itb->realized) _item_block_unrealize(itb);
2952 if ((itb->changed) || ((itb->must_recalc) && (!did_must_recalc)))
2954 if (itb->must_recalc)
2958 EINA_LIST_FOREACH(itb->items, l, it)
2959 if (it->item->mincalcd) it->item->mincalcd = EINA_FALSE;
2960 itb->changed = EINA_TRUE;
2961 if (itb->must_recalc) did_must_recalc = EINA_TRUE;
2962 if (itb->realized) _item_block_unrealize(itb);
2963 itb->must_recalc = EINA_FALSE;
2965 showme = _item_block_recalc(itb, in, EINA_FALSE);
2971 if (minw == -1) minw = itb->minw;
2972 else if ((!itb->must_recalc) && (minw < itb->minw))
2975 minw_change = EINA_TRUE;
2980 minw_change = EINA_TRUE;
2986 if ((showme) && (wd->show_item) && (!wd->show_item->item->queued))
2987 wd->check_scroll = EINA_TRUE;
2991 EINA_INLIST_FOREACH(wd->blocks, itb)
2997 if ((chb) && (EINA_INLIST_GET(chb)->next))
2999 EINA_INLIST_FOREACH(EINA_INLIST_GET(chb)->next, itb)
3001 if (itb->realized) _item_block_unrealize(itb);
3004 wd->realminw = minw;
3005 if (minw < wd->w) minw = wd->w;
3006 if ((minw != wd->minw) || (minh != wd->minh))
3010 if (wd->move_effect_mode != ELM_GENLIST_ITEM_MOVE_EFFECT_DELETE)
3011 evas_object_smart_callback_call(wd->pan_smart, "changed", NULL);
3012 _sizing_eval(wd->obj);
3013 if ((wd->anchor_item) && (wd->anchor_item->item->block) && (!wd->auto_scroll_enabled))
3018 it = wd->anchor_item;
3019 it_y = wd->anchor_y;
3020 elm_smart_scroller_child_pos_set(wd->scr, wd->pan_x,
3021 it->item->block->y + it->y + it_y);
3022 wd->anchor_item = it;
3023 wd->anchor_y = it_y;
3026 if (did_must_recalc)
3028 if (!wd->must_recalc_idler)
3029 wd->must_recalc_idler = ecore_idler_add(_must_recalc_idler, wd);
3031 if (wd->check_scroll)
3033 _pan_child_size_get(wd->pan_smart, &pan_w, &pan_h);
3034 if (EINA_INLIST_GET(wd->show_item) == wd->items->last)
3035 wd->scrollto_type = ELM_GENLIST_ITEM_SCROLLTO_IN;
3036 switch (wd->scrollto_type)
3038 case ELM_GENLIST_ITEM_SCROLLTO_TOP:
3041 case ELM_GENLIST_ITEM_SCROLLTO_MIDDLE:
3044 case ELM_GENLIST_ITEM_SCROLLTO_IN:
3051 if ((pan_w > (wd->show_item->x + wd->show_item->block->x)) &&
3052 (pan_h > (wd->show_item->y + wd->show_item->block->y + dy)))
3058 wd->calc_job = NULL;
3059 evas_object_smart_changed(wd->pan_smart);
3060 evas_event_thaw(evas_object_evas_get(wd->obj));
3061 evas_event_thaw_eval(evas_object_evas_get(wd->obj));
3065 _update_job(void *data)
3067 Widget_Data *wd = data;
3071 Eina_Bool position = EINA_FALSE, recalc = EINA_FALSE;
3073 wd->update_job = NULL;
3076 evas_event_freeze(evas_object_evas_get(wd->obj));
3077 EINA_INLIST_FOREACH(wd->blocks, itb)
3079 Evas_Coord itminw, itminh;
3086 _item_block_position(itb, num);
3090 recalc = EINA_FALSE;
3091 EINA_LIST_FOREACH(itb->items, l2, it)
3093 if (it->item->updateme)
3095 itminw = it->item->minw;
3096 itminh = it->item->minh;
3100 _elm_genlist_item_unrealize(it, EINA_FALSE);
3101 _item_realize(it, num, EINA_FALSE);
3102 position = EINA_TRUE;
3106 _item_realize(it, num, EINA_TRUE);
3107 _elm_genlist_item_unrealize(it, EINA_TRUE);
3109 if ((it->item->minw != itminw) || (it->item->minh != itminh))
3111 it->updateme = EINA_FALSE;
3115 itb->updateme = EINA_FALSE;
3118 position = EINA_TRUE;
3119 itb->changed = EINA_TRUE;
3120 _item_block_recalc(itb, num0, EINA_FALSE);
3121 _item_block_position(itb, num0);
3126 if (wd->calc_job) ecore_job_del(wd->calc_job);
3127 wd->calc_job = ecore_job_add(_calc_job, wd);
3129 evas_event_thaw(evas_object_evas_get(wd->obj));
3130 evas_event_thaw_eval(evas_object_evas_get(wd->obj));
3134 _changed_job(void *data)
3136 Widget_Data *wd = data; Eina_List *l2;
3138 int num, num0, position = 0;
3139 Eina_Bool width_changed = EINA_FALSE, height_changed = EINA_FALSE;
3141 wd->changed_job = NULL;
3143 EINA_INLIST_FOREACH(wd->blocks, itb)
3145 Evas_Coord itminw, itminh;
3146 Elm_Genlist_Item *it;
3152 _item_block_position(itb, num);
3156 width_changed = height_changed = EINA_FALSE;
3157 EINA_LIST_FOREACH(itb->items, l2, it)
3159 if ((!it->mincalcd) && (it->realized))
3161 Evas_Coord mw = -1, mh = -1;
3165 if (it->wd->height_for_width) mw = it->wd->w;
3166 if (!it->display_only)
3167 elm_coords_finger_size_adjust(1, &mw, 1, &mh);
3168 if (it->wd->height_for_width) mw = it->wd->prev_viewport_w;
3169 edje_object_size_min_restricted_calc(VIEW(it), &mw, &mh, mw, mh);
3170 if (!it->display_only)
3171 elm_coords_finger_size_adjust(1, &mw, 1, &mh);
3173 width_changed = EINA_TRUE;
3176 it->w = it->minw = mw;
3177 it->h = it->minh = mh;
3178 it->mincalcd = EINA_TRUE;
3180 //if ((it->minw != itminw) || (it->minh != itminh))
3181 //if ((it->minh != itminh))
3183 if ((it->minw != itminw))
3184 width_changed = EINA_TRUE;
3185 if ((it->minh != itminh))
3186 height_changed = EINA_TRUE;
3188 if ((!it->wd->group_item_width) && (it->flags == ELM_GENLIST_ITEM_GROUP))
3190 it->wd->group_item_width = mw;
3191 it->wd->group_item_height = mh;
3193 else if ((!it->wd->item_width) && (it->flags == ELM_GENLIST_ITEM_NONE))
3195 it->wd->item_width = mw;
3196 it->wd->item_height = mh;
3201 itb->changeme = EINA_FALSE;
3202 // TODO: why this is separated.
3206 itb->changed = EINA_TRUE;
3207 _item_block_recalc(itb, num0, 0);
3208 _item_block_position(itb, num0);
3210 else if (width_changed)
3212 _item_block_position(itb, num0);
3217 if (wd->calc_job) ecore_job_del(wd->calc_job);
3218 wd->calc_job = ecore_job_add(_calc_job, wd);
3223 _pan_set(Evas_Object *obj,
3227 Pan *sd = evas_object_smart_data_get(obj);
3231 // Evas_Coord ow, oh;
3232 // evas_object_geometry_get(obj, NULL, NULL, &ow, &oh);
3233 // ow = sd->wd->minw - ow;
3234 // if (ow < 0) ow = 0;
3235 // oh = sd->wd->minh - oh;
3236 // if (oh < 0) oh = 0;
3237 // if (x < 0) x = 0;
3238 // if (y < 0) y = 0;
3239 // if (x > ow) x = ow;
3240 // if (y > oh) y = oh;
3241 if ((x == sd->wd->pan_x) && (y == sd->wd->pan_y)) return;
3245 EINA_INLIST_FOREACH(sd->wd->blocks, itb)
3247 if ((itb->y + itb->h) > y)
3252 EINA_LIST_FOREACH(itb->items, l2, it)
3254 if ((itb->y + it->y) >= y)
3256 sd->wd->anchor_item = it;
3257 sd->wd->anchor_y = -(itb->y + it->y - y);
3264 if (!sd->wd->reorder_move_animator) evas_object_smart_changed(obj);
3268 _pan_get(Evas_Object *obj,
3272 Pan *sd = evas_object_smart_data_get(obj);
3275 if (x) *x = sd->wd->pan_x;
3276 if (y) *y = sd->wd->pan_y;
3280 _pan_max_get(Evas_Object *obj,
3284 Pan *sd = evas_object_smart_data_get(obj);
3288 evas_object_geometry_get(obj, NULL, NULL, &ow, &oh);
3289 ow = sd->wd->minw - ow;
3291 oh = sd->wd->minh - oh;
3298 _pan_min_get(Evas_Object *obj __UNUSED__,
3307 _pan_child_size_get(Evas_Object *obj,
3311 Pan *sd = evas_object_smart_data_get(obj);
3314 if (w) *w = sd->wd->minw;
3315 if (h) *h = sd->wd->minh;
3319 _pan_add(Evas_Object *obj)
3322 Evas_Object_Smart_Clipped_Data *cd;
3325 cd = evas_object_smart_data_get(obj);
3328 sd->__clipped_data = *cd;
3330 evas_object_smart_data_set(obj, sd);
3334 _pan_del(Evas_Object *obj)
3336 Pan *sd = evas_object_smart_data_get(obj);
3341 ecore_job_del(sd->resize_job);
3342 sd->resize_job = NULL;
3348 _pan_resize_job(void *data)
3352 _sizing_eval(sd->wd->obj);
3353 sd->resize_job = NULL;
3357 _pan_resize(Evas_Object *obj,
3361 Pan *sd = evas_object_smart_data_get(obj);
3365 evas_object_geometry_get(obj, NULL, NULL, &ow, &oh);
3366 if ((ow == w) && (oh == h)) return;
3367 if ((sd->wd->mode == ELM_LIST_COMPRESS) && (ow != w))
3370 sd->wd->pan_resize = EINA_TRUE;
3371 if (sd->resize_job) ecore_job_del(sd->resize_job);
3372 sd->resize_job = ecore_job_add(_pan_resize_job, sd);
3374 sd->wd->pan_changed = EINA_TRUE;
3375 evas_object_smart_changed(obj);
3376 if (sd->wd->calc_job) ecore_job_del(sd->wd->calc_job);
3377 sd->wd->calc_job = NULL;
3381 _pan_calculate(Evas_Object *obj)
3383 Pan *sd = evas_object_smart_data_get(obj);
3385 Evas_Coord ox, oy, ow, oh, cvx, cvy, cvw, cvh;
3391 evas_event_freeze(evas_object_evas_get(obj));
3393 if (sd->wd->pan_changed)
3396 sd->wd->pan_changed = EINA_FALSE;
3399 evas_object_geometry_get(obj, &ox, &oy, &ow, &oh);
3400 sd->wd->prev_viewport_w = ow;
3401 evas_output_viewport_get(evas_object_evas_get(obj), &cvx, &cvy, &cvw, &cvh);
3402 //FIXME: group raise
3404 EINA_LIST_FOREACH(sd->wd->group_items, l, git)
3406 git->item->want_realize = EINA_FALSE;
3409 EINA_INLIST_FOREACH(sd->wd->blocks, itb)
3411 itb->w = sd->wd->minw;
3412 if (ELM_RECTS_INTERSECT(itb->x - sd->wd->pan_x + ox,
3413 itb->y - sd->wd->pan_y + oy,
3415 cvx, cvy, cvw, cvh))
3417 if ((!itb->realized) || (itb->changed))
3419 _item_block_realize(itb);
3421 if (sd->wd->calc_job) ecore_job_del(sd->wd->calc_job);
3422 sd->wd->calc_job = NULL;
3425 _item_block_position(itb, in);
3429 if (itb->realized) _item_block_unrealize(itb);
3433 //FIXME: group raise
3435 if ((!sd->wd->reorder_it) || (sd->wd->reorder_pan_move))
3436 _group_items_recalc(sd->wd);
3438 if ((sd->wd->reorder_mode) && (sd->wd->reorder_it))
3440 if (sd->wd->pan_y != sd->wd->reorder_old_pan_y)
3441 sd->wd->reorder_pan_move = EINA_TRUE;
3442 else sd->wd->reorder_pan_move = EINA_FALSE;
3443 evas_object_raise(sd->wd->VIEW(reorder_it));
3444 sd->wd->reorder_old_pan_y = sd->wd->pan_y;
3445 sd->wd->start_time = ecore_loop_time_get();
3448 if (sd->wd->tree_effect_enabled && (sd->wd->move_effect_mode != ELM_GENLIST_TREE_EFFECT_NONE))
3450 if (!sd->wd->item_moving_effect_timer)
3452 _item_tree_effect_before(sd->wd->expanded_item);
3453 evas_object_raise(sd->wd->alpha_bg);
3454 evas_object_show(sd->wd->alpha_bg);
3455 sd->wd->start_time = ecore_time_get();
3456 sd->wd->item_moving_effect_timer = ecore_animator_add(_item_moving_effect_timer_cb, sd->wd);
3460 _item_auto_scroll(sd->wd);
3461 sd->wd->pan_resize = EINA_FALSE;
3462 evas_event_thaw(evas_object_evas_get(obj));
3463 evas_event_thaw_eval(evas_object_evas_get(obj));
3467 _pan_move(Evas_Object *obj,
3468 Evas_Coord x __UNUSED__,
3469 Evas_Coord y __UNUSED__)
3471 Pan *sd = evas_object_smart_data_get(obj);
3475 sd->wd->pan_changed = EINA_TRUE;
3476 evas_object_smart_changed(obj);
3477 if (sd->wd->calc_job) ecore_job_del(sd->wd->calc_job);
3478 sd->wd->calc_job = NULL;
3482 _hold_on(void *data __UNUSED__,
3484 void *event_info __UNUSED__)
3486 Widget_Data *wd = elm_widget_data_get(obj);
3488 elm_smart_scroller_hold_set(wd->scr, 1);
3492 _hold_off(void *data __UNUSED__,
3494 void *event_info __UNUSED__)
3496 Widget_Data *wd = elm_widget_data_get(obj);
3498 elm_smart_scroller_hold_set(wd->scr, 0);
3502 _freeze_on(void *data __UNUSED__,
3504 void *event_info __UNUSED__)
3506 Widget_Data *wd = elm_widget_data_get(obj);
3508 elm_smart_scroller_freeze_set(wd->scr, 1);
3512 _freeze_off(void *data __UNUSED__,
3514 void *event_info __UNUSED__)
3516 Widget_Data *wd = elm_widget_data_get(obj);
3518 elm_smart_scroller_freeze_set(wd->scr, 0);
3522 _scr_anim_start(void *data,
3523 Evas_Object *obj __UNUSED__,
3524 void *event_info __UNUSED__)
3526 evas_object_smart_callback_call(data, SIG_SCROLL_ANIM_START, NULL);
3530 _scr_anim_stop(void *data,
3531 Evas_Object *obj __UNUSED__,
3532 void *event_info __UNUSED__)
3534 evas_object_smart_callback_call(data, SIG_SCROLL_ANIM_STOP, NULL);
3538 _scr_drag_start(void *data,
3539 Evas_Object *obj __UNUSED__,
3540 void *event_info __UNUSED__)
3542 evas_object_smart_callback_call(data, SIG_SCROLL_DRAG_START, NULL);
3546 _scr_drag_stop(void *data,
3547 Evas_Object *obj __UNUSED__,
3548 void *event_info __UNUSED__)
3550 evas_object_smart_callback_call(data, SIG_SCROLL_DRAG_STOP, NULL);
3554 _edge_left(void *data,
3555 Evas_Object *scr __UNUSED__,
3556 void *event_info __UNUSED__)
3558 Evas_Object *obj = data;
3559 evas_object_smart_callback_call(obj, SIG_EDGE_LEFT, NULL);
3563 _edge_right(void *data,
3564 Evas_Object *scr __UNUSED__,
3565 void *event_info __UNUSED__)
3567 Evas_Object *obj = data;
3568 evas_object_smart_callback_call(obj, SIG_EDGE_RIGHT, NULL);
3572 _edge_top(void *data,
3573 Evas_Object *scr __UNUSED__,
3574 void *event_info __UNUSED__)
3576 Evas_Object *obj = data;
3577 evas_object_smart_callback_call(obj, SIG_EDGE_TOP, NULL);
3581 _edge_bottom(void *data,
3582 Evas_Object *scr __UNUSED__,
3583 void *event_info __UNUSED__)
3585 Evas_Object *obj = data;
3586 evas_object_smart_callback_call(obj, SIG_EDGE_BOTTOM, NULL);
3590 _mode_item_realize(Elm_Gen_Item *it)
3594 if ((it->item->mode_view) || (it->generation < it->wd->generation)) return;
3596 evas_event_freeze(evas_object_evas_get(it->wd->obj));
3597 it->item->mode_view = edje_object_add(evas_object_evas_get(WIDGET(it)));
3598 edje_object_scale_set(it->item->mode_view,
3599 elm_widget_scale_get(WIDGET(it)) *
3600 _elm_config->scale);
3601 evas_object_smart_member_add(it->item->mode_view, it->wd->pan_smart);
3602 elm_widget_sub_object_add(WIDGET(it), it->item->mode_view);
3604 strncpy(buf, "item", sizeof(buf));
3605 if (it->wd->mode == ELM_LIST_COMPRESS)
3606 strncat(buf, "_compress", sizeof(buf) - strlen(buf));
3608 if (it->item->order_num_in & 0x1) strncat(buf, "_odd", sizeof(buf) - strlen(buf));
3609 strncat(buf, "/", sizeof(buf) - strlen(buf));
3610 strncat(buf, it->itc->mode_item_style, sizeof(buf) - strlen(buf));
3612 _elm_theme_object_set(WIDGET(it), it->item->mode_view, "genlist", buf,
3613 elm_widget_style_get(WIDGET(it)));
3614 edje_object_mirrored_set(it->item->mode_view,
3615 elm_widget_mirrored_get(WIDGET(it)));
3617 /* signal callback add */
3618 evas_object_event_callback_add(it->item->mode_view, EVAS_CALLBACK_MOUSE_DOWN,
3620 evas_object_event_callback_add(it->item->mode_view, EVAS_CALLBACK_MOUSE_UP,
3622 evas_object_event_callback_add(it->item->mode_view, EVAS_CALLBACK_MOUSE_MOVE,
3625 /* text_get, content_get, state_get */
3626 /* FIXME: If you see that assert, please notify us and we
3627 will clean our mess */
3628 assert(eina_list_count(it->item->mode_content_objs) == 0);
3630 _item_text_realize(it, it->item->mode_view, &it->item->mode_texts, NULL);
3631 it->item->mode_content_objs =
3632 _item_content_realize(it, it->item->mode_view,
3633 &it->item->mode_contents, NULL);
3634 _item_state_realize(it, it->item->mode_view, &it->item->mode_states, NULL);
3636 edje_object_part_swallow(it->item->mode_view,
3637 edje_object_data_get(it->item->mode_view, "mode_part"),
3640 it->want_unrealize = EINA_FALSE;
3641 evas_event_thaw(evas_object_evas_get(it->wd->obj));
3642 evas_event_thaw_eval(evas_object_evas_get(it->wd->obj));
3646 _mode_item_unrealize(Elm_Gen_Item *it)
3648 Widget_Data *wd = it->wd;
3649 Evas_Object *content;
3650 if (!it->item->mode_view) return;
3652 evas_event_freeze(evas_object_evas_get(it->wd->obj));
3653 elm_widget_stringlist_free(it->item->mode_texts);
3654 it->item->mode_texts = NULL;
3655 elm_widget_stringlist_free(it->item->mode_contents);
3656 it->item->mode_contents = NULL;
3657 elm_widget_stringlist_free(it->item->mode_states);
3659 EINA_LIST_FREE(it->item->mode_content_objs, content)
3660 evas_object_del(content);
3662 edje_object_part_unswallow(it->item->mode_view, VIEW(it));
3663 evas_object_smart_member_add(VIEW(it), wd->pan_smart);
3664 evas_object_del(it->item->mode_view);
3665 it->item->mode_view = NULL;
3667 if (wd->mode_item == it)
3668 wd->mode_item = NULL;
3669 evas_event_thaw(evas_object_evas_get(it->wd->obj));
3670 evas_event_thaw_eval(evas_object_evas_get(it->wd->obj));
3674 _item_mode_set(Elm_Gen_Item *it)
3677 Widget_Data *wd = it->wd;
3682 it->item->nocache_once = EINA_TRUE;
3684 if (wd->scr_hold_timer)
3686 ecore_timer_del(wd->scr_hold_timer);
3687 wd->scr_hold_timer = NULL;
3689 elm_smart_scroller_hold_set(wd->scr, EINA_TRUE);
3690 wd->scr_hold_timer = ecore_timer_add(0.1, _scr_hold_timer_cb, wd);
3692 evas_event_freeze(evas_object_evas_get(it->wd->obj));
3693 _mode_item_realize(it);
3694 if (it->item->group_item)
3695 evas_object_raise(it->item->VIEW(group_item));
3696 _item_position(it, it->item->mode_view, it->item->scrl_x, it->item->scrl_y);
3697 evas_event_thaw(evas_object_evas_get(it->wd->obj));
3698 evas_event_thaw_eval(evas_object_evas_get(it->wd->obj));
3700 snprintf(buf, sizeof(buf), "elm,state,%s,active", wd->mode_type);
3701 edje_object_signal_emit(it->item->mode_view, buf, "elm");
3705 _item_mode_unset(Widget_Data *wd)
3708 if (!wd->mode_item) return;
3709 char buf[1024], buf2[1024];
3713 it->item->nocache_once = EINA_TRUE;
3715 snprintf(buf, sizeof(buf), "elm,state,%s,passive", wd->mode_type);
3716 snprintf(buf2, sizeof(buf2), "elm,state,%s,passive,finished", wd->mode_type);
3718 edje_object_signal_emit(it->item->mode_view, buf, "elm");
3719 edje_object_signal_callback_add(it->item->mode_view, buf2, "elm", _mode_finished_signal_cb, it);
3721 wd->mode_item = NULL;
3725 _decorate_mode_item_position(Elm_Gen_Item *it, int itx, int ity)
3727 if ((!it) || (!it->wd->decorate_mode)) return;
3728 evas_object_resize(it->edit_obj, it->item->w, it->item->h);
3729 evas_object_move(it->edit_obj, itx, ity);
3733 _decorate_mode_item_realize(Elm_Gen_Item *it, Eina_Bool effect_on)
3736 const char *stacking_even;
3737 const char *stacking;
3739 if ((!it) || (it->item->decorate_mode_item_realized) ||
3740 (it->generation < it->wd->generation))
3743 it->edit_obj = edje_object_add(evas_object_evas_get(WIDGET(it)));
3744 edje_object_scale_set(it->edit_obj, elm_widget_scale_get(WIDGET(it)) *
3745 _elm_config->scale);
3746 evas_object_smart_member_add(it->edit_obj, it->wd->pan_smart);
3747 elm_widget_sub_object_add(WIDGET(it), it->edit_obj);
3749 if (it->item->type & ELM_GENLIST_ITEM_TREE)
3750 strncpy(buf, "tree", sizeof(buf));
3751 else strncpy(buf, "item", sizeof(buf));
3752 if (it->wd->mode == ELM_LIST_COMPRESS)
3753 strncat(buf, "_compress", sizeof(buf) - strlen(buf));
3755 strncat(buf, "/", sizeof(buf) - strlen(buf));
3756 strncat(buf, it->itc->edit_item_style, sizeof(buf) - strlen(buf));
3758 _elm_theme_object_set(WIDGET(it), it->edit_obj, "genlist", buf,
3759 elm_widget_style_get(WIDGET(it)));
3761 stacking_even = edje_object_data_get(VIEW(it), "stacking_even");
3762 if (!stacking_even) stacking_even = "above";
3763 it->item->stacking_even = !!strcmp("above", stacking_even);
3765 stacking = edje_object_data_get(VIEW(it), "stacking");
3766 if (!stacking) stacking = "yes";
3767 it->item->nostacking = !!strcmp("yes", stacking);
3769 edje_object_mirrored_set(it->edit_obj,
3770 elm_widget_mirrored_get(WIDGET(it)));
3772 _elm_genlist_item_odd_even_update(it);
3773 _elm_genlist_item_state_update(it, NULL);
3775 if (effect_on) edje_object_signal_emit(it->edit_obj, "elm,state,edit,enabled,effect", "elm");
3776 else edje_object_signal_emit(it->edit_obj, "elm,state,edit,enabled", "elm");
3778 evas_object_event_callback_add(it->edit_obj, EVAS_CALLBACK_MOUSE_DOWN,
3780 evas_object_event_callback_add(it->edit_obj, EVAS_CALLBACK_MOUSE_UP,
3782 evas_object_event_callback_add(it->edit_obj, EVAS_CALLBACK_MOUSE_MOVE,
3784 evas_object_event_callback_add(it->edit_obj, EVAS_CALLBACK_MULTI_DOWN,
3786 evas_object_event_callback_add(it->edit_obj, EVAS_CALLBACK_MULTI_UP,
3788 evas_object_event_callback_add(it->edit_obj, EVAS_CALLBACK_MULTI_MOVE,
3791 _item_text_realize(it, it->edit_obj, &it->item->edit_texts, NULL);
3792 if (it->flipped) edje_object_signal_emit(it->edit_obj, "elm,state,flip,enabled", "elm");
3793 it->item->edit_content_objs =
3794 _item_content_realize(it, it->edit_obj, &it->item->edit_contents, NULL);
3795 _item_state_realize(it, it->edit_obj, &it->item->edit_states, NULL);
3796 edje_object_part_swallow(it->edit_obj, "elm.swallow.edit.content", VIEW(it));
3798 _decorate_mode_item_position(it, it->item->scrl_x, it->item->scrl_y);
3799 evas_object_show(it->edit_obj);
3801 it->item->decorate_mode_item_realized = EINA_TRUE;
3802 it->want_unrealize = EINA_FALSE;
3806 _decorate_mode_item_unrealize(Elm_Gen_Item *it)
3809 if ((!it) || (!it->item->decorate_mode_item_realized)) return;
3811 edje_object_part_unswallow(it->edit_obj, VIEW(it));
3812 evas_object_smart_member_add(VIEW(it), it->wd->pan_smart);
3813 elm_widget_sub_object_add(WIDGET(it), VIEW(it));
3814 _elm_genlist_item_odd_even_update(it);
3815 _elm_genlist_item_state_update(it, NULL);
3817 evas_object_del(it->edit_obj);
3818 it->edit_obj = NULL;
3819 elm_widget_stringlist_free(it->item->edit_texts);
3820 it->item->edit_texts = NULL;
3821 elm_widget_stringlist_free(it->item->edit_contents);
3822 it->item->edit_contents = NULL;
3823 elm_widget_stringlist_free(it->item->edit_states);
3824 it->item->edit_states = NULL;
3825 EINA_LIST_FREE(it->item->edit_content_objs, icon)
3826 evas_object_del(icon);
3827 edje_object_message_signal_process(it->edit_obj);
3829 evas_object_event_callback_del_full(it->edit_obj, EVAS_CALLBACK_MOUSE_DOWN,
3831 evas_object_event_callback_del_full(it->edit_obj, EVAS_CALLBACK_MOUSE_UP,
3833 evas_object_event_callback_del_full(it->edit_obj, EVAS_CALLBACK_MOUSE_MOVE,
3835 evas_object_event_callback_del_full(it->edit_obj, EVAS_CALLBACK_MULTI_DOWN,
3837 evas_object_event_callback_del_full(it->edit_obj, EVAS_CALLBACK_MULTI_UP,
3839 evas_object_event_callback_del_full(it->edit_obj, EVAS_CALLBACK_MULTI_MOVE,
3841 it->item->decorate_mode_item_realized = EINA_FALSE;
3845 _item_auto_scroll(Widget_Data *wd)
3848 Elm_Gen_Item *tmp_item = NULL;
3850 if ((wd->expanded_item) && (wd->auto_scroll_enabled))
3852 tmp_item = eina_list_data_get(eina_list_last(wd->expanded_item->item->items));
3853 if (!tmp_item) return;
3854 wd->show_item = tmp_item;
3855 wd->bring_in = EINA_TRUE;
3856 wd->scrollto_type = ELM_GENLIST_ITEM_SCROLLTO_IN;
3857 if ((wd->show_item->item->queued) || (!wd->show_item->item->mincalcd))
3859 wd->show_item->item->showme = EINA_TRUE;
3860 wd->auto_scroll_enabled = EINA_FALSE;
3868 elm_genlist_add(Evas_Object *parent)
3873 Evas_Coord minw, minh;
3874 static Evas_Smart *smart = NULL;
3878 static Evas_Smart_Class sc;
3880 evas_object_smart_clipped_smart_set(&_pan_sc);
3882 sc.name = "elm_genlist_pan";
3883 sc.version = EVAS_SMART_CLASS_VERSION;
3886 sc.resize = _pan_resize;
3887 sc.move = _pan_move;
3888 sc.calculate = _pan_calculate;
3889 if (!(smart = evas_smart_class_new(&sc))) return NULL;
3892 ELM_WIDGET_STANDARD_SETUP(wd, Widget_Data, parent, e, obj, NULL);
3894 ELM_SET_WIDTYPE(widtype, "genlist");
3896 elm_widget_type_set(obj, "genlist");
3897 elm_widget_sub_object_add(parent, obj);
3898 elm_widget_on_focus_hook_set(obj, _on_focus_hook, NULL);
3899 elm_widget_signal_emit_hook_set(obj, _signal_emit_hook);
3900 elm_widget_data_set(obj, wd);
3901 elm_widget_del_hook_set(obj, _del_hook);
3902 elm_widget_del_pre_hook_set(obj, _del_pre_hook);
3903 elm_widget_theme_hook_set(obj, _theme_hook);
3904 elm_widget_can_focus_set(obj, EINA_TRUE);
3905 elm_widget_event_hook_set(obj, _event_hook);
3906 elm_widget_on_show_region_hook_set(obj, _show_region_hook, obj);
3907 elm_widget_translate_hook_set(obj, _translate_hook);
3910 wd->scr = elm_smart_scroller_add(e);
3911 evas_object_event_callback_add(wd->scr, EVAS_CALLBACK_MOUSE_DOWN,
3912 _mouse_down_scroller, obj);
3913 evas_object_event_callback_add(wd->scr, EVAS_CALLBACK_MOUSE_UP,
3914 _mouse_up_scroller, obj);
3915 evas_object_event_callback_add(wd->scr, EVAS_CALLBACK_MOUSE_MOVE,
3916 _mouse_move_scroller, obj);
3917 elm_smart_scroller_widget_set(wd->scr, obj);
3918 elm_smart_scroller_object_theme_set(obj, wd->scr, "genlist", "base",
3919 elm_widget_style_get(obj));
3920 elm_smart_scroller_bounce_allow_set(wd->scr, EINA_FALSE,
3921 _elm_config->thumbscroll_bounce_enable);
3922 elm_widget_resize_object_set(obj, wd->scr);
3924 evas_object_smart_callback_add(wd->scr, "animate,start", _scr_anim_start, obj);
3925 evas_object_smart_callback_add(wd->scr, "animate,stop", _scr_anim_stop, obj);
3926 evas_object_smart_callback_add(wd->scr, "drag,start", _scr_drag_start, obj);
3927 evas_object_smart_callback_add(wd->scr, "drag,stop", _scr_drag_stop, obj);
3928 evas_object_smart_callback_add(wd->scr, "edge,left", _edge_left, obj);
3929 evas_object_smart_callback_add(wd->scr, "edge,right", _edge_right, obj);
3930 evas_object_smart_callback_add(wd->scr, "edge,top", _edge_top, obj);
3931 evas_object_smart_callback_add(wd->scr, "edge,bottom", _edge_bottom, obj);
3934 wd->mode = ELM_LIST_SCROLL;
3935 wd->max_items_per_block = MAX_ITEMS_PER_BLOCK;
3936 wd->item_cache_max = wd->max_items_per_block * 2;
3937 wd->longpress_timeout = _elm_config->longpress_timeout;
3938 wd->tree_effect_enabled = _elm_config->effect_enable;
3940 evas_object_smart_callback_add(obj, "scroll-hold-on", _hold_on, obj);
3941 evas_object_smart_callback_add(obj, "scroll-hold-off", _hold_off, obj);
3942 evas_object_smart_callback_add(obj, "scroll-freeze-on", _freeze_on, obj);
3943 evas_object_smart_callback_add(obj, "scroll-freeze-off", _freeze_off, obj);
3945 wd->pan_smart = evas_object_smart_add(e, smart);
3946 wd->pan = evas_object_smart_data_get(wd->pan_smart);
3949 elm_smart_scroller_extern_pan_set(wd->scr, wd->pan_smart,
3950 _pan_set, _pan_get, _pan_max_get,
3951 _pan_min_get, _pan_child_size_get);
3953 edje_object_size_min_calc(elm_smart_scroller_edje_object_get(wd->scr),
3955 evas_object_size_hint_min_set(obj, minw, minh);
3957 evas_object_smart_callbacks_descriptions_set(obj, _signals);
3959 _mirrored_set(obj, elm_widget_mirrored_get(obj));
3965 _item_select(Elm_Gen_Item *it)
3967 if ((it->generation < it->wd->generation) || (it->mode_set) ||
3968 (it->wd->select_mode == ELM_OBJECT_SELECT_MODE_NONE))
3972 it->selected = EINA_TRUE;
3973 it->wd->selected = eina_list_append(it->wd->selected, it);
3975 else if (it->wd->select_mode == ELM_OBJECT_SELECT_MODE_ALWAYS) return;
3977 evas_object_ref(WIDGET(it));
3980 if (it->wd->last_selected_item &&
3981 (it != (Elm_Genlist_Item *) it->wd->last_selected_item))
3983 EINA_LIST_FOREACH(((Elm_Genlist_Item *)it->wd->last_selected_item)->content_objs, l, obj)
3985 elm_widget_focused_object_clear(obj);
3986 elm_widget_tree_unfocusable_set(obj, EINA_TRUE);
3988 ((Elm_Genlist_Item *)it->wd->last_selected_item)->can_focus = EINA_FALSE;
3990 if (it->func.func) it->func.func((void *)it->func.data, WIDGET(it), it);
3991 if (it->generation == it->wd->generation)
3992 evas_object_smart_callback_call(WIDGET(it), SIG_SELECTED, it);
3995 evas_object_unref(WIDGET(it));
3996 if ((it->wd->clear_me) && (!it->wd->walking))
3997 _elm_genlist_clear(WIDGET(it), EINA_TRUE);
4000 if ((!it->walking) && (it->generation < it->wd->generation))
4005 elm_widget_item_free(it);
4009 it->wd->last_selected_item = (Elm_Object_Item *)it;
4013 static Evas_Object *
4014 _item_content_get_hook(Elm_Gen_Item *it, const char *part)
4016 return edje_object_part_swallow_get(VIEW(it), part);
4020 _item_content_set_hook(Elm_Gen_Item *it, const char *part, Evas_Object *content)
4022 if (content && part)
4024 it->content_objs = eina_list_append(it->content_objs, content);
4025 edje_object_part_swallow(VIEW(it), part, content);
4029 static Evas_Object *
4030 _item_content_unset_hook(Elm_Gen_Item *it, const char *part)
4033 obj = edje_object_part_swallow_get(VIEW(it), part);
4034 if (!obj) return NULL;
4035 it->content_objs = eina_list_remove(it->content_objs, obj);
4036 edje_object_part_unswallow(VIEW(it), obj);
4041 _item_text_hook(Elm_Gen_Item *it, const char *part)
4043 if (!it->itc->func.text_get) return NULL;
4044 return edje_object_part_text_get(VIEW(it), part);
4048 _item_disable_hook(Elm_Object_Item *it)
4050 ELM_OBJ_ITEM_CHECK_OR_RETURN(it);
4053 Elm_Gen_Item *_it = (Elm_Gen_Item *)it;
4055 if (_it->generation < _it->wd->generation) return;
4058 elm_genlist_item_selected_set(it, EINA_FALSE);
4062 if (elm_widget_item_disabled_get(it))
4064 edje_object_signal_emit(VIEW(_it), "elm,state,disabled", "elm");
4066 edje_object_signal_emit(_it->edit_obj, "elm,state,disabled", "elm");
4070 edje_object_signal_emit(VIEW(_it), "elm,state,enabled", "elm");
4072 edje_object_signal_emit(_it->edit_obj, "elm,state,enabled", "elm");
4074 EINA_LIST_FOREACH(_it->content_objs, l, obj)
4075 elm_widget_disabled_set(obj, elm_widget_item_disabled_get(_it));
4080 _item_del_pre_hook(Elm_Object_Item *it)
4082 ELM_OBJ_ITEM_CHECK_OR_RETURN(it, EINA_FALSE);
4083 Elm_Gen_Item *_it = (Elm_Gen_Item *)it;
4085 if ((_it->relcount > 0) || (_it->walking > 0))
4087 elm_genlist_item_subitems_clear(it);
4088 if (_it->wd->show_item == _it) _it->wd->show_item = NULL;
4089 _elm_genlist_item_del_notserious(_it);
4090 if (_it->item->block)
4092 if (_it->realized) _elm_genlist_item_unrealize(_it, EINA_FALSE);
4093 _it->item->block->changed = EINA_TRUE;
4094 if (_it->wd->calc_job) ecore_job_del(_it->wd->calc_job);
4095 _it->wd->calc_job = ecore_job_add(_calc_job, _it->wd);
4099 _it->parent->item->items =
4100 eina_list_remove(_it->parent->item->items, it);
4110 _elm_genlist_item_new(Widget_Data *wd,
4111 const Elm_Gen_Item_Class *itc,
4113 Elm_Gen_Item *parent,
4115 const void *func_data)
4119 it = elm_widget_item_new(wd->obj, Elm_Gen_Item);
4120 if (!it) return NULL;
4122 it->generation = wd->generation;
4124 elm_genlist_item_class_ref((Elm_Genlist_Item_Class *)itc);
4125 it->base.data = data;
4126 it->parent = parent;
4127 it->func.func = func;
4128 it->func.data = func_data;
4129 elm_widget_item_content_get_hook_set(it, _item_content_get_hook);
4130 elm_widget_item_content_set_hook_set(it, _item_content_set_hook);
4131 elm_widget_item_content_unset_hook_set(it, _item_content_unset_hook);
4132 elm_widget_item_text_get_hook_set(it, _item_text_hook);
4133 elm_widget_item_disable_hook_set(it, _item_disable_hook);
4134 elm_widget_item_del_pre_hook_set(it, _item_del_pre_hook);
4136 it->sel_cb = (Ecore_Cb)_item_select;
4141 static Elm_Gen_Item *
4142 _item_new(Widget_Data *wd,
4143 const Elm_Genlist_Item_Class *itc,
4145 Elm_Gen_Item *parent,
4146 Elm_Genlist_Item_Type type,
4148 const void *func_data)
4150 Elm_Gen_Item *it, *it2;
4153 it = _elm_genlist_item_new(wd, itc, data, parent, func, func_data);
4154 if (!it) return NULL;
4155 it->item = ELM_NEW(Elm_Gen_Item_Type);
4156 it->item->type = type;
4157 if (type & ELM_GENLIST_ITEM_GROUP) it->group++;
4158 it->mouse_cursor = NULL;
4159 it->item->expanded_depth = 0;
4160 ELM_GEN_ITEM_SETUP(it);
4161 it->can_focus = EINA_TRUE;
4164 if (it->parent->group)
4165 it->item->group_item = parent;
4166 else if (it->parent->item->group_item)
4167 it->item->group_item = it->parent->item->group_item;
4169 for (it2 = it, depth = 0; it2->parent; it2 = it2->parent)
4171 if (!it2->parent->group) depth += 1;
4173 it->item->expanded_depth = depth;
4179 _item_block_new(Widget_Data *wd, Eina_Bool prepend)
4183 itb = calloc(1, sizeof(Item_Block));
4184 if (!itb) return NULL;
4188 wd->blocks = eina_inlist_prepend(wd->blocks, EINA_INLIST_GET(itb));
4189 _item_block_position_update(wd->blocks, 0);
4193 wd->blocks = eina_inlist_append(wd->blocks, EINA_INLIST_GET(itb));
4194 itb->position_update = EINA_TRUE;
4195 if (wd->blocks != EINA_INLIST_GET(itb))
4197 itb->position = ((Item_Block *) (EINA_INLIST_GET(itb)->prev))->position + 1;
4208 _item_block_add(Widget_Data *wd,
4211 Item_Block *itb = NULL;
4218 itb = calloc(1, sizeof(Item_Block));
4219 if (!itb) return EINA_FALSE;
4221 if (!it->item->rel->item->block)
4224 eina_inlist_append(wd->blocks, EINA_INLIST_GET(itb));
4225 itb->items = eina_list_append(itb->items, it);
4226 itb->position_update = EINA_TRUE;
4227 it->position = eina_list_count(itb->items);
4228 it->position_update = EINA_TRUE;
4230 if (wd->blocks != EINA_INLIST_GET(itb))
4232 itb->position = ((Item_Block *) (EINA_INLIST_GET(itb)->prev))->position + 1;
4243 tmp = eina_list_data_find_list(itb->items, it->item->rel);
4244 if (it->item->before)
4246 wd->blocks = eina_inlist_prepend_relative
4247 (wd->blocks, EINA_INLIST_GET(itb),
4248 EINA_INLIST_GET(it->item->rel->item->block));
4250 eina_list_prepend_relative_list(itb->items, it, tmp);
4252 /* Update index from where we prepended */
4253 _item_position_update(eina_list_prev(tmp), it->item->rel->position);
4254 _item_block_position_update(EINA_INLIST_GET(itb),
4255 it->item->rel->item->block->position);
4259 wd->blocks = eina_inlist_append_relative
4260 (wd->blocks, EINA_INLIST_GET(itb),
4261 EINA_INLIST_GET(it->item->rel->item->block));
4263 eina_list_append_relative_list(itb->items, it, tmp);
4265 /* Update block index from where we appended */
4266 _item_position_update(eina_list_next(tmp), it->item->rel->position + 1);
4267 _item_block_position_update(EINA_INLIST_GET(itb),
4268 it->item->rel->item->block->position + 1);
4274 if (it->item->before)
4278 itb = (Item_Block *)(wd->blocks);
4279 if (itb->count >= wd->max_items_per_block)
4281 itb = _item_block_new(wd, EINA_TRUE);
4282 if (!itb) return EINA_FALSE;
4287 itb = _item_block_new(wd, EINA_TRUE);
4288 if (!itb) return EINA_FALSE;
4290 itb->items = eina_list_prepend(itb->items, it);
4292 _item_position_update(itb->items, 0);
4298 itb = (Item_Block *)(wd->blocks->last);
4299 if (itb->count >= wd->max_items_per_block)
4301 itb = _item_block_new(wd, EINA_FALSE);
4302 if (!itb) return EINA_FALSE;
4307 itb = _item_block_new(wd, EINA_FALSE);
4308 if (!itb) return EINA_FALSE;
4310 itb->items = eina_list_append(itb->items, it);
4311 it->position = eina_list_count(itb->items);
4319 if (it->item->rel->item->queued)
4321 /* NOTE: for a strange reason eina_list and eina_inlist don't have the same property
4322 on sorted insertion order, so the queue is not always ordered like the item list.
4323 This lead to issue where we depend on an item that is not yet created. As a quick
4324 work around, we reschedule the calc of the item and stop reordering the list to
4325 prevent any nasty issue to show up here.
4327 wd->queue = eina_list_append(wd->queue, it);
4328 wd->requeued = EINA_TRUE;
4329 it->item->queued = EINA_TRUE;
4332 itb = it->item->rel->item->block;
4333 if (!itb) goto newblock;
4334 tmp = eina_list_data_find_list(itb->items, it->item->rel);
4335 if (it->item->before)
4337 itb->items = eina_list_prepend_relative_list(itb->items, it, tmp);
4338 _item_position_update(eina_list_prev(tmp), it->item->rel->position);
4342 itb->items = eina_list_append_relative_list(itb->items, it, tmp);
4343 _item_position_update(eina_list_next(tmp), it->item->rel->position + 1);
4347 itb->changed = EINA_TRUE;
4348 it->item->block = itb;
4349 if (itb->wd->calc_job) ecore_job_del(itb->wd->calc_job);
4350 itb->wd->calc_job = ecore_job_add(_calc_job, itb->wd);
4353 it->item->rel->relcount--;
4354 if ((it->item->rel->generation < it->wd->generation) && (!it->item->rel->relcount))
4356 _item_del(it->item->rel);
4357 elm_widget_item_free(it->item->rel);
4359 it->item->rel = NULL;
4361 if (itb->count > itb->wd->max_items_per_block)
4366 Eina_Bool done = EINA_FALSE;
4368 newc = itb->count / 2;
4370 if (EINA_INLIST_GET(itb)->prev)
4372 Item_Block *itbp = (Item_Block *)(EINA_INLIST_GET(itb)->prev);
4374 if (itbp->count + newc < wd->max_items_per_block / 2)
4376 /* moving items to previous block */
4377 while ((itb->count > newc) && (itb->items))
4379 it2 = eina_list_data_get(itb->items);
4380 itb->items = eina_list_remove_list(itb->items, itb->items);
4383 itbp->items = eina_list_append(itbp->items, it2);
4384 it2->item->block = itbp;
4392 if (!done && EINA_INLIST_GET(itb)->next)
4394 Item_Block *itbn = (Item_Block *)(EINA_INLIST_GET(itb)->next);
4396 if (itbn->count + newc < wd->max_items_per_block / 2)
4398 /* moving items to next block */
4399 while ((itb->count > newc) && (itb->items))
4403 l = eina_list_last(itb->items);
4404 it2 = eina_list_data_get(l);
4405 itb->items = eina_list_remove_list(itb->items, l);
4408 itbn->items = eina_list_prepend(itbn->items, it2);
4409 it2->item->block = itbn;
4419 /* moving items to new block */
4420 itb2 = calloc(1, sizeof(Item_Block));
4421 if (!itb2) return EINA_FALSE;
4424 eina_inlist_append_relative(wd->blocks, EINA_INLIST_GET(itb2),
4425 EINA_INLIST_GET(itb));
4426 itb2->changed = EINA_TRUE;
4427 while ((itb->count > newc) && (itb->items))
4431 l = eina_list_last(itb->items);
4433 itb->items = eina_list_remove_list(itb->items, l);
4436 itb2->items = eina_list_prepend(itb2->items, it2);
4437 it2->item->block = itb2;
4447 _queue_process(Widget_Data *wd)
4450 Eina_Bool showme = EINA_FALSE;
4453 t0 = ecore_loop_time_get();
4454 //evas_event_freeze(evas_object_evas_get(wd->obj));
4455 for (n = 0; (wd->queue) && (n < 128); n++)
4459 it = eina_list_data_get(wd->queue);
4460 wd->queue = eina_list_remove_list(wd->queue, wd->queue);
4461 it->item->queued = EINA_FALSE;
4462 if (!_item_block_add(wd, it)) continue;
4464 _item_block_realize(it->item->block);
4465 t = ecore_time_get();
4466 if (it->item->block->changed)
4468 showme = _item_block_recalc(it->item->block, it->item->block->num, EINA_TRUE);
4469 it->item->block->changed = 0;
4470 if (wd->pan_changed)
4472 if (wd->calc_job) ecore_job_del(wd->calc_job);
4473 wd->calc_job = NULL;
4475 wd->pan_changed = EINA_FALSE;
4478 if (showme) it->item->block->showme = EINA_TRUE;
4479 /* same as eina_inlist_count > 1 */
4480 if (wd->blocks && wd->blocks->next)
4482 if ((t - t0) > (ecore_animator_frametime_get())) break;
4485 //evas_event_thaw(evas_object_evas_get(wd->obj));
4486 //evas_event_thaw_eval(evas_object_evas_get(wd->obj));
4491 _idle_process(void *data, Eina_Bool *wakeup)
4493 Widget_Data *wd = data;
4496 //static double q_start = 0.0;
4497 //if (q_start == 0.0) q_start = ecore_time_get();
4499 if (_queue_process(wd) > 0) *wakeup = EINA_TRUE;
4503 //printf("PROCESS TIME: %3.3f\n", ecore_time_get() - q_start);
4505 return ECORE_CALLBACK_CANCEL;
4507 return ECORE_CALLBACK_RENEW;
4511 _item_idle_enterer(void *data)
4513 Widget_Data *wd = data;
4514 Eina_Bool wakeup = EINA_FALSE;
4515 Eina_Bool ok = _idle_process(data, &wakeup);
4520 if (wd->calc_job) ecore_job_del(wd->calc_job);
4521 wd->calc_job = ecore_job_add(_calc_job, wd);
4523 if (ok == ECORE_CALLBACK_CANCEL) wd->queue_idle_enterer = NULL;
4528 _item_queue(Widget_Data *wd,
4532 if (it->item->queued) return;
4533 it->item->queued = EINA_TRUE;
4534 if (cb && !wd->requeued)
4535 wd->queue = eina_list_sorted_insert(wd->queue, cb, it);
4537 wd->queue = eina_list_append(wd->queue, it);
4538 // FIXME: why does a freeze then thaw here cause some genlist
4539 // elm_genlist_item_append() to be much much slower?
4540 // evas_event_freeze(evas_object_evas_get(wd->obj));
4541 while ((wd->queue) && ((!wd->blocks) || (!wd->blocks->next)))
4543 if (wd->queue_idle_enterer)
4545 ecore_idle_enterer_del(wd->queue_idle_enterer);
4546 wd->queue_idle_enterer = NULL;
4550 // evas_event_thaw(evas_object_evas_get(wd->obj));
4551 // evas_event_thaw_eval(evas_object_evas_get(wd->obj));
4552 if (!wd->queue_idle_enterer)
4553 wd->queue_idle_enterer = ecore_idle_enterer_add(_item_idle_enterer, wd);
4557 _elm_genlist_item_compare(const void *data, const void *data1)
4559 const Elm_Gen_Item *it, *item1;
4560 it = ELM_GEN_ITEM_FROM_INLIST(data);
4561 item1 = ELM_GEN_ITEM_FROM_INLIST(data1);
4562 return it->wd->item_compare_cb(it, item1);
4566 _elm_genlist_item_list_compare(const void *data, const void *data1)
4568 const Elm_Gen_Item *it = data;
4569 const Elm_Gen_Item *item1 = data1;
4570 return it->wd->item_compare_cb(it, item1);
4574 _item_move_after(Elm_Gen_Item *it, Elm_Gen_Item *after)
4579 it->wd->items = eina_inlist_remove(it->wd->items, EINA_INLIST_GET(it));
4580 _item_block_del(it);
4582 it->wd->items = eina_inlist_append_relative(it->wd->items, EINA_INLIST_GET(it), EINA_INLIST_GET(after));
4583 it->item->rel = after;
4584 it->item->rel->relcount++;
4585 it->item->before = EINA_FALSE;
4586 if (after->item->group_item) it->item->group_item = after->item->group_item;
4587 _item_queue(it->wd, it, NULL);
4589 evas_object_smart_callback_call(WIDGET(it), SIG_MOVED, it);
4593 _item_move_before(Elm_Gen_Item *it, Elm_Gen_Item *before)
4596 if (!before) return;
4598 it->wd->items = eina_inlist_remove(it->wd->items, EINA_INLIST_GET(it));
4599 _item_block_del(it);
4600 it->wd->items = eina_inlist_prepend_relative(it->wd->items, EINA_INLIST_GET(it), EINA_INLIST_GET(before));
4601 it->item->rel = before;
4602 it->item->rel->relcount++;
4603 it->item->before = EINA_TRUE;
4604 if (before->item->group_item) it->item->group_item = before->item->group_item;
4605 _item_queue(it->wd, it, NULL);
4607 evas_object_smart_callback_call(WIDGET(it), SIG_MOVED, it);
4611 elm_genlist_items_count(const Evas_Object *obj)
4613 ELM_CHECK_WIDTYPE(obj, widtype) 0;
4614 Widget_Data *wd = elm_widget_data_get(obj);
4616 return wd->item_count;
4619 EAPI Elm_Object_Item *
4620 elm_genlist_item_append(Evas_Object *obj,
4621 const Elm_Genlist_Item_Class *itc,
4623 Elm_Object_Item *parent,
4624 Elm_Genlist_Item_Type type,
4626 const void *func_data)
4628 ELM_CHECK_WIDTYPE(obj, widtype) NULL;
4629 Widget_Data *wd = elm_widget_data_get(obj);
4630 if (!wd) return NULL;
4631 Elm_Gen_Item *it = _item_new(wd, itc, data, (Elm_Gen_Item *) parent, type,
4633 if (!it) return NULL;
4637 wd->group_items = eina_list_append(wd->group_items, it);
4638 wd->items = eina_inlist_append(wd->items, EINA_INLIST_GET(it));
4639 it->item->rel = NULL;
4643 Elm_Gen_Item *it2 = NULL;
4644 Eina_List *ll = eina_list_last(it->parent->item->items);
4645 if (ll) it2 = ll->data;
4646 it->parent->item->items = eina_list_append(it->parent->item->items, it);
4647 if (!it2) it2 = it->parent;
4649 eina_inlist_append_relative(wd->items, EINA_INLIST_GET(it),
4650 EINA_INLIST_GET(it2));
4651 it->item->rel = it2;
4652 it->item->rel->relcount++;
4654 it->item->before = EINA_FALSE;
4655 _item_queue(wd, it, NULL);
4656 return (Elm_Object_Item *)it;
4659 EAPI Elm_Object_Item *
4660 elm_genlist_item_prepend(Evas_Object *obj,
4661 const Elm_Genlist_Item_Class *itc,
4663 Elm_Object_Item *parent,
4664 Elm_Genlist_Item_Type type,
4666 const void *func_data)
4668 ELM_CHECK_WIDTYPE(obj, widtype) NULL;
4669 Widget_Data *wd = elm_widget_data_get(obj);
4670 if (!wd) return NULL;
4671 Elm_Gen_Item *it = _item_new(wd, itc, data, (Elm_Gen_Item *) parent, type,
4673 if (!it) return NULL;
4677 wd->group_items = eina_list_prepend(wd->group_items, it);
4678 wd->items = eina_inlist_prepend(wd->items, EINA_INLIST_GET(it));
4679 it->item->rel = NULL;
4683 Elm_Gen_Item *it2 = NULL;
4684 Eina_List *ll = it->parent->item->items;
4685 if (ll) it2 = ll->data;
4686 it->parent->item->items = eina_list_prepend(it->parent->item->items, it);
4687 if (!it2) it2 = it->parent;
4689 eina_inlist_prepend_relative(wd->items, EINA_INLIST_GET(it),
4690 EINA_INLIST_GET(it2));
4691 it->item->rel = it2;
4692 it->item->rel->relcount++;
4694 it->item->before = EINA_TRUE;
4695 _item_queue(wd, it, NULL);
4696 return (Elm_Object_Item *)it;
4699 EAPI Elm_Object_Item *
4700 elm_genlist_item_insert_after(Evas_Object *obj,
4701 const Elm_Genlist_Item_Class *itc,
4703 Elm_Object_Item *parent,
4704 Elm_Object_Item *after,
4705 Elm_Genlist_Item_Type type,
4707 const void *func_data)
4709 ELM_CHECK_WIDTYPE(obj, widtype) NULL;
4710 ELM_OBJ_ITEM_CHECK_OR_RETURN(after, NULL);
4711 Widget_Data *wd = elm_widget_data_get(obj);
4712 Elm_Gen_Item *_after = (Elm_Gen_Item *) after;
4713 if (!wd) return NULL;
4714 /* It makes no sense to insert after in an empty list with after != NULL, something really bad is happening in your app. */
4715 EINA_SAFETY_ON_NULL_RETURN_VAL(wd->items, NULL);
4717 Elm_Gen_Item *it = _item_new(wd, itc, data, (Elm_Gen_Item *) parent, type,
4719 if (!it) return NULL;
4722 if ((it->group) && (_after->group))
4723 wd->group_items = eina_list_append_relative(wd->group_items, it,
4728 it->parent->item->items =
4729 eina_list_append_relative(it->parent->item->items, it, _after);
4731 wd->items = eina_inlist_append_relative(wd->items, EINA_INLIST_GET(it),
4732 EINA_INLIST_GET(_after));
4733 it->item->rel = _after;
4734 it->item->rel->relcount++;
4735 it->item->before = EINA_FALSE;
4736 _item_queue(wd, it, NULL);
4737 return (Elm_Object_Item *)it;
4740 EAPI Elm_Object_Item *
4741 elm_genlist_item_insert_before(Evas_Object *obj,
4742 const Elm_Genlist_Item_Class *itc,
4744 Elm_Object_Item *parent,
4745 Elm_Object_Item *before,
4746 Elm_Genlist_Item_Type type,
4748 const void *func_data)
4750 ELM_CHECK_WIDTYPE(obj, widtype) NULL;
4751 ELM_OBJ_ITEM_CHECK_OR_RETURN(before, NULL);
4752 Widget_Data *wd = elm_widget_data_get(obj);
4753 Elm_Gen_Item *_before = (Elm_Gen_Item *) before;
4754 if (!wd) return NULL;
4755 /* It makes no sense to insert before in an empty list with before != NULL, something really bad is happening in your app. */
4756 EINA_SAFETY_ON_NULL_RETURN_VAL(wd->items, NULL);
4758 Elm_Gen_Item *it = _item_new(wd, itc, data, (Elm_Gen_Item *) parent, type,
4760 if (!it) return NULL;
4763 if (it->group && _before->group)
4764 wd->group_items = eina_list_prepend_relative(wd->group_items, it,
4769 it->parent->item->items =
4770 eina_list_prepend_relative(it->parent->item->items, it, _before);
4772 wd->items = eina_inlist_prepend_relative(wd->items, EINA_INLIST_GET(it),
4773 EINA_INLIST_GET(_before));
4774 it->item->rel = _before;
4775 it->item->rel->relcount++;
4776 it->item->before = EINA_TRUE;
4777 _item_queue(wd, it, NULL);
4778 return (Elm_Object_Item *)it;
4781 EAPI Elm_Object_Item *
4782 elm_genlist_item_sorted_insert(Evas_Object *obj,
4783 const Elm_Genlist_Item_Class *itc,
4785 Elm_Object_Item *parent,
4786 Elm_Genlist_Item_Type type,
4787 Eina_Compare_Cb comp,
4789 const void *func_data)
4791 ELM_CHECK_WIDTYPE(obj, widtype) NULL;
4792 Widget_Data *wd = elm_widget_data_get(obj);
4793 if (!wd) return NULL;
4794 Elm_Gen_Item *rel = NULL;
4795 Elm_Gen_Item *it = _item_new(wd, itc, data, (Elm_Gen_Item *) parent, type,
4797 if (!it) return NULL;
4799 wd->item_compare_cb = comp;
4806 l = eina_list_search_sorted_near_list(it->parent->item->items,
4807 _elm_genlist_item_list_compare,
4811 rel = eina_list_data_get(l);
4815 if (cmp_result >= 0)
4817 it->parent->item->items = eina_list_prepend_relative_list(it->parent->item->items, it, l);
4818 wd->items = eina_inlist_prepend_relative(wd->items, EINA_INLIST_GET(it), EINA_INLIST_GET(rel));
4819 it->item->before = EINA_FALSE;
4821 else if (cmp_result < 0)
4823 it->parent->item->items = eina_list_append_relative_list(it->parent->item->items, it, l);
4824 wd->items = eina_inlist_append_relative(wd->items, EINA_INLIST_GET(it), EINA_INLIST_GET(rel));
4825 it->item->before = EINA_TRUE;
4832 wd->state = eina_inlist_sorted_state_new();
4833 eina_inlist_sorted_state_init(wd->state, wd->items);
4834 wd->requeued = EINA_FALSE;
4838 wd->group_items = eina_list_append(wd->group_items, it);
4840 wd->items = eina_inlist_sorted_state_insert(wd->items, EINA_INLIST_GET(it),
4841 _elm_genlist_item_compare, wd->state);
4843 if (EINA_INLIST_GET(it)->next)
4845 rel = ELM_GEN_ITEM_FROM_INLIST(EINA_INLIST_GET(it)->next);
4846 it->item->before = EINA_TRUE;
4848 else if (EINA_INLIST_GET(it)->prev)
4850 rel = ELM_GEN_ITEM_FROM_INLIST(EINA_INLIST_GET(it)->prev);
4851 it->item->before = EINA_FALSE;
4857 it->item->rel = rel;
4858 it->item->rel->relcount++;
4861 _item_queue(wd, it, _elm_genlist_item_list_compare);
4863 return (Elm_Object_Item *)it;
4867 _elm_genlist_clear(Evas_Object *obj, Eina_Bool standby)
4869 Eina_Inlist *next, *l;
4871 ELM_CHECK_WIDTYPE(obj, widtype);
4872 Widget_Data *wd = elm_widget_data_get(obj);
4875 if (!standby) wd->generation++;
4879 eina_inlist_sorted_state_free(wd->state);
4883 if (wd->walking > 0)
4885 wd->clear_me = EINA_TRUE;
4888 evas_event_freeze(evas_object_evas_get(wd->obj));
4889 for (l = wd->items, next = l ? l->next : NULL;
4891 l = next, next = next ? next->next : NULL)
4893 Elm_Gen_Item *it = ELM_GEN_ITEM_FROM_INLIST(l);
4895 if (it->generation < wd->generation)
4897 Elm_Gen_Item *itn = NULL;
4899 if (next) itn = ELM_GEN_ITEM_FROM_INLIST(next);
4900 if (itn) itn->walking++; /* prevent early death of subitem */
4902 elm_widget_item_free(it);
4903 if (itn) itn->walking--;
4906 wd->clear_me = EINA_FALSE;
4907 wd->pan_changed = EINA_TRUE;
4910 ecore_job_del(wd->calc_job);
4911 wd->calc_job = NULL;
4913 if (wd->selected) wd->selected = eina_list_free(wd->selected);
4914 if (wd->clear_cb) wd->clear_cb(wd);
4920 if (wd->alpha_bg) evas_object_del(wd->alpha_bg);
4921 wd->alpha_bg = NULL;
4925 evas_object_size_hint_min_set(wd->pan_smart, wd->minw, wd->minh);
4926 evas_object_smart_callback_call(wd->pan_smart, "changed", NULL);
4928 if (wd->sizing_cb) wd->sizing_cb(wd->obj);
4929 elm_smart_scroller_child_region_show(wd->scr, 0, 0, 0, 0);
4930 evas_event_thaw(evas_object_evas_get(wd->obj));
4931 evas_event_thaw_eval(evas_object_evas_get(wd->obj));
4935 elm_genlist_clear(Evas_Object *obj)
4937 _elm_genlist_clear(obj, EINA_FALSE);
4941 elm_genlist_multi_select_set(Evas_Object *obj,
4944 ELM_CHECK_WIDTYPE(obj, widtype);
4945 Widget_Data *wd = elm_widget_data_get(obj);
4947 wd->multi = !!multi;
4951 elm_genlist_multi_select_get(const Evas_Object *obj)
4953 ELM_CHECK_WIDTYPE(obj, widtype) EINA_FALSE;
4954 Widget_Data *wd = elm_widget_data_get(obj);
4955 if (!wd) return EINA_FALSE;
4959 EAPI Elm_Object_Item *
4960 elm_genlist_selected_item_get(const Evas_Object *obj)
4962 ELM_CHECK_WIDTYPE(obj, widtype) NULL;
4963 Widget_Data *wd = elm_widget_data_get(obj);
4964 if (!wd) return NULL;
4965 if (wd->selected) return wd->selected->data;
4969 EAPI const Eina_List *
4970 elm_genlist_selected_items_get(const Evas_Object *obj)
4972 ELM_CHECK_WIDTYPE(obj, widtype) NULL;
4973 Widget_Data *wd = elm_widget_data_get(obj);
4974 if (!wd) return NULL;
4975 return wd->selected;
4979 elm_genlist_realized_items_get(const Evas_Object *obj)
4981 ELM_CHECK_WIDTYPE(obj, widtype) NULL;
4982 Widget_Data *wd = elm_widget_data_get(obj);
4983 Eina_List *list = NULL;
4985 Eina_Bool done = EINA_FALSE;
4986 if (!wd) return NULL;
4987 EINA_INLIST_FOREACH(wd->blocks, itb)
4995 EINA_LIST_FOREACH(itb->items, l, it)
4997 if (it->realized) list = eina_list_append(list, it);
5008 EAPI Elm_Object_Item *
5009 elm_genlist_at_xy_item_get(const Evas_Object *obj,
5014 ELM_CHECK_WIDTYPE(obj, widtype) NULL;
5015 Widget_Data *wd = elm_widget_data_get(obj);
5016 Evas_Coord ox, oy, ow, oh;
5019 if (!wd) return NULL;
5020 evas_object_geometry_get(wd->pan_smart, &ox, &oy, &ow, &oh);
5022 EINA_INLIST_FOREACH(wd->blocks, itb)
5027 if (!ELM_RECTS_INTERSECT(ox + itb->x - itb->wd->pan_x,
5028 oy + itb->y - itb->wd->pan_y,
5029 itb->w, itb->h, x, y, 1, 1))
5031 EINA_LIST_FOREACH(itb->items, l, it)
5033 Evas_Coord itx, ity;
5035 itx = ox + itb->x + it->x - itb->wd->pan_x;
5036 ity = oy + itb->y + it->y - itb->wd->pan_y;
5037 if (ELM_RECTS_INTERSECT(itx, ity, it->item->w, it->item->h, x, y, 1, 1))
5041 if (y <= (ity + (it->item->h / 4))) *posret = -1;
5042 else if (y >= (ity + it->item->h - (it->item->h / 4)))
5046 return (Elm_Object_Item *)it;
5048 lasty = ity + it->item->h;
5053 if (y > lasty) *posret = 1;
5059 EAPI Elm_Object_Item *
5060 elm_genlist_first_item_get(const Evas_Object *obj)
5062 ELM_CHECK_WIDTYPE(obj, widtype) NULL;
5063 Widget_Data *wd = elm_widget_data_get(obj);
5064 if (!wd) return NULL;
5065 if (!wd->items) return NULL;
5066 Elm_Gen_Item *it = ELM_GEN_ITEM_FROM_INLIST(wd->items);
5067 while ((it) && (it->generation < wd->generation))
5068 it = ELM_GEN_ITEM_FROM_INLIST(EINA_INLIST_GET(it)->next);
5069 return (Elm_Object_Item *)it;
5072 EAPI Elm_Object_Item *
5073 elm_genlist_last_item_get(const Evas_Object *obj)
5075 ELM_CHECK_WIDTYPE(obj, widtype) NULL;
5076 Widget_Data *wd = elm_widget_data_get(obj);
5077 if (!wd) return NULL;
5078 if (!wd->items) return NULL;
5079 Elm_Gen_Item *it = ELM_GEN_ITEM_FROM_INLIST(wd->items->last);
5080 while ((it) && (it->generation < wd->generation))
5081 it = ELM_GEN_ITEM_FROM_INLIST(EINA_INLIST_GET(it)->prev);
5082 return (Elm_Object_Item *)it;
5085 EAPI Elm_Object_Item *
5086 elm_genlist_item_next_get(const Elm_Object_Item *it)
5088 ELM_OBJ_ITEM_CHECK_OR_RETURN(it, NULL);
5089 Elm_Gen_Item *_it = (Elm_Gen_Item *)it;
5092 _it = ELM_GEN_ITEM_FROM_INLIST(EINA_INLIST_GET(_it)->next);
5093 if ((_it) && (_it->generation == _it->wd->generation)) break;
5095 return (Elm_Object_Item *) _it;
5098 EAPI Elm_Object_Item *
5099 elm_genlist_item_prev_get(const Elm_Object_Item *it)
5101 ELM_OBJ_ITEM_CHECK_OR_RETURN(it, NULL);
5102 Elm_Gen_Item *_it = (Elm_Gen_Item *)it;
5105 _it = ELM_GEN_ITEM_FROM_INLIST(EINA_INLIST_GET(_it)->prev);
5106 if ((_it) && (_it->generation == _it->wd->generation)) break;
5108 return (Elm_Object_Item *) _it;
5111 EAPI Elm_Object_Item *
5112 elm_genlist_item_parent_get(const Elm_Object_Item *it)
5114 ELM_OBJ_ITEM_CHECK_OR_RETURN(it, NULL);
5115 return (Elm_Object_Item *) ((Elm_Gen_Item *)it)->parent;
5119 elm_genlist_item_subitems_clear(Elm_Object_Item *it)
5121 ELM_OBJ_ITEM_CHECK_OR_RETURN(it);
5122 Widget_Data *wd = elm_widget_data_get(WIDGET(it));
5124 Elm_Gen_Item *_it = (Elm_Gen_Item *) it;
5126 if (!wd->tree_effect_enabled || !wd->move_effect_mode)
5127 _item_subitems_clear(_it);
5130 if (!wd->item_moving_effect_timer)
5132 wd->expanded_item = _it;
5133 _item_tree_effect_before(_it);
5134 evas_object_raise(wd->alpha_bg);
5135 evas_object_show(wd->alpha_bg);
5136 wd->start_time = ecore_time_get();
5137 wd->item_moving_effect_timer = ecore_animator_add(_item_moving_effect_timer_cb, wd);
5140 _item_subitems_clear(_it);
5145 elm_genlist_item_selected_set(Elm_Object_Item *it,
5148 ELM_OBJ_ITEM_CHECK_OR_RETURN(it);
5149 Elm_Gen_Item *_it = (Elm_Gen_Item *)it;
5150 Widget_Data *wd = _it->wd;
5152 if ((_it->generation < wd->generation) || elm_widget_item_disabled_get(_it))
5154 selected = !!selected;
5155 if (_it->selected == selected) return;
5161 while (wd->selected)
5163 if (_it->unhighlight_cb) _it->unhighlight_cb(wd->selected->data);
5164 _it->unsel_cb(wd->selected->data);
5167 _it->highlight_cb(_it);
5171 if (_it->unhighlight_cb) _it->unhighlight_cb(_it);
5176 elm_genlist_item_selected_get(const Elm_Object_Item *it)
5178 ELM_OBJ_ITEM_CHECK_OR_RETURN(it, EINA_FALSE);
5179 return ((Elm_Gen_Item *)it)->selected;
5183 _elm_genlist_expanded_next_item_get(Elm_Gen_Item *it)
5186 if (it->item->expanded)
5188 it2 = (Elm_Gen_Item *) elm_genlist_item_next_get((Elm_Object_Item *) it);
5192 it2 = (Elm_Gen_Item *) elm_genlist_item_next_get((Elm_Object_Item *) it);
5195 if (it->item->expanded_depth >= it2->item->expanded_depth) break;
5196 it2 = (Elm_Gen_Item *) elm_genlist_item_next_get((Elm_Object_Item *) it2);
5203 _elm_genlist_move_items_set(Elm_Gen_Item *it)
5206 Elm_Gen_Item *it2 = NULL;
5207 Evas_Coord ox, oy, ow, oh, dh = 0;
5209 it->wd->expanded_next_item = _elm_genlist_expanded_next_item_get(it);
5211 if (it->item->expanded)
5213 it->wd->move_items = elm_genlist_realized_items_get(it->wd->obj);
5214 EINA_LIST_FOREACH(it->wd->move_items, l, it2)
5216 if (it2 == it->wd->expanded_next_item) break;
5217 it->wd->move_items = eina_list_remove(it->wd->move_items, it2);
5222 evas_object_geometry_get(it->wd->pan_smart, &ox, &oy, &ow, &oh);
5223 it2 = it->wd->expanded_next_item;
5224 while (it2 && (dh < oy + oh))
5227 it->wd->move_items = eina_list_append(it->wd->move_items, it2);
5228 it2 = (Elm_Gen_Item *) elm_genlist_item_next_get((Elm_Object_Item *) it2);
5234 elm_genlist_item_expanded_set(Elm_Object_Item *it,
5237 ELM_OBJ_ITEM_CHECK_OR_RETURN(it);
5238 Elm_Gen_Item *_it = (Elm_Gen_Item *)it;
5239 expanded = !!expanded;
5240 if (_it->item->expanded == expanded) return;
5241 _it->item->expanded = expanded;
5242 _it->wd->expanded_item = _it;
5243 _elm_genlist_move_items_set(_it);
5245 if (_it->wd->tree_effect_enabled && !_it->wd->alpha_bg)
5246 _it->wd->alpha_bg = _create_tray_alpha_bg(WIDGET(_it));
5248 if (_it->item->expanded)
5250 _it->wd->move_effect_mode = ELM_GENLIST_TREE_EFFECT_EXPAND;
5252 edje_object_signal_emit(VIEW(_it), "elm,state,expanded", "elm");
5253 evas_object_smart_callback_call(WIDGET(_it), SIG_EXPANDED, _it);
5254 _it->wd->auto_scroll_enabled = EINA_TRUE;
5258 _it->wd->move_effect_mode = ELM_GENLIST_TREE_EFFECT_CONTRACT;
5260 edje_object_signal_emit(VIEW(_it), "elm,state,contracted", "elm");
5261 evas_object_smart_callback_call(WIDGET(_it), SIG_CONTRACTED, _it);
5262 _it->wd->auto_scroll_enabled = EINA_FALSE;
5267 elm_genlist_item_expanded_get(const Elm_Object_Item *it)
5269 ELM_OBJ_ITEM_CHECK_OR_RETURN(it, EINA_FALSE);
5270 return ((Elm_Gen_Item *)it)->item->expanded;
5274 elm_genlist_item_expanded_depth_get(const Elm_Object_Item *it)
5276 ELM_OBJ_ITEM_CHECK_OR_RETURN(it, 0);
5277 return ((Elm_Gen_Item *)it)->item->expanded_depth;
5280 EINA_DEPRECATED EAPI void
5281 elm_genlist_item_display_only_set(Elm_Object_Item *it,
5282 Eina_Bool display_only)
5284 ELM_OBJ_ITEM_CHECK_OR_RETURN(it);
5285 display_only = !!display_only;
5288 elm_genlist_item_select_mode_set(it, ELM_OBJECT_SELECT_MODE_DISPLAY_ONLY);
5291 Elm_Object_Select_Mode oldmode = elm_genlist_item_select_mode_get(it);
5292 if (oldmode == ELM_OBJECT_SELECT_MODE_DISPLAY_ONLY)
5293 elm_genlist_item_select_mode_set(it, ELM_OBJECT_SELECT_MODE_DEFAULT);
5297 EINA_DEPRECATED EAPI Eina_Bool
5298 elm_genlist_item_display_only_get(const Elm_Object_Item *it)
5300 ELM_OBJ_ITEM_CHECK_OR_RETURN(it, EINA_FALSE);
5301 Elm_Gen_Item *_it = (Elm_Gen_Item *)it;
5302 if (_it->generation < _it->wd->generation) return EINA_FALSE;
5303 Elm_Object_Select_Mode oldmode = elm_genlist_item_select_mode_get(it);
5304 if (oldmode == ELM_OBJECT_SELECT_MODE_DISPLAY_ONLY)
5309 static Eina_Bool _elm_genlist_item_compute_coordinates(
5310 Elm_Object_Item *it,
5311 Elm_Genlist_Item_Scrollto_Type type,
5317 Elm_Gen_Item *_it = (Elm_Gen_Item *)it;
5318 Evas_Coord gith = 0;
5319 if (_it->generation < _it->wd->generation) return EINA_FALSE;
5320 if ((_it->item->queued) || (!_it->item->mincalcd))
5322 _it->wd->show_item = _it;
5323 _it->wd->bring_in = EINA_FALSE;
5324 _it->wd->scrollto_type = type;
5325 _it->item->showme = EINA_TRUE;
5328 if (_it->wd->show_item)
5330 _it->wd->show_item->item->showme = EINA_FALSE;
5331 _it->wd->show_item = NULL;
5334 evas_object_geometry_get(_it->wd->pan_smart, NULL, NULL, w, h);
5335 if (type==ELM_GENLIST_ITEM_SCROLLTO_IN)
5337 if ((_it->item->group_item) &&
5338 (_it->wd->pan_y > (_it->y + _it->item->block->y)))
5339 gith = _it->item->group_item->item->h;
5342 *y = _it->y + _it->item->block->y - gith;
5344 else if (type==ELM_GENLIST_ITEM_SCROLLTO_TOP)
5346 if (_it->item->group_item) gith = _it->item->group_item->item->h;
5347 *y = _it->y + _it->item->block->y - gith;
5349 else if (type==ELM_GENLIST_ITEM_SCROLLTO_MIDDLE)
5351 *y = _it->y + _it->item->block->y - *h / 2 + _it->item->h / 2;
5356 *x = _it->x + _it->item->block->x;
5357 *w = _it->item->block->w;
5362 elm_genlist_item_promote(Elm_Object_Item *it)
5364 ELM_OBJ_ITEM_CHECK_OR_RETURN(it);
5365 Elm_Gen_Item *_it = (Elm_Gen_Item *)it;
5366 if (_it->generation < _it->wd->generation) return;
5367 _item_move_before(_it,
5368 (Elm_Gen_Item *) elm_genlist_first_item_get(WIDGET(_it)));
5372 elm_genlist_item_demote(Elm_Object_Item *it)
5374 ELM_OBJ_ITEM_CHECK_OR_RETURN(it);
5375 Elm_Gen_Item *_it = (Elm_Gen_Item *)it;
5376 if (_it->generation < _it->wd->generation) return;
5377 _item_move_after(_it,
5378 (Elm_Gen_Item *) elm_genlist_last_item_get(WIDGET(_it)));
5382 elm_genlist_item_show(Elm_Object_Item *it, Elm_Genlist_Item_Scrollto_Type type)
5384 ELM_OBJ_ITEM_CHECK_OR_RETURN(it);
5385 Evas_Coord x, y, w, h;
5386 Elm_Gen_Item *_it = (Elm_Gen_Item *)it;
5388 if (_elm_genlist_item_compute_coordinates(it, type, &x, &y, &w, &h))
5389 elm_smart_scroller_child_region_show(_it->wd->scr, x, y, w, h);
5393 elm_genlist_item_bring_in(Elm_Object_Item *it, Elm_Genlist_Item_Scrollto_Type type)
5396 ELM_OBJ_ITEM_CHECK_OR_RETURN(it);
5397 Evas_Coord x, y, w, h;
5398 Elm_Gen_Item *_it = (Elm_Gen_Item *)it;
5400 if (_elm_genlist_item_compute_coordinates(it, type, &x, &y, &w, &h))
5401 elm_smart_scroller_region_bring_in(_it->wd->scr,x, y, w, h);
5404 EINA_DEPRECATED EAPI void
5405 elm_genlist_item_top_show(Elm_Object_Item *it)
5407 elm_genlist_item_show(it, ELM_GENLIST_ITEM_SCROLLTO_TOP);
5410 EINA_DEPRECATED EAPI void
5411 elm_genlist_item_top_bring_in(Elm_Object_Item *it)
5413 elm_genlist_item_bring_in(it, ELM_GENLIST_ITEM_SCROLLTO_TOP);
5416 EINA_DEPRECATED EAPI void
5417 elm_genlist_item_middle_show(Elm_Object_Item *it)
5419 elm_genlist_item_show(it, ELM_GENLIST_ITEM_SCROLLTO_MIDDLE);
5422 EINA_DEPRECATED EAPI void
5423 elm_genlist_item_middle_bring_in(Elm_Object_Item *it)
5425 elm_genlist_item_bring_in(it, ELM_GENLIST_ITEM_SCROLLTO_MIDDLE);
5428 EINA_DEPRECATED EAPI void
5429 elm_genlist_item_contents_orphan(Elm_Object_Item *it)
5431 elm_genlist_item_all_contents_unset(it, NULL);
5435 elm_genlist_item_all_contents_unset(Elm_Object_Item *it, Eina_List **l)
5437 ELM_OBJ_ITEM_CHECK_OR_RETURN(it);
5439 Evas_Object *content;
5440 EINA_LIST_FREE(((Elm_Gen_Item *)it)->content_objs, content)
5442 elm_widget_sub_object_del(WIDGET(it), content);
5443 evas_object_smart_member_del(content);
5444 evas_object_hide(content);
5446 *l = eina_list_append(*l, content);
5450 EINA_DEPRECATED EAPI const Evas_Object *
5451 elm_genlist_item_object_get(const Elm_Object_Item *it)
5453 ELM_OBJ_ITEM_CHECK_OR_RETURN(it, NULL);
5458 elm_genlist_item_update(Elm_Object_Item *it)
5460 ELM_OBJ_ITEM_CHECK_OR_RETURN(it);
5461 Elm_Gen_Item *_it = (Elm_Gen_Item *)it;
5463 if (!_it->item->block) return;
5464 if (_it->generation < _it->wd->generation) return;
5465 _it->item->mincalcd = EINA_FALSE;
5466 _it->item->updateme = EINA_TRUE;
5467 _it->item->block->updateme = EINA_TRUE;
5468 if (_it->wd->update_job) ecore_job_del(_it->wd->update_job);
5469 _it->wd->update_job = ecore_job_add(_update_job, _it->wd);
5473 elm_genlist_item_fields_update(Elm_Object_Item *it,
5475 Elm_Genlist_Item_Field_Type itf)
5477 ELM_OBJ_ITEM_CHECK_OR_RETURN(it);
5478 Elm_Gen_Item *_it = (Elm_Gen_Item *)it;
5480 if (!_it->item->block) return;
5481 if (_it->generation < _it->wd->generation) return;
5483 if ((!itf) || (itf & ELM_GENLIST_ITEM_FIELD_TEXT))
5484 _item_text_realize(_it, VIEW(_it), &_it->texts, parts);
5485 if ((!itf) || (itf & ELM_GENLIST_ITEM_FIELD_CONTENT))
5487 _it->content_objs = _item_content_unrealize(_it, VIEW(_it),
5488 &_it->contents, parts);
5489 _it->content_objs = _item_content_realize(_it, VIEW(_it),
5490 &_it->contents, parts);
5494 _it->content_objs = _item_mode_content_unrealize(_it, VIEW(_it),
5495 &_it->contents, parts, &_it->content_objs);
5496 _it->content_objs = _item_mode_content_realize(_it, VIEW(_it),
5497 &_it->contents, parts, &_it->content_objs, "flips");
5502 _it->mode_content_objs = _item_mode_content_unrealize(_it, _it->mode_view,
5503 &_it->mode_contents, parts, &_it->mode_content_objs);
5504 _it->mode_content_objs = _item_mode_content_realize(_it, _it->mode_view,
5505 &_it->mode_contents, parts, &_it->mode_content_objs, "contents");
5508 if (_it->wd->edit_mode)
5510 _it->edit_content_objs = _item_mode_content_unrealize(_it, _it->edit_obj,
5511 &_it->contents, parts, &_it->edit_content_objs);
5512 _it->edit_content_objs = _item_mode_content_realize(_it, _it->edit_obj,
5513 &_it->contents, parts, &_it->edit_content_objs, "contents"); // FIXME: is it "edit_contents"??
5516 if ((!itf) || (itf & ELM_GENLIST_ITEM_FIELD_STATE))
5517 _item_state_realize(_it, VIEW(_it), &_it->states, parts);
5521 elm_genlist_item_item_class_update(Elm_Object_Item *it,
5522 const Elm_Genlist_Item_Class *itc)
5524 ELM_OBJ_ITEM_CHECK_OR_RETURN(it);
5525 Elm_Gen_Item *_it = (Elm_Gen_Item *)it;
5527 if (!_it->item->block) return;
5528 EINA_SAFETY_ON_NULL_RETURN(itc);
5529 if (_it->generation < _it->wd->generation) return;
5531 _it->item->nocache_once = EINA_TRUE;
5532 elm_genlist_item_update(it);
5535 EAPI const Elm_Genlist_Item_Class *
5536 elm_genlist_item_item_class_get(const Elm_Object_Item *it)
5538 ELM_OBJ_ITEM_CHECK_OR_RETURN(it, NULL);
5539 Elm_Gen_Item *_it = (Elm_Gen_Item *)it;
5540 if (_it->generation < _it->wd->generation) return NULL;
5544 static Evas_Object *
5545 _elm_genlist_item_label_create(void *data,
5546 Evas_Object *obj __UNUSED__,
5547 Evas_Object *tooltip,
5548 void *it __UNUSED__)
5550 Evas_Object *label = elm_label_add(tooltip);
5553 elm_object_style_set(label, "tooltip");
5554 elm_object_text_set(label, data);
5559 _elm_genlist_item_label_del_cb(void *data,
5560 Evas_Object *obj __UNUSED__,
5561 void *event_info __UNUSED__)
5563 eina_stringshare_del(data);
5567 elm_genlist_item_tooltip_text_set(Elm_Object_Item *it,
5570 ELM_OBJ_ITEM_CHECK_OR_RETURN(it);
5571 text = eina_stringshare_add(text);
5572 elm_genlist_item_tooltip_content_cb_set(it, _elm_genlist_item_label_create,
5574 _elm_genlist_item_label_del_cb);
5578 elm_genlist_item_tooltip_content_cb_set(Elm_Object_Item *it,
5579 Elm_Tooltip_Item_Content_Cb func,
5581 Evas_Smart_Cb del_cb)
5583 ELM_OBJ_ITEM_CHECK_OR_GOTO(it, error);
5584 Elm_Gen_Item *_it = (Elm_Gen_Item *)it;
5586 if ((_it->tooltip.content_cb == func) && (_it->tooltip.data == data))
5589 if (_it->tooltip.del_cb)
5590 _it->tooltip.del_cb((void *) _it->tooltip.data, WIDGET(it), it);
5592 _it->tooltip.content_cb = func;
5593 _it->tooltip.data = data;
5594 _it->tooltip.del_cb = del_cb;
5598 elm_widget_item_tooltip_content_cb_set(_it,
5599 _it->tooltip.content_cb,
5600 _it->tooltip.data, NULL);
5601 elm_widget_item_tooltip_style_set(_it, _it->tooltip.style);
5602 elm_widget_item_tooltip_window_mode_set(_it, _it->tooltip.free_size);
5608 if (del_cb) del_cb((void *)data, NULL, NULL);
5612 elm_genlist_item_tooltip_unset(Elm_Object_Item *it)
5614 ELM_OBJ_ITEM_CHECK_OR_RETURN(it);
5615 Elm_Gen_Item *_it = (Elm_Gen_Item *)it;
5617 if ((VIEW(_it)) && (_it->tooltip.content_cb))
5618 elm_widget_item_tooltip_unset(_it);
5620 if (_it->tooltip.del_cb)
5621 _it->tooltip.del_cb((void *) _it->tooltip.data, WIDGET(_it), _it);
5622 _it->tooltip.del_cb = NULL;
5623 _it->tooltip.content_cb = NULL;
5624 _it->tooltip.data = NULL;
5625 _it->tooltip.free_size = EINA_FALSE;
5626 if (_it->tooltip.style)
5627 elm_genlist_item_tooltip_style_set(it, NULL);
5631 elm_genlist_item_tooltip_style_set(Elm_Object_Item *it,
5634 ELM_OBJ_ITEM_CHECK_OR_RETURN(it);
5635 Elm_Gen_Item *_it = (Elm_Gen_Item *)it;
5637 eina_stringshare_replace(&_it->tooltip.style, style);
5638 if (VIEW(_it)) elm_widget_item_tooltip_style_set(_it, style);
5642 elm_genlist_item_tooltip_style_get(const Elm_Object_Item *it)
5644 return elm_object_item_tooltip_style_get(it);
5648 elm_genlist_item_tooltip_window_mode_set(Elm_Object_Item *it,
5651 ELM_OBJ_ITEM_CHECK_OR_RETURN(it, EINA_FALSE);
5652 Elm_Gen_Item *_it = (Elm_Gen_Item *)it;
5654 _it->tooltip.free_size = disable;
5655 if (VIEW(_it)) return elm_widget_item_tooltip_window_mode_set(_it, disable);
5660 elm_genlist_item_tooltip_window_mode_get(const Elm_Object_Item *it)
5662 return elm_object_tooltip_window_mode_get(VIEW(it));
5666 elm_genlist_item_cursor_set(Elm_Object_Item *it,
5669 ELM_OBJ_ITEM_CHECK_OR_RETURN(it);
5670 Elm_Gen_Item *_it = (Elm_Gen_Item *)it;
5671 eina_stringshare_replace(&_it->mouse_cursor, cursor);
5672 if (VIEW(_it)) elm_widget_item_cursor_set(_it, cursor);
5676 elm_genlist_item_cursor_get(const Elm_Object_Item *it)
5678 ELM_OBJ_ITEM_CHECK_OR_RETURN(it, NULL);
5679 return elm_widget_item_cursor_get(it);
5683 elm_genlist_item_cursor_unset(Elm_Object_Item *it)
5685 ELM_OBJ_ITEM_CHECK_OR_RETURN(it);
5686 Elm_Gen_Item *_it = (Elm_Gen_Item *)it;
5688 if (!_it->mouse_cursor) return;
5690 if (VIEW(_it)) elm_widget_item_cursor_unset(_it);
5692 eina_stringshare_del(_it->mouse_cursor);
5693 _it->mouse_cursor = NULL;
5697 elm_genlist_item_cursor_style_set(Elm_Object_Item *it,
5700 ELM_OBJ_ITEM_CHECK_OR_RETURN(it);
5701 elm_widget_item_cursor_style_set(it, style);
5705 elm_genlist_item_cursor_style_get(const Elm_Object_Item *it)
5707 ELM_OBJ_ITEM_CHECK_OR_RETURN(it, NULL);
5708 return elm_widget_item_cursor_style_get(it);
5712 elm_genlist_item_cursor_engine_only_set(Elm_Object_Item *it,
5713 Eina_Bool engine_only)
5715 ELM_OBJ_ITEM_CHECK_OR_RETURN(it);
5716 elm_widget_item_cursor_engine_only_set(it, engine_only);
5720 elm_genlist_item_cursor_engine_only_get(const Elm_Object_Item *it)
5722 ELM_OBJ_ITEM_CHECK_OR_RETURN(it, EINA_FALSE);
5723 return elm_widget_item_cursor_engine_only_get(it);
5727 elm_genlist_item_index_get(const Elm_Object_Item *it)
5729 ELM_OBJ_ITEM_CHECK_OR_RETURN(it, -1);
5730 Elm_Gen_Item *_it = (Elm_Gen_Item *)it;
5732 if (_it->item->block)
5733 return _it->position + (_it->item->block->position * _it->wd->max_items_per_block);
5738 elm_genlist_mode_set(Evas_Object *obj,
5741 ELM_CHECK_WIDTYPE(obj, widtype);
5742 Widget_Data *wd = elm_widget_data_get(obj);
5744 if (wd->mode == mode) return;
5746 if (wd->mode == ELM_LIST_COMPRESS)
5747 elm_genlist_homogeneous_set(obj, EINA_FALSE);
5753 elm_genlist_mode_get(const Evas_Object *obj)
5755 ELM_CHECK_WIDTYPE(obj, widtype) ELM_LIST_LAST;
5756 Widget_Data *wd = elm_widget_data_get(obj);
5757 if (!wd) return ELM_LIST_LAST;
5761 EINA_DEPRECATED EAPI void
5762 elm_genlist_always_select_mode_set(Evas_Object *obj,
5763 Eina_Bool always_select)
5765 ELM_CHECK_WIDTYPE(obj, widtype);
5766 Widget_Data *wd = elm_widget_data_get(obj);
5769 elm_genlist_select_mode_set(obj, ELM_OBJECT_SELECT_MODE_ALWAYS);
5772 Elm_Object_Select_Mode oldmode = elm_genlist_select_mode_get(obj);
5773 if (oldmode == ELM_OBJECT_SELECT_MODE_ALWAYS)
5774 elm_genlist_select_mode_set(obj, ELM_OBJECT_SELECT_MODE_DEFAULT);
5778 EINA_DEPRECATED EAPI Eina_Bool
5779 elm_genlist_always_select_mode_get(const Evas_Object *obj)
5781 ELM_CHECK_WIDTYPE(obj, widtype) EINA_FALSE;
5782 Widget_Data *wd = elm_widget_data_get(obj);
5783 if (!wd) return EINA_FALSE;
5784 Elm_Object_Select_Mode oldmode = elm_genlist_select_mode_get(obj);
5785 if (oldmode == ELM_OBJECT_SELECT_MODE_ALWAYS)
5790 EINA_DEPRECATED EAPI void
5791 elm_genlist_no_select_mode_set(Evas_Object *obj,
5792 Eina_Bool no_select)
5794 ELM_CHECK_WIDTYPE(obj, widtype);
5795 Widget_Data *wd = elm_widget_data_get(obj);
5798 elm_genlist_select_mode_set(obj, ELM_OBJECT_SELECT_MODE_NONE);
5801 Elm_Object_Select_Mode oldmode = elm_genlist_select_mode_get(obj);
5802 if (oldmode == ELM_OBJECT_SELECT_MODE_NONE)
5803 elm_genlist_select_mode_set(obj, ELM_OBJECT_SELECT_MODE_DEFAULT);
5807 EINA_DEPRECATED EAPI Eina_Bool
5808 elm_genlist_no_select_mode_get(const Evas_Object *obj)
5810 ELM_CHECK_WIDTYPE(obj, widtype) EINA_FALSE;
5811 Widget_Data *wd = elm_widget_data_get(obj);
5812 if (!wd) return EINA_FALSE;
5813 Elm_Object_Select_Mode oldmode = elm_genlist_select_mode_get(obj);
5814 if (oldmode == ELM_OBJECT_SELECT_MODE_NONE)
5820 elm_genlist_bounce_set(Evas_Object *obj,
5824 ELM_CHECK_WIDTYPE(obj, widtype);
5825 Widget_Data *wd = elm_widget_data_get(obj);
5827 wd->h_bounce = !!h_bounce;
5828 wd->v_bounce = !!v_bounce;
5829 elm_smart_scroller_bounce_allow_set(wd->scr, wd->h_bounce, wd->v_bounce);
5833 elm_genlist_bounce_get(const Evas_Object *obj,
5834 Eina_Bool *h_bounce,
5835 Eina_Bool *v_bounce)
5837 ELM_CHECK_WIDTYPE(obj, widtype);
5838 Widget_Data *wd = elm_widget_data_get(obj);
5840 if (h_bounce) *h_bounce = wd->h_bounce;
5841 if (v_bounce) *v_bounce = wd->v_bounce;
5845 elm_genlist_homogeneous_set(Evas_Object *obj,
5846 Eina_Bool homogeneous)
5848 ELM_CHECK_WIDTYPE(obj, widtype);
5849 Widget_Data *wd = elm_widget_data_get(obj);
5851 if (homogeneous) elm_genlist_mode_set(obj, ELM_LIST_COMPRESS);
5852 wd->homogeneous = !!homogeneous;
5856 elm_genlist_homogeneous_get(const Evas_Object *obj)
5858 ELM_CHECK_WIDTYPE(obj, widtype) EINA_FALSE;
5859 Widget_Data *wd = elm_widget_data_get(obj);
5860 if (!wd) return EINA_FALSE;
5861 return wd->homogeneous;
5865 elm_genlist_block_count_set(Evas_Object *obj,
5868 ELM_CHECK_WIDTYPE(obj, widtype);
5869 Widget_Data *wd = elm_widget_data_get(obj);
5871 wd->max_items_per_block = count;
5872 wd->item_cache_max = wd->max_items_per_block * 2;
5873 _item_cache_clean(wd);
5877 elm_genlist_block_count_get(const Evas_Object *obj)
5879 ELM_CHECK_WIDTYPE(obj, widtype) 0;
5880 Widget_Data *wd = elm_widget_data_get(obj);
5882 return wd->max_items_per_block;
5886 elm_genlist_longpress_timeout_set(Evas_Object *obj,
5889 ELM_CHECK_WIDTYPE(obj, widtype);
5890 Widget_Data *wd = elm_widget_data_get(obj);
5892 wd->longpress_timeout = timeout;
5896 elm_genlist_longpress_timeout_get(const Evas_Object *obj)
5898 ELM_CHECK_WIDTYPE(obj, widtype) 0;
5899 Widget_Data *wd = elm_widget_data_get(obj);
5901 return wd->longpress_timeout;
5905 elm_genlist_scroller_policy_set(Evas_Object *obj,
5906 Elm_Scroller_Policy policy_h,
5907 Elm_Scroller_Policy policy_v)
5909 ELM_CHECK_WIDTYPE(obj, widtype);
5910 Widget_Data *wd = elm_widget_data_get(obj);
5911 if ((!wd) || (!wd->scr)) return;
5912 if ((policy_h >= ELM_SCROLLER_POLICY_LAST) ||
5913 (policy_v >= ELM_SCROLLER_POLICY_LAST))
5915 elm_smart_scroller_policy_set(wd->scr, policy_h, policy_v);
5919 elm_genlist_scroller_policy_get(const Evas_Object *obj,
5920 Elm_Scroller_Policy *policy_h,
5921 Elm_Scroller_Policy *policy_v)
5923 ELM_CHECK_WIDTYPE(obj, widtype);
5924 Widget_Data *wd = elm_widget_data_get(obj);
5925 Elm_Smart_Scroller_Policy s_policy_h, s_policy_v;
5926 if ((!wd) || (!wd->scr)) return;
5927 elm_smart_scroller_policy_get(wd->scr, &s_policy_h, &s_policy_v);
5928 if (policy_h) *policy_h = (Elm_Scroller_Policy)s_policy_h;
5929 if (policy_v) *policy_v = (Elm_Scroller_Policy)s_policy_v;
5933 elm_genlist_realized_items_update(Evas_Object *obj)
5935 ELM_CHECK_WIDTYPE(obj, widtype);
5937 Eina_List *list, *l;
5938 Elm_Object_Item *it;
5940 list = elm_genlist_realized_items_get(obj);
5941 EINA_LIST_FOREACH(list, l, it)
5942 elm_genlist_item_update(it);
5946 elm_genlist_item_decorate_mode_set(Elm_Object_Item *it,
5947 const char *mode_type,
5950 ELM_OBJ_ITEM_CHECK_OR_RETURN(it);
5951 Elm_Gen_Item *_it = (Elm_Gen_Item *)it;
5953 Widget_Data *wd = _it->wd;
5955 Elm_Object_Item *it2;
5958 if (!mode_type) return;
5959 if ((_it->generation < _it->wd->generation) ||
5960 elm_widget_item_disabled_get(_it)) return;
5961 if (wd->decorate_mode) return;
5963 if ((wd->mode_item == _it) &&
5964 (!strcmp(mode_type, wd->mode_type)) &&
5967 if (!_it->itc->mode_item_style) return;
5968 _it->mode_set = mode_set;
5972 EINA_LIST_FOREACH(wd->selected, l, it2)
5973 if (((Elm_Gen_Item *)it2)->realized)
5974 elm_genlist_item_selected_set(it2, EINA_FALSE);
5978 it2 = elm_genlist_selected_item_get(wd->obj);
5979 if ((it2) && (((Elm_Gen_Item *)it2)->realized))
5980 elm_genlist_item_selected_set(it2, EINA_FALSE);
5983 if (((wd->mode_type) && (strcmp(mode_type, wd->mode_type))) ||
5985 ((_it == wd->mode_item) && (!mode_set)))
5986 _item_mode_unset(wd);
5988 eina_stringshare_replace(&wd->mode_type, mode_type);
5989 if (mode_set) _item_mode_set(_it);
5993 elm_genlist_item_decorate_mode_get(const Elm_Object_Item *it)
5995 ELM_OBJ_ITEM_CHECK_OR_RETURN(it, NULL);
5996 Elm_Gen_Item *_it = (Elm_Gen_Item *)it;
5997 return _it->wd->mode_type;
6000 EAPI const Elm_Object_Item *
6001 elm_genlist_decorated_item_get(const Evas_Object *obj)
6003 ELM_CHECK_WIDTYPE(obj, widtype) NULL;
6004 Widget_Data *wd = elm_widget_data_get(obj);
6005 if (!wd) return NULL;
6006 return (Elm_Object_Item *) wd->mode_item;
6010 elm_genlist_decorate_mode_get(const Evas_Object *obj)
6012 ELM_CHECK_WIDTYPE(obj, widtype) EINA_FALSE;
6013 Widget_Data *wd = elm_widget_data_get(obj);
6014 if (!wd) return EINA_FALSE;
6016 return wd->decorate_mode;
6020 elm_genlist_decorate_mode_set(Evas_Object *obj, Eina_Bool decorated)
6022 ELM_CHECK_WIDTYPE(obj, widtype);
6023 Eina_List *list, *l;
6026 Widget_Data *wd = elm_widget_data_get(obj);
6028 decorated = !!decorated;
6029 if (wd->decorate_mode == decorated) return;
6030 wd->decorate_mode = decorated;
6032 list = elm_genlist_realized_items_get(obj);
6033 if (!wd->decorate_mode)
6035 EINA_LIST_FOREACH(list, l, it)
6037 if (it->item->type != ELM_GENLIST_ITEM_GROUP)
6038 _decorate_mode_item_unrealize(it);
6040 _item_cache_zero(wd);
6044 EINA_LIST_FOREACH(list, l, it)
6046 if (it->item->type != ELM_GENLIST_ITEM_GROUP)
6048 if (it->selected) _item_unselect(it);
6049 if (it->itc->edit_item_style)
6050 _decorate_mode_item_realize(it, EINA_TRUE);
6054 if (wd->calc_job) ecore_job_del(wd->calc_job);
6055 wd->calc_job = ecore_job_add(_calc_job, wd);
6059 elm_genlist_reorder_mode_set(Evas_Object *obj,
6060 Eina_Bool reorder_mode)
6062 ELM_CHECK_WIDTYPE(obj, widtype);
6063 Widget_Data *wd = elm_widget_data_get(obj);
6065 wd->reorder_mode = !!reorder_mode;
6069 elm_genlist_reorder_mode_get(const Evas_Object *obj)
6071 ELM_CHECK_WIDTYPE(obj, widtype) EINA_FALSE;
6072 Widget_Data *wd = elm_widget_data_get(obj);
6073 if (!wd) return EINA_FALSE;
6074 return wd->reorder_mode;
6077 EAPI Elm_Genlist_Item_Type
6078 elm_genlist_item_type_get(const Elm_Object_Item *it)
6080 ELM_OBJ_ITEM_CHECK_OR_RETURN(it, ELM_GENLIST_ITEM_MAX);
6081 Elm_Gen_Item *_it = (Elm_Gen_Item *)it;
6082 return _it->item->type;
6085 EINA_DEPRECATED EAPI Elm_Genlist_Item_Type
6086 elm_genlist_item_flags_get(const Elm_Object_Item *it)
6088 return elm_genlist_item_type_get(it);
6091 EAPI Elm_Genlist_Item_Class *
6092 elm_genlist_item_class_new(void)
6094 Elm_Genlist_Item_Class *itc;
6096 itc = calloc(1, sizeof(Elm_Genlist_Item_Class));
6099 itc->version = CLASS_ALLOCATED;
6101 itc->delete_me = EINA_FALSE;
6107 elm_genlist_item_class_free(Elm_Genlist_Item_Class *itc)
6109 if (itc && (itc->version == CLASS_ALLOCATED))
6111 if (!itc->delete_me) itc->delete_me = EINA_TRUE;
6112 if (itc->refcount > 0) elm_genlist_item_class_unref(itc);
6122 elm_genlist_item_class_ref(Elm_Genlist_Item_Class *itc)
6124 if (itc && (itc->version == CLASS_ALLOCATED))
6127 if (itc->refcount == 0) itc->refcount--;
6132 elm_genlist_item_class_unref(Elm_Genlist_Item_Class *itc)
6134 if (itc && (itc->version == CLASS_ALLOCATED))
6136 if (itc->refcount > 0) itc->refcount--;
6137 if (itc->delete_me && (!itc->refcount))
6138 elm_genlist_item_class_free(itc);
6142 void _flip_job(void *data)
6144 Elm_Gen_Item *it = (Elm_Gen_Item *) data;
6145 _elm_genlist_item_unrealize(it, EINA_FALSE);
6146 if (it->selected) _item_unselect(it);
6147 it->flipped = EINA_TRUE;
6148 it->item->nocache = EINA_TRUE;
6152 elm_genlist_item_flip_set(Elm_Object_Item *it,
6155 ELM_OBJ_ITEM_CHECK_OR_RETURN(it);
6156 Elm_Gen_Item *_it = (Elm_Gen_Item *)it;
6159 if (_it->flipped == flip) return;
6163 ecore_job_add(_flip_job, _it);
6164 if (_it->wd->calc_job) ecore_job_del(_it->wd->calc_job);
6165 _it->wd->calc_job = ecore_job_add(_calc_job, _it->wd);
6169 _it->flipped = flip;
6170 _item_cache_zero(_it->wd);
6171 elm_genlist_item_update(it);
6172 _it->item->nocache = EINA_FALSE;
6177 elm_genlist_item_flip_get(const Elm_Object_Item *it)
6179 ELM_OBJ_ITEM_CHECK_OR_RETURN(it, EINA_FALSE);
6180 Elm_Gen_Item *_it = (Elm_Gen_Item *)it;
6181 return _it->flipped;
6185 elm_genlist_select_mode_set(Evas_Object *obj, Elm_Object_Select_Mode mode)
6187 ELM_CHECK_WIDTYPE(obj, widtype);
6188 Widget_Data *wd = elm_widget_data_get(obj);
6190 if (mode >= ELM_OBJECT_SELECT_MODE_MAX)
6192 if (wd->select_mode != mode)
6193 wd->select_mode = mode;
6196 EAPI Elm_Object_Select_Mode
6197 elm_genlist_select_mode_get(const Evas_Object *obj)
6199 ELM_CHECK_WIDTYPE(obj, widtype) ELM_OBJECT_SELECT_MODE_MAX;
6200 Widget_Data *wd = elm_widget_data_get(obj);
6201 if (!wd) return ELM_OBJECT_SELECT_MODE_MAX;
6202 return wd->select_mode;
6206 elm_genlist_highlight_mode_set(Evas_Object *obj,
6207 Eina_Bool highlight)
6209 ELM_CHECK_WIDTYPE(obj, widtype);
6210 Widget_Data *wd = elm_widget_data_get(obj);
6212 highlight = !!highlight;
6213 wd->no_highlight = !highlight;
6217 elm_genlist_highlight_mode_get(const Evas_Object *obj)
6219 ELM_CHECK_WIDTYPE(obj, widtype) EINA_FALSE;
6220 Widget_Data *wd = elm_widget_data_get(obj);
6221 if (!wd) return EINA_FALSE;
6222 return !wd->no_highlight;
6226 elm_genlist_item_select_mode_set(Elm_Object_Item *it,
6227 Elm_Object_Select_Mode mode)
6229 ELM_OBJ_ITEM_CHECK_OR_RETURN(it);
6230 Elm_Gen_Item *_it = (Elm_Gen_Item *)it;
6232 if (_it->generation < _it->wd->generation) return;
6233 if (mode >= ELM_OBJECT_SELECT_MODE_MAX)
6235 if (_it->select_mode != mode)
6236 _it->select_mode = mode;
6238 if (_it->select_mode == ELM_OBJECT_SELECT_MODE_DISPLAY_ONLY)
6240 _it->item->mincalcd = EINA_FALSE;
6241 _it->item->updateme = EINA_TRUE;
6242 if (_it->item->block) _it->item->block->updateme = EINA_TRUE;
6243 if (_it->wd->update_job) ecore_job_del(_it->wd->update_job);
6244 _it->wd->update_job = ecore_job_add(_update_job, _it->wd);
6248 EAPI Elm_Object_Select_Mode
6249 elm_genlist_item_select_mode_get(const Elm_Object_Item *it)
6251 ELM_OBJ_ITEM_CHECK_OR_RETURN(it, ELM_OBJECT_SELECT_MODE_MAX);
6252 Elm_Gen_Item *_it = (Elm_Gen_Item *)it;
6253 if (!_it) return ELM_OBJECT_SELECT_MODE_MAX;
6254 return _it->select_mode;
6257 /* for gengrid as of now */
6259 _elm_genlist_page_relative_set(Evas_Object *obj,
6263 Evas_Coord pagesize_h;
6264 Evas_Coord pagesize_v;
6266 ELM_CHECK_WIDTYPE(obj, widtype);
6267 Widget_Data *wd = elm_widget_data_get(obj);
6270 elm_smart_scroller_paging_get(wd->scr, NULL, NULL, &pagesize_h, &pagesize_v);
6271 elm_smart_scroller_paging_set(wd->scr, h_pagerel, v_pagerel, pagesize_h,
6275 /* for gengrid as of now */
6277 _elm_genlist_page_relative_get(const Evas_Object *obj,
6281 ELM_CHECK_WIDTYPE(obj, widtype);
6282 Widget_Data *wd = elm_widget_data_get(obj);
6285 elm_smart_scroller_paging_get(wd->scr, h_pagerel, v_pagerel, NULL, NULL);
6288 /* for gengrid as of now */
6290 _elm_genlist_page_size_set(Evas_Object *obj,
6291 Evas_Coord h_pagesize,
6292 Evas_Coord v_pagesize)
6297 ELM_CHECK_WIDTYPE(obj, widtype);
6298 Widget_Data *wd = elm_widget_data_get(obj);
6300 elm_smart_scroller_paging_get(wd->scr, &pagerel_h, &pagerel_v, NULL, NULL);
6301 elm_smart_scroller_paging_set(wd->scr, pagerel_h, pagerel_v, h_pagesize,
6305 /* for gengrid as of now */
6307 _elm_genlist_current_page_get(const Evas_Object *obj,
6311 ELM_CHECK_WIDTYPE(obj, widtype);
6312 Widget_Data *wd = elm_widget_data_get(obj);
6314 elm_smart_scroller_current_page_get(wd->scr, h_pagenumber, v_pagenumber);
6317 /* for gengrid as of now */
6319 _elm_genlist_last_page_get(const Evas_Object *obj,
6323 ELM_CHECK_WIDTYPE(obj, widtype);
6324 Widget_Data *wd = elm_widget_data_get(obj);
6326 elm_smart_scroller_last_page_get(wd->scr, h_pagenumber, v_pagenumber);
6329 /* for gengrid as of now */
6331 _elm_genlist_page_show(const Evas_Object *obj,
6335 ELM_CHECK_WIDTYPE(obj, widtype);
6336 Widget_Data *wd = elm_widget_data_get(obj);
6338 elm_smart_scroller_page_show(wd->scr, h_pagenumber, v_pagenumber);
6341 /* for gengrid as of now */
6343 _elm_genlist_page_bring_in(const Evas_Object *obj,
6347 ELM_CHECK_WIDTYPE(obj, widtype);
6348 Widget_Data *wd = elm_widget_data_get(obj);
6350 elm_smart_scroller_page_bring_in(wd->scr, h_pagenumber, v_pagenumber);
6354 _elm_genlist_item_unrealize(Elm_Gen_Item *it,
6357 Evas_Object *content;
6359 if (!it->realized) return;
6360 if (it->wd->reorder_it == it) return;
6361 if (it->defer_unrealize && !it->updateme) return;
6363 evas_event_freeze(evas_object_evas_get(WIDGET(it)));
6365 evas_object_smart_callback_call(WIDGET(it), SIG_UNREALIZED, it);
6368 ecore_timer_del(it->long_timer);
6369 it->long_timer = NULL;
6372 elm_widget_stringlist_free(it->texts);
6374 elm_widget_stringlist_free(it->contents);
6375 it->contents = NULL;
6376 elm_widget_stringlist_free(it->states);
6379 EINA_LIST_FREE(it->content_objs, content)
6380 evas_object_del(content);
6382 it->unrealize_cb(it);
6384 it->realized = EINA_FALSE;
6385 it->want_unrealize = EINA_FALSE;
6386 evas_event_thaw(evas_object_evas_get(WIDGET(it)));
6387 evas_event_thaw_eval(evas_object_evas_get(WIDGET(it)));
6391 _elm_genlist_item_del_notserious(Elm_Gen_Item *it)
6393 elm_widget_item_pre_notify_del(it);
6394 it->generation = it->wd->generation - 1; /* This means that the item is deleted */
6396 if (it->walking) return; /* func.del is called twice when it->func.func is _elm_widget_item_del*/
6397 if (it->selected) it->wd->selected = eina_list_remove(it->wd->selected, it);
6399 if (it->itc->func.del)
6400 it->itc->func.del((void *)it->base.data, WIDGET(it));
6404 _elm_genlist_item_del_serious(Elm_Gen_Item *it)
6406 _elm_genlist_item_del_notserious(it);
6407 it->wd->items = eina_inlist_remove(it->wd->items, EINA_INLIST_GET(it));
6408 if (it->tooltip.del_cb)
6409 it->tooltip.del_cb((void *)it->tooltip.data, WIDGET(it), it);
6410 it->wd->walking -= it->walking;
6411 if (it->long_timer) ecore_timer_del(it->long_timer);
6413 it->wd->group_items = eina_list_remove(it->wd->group_items, it);
6417 eina_inlist_sorted_state_free(it->wd->state);
6418 it->wd->state = NULL;
6420 if (it->wd->calc_job) ecore_job_del(it->wd->calc_job);
6421 it->wd->calc_job = ecore_job_add(it->wd->calc_cb, it->wd);
6425 if (it->wd->last_selected_item == (Elm_Object_Item *)it)
6426 it->wd->last_selected_item = NULL;
6427 it->wd->item_count--;
6431 elm_genlist_tree_effect_enabled_set(Evas_Object *obj, Eina_Bool enabled)
6433 ELM_CHECK_WIDTYPE(obj, widtype);
6434 Widget_Data *wd = elm_widget_data_get(obj);
6436 wd->tree_effect_enabled = !!enabled;
6440 elm_genlist_tree_effect_enabled_get(const Evas_Object *obj)
6442 ELM_CHECK_WIDTYPE(obj, widtype) EINA_FALSE;
6443 Widget_Data *wd = elm_widget_data_get(obj);
6444 if (!wd) return EINA_FALSE;
6445 return wd->tree_effect_enabled;
6449 _create_tray_alpha_bg(const Evas_Object *obj)
6451 ELM_CHECK_WIDTYPE(obj, widtype) NULL;
6452 Widget_Data *wd = elm_widget_data_get(obj);
6453 if (!wd) return NULL;
6455 Evas_Object *bg = NULL;
6456 Evas_Coord ox, oy, ow, oh;
6458 evas_object_geometry_get(wd->pan_smart, &ox, &oy, &ow, &oh);
6459 bg = evas_object_rectangle_add(evas_object_evas_get(wd->obj));
6460 evas_object_color_set(bg,0,0,0,0);
6461 evas_object_resize(bg , ow, oh);
6462 evas_object_move(bg , ox, oy);
6467 _item_contract_emit(Elm_Gen_Item *it)
6472 edje_object_signal_emit(VIEW(it), "elm,state,contract_flip", "");
6473 it->item->tree_effect_finished = EINA_FALSE;
6475 EINA_LIST_FOREACH(it->item->items, l, it2)
6476 if (it2) _item_contract_emit(it2);
6480 _item_tree_effect_before(Elm_Gen_Item *it)
6485 EINA_LIST_FOREACH(it->item->items, l, it2)
6487 if (it2->parent && (it == it2->parent))
6489 if (it->wd->move_effect_mode == ELM_GENLIST_TREE_EFFECT_EXPAND)
6490 edje_object_signal_emit(VIEW(it2), "elm,state,hide", "");
6491 else if (it->wd->move_effect_mode == ELM_GENLIST_TREE_EFFECT_CONTRACT)
6492 _item_contract_emit(it2);
6495 return ECORE_CALLBACK_CANCEL;
6499 _item_tree_effect(Widget_Data *wd, int y)
6501 Elm_Gen_Item *it = NULL, *expanded_next_it;
6503 expanded_next_it = wd->expanded_next_item;
6505 if (wd->move_effect_mode == ELM_GENLIST_TREE_EFFECT_EXPAND)
6507 it = (Elm_Gen_Item *) elm_genlist_item_prev_get((Elm_Object_Item *) expanded_next_it);
6510 if (it->item->expanded_depth <= expanded_next_it->item->expanded_depth) break;
6511 if (it->item->scrl_y && (it->item->scrl_y < expanded_next_it->item->old_scrl_y + y) &&
6512 (it->item->expanded_depth > expanded_next_it->item->expanded_depth))
6514 if (!it->item->tree_effect_finished)
6516 edje_object_signal_emit(VIEW(it), "flip_item", "");
6517 evas_object_show(VIEW(it));
6518 it->item->tree_effect_finished = EINA_TRUE;
6521 it = (Elm_Gen_Item *) elm_genlist_item_prev_get((Elm_Object_Item *) it);
6524 else if (wd->move_effect_mode == ELM_GENLIST_TREE_EFFECT_CONTRACT)
6526 it = (Elm_Gen_Item *) elm_genlist_item_prev_get((Elm_Object_Item *) expanded_next_it);
6529 if ((it->item->scrl_y > expanded_next_it->item->old_scrl_y + y) &&
6530 (it->item->expanded_depth > expanded_next_it->item->expanded_depth))
6532 if (!it->item->tree_effect_finished)
6534 edje_object_signal_emit(VIEW(it), "elm,state,hide", "");
6535 it->item->tree_effect_finished = EINA_TRUE;
6540 it = (Elm_Gen_Item *) elm_genlist_item_prev_get((Elm_Object_Item *) it);
6546 _item_tree_effect_finish(Widget_Data *wd)
6549 Elm_Gen_Item *it = NULL;
6552 if (wd->item_moving_effect_timer)
6554 if (wd->move_effect_mode == ELM_GENLIST_TREE_EFFECT_CONTRACT)
6555 _item_subitems_clear(wd->expanded_item);
6556 EINA_INLIST_FOREACH(wd->blocks, itb)
6558 EINA_LIST_FOREACH(itb->items, l, it)
6560 it->item->tree_effect_finished = EINA_TRUE;
6561 it->item->old_scrl_y = it->item->scrl_y;
6565 _item_auto_scroll(wd);
6566 evas_object_lower(wd->alpha_bg);
6567 evas_object_hide(wd->alpha_bg);
6568 wd->move_effect_mode = ELM_GENLIST_TREE_EFFECT_NONE;
6569 if (wd->move_items) wd->move_items = eina_list_free(wd->move_items);
6571 evas_object_smart_callback_call(wd->pan_smart, "changed", NULL);
6572 evas_object_smart_callback_call(wd->obj, SIG_TREE_EFFECT_FINISHED, NULL);
6573 evas_object_smart_changed(wd->pan_smart);
6575 wd->item_moving_effect_timer = NULL;
6579 _item_moving_effect_timer_cb(void *data)
6581 Widget_Data *wd = data;
6582 if (!wd) return EINA_FALSE;
6583 Evas_Coord ox, oy, ow, oh, cvx, cvy, cvw, cvh;
6584 Elm_Gen_Item *it = NULL, *it2, *expanded_next_it;
6586 double effect_duration = 0.5, t;
6587 int y = 0, dy = 0, dh = 0;
6588 Eina_Bool end = EINA_FALSE, vis = EINA_TRUE;
6591 t = ((0.0 > (t = ecore_time_get() - wd->start_time)) ? 0.0 : t);
6592 evas_object_geometry_get(wd->pan_smart, &ox, &oy, &ow, &oh);
6593 evas_output_viewport_get(evas_object_evas_get(wd->pan_smart), &cvx, &cvy, &cvw, &cvh);
6594 if (t > effect_duration) end = EINA_TRUE;
6596 // Below while statement is needed, when the genlist is resized.
6597 it2 = wd->expanded_item;
6600 evas_object_move(VIEW(it2), it2->item->scrl_x, it2->item->scrl_y);
6601 vis = (ELM_RECTS_INTERSECT(it2->item->scrl_x, it2->item->scrl_y, it2->item->w, it2->item->h,
6602 cvx, cvy, cvw, cvh));
6603 it2 = (Elm_Gen_Item *) elm_genlist_item_prev_get((Elm_Object_Item *) it2);
6606 if (wd->expanded_next_item)
6608 expanded_next_it = wd->expanded_next_item;
6611 EINA_LIST_FOREACH(wd->move_items, l, it)
6613 if (wd->move_effect_mode == ELM_GENLIST_TREE_EFFECT_EXPAND)
6615 expanded_next_it->item->old_scrl_y = wd->expanded_item->item->old_scrl_y + wd->expanded_item->item->h;
6616 if (expanded_next_it->item->scrl_y < expanded_next_it->item->old_scrl_y) //did not calculate next item position
6617 expanded_next_it->item->scrl_y = cvy + cvh;
6619 dy = ((expanded_next_it->item->scrl_y >= (cvy + cvh)) ?
6620 cvy + cvh : expanded_next_it->item->scrl_y) -
6621 expanded_next_it->item->old_scrl_y;
6623 else if (wd->move_effect_mode == ELM_GENLIST_TREE_EFFECT_CONTRACT)
6625 if (expanded_next_it->item->scrl_y > expanded_next_it->item->old_scrl_y) //did not calculate next item position
6626 expanded_next_it->item->old_scrl_y = cvy + cvh;
6628 if (expanded_next_it->item->old_scrl_y > (cvy + cvh))
6630 dy = (wd->expanded_item->item->scrl_y + wd->expanded_item->item->h) -
6632 expanded_next_it->item->old_scrl_y = cvy + cvh;
6636 dy = (wd->expanded_item->item->scrl_y + wd->expanded_item->item->h) -
6637 expanded_next_it->item->old_scrl_y;
6641 if (t <= effect_duration)
6643 y = ((1 - (1 - (t / effect_duration)) * (1 - (t /effect_duration))) * dy);
6653 _item_realize(it, in, 0);
6657 if (it != expanded_next_it)
6659 it->item->old_scrl_y = expanded_next_it->item->old_scrl_y + expanded_next_it->item->h + dh;
6663 if ((it->item->old_scrl_y + y) < (cvy + cvh))
6664 _item_position(it, VIEW(it),it->item->scrl_x, it->item->old_scrl_y + y);
6667 _item_tree_effect(wd, y);
6671 int expanded_item_num = 0;
6674 if (wd->expanded_item)
6675 it = (Elm_Gen_Item *) elm_genlist_item_next_get((Elm_Object_Item *) wd->expanded_item);
6680 expanded_item_num++;
6681 it2 = (Elm_Gen_Item *) elm_genlist_item_next_get((Elm_Object_Item *) it2);
6687 if (wd->expanded_item->item->expanded_depth >= it->item->expanded_depth) break;
6688 if (wd->move_effect_mode == ELM_GENLIST_TREE_EFFECT_EXPAND)
6690 if (!it->item->tree_effect_finished)
6692 if (t >= (((num - 1) * effect_duration) / expanded_item_num))
6694 edje_object_signal_emit(VIEW(it), "flip_item", "");
6695 evas_object_show(VIEW(it));
6696 it->item->tree_effect_finished = EINA_TRUE;
6700 it = (Elm_Gen_Item *) elm_genlist_item_next_get((Elm_Object_Item *) it);
6706 _item_tree_effect_finish(wd);
6707 return ECORE_CALLBACK_CANCEL;
6709 return ECORE_CALLBACK_RENEW;