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 edit_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;
100 Eina_Bool must_recalc : 1;
107 Evas_Object *base_view, *spacer;
109 const char *item_style; // it->itc->item_style
110 Eina_Bool tree : 1; // it->group
111 Eina_Bool compress : 1; // it->wd->compress
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 Eina_Bool _item_multi_select_up(Widget_Data *wd);
136 static Eina_Bool _item_multi_select_down(Widget_Data *wd);
137 static Eina_Bool _item_single_select_up(Widget_Data *wd);
138 static Eina_Bool _item_single_select_down(Widget_Data *wd);
139 static Eina_Bool _event_hook(Evas_Object *obj,
141 Evas_Callback_Type type,
143 static void _signal_emit_hook(Evas_Object *obj,
144 const char *emission,
146 static Eina_Bool _deselect_all_items(Widget_Data *wd);
147 static void _pan_calculate(Evas_Object *obj);
148 static void _pan_max_get(Evas_Object *obj,
151 static void _item_position(Elm_Gen_Item *it,
155 static void _mode_item_realize(Elm_Gen_Item *it);
156 static void _mode_item_unrealize(Elm_Gen_Item *it);
157 static void _item_mode_set(Elm_Gen_Item *it);
158 static void _item_mode_unset(Widget_Data *wd);
159 static void _edit_mode_item_position(Elm_Gen_Item *it, int itx, int ity);
160 static void _edit_mode_item_realize(Elm_Gen_Item *it, Eina_Bool effect_on);
161 static void _edit_mode_item_unrealize(Elm_Gen_Item *it);
162 static void _group_items_recalc(void *data);
163 static void _item_move_after(Elm_Gen_Item *it,
164 Elm_Gen_Item *after);
165 static void _item_move_before(Elm_Gen_Item *it,
166 Elm_Gen_Item *before);
167 static void _item_auto_scroll(Widget_Data *wd);
168 static void _elm_genlist_clear(Evas_Object *obj,
170 static void _pan_child_size_get(Evas_Object *obj,
173 static Evas_Object* _create_tray_alpha_bg(const Evas_Object *obj);
174 static void _item_contract_emit(Elm_Gen_Item *it);
175 static int _item_tree_effect_before(Elm_Gen_Item *it);
176 static void _item_tree_effect(Widget_Data *wd, int y);
177 static void _item_tree_effect_finish(Widget_Data *wd);
178 static Eina_Bool _item_moving_effect_timer_cb(void *data);
180 static Evas_Smart_Class _pan_sc = EVAS_SMART_CLASS_INIT_VERSION;
182 static const char SIG_ACTIVATED[] = "activated";
183 static const char SIG_CLICKED_DOUBLE[] = "clicked,double";
184 static const char SIG_SELECTED[] = "selected";
185 static const char SIG_UNSELECTED[] = "unselected";
186 static const char SIG_EXPANDED[] = "expanded";
187 static const char SIG_CONTRACTED[] = "contracted";
188 static const char SIG_EXPAND_REQUEST[] = "expand,request";
189 static const char SIG_CONTRACT_REQUEST[] = "contract,request";
190 static const char SIG_REALIZED[] = "realized";
191 static const char SIG_UNREALIZED[] = "unrealized";
192 static const char SIG_DRAG_START_UP[] = "drag,start,up";
193 static const char SIG_DRAG_START_DOWN[] = "drag,start,down";
194 static const char SIG_DRAG_START_LEFT[] = "drag,start,left";
195 static const char SIG_DRAG_START_RIGHT[] = "drag,start,right";
196 static const char SIG_DRAG_STOP[] = "drag,stop";
197 static const char SIG_DRAG[] = "drag";
198 static const char SIG_LONGPRESSED[] = "longpressed";
199 static const char SIG_SCROLL_ANIM_START[] = "scroll,anim,start";
200 static const char SIG_SCROLL_ANIM_STOP[] = "scroll,anim,stop";
201 static const char SIG_SCROLL_DRAG_START[] = "scroll,drag,start";
202 static const char SIG_SCROLL_DRAG_STOP[] = "scroll,drag,stop";
203 static const char SIG_EDGE_TOP[] = "edge,top";
204 static const char SIG_EDGE_BOTTOM[] = "edge,bottom";
205 static const char SIG_EDGE_LEFT[] = "edge,left";
206 static const char SIG_EDGE_RIGHT[] = "edge,right";
207 static const char SIG_MULTI_SWIPE_LEFT[] = "multi,swipe,left";
208 static const char SIG_MULTI_SWIPE_RIGHT[] = "multi,swipe,right";
209 static const char SIG_MULTI_SWIPE_UP[] = "multi,swipe,up";
210 static const char SIG_MULTI_SWIPE_DOWN[] = "multi,swipe,down";
211 static const char SIG_MULTI_PINCH_OUT[] = "multi,pinch,out";
212 static const char SIG_MULTI_PINCH_IN[] = "multi,pinch,in";
213 static const char SIG_SWIPE[] = "swipe";
214 static const char SIG_MOVED[] = "moved";
215 static const char SIG_INDEX_UPDATE[] = "index,update";
216 static const char SIG_TREE_EFFECT_FINISHED [] = "tree,effect,finished";
218 static const Evas_Smart_Cb_Description _signals[] = {
219 {SIG_CLICKED_DOUBLE, ""},
222 {SIG_UNSELECTED, ""},
224 {SIG_CONTRACTED, ""},
225 {SIG_EXPAND_REQUEST, ""},
226 {SIG_CONTRACT_REQUEST, ""},
228 {SIG_UNREALIZED, ""},
229 {SIG_DRAG_START_UP, ""},
230 {SIG_DRAG_START_DOWN, ""},
231 {SIG_DRAG_START_LEFT, ""},
232 {SIG_DRAG_START_RIGHT, ""},
235 {SIG_LONGPRESSED, ""},
236 {SIG_SCROLL_ANIM_START, ""},
237 {SIG_SCROLL_ANIM_STOP, ""},
238 {SIG_SCROLL_DRAG_START, ""},
239 {SIG_SCROLL_DRAG_STOP, ""},
241 {SIG_EDGE_BOTTOM, ""},
243 {SIG_EDGE_RIGHT, ""},
244 {SIG_MULTI_SWIPE_LEFT, ""},
245 {SIG_MULTI_SWIPE_RIGHT, ""},
246 {SIG_MULTI_SWIPE_UP, ""},
247 {SIG_MULTI_SWIPE_DOWN, ""},
248 {SIG_MULTI_PINCH_OUT, ""},
249 {SIG_MULTI_PINCH_IN, ""},
252 {SIG_TREE_EFFECT_FINISHED, ""},
257 #undef ELM_CHECK_WIDTYPE
258 #define ELM_CHECK_WIDTYPE(obj, widtype) \
259 if ((!obj) || (!elm_genlist_type_check((obj), __func__))) return
260 #undef ELM_WIDGET_ITEM_WIDTYPE_CHECK_OR_RETURN
261 #define ELM_WIDGET_ITEM_WIDTYPE_CHECK_OR_RETURN(it, ...) \
262 ELM_WIDGET_ITEM_CHECK_OR_RETURN((Elm_Widget_Item *)it, __VA_ARGS__); \
263 ELM_CHECK_WIDTYPE(WIDGET((it)), widtype) __VA_ARGS__;
265 static const char *_gengrid = NULL;
266 static const char *_genlist = NULL;
268 /* THIS FUNCTION IS HACKY AND TEMPORARY!!! */
270 elm_genlist_type_check(const Evas_Object *obj,
273 const char *provided, *expected = "(unknown)";
274 static int abort_on_warn = -1;
275 provided = elm_widget_type_get(obj);
276 if (!_genlist) _genlist = eina_stringshare_add("genlist");
277 if (!_gengrid) _gengrid = eina_stringshare_add("gengrid");
278 if (EINA_LIKELY(provided == _genlist) || EINA_LIKELY(provided == _gengrid))
280 if ((!provided) || (!provided[0]))
282 provided = evas_object_type_get(obj);
283 if ((!provided) || (!provided[0]))
284 provided = "(unknown)";
286 ERR("Passing Object: %p in function: %s, of type: '%s' when expecting type: '%s'", obj, func, provided, expected);
287 if (abort_on_warn == -1)
289 if (getenv("ELM_ERROR_ABORT")) abort_on_warn = 1;
290 else abort_on_warn = 0;
292 if (abort_on_warn == 1) abort();
297 _event_hook(Evas_Object *obj,
298 Evas_Object *src __UNUSED__,
299 Evas_Callback_Type type,
302 if (type != EVAS_CALLBACK_KEY_DOWN) return EINA_FALSE;
303 Evas_Event_Key_Down *ev = event_info;
304 Widget_Data *wd = elm_widget_data_get(obj);
305 Evas_Coord pan_max_x = 0, pan_max_y = 0;
306 if (!wd) return EINA_FALSE;
307 if (!wd->items) return EINA_FALSE;
308 if (ev->event_flags & EVAS_EVENT_FLAG_ON_HOLD) return EINA_FALSE;
309 if (elm_widget_disabled_get(obj)) return EINA_FALSE;
311 Elm_Object_Item *it = NULL;
314 Evas_Coord step_x = 0;
315 Evas_Coord step_y = 0;
318 Evas_Coord page_x = 0;
319 Evas_Coord page_y = 0;
321 elm_smart_scroller_child_pos_get(wd->scr, &x, &y);
322 elm_smart_scroller_step_size_get(wd->scr, &step_x, &step_y);
323 elm_smart_scroller_page_size_get(wd->scr, &page_x, &page_y);
324 elm_smart_scroller_child_viewport_size_get(wd->scr, &v_w, &v_h);
326 if ((!strcmp(ev->keyname, "Left")) || (!strcmp(ev->keyname, "KP_Left")))
330 else if ((!strcmp(ev->keyname, "Right")) || (!strcmp(ev->keyname, "KP_Right")))
334 else if ((!strcmp(ev->keyname, "Up")) || (!strcmp(ev->keyname, "KP_Up")))
336 if (((evas_key_modifier_is_set(ev->modifiers, "Shift")) &&
337 (_item_multi_select_up(wd)))
338 || (_item_single_select_up(wd)))
340 ev->event_flags |= EVAS_EVENT_FLAG_ON_HOLD;
346 else if ((!strcmp(ev->keyname, "Down")) || (!strcmp(ev->keyname, "KP_Down")))
348 if (((evas_key_modifier_is_set(ev->modifiers, "Shift")) &&
349 (_item_multi_select_down(wd)))
350 || (_item_single_select_down(wd)))
352 ev->event_flags |= EVAS_EVENT_FLAG_ON_HOLD;
358 else if ((!strcmp(ev->keyname, "Home")) || (!strcmp(ev->keyname, "KP_Home")))
360 it = elm_genlist_first_item_get(obj);
361 elm_genlist_item_bring_in(it, ELM_GENLIST_ITEM_SCROLLTO_IN);
362 elm_genlist_item_selected_set(it, EINA_TRUE);
363 ev->event_flags |= EVAS_EVENT_FLAG_ON_HOLD;
366 else if ((!strcmp(ev->keyname, "End")) || (!strcmp(ev->keyname, "KP_End")))
368 it = elm_genlist_last_item_get(obj);
369 elm_genlist_item_bring_in(it, ELM_GENLIST_ITEM_SCROLLTO_IN);
370 elm_genlist_item_selected_set(it, EINA_TRUE);
371 ev->event_flags |= EVAS_EVENT_FLAG_ON_HOLD;
374 else if ((!strcmp(ev->keyname, "Prior")) || (!strcmp(ev->keyname, "KP_Prior")))
377 y -= -(page_y * v_h) / 100;
381 else if ((!strcmp(ev->keyname, "Next")) || (!strcmp(ev->keyname, "KP_Next")))
384 y += -(page_y * v_h) / 100;
388 else if (!strcmp(ev->keyname, "Escape"))
390 if (!_deselect_all_items(wd)) return EINA_FALSE;
391 ev->event_flags |= EVAS_EVENT_FLAG_ON_HOLD;
394 else if (((!strcmp(ev->keyname, "Return")) ||
395 (!strcmp(ev->keyname, "KP_Enter")) ||
396 (!strcmp(ev->keyname, "space")))
397 && (!wd->multi) && (wd->selected))
399 it = elm_genlist_selected_item_get(obj);
400 elm_genlist_item_expanded_set(it,
401 !elm_genlist_item_expanded_get(it));
402 evas_object_smart_callback_call(WIDGET(it), SIG_ACTIVATED, it);
404 else return EINA_FALSE;
406 ev->event_flags |= EVAS_EVENT_FLAG_ON_HOLD;
407 _pan_max_get(wd->pan_smart, &pan_max_x, &pan_max_y);
409 if (x > pan_max_x) x = pan_max_x;
411 if (y > pan_max_y) y = pan_max_y;
412 elm_smart_scroller_child_pos_set(wd->scr, x, y);
417 _deselect_all_items(Widget_Data *wd)
419 if (!wd->selected) return EINA_FALSE;
421 elm_genlist_item_selected_set(wd->selected->data, EINA_FALSE);
427 _item_multi_select_up(Widget_Data *wd)
429 if (!wd->selected) return EINA_FALSE;
430 if (!wd->multi) return EINA_FALSE;
432 Elm_Object_Item *prev = elm_genlist_item_prev_get(wd->last_selected_item);
433 if (!prev) return EINA_TRUE;
435 if (elm_genlist_item_selected_get(prev))
437 elm_genlist_item_selected_set(wd->last_selected_item, EINA_FALSE);
438 wd->last_selected_item = prev;
439 elm_genlist_item_show(wd->last_selected_item, ELM_GENLIST_ITEM_SCROLLTO_IN);
443 elm_genlist_item_selected_set(prev, EINA_TRUE);
444 elm_genlist_item_show(prev, ELM_GENLIST_ITEM_SCROLLTO_IN);
450 _item_multi_select_down(Widget_Data *wd)
452 if (!wd->selected) return EINA_FALSE;
453 if (!wd->multi) return EINA_FALSE;
455 Elm_Object_Item *next;
456 next = elm_genlist_item_next_get(wd->last_selected_item);
457 if (!next) return EINA_TRUE;
459 if (elm_genlist_item_selected_get(next))
461 elm_genlist_item_selected_set(wd->last_selected_item, EINA_FALSE);
462 wd->last_selected_item = next;
463 elm_genlist_item_show(wd->last_selected_item, ELM_GENLIST_ITEM_SCROLLTO_IN);
467 elm_genlist_item_selected_set(next, EINA_TRUE);
468 elm_genlist_item_show(next, ELM_GENLIST_ITEM_SCROLLTO_IN);
474 _item_single_select_up(Widget_Data *wd)
479 prev = ELM_GEN_ITEM_FROM_INLIST(wd->items->last);
480 while ((prev) && (prev->generation < wd->generation))
481 prev = ELM_GEN_ITEM_FROM_INLIST(EINA_INLIST_GET(prev)->prev);
483 else prev = (Elm_Gen_Item *) elm_genlist_item_prev_get(wd->last_selected_item);
485 if (!prev) return EINA_FALSE;
487 _deselect_all_items(wd);
489 elm_genlist_item_selected_set((Elm_Object_Item *) prev, EINA_TRUE);
490 elm_genlist_item_show((Elm_Object_Item *) prev, ELM_GENLIST_ITEM_SCROLLTO_IN);
495 _item_single_select_down(Widget_Data *wd)
500 next = ELM_GEN_ITEM_FROM_INLIST(wd->items);
501 while ((next) && (next->generation < wd->generation))
502 next = ELM_GEN_ITEM_FROM_INLIST(EINA_INLIST_GET(next)->next);
504 else next = (Elm_Gen_Item *) elm_genlist_item_next_get(wd->last_selected_item);
506 if (!next) return EINA_FALSE;
508 _deselect_all_items(wd);
510 elm_genlist_item_selected_set((Elm_Object_Item *) next, EINA_TRUE);
511 elm_genlist_item_show((Elm_Object_Item *) next, ELM_GENLIST_ITEM_SCROLLTO_IN);
516 _on_focus_hook(void *data __UNUSED__,
519 Widget_Data *wd = elm_widget_data_get(obj);
521 if (elm_widget_focus_get(obj))
523 elm_object_signal_emit(wd->obj, "elm,action,focus", "elm");
524 evas_object_focus_set(wd->obj, EINA_TRUE);
525 if ((wd->selected) && (!wd->last_selected_item))
526 wd->last_selected_item = eina_list_data_get(wd->selected);
530 elm_object_signal_emit(wd->obj, "elm,action,unfocus", "elm");
531 evas_object_focus_set(wd->obj, EINA_FALSE);
536 _del_hook(Evas_Object *obj)
538 Widget_Data *wd = elm_widget_data_get(obj);
540 _item_cache_zero(wd);
541 if (wd->calc_job) ecore_job_del(wd->calc_job);
542 if (wd->update_job) ecore_job_del(wd->update_job);
543 if (wd->queue_idle_enterer) ecore_idle_enterer_del(wd->queue_idle_enterer);
544 if (wd->must_recalc_idler) ecore_idler_del(wd->must_recalc_idler);
545 if (wd->multi_timer) ecore_timer_del(wd->multi_timer);
546 if (wd->mode_type) eina_stringshare_del(wd->mode_type);
547 if (wd->scr_hold_timer) ecore_timer_del(wd->scr_hold_timer);
552 _del_pre_hook(Evas_Object *obj)
554 Widget_Data *wd = elm_widget_data_get(obj);
556 if (wd->edit_mode) elm_genlist_edit_mode_set(wd->obj, EINA_FALSE);
557 elm_genlist_clear(obj);
558 evas_object_del(wd->pan_smart);
559 wd->pan_smart = NULL;
563 _mirrored_set(Evas_Object *obj,
566 Widget_Data *wd = elm_widget_data_get(obj);
568 _item_cache_zero(wd);
569 elm_smart_scroller_mirrored_set(wd->scr, rtl);
573 _theme_hook(Evas_Object *obj)
575 Widget_Data *wd = elm_widget_data_get(obj);
578 evas_event_freeze(evas_object_evas_get(wd->obj));
579 _item_cache_zero(wd);
580 _elm_widget_mirrored_reload(obj);
581 _mirrored_set(obj, elm_widget_mirrored_get(obj));
582 elm_smart_scroller_object_theme_set(obj, wd->scr, "genlist", "base",
583 elm_widget_style_get(obj));
584 edje_object_scale_set(wd->scr, elm_widget_scale_get(obj) * _elm_config->scale);
585 wd->item_width = wd->item_height = 0;
586 wd->group_item_width = wd->group_item_height = 0;
587 wd->minw = wd->minh = wd->realminw = 0;
588 EINA_INLIST_FOREACH(wd->blocks, itb)
593 if (itb->realized) _item_block_unrealize(itb);
594 EINA_LIST_FOREACH(itb->items, l, it)
595 it->item->mincalcd = EINA_FALSE;
597 itb->changed = EINA_TRUE;
599 if (wd->calc_job) ecore_job_del(wd->calc_job);
600 wd->calc_job = ecore_job_add(_calc_job, wd);
602 evas_event_thaw(evas_object_evas_get(wd->obj));
603 evas_event_thaw_eval(evas_object_evas_get(wd->obj));
607 _show_region_hook(void *data,
610 Widget_Data *wd = elm_widget_data_get(data);
611 Evas_Coord x, y, w, h;
613 elm_widget_show_region_get(obj, &x, &y, &w, &h);
614 //x & y are screen coordinates, Add with pan coordinates
617 elm_smart_scroller_child_region_show(wd->scr, x, y, w, h);
621 _translate_hook(Evas_Object *obj)
623 evas_object_smart_callback_call(obj, "language,changed", NULL);
627 _sizing_eval(Evas_Object *obj)
629 Widget_Data *wd = elm_widget_data_get(obj);
630 Evas_Coord minw = -1, minh = -1, maxw = -1, maxh = -1;
632 evas_object_size_hint_min_get(wd->scr, &minw, &minh);
633 evas_object_size_hint_max_get(wd->scr, &maxw, &maxh);
635 if (wd->height_for_width)
639 elm_smart_scroller_child_viewport_size_get(wd->scr, &vw, &vh);
640 if ((vw != 0) && (vw != wd->prev_viewport_w))
644 wd->prev_viewport_w = vw;
645 EINA_INLIST_FOREACH(wd->blocks, itb)
647 itb->must_recalc = EINA_TRUE;
649 if (wd->calc_job) ecore_job_del(wd->calc_job);
650 wd->calc_job = ecore_job_add(_calc_job, wd);
653 if (wd->mode == ELM_LIST_LIMIT)
659 elm_smart_scroller_child_viewport_size_get(wd->scr, &vmw, &vmh);
660 edje_object_size_min_calc
661 (elm_smart_scroller_edje_object_get(wd->scr), &vmw, &vmh);
668 edje_object_size_min_calc
669 (elm_smart_scroller_edje_object_get(wd->scr), &vmw, &vmh);
673 evas_object_size_hint_min_set(obj, minw, minh);
674 evas_object_size_hint_max_set(obj, maxw, maxh);
678 _signal_emit_hook(Evas_Object *obj,
679 const char *emission,
682 Widget_Data *wd = elm_widget_data_get(obj);
683 edje_object_signal_emit(elm_smart_scroller_edje_object_get(wd->scr),
688 _item_highlight(Elm_Gen_Item *it)
690 const char *selectraise;
691 if ((it->wd->select_mode == ELM_OBJECT_NO_SELECT) ||
692 (it->generation < it->wd->generation) ||
693 (it->highlighted) || elm_widget_item_disabled_get(it) ||
694 (it->display_only) || (it->item->mode_view))
696 edje_object_signal_emit(VIEW(it), "elm,state,selected", "elm");
697 if (it->edit_obj) edje_object_signal_emit(it->edit_obj, "elm,state,selected", "elm");
698 selectraise = edje_object_data_get(VIEW(it), "selectraise");
699 if ((selectraise) && (!strcmp(selectraise, "on")))
701 if (it->edit_obj) evas_object_raise(it->edit_obj);
702 else evas_object_raise(VIEW(it));
703 if ((it->item->group_item) && (it->item->group_item->realized))
704 evas_object_raise(it->item->VIEW(group_item));
706 it->highlighted = EINA_TRUE;
710 _item_unhighlight(Elm_Gen_Item *it)
712 if ((it->generation < it->wd->generation) || (!it->highlighted)) return;
713 edje_object_signal_emit(VIEW(it), "elm,state,unselected", "elm");
714 if (it->edit_obj) edje_object_signal_emit(it->edit_obj, "elm,state,unselected", "elm");
715 if (!it->item->nostacking)
717 if ((it->item->order_num_in & 0x1) ^ it->item->stacking_even)
719 if (it->edit_obj) evas_object_lower(it->edit_obj);
720 else evas_object_lower(VIEW(it));
724 if (it->edit_obj) evas_object_raise(it->edit_obj);
725 else evas_object_raise(VIEW(it));
728 it->highlighted = EINA_FALSE;
732 _item_block_position_update(Eina_Inlist *list, int idx)
736 EINA_INLIST_FOREACH(list, tmp)
738 tmp->position = idx++;
739 tmp->position_update = EINA_TRUE;
744 _item_position_update(Eina_List *list, int idx)
749 EINA_LIST_FOREACH(list, l, it)
751 it->position = idx++;
752 it->position_update = EINA_TRUE;
757 _item_block_del(Elm_Gen_Item *it)
760 Item_Block *itb = it->item->block;
762 itb->items = eina_list_remove(itb->items, it);
764 itb->changed = EINA_TRUE;
765 if (it->wd->calc_job) ecore_job_del(it->wd->calc_job);
766 it->wd->calc_job = ecore_job_add(_calc_job, it->wd);
769 il = EINA_INLIST_GET(itb);
770 Item_Block *itbn = (Item_Block *)(il->next);
772 it->parent->item->items = eina_list_remove(it->parent->item->items, it);
775 _item_block_position_update(il->next, itb->position);
776 it->wd->blocks = eina_inlist_remove(it->wd->blocks, il);
779 if (itbn) itbn->changed = EINA_TRUE;
783 if (itb->count < itb->wd->max_items_per_block/2)
785 il = EINA_INLIST_GET(itb);
786 Item_Block *itbp = (Item_Block *)(il->prev);
787 Item_Block *itbn = (Item_Block *)(il->next);
788 if ((itbp) && ((itbp->count + itb->count) < itb->wd->max_items_per_block + itb->wd->max_items_per_block/2))
792 EINA_LIST_FREE(itb->items, it2)
794 it2->item->block = itbp;
795 itbp->items = eina_list_append(itbp->items, it2);
797 itbp->changed = EINA_TRUE;
799 _item_block_position_update(EINA_INLIST_GET(itb)->next,
801 it->wd->blocks = eina_inlist_remove(it->wd->blocks,
802 EINA_INLIST_GET(itb));
805 else if ((itbn) && ((itbn->count + itb->count) < itb->wd->max_items_per_block + itb->wd->max_items_per_block/2))
809 Eina_List *last = eina_list_last(itb->items);
810 Elm_Gen_Item *it2 = last->data;
812 it2->item->block = itbn;
813 itb->items = eina_list_remove_list(itb->items, last);
814 itbn->items = eina_list_prepend(itbn->items, it2);
816 itbn->changed = EINA_TRUE;
818 _item_block_position_update(EINA_INLIST_GET(itb)->next,
821 eina_inlist_remove(it->wd->blocks, EINA_INLIST_GET(itb));
829 _item_subitems_clear(Elm_Gen_Item *it)
831 ELM_OBJ_ITEM_CHECK_OR_RETURN(it);
832 Eina_List *tl = NULL, *l;
833 Elm_Object_Item *it2;
835 EINA_LIST_FOREACH(it->item->items, l, it2)
836 tl = eina_list_append(tl, it2);
837 EINA_LIST_FREE(tl, it2)
838 elm_object_item_del(it2);
842 _item_del(Elm_Gen_Item *it)
844 Evas_Object *obj = WIDGET(it);
846 evas_event_freeze(evas_object_evas_get(obj));
847 elm_genlist_item_subitems_clear((Elm_Object_Item *)it);
848 if (it->wd->show_item == it) it->wd->show_item = NULL;
849 if (it->realized) _elm_genlist_item_unrealize(it, EINA_FALSE);
850 if (it->item->edit_mode_item_realized) _edit_mode_item_unrealize(it);
851 if (it->item->block) _item_block_del(it);
852 if (it->item->queued)
853 it->wd->queue = eina_list_remove(it->wd->queue, it);
854 if (it->wd->anchor_item == it)
856 it->wd->anchor_item = ELM_GEN_ITEM_FROM_INLIST(EINA_INLIST_GET(it)->next);
857 if (!it->wd->anchor_item)
858 it->wd->anchor_item = ELM_GEN_ITEM_FROM_INLIST(EINA_INLIST_GET(it)->prev);
860 if (it->wd->expanded_item == it) it->wd->expanded_item = NULL;
862 it->parent->item->items = eina_list_remove(it->parent->item->items, it);
863 if (it->item->swipe_timer) ecore_timer_del(it->item->swipe_timer);
864 _elm_genlist_item_del_serious(it);
865 elm_genlist_item_class_unref((Elm_Genlist_Item_Class *)it->itc);
866 evas_event_thaw(evas_object_evas_get(obj));
867 evas_event_thaw_eval(evas_object_evas_get(obj));
871 _clear_cb(Widget_Data *wd)
873 wd->anchor_item = NULL;
876 Item_Block *itb = (Item_Block *)(wd->blocks);
878 wd->blocks = eina_inlist_remove(wd->blocks, wd->blocks);
879 if (itb->items) eina_list_free(itb->items);
882 if (wd->queue_idle_enterer)
884 ecore_idle_enterer_del(wd->queue_idle_enterer);
885 wd->queue_idle_enterer = NULL;
887 if (wd->must_recalc_idler)
889 ecore_idler_del(wd->must_recalc_idler);
890 wd->must_recalc_idler = NULL;
892 if (wd->queue) wd->queue = eina_list_free(wd->queue);
893 if (wd->reorder_move_animator)
895 ecore_animator_del(wd->reorder_move_animator);
896 wd->reorder_move_animator = NULL;
898 wd->show_item = NULL;
899 wd->reorder_old_pan_y = 0;
903 _item_unselect(Elm_Gen_Item *it)
905 if ((it->generation < it->wd->generation) || (!it->selected)) return;
906 it->selected = EINA_FALSE;
907 it->wd->selected = eina_list_remove(it->wd->selected, it);
908 evas_object_smart_callback_call(WIDGET(it), SIG_UNSELECTED, it);
912 _mouse_move(void *data,
913 Evas *evas __UNUSED__,
917 Elm_Gen_Item *it = data;
918 Evas_Event_Mouse_Move *ev = event_info;
919 Evas_Coord minw = 0, minh = 0, x, y, dx, dy, adx, ady;
920 Evas_Coord ox, oy, ow, oh, it_scrl_y, y_pos;
922 if (ev->event_flags & EVAS_EVENT_FLAG_ON_HOLD)
924 if (!it->wd->on_hold)
926 it->wd->on_hold = EINA_TRUE;
927 if ((!it->wd->wasselected) && (!it->flipped))
929 _item_unhighlight(it);
934 if (it->wd->multitouched)
936 it->wd->cur_x = ev->cur.canvas.x;
937 it->wd->cur_y = ev->cur.canvas.y;
940 if ((it->dragging) && (it->down))
942 if (it->wd->movements == SWIPE_MOVES) it->wd->swipe = EINA_TRUE;
945 it->wd->history[it->wd->movements].x = ev->cur.canvas.x;
946 it->wd->history[it->wd->movements].y = ev->cur.canvas.y;
947 if (abs((it->wd->history[it->wd->movements].x -
948 it->wd->history[0].x)) > 40)
949 it->wd->swipe = EINA_TRUE;
955 ecore_timer_del(it->long_timer);
956 it->long_timer = NULL;
958 evas_object_smart_callback_call(WIDGET(it), SIG_DRAG, it);
961 if ((!it->down) /* || (it->wd->on_hold)*/ || (it->wd->longpressed))
965 ecore_timer_del(it->long_timer);
966 it->long_timer = NULL;
968 if ((it->wd->reorder_mode) && (it->wd->reorder_it))
970 evas_object_geometry_get(it->wd->pan_smart, &ox, &oy, &ow, &oh);
971 it_scrl_y = ev->cur.canvas.y - it->wd->reorder_it->dy;
973 if (!it->wd->reorder_start_y)
974 it->wd->reorder_start_y = it->item->block->y + it->y;
978 else if (it_scrl_y + it->wd->reorder_it->item->h > oy + oh)
979 y_pos = oy + oh - it->wd->reorder_it->item->h;
984 _item_position(it, it->edit_obj, it->item->scrl_x, y_pos);
986 _item_position(it, VIEW(it), it->item->scrl_x, y_pos);
988 if (it->wd->calc_job) ecore_job_del(it->wd->calc_job);
989 it->wd->calc_job = ecore_job_add(_calc_job, it->wd);
993 if (!it->display_only)
994 elm_coords_finger_size_adjust(1, &minw, 1, &minh);
995 evas_object_geometry_get(obj, &x, &y, NULL, NULL);
996 x = ev->cur.canvas.x - x;
997 y = ev->cur.canvas.y - y;
1000 if (adx < 0) adx = -dx;
1003 if (ady < 0) ady = -dy;
1006 if ((adx > minw) || (ady > minh))
1008 it->dragging = EINA_TRUE;
1011 ecore_timer_del(it->long_timer);
1012 it->long_timer = NULL;
1014 if (!it->wd->wasselected)
1016 _item_unhighlight(it);
1022 evas_object_smart_callback_call(WIDGET(it),
1023 SIG_DRAG_START_UP, it);
1027 evas_object_smart_callback_call(WIDGET(it),
1028 SIG_DRAG_START_LEFT, it);
1030 evas_object_smart_callback_call(WIDGET(it),
1031 SIG_DRAG_START_RIGHT, it);
1037 evas_object_smart_callback_call(WIDGET(it),
1038 SIG_DRAG_START_DOWN, it);
1042 evas_object_smart_callback_call(WIDGET(it),
1043 SIG_DRAG_START_LEFT, it);
1045 evas_object_smart_callback_call(WIDGET(it),
1046 SIG_DRAG_START_RIGHT, it);
1053 _long_press(void *data)
1055 Elm_Gen_Item *it = data, *it_tmp;
1056 Eina_List *list, *l;
1058 it->long_timer = NULL;
1059 if (elm_widget_item_disabled_get(it) || (it->dragging) || (it->display_only))
1060 return ECORE_CALLBACK_CANCEL;
1061 it->wd->longpressed = EINA_TRUE;
1062 evas_object_smart_callback_call(WIDGET(it), SIG_LONGPRESSED, it);
1063 if ((it->wd->reorder_mode) && (!it->group))
1065 it->wd->reorder_it = it;
1066 it->wd->reorder_start_y = 0;
1068 evas_object_raise(it->edit_obj);
1070 evas_object_raise(VIEW(it));
1072 elm_smart_scroller_hold_set(it->wd->scr, EINA_TRUE);
1073 elm_smart_scroller_bounce_allow_set(it->wd->scr, EINA_FALSE, EINA_FALSE);
1075 list = elm_genlist_realized_items_get(it->wd->obj);
1076 EINA_LIST_FOREACH(list, l, it_tmp)
1078 if (it != it_tmp) _item_unselect(it_tmp);
1080 if (elm_genlist_item_expanded_get((Elm_Object_Item *)it))
1082 elm_genlist_item_expanded_set((Elm_Object_Item *)it, EINA_FALSE);
1083 return ECORE_CALLBACK_RENEW;
1086 if (!it->wd->edit_mode)
1087 edje_object_signal_emit(VIEW(it), "elm,state,reorder,enabled", "elm");
1089 return ECORE_CALLBACK_CANCEL;
1093 _swipe(Elm_Gen_Item *it)
1098 if ((it->display_only) || elm_widget_item_disabled_get(it)) return;
1099 it->wd->swipe = EINA_FALSE;
1100 for (i = 0; i < it->wd->movements; i++)
1102 sum += it->wd->history[i].x;
1103 if (abs(it->wd->history[0].y - it->wd->history[i].y) > 10) return;
1106 sum /= it->wd->movements;
1107 if (abs(sum - it->wd->history[0].x) <= 10) return;
1108 evas_object_smart_callback_call(WIDGET(it), SIG_SWIPE, it);
1112 _swipe_cancel(void *data)
1114 Elm_Gen_Item *it = data;
1116 if (!it) return ECORE_CALLBACK_CANCEL;
1117 it->wd->swipe = EINA_FALSE;
1118 it->wd->movements = 0;
1119 return ECORE_CALLBACK_RENEW;
1123 _multi_cancel(void *data)
1125 Widget_Data *wd = data;
1127 if (!wd) return ECORE_CALLBACK_CANCEL;
1128 wd->multi_timeout = EINA_TRUE;
1129 return ECORE_CALLBACK_RENEW;
1133 _multi_touch_gesture_eval(void *data)
1135 Elm_Gen_Item *it = data;
1137 it->wd->multitouched = EINA_FALSE;
1138 if (it->wd->multi_timer)
1140 ecore_timer_del(it->wd->multi_timer);
1141 it->wd->multi_timer = NULL;
1143 if (it->wd->multi_timeout)
1145 it->wd->multi_timeout = EINA_FALSE;
1149 Evas_Coord minw = 0, minh = 0;
1150 Evas_Coord off_x, off_y, off_mx, off_my;
1152 elm_coords_finger_size_adjust(1, &minw, 1, &minh);
1153 off_x = abs(it->wd->cur_x - it->wd->prev_x);
1154 off_y = abs(it->wd->cur_y - it->wd->prev_y);
1155 off_mx = abs(it->wd->cur_mx - it->wd->prev_mx);
1156 off_my = abs(it->wd->cur_my - it->wd->prev_my);
1158 if (((off_x > minw) || (off_y > minh)) && ((off_mx > minw) || (off_my > minh)))
1160 if ((off_x + off_mx) > (off_y + off_my))
1162 if ((it->wd->cur_x > it->wd->prev_x) && (it->wd->cur_mx > it->wd->prev_mx))
1163 evas_object_smart_callback_call(WIDGET(it),
1164 SIG_MULTI_SWIPE_RIGHT, it);
1165 else if ((it->wd->cur_x < it->wd->prev_x) && (it->wd->cur_mx < it->wd->prev_mx))
1166 evas_object_smart_callback_call(WIDGET(it),
1167 SIG_MULTI_SWIPE_LEFT, it);
1168 else if (abs(it->wd->cur_x - it->wd->cur_mx) > abs(it->wd->prev_x - it->wd->prev_mx))
1169 evas_object_smart_callback_call(WIDGET(it),
1170 SIG_MULTI_PINCH_OUT, it);
1172 evas_object_smart_callback_call(WIDGET(it),
1173 SIG_MULTI_PINCH_IN, it);
1177 if ((it->wd->cur_y > it->wd->prev_y) && (it->wd->cur_my > it->wd->prev_my))
1178 evas_object_smart_callback_call(WIDGET(it),
1179 SIG_MULTI_SWIPE_DOWN, it);
1180 else if ((it->wd->cur_y < it->wd->prev_y) && (it->wd->cur_my < it->wd->prev_my))
1181 evas_object_smart_callback_call(WIDGET(it),
1182 SIG_MULTI_SWIPE_UP, it);
1183 else if (abs(it->wd->cur_y - it->wd->cur_my) > abs(it->wd->prev_y - it->wd->prev_my))
1184 evas_object_smart_callback_call(WIDGET(it),
1185 SIG_MULTI_PINCH_OUT, it);
1187 evas_object_smart_callback_call(WIDGET(it),
1188 SIG_MULTI_PINCH_IN, it);
1191 it->wd->multi_timeout = EINA_FALSE;
1195 _multi_down(void *data,
1196 Evas *evas __UNUSED__,
1197 Evas_Object *obj __UNUSED__,
1200 Elm_Gen_Item *it = data;
1201 Evas_Event_Multi_Down *ev = event_info;
1203 if ((it->wd->multi_device != 0) || (it->wd->multitouched) || (it->wd->multi_timeout)) return;
1204 it->wd->multi_device = ev->device;
1205 it->wd->multi_down = EINA_TRUE;
1206 it->wd->multitouched = EINA_TRUE;
1207 it->wd->prev_mx = ev->canvas.x;
1208 it->wd->prev_my = ev->canvas.y;
1209 if (!it->wd->wasselected)
1211 _item_unhighlight(it);
1214 it->wd->wasselected = EINA_FALSE;
1215 it->wd->longpressed = EINA_FALSE;
1218 ecore_timer_del(it->long_timer);
1219 it->long_timer = NULL;
1223 it->dragging = EINA_FALSE;
1224 evas_object_smart_callback_call(WIDGET(it), SIG_DRAG_STOP, it);
1226 if (it->item->swipe_timer)
1228 ecore_timer_del(it->item->swipe_timer);
1229 it->item->swipe_timer = NULL;
1231 if (it->wd->on_hold)
1233 it->wd->swipe = EINA_FALSE;
1234 it->wd->movements = 0;
1235 it->wd->on_hold = EINA_FALSE;
1240 _multi_up(void *data,
1241 Evas *evas __UNUSED__,
1242 Evas_Object *obj __UNUSED__,
1245 Elm_Gen_Item *it = data;
1246 Evas_Event_Multi_Up *ev = event_info;
1248 if (it->wd->multi_device != ev->device) return;
1249 it->wd->multi_device = 0;
1250 it->wd->multi_down = EINA_FALSE;
1251 if (it->wd->mouse_down) return;
1252 _multi_touch_gesture_eval(data);
1256 _multi_move(void *data,
1257 Evas *evas __UNUSED__,
1258 Evas_Object *obj __UNUSED__,
1261 Elm_Gen_Item *it = data;
1262 Evas_Event_Multi_Move *ev = event_info;
1264 if (it->wd->multi_device != ev->device) return;
1265 it->wd->cur_mx = ev->cur.canvas.x;
1266 it->wd->cur_my = ev->cur.canvas.y;
1270 _mouse_down(void *data,
1271 Evas *evas __UNUSED__,
1275 Elm_Gen_Item *it = data;
1276 Evas_Event_Mouse_Down *ev = event_info;
1279 if (ev->button != 1) return;
1280 if (ev->event_flags & EVAS_EVENT_FLAG_ON_HOLD)
1282 it->wd->on_hold = EINA_TRUE;
1285 it->down = EINA_TRUE;
1286 it->dragging = EINA_FALSE;
1287 evas_object_geometry_get(obj, &x, &y, NULL, NULL);
1288 it->dx = ev->canvas.x - x;
1289 it->dy = ev->canvas.y - y;
1290 it->wd->mouse_down = EINA_TRUE;
1291 if (!it->wd->multitouched)
1293 it->wd->prev_x = ev->canvas.x;
1294 it->wd->prev_y = ev->canvas.y;
1295 it->wd->multi_timeout = EINA_FALSE;
1296 if (it->wd->multi_timer) ecore_timer_del(it->wd->multi_timer);
1297 it->wd->multi_timer = ecore_timer_add(1, _multi_cancel, it->wd);
1299 it->wd->longpressed = EINA_FALSE;
1300 if (ev->event_flags & EVAS_EVENT_FLAG_ON_HOLD) it->wd->on_hold = EINA_TRUE;
1301 else it->wd->on_hold = EINA_FALSE;
1302 if (it->wd->on_hold) return;
1303 it->wd->wasselected = it->selected;
1304 _item_highlight(it);
1305 if (ev->flags & EVAS_BUTTON_DOUBLE_CLICK)
1306 if ((!elm_widget_item_disabled_get(it)) && (!it->display_only))
1308 evas_object_smart_callback_call(WIDGET(it), SIG_CLICKED_DOUBLE, it);
1309 evas_object_smart_callback_call(WIDGET(it), SIG_ACTIVATED, it);
1311 if (it->long_timer) ecore_timer_del(it->long_timer);
1312 if (it->item->swipe_timer) ecore_timer_del(it->item->swipe_timer);
1313 it->item->swipe_timer = ecore_timer_add(0.4, _swipe_cancel, it);
1315 it->long_timer = ecore_timer_add(it->wd->longpress_timeout, _long_press,
1318 it->long_timer = NULL;
1319 it->wd->swipe = EINA_FALSE;
1320 it->wd->movements = 0;
1324 _mouse_up(void *data,
1325 Evas *evas __UNUSED__,
1326 Evas_Object *obj __UNUSED__,
1329 Elm_Gen_Item *it = data;
1330 Evas_Event_Mouse_Up *ev = event_info;
1331 Eina_Bool dragged = EINA_FALSE;
1333 if (ev->button != 1) return;
1334 it->down = EINA_FALSE;
1335 it->wd->mouse_down = EINA_FALSE;
1336 if (it->wd->multitouched)
1338 if ((!it->wd->multi) && (!it->selected) && (it->highlighted)) _item_unhighlight(it);
1339 if (it->wd->multi_down) return;
1340 _multi_touch_gesture_eval(data);
1343 if (ev->event_flags & EVAS_EVENT_FLAG_ON_HOLD) it->wd->on_hold = EINA_TRUE;
1344 else it->wd->on_hold = EINA_FALSE;
1347 ecore_timer_del(it->long_timer);
1348 it->long_timer = NULL;
1352 it->dragging = EINA_FALSE;
1353 evas_object_smart_callback_call(WIDGET(it), SIG_DRAG_STOP, it);
1356 if (it->item->swipe_timer)
1358 ecore_timer_del(it->item->swipe_timer);
1359 it->item->swipe_timer = NULL;
1361 if (it->wd->multi_timer)
1363 ecore_timer_del(it->wd->multi_timer);
1364 it->wd->multi_timer = NULL;
1365 it->wd->multi_timeout = EINA_FALSE;
1367 if (it->wd->on_hold)
1369 if (it->wd->swipe) _swipe(data);
1370 it->wd->longpressed = EINA_FALSE;
1371 it->wd->on_hold = EINA_FALSE;
1374 if ((it->wd->reorder_mode) && (it->wd->reorder_it))
1376 Evas_Coord it_scrl_y = ev->canvas.y - it->wd->reorder_it->dy;
1378 if (it->wd->reorder_rel && (it->wd->reorder_it->parent == it->wd->reorder_rel->parent))
1380 if (it_scrl_y <= it->wd->reorder_rel->item->scrl_y)
1381 _item_move_before(it->wd->reorder_it, it->wd->reorder_rel);
1383 _item_move_after(it->wd->reorder_it, it->wd->reorder_rel);
1387 if (it->wd->calc_job) ecore_job_del(it->wd->calc_job);
1388 it->wd->calc_job = ecore_job_add(_calc_job, it->wd);
1390 edje_object_signal_emit(VIEW(it), "elm,state,reorder,disabled", "elm");
1391 it->wd->reorder_it = it->wd->reorder_rel = NULL;
1392 elm_smart_scroller_hold_set(it->wd->scr, EINA_FALSE);
1393 elm_smart_scroller_bounce_allow_set(it->wd->scr, it->wd->h_bounce, it->wd->v_bounce);
1395 if (it->wd->longpressed)
1397 it->wd->longpressed = EINA_FALSE;
1398 if ((!it->wd->wasselected) && (!it->flipped))
1400 _item_unhighlight(it);
1403 it->wd->wasselected = EINA_FALSE;
1408 if (it->want_unrealize)
1410 _elm_genlist_item_unrealize(it, EINA_FALSE);
1411 if (it->item->block->want_unrealize)
1412 _item_block_unrealize(it->item->block);
1415 if (elm_widget_item_disabled_get(it) || (dragged) || (it->display_only))
1417 if (ev->event_flags & EVAS_EVENT_FLAG_ON_HOLD) return;
1422 _item_highlight(it);
1427 _item_unhighlight(it);
1435 Widget_Data *wd = it->wd;
1438 while (wd->selected)
1440 _item_unhighlight(wd->selected->data);
1441 _item_unselect(wd->selected->data);
1447 const Eina_List *l, *l_next;
1450 EINA_LIST_FOREACH_SAFE(it->wd->selected, l, l_next, it2)
1453 _item_unhighlight(it2);
1454 _item_unselect(it2);
1456 //_item_highlight(it);
1459 _item_highlight(it);
1465 _signal_expand_toggle(void *data,
1466 Evas_Object *obj __UNUSED__,
1467 const char *emission __UNUSED__,
1468 const char *source __UNUSED__)
1470 Elm_Gen_Item *it = data;
1472 if (it->item->expanded)
1473 evas_object_smart_callback_call(WIDGET(it), SIG_CONTRACT_REQUEST, it);
1475 evas_object_smart_callback_call(WIDGET(it), SIG_EXPAND_REQUEST, it);
1479 _signal_expand(void *data,
1480 Evas_Object *obj __UNUSED__,
1481 const char *emission __UNUSED__,
1482 const char *source __UNUSED__)
1484 Elm_Gen_Item *it = data;
1486 if (!it->item->expanded)
1487 evas_object_smart_callback_call(WIDGET(it), SIG_EXPAND_REQUEST, it);
1491 _signal_contract(void *data,
1492 Evas_Object *obj __UNUSED__,
1493 const char *emission __UNUSED__,
1494 const char *source __UNUSED__)
1496 Elm_Gen_Item *it = data;
1498 if (it->item->expanded)
1499 evas_object_smart_callback_call(WIDGET(it), SIG_CONTRACT_REQUEST, it);
1503 _scr_hold_timer_cb(void *data)
1505 if (!data) return ECORE_CALLBACK_CANCEL;
1506 Widget_Data *wd = data;
1507 elm_smart_scroller_hold_set(wd->scr, EINA_FALSE);
1508 wd->scr_hold_timer = NULL;
1509 return ECORE_CALLBACK_CANCEL;
1513 _mode_finished_signal_cb(void *data,
1515 const char *emission __UNUSED__,
1516 const char *source __UNUSED__)
1520 Elm_Gen_Item *it = data;
1521 if ((it->generation < it->wd->generation) || (!it->realized) || (!it->item->mode_view)) return;
1523 Evas *te = evas_object_evas_get(obj);
1525 evas_event_freeze(te);
1526 it->item->nocache_once = EINA_FALSE;
1527 _mode_item_unrealize(it);
1528 if (it->item->group_item)
1529 evas_object_raise(it->item->VIEW(group_item));
1530 snprintf(buf, sizeof(buf), "elm,state,%s,passive,finished", it->wd->mode_type);
1531 edje_object_signal_callback_del_full(obj, buf, "elm", _mode_finished_signal_cb, it);
1532 evas_event_thaw(te);
1533 evas_event_thaw_eval(te);
1537 _item_cache_clean(Widget_Data *wd)
1539 evas_event_freeze(evas_object_evas_get(wd->obj));
1540 while ((wd->item_cache) && (wd->item_cache_count > wd->item_cache_max))
1544 itc = EINA_INLIST_CONTAINER_GET(wd->item_cache->last, Item_Cache);
1545 wd->item_cache = eina_inlist_remove(wd->item_cache,
1546 wd->item_cache->last);
1547 wd->item_cache_count--;
1548 if (itc->spacer) evas_object_del(itc->spacer);
1549 if (itc->base_view) evas_object_del(itc->base_view);
1550 eina_stringshare_del(itc->item_style);
1553 evas_event_thaw(evas_object_evas_get(wd->obj));
1554 evas_event_thaw_eval(evas_object_evas_get(wd->obj));
1558 _item_cache_zero(Widget_Data *wd)
1560 int pmax = wd->item_cache_max;
1561 wd->item_cache_max = 0;
1562 _item_cache_clean(wd);
1563 wd->item_cache_max = pmax;
1567 _item_cache_add(Elm_Gen_Item *it)
1571 evas_event_freeze(evas_object_evas_get(it->wd->obj));
1572 if (it->wd->item_cache_max <= 0)
1574 evas_object_del(VIEW(it));
1576 evas_object_del(it->spacer);
1578 evas_event_thaw(evas_object_evas_get(it->wd->obj));
1579 evas_event_thaw_eval(evas_object_evas_get(it->wd->obj));
1583 it->wd->item_cache_count++;
1584 itc = calloc(1, sizeof(Item_Cache));
1587 evas_event_thaw(evas_object_evas_get(it->wd->obj));
1588 evas_event_thaw_eval(evas_object_evas_get(it->wd->obj));
1591 it->wd->item_cache = eina_inlist_prepend(it->wd->item_cache,
1592 EINA_INLIST_GET(itc));
1593 itc->spacer = it->spacer;
1595 itc->base_view = VIEW(it);
1597 edje_object_signal_emit(itc->base_view, "elm,state,unselected", "elm");
1598 evas_object_hide(itc->base_view);
1599 evas_object_move(itc->base_view, -9999, -9999);
1600 itc->item_style = eina_stringshare_add(it->itc->item_style);
1601 if (it->item->type & ELM_GENLIST_ITEM_SUBITEMS) itc->tree = 1;
1602 itc->compress = (it->wd->compress);
1603 itc->selected = it->selected;
1604 itc->disabled = elm_widget_item_disabled_get(it);
1605 itc->expanded = it->item->expanded;
1608 ecore_timer_del(it->long_timer);
1609 it->long_timer = NULL;
1611 if (it->item->swipe_timer)
1613 ecore_timer_del(it->item->swipe_timer);
1614 it->item->swipe_timer = NULL;
1616 // FIXME: other callbacks?
1617 edje_object_signal_callback_del_full(itc->base_view,
1618 "elm,action,expand,toggle",
1619 "elm", _signal_expand_toggle, it);
1620 edje_object_signal_callback_del_full(itc->base_view, "elm,action,expand",
1622 _signal_expand, it);
1623 edje_object_signal_callback_del_full(itc->base_view, "elm,action,contract",
1624 "elm", _signal_contract, it);
1625 evas_object_event_callback_del_full(itc->base_view, EVAS_CALLBACK_MOUSE_DOWN,
1627 evas_object_event_callback_del_full(itc->base_view, EVAS_CALLBACK_MOUSE_UP,
1629 evas_object_event_callback_del_full(itc->base_view, EVAS_CALLBACK_MOUSE_MOVE,
1631 evas_object_event_callback_del_full(itc->base_view, EVAS_CALLBACK_MULTI_DOWN,
1633 evas_object_event_callback_del_full(itc->base_view, EVAS_CALLBACK_MULTI_UP,
1635 evas_object_event_callback_del_full(itc->base_view, EVAS_CALLBACK_MULTI_MOVE,
1637 _item_cache_clean(it->wd);
1638 evas_event_thaw(evas_object_evas_get(it->wd->obj));
1639 evas_event_thaw_eval(evas_object_evas_get(it->wd->obj));
1643 _item_cache_find(Elm_Gen_Item *it)
1648 if (it->item->type & ELM_GENLIST_ITEM_SUBITEMS) tree = 1;
1649 EINA_INLIST_FOREACH(it->wd->item_cache, itc)
1651 if ((itc->selected) || (itc->disabled) || (itc->expanded))
1653 if ((itc->tree == tree) &&
1654 (itc->compress == it->wd->compress) &&
1655 (((!it->itc->item_style) && (!itc->item_style)) ||
1656 (it->itc->item_style && itc->item_style &&
1657 (!strcmp(it->itc->item_style, itc->item_style)))))
1659 it->wd->item_cache = eina_inlist_remove(it->wd->item_cache,
1660 EINA_INLIST_GET(itc));
1661 it->wd->item_cache_count--;
1669 _elm_genlist_item_index_update(Elm_Gen_Item *it)
1671 if (it->position_update || it->item->block->position_update)
1673 evas_object_smart_callback_call(WIDGET(it), SIG_INDEX_UPDATE, it);
1674 it->position_update = EINA_FALSE;
1679 _elm_genlist_item_odd_even_update(Elm_Gen_Item *it)
1681 if (!it->item->nostacking)
1683 if ((it->item->order_num_in & 0x1) ^ it->item->stacking_even)
1685 if (it->edit_obj) evas_object_lower(it->edit_obj);
1686 else evas_object_lower(VIEW(it));
1690 if (it->edit_obj) evas_object_raise(it->edit_obj);
1691 else evas_object_raise(VIEW(it));
1695 if (it->item->order_num_in & 0x1)
1697 edje_object_signal_emit(VIEW(it), "elm,state,odd", "elm");
1698 if (it->edit_obj) edje_object_signal_emit(it->edit_obj, "elm,state,odd", "elm");
1702 edje_object_signal_emit(VIEW(it), "elm,state,even", "elm");
1703 if (it->edit_obj) edje_object_signal_emit(it->edit_obj, "elm,state,even", "elm");
1708 _elm_genlist_item_state_update(Elm_Gen_Item *it, Item_Cache *itc)
1712 if (it->selected != itc->selected)
1715 edje_object_signal_emit(VIEW(it),
1716 "elm,state,selected", "elm");
1719 edje_object_signal_emit(it->edit_obj,
1720 "elm,state,selected", "elm");
1722 if (elm_widget_item_disabled_get(it) != itc->disabled)
1724 if (elm_widget_item_disabled_get(it))
1725 edje_object_signal_emit(VIEW(it),
1726 "elm,state,disabled", "elm");
1728 edje_object_signal_emit(it->edit_obj,
1729 "elm,state,disabled", "elm");
1731 if (it->item->expanded != itc->expanded)
1733 if (it->item->expanded)
1734 edje_object_signal_emit(VIEW(it),
1735 "elm,state,expanded", "elm");
1737 edje_object_signal_emit(it->edit_obj,
1738 "elm,state,expanded", "elm");
1745 edje_object_signal_emit(VIEW(it),
1746 "elm,state,selected", "elm");
1748 edje_object_signal_emit(it->edit_obj,
1749 "elm,state,selected", "elm");
1752 if (elm_widget_item_disabled_get(it))
1754 edje_object_signal_emit(VIEW(it),
1755 "elm,state,disabled", "elm");
1757 edje_object_signal_emit(it->edit_obj,
1758 "elm,state,disabled", "elm");
1760 if (it->item->expanded)
1762 edje_object_signal_emit(VIEW(it),
1763 "elm,state,expanded", "elm");
1765 edje_object_signal_emit(it->edit_obj,
1766 "elm,state,expanded", "elm");
1772 _item_cache_free(Item_Cache *itc)
1774 if (itc->spacer) evas_object_del(itc->spacer);
1775 if (itc->base_view) evas_object_del(itc->base_view);
1776 eina_stringshare_del(itc->item_style);
1781 _item_text_realize(Elm_Gen_Item *it,
1782 Evas_Object *target,
1786 if (it->itc->func.text_get)
1791 *source = elm_widget_stringlist_get(edje_object_data_get(target, "texts"));
1792 EINA_LIST_FOREACH(*source, l, key)
1794 if (parts && fnmatch(parts, key, FNM_PERIOD))
1797 char *s = it->itc->func.text_get
1798 ((void *)it->base.data, WIDGET(it), key);
1802 edje_object_part_text_set(target, key, s);
1807 edje_object_part_text_set(target, key, "");
1814 _item_content_unrealize(Elm_Gen_Item *it,
1815 Evas_Object *target,
1819 Eina_List *res = it->content_objs;
1821 if (it->itc->func.content_get)
1825 Evas_Object *ic = NULL;
1827 EINA_LIST_FOREACH(*source, l, key)
1829 if (parts && fnmatch(parts, key, FNM_PERIOD))
1832 ic = edje_object_part_swallow_get(target, key);
1835 res = eina_list_remove(res, ic);
1836 edje_object_part_unswallow(target, ic);
1837 evas_object_del(ic);
1846 _item_content_realize(Elm_Gen_Item *it,
1847 Evas_Object *target,
1851 Eina_List *res = NULL;
1853 if (it->itc->func.content_get)
1857 Evas_Object *ic = NULL;
1859 *source = elm_widget_stringlist_get(edje_object_data_get(target, "contents"));
1861 if (parts && (eina_list_count(*source) != eina_list_count(it->content_objs)))
1862 res = it->content_objs;
1864 EINA_LIST_FOREACH(*source, l, key)
1866 if (parts && fnmatch(parts, key, FNM_PERIOD))
1869 if (it->itc->func.content_get)
1870 ic = it->itc->func.content_get
1871 ((void *)it->base.data, WIDGET(it), key);
1874 res = eina_list_append(res, ic);
1875 edje_object_part_swallow(target, key, ic);
1876 evas_object_show(ic);
1877 elm_widget_sub_object_add(WIDGET(it), ic);
1878 if (elm_widget_item_disabled_get(it))
1879 elm_widget_disabled_set(ic, EINA_TRUE);
1888 _item_state_realize(Elm_Gen_Item *it,
1889 Evas_Object *target,
1893 if (it->itc->func.state_get)
1899 *source = elm_widget_stringlist_get(edje_object_data_get(target, "states"));
1900 EINA_LIST_FOREACH(*source, l, key)
1902 if (parts && fnmatch(parts, key, FNM_PERIOD))
1905 Eina_Bool on = it->itc->func.state_get
1906 ((void *)it->base.data, WIDGET(it), key);
1910 snprintf(buf, sizeof(buf), "elm,state,%s,active", key);
1911 edje_object_signal_emit(target, buf, "elm");
1915 snprintf(buf, sizeof(buf), "elm,state,%s,passive", key);
1916 edje_object_signal_emit(target, buf, "elm");
1923 _item_flips_realize(Elm_Gen_Item *it,
1924 Evas_Object *target,
1927 Eina_List *res = NULL;
1929 if (it->itc->func.content_get)
1933 Evas_Object *ic = NULL;
1935 *source = elm_widget_stringlist_get(edje_object_data_get(target, "flips"));
1937 EINA_LIST_FOREACH(*source, l, key)
1939 if (it->itc->func.content_get)
1940 ic = it->itc->func.content_get
1941 ((void *)it->base.data, WIDGET(it), key);
1944 res = eina_list_append(res, ic);
1945 edje_object_part_swallow(target, key, ic);
1946 evas_object_show(ic);
1947 elm_widget_sub_object_add(WIDGET(it), ic);
1948 if (elm_widget_item_disabled_get(it))
1949 elm_widget_disabled_set(ic, EINA_TRUE);
1958 _item_realize(Elm_Gen_Item *it,
1962 const char *treesize;
1965 Item_Cache *itc = NULL;
1967 if (it->generation < it->wd->generation) return;
1968 //evas_event_freeze(evas_object_evas_get(it->wd->obj));
1971 if (it->item->order_num_in != in)
1973 it->item->order_num_in = in;
1974 _elm_genlist_item_odd_even_update(it);
1975 _elm_genlist_item_state_update(it, NULL);
1976 _elm_genlist_item_index_update(it);
1978 //evas_event_thaw(evas_object_evas_get(it->wd->obj));
1979 //evas_event_thaw_eval(evas_object_evas_get(it->wd->obj));
1982 it->item->order_num_in = in;
1984 if (it->item->nocache_once)
1985 it->item->nocache_once = EINA_FALSE;
1986 else if (!it->item->nocache)
1987 itc = _item_cache_find(it);
1988 if (itc && (!it->wd->tree_effect_enabled))
1990 VIEW(it) = itc->base_view;
1991 itc->base_view = NULL;
1992 it->spacer = itc->spacer;
1997 const char *stacking_even;
1998 const char *stacking;
2000 VIEW(it) = edje_object_add(evas_object_evas_get(WIDGET(it)));
2001 edje_object_scale_set(VIEW(it),
2002 elm_widget_scale_get(WIDGET(it)) *
2003 _elm_config->scale);
2004 evas_object_smart_member_add(VIEW(it), it->wd->pan_smart);
2005 elm_widget_sub_object_add(WIDGET(it), VIEW(it));
2007 if (it->item->type & ELM_GENLIST_ITEM_SUBITEMS)
2008 snprintf(buf, sizeof(buf), "tree%s/%s", it->wd->compress ? "_compress" : "", it->itc->item_style ?: "default");
2010 snprintf(buf, sizeof(buf), "item%s/%s", it->wd->compress ? "_compress" : "", it->itc->item_style ?: "default");
2012 _elm_theme_object_set(WIDGET(it), VIEW(it), "genlist", buf,
2013 elm_widget_style_get(WIDGET(it)));
2015 stacking_even = edje_object_data_get(VIEW(it), "stacking_even");
2016 if (!stacking_even) stacking_even = "above";
2017 it->item->stacking_even = !!strcmp("above", stacking_even);
2019 stacking = edje_object_data_get(VIEW(it), "stacking");
2020 if (!stacking) stacking = "yes";
2021 it->item->nostacking = !!strcmp("yes", stacking);
2023 edje_object_mirrored_set(VIEW(it),
2024 elm_widget_mirrored_get(WIDGET(it)));
2026 evas_object_rectangle_add(evas_object_evas_get(WIDGET(it)));
2027 evas_object_color_set(it->spacer, 0, 0, 0, 0);
2028 elm_widget_sub_object_add(WIDGET(it), it->spacer);
2031 _elm_genlist_item_odd_even_update(it);
2033 treesize = edje_object_data_get(VIEW(it), "treesize");
2034 if (treesize) tsize = atoi(treesize);
2035 evas_object_size_hint_min_set(it->spacer,
2036 (it->item->expanded_depth * tsize) * _elm_config->scale, 1);
2037 edje_object_part_swallow(VIEW(it), "elm.swallow.pad", it->spacer);
2040 edje_object_signal_callback_add(VIEW(it),
2041 "elm,action,expand,toggle",
2042 "elm", _signal_expand_toggle, it);
2043 edje_object_signal_callback_add(VIEW(it), "elm,action,expand",
2044 "elm", _signal_expand, it);
2045 edje_object_signal_callback_add(VIEW(it), "elm,action,contract",
2046 "elm", _signal_contract, it);
2047 evas_object_event_callback_add(VIEW(it), EVAS_CALLBACK_MOUSE_DOWN,
2049 evas_object_event_callback_add(VIEW(it), EVAS_CALLBACK_MOUSE_UP,
2051 evas_object_event_callback_add(VIEW(it), EVAS_CALLBACK_MOUSE_MOVE,
2053 evas_object_event_callback_add(VIEW(it), EVAS_CALLBACK_MULTI_DOWN,
2055 evas_object_event_callback_add(VIEW(it), EVAS_CALLBACK_MULTI_UP,
2057 evas_object_event_callback_add(VIEW(it), EVAS_CALLBACK_MULTI_MOVE,
2060 if ((it->wd->edit_mode) && (!it->edit_obj) &&
2061 (it->item->type != ELM_GENLIST_ITEM_GROUP) && (it->itc->edit_item_style))
2062 _edit_mode_item_realize(it, EINA_FALSE);
2064 _elm_genlist_item_state_update(it, itc);
2065 _elm_genlist_item_index_update(it);
2068 if ((calc) && (it->wd->homogeneous) &&
2069 ((it->wd->item_width) ||
2070 ((it->wd->item_width) && (it->wd->group_item_width))))
2072 /* homogenous genlist shortcut */
2073 if (!it->item->mincalcd)
2077 it->item->w = it->item->minw = it->wd->group_item_width;
2078 it->item->h = it->item->minh = it->wd->group_item_height;
2082 it->item->w = it->item->minw = it->wd->item_width;
2083 it->item->h = it->item->minh = it->wd->item_height;
2085 it->item->mincalcd = EINA_TRUE;
2090 /* FIXME: If you see that assert, please notify us and we
2091 will clean our mess */
2092 assert(eina_list_count(it->content_objs) == 0);
2094 _item_text_realize(it, VIEW(it), &it->texts, NULL);
2095 it->content_objs = _item_content_realize(it, VIEW(it), &it->contents, NULL);
2096 _item_state_realize(it, VIEW(it), &it->states, NULL);
2099 edje_object_signal_emit(VIEW(it), "elm,state,flip,enabled", "elm");
2100 it->content_objs = _item_flips_realize(it, VIEW(it), &it->contents);
2103 if (!it->item->mincalcd)
2105 Evas_Coord mw = -1, mh = -1;
2107 if (!it->display_only)
2108 elm_coords_finger_size_adjust(1, &mw, 1, &mh);
2109 if (it->wd->height_for_width) mw = it->wd->prev_viewport_w;
2110 edje_object_size_min_restricted_calc(VIEW(it), &mw, &mh, mw,
2112 if (!it->display_only)
2113 elm_coords_finger_size_adjust(1, &mw, 1, &mh);
2114 it->item->w = it->item->minw = mw;
2115 it->item->h = it->item->minh = mh;
2116 it->item->mincalcd = EINA_TRUE;
2118 if ((!it->wd->group_item_width) && (it->group))
2120 it->wd->group_item_width = mw;
2121 it->wd->group_item_height = mh;
2123 else if ((!it->wd->item_width) && (it->item->type == ELM_GENLIST_ITEM_NONE))
2125 it->wd->item_width = mw;
2126 it->wd->item_height = mh;
2129 if (!calc) evas_object_show(VIEW(it));
2132 if (it->tooltip.content_cb)
2134 elm_widget_item_tooltip_content_cb_set(it,
2135 it->tooltip.content_cb,
2136 it->tooltip.data, NULL);
2137 elm_widget_item_tooltip_style_set(it, it->tooltip.style);
2138 elm_widget_item_tooltip_window_mode_set(it, it->tooltip.free_size);
2141 if (it->mouse_cursor)
2142 elm_widget_item_cursor_set(it, it->mouse_cursor);
2144 it->realized = EINA_TRUE;
2145 it->want_unrealize = EINA_FALSE;
2147 if (itc) _item_cache_free(itc);
2148 //evas_event_thaw(evas_object_evas_get(it->wd->obj));
2149 //evas_event_thaw_eval(evas_object_evas_get(it->wd->obj));
2151 evas_object_smart_callback_call(WIDGET(it), SIG_REALIZED, it);
2153 if ((!calc) && (it->wd->edit_mode) && (it->item->type != ELM_GENLIST_ITEM_GROUP))
2155 if (it->itc->edit_item_style)
2157 if (!it->edit_obj) _edit_mode_item_realize(it, EINA_FALSE);
2158 edje_object_message_signal_process(it->edit_obj);
2161 edje_object_message_signal_process(VIEW(it));
2165 _item_unrealize_cb(Elm_Gen_Item *it)
2167 if (it->item->nocache_once || it->item->nocache)
2169 evas_object_del(VIEW(it));
2171 evas_object_del(it->spacer);
2176 edje_object_mirrored_set(VIEW(it),
2177 elm_widget_mirrored_get(WIDGET(it)));
2178 edje_object_scale_set(VIEW(it),
2179 elm_widget_scale_get(WIDGET(it))
2180 * _elm_config->scale);
2181 _item_cache_add(it);
2184 _mode_item_unrealize(it);
2186 it->realized = EINA_FALSE;
2187 it->want_unrealize = EINA_FALSE;
2188 if (it->wd->edit_mode) _edit_mode_item_unrealize(it);
2192 _item_block_recalc(Item_Block *itb,
2198 Evas_Coord minw = 0, minh = 0;
2199 Eina_Bool showme = EINA_FALSE, changed = EINA_FALSE;
2202 //evas_event_freeze(evas_object_evas_get(itb->wd->obj));
2204 EINA_LIST_FOREACH(itb->items, l, it)
2206 if (it->generation < it->wd->generation) continue;
2207 showme |= it->item->showme;
2212 if (!it->item->mincalcd) changed = EINA_TRUE;
2215 _item_realize(it, in, EINA_TRUE);
2216 _elm_genlist_item_unrealize(it, EINA_TRUE);
2221 _item_realize(it, in, EINA_TRUE);
2222 _elm_genlist_item_unrealize(it, EINA_TRUE);
2226 _item_realize(it, in, EINA_FALSE);
2227 minh += it->item->minh;
2228 if (minw < it->item->minw) minw = it->item->minw;
2236 itb->changed = EINA_FALSE;
2237 itb->position_update = EINA_FALSE;
2238 //evas_event_thaw(evas_object_evas_get(itb->wd->obj));
2239 //evas_event_thaw_eval(evas_object_evas_get(itb->wd->obj));
2244 _item_block_realize(Item_Block *itb)
2246 if (itb->realized) return;
2247 itb->realized = EINA_TRUE;
2248 itb->want_unrealize = EINA_FALSE;
2252 _item_block_unrealize(Item_Block *itb)
2256 Eina_Bool dragging = EINA_FALSE;
2258 if (!itb->realized) return;
2259 evas_event_freeze(evas_object_evas_get(itb->wd->obj));
2260 EINA_LIST_FOREACH(itb->items, l, it)
2262 if (itb->must_recalc || !it->group)
2266 dragging = EINA_TRUE;
2267 it->want_unrealize = EINA_TRUE;
2270 _elm_genlist_item_unrealize(it, EINA_FALSE);
2275 itb->realized = EINA_FALSE;
2276 itb->want_unrealize = EINA_TRUE;
2279 itb->want_unrealize = EINA_FALSE;
2280 evas_event_thaw(evas_object_evas_get(itb->wd->obj));
2281 evas_event_thaw_eval(evas_object_evas_get(itb->wd->obj));
2285 _get_space_for_reorder_item(Elm_Gen_Item *it)
2287 Evas_Coord rox, roy, row, roh, oy, oh;
2288 Eina_Bool top = EINA_FALSE;
2289 Elm_Gen_Item *reorder_it = it->wd->reorder_it;
2290 if (!reorder_it) return 0;
2292 evas_object_geometry_get(it->wd->pan_smart, NULL, &oy, NULL, &oh);
2293 evas_object_geometry_get(it->wd->VIEW(reorder_it), &rox, &roy, &row, &roh);
2295 if ((it->wd->reorder_start_y < it->item->block->y) &&
2296 (roy - oy + (roh / 2) >= it->item->block->y - it->wd->pan_y))
2298 it->item->block->reorder_offset = it->wd->reorder_it->item->h * -1;
2299 if (it->item->block->count == 1)
2300 it->wd->reorder_rel = it;
2302 else if ((it->wd->reorder_start_y >= it->item->block->y) &&
2303 (roy - oy + (roh / 2) <= it->item->block->y - it->wd->pan_y))
2305 it->item->block->reorder_offset = it->wd->reorder_it->item->h;
2308 it->item->block->reorder_offset = 0;
2310 it->item->scrl_y += it->item->block->reorder_offset;
2312 top = (ELM_RECTS_INTERSECT(it->item->scrl_x, it->item->scrl_y, it->item->w, it->item->h,
2313 rox, roy + (roh / 2), row, 1));
2316 it->wd->reorder_rel = it;
2317 it->item->scrl_y += it->wd->reorder_it->item->h;
2318 return it->wd->reorder_it->item->h;
2325 _reorder_move_animator_cb(void *data)
2327 Elm_Gen_Item *it = data;
2328 Eina_Bool down = EINA_FALSE;
2330 int y, dy = it->item->h / 10 * _elm_config->scale, diff;
2332 t = ((0.0 > (t = ecore_loop_time_get()-it->wd->start_time)) ? 0.0 : t);
2334 if (t <= REORDER_EFFECT_TIME) y = (1 * sin((t / REORDER_EFFECT_TIME) * (M_PI / 2)) * dy);
2337 diff = abs(it->item->old_scrl_y - it->item->scrl_y);
2338 if (diff > it->item->h) y = diff / 2;
2340 if (it->item->old_scrl_y < it->item->scrl_y)
2342 it->item->old_scrl_y += y;
2345 else if (it->item->old_scrl_y > it->item->scrl_y)
2347 it->item->old_scrl_y -= y;
2352 _item_position(it, it->edit_obj, it->item->scrl_x, it->item->old_scrl_y);
2354 _item_position(it, VIEW(it), it->item->scrl_x, it->item->old_scrl_y);
2355 _group_items_recalc(it->wd);
2357 if ((it->wd->reorder_pan_move) ||
2358 (down && it->item->old_scrl_y >= it->item->scrl_y) ||
2359 (!down && it->item->old_scrl_y <= it->item->scrl_y))
2361 it->item->old_scrl_y = it->item->scrl_y;
2362 it->item->move_effect_enabled = EINA_FALSE;
2363 it->wd->reorder_move_animator = NULL;
2364 return ECORE_CALLBACK_CANCEL;
2366 return ECORE_CALLBACK_RENEW;
2370 _item_position(Elm_Gen_Item *it,
2378 evas_event_freeze(evas_object_evas_get(it->wd->obj));
2379 evas_object_resize(view, it->item->w, it->item->h);
2380 evas_object_move(view, it_x, it_y);
2381 evas_object_show(view);
2382 evas_event_thaw(evas_object_evas_get(it->wd->obj));
2383 evas_event_thaw_eval(evas_object_evas_get(it->wd->obj));
2387 _item_block_position(Item_Block *itb,
2393 Evas_Coord y = 0, ox, oy, ow, oh, cvx, cvy, cvw, cvh;
2394 Eina_Bool vis = EINA_FALSE;
2396 evas_event_freeze(evas_object_evas_get(itb->wd->obj));
2397 evas_object_geometry_get(itb->wd->pan_smart, &ox, &oy, &ow, &oh);
2398 evas_output_viewport_get(evas_object_evas_get(itb->wd->obj), &cvx, &cvy,
2400 EINA_LIST_FOREACH(itb->items, l, it)
2402 if (it->generation < it->wd->generation) continue;
2403 else if (it->wd->reorder_it == it) continue;
2406 it->item->w = itb->w;
2407 it->item->scrl_x = itb->x + it->x - it->wd->pan_x + ox;
2408 it->item->scrl_y = itb->y + it->y - it->wd->pan_y + oy;
2410 vis = (ELM_RECTS_INTERSECT(it->item->scrl_x, it->item->scrl_y, it->item->w, it->item->h,
2411 cvx, cvy, cvw, cvh));
2414 if ((itb->realized) && (!it->realized))
2416 if (vis) _item_realize(it, in, EINA_FALSE);
2420 if (vis || it->dragging)
2422 if (it->wd->reorder_mode)
2423 y += _get_space_for_reorder_item(it);
2424 git = it->item->group_item;
2427 if (git->item->scrl_y < oy)
2428 git->item->scrl_y = oy;
2429 if ((git->item->scrl_y + git->item->h) > (it->item->scrl_y + it->item->h))
2430 git->item->scrl_y = (it->item->scrl_y + it->item->h) - git->item->h;
2431 git->item->want_realize = EINA_TRUE;
2433 if ((it->wd->reorder_it) && (it->item->old_scrl_y != it->item->scrl_y))
2435 if (!it->item->move_effect_enabled)
2437 it->item->move_effect_enabled = EINA_TRUE;
2438 it->wd->reorder_move_animator =
2440 _reorder_move_animator_cb, it);
2443 if (!it->item->move_effect_enabled)
2445 if ((it->wd->edit_mode) && (it->itc->edit_item_style))
2446 _edit_mode_item_position(it, it->item->scrl_x,
2450 if (it->item->mode_view)
2451 _item_position(it, it->item->mode_view,
2455 _item_position(it, VIEW(it), it->item->scrl_x,
2458 it->item->old_scrl_y = it->item->scrl_y;
2463 if (!it->wd->item_moving_effect_timer)
2464 _elm_genlist_item_unrealize(it, EINA_FALSE);
2471 if (vis) it->item->want_realize = EINA_TRUE;
2475 evas_event_thaw(evas_object_evas_get(itb->wd->obj));
2476 evas_event_thaw_eval(evas_object_evas_get(itb->wd->obj));
2480 _group_items_recalc(void *data)
2482 Widget_Data *wd = data;
2486 evas_event_freeze(evas_object_evas_get(wd->obj));
2487 EINA_LIST_FOREACH(wd->group_items, l, git)
2489 if (git->item->want_realize)
2492 _item_realize(git, 0, EINA_FALSE);
2493 evas_object_resize(VIEW(git), wd->minw, git->item->h);
2494 evas_object_move(VIEW(git), git->item->scrl_x, git->item->scrl_y);
2495 evas_object_show(VIEW(git));
2496 evas_object_raise(VIEW(git));
2498 else if (!git->item->want_realize && git->realized)
2501 _elm_genlist_item_unrealize(git, EINA_FALSE);
2504 evas_event_thaw(evas_object_evas_get(wd->obj));
2505 evas_event_thaw_eval(evas_object_evas_get(wd->obj));
2509 _must_recalc_idler(void *data)
2511 Widget_Data *wd = data;
2512 if (wd->calc_job) ecore_job_del(wd->calc_job);
2513 wd->calc_job = ecore_job_add(_calc_job, wd);
2514 wd->must_recalc_idler = NULL;
2515 return ECORE_CALLBACK_CANCEL;
2519 _scroll_item(Widget_Data *wd)
2521 Elm_Gen_Item *it = NULL;
2522 Evas_Coord gith = 0;
2523 Evas_Coord ow, oh, dx = 0, dy = 0, dw = 0, dh = 0;
2525 evas_object_geometry_get(wd->pan_smart, NULL, NULL, &ow, &oh);
2527 dx = it->x + it->item->block->x;
2528 dy = it->y + it->item->block->y;
2529 dw = it->item->block->w;
2531 switch (wd->scrollto_type)
2533 case ELM_GENLIST_ITEM_SCROLLTO_TOP:
2534 if (it->item->group_item) gith = it->item->group_item->item->h;
2537 case ELM_GENLIST_ITEM_SCROLLTO_MIDDLE:
2538 dy += (it->item->h / 2 - oh / 2);
2540 case ELM_GENLIST_ITEM_SCROLLTO_IN:
2542 if ((wd->expanded_item) &&
2543 ((wd->show_item->y + wd->show_item->item->block->y + wd->show_item->item->h)
2544 - (wd->expanded_item->y + wd->expanded_item->item->block->y) > oh))
2546 it = wd->expanded_item;
2547 if (it->item->group_item) gith = it->item->group_item->item->h;
2548 dx = it->x + it->item->block->x;
2549 dy = it->y + it->item->block->y - gith;
2550 dw = it->item->block->w;
2554 if ((it->item->group_item) && (wd->pan_y > (it->y + it->item->block->y)))
2555 gith = it->item->group_item->item->h;
2562 elm_smart_scroller_region_bring_in(wd->scr, dx, dy, dw, dh);
2564 elm_smart_scroller_child_region_show(wd->scr, dx, dy, dw, dh);
2566 it->item->showme = EINA_FALSE;
2567 wd->show_item = NULL;
2568 wd->auto_scroll_enabled = EINA_FALSE;
2569 wd->check_scroll = EINA_FALSE;
2573 _calc_job(void *data)
2575 Widget_Data *wd = data;
2576 Item_Block *itb, *chb = NULL;
2577 Evas_Coord minw = -1, minh = 0, y = 0, ow, dy = 0, vw;
2578 Evas_Coord pan_w = 0, pan_h = 0;
2580 Eina_Bool minw_change = EINA_FALSE;
2581 Eina_Bool did_must_recalc = EINA_FALSE;
2584 evas_object_geometry_get(wd->pan_smart, NULL, NULL, &ow, &wd->h);
2585 elm_smart_scroller_child_viewport_size_get(wd->scr, &vw, NULL);
2590 evas_event_freeze(evas_object_evas_get(wd->obj));
2591 EINA_INLIST_FOREACH(wd->blocks, itb)
2593 Eina_Bool showme = EINA_FALSE;
2596 showme = itb->showme;
2597 itb->showme = EINA_FALSE;
2600 if (itb->realized) _item_block_unrealize(itb);
2602 if ((itb->changed) || ((itb->must_recalc) && (!did_must_recalc)))
2604 if (itb->must_recalc)
2608 EINA_LIST_FOREACH(itb->items, l, it)
2609 if (it->item->mincalcd) it->item->mincalcd = EINA_FALSE;
2610 itb->changed = EINA_TRUE;
2611 if (itb->must_recalc) did_must_recalc = EINA_TRUE;
2612 if (itb->realized) _item_block_unrealize(itb);
2613 itb->must_recalc = EINA_FALSE;
2615 showme = _item_block_recalc(itb, in, EINA_FALSE);
2621 if (minw == -1) minw = itb->minw;
2622 else if ((!itb->must_recalc) && (minw < itb->minw))
2625 minw_change = EINA_TRUE;
2630 minw_change = EINA_TRUE;
2636 if ((showme) && (wd->show_item) && (!wd->show_item->item->queued))
2637 wd->check_scroll = EINA_TRUE;
2641 EINA_INLIST_FOREACH(wd->blocks, itb)
2647 if ((chb) && (EINA_INLIST_GET(chb)->next))
2649 EINA_INLIST_FOREACH(EINA_INLIST_GET(chb)->next, itb)
2651 if (itb->realized) _item_block_unrealize(itb);
2654 wd->realminw = minw;
2655 if (minw < wd->w) minw = wd->w;
2656 if ((minw != wd->minw) || (minh != wd->minh))
2660 evas_object_smart_callback_call(wd->pan_smart, "changed", NULL);
2661 _sizing_eval(wd->obj);
2662 if ((wd->anchor_item) && (wd->anchor_item->item->block) && (!wd->auto_scroll_enabled))
2667 it = wd->anchor_item;
2668 it_y = wd->anchor_y;
2669 elm_smart_scroller_child_pos_set(wd->scr, wd->pan_x,
2670 it->item->block->y + it->y + it_y);
2671 wd->anchor_item = it;
2672 wd->anchor_y = it_y;
2675 if (did_must_recalc)
2677 if (!wd->must_recalc_idler)
2678 wd->must_recalc_idler = ecore_idler_add(_must_recalc_idler, wd);
2680 if (wd->check_scroll)
2682 _pan_child_size_get(wd->pan_smart, &pan_w, &pan_h);
2683 if (EINA_INLIST_GET(wd->show_item) == wd->items->last)
2684 wd->scrollto_type = ELM_GENLIST_ITEM_SCROLLTO_IN;
2685 switch (wd->scrollto_type)
2687 case ELM_GENLIST_ITEM_SCROLLTO_TOP:
2690 case ELM_GENLIST_ITEM_SCROLLTO_MIDDLE:
2693 case ELM_GENLIST_ITEM_SCROLLTO_IN:
2698 if ((pan_w > (wd->show_item->x + wd->show_item->item->block->x)) &&
2699 (pan_h > (wd->show_item->y + wd->show_item->item->block->y + dy)))
2704 wd->calc_job = NULL;
2705 evas_object_smart_changed(wd->pan_smart);
2706 evas_event_thaw(evas_object_evas_get(wd->obj));
2707 evas_event_thaw_eval(evas_object_evas_get(wd->obj));
2711 _update_job(void *data)
2713 Widget_Data *wd = data;
2717 Eina_Bool position = EINA_FALSE, recalc = EINA_FALSE;
2719 wd->update_job = NULL;
2722 evas_event_freeze(evas_object_evas_get(wd->obj));
2723 EINA_INLIST_FOREACH(wd->blocks, itb)
2725 Evas_Coord itminw, itminh;
2732 _item_block_position(itb, num);
2736 recalc = EINA_FALSE;
2737 EINA_LIST_FOREACH(itb->items, l2, it)
2739 if (it->item->updateme)
2741 itminw = it->item->minw;
2742 itminh = it->item->minh;
2744 it->item->updateme = EINA_FALSE;
2747 _elm_genlist_item_unrealize(it, EINA_FALSE);
2748 _item_realize(it, num, EINA_FALSE);
2749 position = EINA_TRUE;
2753 _item_realize(it, num, EINA_TRUE);
2754 _elm_genlist_item_unrealize(it, EINA_TRUE);
2756 if ((it->item->minw != itminw) || (it->item->minh != itminh))
2761 itb->updateme = EINA_FALSE;
2764 position = EINA_TRUE;
2765 itb->changed = EINA_TRUE;
2766 _item_block_recalc(itb, num0, EINA_FALSE);
2767 _item_block_position(itb, num0);
2772 if (wd->calc_job) ecore_job_del(wd->calc_job);
2773 wd->calc_job = ecore_job_add(_calc_job, wd);
2775 evas_event_thaw(evas_object_evas_get(wd->obj));
2776 evas_event_thaw_eval(evas_object_evas_get(wd->obj));
2780 _pan_set(Evas_Object *obj,
2784 Pan *sd = evas_object_smart_data_get(obj);
2788 // Evas_Coord ow, oh;
2789 // evas_object_geometry_get(obj, NULL, NULL, &ow, &oh);
2790 // ow = sd->wd->minw - ow;
2791 // if (ow < 0) ow = 0;
2792 // oh = sd->wd->minh - oh;
2793 // if (oh < 0) oh = 0;
2794 // if (x < 0) x = 0;
2795 // if (y < 0) y = 0;
2796 // if (x > ow) x = ow;
2797 // if (y > oh) y = oh;
2798 if ((x == sd->wd->pan_x) && (y == sd->wd->pan_y)) return;
2802 EINA_INLIST_FOREACH(sd->wd->blocks, itb)
2804 if ((itb->y + itb->h) > y)
2809 EINA_LIST_FOREACH(itb->items, l2, it)
2811 if ((itb->y + it->y) >= y)
2813 sd->wd->anchor_item = it;
2814 sd->wd->anchor_y = -(itb->y + it->y - y);
2821 if (!sd->wd->reorder_move_animator) evas_object_smart_changed(obj);
2825 _pan_get(Evas_Object *obj,
2829 Pan *sd = evas_object_smart_data_get(obj);
2832 if (x) *x = sd->wd->pan_x;
2833 if (y) *y = sd->wd->pan_y;
2837 _pan_max_get(Evas_Object *obj,
2841 Pan *sd = evas_object_smart_data_get(obj);
2845 evas_object_geometry_get(obj, NULL, NULL, &ow, &oh);
2846 ow = sd->wd->minw - ow;
2848 oh = sd->wd->minh - oh;
2855 _pan_min_get(Evas_Object *obj __UNUSED__,
2864 _pan_child_size_get(Evas_Object *obj,
2868 Pan *sd = evas_object_smart_data_get(obj);
2871 if (w) *w = sd->wd->minw;
2872 if (h) *h = sd->wd->minh;
2876 _pan_add(Evas_Object *obj)
2879 Evas_Object_Smart_Clipped_Data *cd;
2882 cd = evas_object_smart_data_get(obj);
2885 sd->__clipped_data = *cd;
2887 evas_object_smart_data_set(obj, sd);
2891 _pan_del(Evas_Object *obj)
2893 Pan *sd = evas_object_smart_data_get(obj);
2898 ecore_job_del(sd->resize_job);
2899 sd->resize_job = NULL;
2905 _pan_resize_job(void *data)
2909 _sizing_eval(sd->wd->obj);
2910 sd->resize_job = NULL;
2914 _pan_resize(Evas_Object *obj,
2918 Pan *sd = evas_object_smart_data_get(obj);
2922 evas_object_geometry_get(obj, NULL, NULL, &ow, &oh);
2923 if ((ow == w) && (oh == h)) return;
2924 if ((sd->wd->height_for_width) && (ow != w))
2927 if (sd->resize_job) ecore_job_del(sd->resize_job);
2928 sd->resize_job = ecore_job_add(_pan_resize_job, sd);
2930 sd->wd->pan_changed = EINA_TRUE;
2931 evas_object_smart_changed(obj);
2932 if (sd->wd->calc_job) ecore_job_del(sd->wd->calc_job);
2933 sd->wd->calc_job = NULL;
2935 if (sd->wd->calc_job) ecore_job_del(sd->wd->calc_job);
2936 sd->wd->calc_job = ecore_job_add(_calc_job, sd->wd);
2941 _pan_calculate(Evas_Object *obj)
2943 Pan *sd = evas_object_smart_data_get(obj);
2945 Evas_Coord ox, oy, ow, oh, cvx, cvy, cvw, cvh;
2951 evas_event_freeze(evas_object_evas_get(obj));
2953 if (sd->wd->pan_changed)
2956 sd->wd->pan_changed = EINA_FALSE;
2959 evas_object_geometry_get(obj, &ox, &oy, &ow, &oh);
2960 evas_output_viewport_get(evas_object_evas_get(obj), &cvx, &cvy, &cvw, &cvh);
2961 EINA_LIST_FOREACH(sd->wd->group_items, l, git)
2963 git->item->want_realize = EINA_FALSE;
2965 EINA_INLIST_FOREACH(sd->wd->blocks, itb)
2967 itb->w = sd->wd->minw;
2968 if (ELM_RECTS_INTERSECT(itb->x - sd->wd->pan_x + ox,
2969 itb->y - sd->wd->pan_y + oy,
2971 cvx, cvy, cvw, cvh))
2973 if ((!itb->realized) || (itb->changed))
2974 _item_block_realize(itb);
2975 _item_block_position(itb, in);
2979 if (itb->realized) _item_block_unrealize(itb);
2983 if ((!sd->wd->reorder_it) || (sd->wd->reorder_pan_move))
2984 _group_items_recalc(sd->wd);
2985 if ((sd->wd->reorder_mode) && (sd->wd->reorder_it))
2987 if (sd->wd->pan_y != sd->wd->reorder_old_pan_y)
2988 sd->wd->reorder_pan_move = EINA_TRUE;
2989 else sd->wd->reorder_pan_move = EINA_FALSE;
2990 evas_object_raise(sd->wd->VIEW(reorder_it));
2991 sd->wd->reorder_old_pan_y = sd->wd->pan_y;
2992 sd->wd->start_time = ecore_loop_time_get();
2995 if (sd->wd->tree_effect_enabled && (sd->wd->move_effect_mode != ELM_GENLIST_ITEM_MOVE_EFFECT_NONE))
2997 if (!sd->wd->item_moving_effect_timer)
2999 _item_tree_effect_before(sd->wd->expanded_item);
3000 evas_object_raise(sd->wd->alpha_bg);
3001 evas_object_show(sd->wd->alpha_bg);
3002 sd->wd->start_time = ecore_time_get();
3003 sd->wd->item_moving_effect_timer = ecore_animator_add(_item_moving_effect_timer_cb, sd->wd);
3007 _item_auto_scroll(sd->wd);
3009 evas_event_thaw(evas_object_evas_get(obj));
3010 evas_event_thaw_eval(evas_object_evas_get(obj));
3014 _pan_move(Evas_Object *obj,
3015 Evas_Coord x __UNUSED__,
3016 Evas_Coord y __UNUSED__)
3018 Pan *sd = evas_object_smart_data_get(obj);
3022 sd->wd->pan_changed = EINA_TRUE;
3023 evas_object_smart_changed(obj);
3024 if (sd->wd->calc_job) ecore_job_del(sd->wd->calc_job);
3025 sd->wd->calc_job = NULL;
3029 _hold_on(void *data __UNUSED__,
3031 void *event_info __UNUSED__)
3033 Widget_Data *wd = elm_widget_data_get(obj);
3035 elm_smart_scroller_hold_set(wd->scr, 1);
3039 _hold_off(void *data __UNUSED__,
3041 void *event_info __UNUSED__)
3043 Widget_Data *wd = elm_widget_data_get(obj);
3045 elm_smart_scroller_hold_set(wd->scr, 0);
3049 _freeze_on(void *data __UNUSED__,
3051 void *event_info __UNUSED__)
3053 Widget_Data *wd = elm_widget_data_get(obj);
3055 elm_smart_scroller_freeze_set(wd->scr, 1);
3059 _freeze_off(void *data __UNUSED__,
3061 void *event_info __UNUSED__)
3063 Widget_Data *wd = elm_widget_data_get(obj);
3065 elm_smart_scroller_freeze_set(wd->scr, 0);
3069 _scr_anim_start(void *data,
3070 Evas_Object *obj __UNUSED__,
3071 void *event_info __UNUSED__)
3073 evas_object_smart_callback_call(data, SIG_SCROLL_ANIM_START, NULL);
3077 _scr_anim_stop(void *data,
3078 Evas_Object *obj __UNUSED__,
3079 void *event_info __UNUSED__)
3081 evas_object_smart_callback_call(data, SIG_SCROLL_ANIM_STOP, NULL);
3085 _scr_drag_start(void *data,
3086 Evas_Object *obj __UNUSED__,
3087 void *event_info __UNUSED__)
3089 evas_object_smart_callback_call(data, SIG_SCROLL_DRAG_START, NULL);
3093 _scr_drag_stop(void *data,
3094 Evas_Object *obj __UNUSED__,
3095 void *event_info __UNUSED__)
3097 evas_object_smart_callback_call(data, SIG_SCROLL_DRAG_STOP, NULL);
3101 _edge_left(void *data,
3102 Evas_Object *scr __UNUSED__,
3103 void *event_info __UNUSED__)
3105 Evas_Object *obj = data;
3106 evas_object_smart_callback_call(obj, SIG_EDGE_LEFT, NULL);
3110 _edge_right(void *data,
3111 Evas_Object *scr __UNUSED__,
3112 void *event_info __UNUSED__)
3114 Evas_Object *obj = data;
3115 evas_object_smart_callback_call(obj, SIG_EDGE_RIGHT, NULL);
3119 _edge_top(void *data,
3120 Evas_Object *scr __UNUSED__,
3121 void *event_info __UNUSED__)
3123 Evas_Object *obj = data;
3124 evas_object_smart_callback_call(obj, SIG_EDGE_TOP, NULL);
3128 _edge_bottom(void *data,
3129 Evas_Object *scr __UNUSED__,
3130 void *event_info __UNUSED__)
3132 Evas_Object *obj = data;
3133 evas_object_smart_callback_call(obj, SIG_EDGE_BOTTOM, NULL);
3137 _mode_item_realize(Elm_Gen_Item *it)
3141 if ((it->item->mode_view) || (it->generation < it->wd->generation)) return;
3143 evas_event_freeze(evas_object_evas_get(it->wd->obj));
3144 it->item->mode_view = edje_object_add(evas_object_evas_get(WIDGET(it)));
3145 edje_object_scale_set(it->item->mode_view,
3146 elm_widget_scale_get(WIDGET(it)) *
3147 _elm_config->scale);
3148 evas_object_smart_member_add(it->item->mode_view, it->wd->pan_smart);
3149 elm_widget_sub_object_add(WIDGET(it), it->item->mode_view);
3151 strncpy(buf, "item", sizeof(buf));
3152 if (it->wd->compress)
3153 strncat(buf, "_compress", sizeof(buf) - strlen(buf));
3155 if (it->item->order_num_in & 0x1) strncat(buf, "_odd", sizeof(buf) - strlen(buf));
3156 strncat(buf, "/", sizeof(buf) - strlen(buf));
3157 strncat(buf, it->itc->mode_item_style, sizeof(buf) - strlen(buf));
3159 _elm_theme_object_set(WIDGET(it), it->item->mode_view, "genlist", buf,
3160 elm_widget_style_get(WIDGET(it)));
3161 edje_object_mirrored_set(it->item->mode_view,
3162 elm_widget_mirrored_get(WIDGET(it)));
3164 /* signal callback add */
3165 evas_object_event_callback_add(it->item->mode_view, EVAS_CALLBACK_MOUSE_DOWN,
3167 evas_object_event_callback_add(it->item->mode_view, EVAS_CALLBACK_MOUSE_UP,
3169 evas_object_event_callback_add(it->item->mode_view, EVAS_CALLBACK_MOUSE_MOVE,
3172 /* text_get, content_get, state_get */
3173 /* FIXME: If you see that assert, please notify us and we
3174 will clean our mess */
3175 assert(eina_list_count(it->item->mode_content_objs) == 0);
3177 _item_text_realize(it, it->item->mode_view, &it->item->mode_texts, NULL);
3178 it->item->mode_content_objs =
3179 _item_content_realize(it, it->item->mode_view,
3180 &it->item->mode_contents, NULL);
3181 _item_state_realize(it, it->item->mode_view, &it->item->mode_states, NULL);
3183 edje_object_part_swallow(it->item->mode_view,
3184 edje_object_data_get(it->item->mode_view, "mode_part"),
3187 it->want_unrealize = EINA_FALSE;
3188 evas_event_thaw(evas_object_evas_get(it->wd->obj));
3189 evas_event_thaw_eval(evas_object_evas_get(it->wd->obj));
3193 _mode_item_unrealize(Elm_Gen_Item *it)
3195 Widget_Data *wd = it->wd;
3196 Evas_Object *content;
3197 if (!it->item->mode_view) return;
3199 evas_event_freeze(evas_object_evas_get(it->wd->obj));
3200 elm_widget_stringlist_free(it->item->mode_texts);
3201 it->item->mode_texts = NULL;
3202 elm_widget_stringlist_free(it->item->mode_contents);
3203 it->item->mode_contents = NULL;
3204 elm_widget_stringlist_free(it->item->mode_states);
3206 EINA_LIST_FREE(it->item->mode_content_objs, content)
3207 evas_object_del(content);
3209 edje_object_part_unswallow(it->item->mode_view, VIEW(it));
3210 evas_object_smart_member_add(VIEW(it), wd->pan_smart);
3211 evas_object_del(it->item->mode_view);
3212 it->item->mode_view = NULL;
3214 if (wd->mode_item == it)
3215 wd->mode_item = NULL;
3216 evas_event_thaw(evas_object_evas_get(it->wd->obj));
3217 evas_event_thaw_eval(evas_object_evas_get(it->wd->obj));
3221 _item_mode_set(Elm_Gen_Item *it)
3224 Widget_Data *wd = it->wd;
3229 it->item->nocache_once = EINA_TRUE;
3231 if (wd->scr_hold_timer)
3233 ecore_timer_del(wd->scr_hold_timer);
3234 wd->scr_hold_timer = NULL;
3236 elm_smart_scroller_hold_set(wd->scr, EINA_TRUE);
3237 wd->scr_hold_timer = ecore_timer_add(0.1, _scr_hold_timer_cb, wd);
3239 evas_event_freeze(evas_object_evas_get(it->wd->obj));
3240 _mode_item_realize(it);
3241 if (it->item->group_item)
3242 evas_object_raise(it->item->VIEW(group_item));
3243 _item_position(it, it->item->mode_view, it->item->scrl_x, it->item->scrl_y);
3244 evas_event_thaw(evas_object_evas_get(it->wd->obj));
3245 evas_event_thaw_eval(evas_object_evas_get(it->wd->obj));
3247 snprintf(buf, sizeof(buf), "elm,state,%s,active", wd->mode_type);
3248 edje_object_signal_emit(it->item->mode_view, buf, "elm");
3252 _item_mode_unset(Widget_Data *wd)
3255 if (!wd->mode_item) return;
3256 char buf[1024], buf2[1024];
3260 it->item->nocache_once = EINA_TRUE;
3262 snprintf(buf, sizeof(buf), "elm,state,%s,passive", wd->mode_type);
3263 snprintf(buf2, sizeof(buf2), "elm,state,%s,passive,finished", wd->mode_type);
3265 edje_object_signal_emit(it->item->mode_view, buf, "elm");
3266 edje_object_signal_callback_add(it->item->mode_view, buf2, "elm", _mode_finished_signal_cb, it);
3268 wd->mode_item = NULL;
3272 _edit_mode_item_position(Elm_Gen_Item *it, int itx, int ity)
3274 if ((!it) || (!it->wd->edit_mode)) return;
3275 evas_object_resize(it->edit_obj, it->item->w, it->item->h);
3276 evas_object_move(it->edit_obj, itx, ity);
3280 _edit_mode_item_realize(Elm_Gen_Item *it, Eina_Bool effect_on)
3283 const char *stacking_even;
3284 const char *stacking;
3286 if ((!it) || (it->item->edit_mode_item_realized) ||
3287 (it->generation < it->wd->generation))
3290 it->edit_obj = edje_object_add(evas_object_evas_get(WIDGET(it)));
3291 edje_object_scale_set(it->edit_obj, elm_widget_scale_get(WIDGET(it)) *
3292 _elm_config->scale);
3293 evas_object_smart_member_add(it->edit_obj, it->wd->pan_smart);
3294 elm_widget_sub_object_add(WIDGET(it), it->edit_obj);
3296 if (it->item->type & ELM_GENLIST_ITEM_SUBITEMS)
3297 strncpy(buf, "tree", sizeof(buf));
3298 else strncpy(buf, "item", sizeof(buf));
3299 if (it->wd->compress)
3300 strncat(buf, "_compress", sizeof(buf) - strlen(buf));
3302 strncat(buf, "/", sizeof(buf) - strlen(buf));
3303 strncat(buf, it->itc->edit_item_style, sizeof(buf) - strlen(buf));
3305 _elm_theme_object_set(WIDGET(it), it->edit_obj, "genlist", buf,
3306 elm_widget_style_get(WIDGET(it)));
3308 stacking_even = edje_object_data_get(VIEW(it), "stacking_even");
3309 if (!stacking_even) stacking_even = "above";
3310 it->item->stacking_even = !!strcmp("above", stacking_even);
3312 stacking = edje_object_data_get(VIEW(it), "stacking");
3313 if (!stacking) stacking = "yes";
3314 it->item->nostacking = !!strcmp("yes", stacking);
3316 edje_object_mirrored_set(it->edit_obj,
3317 elm_widget_mirrored_get(WIDGET(it)));
3319 _elm_genlist_item_odd_even_update(it);
3320 _elm_genlist_item_state_update(it, NULL);
3322 if (effect_on) edje_object_signal_emit(it->edit_obj, "elm,state,edit,enabled,effect", "elm");
3323 else edje_object_signal_emit(it->edit_obj, "elm,state,edit,enabled", "elm");
3325 evas_object_event_callback_add(it->edit_obj, EVAS_CALLBACK_MOUSE_DOWN,
3327 evas_object_event_callback_add(it->edit_obj, EVAS_CALLBACK_MOUSE_UP,
3329 evas_object_event_callback_add(it->edit_obj, EVAS_CALLBACK_MOUSE_MOVE,
3331 evas_object_event_callback_add(it->edit_obj, EVAS_CALLBACK_MULTI_DOWN,
3333 evas_object_event_callback_add(it->edit_obj, EVAS_CALLBACK_MULTI_UP,
3335 evas_object_event_callback_add(it->edit_obj, EVAS_CALLBACK_MULTI_MOVE,
3338 _item_text_realize(it, it->edit_obj, &it->item->edit_texts, NULL);
3339 if (it->flipped) edje_object_signal_emit(it->edit_obj, "elm,state,flip,enabled", "elm");
3340 it->item->edit_content_objs =
3341 _item_content_realize(it, it->edit_obj, &it->item->edit_contents, NULL);
3342 _item_state_realize(it, it->edit_obj, &it->item->edit_states, NULL);
3343 edje_object_part_swallow(it->edit_obj, "elm.swallow.edit.content", VIEW(it));
3345 _edit_mode_item_position(it, it->item->scrl_x, it->item->scrl_y);
3346 evas_object_show(it->edit_obj);
3348 it->item->edit_mode_item_realized = EINA_TRUE;
3349 it->want_unrealize = EINA_FALSE;
3353 _edit_mode_item_unrealize(Elm_Gen_Item *it)
3356 if ((!it) || (!it->item->edit_mode_item_realized)) return;
3358 edje_object_part_unswallow(it->edit_obj, VIEW(it));
3359 evas_object_smart_member_add(VIEW(it), it->wd->pan_smart);
3360 elm_widget_sub_object_add(WIDGET(it), VIEW(it));
3361 _elm_genlist_item_odd_even_update(it);
3362 _elm_genlist_item_state_update(it, NULL);
3364 evas_object_del(it->edit_obj);
3365 it->edit_obj = NULL;
3366 elm_widget_stringlist_free(it->item->edit_texts);
3367 it->item->edit_texts = NULL;
3368 elm_widget_stringlist_free(it->item->edit_contents);
3369 it->item->edit_contents = NULL;
3370 elm_widget_stringlist_free(it->item->edit_states);
3371 it->item->edit_states = NULL;
3372 EINA_LIST_FREE(it->item->edit_content_objs, icon)
3373 evas_object_del(icon);
3374 edje_object_message_signal_process(it->edit_obj);
3376 evas_object_event_callback_del_full(it->edit_obj, EVAS_CALLBACK_MOUSE_DOWN,
3378 evas_object_event_callback_del_full(it->edit_obj, EVAS_CALLBACK_MOUSE_UP,
3380 evas_object_event_callback_del_full(it->edit_obj, EVAS_CALLBACK_MOUSE_MOVE,
3382 evas_object_event_callback_del_full(it->edit_obj, EVAS_CALLBACK_MULTI_DOWN,
3384 evas_object_event_callback_del_full(it->edit_obj, EVAS_CALLBACK_MULTI_UP,
3386 evas_object_event_callback_del_full(it->edit_obj, EVAS_CALLBACK_MULTI_MOVE,
3388 it->item->edit_mode_item_realized = EINA_FALSE;
3392 _item_auto_scroll(Widget_Data *wd)
3395 Elm_Gen_Item *tmp_item = NULL;
3397 if ((wd->expanded_item) && (wd->auto_scroll_enabled))
3399 tmp_item = eina_list_data_get(eina_list_last(wd->expanded_item->item->items));
3400 if (!tmp_item) return;
3401 wd->show_item = tmp_item;
3402 wd->bring_in = EINA_TRUE;
3403 wd->scrollto_type = ELM_GENLIST_ITEM_SCROLLTO_IN;
3404 if ((wd->show_item->item->queued) || (!wd->show_item->item->mincalcd))
3406 wd->show_item->item->showme = EINA_TRUE;
3407 wd->auto_scroll_enabled = EINA_FALSE;
3415 elm_genlist_add(Evas_Object *parent)
3420 Evas_Coord minw, minh;
3421 static Evas_Smart *smart = NULL;
3425 static Evas_Smart_Class sc;
3427 evas_object_smart_clipped_smart_set(&_pan_sc);
3429 sc.name = "elm_genlist_pan";
3430 sc.version = EVAS_SMART_CLASS_VERSION;
3433 sc.resize = _pan_resize;
3434 sc.move = _pan_move;
3435 sc.calculate = _pan_calculate;
3436 if (!(smart = evas_smart_class_new(&sc))) return NULL;
3439 ELM_WIDGET_STANDARD_SETUP(wd, Widget_Data, parent, e, obj, NULL);
3441 ELM_SET_WIDTYPE(widtype, "genlist");
3443 elm_widget_type_set(obj, "genlist");
3444 elm_widget_sub_object_add(parent, obj);
3445 elm_widget_on_focus_hook_set(obj, _on_focus_hook, NULL);
3446 elm_widget_signal_emit_hook_set(obj, _signal_emit_hook);
3447 elm_widget_data_set(obj, wd);
3448 elm_widget_del_hook_set(obj, _del_hook);
3449 elm_widget_del_pre_hook_set(obj, _del_pre_hook);
3450 elm_widget_theme_hook_set(obj, _theme_hook);
3451 elm_widget_can_focus_set(obj, EINA_TRUE);
3452 elm_widget_event_hook_set(obj, _event_hook);
3453 elm_widget_on_show_region_hook_set(obj, _show_region_hook, obj);
3454 elm_widget_translate_hook_set(obj, _translate_hook);
3457 wd->scr = elm_smart_scroller_add(e);
3458 elm_smart_scroller_widget_set(wd->scr, obj);
3459 elm_smart_scroller_object_theme_set(obj, wd->scr, "genlist", "base",
3460 elm_widget_style_get(obj));
3461 elm_smart_scroller_bounce_allow_set(wd->scr, EINA_FALSE,
3462 _elm_config->thumbscroll_bounce_enable);
3463 elm_widget_resize_object_set(obj, wd->scr);
3465 evas_object_smart_callback_add(wd->scr, "animate,start", _scr_anim_start, obj);
3466 evas_object_smart_callback_add(wd->scr, "animate,stop", _scr_anim_stop, obj);
3467 evas_object_smart_callback_add(wd->scr, "drag,start", _scr_drag_start, obj);
3468 evas_object_smart_callback_add(wd->scr, "drag,stop", _scr_drag_stop, obj);
3469 evas_object_smart_callback_add(wd->scr, "edge,left", _edge_left, obj);
3470 evas_object_smart_callback_add(wd->scr, "edge,right", _edge_right, obj);
3471 evas_object_smart_callback_add(wd->scr, "edge,top", _edge_top, obj);
3472 evas_object_smart_callback_add(wd->scr, "edge,bottom", _edge_bottom, obj);
3475 wd->mode = ELM_LIST_SCROLL;
3476 wd->max_items_per_block = MAX_ITEMS_PER_BLOCK;
3477 wd->item_cache_max = wd->max_items_per_block * 2;
3478 wd->longpress_timeout = _elm_config->longpress_timeout;
3480 evas_object_smart_callback_add(obj, "scroll-hold-on", _hold_on, obj);
3481 evas_object_smart_callback_add(obj, "scroll-hold-off", _hold_off, obj);
3482 evas_object_smart_callback_add(obj, "scroll-freeze-on", _freeze_on, obj);
3483 evas_object_smart_callback_add(obj, "scroll-freeze-off", _freeze_off, obj);
3485 wd->pan_smart = evas_object_smart_add(e, smart);
3486 wd->pan = evas_object_smart_data_get(wd->pan_smart);
3489 elm_smart_scroller_extern_pan_set(wd->scr, wd->pan_smart,
3490 _pan_set, _pan_get, _pan_max_get,
3491 _pan_min_get, _pan_child_size_get);
3493 edje_object_size_min_calc(elm_smart_scroller_edje_object_get(wd->scr),
3495 evas_object_size_hint_min_set(obj, minw, minh);
3497 evas_object_smart_callbacks_descriptions_set(obj, _signals);
3499 _mirrored_set(obj, elm_widget_mirrored_get(obj));
3505 _item_select(Elm_Gen_Item *it)
3507 if ((it->generation < it->wd->generation) || (it->mode_set) ||
3508 (it->wd->select_mode == ELM_OBJECT_NO_SELECT))
3512 it->selected = EINA_TRUE;
3513 it->wd->selected = eina_list_append(it->wd->selected, it);
3515 else if (it->wd->select_mode == ELM_OBJECT_ALWAYS_SELECT) return;
3517 evas_object_ref(WIDGET(it));
3520 if (it->func.func) it->func.func((void *)it->func.data, WIDGET(it), it);
3521 if (it->generation == it->wd->generation)
3522 evas_object_smart_callback_call(WIDGET(it), SIG_SELECTED, it);
3525 evas_object_unref(WIDGET(it));
3526 if ((it->wd->clear_me) && (!it->wd->walking))
3527 _elm_genlist_clear(WIDGET(it), EINA_TRUE);
3530 if ((!it->walking) && (it->generation < it->wd->generation))
3535 elm_widget_item_free(it);
3539 it->wd->last_selected_item = (Elm_Object_Item *)it;
3543 static Evas_Object *
3544 _item_content_get_hook(Elm_Gen_Item *it, const char *part)
3546 return edje_object_part_swallow_get(VIEW(it), part);
3550 _item_content_set_hook(Elm_Gen_Item *it, const char *part, Evas_Object *content)
3552 if (content && part)
3554 it->content_objs = eina_list_append(it->content_objs, content);
3555 edje_object_part_swallow(VIEW(it), part, content);
3559 static Evas_Object *
3560 _item_content_unset_hook(Elm_Gen_Item *it, const char *part)
3563 obj = edje_object_part_swallow_get(VIEW(it), part);
3564 if (!obj) return NULL;
3565 it->content_objs = eina_list_remove(it->content_objs, obj);
3566 edje_object_part_unswallow(VIEW(it), obj);
3571 _item_text_hook(Elm_Gen_Item *it, const char *part)
3573 if (!it->itc->func.text_get) return NULL;
3574 return edje_object_part_text_get(VIEW(it), part);
3578 _item_disable_hook(Elm_Object_Item *it)
3582 Elm_Gen_Item *_it = (Elm_Gen_Item *)it;
3584 if (_it->generation < _it->wd->generation) return;
3587 elm_genlist_item_selected_set(it, EINA_FALSE);
3591 if (elm_widget_item_disabled_get(it))
3593 edje_object_signal_emit(VIEW(_it), "elm,state,disabled", "elm");
3595 edje_object_signal_emit(_it->edit_obj, "elm,state,disabled", "elm");
3599 edje_object_signal_emit(VIEW(_it), "elm,state,enabled", "elm");
3601 edje_object_signal_emit(_it->edit_obj, "elm,state,enabled", "elm");
3603 EINA_LIST_FOREACH(_it->content_objs, l, obj)
3604 elm_widget_disabled_set(obj, elm_widget_item_disabled_get(_it));
3609 _item_del_pre_hook(Elm_Object_Item *it)
3611 Elm_Gen_Item *_it = (Elm_Gen_Item *)it;
3613 if ((_it->relcount > 0) || (_it->walking > 0))
3615 elm_genlist_item_subitems_clear(it);
3616 if (_it->wd->show_item == _it) _it->wd->show_item = NULL;
3617 _elm_genlist_item_del_notserious(_it);
3618 if (_it->item->block)
3620 if (_it->realized) _elm_genlist_item_unrealize(_it, EINA_FALSE);
3621 _it->item->block->changed = EINA_TRUE;
3622 if (_it->wd->calc_job) ecore_job_del(_it->wd->calc_job);
3623 _it->wd->calc_job = ecore_job_add(_calc_job, _it->wd);
3627 _it->parent->item->items =
3628 eina_list_remove(_it->parent->item->items, it);
3638 _elm_genlist_item_new(Widget_Data *wd,
3639 const Elm_Gen_Item_Class *itc,
3641 Elm_Gen_Item *parent,
3643 const void *func_data)
3647 it = elm_widget_item_new(wd->obj, Elm_Gen_Item);
3648 if (!it) return NULL;
3650 it->generation = wd->generation;
3652 elm_genlist_item_class_ref((Elm_Genlist_Item_Class *)itc);
3653 it->base.data = data;
3654 it->parent = parent;
3655 it->func.func = func;
3656 it->func.data = func_data;
3657 elm_widget_item_content_get_hook_set(it, _item_content_get_hook);
3658 elm_widget_item_content_set_hook_set(it, _item_content_set_hook);
3659 elm_widget_item_content_unset_hook_set(it, _item_content_unset_hook);
3660 elm_widget_item_text_get_hook_set(it, _item_text_hook);
3661 elm_widget_item_disable_hook_set(it, _item_disable_hook);
3662 elm_widget_item_del_pre_hook_set(it, _item_del_pre_hook);
3664 it->sel_cb = (Ecore_Cb)_item_select;
3669 static Elm_Gen_Item *
3670 _item_new(Widget_Data *wd,
3671 const Elm_Genlist_Item_Class *itc,
3673 Elm_Gen_Item *parent,
3674 Elm_Genlist_Item_Type type,
3676 const void *func_data)
3678 Elm_Gen_Item *it, *it2;
3681 it = _elm_genlist_item_new(wd, itc, data, parent, func, func_data);
3682 if (!it) return NULL;
3683 it->item = ELM_NEW(Elm_Gen_Item_Type);
3684 it->item->type = type;
3685 if (type & ELM_GENLIST_ITEM_GROUP) it->group++;
3686 it->item->expanded_depth = 0;
3687 ELM_GEN_ITEM_SETUP(it);
3690 if (it->parent->group)
3691 it->item->group_item = parent;
3692 else if (it->parent->item->group_item)
3693 it->item->group_item = it->parent->item->group_item;
3695 for (it2 = it, depth = 0; it2->parent; it2 = it2->parent)
3697 if (!it2->parent->group) depth += 1;
3699 it->item->expanded_depth = depth;
3705 _item_block_new(Widget_Data *wd, Eina_Bool prepend)
3709 itb = calloc(1, sizeof(Item_Block));
3710 if (!itb) return NULL;
3714 wd->blocks = eina_inlist_prepend(wd->blocks, EINA_INLIST_GET(itb));
3715 _item_block_position_update(wd->blocks, 0);
3719 wd->blocks = eina_inlist_append(wd->blocks, EINA_INLIST_GET(itb));
3720 itb->position_update = EINA_TRUE;
3721 if (wd->blocks != EINA_INLIST_GET(itb))
3723 itb->position = ((Item_Block *) (EINA_INLIST_GET(itb)->prev))->position + 1;
3734 _item_block_add(Widget_Data *wd,
3737 Item_Block *itb = NULL;
3744 itb = calloc(1, sizeof(Item_Block));
3745 if (!itb) return EINA_FALSE;
3747 if (!it->item->rel->item->block)
3750 eina_inlist_append(wd->blocks, EINA_INLIST_GET(itb));
3751 itb->items = eina_list_append(itb->items, it);
3752 itb->position_update = EINA_TRUE;
3753 it->position = eina_list_count(itb->items);
3754 it->position_update = EINA_TRUE;
3756 if (wd->blocks != EINA_INLIST_GET(itb))
3758 itb->position = ((Item_Block *) (EINA_INLIST_GET(itb)->prev))->position + 1;
3769 tmp = eina_list_data_find_list(itb->items, it->item->rel);
3770 if (it->item->before)
3772 wd->blocks = eina_inlist_prepend_relative
3773 (wd->blocks, EINA_INLIST_GET(itb),
3774 EINA_INLIST_GET(it->item->rel->item->block));
3776 eina_list_prepend_relative_list(itb->items, it, tmp);
3778 /* Update index from where we prepended */
3779 _item_position_update(eina_list_prev(tmp), it->item->rel->position);
3780 _item_block_position_update(EINA_INLIST_GET(itb),
3781 it->item->rel->item->block->position);
3785 wd->blocks = eina_inlist_append_relative
3786 (wd->blocks, EINA_INLIST_GET(itb),
3787 EINA_INLIST_GET(it->item->rel->item->block));
3789 eina_list_append_relative_list(itb->items, it, tmp);
3791 /* Update block index from where we appended */
3792 _item_position_update(eina_list_next(tmp), it->item->rel->position + 1);
3793 _item_block_position_update(EINA_INLIST_GET(itb),
3794 it->item->rel->item->block->position + 1);
3800 if (it->item->before)
3804 itb = (Item_Block *)(wd->blocks);
3805 if (itb->count >= wd->max_items_per_block)
3807 itb = _item_block_new(wd, EINA_TRUE);
3808 if (!itb) return EINA_FALSE;
3813 itb = _item_block_new(wd, EINA_TRUE);
3814 if (!itb) return EINA_FALSE;
3816 itb->items = eina_list_prepend(itb->items, it);
3818 _item_position_update(itb->items, 0);
3824 itb = (Item_Block *)(wd->blocks->last);
3825 if (itb->count >= wd->max_items_per_block)
3827 itb = _item_block_new(wd, EINA_FALSE);
3828 if (!itb) return EINA_FALSE;
3833 itb = _item_block_new(wd, EINA_FALSE);
3834 if (!itb) return EINA_FALSE;
3836 itb->items = eina_list_append(itb->items, it);
3837 it->position = eina_list_count(itb->items);
3845 if (it->item->rel->item->queued)
3847 /* NOTE: for a strange reason eina_list and eina_inlist don't have the same property
3848 on sorted insertion order, so the queue is not always ordered like the item list.
3849 This lead to issue where we depend on an item that is not yet created. As a quick
3850 work around, we reschedule the calc of the item and stop reordering the list to
3851 prevent any nasty issue to show up here.
3853 wd->queue = eina_list_append(wd->queue, it);
3854 wd->requeued = EINA_TRUE;
3855 it->item->queued = EINA_TRUE;
3858 itb = it->item->rel->item->block;
3859 if (!itb) goto newblock;
3860 tmp = eina_list_data_find_list(itb->items, it->item->rel);
3861 if (it->item->before)
3863 itb->items = eina_list_prepend_relative_list(itb->items, it, tmp);
3864 _item_position_update(eina_list_prev(tmp), it->item->rel->position);
3868 itb->items = eina_list_append_relative_list(itb->items, it, tmp);
3869 _item_position_update(eina_list_next(tmp), it->item->rel->position + 1);
3873 itb->changed = EINA_TRUE;
3874 it->item->block = itb;
3875 if (itb->wd->calc_job) ecore_job_del(itb->wd->calc_job);
3876 itb->wd->calc_job = ecore_job_add(_calc_job, itb->wd);
3879 it->item->rel->relcount--;
3880 if ((it->item->rel->generation < it->wd->generation) && (!it->item->rel->relcount))
3882 _item_del(it->item->rel);
3883 elm_widget_item_free(it->item->rel);
3885 it->item->rel = NULL;
3887 if (itb->count > itb->wd->max_items_per_block)
3892 Eina_Bool done = EINA_FALSE;
3894 newc = itb->count / 2;
3896 if (EINA_INLIST_GET(itb)->prev)
3898 Item_Block *itbp = (Item_Block *)(EINA_INLIST_GET(itb)->prev);
3900 if (itbp->count + newc < wd->max_items_per_block / 2)
3902 /* moving items to previous block */
3903 while ((itb->count > newc) && (itb->items))
3905 it2 = eina_list_data_get(itb->items);
3906 itb->items = eina_list_remove_list(itb->items, itb->items);
3909 itbp->items = eina_list_append(itbp->items, it2);
3910 it2->item->block = itbp;
3918 if (!done && EINA_INLIST_GET(itb)->next)
3920 Item_Block *itbn = (Item_Block *)(EINA_INLIST_GET(itb)->next);
3922 if (itbn->count + newc < wd->max_items_per_block / 2)
3924 /* moving items to next block */
3925 while ((itb->count > newc) && (itb->items))
3929 l = eina_list_last(itb->items);
3930 it2 = eina_list_data_get(l);
3931 itb->items = eina_list_remove_list(itb->items, l);
3934 itbn->items = eina_list_prepend(itbn->items, it2);
3935 it2->item->block = itbn;
3945 /* moving items to new block */
3946 itb2 = calloc(1, sizeof(Item_Block));
3947 if (!itb2) return EINA_FALSE;
3950 eina_inlist_append_relative(wd->blocks, EINA_INLIST_GET(itb2),
3951 EINA_INLIST_GET(itb));
3952 itb2->changed = EINA_TRUE;
3953 while ((itb->count > newc) && (itb->items))
3957 l = eina_list_last(itb->items);
3959 itb->items = eina_list_remove_list(itb->items, l);
3962 itb2->items = eina_list_prepend(itb2->items, it2);
3963 it2->item->block = itb2;
3973 _queue_process(Widget_Data *wd)
3976 Eina_Bool showme = EINA_FALSE;
3979 t0 = ecore_loop_time_get();
3980 //evas_event_freeze(evas_object_evas_get(wd->obj));
3981 for (n = 0; (wd->queue) && (n < 128); n++)
3985 it = eina_list_data_get(wd->queue);
3986 wd->queue = eina_list_remove_list(wd->queue, wd->queue);
3987 it->item->queued = EINA_FALSE;
3988 if (!_item_block_add(wd, it)) continue;
3990 _item_block_realize(it->item->block);
3991 t = ecore_time_get();
3992 if (it->item->block->changed)
3994 showme = _item_block_recalc(it->item->block, it->item->block->num, EINA_TRUE);
3995 it->item->block->changed = 0;
3996 if (wd->pan_changed)
3998 if (wd->calc_job) ecore_job_del(wd->calc_job);
3999 wd->calc_job = NULL;
4001 wd->pan_changed = EINA_FALSE;
4004 if (showme) it->item->block->showme = EINA_TRUE;
4005 /* same as eina_inlist_count > 1 */
4006 if (wd->blocks && wd->blocks->next)
4008 if ((t - t0) > (ecore_animator_frametime_get())) break;
4011 //evas_event_thaw(evas_object_evas_get(wd->obj));
4012 //evas_event_thaw_eval(evas_object_evas_get(wd->obj));
4017 _idle_process(void *data, Eina_Bool *wakeup)
4019 Widget_Data *wd = data;
4022 //static double q_start = 0.0;
4023 //if (q_start == 0.0) q_start = ecore_time_get();
4025 if (_queue_process(wd) > 0) *wakeup = EINA_TRUE;
4029 //printf("PROCESS TIME: %3.3f\n", ecore_time_get() - q_start);
4031 return ECORE_CALLBACK_CANCEL;
4033 return ECORE_CALLBACK_RENEW;
4037 _item_idle_enterer(void *data)
4039 Widget_Data *wd = data;
4040 Eina_Bool wakeup = EINA_FALSE;
4041 Eina_Bool ok = _idle_process(data, &wakeup);
4046 if (wd->calc_job) ecore_job_del(wd->calc_job);
4047 wd->calc_job = ecore_job_add(_calc_job, wd);
4049 if (ok == ECORE_CALLBACK_CANCEL) wd->queue_idle_enterer = NULL;
4054 _item_queue(Widget_Data *wd,
4058 if (it->item->queued) return;
4059 it->item->queued = EINA_TRUE;
4060 if (cb && !wd->requeued)
4061 wd->queue = eina_list_sorted_insert(wd->queue, cb, it);
4063 wd->queue = eina_list_append(wd->queue, it);
4064 // FIXME: why does a freeze then thaw here cause some genlist
4065 // elm_genlist_item_append() to be much much slower?
4066 // evas_event_freeze(evas_object_evas_get(wd->obj));
4067 while ((wd->queue) && ((!wd->blocks) || (!wd->blocks->next)))
4069 if (wd->queue_idle_enterer)
4071 ecore_idle_enterer_del(wd->queue_idle_enterer);
4072 wd->queue_idle_enterer = NULL;
4076 // evas_event_thaw(evas_object_evas_get(wd->obj));
4077 // evas_event_thaw_eval(evas_object_evas_get(wd->obj));
4078 if (!wd->queue_idle_enterer)
4079 wd->queue_idle_enterer = ecore_idle_enterer_add(_item_idle_enterer, wd);
4083 _elm_genlist_item_compare(const void *data, const void *data1)
4085 const Elm_Gen_Item *it, *item1;
4086 it = ELM_GEN_ITEM_FROM_INLIST(data);
4087 item1 = ELM_GEN_ITEM_FROM_INLIST(data1);
4088 return it->wd->item_compare_cb(it, item1);
4092 _elm_genlist_item_list_compare(const void *data, const void *data1)
4094 const Elm_Gen_Item *it = data;
4095 const Elm_Gen_Item *item1 = data1;
4096 return it->wd->item_compare_cb(it, item1);
4100 _item_move_after(Elm_Gen_Item *it, Elm_Gen_Item *after)
4105 it->wd->items = eina_inlist_remove(it->wd->items, EINA_INLIST_GET(it));
4106 _item_block_del(it);
4108 it->wd->items = eina_inlist_append_relative(it->wd->items, EINA_INLIST_GET(it), EINA_INLIST_GET(after));
4109 it->item->rel = after;
4110 it->item->rel->relcount++;
4111 it->item->before = EINA_FALSE;
4112 if (after->item->group_item) it->item->group_item = after->item->group_item;
4113 _item_queue(it->wd, it, NULL);
4115 evas_object_smart_callback_call(WIDGET(it), SIG_MOVED, it);
4119 _item_move_before(Elm_Gen_Item *it, Elm_Gen_Item *before)
4122 if (!before) return;
4124 it->wd->items = eina_inlist_remove(it->wd->items, EINA_INLIST_GET(it));
4125 _item_block_del(it);
4126 it->wd->items = eina_inlist_prepend_relative(it->wd->items, EINA_INLIST_GET(it), EINA_INLIST_GET(before));
4127 it->item->rel = before;
4128 it->item->rel->relcount++;
4129 it->item->before = EINA_TRUE;
4130 if (before->item->group_item) it->item->group_item = before->item->group_item;
4131 _item_queue(it->wd, it, NULL);
4133 evas_object_smart_callback_call(WIDGET(it), SIG_MOVED, it);
4137 elm_genlist_items_count(const Evas_Object *obj)
4139 ELM_CHECK_WIDTYPE(obj, widtype) 0;
4140 Widget_Data *wd = elm_widget_data_get(obj);
4142 return wd->item_count;
4145 EAPI Elm_Object_Item *
4146 elm_genlist_item_append(Evas_Object *obj,
4147 const Elm_Genlist_Item_Class *itc,
4149 Elm_Object_Item *parent,
4150 Elm_Genlist_Item_Type type,
4152 const void *func_data)
4154 ELM_CHECK_WIDTYPE(obj, widtype) NULL;
4155 Widget_Data *wd = elm_widget_data_get(obj);
4156 if (!wd) return NULL;
4157 Elm_Gen_Item *it = _item_new(wd, itc, data, (Elm_Gen_Item *) parent, type,
4159 if (!it) return NULL;
4163 wd->group_items = eina_list_append(wd->group_items, it);
4164 wd->items = eina_inlist_append(wd->items, EINA_INLIST_GET(it));
4165 it->item->rel = NULL;
4169 Elm_Gen_Item *it2 = NULL;
4170 Eina_List *ll = eina_list_last(it->parent->item->items);
4171 if (ll) it2 = ll->data;
4172 it->parent->item->items = eina_list_append(it->parent->item->items, it);
4173 if (!it2) it2 = it->parent;
4175 eina_inlist_append_relative(wd->items, EINA_INLIST_GET(it),
4176 EINA_INLIST_GET(it2));
4177 it->item->rel = it2;
4178 it->item->rel->relcount++;
4180 it->item->before = EINA_FALSE;
4181 _item_queue(wd, it, NULL);
4182 return (Elm_Object_Item *)it;
4185 EAPI Elm_Object_Item *
4186 elm_genlist_item_prepend(Evas_Object *obj,
4187 const Elm_Genlist_Item_Class *itc,
4189 Elm_Object_Item *parent,
4190 Elm_Genlist_Item_Type type,
4192 const void *func_data)
4194 ELM_CHECK_WIDTYPE(obj, widtype) NULL;
4195 Widget_Data *wd = elm_widget_data_get(obj);
4196 if (!wd) return NULL;
4197 Elm_Gen_Item *it = _item_new(wd, itc, data, (Elm_Gen_Item *) parent, type,
4199 if (!it) return NULL;
4203 wd->group_items = eina_list_prepend(wd->group_items, it);
4204 wd->items = eina_inlist_prepend(wd->items, EINA_INLIST_GET(it));
4205 it->item->rel = NULL;
4209 Elm_Gen_Item *it2 = NULL;
4210 Eina_List *ll = it->parent->item->items;
4211 if (ll) it2 = ll->data;
4212 it->parent->item->items = eina_list_prepend(it->parent->item->items, it);
4213 if (!it2) it2 = it->parent;
4215 eina_inlist_prepend_relative(wd->items, EINA_INLIST_GET(it),
4216 EINA_INLIST_GET(it2));
4217 it->item->rel = it2;
4218 it->item->rel->relcount++;
4220 it->item->before = EINA_TRUE;
4221 _item_queue(wd, it, NULL);
4222 return (Elm_Object_Item *)it;
4225 EAPI Elm_Object_Item *
4226 elm_genlist_item_insert_after(Evas_Object *obj,
4227 const Elm_Genlist_Item_Class *itc,
4229 Elm_Object_Item *parent,
4230 Elm_Object_Item *after,
4231 Elm_Genlist_Item_Type type,
4233 const void *func_data)
4235 ELM_CHECK_WIDTYPE(obj, widtype) NULL;
4236 ELM_OBJ_ITEM_CHECK_OR_RETURN(after, NULL);
4237 Widget_Data *wd = elm_widget_data_get(obj);
4238 Elm_Gen_Item *_after = (Elm_Gen_Item *) after;
4239 if (!wd) return NULL;
4240 /* It makes no sense to insert after in an empty list with after != NULL, something really bad is happening in your app. */
4241 EINA_SAFETY_ON_NULL_RETURN_VAL(wd->items, NULL);
4243 Elm_Gen_Item *it = _item_new(wd, itc, data, (Elm_Gen_Item *) parent, type,
4245 if (!it) return NULL;
4248 if ((it->group) && (_after->group))
4249 wd->group_items = eina_list_append_relative(wd->group_items, it,
4254 it->parent->item->items =
4255 eina_list_append_relative(it->parent->item->items, it, _after);
4257 wd->items = eina_inlist_append_relative(wd->items, EINA_INLIST_GET(it),
4258 EINA_INLIST_GET(_after));
4259 it->item->rel = _after;
4260 it->item->rel->relcount++;
4261 it->item->before = EINA_FALSE;
4262 _item_queue(wd, it, NULL);
4263 return (Elm_Object_Item *)it;
4266 EAPI Elm_Object_Item *
4267 elm_genlist_item_insert_before(Evas_Object *obj,
4268 const Elm_Genlist_Item_Class *itc,
4270 Elm_Object_Item *parent,
4271 Elm_Object_Item *before,
4272 Elm_Genlist_Item_Type type,
4274 const void *func_data)
4276 ELM_CHECK_WIDTYPE(obj, widtype) NULL;
4277 ELM_OBJ_ITEM_CHECK_OR_RETURN(before, NULL);
4278 Widget_Data *wd = elm_widget_data_get(obj);
4279 Elm_Gen_Item *_before = (Elm_Gen_Item *) before;
4280 if (!wd) return NULL;
4281 /* It makes no sense to insert before in an empty list with before != NULL, something really bad is happening in your app. */
4282 EINA_SAFETY_ON_NULL_RETURN_VAL(wd->items, NULL);
4284 Elm_Gen_Item *it = _item_new(wd, itc, data, (Elm_Gen_Item *) parent, type,
4286 if (!it) return NULL;
4289 if (it->group && _before->group)
4290 wd->group_items = eina_list_prepend_relative(wd->group_items, it,
4295 it->parent->item->items =
4296 eina_list_prepend_relative(it->parent->item->items, it, _before);
4298 wd->items = eina_inlist_prepend_relative(wd->items, EINA_INLIST_GET(it),
4299 EINA_INLIST_GET(_before));
4300 it->item->rel = _before;
4301 it->item->rel->relcount++;
4302 it->item->before = EINA_TRUE;
4303 _item_queue(wd, it, NULL);
4304 return (Elm_Object_Item *)it;
4307 EAPI Elm_Object_Item *
4308 elm_genlist_item_sorted_insert(Evas_Object *obj,
4309 const Elm_Genlist_Item_Class *itc,
4311 Elm_Object_Item *parent,
4312 Elm_Genlist_Item_Type type,
4313 Eina_Compare_Cb comp,
4315 const void *func_data)
4317 ELM_CHECK_WIDTYPE(obj, widtype) NULL;
4318 Widget_Data *wd = elm_widget_data_get(obj);
4319 if (!wd) return NULL;
4320 Elm_Gen_Item *rel = NULL;
4321 Elm_Gen_Item *it = _item_new(wd, itc, data, (Elm_Gen_Item *) parent, type,
4323 if (!it) return NULL;
4325 wd->item_compare_cb = comp;
4332 l = eina_list_search_sorted_near_list(it->parent->item->items,
4333 _elm_genlist_item_list_compare,
4337 rel = eina_list_data_get(l);
4341 if (cmp_result >= 0)
4343 it->parent->item->items = eina_list_prepend_relative_list(it->parent->item->items, it, l);
4344 wd->items = eina_inlist_prepend_relative(wd->items, EINA_INLIST_GET(it), EINA_INLIST_GET(rel));
4345 it->item->before = EINA_FALSE;
4347 else if (cmp_result < 0)
4349 it->parent->item->items = eina_list_append_relative_list(it->parent->item->items, it, l);
4350 wd->items = eina_inlist_append_relative(wd->items, EINA_INLIST_GET(it), EINA_INLIST_GET(rel));
4351 it->item->before = EINA_TRUE;
4358 wd->state = eina_inlist_sorted_state_new();
4359 eina_inlist_sorted_state_init(wd->state, wd->items);
4360 wd->requeued = EINA_FALSE;
4364 wd->group_items = eina_list_append(wd->group_items, it);
4366 wd->items = eina_inlist_sorted_state_insert(wd->items, EINA_INLIST_GET(it),
4367 _elm_genlist_item_compare, wd->state);
4369 if (EINA_INLIST_GET(it)->next)
4371 rel = ELM_GEN_ITEM_FROM_INLIST(EINA_INLIST_GET(it)->next);
4372 it->item->before = EINA_TRUE;
4374 else if (EINA_INLIST_GET(it)->prev)
4376 rel = ELM_GEN_ITEM_FROM_INLIST(EINA_INLIST_GET(it)->prev);
4377 it->item->before = EINA_FALSE;
4383 it->item->rel = rel;
4384 it->item->rel->relcount++;
4387 _item_queue(wd, it, _elm_genlist_item_list_compare);
4389 return (Elm_Object_Item *)it;
4393 _elm_genlist_clear(Evas_Object *obj, Eina_Bool standby)
4395 Eina_Inlist *next, *l;
4397 ELM_CHECK_WIDTYPE(obj, widtype);
4398 Widget_Data *wd = elm_widget_data_get(obj);
4401 if (!standby) wd->generation++;
4405 eina_inlist_sorted_state_free(wd->state);
4409 if (wd->walking > 0)
4411 wd->clear_me = EINA_TRUE;
4414 evas_event_freeze(evas_object_evas_get(wd->obj));
4415 for (l = wd->items, next = l ? l->next : NULL;
4417 l = next, next = next ? next->next : NULL)
4419 Elm_Gen_Item *it = ELM_GEN_ITEM_FROM_INLIST(l);
4421 if (it->generation < wd->generation)
4423 Elm_Gen_Item *itn = NULL;
4425 if (next) itn = ELM_GEN_ITEM_FROM_INLIST(next);
4426 if (itn) itn->walking++; /* prevent early death of subitem */
4428 elm_widget_item_free(it);
4429 if (itn) itn->walking--;
4432 wd->clear_me = EINA_FALSE;
4433 wd->pan_changed = EINA_TRUE;
4436 ecore_job_del(wd->calc_job);
4437 wd->calc_job = NULL;
4439 if (wd->selected) wd->selected = eina_list_free(wd->selected);
4440 if (wd->clear_cb) wd->clear_cb(wd);
4446 if (wd->alpha_bg) evas_object_del(wd->alpha_bg);
4447 wd->alpha_bg = NULL;
4451 evas_object_size_hint_min_set(wd->pan_smart, wd->minw, wd->minh);
4452 evas_object_smart_callback_call(wd->pan_smart, "changed", NULL);
4454 if (wd->sizing_cb) wd->sizing_cb(wd->obj);
4455 elm_smart_scroller_child_region_show(wd->scr, 0, 0, 0, 0);
4456 evas_event_thaw(evas_object_evas_get(wd->obj));
4457 evas_event_thaw_eval(evas_object_evas_get(wd->obj));
4461 elm_genlist_clear(Evas_Object *obj)
4463 _elm_genlist_clear(obj, EINA_FALSE);
4467 elm_genlist_multi_select_set(Evas_Object *obj,
4470 ELM_CHECK_WIDTYPE(obj, widtype);
4471 Widget_Data *wd = elm_widget_data_get(obj);
4473 wd->multi = !!multi;
4477 elm_genlist_multi_select_get(const Evas_Object *obj)
4479 ELM_CHECK_WIDTYPE(obj, widtype) EINA_FALSE;
4480 Widget_Data *wd = elm_widget_data_get(obj);
4481 if (!wd) return EINA_FALSE;
4485 EAPI Elm_Object_Item *
4486 elm_genlist_selected_item_get(const Evas_Object *obj)
4488 ELM_CHECK_WIDTYPE(obj, widtype) NULL;
4489 Widget_Data *wd = elm_widget_data_get(obj);
4490 if (!wd) return NULL;
4491 if (wd->selected) return wd->selected->data;
4495 EAPI const Eina_List *
4496 elm_genlist_selected_items_get(const Evas_Object *obj)
4498 ELM_CHECK_WIDTYPE(obj, widtype) NULL;
4499 Widget_Data *wd = elm_widget_data_get(obj);
4500 if (!wd) return NULL;
4501 return wd->selected;
4505 elm_genlist_realized_items_get(const Evas_Object *obj)
4507 ELM_CHECK_WIDTYPE(obj, widtype) NULL;
4508 Widget_Data *wd = elm_widget_data_get(obj);
4509 Eina_List *list = NULL;
4511 Eina_Bool done = EINA_FALSE;
4512 if (!wd) return NULL;
4513 EINA_INLIST_FOREACH(wd->blocks, itb)
4521 EINA_LIST_FOREACH(itb->items, l, it)
4523 if (it->realized) list = eina_list_append(list, it);
4534 EAPI Elm_Object_Item *
4535 elm_genlist_at_xy_item_get(const Evas_Object *obj,
4540 ELM_CHECK_WIDTYPE(obj, widtype) NULL;
4541 Widget_Data *wd = elm_widget_data_get(obj);
4542 Evas_Coord ox, oy, ow, oh;
4545 if (!wd) return NULL;
4546 evas_object_geometry_get(wd->pan_smart, &ox, &oy, &ow, &oh);
4548 EINA_INLIST_FOREACH(wd->blocks, itb)
4553 if (!ELM_RECTS_INTERSECT(ox + itb->x - itb->wd->pan_x,
4554 oy + itb->y - itb->wd->pan_y,
4555 itb->w, itb->h, x, y, 1, 1))
4557 EINA_LIST_FOREACH(itb->items, l, it)
4559 Evas_Coord itx, ity;
4561 itx = ox + itb->x + it->x - itb->wd->pan_x;
4562 ity = oy + itb->y + it->y - itb->wd->pan_y;
4563 if (ELM_RECTS_INTERSECT(itx, ity, it->item->w, it->item->h, x, y, 1, 1))
4567 if (y <= (ity + (it->item->h / 4))) *posret = -1;
4568 else if (y >= (ity + it->item->h - (it->item->h / 4)))
4572 return (Elm_Object_Item *)it;
4574 lasty = ity + it->item->h;
4579 if (y > lasty) *posret = 1;
4585 EAPI Elm_Object_Item *
4586 elm_genlist_first_item_get(const Evas_Object *obj)
4588 ELM_CHECK_WIDTYPE(obj, widtype) NULL;
4589 Widget_Data *wd = elm_widget_data_get(obj);
4590 if (!wd) return NULL;
4591 if (!wd->items) return NULL;
4592 Elm_Gen_Item *it = ELM_GEN_ITEM_FROM_INLIST(wd->items);
4593 while ((it) && (it->generation < wd->generation))
4594 it = ELM_GEN_ITEM_FROM_INLIST(EINA_INLIST_GET(it)->next);
4595 return (Elm_Object_Item *)it;
4598 EAPI Elm_Object_Item *
4599 elm_genlist_last_item_get(const Evas_Object *obj)
4601 ELM_CHECK_WIDTYPE(obj, widtype) NULL;
4602 Widget_Data *wd = elm_widget_data_get(obj);
4603 if (!wd) return NULL;
4604 if (!wd->items) return NULL;
4605 Elm_Gen_Item *it = ELM_GEN_ITEM_FROM_INLIST(wd->items->last);
4606 while ((it) && (it->generation < wd->generation))
4607 it = ELM_GEN_ITEM_FROM_INLIST(EINA_INLIST_GET(it)->prev);
4608 return (Elm_Object_Item *)it;
4611 EAPI Elm_Object_Item *
4612 elm_genlist_item_next_get(const Elm_Object_Item *it)
4614 ELM_OBJ_ITEM_CHECK_OR_RETURN(it, NULL);
4615 Elm_Gen_Item *_it = (Elm_Gen_Item *)it;
4618 _it = ELM_GEN_ITEM_FROM_INLIST(EINA_INLIST_GET(_it)->next);
4619 if ((_it) && (_it->generation == _it->wd->generation)) break;
4621 return (Elm_Object_Item *) _it;
4624 EAPI Elm_Object_Item *
4625 elm_genlist_item_prev_get(const Elm_Object_Item *it)
4627 ELM_OBJ_ITEM_CHECK_OR_RETURN(it, NULL);
4628 Elm_Gen_Item *_it = (Elm_Gen_Item *)it;
4631 _it = ELM_GEN_ITEM_FROM_INLIST(EINA_INLIST_GET(_it)->prev);
4632 if ((_it) && (_it->generation == _it->wd->generation)) break;
4634 return (Elm_Object_Item *) _it;
4637 EAPI Elm_Object_Item *
4638 elm_genlist_item_parent_get(const Elm_Object_Item *it)
4640 ELM_OBJ_ITEM_CHECK_OR_RETURN(it, NULL);
4641 return (Elm_Object_Item *) ((Elm_Gen_Item *)it)->parent;
4645 elm_genlist_item_subitems_clear(Elm_Object_Item *it)
4647 ELM_OBJ_ITEM_CHECK_OR_RETURN(it);
4648 Widget_Data *wd = elm_widget_data_get(WIDGET(it));
4650 Elm_Gen_Item *_it = (Elm_Gen_Item *) it;
4652 if (!wd->tree_effect_enabled || !wd->move_effect_mode)
4653 _item_subitems_clear(_it);
4656 if (!wd->item_moving_effect_timer)
4658 wd->expanded_item = _it;
4659 _item_tree_effect_before(_it);
4660 evas_object_raise(wd->alpha_bg);
4661 evas_object_show(wd->alpha_bg);
4662 wd->start_time = ecore_time_get();
4663 wd->item_moving_effect_timer = ecore_animator_add(_item_moving_effect_timer_cb, wd);
4666 _item_subitems_clear(_it);
4671 elm_genlist_item_selected_set(Elm_Object_Item *it,
4674 ELM_OBJ_ITEM_CHECK_OR_RETURN(it);
4675 Elm_Gen_Item *_it = (Elm_Gen_Item *)it;
4676 Widget_Data *wd = _it->wd;
4678 if ((_it->generation < wd->generation) || elm_widget_item_disabled_get(_it))
4680 selected = !!selected;
4681 if (_it->selected == selected) return;
4687 while (wd->selected)
4689 if (_it->unhighlight_cb) _it->unhighlight_cb(wd->selected->data);
4690 _it->unsel_cb(wd->selected->data);
4693 _it->highlight_cb(_it);
4697 if (_it->unhighlight_cb) _it->unhighlight_cb(_it);
4702 elm_genlist_item_selected_get(const Elm_Object_Item *it)
4704 ELM_OBJ_ITEM_CHECK_OR_RETURN(it, EINA_FALSE);
4705 return ((Elm_Gen_Item *)it)->selected;
4709 _elm_genlist_expanded_next_item_get(Elm_Gen_Item *it)
4712 if (it->item->expanded)
4714 it2 = (Elm_Gen_Item *) elm_genlist_item_next_get((Elm_Object_Item *) it);
4718 it2 = (Elm_Gen_Item *) elm_genlist_item_next_get((Elm_Object_Item *) it);
4721 if (it->item->expanded_depth >= it2->item->expanded_depth) break;
4722 it2 = (Elm_Gen_Item *) elm_genlist_item_next_get((Elm_Object_Item *) it2);
4729 _elm_genlist_move_items_set(Elm_Gen_Item *it)
4732 Elm_Gen_Item *it2 = NULL;
4733 Evas_Coord ox, oy, ow, oh, dh = 0;
4735 it->wd->expanded_next_item = _elm_genlist_expanded_next_item_get(it);
4737 if (it->item->expanded)
4739 it->wd->move_items = elm_genlist_realized_items_get(it->wd->obj);
4740 EINA_LIST_FOREACH(it->wd->move_items, l, it2)
4742 if (it2 == it->wd->expanded_next_item) break;
4743 it->wd->move_items = eina_list_remove(it->wd->move_items, it2);
4748 evas_object_geometry_get(it->wd->pan_smart, &ox, &oy, &ow, &oh);
4749 it2 = it->wd->expanded_next_item;
4750 while (it2 && (dh < oy + oh))
4753 it->wd->move_items = eina_list_append(it->wd->move_items, it2);
4754 it2 = (Elm_Gen_Item *) elm_genlist_item_next_get((Elm_Object_Item *) it2);
4760 elm_genlist_item_expanded_set(Elm_Object_Item *it,
4763 ELM_OBJ_ITEM_CHECK_OR_RETURN(it);
4764 Elm_Gen_Item *_it = (Elm_Gen_Item *)it;
4765 expanded = !!expanded;
4766 if (_it->item->expanded == expanded) return;
4767 _it->item->expanded = expanded;
4768 _it->wd->expanded_item = _it;
4769 _elm_genlist_move_items_set(_it);
4771 if (_it->wd->tree_effect_enabled && !_it->wd->alpha_bg)
4772 _it->wd->alpha_bg = _create_tray_alpha_bg(WIDGET(_it));
4774 if (_it->item->expanded)
4776 _it->wd->move_effect_mode = ELM_GENLIST_ITEM_MOVE_EFFECT_EXPAND;
4778 edje_object_signal_emit(VIEW(_it), "elm,state,expanded", "elm");
4779 evas_object_smart_callback_call(WIDGET(_it), SIG_EXPANDED, _it);
4780 _it->wd->auto_scroll_enabled = EINA_TRUE;
4784 _it->wd->move_effect_mode = ELM_GENLIST_ITEM_MOVE_EFFECT_CONTRACT;
4786 edje_object_signal_emit(VIEW(_it), "elm,state,contracted", "elm");
4787 evas_object_smart_callback_call(WIDGET(_it), SIG_CONTRACTED, _it);
4788 _it->wd->auto_scroll_enabled = EINA_FALSE;
4793 elm_genlist_item_expanded_get(const Elm_Object_Item *it)
4795 ELM_OBJ_ITEM_CHECK_OR_RETURN(it, EINA_FALSE);
4796 return ((Elm_Gen_Item *)it)->item->expanded;
4800 elm_genlist_item_expanded_depth_get(const Elm_Object_Item *it)
4802 ELM_OBJ_ITEM_CHECK_OR_RETURN(it, 0);
4803 return ((Elm_Gen_Item *)it)->item->expanded_depth;
4807 elm_genlist_item_display_only_set(Elm_Object_Item *it,
4808 Eina_Bool display_only)
4810 ELM_OBJ_ITEM_CHECK_OR_RETURN(it);
4811 Elm_Gen_Item *_it = (Elm_Gen_Item *)it;
4812 display_only = !!display_only;
4813 if (_it->display_only == display_only) return;
4814 if (_it->generation < _it->wd->generation) return;
4815 _it->display_only = display_only;
4816 _it->item->mincalcd = EINA_FALSE;
4817 _it->item->updateme = EINA_TRUE;
4818 if (_it->item->block) _it->item->block->updateme = EINA_TRUE;
4819 if (_it->wd->update_job) ecore_job_del(_it->wd->update_job);
4820 _it->wd->update_job = ecore_job_add(_update_job, _it->wd);
4824 elm_genlist_item_display_only_get(const Elm_Object_Item *it)
4826 ELM_OBJ_ITEM_CHECK_OR_RETURN(it, EINA_FALSE);
4827 Elm_Gen_Item *_it = (Elm_Gen_Item *)it;
4828 if (_it->generation < _it->wd->generation) return EINA_FALSE;
4829 return _it->display_only;
4832 static Eina_Bool _elm_genlist_item_compute_coordinates(
4833 Elm_Object_Item *it,
4834 Elm_Genlist_Item_Scrollto_Type type,
4840 Elm_Gen_Item *_it = (Elm_Gen_Item *)it;
4841 Evas_Coord gith = 0;
4842 if (_it->generation < _it->wd->generation) return EINA_FALSE;
4843 if ((_it->item->queued) || (!_it->item->mincalcd))
4845 _it->wd->show_item = _it;
4846 _it->wd->bring_in = EINA_FALSE;
4847 _it->wd->scrollto_type = type;
4848 _it->item->showme = EINA_TRUE;
4851 if (_it->wd->show_item)
4853 _it->wd->show_item->item->showme = EINA_FALSE;
4854 _it->wd->show_item = NULL;
4857 evas_object_geometry_get(_it->wd->pan_smart, NULL, NULL, w, h);
4858 if (type==ELM_GENLIST_ITEM_SCROLLTO_IN)
4860 if ((_it->item->group_item) &&
4861 (_it->wd->pan_y > (_it->y + _it->item->block->y)))
4862 gith = _it->item->group_item->item->h;
4865 *y = _it->y + _it->item->block->y - gith;
4867 else if (type==ELM_GENLIST_ITEM_SCROLLTO_TOP)
4869 if (_it->item->group_item) gith = _it->item->group_item->item->h;
4870 *y = _it->y + _it->item->block->y - gith;
4872 else if (type==ELM_GENLIST_ITEM_SCROLLTO_MIDDLE)
4874 *y = _it->y + _it->item->block->y - *h / 2 + _it->item->h / 2;
4879 *x = _it->x + _it->item->block->x;
4880 *w = _it->item->block->w;
4885 elm_genlist_item_promote(Elm_Object_Item *it)
4887 ELM_OBJ_ITEM_CHECK_OR_RETURN(it);
4888 Elm_Gen_Item *_it = (Elm_Gen_Item *)it;
4889 if (_it->generation < _it->wd->generation) return;
4890 _item_move_before(_it,
4891 (Elm_Gen_Item *) elm_genlist_first_item_get(WIDGET(_it)));
4895 elm_genlist_item_demote(Elm_Object_Item *it)
4897 ELM_OBJ_ITEM_CHECK_OR_RETURN(it);
4898 Elm_Gen_Item *_it = (Elm_Gen_Item *)it;
4899 if (_it->generation < _it->wd->generation) return;
4900 _item_move_after(_it,
4901 (Elm_Gen_Item *) elm_genlist_last_item_get(WIDGET(_it)));
4905 elm_genlist_item_show(Elm_Object_Item *it, Elm_Genlist_Item_Scrollto_Type type)
4907 ELM_OBJ_ITEM_CHECK_OR_RETURN(it);
4908 Evas_Coord x, y, w, h;
4909 Elm_Gen_Item *_it = (Elm_Gen_Item *)it;
4911 if (_elm_genlist_item_compute_coordinates(it, type, &x, &y, &w, &h))
4912 elm_smart_scroller_child_region_show(_it->wd->scr, x, y, w, h);
4916 elm_genlist_item_bring_in(Elm_Object_Item *it, Elm_Genlist_Item_Scrollto_Type type)
4919 ELM_OBJ_ITEM_CHECK_OR_RETURN(it);
4920 Evas_Coord x, y, w, h;
4921 Elm_Gen_Item *_it = (Elm_Gen_Item *)it;
4923 if (_elm_genlist_item_compute_coordinates(it, type, &x, &y, &w, &h))
4924 elm_smart_scroller_region_bring_in(_it->wd->scr,x, y, w, h);
4927 EINA_DEPRECATED EAPI void
4928 elm_genlist_item_top_show(Elm_Object_Item *it)
4930 elm_genlist_item_show(it, ELM_GENLIST_ITEM_SCROLLTO_TOP);
4933 EINA_DEPRECATED EAPI void
4934 elm_genlist_item_top_bring_in(Elm_Object_Item *it)
4936 elm_genlist_item_bring_in(it, ELM_GENLIST_ITEM_SCROLLTO_TOP);
4939 EINA_DEPRECATED EAPI void
4940 elm_genlist_item_middle_show(Elm_Object_Item *it)
4942 elm_genlist_item_show(it, ELM_GENLIST_ITEM_SCROLLTO_MIDDLE);
4945 EINA_DEPRECATED EAPI void
4946 elm_genlist_item_middle_bring_in(Elm_Object_Item *it)
4948 elm_genlist_item_bring_in(it, ELM_GENLIST_ITEM_SCROLLTO_MIDDLE);
4951 EINA_DEPRECATED EAPI void
4952 elm_genlist_item_contents_orphan(Elm_Object_Item *it)
4954 elm_genlist_item_all_contents_unset(it, NULL);
4958 elm_genlist_item_all_contents_unset(Elm_Object_Item *it, Eina_List **l)
4960 ELM_OBJ_ITEM_CHECK_OR_RETURN(it);
4962 Evas_Object *content;
4963 EINA_LIST_FREE(((Elm_Gen_Item *)it)->content_objs, content)
4965 elm_widget_sub_object_del(WIDGET(it), content);
4966 evas_object_smart_member_del(content);
4967 evas_object_hide(content);
4969 *l = eina_list_append(*l, content);
4973 EINA_DEPRECATED EAPI const Evas_Object *
4974 elm_genlist_item_object_get(const Elm_Object_Item *it)
4976 ELM_OBJ_ITEM_CHECK_OR_RETURN(it, NULL);
4981 elm_genlist_item_update(Elm_Object_Item *it)
4983 ELM_OBJ_ITEM_CHECK_OR_RETURN(it);
4984 Elm_Gen_Item *_it = (Elm_Gen_Item *)it;
4986 if (!_it->item->block) return;
4987 if (_it->generation < _it->wd->generation) return;
4988 _it->item->mincalcd = EINA_FALSE;
4989 _it->item->updateme = EINA_TRUE;
4990 _it->item->block->updateme = EINA_TRUE;
4991 if (_it->wd->update_job) ecore_job_del(_it->wd->update_job);
4992 _it->wd->update_job = ecore_job_add(_update_job, _it->wd);
4996 elm_genlist_item_fields_update(Elm_Object_Item *it,
4998 Elm_Genlist_Item_Field_Type itf)
5000 ELM_OBJ_ITEM_CHECK_OR_RETURN(it);
5001 Elm_Gen_Item *_it = (Elm_Gen_Item *)it;
5003 if (!_it->item->block) return;
5004 if (_it->generation < _it->wd->generation) return;
5006 if ((!itf) || (itf & ELM_GENLIST_ITEM_FIELD_TEXT))
5007 _item_text_realize(_it, VIEW(_it), &_it->texts, parts);
5008 if ((!itf) || (itf & ELM_GENLIST_ITEM_FIELD_CONTENT))
5010 _it->content_objs = _item_content_unrealize(_it, VIEW(_it),
5011 &_it->contents, parts);
5012 _it->content_objs = _item_content_realize(_it, VIEW(_it),
5013 &_it->contents, parts);
5015 if ((!itf) || (itf & ELM_GENLIST_ITEM_FIELD_STATE))
5016 _item_state_realize(_it, VIEW(_it), &_it->states, parts);
5020 elm_genlist_item_item_class_update(Elm_Object_Item *it,
5021 const Elm_Genlist_Item_Class *itc)
5023 ELM_OBJ_ITEM_CHECK_OR_RETURN(it);
5024 Elm_Gen_Item *_it = (Elm_Gen_Item *)it;
5026 if (!_it->item->block) return;
5027 EINA_SAFETY_ON_NULL_RETURN(itc);
5028 if (_it->generation < _it->wd->generation) return;
5030 _it->item->nocache_once = EINA_TRUE;
5031 elm_genlist_item_update(it);
5034 EAPI const Elm_Genlist_Item_Class *
5035 elm_genlist_item_item_class_get(const Elm_Object_Item *it)
5037 ELM_OBJ_ITEM_CHECK_OR_RETURN(it, NULL);
5038 Elm_Gen_Item *_it = (Elm_Gen_Item *)it;
5039 if (_it->generation < _it->wd->generation) return NULL;
5043 static Evas_Object *
5044 _elm_genlist_item_label_create(void *data,
5045 Evas_Object *obj __UNUSED__,
5046 Evas_Object *tooltip,
5047 void *it __UNUSED__)
5049 Evas_Object *label = elm_label_add(tooltip);
5052 elm_object_style_set(label, "tooltip");
5053 elm_object_text_set(label, data);
5058 _elm_genlist_item_label_del_cb(void *data,
5059 Evas_Object *obj __UNUSED__,
5060 void *event_info __UNUSED__)
5062 eina_stringshare_del(data);
5066 elm_genlist_item_tooltip_text_set(Elm_Object_Item *it,
5069 ELM_OBJ_ITEM_CHECK_OR_RETURN(it);
5070 text = eina_stringshare_add(text);
5071 elm_genlist_item_tooltip_content_cb_set(it, _elm_genlist_item_label_create,
5073 _elm_genlist_item_label_del_cb);
5077 elm_genlist_item_tooltip_content_cb_set(Elm_Object_Item *it,
5078 Elm_Tooltip_Item_Content_Cb func,
5080 Evas_Smart_Cb del_cb)
5082 ELM_OBJ_ITEM_CHECK_OR_GOTO(it, error);
5083 Elm_Gen_Item *_it = (Elm_Gen_Item *)it;
5085 if ((_it->tooltip.content_cb == func) && (_it->tooltip.data == data))
5088 if (_it->tooltip.del_cb)
5089 _it->tooltip.del_cb((void *) _it->tooltip.data, WIDGET(it), it);
5091 _it->tooltip.content_cb = func;
5092 _it->tooltip.data = data;
5093 _it->tooltip.del_cb = del_cb;
5097 elm_widget_item_tooltip_content_cb_set(_it,
5098 _it->tooltip.content_cb,
5099 _it->tooltip.data, NULL);
5100 elm_widget_item_tooltip_style_set(_it, _it->tooltip.style);
5101 elm_widget_item_tooltip_window_mode_set(_it, _it->tooltip.free_size);
5107 if (del_cb) del_cb((void *)data, NULL, NULL);
5111 elm_genlist_item_tooltip_unset(Elm_Object_Item *it)
5113 ELM_OBJ_ITEM_CHECK_OR_RETURN(it);
5114 Elm_Gen_Item *_it = (Elm_Gen_Item *)it;
5116 if ((VIEW(_it)) && (_it->tooltip.content_cb))
5117 elm_widget_item_tooltip_unset(_it);
5119 if (_it->tooltip.del_cb)
5120 _it->tooltip.del_cb((void *) _it->tooltip.data, WIDGET(_it), _it);
5121 _it->tooltip.del_cb = NULL;
5122 _it->tooltip.content_cb = NULL;
5123 _it->tooltip.data = NULL;
5124 _it->tooltip.free_size = EINA_FALSE;
5125 if (_it->tooltip.style)
5126 elm_genlist_item_tooltip_style_set(it, NULL);
5130 elm_genlist_item_tooltip_style_set(Elm_Object_Item *it,
5133 ELM_OBJ_ITEM_CHECK_OR_RETURN(it);
5134 Elm_Gen_Item *_it = (Elm_Gen_Item *)it;
5136 eina_stringshare_replace(&_it->tooltip.style, style);
5137 if (VIEW(_it)) elm_widget_item_tooltip_style_set(_it, style);
5141 elm_genlist_item_tooltip_style_get(const Elm_Object_Item *it)
5143 return elm_object_item_tooltip_style_get(it);
5147 elm_genlist_item_tooltip_window_mode_set(Elm_Object_Item *it,
5150 ELM_OBJ_ITEM_CHECK_OR_RETURN(it, EINA_FALSE);
5151 Elm_Gen_Item *_it = (Elm_Gen_Item *)it;
5153 _it->tooltip.free_size = disable;
5154 if (VIEW(_it)) return elm_widget_item_tooltip_window_mode_set(_it, disable);
5159 elm_genlist_item_tooltip_window_mode_get(const Elm_Object_Item *it)
5161 return elm_object_tooltip_window_mode_get(VIEW(it));
5165 elm_genlist_item_cursor_set(Elm_Object_Item *it,
5168 ELM_OBJ_ITEM_CHECK_OR_RETURN(it);
5169 Elm_Gen_Item *_it = (Elm_Gen_Item *)it;
5170 eina_stringshare_replace(&_it->mouse_cursor, cursor);
5171 if (VIEW(_it)) elm_widget_item_cursor_set(_it, cursor);
5175 elm_genlist_item_cursor_get(const Elm_Object_Item *it)
5177 return elm_widget_item_cursor_get(it);
5181 elm_genlist_item_cursor_unset(Elm_Object_Item *it)
5183 ELM_OBJ_ITEM_CHECK_OR_RETURN(it);
5184 Elm_Gen_Item *_it = (Elm_Gen_Item *)it;
5186 if (!_it->mouse_cursor) return;
5188 if (VIEW(_it)) elm_widget_item_cursor_unset(_it);
5190 eina_stringshare_del(_it->mouse_cursor);
5191 _it->mouse_cursor = NULL;
5195 elm_genlist_item_cursor_style_set(Elm_Object_Item *it,
5198 elm_widget_item_cursor_style_set(it, style);
5202 elm_genlist_item_cursor_style_get(const Elm_Object_Item *it)
5204 return elm_widget_item_cursor_style_get(it);
5208 elm_genlist_item_cursor_engine_only_set(Elm_Object_Item *it,
5209 Eina_Bool engine_only)
5211 elm_widget_item_cursor_engine_only_set(it, engine_only);
5215 elm_genlist_item_cursor_engine_only_get(const Elm_Object_Item *it)
5217 return elm_widget_item_cursor_engine_only_get(it);
5221 elm_genlist_item_index_get(const Elm_Object_Item *it)
5223 ELM_OBJ_ITEM_CHECK_OR_RETURN(it, -1);
5224 Elm_Gen_Item *_it = (Elm_Gen_Item *)it;
5226 if (_it->item->block)
5227 return _it->position + _it->item->block->position;
5232 elm_genlist_mode_set(Evas_Object *obj,
5235 ELM_CHECK_WIDTYPE(obj, widtype);
5236 Widget_Data *wd = elm_widget_data_get(obj);
5238 if (wd->mode == mode) return;
5245 elm_genlist_mode_get(const Evas_Object *obj)
5247 ELM_CHECK_WIDTYPE(obj, widtype) ELM_LIST_LAST;
5248 Widget_Data *wd = elm_widget_data_get(obj);
5249 if (!wd) return ELM_LIST_LAST;
5253 EINA_DEPRECATED EAPI void
5254 elm_genlist_always_select_mode_set(Evas_Object *obj,
5255 Eina_Bool always_select)
5257 ELM_CHECK_WIDTYPE(obj, widtype);
5258 Widget_Data *wd = elm_widget_data_get(obj);
5261 elm_genlist_select_mode_set(obj, ELM_OBJECT_ALWAYS_SELECT);
5264 Elm_Object_Select_Mode_Type oldmode = elm_genlist_select_mode_get(obj);
5265 if (oldmode == ELM_OBJECT_ALWAYS_SELECT)
5266 elm_genlist_select_mode_set(obj, ELM_OBJECT_NORMAL_SELECT);
5270 EINA_DEPRECATED EAPI Eina_Bool
5271 elm_genlist_always_select_mode_get(const Evas_Object *obj)
5273 ELM_CHECK_WIDTYPE(obj, widtype) EINA_FALSE;
5274 Widget_Data *wd = elm_widget_data_get(obj);
5275 if (!wd) return EINA_FALSE;
5276 Elm_Object_Select_Mode_Type oldmode = elm_genlist_select_mode_get(obj);
5277 if (oldmode == ELM_OBJECT_ALWAYS_SELECT)
5283 EINA_DEPRECATED EAPI void
5284 elm_genlist_no_select_mode_set(Evas_Object *obj,
5285 Eina_Bool no_select)
5287 ELM_CHECK_WIDTYPE(obj, widtype);
5288 Widget_Data *wd = elm_widget_data_get(obj);
5291 elm_genlist_select_mode_set(obj, ELM_OBJECT_NO_SELECT);
5294 Elm_Object_Select_Mode_Type oldmode = elm_genlist_select_mode_get(obj);
5295 if (oldmode == ELM_OBJECT_NO_SELECT)
5296 elm_genlist_select_mode_set(obj, ELM_OBJECT_NORMAL_SELECT);
5300 EINA_DEPRECATED EAPI Eina_Bool
5301 elm_genlist_no_select_mode_get(const Evas_Object *obj)
5303 ELM_CHECK_WIDTYPE(obj, widtype) EINA_FALSE;
5304 Widget_Data *wd = elm_widget_data_get(obj);
5305 if (!wd) return EINA_FALSE;
5306 Elm_Object_Select_Mode_Type oldmode = elm_genlist_select_mode_get(obj);
5307 if (oldmode == ELM_OBJECT_NO_SELECT)
5314 elm_genlist_compress_mode_set(Evas_Object *obj,
5317 ELM_CHECK_WIDTYPE(obj, widtype);
5318 Widget_Data *wd = elm_widget_data_get(obj);
5320 wd->compress = !!compress;
5321 if (!compress) elm_genlist_homogeneous_set(obj, EINA_FALSE);
5325 elm_genlist_compress_mode_get(const Evas_Object *obj)
5327 ELM_CHECK_WIDTYPE(obj, widtype) EINA_FALSE;
5328 Widget_Data *wd = elm_widget_data_get(obj);
5329 if (!wd) return EINA_FALSE;
5330 return wd->compress;
5334 elm_genlist_height_for_width_mode_set(Evas_Object *obj,
5335 Eina_Bool height_for_width)
5337 ELM_CHECK_WIDTYPE(obj, widtype);
5338 Widget_Data *wd = elm_widget_data_get(obj);
5340 wd->height_for_width = !!height_for_width;
5341 if (wd->height_for_width)
5343 elm_genlist_homogeneous_set(obj, EINA_FALSE);
5344 elm_genlist_compress_mode_set(obj, EINA_TRUE);
5349 elm_genlist_height_for_width_mode_get(const Evas_Object *obj)
5351 ELM_CHECK_WIDTYPE(obj, widtype) EINA_FALSE;
5352 Widget_Data *wd = elm_widget_data_get(obj);
5353 if (!wd) return EINA_FALSE;
5354 return wd->height_for_width;
5358 elm_genlist_bounce_set(Evas_Object *obj,
5362 ELM_CHECK_WIDTYPE(obj, widtype);
5363 Widget_Data *wd = elm_widget_data_get(obj);
5365 wd->h_bounce = !!h_bounce;
5366 wd->v_bounce = !!v_bounce;
5367 elm_smart_scroller_bounce_allow_set(wd->scr, wd->h_bounce, wd->v_bounce);
5371 elm_genlist_bounce_get(const Evas_Object *obj,
5372 Eina_Bool *h_bounce,
5373 Eina_Bool *v_bounce)
5375 ELM_CHECK_WIDTYPE(obj, widtype);
5376 Widget_Data *wd = elm_widget_data_get(obj);
5378 if (h_bounce) *h_bounce = wd->h_bounce;
5379 if (v_bounce) *v_bounce = wd->v_bounce;
5383 elm_genlist_homogeneous_set(Evas_Object *obj,
5384 Eina_Bool homogeneous)
5386 ELM_CHECK_WIDTYPE(obj, widtype);
5387 Widget_Data *wd = elm_widget_data_get(obj);
5389 if (homogeneous) elm_genlist_compress_mode_set(obj, EINA_TRUE);
5390 wd->homogeneous = !!homogeneous;
5394 elm_genlist_homogeneous_get(const Evas_Object *obj)
5396 ELM_CHECK_WIDTYPE(obj, widtype) EINA_FALSE;
5397 Widget_Data *wd = elm_widget_data_get(obj);
5398 if (!wd) return EINA_FALSE;
5399 return wd->homogeneous;
5403 elm_genlist_block_count_set(Evas_Object *obj,
5406 ELM_CHECK_WIDTYPE(obj, widtype);
5407 Widget_Data *wd = elm_widget_data_get(obj);
5409 wd->max_items_per_block = count;
5410 wd->item_cache_max = wd->max_items_per_block * 2;
5411 _item_cache_clean(wd);
5415 elm_genlist_block_count_get(const Evas_Object *obj)
5417 ELM_CHECK_WIDTYPE(obj, widtype) 0;
5418 Widget_Data *wd = elm_widget_data_get(obj);
5420 return wd->max_items_per_block;
5424 elm_genlist_longpress_timeout_set(Evas_Object *obj,
5427 ELM_CHECK_WIDTYPE(obj, widtype);
5428 Widget_Data *wd = elm_widget_data_get(obj);
5430 wd->longpress_timeout = timeout;
5434 elm_genlist_longpress_timeout_get(const Evas_Object *obj)
5436 ELM_CHECK_WIDTYPE(obj, widtype) 0;
5437 Widget_Data *wd = elm_widget_data_get(obj);
5439 return wd->longpress_timeout;
5443 elm_genlist_scroller_policy_set(Evas_Object *obj,
5444 Elm_Scroller_Policy policy_h,
5445 Elm_Scroller_Policy policy_v)
5447 ELM_CHECK_WIDTYPE(obj, widtype);
5448 Widget_Data *wd = elm_widget_data_get(obj);
5449 if ((!wd) || (!wd->scr)) return;
5450 if ((policy_h >= ELM_SCROLLER_POLICY_LAST) ||
5451 (policy_v >= ELM_SCROLLER_POLICY_LAST))
5453 elm_smart_scroller_policy_set(wd->scr, policy_h, policy_v);
5457 elm_genlist_scroller_policy_get(const Evas_Object *obj,
5458 Elm_Scroller_Policy *policy_h,
5459 Elm_Scroller_Policy *policy_v)
5461 ELM_CHECK_WIDTYPE(obj, widtype);
5462 Widget_Data *wd = elm_widget_data_get(obj);
5463 Elm_Smart_Scroller_Policy s_policy_h, s_policy_v;
5464 if ((!wd) || (!wd->scr)) return;
5465 elm_smart_scroller_policy_get(wd->scr, &s_policy_h, &s_policy_v);
5466 if (policy_h) *policy_h = (Elm_Scroller_Policy)s_policy_h;
5467 if (policy_v) *policy_v = (Elm_Scroller_Policy)s_policy_v;
5471 elm_genlist_realized_items_update(Evas_Object *obj)
5473 ELM_CHECK_WIDTYPE(obj, widtype);
5475 Eina_List *list, *l;
5476 Elm_Object_Item *it;
5478 list = elm_genlist_realized_items_get(obj);
5479 EINA_LIST_FOREACH(list, l, it)
5480 elm_genlist_item_update(it);
5484 elm_genlist_item_mode_set(Elm_Object_Item *it,
5485 const char *mode_type,
5488 ELM_OBJ_ITEM_CHECK_OR_RETURN(it);
5489 Elm_Gen_Item *_it = (Elm_Gen_Item *)it;
5491 Widget_Data *wd = _it->wd;
5493 Elm_Object_Item *it2;
5496 if (!mode_type) return;
5497 if ((_it->generation < _it->wd->generation) ||
5498 elm_widget_item_disabled_get(_it)) return;
5499 if (wd->edit_mode) return;
5501 if ((wd->mode_item == _it) &&
5502 (!strcmp(mode_type, wd->mode_type)) &&
5505 if (!_it->itc->mode_item_style) return;
5506 _it->mode_set = mode_set;
5510 EINA_LIST_FOREACH(wd->selected, l, it2)
5511 if (((Elm_Gen_Item *)it2)->realized)
5512 elm_genlist_item_selected_set(it2, EINA_FALSE);
5516 it2 = elm_genlist_selected_item_get(wd->obj);
5517 if ((it2) && (((Elm_Gen_Item *)it2)->realized))
5518 elm_genlist_item_selected_set(it2, EINA_FALSE);
5521 if (((wd->mode_type) && (strcmp(mode_type, wd->mode_type))) ||
5523 ((_it == wd->mode_item) && (!mode_set)))
5524 _item_mode_unset(wd);
5526 eina_stringshare_replace(&wd->mode_type, mode_type);
5527 if (mode_set) _item_mode_set(_it);
5531 elm_genlist_mode_type_get(const Evas_Object *obj)
5533 ELM_CHECK_WIDTYPE(obj, widtype) NULL;
5534 Widget_Data *wd = elm_widget_data_get(obj);
5535 if (!wd) return NULL;
5536 return wd->mode_type;
5539 EAPI const Elm_Object_Item *
5540 elm_genlist_mode_item_get(const Evas_Object *obj)
5542 ELM_CHECK_WIDTYPE(obj, widtype) NULL;
5543 Widget_Data *wd = elm_widget_data_get(obj);
5544 if (!wd) return NULL;
5545 return (Elm_Object_Item *) wd->mode_item;
5549 elm_genlist_edit_mode_get(const Evas_Object *obj)
5551 ELM_CHECK_WIDTYPE(obj, widtype) EINA_FALSE;
5552 Widget_Data *wd = elm_widget_data_get(obj);
5553 if (!wd) return EINA_FALSE;
5555 return wd->edit_mode;
5559 elm_genlist_edit_mode_set(Evas_Object *obj, Eina_Bool edit_mode)
5561 ELM_CHECK_WIDTYPE(obj, widtype);
5562 Eina_List *list, *l;
5565 Widget_Data *wd = elm_widget_data_get(obj);
5567 edit_mode = !!edit_mode;
5568 if (wd->edit_mode == edit_mode) return;
5569 wd->edit_mode = edit_mode;
5571 list = elm_genlist_realized_items_get(obj);
5574 EINA_LIST_FOREACH(list, l, it)
5576 if (it->item->type != ELM_GENLIST_ITEM_GROUP)
5577 _edit_mode_item_unrealize(it);
5579 _item_cache_zero(wd);
5583 EINA_LIST_FOREACH(list, l, it)
5585 if (it->item->type != ELM_GENLIST_ITEM_GROUP)
5587 if (it->selected) _item_unselect(it);
5588 if (it->itc->edit_item_style)
5589 _edit_mode_item_realize(it, EINA_TRUE);
5593 if (wd->calc_job) ecore_job_del(wd->calc_job);
5594 wd->calc_job = ecore_job_add(_calc_job, wd);
5598 elm_genlist_reorder_mode_set(Evas_Object *obj,
5599 Eina_Bool reorder_mode)
5601 ELM_CHECK_WIDTYPE(obj, widtype);
5602 Widget_Data *wd = elm_widget_data_get(obj);
5604 wd->reorder_mode = !!reorder_mode;
5608 elm_genlist_reorder_mode_get(const Evas_Object *obj)
5610 ELM_CHECK_WIDTYPE(obj, widtype) EINA_FALSE;
5611 Widget_Data *wd = elm_widget_data_get(obj);
5612 if (!wd) return EINA_FALSE;
5613 return wd->reorder_mode;
5616 EAPI Elm_Genlist_Item_Type
5617 elm_genlist_item_type_get(const Elm_Object_Item *it)
5619 ELM_OBJ_ITEM_CHECK_OR_RETURN(it, ELM_GENLIST_ITEM_MAX);
5620 Elm_Gen_Item *_it = (Elm_Gen_Item *)it;
5621 return _it->item->type;
5624 EINA_DEPRECATED EAPI Elm_Genlist_Item_Type
5625 elm_genlist_item_flags_get(const Elm_Object_Item *it)
5627 return elm_genlist_item_type_get(it);
5630 EAPI Elm_Genlist_Item_Class *
5631 elm_genlist_item_class_new(void)
5633 Elm_Genlist_Item_Class *itc;
5635 itc = calloc(1, sizeof(Elm_Genlist_Item_Class));
5638 itc->version = CLASS_ALLOCATED;
5640 itc->delete_me = EINA_FALSE;
5646 elm_genlist_item_class_free(Elm_Genlist_Item_Class *itc)
5648 if (itc && (itc->version == CLASS_ALLOCATED))
5650 if (!itc->delete_me) itc->delete_me = EINA_TRUE;
5651 if (itc->refcount > 0) elm_genlist_item_class_unref(itc);
5661 elm_genlist_item_class_ref(Elm_Genlist_Item_Class *itc)
5663 if (itc && (itc->version == CLASS_ALLOCATED))
5666 if (itc->refcount == 0) itc->refcount--;
5671 elm_genlist_item_class_unref(Elm_Genlist_Item_Class *itc)
5673 if (itc && (itc->version == CLASS_ALLOCATED))
5675 if (itc->refcount > 0) itc->refcount--;
5676 if (itc->delete_me && (!itc->refcount))
5677 elm_genlist_item_class_free(itc);
5681 void _flip_job(void *data)
5683 Elm_Gen_Item *it = (Elm_Gen_Item *) data;
5684 _elm_genlist_item_unrealize(it, EINA_FALSE);
5685 if (it->selected) _item_unselect(it);
5686 it->flipped = EINA_TRUE;
5687 it->item->nocache = EINA_TRUE;
5691 elm_genlist_item_flip_set(Elm_Object_Item *it,
5694 ELM_OBJ_ITEM_CHECK_OR_RETURN(it);
5695 Elm_Gen_Item *_it = (Elm_Gen_Item *)it;
5698 if (_it->flipped == flip) return;
5702 ecore_job_add(_flip_job, _it);
5703 if (_it->wd->calc_job) ecore_job_del(_it->wd->calc_job);
5704 _it->wd->calc_job = ecore_job_add(_calc_job, _it->wd);
5708 _it->flipped = flip;
5709 _item_cache_zero(_it->wd);
5710 elm_genlist_item_update(it);
5711 _it->item->nocache = EINA_FALSE;
5716 elm_genlist_item_flip_get(const Elm_Object_Item *it)
5718 ELM_OBJ_ITEM_CHECK_OR_RETURN(it, EINA_FALSE);
5719 Elm_Gen_Item *_it = (Elm_Gen_Item *)it;
5720 return _it->flipped;
5724 elm_genlist_select_mode_set(Evas_Object *obj, Elm_Object_Select_Mode_Type mode)
5726 ELM_CHECK_WIDTYPE(obj, widtype);
5727 Widget_Data *wd = elm_widget_data_get(obj);
5729 if (mode >= ELM_OBJECT_SELECT_MODE_MAX)
5731 if (wd->select_mode != mode)
5732 wd->select_mode = mode;
5735 EAPI Elm_Object_Select_Mode_Type
5736 elm_genlist_select_mode_get(const Evas_Object *obj)
5738 ELM_CHECK_WIDTYPE(obj, widtype) ELM_OBJECT_SELECT_MODE_MAX;
5739 Widget_Data *wd = elm_widget_data_get(obj);
5740 if (!wd) return ELM_OBJECT_SELECT_MODE_MAX;
5741 return wd->select_mode;
5744 /* for gengrid as of now */
5746 _elm_genlist_page_relative_set(Evas_Object *obj,
5750 Evas_Coord pagesize_h;
5751 Evas_Coord pagesize_v;
5753 ELM_CHECK_WIDTYPE(obj, widtype);
5754 Widget_Data *wd = elm_widget_data_get(obj);
5757 elm_smart_scroller_paging_get(wd->scr, NULL, NULL, &pagesize_h, &pagesize_v);
5758 elm_smart_scroller_paging_set(wd->scr, h_pagerel, v_pagerel, pagesize_h,
5762 /* for gengrid as of now */
5764 _elm_genlist_page_relative_get(const Evas_Object *obj,
5768 ELM_CHECK_WIDTYPE(obj, widtype);
5769 Widget_Data *wd = elm_widget_data_get(obj);
5772 elm_smart_scroller_paging_get(wd->scr, h_pagerel, v_pagerel, NULL, NULL);
5775 /* for gengrid as of now */
5777 _elm_genlist_page_size_set(Evas_Object *obj,
5778 Evas_Coord h_pagesize,
5779 Evas_Coord v_pagesize)
5784 ELM_CHECK_WIDTYPE(obj, widtype);
5785 Widget_Data *wd = elm_widget_data_get(obj);
5787 elm_smart_scroller_paging_get(wd->scr, &pagerel_h, &pagerel_v, NULL, NULL);
5788 elm_smart_scroller_paging_set(wd->scr, pagerel_h, pagerel_v, h_pagesize,
5792 /* for gengrid as of now */
5794 _elm_genlist_current_page_get(const Evas_Object *obj,
5798 ELM_CHECK_WIDTYPE(obj, widtype);
5799 Widget_Data *wd = elm_widget_data_get(obj);
5801 elm_smart_scroller_current_page_get(wd->scr, h_pagenumber, v_pagenumber);
5804 /* for gengrid as of now */
5806 _elm_genlist_last_page_get(const Evas_Object *obj,
5810 ELM_CHECK_WIDTYPE(obj, widtype);
5811 Widget_Data *wd = elm_widget_data_get(obj);
5813 elm_smart_scroller_last_page_get(wd->scr, h_pagenumber, v_pagenumber);
5816 /* for gengrid as of now */
5818 _elm_genlist_page_show(const Evas_Object *obj,
5822 ELM_CHECK_WIDTYPE(obj, widtype);
5823 Widget_Data *wd = elm_widget_data_get(obj);
5825 elm_smart_scroller_page_show(wd->scr, h_pagenumber, v_pagenumber);
5828 /* for gengrid as of now */
5830 _elm_genlist_page_bring_in(const Evas_Object *obj,
5834 ELM_CHECK_WIDTYPE(obj, widtype);
5835 Widget_Data *wd = elm_widget_data_get(obj);
5837 elm_smart_scroller_page_bring_in(wd->scr, h_pagenumber, v_pagenumber);
5841 _elm_genlist_item_unrealize(Elm_Gen_Item *it,
5844 Evas_Object *content;
5846 if (!it->realized) return;
5847 if (it->wd->reorder_it == it) return;
5849 evas_event_freeze(evas_object_evas_get(WIDGET(it)));
5851 evas_object_smart_callback_call(WIDGET(it), SIG_UNREALIZED, it);
5854 ecore_timer_del(it->long_timer);
5855 it->long_timer = NULL;
5858 elm_widget_stringlist_free(it->texts);
5860 elm_widget_stringlist_free(it->contents);
5861 it->contents = NULL;
5862 elm_widget_stringlist_free(it->states);
5865 EINA_LIST_FREE(it->content_objs, content)
5866 evas_object_del(content);
5868 it->unrealize_cb(it);
5870 it->realized = EINA_FALSE;
5871 it->want_unrealize = EINA_FALSE;
5872 evas_event_thaw(evas_object_evas_get(WIDGET(it)));
5873 evas_event_thaw_eval(evas_object_evas_get(WIDGET(it)));
5877 _elm_genlist_item_del_notserious(Elm_Gen_Item *it)
5879 elm_widget_item_pre_notify_del(it);
5880 it->generation = it->wd->generation - 1; /* This means that the item is deleted */
5881 if (it->selected) it->wd->selected = eina_list_remove(it->wd->selected, it);
5883 if (it->itc->func.del)
5884 it->itc->func.del((void *)it->base.data, WIDGET(it));
5888 _elm_genlist_item_del_serious(Elm_Gen_Item *it)
5890 _elm_genlist_item_del_notserious(it);
5891 it->wd->items = eina_inlist_remove(it->wd->items, EINA_INLIST_GET(it));
5892 if (it->tooltip.del_cb)
5893 it->tooltip.del_cb((void *)it->tooltip.data, WIDGET(it), it);
5894 it->wd->walking -= it->walking;
5895 if (it->long_timer) ecore_timer_del(it->long_timer);
5897 it->wd->group_items = eina_list_remove(it->wd->group_items, it);
5901 eina_inlist_sorted_state_free(it->wd->state);
5902 it->wd->state = NULL;
5904 if (it->wd->calc_job) ecore_job_del(it->wd->calc_job);
5905 it->wd->calc_job = ecore_job_add(it->wd->calc_cb, it->wd);
5909 if (it->wd->last_selected_item == (Elm_Object_Item *)it)
5910 it->wd->last_selected_item = NULL;
5911 it->wd->item_count--;
5915 elm_genlist_tree_effect_enabled_set(Evas_Object *obj, Eina_Bool enabled)
5917 ELM_CHECK_WIDTYPE(obj, widtype);
5918 Widget_Data *wd = elm_widget_data_get(obj);
5920 wd->tree_effect_enabled = !!enabled;
5924 elm_genlist_tree_effect_enabled_get(const Evas_Object *obj)
5926 ELM_CHECK_WIDTYPE(obj, widtype) EINA_FALSE;
5927 Widget_Data *wd = elm_widget_data_get(obj);
5928 if (!wd) return EINA_FALSE;
5929 return wd->tree_effect_enabled;
5933 _create_tray_alpha_bg(const Evas_Object *obj)
5935 ELM_CHECK_WIDTYPE(obj, widtype) NULL;
5936 Widget_Data *wd = elm_widget_data_get(obj);
5937 if (!wd) return NULL;
5939 Evas_Object *bg = NULL;
5940 Evas_Coord ox, oy, ow, oh;
5942 evas_object_geometry_get(wd->pan_smart, &ox, &oy, &ow, &oh);
5943 bg = evas_object_rectangle_add(evas_object_evas_get(wd->obj));
5944 evas_object_color_set(bg,0,0,0,0);
5945 evas_object_resize(bg , ow, oh);
5946 evas_object_move(bg , ox, oy);
5951 _item_contract_emit(Elm_Gen_Item *it)
5956 edje_object_signal_emit(VIEW(it), "elm,state,contract_flip", "");
5957 it->item->tree_effect_finished = EINA_FALSE;
5959 EINA_LIST_FOREACH(it->item->items, l, it2)
5960 if (it2) _item_contract_emit(it2);
5964 _item_tree_effect_before(Elm_Gen_Item *it)
5969 EINA_LIST_FOREACH(it->item->items, l, it2)
5971 if (it2->parent && (it == it2->parent))
5973 if (it->wd->move_effect_mode == ELM_GENLIST_ITEM_MOVE_EFFECT_EXPAND)
5974 edje_object_signal_emit(VIEW(it2), "elm,state,hide", "");
5975 else if (it->wd->move_effect_mode == ELM_GENLIST_ITEM_MOVE_EFFECT_CONTRACT)
5976 _item_contract_emit(it2);
5979 return ECORE_CALLBACK_CANCEL;
5983 _item_tree_effect(Widget_Data *wd, int y)
5985 Elm_Gen_Item *it = NULL, *expanded_next_it;
5987 expanded_next_it = wd->expanded_next_item;
5989 if (wd->move_effect_mode == ELM_GENLIST_ITEM_MOVE_EFFECT_EXPAND)
5991 it = (Elm_Gen_Item *) elm_genlist_item_prev_get((Elm_Object_Item *) expanded_next_it);
5994 if (it->item->expanded_depth <= expanded_next_it->item->expanded_depth) break;
5995 if (it->item->scrl_y && (it->item->scrl_y < expanded_next_it->item->old_scrl_y + y) &&
5996 (it->item->expanded_depth > expanded_next_it->item->expanded_depth))
5998 if (!it->item->tree_effect_finished)
6000 edje_object_signal_emit(VIEW(it), "flip_item", "");
6001 evas_object_show(VIEW(it));
6002 it->item->tree_effect_finished = EINA_TRUE;
6005 it = (Elm_Gen_Item *) elm_genlist_item_prev_get((Elm_Object_Item *) it);
6008 else if (wd->move_effect_mode == ELM_GENLIST_ITEM_MOVE_EFFECT_CONTRACT)
6010 it = (Elm_Gen_Item *) elm_genlist_item_prev_get((Elm_Object_Item *) expanded_next_it);
6013 if ((it->item->scrl_y > expanded_next_it->item->old_scrl_y + y) &&
6014 (it->item->expanded_depth > expanded_next_it->item->expanded_depth))
6016 if (!it->item->tree_effect_finished)
6018 edje_object_signal_emit(VIEW(it), "elm,state,hide", "");
6019 it->item->tree_effect_finished = EINA_TRUE;
6024 it = (Elm_Gen_Item *) elm_genlist_item_prev_get((Elm_Object_Item *) it);
6030 _item_tree_effect_finish(Widget_Data *wd)
6033 Elm_Gen_Item *it = NULL;
6036 if (wd->item_moving_effect_timer)
6038 if (wd->move_effect_mode == ELM_GENLIST_ITEM_MOVE_EFFECT_CONTRACT)
6039 _item_subitems_clear(wd->expanded_item);
6040 EINA_INLIST_FOREACH(wd->blocks, itb)
6042 EINA_LIST_FOREACH(itb->items, l, it)
6044 it->item->tree_effect_finished = EINA_TRUE;
6045 it->item->old_scrl_y = it->item->scrl_y;
6049 _item_auto_scroll(wd);
6050 evas_object_lower(wd->alpha_bg);
6051 evas_object_hide(wd->alpha_bg);
6052 wd->move_effect_mode = ELM_GENLIST_ITEM_MOVE_EFFECT_NONE;
6053 if (wd->move_items) wd->move_items = eina_list_free(wd->move_items);
6055 evas_object_smart_callback_call(wd->pan_smart, "changed", NULL);
6056 evas_object_smart_callback_call(wd->obj, SIG_TREE_EFFECT_FINISHED, NULL);
6057 evas_object_smart_changed(wd->pan_smart);
6059 wd->item_moving_effect_timer = NULL;
6063 _item_moving_effect_timer_cb(void *data)
6065 Widget_Data *wd = data;
6066 if (!wd) return EINA_FALSE;
6067 Evas_Coord ox, oy, ow, oh, cvx, cvy, cvw, cvh;
6068 Elm_Gen_Item *it = NULL, *it2, *expanded_next_it;
6070 double effect_duration = 0.5, t;
6071 int y = 0, dy = 0, dh = 0;
6072 Eina_Bool end = EINA_FALSE, vis = EINA_TRUE;
6075 t = ((0.0 > (t = ecore_time_get() - wd->start_time)) ? 0.0 : t);
6076 evas_object_geometry_get(wd->pan_smart, &ox, &oy, &ow, &oh);
6077 evas_output_viewport_get(evas_object_evas_get(wd->pan_smart), &cvx, &cvy, &cvw, &cvh);
6078 if (t > effect_duration) end = EINA_TRUE;
6080 // Below while statement is needed, when the genlist is resized.
6081 it2 = wd->expanded_item;
6084 evas_object_move(VIEW(it2), it2->item->scrl_x, it2->item->scrl_y);
6085 vis = (ELM_RECTS_INTERSECT(it2->item->scrl_x, it2->item->scrl_y, it2->item->w, it2->item->h,
6086 cvx, cvy, cvw, cvh));
6087 it2 = (Elm_Gen_Item *) elm_genlist_item_prev_get((Elm_Object_Item *) it2);
6090 if (wd->expanded_next_item)
6092 expanded_next_it = wd->expanded_next_item;
6095 EINA_LIST_FOREACH(wd->move_items, l, it)
6097 if (wd->move_effect_mode == ELM_GENLIST_ITEM_MOVE_EFFECT_EXPAND)
6099 expanded_next_it->item->old_scrl_y = wd->expanded_item->item->old_scrl_y + wd->expanded_item->item->h;
6100 if (expanded_next_it->item->scrl_y < expanded_next_it->item->old_scrl_y) //did not calculate next item position
6101 expanded_next_it->item->scrl_y = cvy + cvh;
6103 dy = ((expanded_next_it->item->scrl_y >= (cvy + cvh)) ?
6104 cvy + cvh : expanded_next_it->item->scrl_y) -
6105 expanded_next_it->item->old_scrl_y;
6107 else if (wd->move_effect_mode == ELM_GENLIST_ITEM_MOVE_EFFECT_CONTRACT)
6109 if (expanded_next_it->item->scrl_y > expanded_next_it->item->old_scrl_y) //did not calculate next item position
6110 expanded_next_it->item->old_scrl_y = cvy + cvh;
6112 if (expanded_next_it->item->old_scrl_y > (cvy + cvh))
6114 dy = (wd->expanded_item->item->scrl_y + wd->expanded_item->item->h) -
6116 expanded_next_it->item->old_scrl_y = cvy + cvh;
6120 dy = (wd->expanded_item->item->scrl_y + wd->expanded_item->item->h) -
6121 expanded_next_it->item->old_scrl_y;
6125 if (t <= effect_duration)
6127 y = ((1 - (1 - (t / effect_duration)) * (1 - (t /effect_duration))) * dy);
6137 _item_realize(it, in, 0);
6141 if (it != expanded_next_it)
6143 it->item->old_scrl_y = expanded_next_it->item->old_scrl_y + expanded_next_it->item->h + dh;
6147 if ((it->item->old_scrl_y + y) < (cvy + cvh))
6148 _item_position(it, VIEW(it),it->item->scrl_x, it->item->old_scrl_y + y);
6151 _item_tree_effect(wd, y);
6155 int expanded_item_num = 0;
6158 if (wd->expanded_item)
6159 it = (Elm_Gen_Item *) elm_genlist_item_next_get((Elm_Object_Item *) wd->expanded_item);
6164 expanded_item_num++;
6165 it2 = (Elm_Gen_Item *) elm_genlist_item_next_get((Elm_Object_Item *) it2);
6171 if (wd->expanded_item->item->expanded_depth >= it->item->expanded_depth) break;
6172 if (wd->move_effect_mode == ELM_GENLIST_ITEM_MOVE_EFFECT_EXPAND)
6174 if (!it->item->tree_effect_finished)
6176 if (t >= (((num - 1) * effect_duration) / expanded_item_num))
6178 edje_object_signal_emit(VIEW(it), "flip_item", "");
6179 evas_object_show(VIEW(it));
6180 it->item->tree_effect_finished = EINA_TRUE;
6184 it = (Elm_Gen_Item *) elm_genlist_item_next_get((Elm_Object_Item *) it);
6190 _item_tree_effect_finish(wd);
6191 return ECORE_CALLBACK_CANCEL;
6193 return ECORE_CALLBACK_RENEW;