3 #include <Elementary.h>
4 #include <Elementary_Cursor.h>
6 #include "els_scroller.h"
7 #include "elm_gen_common.h"
9 #define MAX_ITEMS_PER_BLOCK 32
10 #define REORDER_EFFECT_TIME 0.5
12 #define ELM_GEN_SETUP(wd) \
13 (wd)->calc_cb = (Ecore_Cb)_calc_job; \
14 (wd)->clear_cb = (Ecore_Cb)_clear_cb; \
15 (wd)->sizing_cb = (Ecore_Cb)_sizing_eval
17 #define ELM_GEN_ITEM_SETUP(it) \
18 (it)->del_cb = (Ecore_Cb)_item_del; \
19 (it)->highlight_cb = (Ecore_Cb)_item_highlight; \
20 (it)->unsel_cb = (Ecore_Cb)_item_unselect; \
21 (it)->unhighlight_cb = (Ecore_Cb)_item_unhighlight; \
22 (it)->unrealize_cb = (Ecore_Cb)_item_unrealize_cb
24 typedef struct _Item_Block Item_Block;
25 typedef struct _Item_Cache Item_Cache;
27 struct Elm_Gen_Item_Type
32 Evas_Coord w, h, minw, minh;
33 Elm_Gen_Item *group_item;
34 Elm_Genlist_Item_Flags flags;
35 Eina_List *mode_texts, *mode_contents, *mode_states, *mode_content_objs;
36 Eina_List *edit_texts, *edit_contents, *edit_states, *edit_content_objs;
37 Ecore_Timer *swipe_timer;
38 Evas_Coord scrl_x, scrl_y, old_scrl_y;
41 Evas_Object *mode_view;
47 Eina_Bool want_realize : 1;
48 Eina_Bool expanded : 1;
49 Eina_Bool mincalcd : 1;
52 Eina_Bool updateme : 1;
53 Eina_Bool nocache : 1;
54 Eina_Bool stacking_even : 1;
55 Eina_Bool nostacking : 1;
56 Eina_Bool move_effect_enabled : 1;
57 Eina_Bool edit_mode_item_realized : 1;
68 Evas_Coord x, y, w, h, minw, minh;
70 int item_position_stamp;
72 Eina_Bool position_update : 1;
73 Eina_Bool want_unrealize : 1;
74 Eina_Bool realized : 1;
75 Eina_Bool changed : 1;
76 Eina_Bool updateme : 1;
78 Eina_Bool must_recalc : 1;
85 Evas_Object *base_view, *spacer;
87 const char *item_style; // it->itc->item_style
88 Eina_Bool tree : 1; // it->group
89 Eina_Bool compress : 1; // it->wd->compress
91 Eina_Bool selected : 1; // it->selected
92 Eina_Bool disabled : 1; // it->disabled
93 Eina_Bool expanded : 1; // it->item->expanded
96 static const char *widtype = NULL;
97 static void _item_cache_zero(Widget_Data *wd);
98 static void _del_hook(Evas_Object *obj);
99 static void _mirrored_set(Evas_Object *obj,
101 static void _theme_hook(Evas_Object *obj);
102 static void _show_region_hook(void *data,
104 static void _sizing_eval(Evas_Object *obj);
105 static void _item_realize(Elm_Gen_Item *it,
108 static void _item_unrealize_cb(Elm_Gen_Item *it);
109 static void _item_block_unrealize(Item_Block *itb);
110 static void _calc_job(void *data);
111 static void _on_focus_hook(void *data,
113 static Eina_Bool _item_multi_select_up(Widget_Data *wd);
114 static Eina_Bool _item_multi_select_down(Widget_Data *wd);
115 static Eina_Bool _item_single_select_up(Widget_Data *wd);
116 static Eina_Bool _item_single_select_down(Widget_Data *wd);
117 static Eina_Bool _event_hook(Evas_Object *obj,
119 Evas_Callback_Type type,
121 static void _signal_emit_hook(Evas_Object *obj,
122 const char *emission,
124 static Eina_Bool _deselect_all_items(Widget_Data *wd);
125 static void _pan_calculate(Evas_Object *obj);
126 static void _pan_max_get(Evas_Object *obj,
129 static void _item_position(Elm_Gen_Item *it,
133 static void _mode_item_realize(Elm_Gen_Item *it);
134 static void _mode_item_unrealize(Elm_Gen_Item *it);
135 static void _item_mode_set(Elm_Gen_Item *it);
136 static void _item_mode_unset(Widget_Data *wd);
137 static void _edit_mode_item_position(Elm_Gen_Item *it, int itx, int ity);
138 static void _edit_mode_item_realize(Elm_Gen_Item *it, Eina_Bool effect_on);
139 static void _edit_mode_item_unrealize(Elm_Gen_Item *it);
140 static void _group_items_recalc(void *data);
141 static void _item_move_after(Elm_Gen_Item *it,
142 Elm_Gen_Item *after);
143 static void _item_move_before(Elm_Gen_Item *it,
144 Elm_Gen_Item *before);
145 static void _item_auto_scroll(Widget_Data *wd);
146 static void _elm_genlist_clear(Evas_Object *obj,
148 static void _pan_child_size_get(Evas_Object *obj,
152 static Evas_Smart_Class _pan_sc = EVAS_SMART_CLASS_INIT_VERSION;
154 static const char SIG_ACTIVATED[] = "activated";
155 static const char SIG_CLICKED_DOUBLE[] = "clicked,double";
156 static const char SIG_SELECTED[] = "selected";
157 static const char SIG_UNSELECTED[] = "unselected";
158 static const char SIG_EXPANDED[] = "expanded";
159 static const char SIG_CONTRACTED[] = "contracted";
160 static const char SIG_EXPAND_REQUEST[] = "expand,request";
161 static const char SIG_CONTRACT_REQUEST[] = "contract,request";
162 static const char SIG_REALIZED[] = "realized";
163 static const char SIG_UNREALIZED[] = "unrealized";
164 static const char SIG_DRAG_START_UP[] = "drag,start,up";
165 static const char SIG_DRAG_START_DOWN[] = "drag,start,down";
166 static const char SIG_DRAG_START_LEFT[] = "drag,start,left";
167 static const char SIG_DRAG_START_RIGHT[] = "drag,start,right";
168 static const char SIG_DRAG_STOP[] = "drag,stop";
169 static const char SIG_DRAG[] = "drag";
170 static const char SIG_LONGPRESSED[] = "longpressed";
171 static const char SIG_SCROLL_ANIM_START[] = "scroll,anim,start";
172 static const char SIG_SCROLL_ANIM_STOP[] = "scroll,anim,stop";
173 static const char SIG_SCROLL_DRAG_START[] = "scroll,drag,start";
174 static const char SIG_SCROLL_DRAG_STOP[] = "scroll,drag,stop";
175 static const char SIG_EDGE_TOP[] = "edge,top";
176 static const char SIG_EDGE_BOTTOM[] = "edge,bottom";
177 static const char SIG_EDGE_LEFT[] = "edge,left";
178 static const char SIG_EDGE_RIGHT[] = "edge,right";
179 static const char SIG_MULTI_SWIPE_LEFT[] = "multi,swipe,left";
180 static const char SIG_MULTI_SWIPE_RIGHT[] = "multi,swipe,right";
181 static const char SIG_MULTI_SWIPE_UP[] = "multi,swipe,up";
182 static const char SIG_MULTI_SWIPE_DOWN[] = "multi,swipe,down";
183 static const char SIG_MULTI_PINCH_OUT[] = "multi,pinch,out";
184 static const char SIG_MULTI_PINCH_IN[] = "multi,pinch,in";
185 static const char SIG_SWIPE[] = "swipe";
186 static const char SIG_MOVED[] = "moved";
187 static const char SIG_INDEX_UPDATE[] = "index,update";
189 static const Evas_Smart_Cb_Description _signals[] = {
190 {SIG_CLICKED_DOUBLE, ""},
193 {SIG_UNSELECTED, ""},
195 {SIG_CONTRACTED, ""},
196 {SIG_EXPAND_REQUEST, ""},
197 {SIG_CONTRACT_REQUEST, ""},
199 {SIG_UNREALIZED, ""},
200 {SIG_DRAG_START_UP, ""},
201 {SIG_DRAG_START_DOWN, ""},
202 {SIG_DRAG_START_LEFT, ""},
203 {SIG_DRAG_START_RIGHT, ""},
206 {SIG_LONGPRESSED, ""},
207 {SIG_SCROLL_ANIM_START, ""},
208 {SIG_SCROLL_ANIM_STOP, ""},
209 {SIG_SCROLL_DRAG_START, ""},
210 {SIG_SCROLL_DRAG_STOP, ""},
212 {SIG_EDGE_BOTTOM, ""},
214 {SIG_EDGE_RIGHT, ""},
215 {SIG_MULTI_SWIPE_LEFT, ""},
216 {SIG_MULTI_SWIPE_RIGHT, ""},
217 {SIG_MULTI_SWIPE_UP, ""},
218 {SIG_MULTI_SWIPE_DOWN, ""},
219 {SIG_MULTI_PINCH_OUT, ""},
220 {SIG_MULTI_PINCH_IN, ""},
227 #undef ELM_CHECK_WIDTYPE
228 #define ELM_CHECK_WIDTYPE(obj, widtype) \
229 if ((!obj) || (!elm_genlist_type_check((obj), __func__))) return
230 #undef ELM_WIDGET_ITEM_WIDTYPE_CHECK_OR_RETURN
231 #define ELM_WIDGET_ITEM_WIDTYPE_CHECK_OR_RETURN(it, ...) \
232 ELM_WIDGET_ITEM_CHECK_OR_RETURN((Elm_Widget_Item *)it, __VA_ARGS__); \
233 ELM_CHECK_WIDTYPE(WIDGET((it)), widtype) __VA_ARGS__;
235 static const char *_gengrid = NULL;
236 static const char *_genlist = NULL;
238 /* THIS FUNCTION IS HACKY AND TEMPORARY!!! */
240 elm_genlist_type_check(const Evas_Object *obj,
243 const char *provided, *expected = "(unknown)";
244 static int abort_on_warn = -1;
245 provided = elm_widget_type_get(obj);
246 if (!_genlist) _genlist = eina_stringshare_add("genlist");
247 if (!_gengrid) _gengrid = eina_stringshare_add("gengrid");
248 if (EINA_LIKELY(provided == _genlist) || EINA_LIKELY(provided == _gengrid))
250 if ((!provided) || (!provided[0]))
252 provided = evas_object_type_get(obj);
253 if ((!provided) || (!provided[0]))
254 provided = "(unknown)";
256 ERR("Passing Object: %p in function: %s, of type: '%s' when expecting type: '%s'", obj, func, provided, expected);
257 if (abort_on_warn == -1)
259 if (getenv("ELM_ERROR_ABORT")) abort_on_warn = 1;
260 else abort_on_warn = 0;
262 if (abort_on_warn == 1) abort();
267 _event_hook(Evas_Object *obj,
268 Evas_Object *src __UNUSED__,
269 Evas_Callback_Type type,
272 if (type != EVAS_CALLBACK_KEY_DOWN) return EINA_FALSE;
273 Evas_Event_Key_Down *ev = event_info;
274 Widget_Data *wd = elm_widget_data_get(obj);
275 Evas_Coord pan_max_x = 0, pan_max_y = 0;
276 if (!wd) return EINA_FALSE;
277 if (!wd->items) return EINA_FALSE;
278 if (ev->event_flags & EVAS_EVENT_FLAG_ON_HOLD) return EINA_FALSE;
279 if (elm_widget_disabled_get(obj)) return EINA_FALSE;
281 Elm_Object_Item *it = NULL;
284 Evas_Coord step_x = 0;
285 Evas_Coord step_y = 0;
288 Evas_Coord page_x = 0;
289 Evas_Coord page_y = 0;
291 elm_smart_scroller_child_pos_get(wd->scr, &x, &y);
292 elm_smart_scroller_step_size_get(wd->scr, &step_x, &step_y);
293 elm_smart_scroller_page_size_get(wd->scr, &page_x, &page_y);
294 elm_smart_scroller_child_viewport_size_get(wd->scr, &v_w, &v_h);
296 if ((!strcmp(ev->keyname, "Left")) || (!strcmp(ev->keyname, "KP_Left")))
300 else if ((!strcmp(ev->keyname, "Right")) || (!strcmp(ev->keyname, "KP_Right")))
304 else if ((!strcmp(ev->keyname, "Up")) || (!strcmp(ev->keyname, "KP_Up")))
306 if (((evas_key_modifier_is_set(ev->modifiers, "Shift")) &&
307 (_item_multi_select_up(wd)))
308 || (_item_single_select_up(wd)))
310 ev->event_flags |= EVAS_EVENT_FLAG_ON_HOLD;
316 else if ((!strcmp(ev->keyname, "Down")) || (!strcmp(ev->keyname, "KP_Down")))
318 if (((evas_key_modifier_is_set(ev->modifiers, "Shift")) &&
319 (_item_multi_select_down(wd)))
320 || (_item_single_select_down(wd)))
322 ev->event_flags |= EVAS_EVENT_FLAG_ON_HOLD;
328 else if ((!strcmp(ev->keyname, "Home")) || (!strcmp(ev->keyname, "KP_Home")))
330 it = elm_genlist_first_item_get(obj);
331 elm_genlist_item_bring_in(it);
332 elm_genlist_item_selected_set(it, EINA_TRUE);
333 ev->event_flags |= EVAS_EVENT_FLAG_ON_HOLD;
336 else if ((!strcmp(ev->keyname, "End")) || (!strcmp(ev->keyname, "KP_End")))
338 it = elm_genlist_last_item_get(obj);
339 elm_genlist_item_bring_in(it);
340 elm_genlist_item_selected_set(it, EINA_TRUE);
341 ev->event_flags |= EVAS_EVENT_FLAG_ON_HOLD;
344 else if ((!strcmp(ev->keyname, "Prior")) || (!strcmp(ev->keyname, "KP_Prior")))
347 y -= -(page_y * v_h) / 100;
351 else if ((!strcmp(ev->keyname, "Next")) || (!strcmp(ev->keyname, "KP_Next")))
354 y += -(page_y * v_h) / 100;
358 else if (!strcmp(ev->keyname, "Escape"))
360 if (!_deselect_all_items(wd)) return EINA_FALSE;
361 ev->event_flags |= EVAS_EVENT_FLAG_ON_HOLD;
364 else if (((!strcmp(ev->keyname, "Return")) ||
365 (!strcmp(ev->keyname, "KP_Enter")) ||
366 (!strcmp(ev->keyname, "space")))
367 && (!wd->multi) && (wd->selected))
369 it = elm_genlist_selected_item_get(obj);
370 elm_genlist_item_expanded_set(it,
371 !elm_genlist_item_expanded_get(it));
372 evas_object_smart_callback_call(WIDGET(it), SIG_ACTIVATED, it);
374 else return EINA_FALSE;
376 ev->event_flags |= EVAS_EVENT_FLAG_ON_HOLD;
377 _pan_max_get(wd->pan_smart, &pan_max_x, &pan_max_y);
379 if (x > pan_max_x) x = pan_max_x;
381 if (y > pan_max_y) y = pan_max_y;
382 elm_smart_scroller_child_pos_set(wd->scr, x, y);
387 _deselect_all_items(Widget_Data *wd)
389 if (!wd->selected) return EINA_FALSE;
391 elm_genlist_item_selected_set(wd->selected->data, EINA_FALSE);
397 _item_multi_select_up(Widget_Data *wd)
399 if (!wd->selected) return EINA_FALSE;
400 if (!wd->multi) return EINA_FALSE;
402 Elm_Object_Item *prev = elm_genlist_item_prev_get(wd->last_selected_item);
403 if (!prev) return EINA_TRUE;
405 if (elm_genlist_item_selected_get(prev))
407 elm_genlist_item_selected_set(wd->last_selected_item, EINA_FALSE);
408 wd->last_selected_item = prev;
409 elm_genlist_item_show(wd->last_selected_item);
413 elm_genlist_item_selected_set(prev, EINA_TRUE);
414 elm_genlist_item_show(prev);
420 _item_multi_select_down(Widget_Data *wd)
422 if (!wd->selected) return EINA_FALSE;
423 if (!wd->multi) return EINA_FALSE;
425 Elm_Object_Item *next;
426 next = elm_genlist_item_next_get(wd->last_selected_item);
427 if (!next) return EINA_TRUE;
429 if (elm_genlist_item_selected_get(next))
431 elm_genlist_item_selected_set(wd->last_selected_item, EINA_FALSE);
432 wd->last_selected_item = next;
433 elm_genlist_item_show(wd->last_selected_item);
437 elm_genlist_item_selected_set(next, EINA_TRUE);
438 elm_genlist_item_show(next);
444 _item_single_select_up(Widget_Data *wd)
449 prev = ELM_GEN_ITEM_FROM_INLIST(wd->items->last);
450 while ((prev) && (prev->generation < wd->generation))
451 prev = ELM_GEN_ITEM_FROM_INLIST(EINA_INLIST_GET(prev)->prev);
453 else prev = (Elm_Gen_Item *) elm_genlist_item_prev_get(wd->last_selected_item);
455 if (!prev) return EINA_FALSE;
457 _deselect_all_items(wd);
459 elm_genlist_item_selected_set((Elm_Object_Item *) prev, EINA_TRUE);
460 elm_genlist_item_show((Elm_Object_Item *) prev);
465 _item_single_select_down(Widget_Data *wd)
470 next = ELM_GEN_ITEM_FROM_INLIST(wd->items);
471 while ((next) && (next->generation < wd->generation))
472 next = ELM_GEN_ITEM_FROM_INLIST(EINA_INLIST_GET(next)->next);
474 else next = (Elm_Gen_Item *) elm_genlist_item_next_get(wd->last_selected_item);
476 if (!next) return EINA_FALSE;
478 _deselect_all_items(wd);
480 elm_genlist_item_selected_set((Elm_Object_Item *) next, EINA_TRUE);
481 elm_genlist_item_show((Elm_Object_Item *) next);
486 _on_focus_hook(void *data __UNUSED__,
489 Widget_Data *wd = elm_widget_data_get(obj);
491 if (elm_widget_focus_get(obj))
493 elm_object_signal_emit(wd->obj, "elm,action,focus", "elm");
494 evas_object_focus_set(wd->obj, EINA_TRUE);
495 if ((wd->selected) && (!wd->last_selected_item))
496 wd->last_selected_item = eina_list_data_get(wd->selected);
500 elm_object_signal_emit(wd->obj, "elm,action,unfocus", "elm");
501 evas_object_focus_set(wd->obj, EINA_FALSE);
506 _del_hook(Evas_Object *obj)
508 Widget_Data *wd = elm_widget_data_get(obj);
510 _item_cache_zero(wd);
511 if (wd->calc_job) ecore_job_del(wd->calc_job);
512 if (wd->update_job) ecore_job_del(wd->update_job);
513 if (wd->queue_idle_enterer) ecore_idle_enterer_del(wd->queue_idle_enterer);
514 if (wd->must_recalc_idler) ecore_idler_del(wd->must_recalc_idler);
515 if (wd->multi_timer) ecore_timer_del(wd->multi_timer);
516 if (wd->mode_type) eina_stringshare_del(wd->mode_type);
517 if (wd->scr_hold_timer) ecore_timer_del(wd->scr_hold_timer);
522 _del_pre_hook(Evas_Object *obj)
524 Widget_Data *wd = elm_widget_data_get(obj);
526 if (wd->edit_mode) elm_genlist_edit_mode_set(wd->obj, EINA_FALSE);
527 elm_genlist_clear(obj);
528 evas_object_del(wd->pan_smart);
529 wd->pan_smart = NULL;
533 _mirrored_set(Evas_Object *obj,
536 Widget_Data *wd = elm_widget_data_get(obj);
538 _item_cache_zero(wd);
539 elm_smart_scroller_mirrored_set(wd->scr, rtl);
543 _theme_hook(Evas_Object *obj)
545 Widget_Data *wd = elm_widget_data_get(obj);
548 evas_event_freeze(evas_object_evas_get(wd->obj));
549 _item_cache_zero(wd);
550 _elm_widget_mirrored_reload(obj);
551 _mirrored_set(obj, elm_widget_mirrored_get(obj));
552 elm_smart_scroller_object_theme_set(obj, wd->scr, "genlist", "base",
553 elm_widget_style_get(obj));
554 edje_object_scale_set(wd->scr, elm_widget_scale_get(obj) * _elm_config->scale);
555 wd->item_width = wd->item_height = 0;
556 wd->group_item_width = wd->group_item_height = 0;
557 wd->minw = wd->minh = wd->realminw = 0;
558 EINA_INLIST_FOREACH(wd->blocks, itb)
563 if (itb->realized) _item_block_unrealize(itb);
564 EINA_LIST_FOREACH(itb->items, l, it)
565 it->item->mincalcd = EINA_FALSE;
567 itb->changed = EINA_TRUE;
569 if (wd->calc_job) ecore_job_del(wd->calc_job);
570 wd->calc_job = ecore_job_add(_calc_job, wd);
572 evas_event_thaw(evas_object_evas_get(wd->obj));
573 evas_event_thaw_eval(evas_object_evas_get(wd->obj));
577 _show_region_hook(void *data,
580 Widget_Data *wd = elm_widget_data_get(data);
581 Evas_Coord x, y, w, h;
583 elm_widget_show_region_get(obj, &x, &y, &w, &h);
584 //x & y are screen coordinates, Add with pan coordinates
587 elm_smart_scroller_child_region_show(wd->scr, x, y, w, h);
591 _translate_hook(Evas_Object *obj)
593 evas_object_smart_callback_call(obj, "language,changed", NULL);
597 _sizing_eval(Evas_Object *obj)
599 Widget_Data *wd = elm_widget_data_get(obj);
600 Evas_Coord minw = -1, minh = -1, maxw = -1, maxh = -1;
602 evas_object_size_hint_min_get(wd->scr, &minw, &minh);
603 evas_object_size_hint_max_get(wd->scr, &maxw, &maxh);
605 if (wd->height_for_width)
609 elm_smart_scroller_child_viewport_size_get(wd->scr, &vw, &vh);
610 if ((vw != 0) && (vw != wd->prev_viewport_w))
614 wd->prev_viewport_w = vw;
615 EINA_INLIST_FOREACH(wd->blocks, itb)
617 itb->must_recalc = EINA_TRUE;
619 if (wd->calc_job) ecore_job_del(wd->calc_job);
620 wd->calc_job = ecore_job_add(_calc_job, wd);
623 if (wd->mode == ELM_LIST_LIMIT)
629 elm_smart_scroller_child_viewport_size_get(wd->scr, &vmw, &vmh);
630 edje_object_size_min_calc
631 (elm_smart_scroller_edje_object_get(wd->scr), &vmw, &vmh);
638 edje_object_size_min_calc
639 (elm_smart_scroller_edje_object_get(wd->scr), &vmw, &vmh);
643 evas_object_size_hint_min_set(obj, minw, minh);
644 evas_object_size_hint_max_set(obj, maxw, maxh);
648 _signal_emit_hook(Evas_Object *obj,
649 const char *emission,
652 Widget_Data *wd = elm_widget_data_get(obj);
653 edje_object_signal_emit(elm_smart_scroller_edje_object_get(wd->scr),
658 _item_highlight(Elm_Gen_Item *it)
660 const char *selectraise;
661 if ((it->wd->no_select) || (it->generation < it->wd->generation) ||
662 (it->highlighted) || elm_widget_item_disabled_get(it) ||
663 (it->display_only) || (it->item->mode_view))
665 edje_object_signal_emit(VIEW(it), "elm,state,selected", "elm");
666 if (it->edit_obj) edje_object_signal_emit(it->edit_obj, "elm,state,selected", "elm");
667 selectraise = edje_object_data_get(VIEW(it), "selectraise");
668 if ((selectraise) && (!strcmp(selectraise, "on")))
670 if (it->edit_obj) evas_object_raise(it->edit_obj);
671 else evas_object_raise(VIEW(it));
672 if ((it->item->group_item) && (it->item->group_item->realized))
673 evas_object_raise(it->item->VIEW(group_item));
675 it->highlighted = EINA_TRUE;
679 _item_unhighlight(Elm_Gen_Item *it)
681 if ((it->generation < it->wd->generation) || (!it->highlighted)) return;
682 edje_object_signal_emit(VIEW(it), "elm,state,unselected", "elm");
683 if (it->edit_obj) edje_object_signal_emit(it->edit_obj, "elm,state,unselected", "elm");
684 if (!it->item->nostacking)
686 if ((it->item->order_num_in & 0x1) ^ it->item->stacking_even)
688 if (it->edit_obj) evas_object_lower(it->edit_obj);
689 else evas_object_lower(VIEW(it));
693 if (it->edit_obj) evas_object_raise(it->edit_obj);
694 else evas_object_raise(VIEW(it));
697 it->highlighted = EINA_FALSE;
701 _item_block_position_update(Eina_Inlist *list, int idx)
705 EINA_INLIST_FOREACH(list, tmp)
707 tmp->position = idx++;
708 tmp->position_update = EINA_TRUE;
713 _item_position_update(Eina_List *list, int idx)
718 EINA_LIST_FOREACH(list, l, it)
720 it->position = idx++;
721 it->position_update = EINA_TRUE;
726 _item_block_del(Elm_Gen_Item *it)
729 Item_Block *itb = it->item->block;
731 itb->items = eina_list_remove(itb->items, it);
733 itb->changed = EINA_TRUE;
734 if (it->wd->calc_job) ecore_job_del(it->wd->calc_job);
735 it->wd->calc_job = ecore_job_add(_calc_job, it->wd);
738 il = EINA_INLIST_GET(itb);
739 Item_Block *itbn = (Item_Block *)(il->next);
741 it->parent->item->items = eina_list_remove(it->parent->item->items, it);
744 _item_block_position_update(il->next, itb->position);
745 it->wd->blocks = eina_inlist_remove(it->wd->blocks, il);
748 if (itbn) itbn->changed = EINA_TRUE;
752 if (itb->count < itb->wd->max_items_per_block/2)
754 il = EINA_INLIST_GET(itb);
755 Item_Block *itbp = (Item_Block *)(il->prev);
756 Item_Block *itbn = (Item_Block *)(il->next);
757 if ((itbp) && ((itbp->count + itb->count) < itb->wd->max_items_per_block + itb->wd->max_items_per_block/2))
761 EINA_LIST_FREE(itb->items, it2)
763 it2->item->block = itbp;
764 itbp->items = eina_list_append(itbp->items, it2);
766 itbp->changed = EINA_TRUE;
768 _item_block_position_update(EINA_INLIST_GET(itb)->next,
770 it->wd->blocks = eina_inlist_remove(it->wd->blocks,
771 EINA_INLIST_GET(itb));
774 else if ((itbn) && ((itbn->count + itb->count) < itb->wd->max_items_per_block + itb->wd->max_items_per_block/2))
778 Eina_List *last = eina_list_last(itb->items);
779 Elm_Gen_Item *it2 = last->data;
781 it2->item->block = itbn;
782 itb->items = eina_list_remove_list(itb->items, last);
783 itbn->items = eina_list_prepend(itbn->items, it2);
785 itbn->changed = EINA_TRUE;
787 _item_block_position_update(EINA_INLIST_GET(itb)->next,
790 eina_inlist_remove(it->wd->blocks, EINA_INLIST_GET(itb));
798 _item_del(Elm_Gen_Item *it)
800 Evas_Object *obj = WIDGET(it);
802 evas_event_freeze(evas_object_evas_get(obj));
803 elm_genlist_item_subitems_clear((Elm_Object_Item *) it);
804 if (it->wd->show_item == it) it->wd->show_item = NULL;
805 if (it->realized) _elm_genlist_item_unrealize(it, EINA_FALSE);
806 if (it->item->edit_mode_item_realized) _edit_mode_item_unrealize(it);
807 if (it->item->block) _item_block_del(it);
808 if (it->item->queued)
809 it->wd->queue = eina_list_remove(it->wd->queue, it);
810 if (it->wd->anchor_item == it)
812 it->wd->anchor_item = ELM_GEN_ITEM_FROM_INLIST(EINA_INLIST_GET(it)->next);
813 if (!it->wd->anchor_item)
814 it->wd->anchor_item = ELM_GEN_ITEM_FROM_INLIST(EINA_INLIST_GET(it)->prev);
816 if (it->wd->expanded_item == it) it->wd->expanded_item = NULL;
818 it->parent->item->items = eina_list_remove(it->parent->item->items, it);
819 if (it->item->swipe_timer) ecore_timer_del(it->item->swipe_timer);
820 _elm_genlist_item_del_serious(it);
821 elm_genlist_item_class_unref((Elm_Genlist_Item_Class *)it->itc);
822 evas_event_thaw(evas_object_evas_get(obj));
823 evas_event_thaw_eval(evas_object_evas_get(obj));
827 _clear_cb(Widget_Data *wd)
829 wd->anchor_item = NULL;
832 Item_Block *itb = (Item_Block *)(wd->blocks);
834 wd->blocks = eina_inlist_remove(wd->blocks, wd->blocks);
835 if (itb->items) eina_list_free(itb->items);
838 if (wd->queue_idle_enterer)
840 ecore_idle_enterer_del(wd->queue_idle_enterer);
841 wd->queue_idle_enterer = NULL;
843 if (wd->must_recalc_idler)
845 ecore_idler_del(wd->must_recalc_idler);
846 wd->must_recalc_idler = NULL;
848 if (wd->queue) wd->queue = eina_list_free(wd->queue);
849 if (wd->reorder_move_animator)
851 ecore_animator_del(wd->reorder_move_animator);
852 wd->reorder_move_animator = NULL;
854 wd->show_item = NULL;
855 wd->reorder_old_pan_y = 0;
859 _item_unselect(Elm_Gen_Item *it)
861 if ((it->generation < it->wd->generation) || (!it->selected)) return;
862 it->selected = EINA_FALSE;
863 it->wd->selected = eina_list_remove(it->wd->selected, it);
864 evas_object_smart_callback_call(WIDGET(it), SIG_UNSELECTED, it);
868 _mouse_move(void *data,
869 Evas *evas __UNUSED__,
873 Elm_Gen_Item *it = data;
874 Evas_Event_Mouse_Move *ev = event_info;
875 Evas_Coord minw = 0, minh = 0, x, y, dx, dy, adx, ady;
876 Evas_Coord ox, oy, ow, oh, it_scrl_y, y_pos;
878 if (ev->event_flags & EVAS_EVENT_FLAG_ON_HOLD)
880 if (!it->wd->on_hold)
882 it->wd->on_hold = EINA_TRUE;
883 if (!it->wd->wasselected)
885 _item_unhighlight(it);
890 if (it->wd->multitouched)
892 it->wd->cur_x = ev->cur.canvas.x;
893 it->wd->cur_y = ev->cur.canvas.y;
896 if ((it->dragging) && (it->down))
898 if (it->wd->movements == SWIPE_MOVES) it->wd->swipe = EINA_TRUE;
901 it->wd->history[it->wd->movements].x = ev->cur.canvas.x;
902 it->wd->history[it->wd->movements].y = ev->cur.canvas.y;
903 if (abs((it->wd->history[it->wd->movements].x -
904 it->wd->history[0].x)) > 40)
905 it->wd->swipe = EINA_TRUE;
911 ecore_timer_del(it->long_timer);
912 it->long_timer = NULL;
914 evas_object_smart_callback_call(WIDGET(it), SIG_DRAG, it);
917 if ((!it->down) /* || (it->wd->on_hold)*/ || (it->wd->longpressed))
921 ecore_timer_del(it->long_timer);
922 it->long_timer = NULL;
924 if ((it->wd->reorder_mode) && (it->wd->reorder_it))
926 evas_object_geometry_get(it->wd->pan_smart, &ox, &oy, &ow, &oh);
927 it_scrl_y = ev->cur.canvas.y - it->wd->reorder_it->dy;
929 if (!it->wd->reorder_start_y)
930 it->wd->reorder_start_y = it->item->block->y + it->y;
934 else if (it_scrl_y + it->wd->reorder_it->item->h > oy + oh)
935 y_pos = oy + oh - it->wd->reorder_it->item->h;
940 _item_position(it, it->edit_obj, it->item->scrl_x, y_pos);
942 _item_position(it, VIEW(it), it->item->scrl_x, y_pos);
944 if (it->wd->calc_job) ecore_job_del(it->wd->calc_job);
945 it->wd->calc_job = ecore_job_add(_calc_job, it->wd);
949 if (!it->display_only)
950 elm_coords_finger_size_adjust(1, &minw, 1, &minh);
951 evas_object_geometry_get(obj, &x, &y, NULL, NULL);
952 x = ev->cur.canvas.x - x;
953 y = ev->cur.canvas.y - y;
956 if (adx < 0) adx = -dx;
959 if (ady < 0) ady = -dy;
962 if ((adx > minw) || (ady > minh))
964 it->dragging = EINA_TRUE;
967 ecore_timer_del(it->long_timer);
968 it->long_timer = NULL;
970 if (!it->wd->wasselected)
972 _item_unhighlight(it);
978 evas_object_smart_callback_call(WIDGET(it),
979 SIG_DRAG_START_UP, it);
983 evas_object_smart_callback_call(WIDGET(it),
984 SIG_DRAG_START_LEFT, it);
986 evas_object_smart_callback_call(WIDGET(it),
987 SIG_DRAG_START_RIGHT, it);
993 evas_object_smart_callback_call(WIDGET(it),
994 SIG_DRAG_START_DOWN, it);
998 evas_object_smart_callback_call(WIDGET(it),
999 SIG_DRAG_START_LEFT, it);
1001 evas_object_smart_callback_call(WIDGET(it),
1002 SIG_DRAG_START_RIGHT, it);
1009 _long_press(void *data)
1011 Elm_Gen_Item *it = data, *it_tmp;
1012 Eina_List *list, *l;
1014 it->long_timer = NULL;
1015 if (elm_widget_item_disabled_get(it) || (it->dragging) || (it->display_only))
1016 return ECORE_CALLBACK_CANCEL;
1017 it->wd->longpressed = EINA_TRUE;
1018 evas_object_smart_callback_call(WIDGET(it), SIG_LONGPRESSED, it);
1019 if ((it->wd->reorder_mode) && (!it->group))
1021 it->wd->reorder_it = it;
1022 it->wd->reorder_start_y = 0;
1024 evas_object_raise(it->edit_obj);
1026 evas_object_raise(VIEW(it));
1028 elm_smart_scroller_hold_set(it->wd->scr, EINA_TRUE);
1029 elm_smart_scroller_bounce_allow_set(it->wd->scr, EINA_FALSE, EINA_FALSE);
1031 list = elm_genlist_realized_items_get(it->wd->obj);
1032 EINA_LIST_FOREACH(list, l, it_tmp)
1034 if (it != it_tmp) _item_unselect(it_tmp);
1036 if (elm_genlist_item_expanded_get((Elm_Object_Item *) it))
1038 elm_genlist_item_expanded_set((Elm_Object_Item *) it, EINA_FALSE);
1039 return ECORE_CALLBACK_RENEW;
1042 if (!it->wd->edit_mode)
1043 edje_object_signal_emit(VIEW(it), "elm,state,reorder,enabled", "elm");
1045 return ECORE_CALLBACK_CANCEL;
1049 _swipe(Elm_Gen_Item *it)
1054 if ((it->display_only) || elm_widget_item_disabled_get(it)) return;
1055 it->wd->swipe = EINA_FALSE;
1056 for (i = 0; i < it->wd->movements; i++)
1058 sum += it->wd->history[i].x;
1059 if (abs(it->wd->history[0].y - it->wd->history[i].y) > 10) return;
1062 sum /= it->wd->movements;
1063 if (abs(sum - it->wd->history[0].x) <= 10) return;
1064 evas_object_smart_callback_call(WIDGET(it), SIG_SWIPE, it);
1068 _swipe_cancel(void *data)
1070 Elm_Gen_Item *it = data;
1072 if (!it) return ECORE_CALLBACK_CANCEL;
1073 it->wd->swipe = EINA_FALSE;
1074 it->wd->movements = 0;
1075 return ECORE_CALLBACK_RENEW;
1079 _multi_cancel(void *data)
1081 Widget_Data *wd = data;
1083 if (!wd) return ECORE_CALLBACK_CANCEL;
1084 wd->multi_timeout = EINA_TRUE;
1085 return ECORE_CALLBACK_RENEW;
1089 _multi_touch_gesture_eval(void *data)
1091 Elm_Gen_Item *it = data;
1093 it->wd->multitouched = EINA_FALSE;
1094 if (it->wd->multi_timer)
1096 ecore_timer_del(it->wd->multi_timer);
1097 it->wd->multi_timer = NULL;
1099 if (it->wd->multi_timeout)
1101 it->wd->multi_timeout = EINA_FALSE;
1105 Evas_Coord minw = 0, minh = 0;
1106 Evas_Coord off_x, off_y, off_mx, off_my;
1108 elm_coords_finger_size_adjust(1, &minw, 1, &minh);
1109 off_x = abs(it->wd->cur_x - it->wd->prev_x);
1110 off_y = abs(it->wd->cur_y - it->wd->prev_y);
1111 off_mx = abs(it->wd->cur_mx - it->wd->prev_mx);
1112 off_my = abs(it->wd->cur_my - it->wd->prev_my);
1114 if (((off_x > minw) || (off_y > minh)) && ((off_mx > minw) || (off_my > minh)))
1116 if ((off_x + off_mx) > (off_y + off_my))
1118 if ((it->wd->cur_x > it->wd->prev_x) && (it->wd->cur_mx > it->wd->prev_mx))
1119 evas_object_smart_callback_call(WIDGET(it),
1120 SIG_MULTI_SWIPE_RIGHT, it);
1121 else if ((it->wd->cur_x < it->wd->prev_x) && (it->wd->cur_mx < it->wd->prev_mx))
1122 evas_object_smart_callback_call(WIDGET(it),
1123 SIG_MULTI_SWIPE_LEFT, it);
1124 else if (abs(it->wd->cur_x - it->wd->cur_mx) > abs(it->wd->prev_x - it->wd->prev_mx))
1125 evas_object_smart_callback_call(WIDGET(it),
1126 SIG_MULTI_PINCH_OUT, it);
1128 evas_object_smart_callback_call(WIDGET(it),
1129 SIG_MULTI_PINCH_IN, it);
1133 if ((it->wd->cur_y > it->wd->prev_y) && (it->wd->cur_my > it->wd->prev_my))
1134 evas_object_smart_callback_call(WIDGET(it),
1135 SIG_MULTI_SWIPE_DOWN, it);
1136 else if ((it->wd->cur_y < it->wd->prev_y) && (it->wd->cur_my < it->wd->prev_my))
1137 evas_object_smart_callback_call(WIDGET(it),
1138 SIG_MULTI_SWIPE_UP, it);
1139 else if (abs(it->wd->cur_y - it->wd->cur_my) > abs(it->wd->prev_y - it->wd->prev_my))
1140 evas_object_smart_callback_call(WIDGET(it),
1141 SIG_MULTI_PINCH_OUT, it);
1143 evas_object_smart_callback_call(WIDGET(it),
1144 SIG_MULTI_PINCH_IN, it);
1147 it->wd->multi_timeout = EINA_FALSE;
1151 _multi_down(void *data,
1152 Evas *evas __UNUSED__,
1153 Evas_Object *obj __UNUSED__,
1156 Elm_Gen_Item *it = data;
1157 Evas_Event_Multi_Down *ev = event_info;
1159 if ((it->wd->multi_device != 0) || (it->wd->multitouched) || (it->wd->multi_timeout)) return;
1160 it->wd->multi_device = ev->device;
1161 it->wd->multi_down = EINA_TRUE;
1162 it->wd->multitouched = EINA_TRUE;
1163 it->wd->prev_mx = ev->canvas.x;
1164 it->wd->prev_my = ev->canvas.y;
1165 if (!it->wd->wasselected)
1167 _item_unhighlight(it);
1170 it->wd->wasselected = EINA_FALSE;
1171 it->wd->longpressed = EINA_FALSE;
1174 ecore_timer_del(it->long_timer);
1175 it->long_timer = NULL;
1179 it->dragging = EINA_FALSE;
1180 evas_object_smart_callback_call(WIDGET(it), SIG_DRAG_STOP, it);
1182 if (it->item->swipe_timer)
1184 ecore_timer_del(it->item->swipe_timer);
1185 it->item->swipe_timer = NULL;
1187 if (it->wd->on_hold)
1189 it->wd->swipe = EINA_FALSE;
1190 it->wd->movements = 0;
1191 it->wd->on_hold = EINA_FALSE;
1196 _multi_up(void *data,
1197 Evas *evas __UNUSED__,
1198 Evas_Object *obj __UNUSED__,
1201 Elm_Gen_Item *it = data;
1202 Evas_Event_Multi_Up *ev = event_info;
1204 if (it->wd->multi_device != ev->device) return;
1205 it->wd->multi_device = 0;
1206 it->wd->multi_down = EINA_FALSE;
1207 if (it->wd->mouse_down) return;
1208 _multi_touch_gesture_eval(data);
1212 _multi_move(void *data,
1213 Evas *evas __UNUSED__,
1214 Evas_Object *obj __UNUSED__,
1217 Elm_Gen_Item *it = data;
1218 Evas_Event_Multi_Move *ev = event_info;
1220 if (it->wd->multi_device != ev->device) return;
1221 it->wd->cur_mx = ev->cur.canvas.x;
1222 it->wd->cur_my = ev->cur.canvas.y;
1226 _mouse_down(void *data,
1227 Evas *evas __UNUSED__,
1231 Elm_Gen_Item *it = data;
1232 Evas_Event_Mouse_Down *ev = event_info;
1235 if (ev->button != 1) return;
1236 if (ev->event_flags & EVAS_EVENT_FLAG_ON_HOLD)
1238 it->wd->on_hold = EINA_TRUE;
1241 it->down = EINA_TRUE;
1242 it->dragging = EINA_FALSE;
1243 evas_object_geometry_get(obj, &x, &y, NULL, NULL);
1244 it->dx = ev->canvas.x - x;
1245 it->dy = ev->canvas.y - y;
1246 it->wd->mouse_down = EINA_TRUE;
1247 if (!it->wd->multitouched)
1249 it->wd->prev_x = ev->canvas.x;
1250 it->wd->prev_y = ev->canvas.y;
1251 it->wd->multi_timeout = EINA_FALSE;
1252 if (it->wd->multi_timer) ecore_timer_del(it->wd->multi_timer);
1253 it->wd->multi_timer = ecore_timer_add(1, _multi_cancel, it->wd);
1255 it->wd->longpressed = EINA_FALSE;
1256 if (ev->event_flags & EVAS_EVENT_FLAG_ON_HOLD) it->wd->on_hold = EINA_TRUE;
1257 else it->wd->on_hold = EINA_FALSE;
1258 if (it->wd->on_hold) return;
1259 it->wd->wasselected = it->selected;
1260 _item_highlight(it);
1261 if (ev->flags & EVAS_BUTTON_DOUBLE_CLICK)
1262 if ((!elm_widget_item_disabled_get(it)) && (!it->display_only))
1264 evas_object_smart_callback_call(WIDGET(it), SIG_CLICKED_DOUBLE, it);
1265 evas_object_smart_callback_call(WIDGET(it), SIG_ACTIVATED, it);
1267 if (it->long_timer) ecore_timer_del(it->long_timer);
1268 if (it->item->swipe_timer) ecore_timer_del(it->item->swipe_timer);
1269 it->item->swipe_timer = ecore_timer_add(0.4, _swipe_cancel, it);
1271 it->long_timer = ecore_timer_add(it->wd->longpress_timeout, _long_press,
1274 it->long_timer = NULL;
1275 it->wd->swipe = EINA_FALSE;
1276 it->wd->movements = 0;
1280 _mouse_up(void *data,
1281 Evas *evas __UNUSED__,
1282 Evas_Object *obj __UNUSED__,
1285 Elm_Gen_Item *it = data;
1286 Evas_Event_Mouse_Up *ev = event_info;
1287 Eina_Bool dragged = EINA_FALSE;
1289 if (ev->button != 1) return;
1290 it->down = EINA_FALSE;
1291 it->wd->mouse_down = EINA_FALSE;
1292 if (it->wd->multitouched)
1294 if ((!it->wd->multi) && (!it->selected) && (it->highlighted)) _item_unhighlight(it);
1295 if (it->wd->multi_down) return;
1296 _multi_touch_gesture_eval(data);
1299 if (ev->event_flags & EVAS_EVENT_FLAG_ON_HOLD) it->wd->on_hold = EINA_TRUE;
1300 else it->wd->on_hold = EINA_FALSE;
1303 ecore_timer_del(it->long_timer);
1304 it->long_timer = NULL;
1308 it->dragging = EINA_FALSE;
1309 evas_object_smart_callback_call(WIDGET(it), SIG_DRAG_STOP, it);
1312 if (it->item->swipe_timer)
1314 ecore_timer_del(it->item->swipe_timer);
1315 it->item->swipe_timer = NULL;
1317 if (it->wd->multi_timer)
1319 ecore_timer_del(it->wd->multi_timer);
1320 it->wd->multi_timer = NULL;
1321 it->wd->multi_timeout = EINA_FALSE;
1323 if (it->wd->on_hold)
1325 if (it->wd->swipe) _swipe(data);
1326 it->wd->longpressed = EINA_FALSE;
1327 it->wd->on_hold = EINA_FALSE;
1330 if ((it->wd->reorder_mode) && (it->wd->reorder_it))
1332 Evas_Coord it_scrl_y = ev->canvas.y - it->wd->reorder_it->dy;
1334 if (it->wd->reorder_rel && (it->wd->reorder_it->parent == it->wd->reorder_rel->parent))
1336 if (it_scrl_y <= it->wd->reorder_rel->item->scrl_y)
1337 _item_move_before(it->wd->reorder_it, it->wd->reorder_rel);
1339 _item_move_after(it->wd->reorder_it, it->wd->reorder_rel);
1343 if (it->wd->calc_job) ecore_job_del(it->wd->calc_job);
1344 it->wd->calc_job = ecore_job_add(_calc_job, it->wd);
1346 edje_object_signal_emit(VIEW(it), "elm,state,reorder,disabled", "elm");
1347 it->wd->reorder_it = it->wd->reorder_rel = NULL;
1348 elm_smart_scroller_hold_set(it->wd->scr, EINA_FALSE);
1349 elm_smart_scroller_bounce_allow_set(it->wd->scr, it->wd->h_bounce, it->wd->v_bounce);
1351 if (it->wd->longpressed)
1353 it->wd->longpressed = EINA_FALSE;
1354 if (!it->wd->wasselected)
1356 _item_unhighlight(it);
1359 it->wd->wasselected = EINA_FALSE;
1364 if (it->want_unrealize)
1366 _elm_genlist_item_unrealize(it, EINA_FALSE);
1367 if (it->item->block->want_unrealize)
1368 _item_block_unrealize(it->item->block);
1371 if (elm_widget_item_disabled_get(it) || (dragged) || (it->display_only))
1373 if (ev->event_flags & EVAS_EVENT_FLAG_ON_HOLD) return;
1378 _item_highlight(it);
1383 _item_unhighlight(it);
1391 Widget_Data *wd = it->wd;
1394 while (wd->selected)
1396 _item_unhighlight(wd->selected->data);
1397 _item_unselect(wd->selected->data);
1403 const Eina_List *l, *l_next;
1406 EINA_LIST_FOREACH_SAFE(it->wd->selected, l, l_next, it2)
1409 _item_unhighlight(it2);
1410 _item_unselect(it2);
1412 //_item_highlight(it);
1415 _item_highlight(it);
1421 _signal_expand_toggle(void *data,
1422 Evas_Object *obj __UNUSED__,
1423 const char *emission __UNUSED__,
1424 const char *source __UNUSED__)
1426 Elm_Gen_Item *it = data;
1428 if (it->item->expanded)
1429 evas_object_smart_callback_call(WIDGET(it), SIG_CONTRACT_REQUEST, it);
1431 evas_object_smart_callback_call(WIDGET(it), SIG_EXPAND_REQUEST, it);
1435 _signal_expand(void *data,
1436 Evas_Object *obj __UNUSED__,
1437 const char *emission __UNUSED__,
1438 const char *source __UNUSED__)
1440 Elm_Gen_Item *it = data;
1442 if (!it->item->expanded)
1443 evas_object_smart_callback_call(WIDGET(it), SIG_EXPAND_REQUEST, it);
1447 _signal_contract(void *data,
1448 Evas_Object *obj __UNUSED__,
1449 const char *emission __UNUSED__,
1450 const char *source __UNUSED__)
1452 Elm_Gen_Item *it = data;
1454 if (it->item->expanded)
1455 evas_object_smart_callback_call(WIDGET(it), SIG_CONTRACT_REQUEST, it);
1459 _scr_hold_timer_cb(void *data)
1461 if (!data) return ECORE_CALLBACK_CANCEL;
1462 Widget_Data *wd = data;
1463 elm_smart_scroller_hold_set(wd->scr, EINA_FALSE);
1464 wd->scr_hold_timer = NULL;
1465 return ECORE_CALLBACK_CANCEL;
1469 _mode_finished_signal_cb(void *data,
1471 const char *emission __UNUSED__,
1472 const char *source __UNUSED__)
1476 Elm_Gen_Item *it = data;
1477 if ((it->generation < it->wd->generation) || (!it->realized) || (!it->item->mode_view)) return;
1479 Evas *te = evas_object_evas_get(obj);
1481 evas_event_freeze(te);
1482 it->item->nocache = EINA_FALSE;
1483 _mode_item_unrealize(it);
1484 if (it->item->group_item)
1485 evas_object_raise(it->item->VIEW(group_item));
1486 snprintf(buf, sizeof(buf), "elm,state,%s,passive,finished", it->wd->mode_type);
1487 edje_object_signal_callback_del_full(obj, buf, "elm", _mode_finished_signal_cb, it);
1488 evas_event_thaw(te);
1489 evas_event_thaw_eval(te);
1493 _item_cache_clean(Widget_Data *wd)
1495 evas_event_freeze(evas_object_evas_get(wd->obj));
1496 while ((wd->item_cache) && (wd->item_cache_count > wd->item_cache_max))
1500 itc = EINA_INLIST_CONTAINER_GET(wd->item_cache->last, Item_Cache);
1501 wd->item_cache = eina_inlist_remove(wd->item_cache,
1502 wd->item_cache->last);
1503 wd->item_cache_count--;
1504 if (itc->spacer) evas_object_del(itc->spacer);
1505 if (itc->base_view) evas_object_del(itc->base_view);
1506 if (itc->item_style) eina_stringshare_del(itc->item_style);
1509 evas_event_thaw(evas_object_evas_get(wd->obj));
1510 evas_event_thaw_eval(evas_object_evas_get(wd->obj));
1514 _item_cache_zero(Widget_Data *wd)
1516 int pmax = wd->item_cache_max;
1517 wd->item_cache_max = 0;
1518 _item_cache_clean(wd);
1519 wd->item_cache_max = pmax;
1523 _item_cache_add(Elm_Gen_Item *it)
1527 evas_event_freeze(evas_object_evas_get(it->wd->obj));
1528 if (it->wd->item_cache_max <= 0)
1530 evas_object_del(VIEW(it));
1532 evas_object_del(it->spacer);
1534 evas_event_thaw(evas_object_evas_get(it->wd->obj));
1535 evas_event_thaw_eval(evas_object_evas_get(it->wd->obj));
1539 it->wd->item_cache_count++;
1540 itc = calloc(1, sizeof(Item_Cache));
1543 evas_event_thaw(evas_object_evas_get(it->wd->obj));
1544 evas_event_thaw_eval(evas_object_evas_get(it->wd->obj));
1547 it->wd->item_cache = eina_inlist_prepend(it->wd->item_cache,
1548 EINA_INLIST_GET(itc));
1549 itc->spacer = it->spacer;
1551 itc->base_view = VIEW(it);
1553 edje_object_signal_emit(itc->base_view, "elm,state,unselected", "elm");
1554 evas_object_hide(itc->base_view);
1555 evas_object_move(itc->base_view, -9999, -9999);
1556 itc->item_style = eina_stringshare_add(it->itc->item_style);
1557 if (it->item->flags & ELM_GENLIST_ITEM_SUBITEMS) itc->tree = 1;
1558 itc->compress = (it->wd->compress);
1559 itc->selected = it->selected;
1560 itc->disabled = elm_widget_item_disabled_get(it);
1561 itc->expanded = it->item->expanded;
1564 ecore_timer_del(it->long_timer);
1565 it->long_timer = NULL;
1567 if (it->item->swipe_timer)
1569 ecore_timer_del(it->item->swipe_timer);
1570 it->item->swipe_timer = NULL;
1572 // FIXME: other callbacks?
1573 edje_object_signal_callback_del_full(itc->base_view,
1574 "elm,action,expand,toggle",
1575 "elm", _signal_expand_toggle, it);
1576 edje_object_signal_callback_del_full(itc->base_view, "elm,action,expand",
1578 _signal_expand, it);
1579 edje_object_signal_callback_del_full(itc->base_view, "elm,action,contract",
1580 "elm", _signal_contract, it);
1581 evas_object_event_callback_del_full(itc->base_view, EVAS_CALLBACK_MOUSE_DOWN,
1583 evas_object_event_callback_del_full(itc->base_view, EVAS_CALLBACK_MOUSE_UP,
1585 evas_object_event_callback_del_full(itc->base_view, EVAS_CALLBACK_MOUSE_MOVE,
1587 evas_object_event_callback_del_full(itc->base_view, EVAS_CALLBACK_MULTI_DOWN,
1589 evas_object_event_callback_del_full(itc->base_view, EVAS_CALLBACK_MULTI_UP,
1591 evas_object_event_callback_del_full(itc->base_view, EVAS_CALLBACK_MULTI_MOVE,
1593 _item_cache_clean(it->wd);
1594 evas_event_thaw(evas_object_evas_get(it->wd->obj));
1595 evas_event_thaw_eval(evas_object_evas_get(it->wd->obj));
1599 _item_cache_find(Elm_Gen_Item *it)
1604 if (it->item->flags & ELM_GENLIST_ITEM_SUBITEMS) tree = 1;
1605 EINA_INLIST_FOREACH(it->wd->item_cache, itc)
1607 if ((itc->selected) || (itc->disabled) || (itc->expanded))
1609 if ((itc->tree == tree) &&
1610 (itc->compress == it->wd->compress) &&
1611 (!strcmp(it->itc->item_style, itc->item_style)))
1613 it->wd->item_cache = eina_inlist_remove(it->wd->item_cache,
1614 EINA_INLIST_GET(itc));
1615 it->wd->item_cache_count--;
1623 _elm_genlist_item_index_update(Elm_Gen_Item *it)
1625 if (it->position_update || it->item->block->position_update)
1627 evas_object_smart_callback_call(WIDGET(it), SIG_INDEX_UPDATE, it);
1628 it->position_update = EINA_FALSE;
1633 _elm_genlist_item_odd_even_update(Elm_Gen_Item *it)
1635 if (!it->item->nostacking)
1637 if ((it->item->order_num_in & 0x1) ^ it->item->stacking_even)
1639 if (it->edit_obj) evas_object_lower(it->edit_obj);
1640 else evas_object_lower(VIEW(it));
1644 if (it->edit_obj) evas_object_raise(it->edit_obj);
1645 else evas_object_raise(VIEW(it));
1649 if (it->item->order_num_in & 0x1)
1651 edje_object_signal_emit(VIEW(it), "elm,state,odd", "elm");
1652 if (it->edit_obj) edje_object_signal_emit(it->edit_obj, "elm,state,odd", "elm");
1656 edje_object_signal_emit(VIEW(it), "elm,state,even", "elm");
1657 if (it->edit_obj) edje_object_signal_emit(it->edit_obj, "elm,state,even", "elm");
1662 _elm_genlist_item_state_update(Elm_Gen_Item *it, Item_Cache *itc)
1666 if (it->selected != itc->selected)
1669 edje_object_signal_emit(VIEW(it),
1670 "elm,state,selected", "elm");
1673 edje_object_signal_emit(it->edit_obj,
1674 "elm,state,selected", "elm");
1676 if (elm_widget_item_disabled_get(it) != itc->disabled)
1678 if (elm_widget_item_disabled_get(it))
1679 edje_object_signal_emit(VIEW(it),
1680 "elm,state,disabled", "elm");
1682 edje_object_signal_emit(it->edit_obj,
1683 "elm,state,disabled", "elm");
1685 if (it->item->expanded != itc->expanded)
1687 if (it->item->expanded)
1688 edje_object_signal_emit(VIEW(it),
1689 "elm,state,expanded", "elm");
1691 edje_object_signal_emit(it->edit_obj,
1692 "elm,state,expanded", "elm");
1699 edje_object_signal_emit(VIEW(it),
1700 "elm,state,selected", "elm");
1702 edje_object_signal_emit(it->edit_obj,
1703 "elm,state,selected", "elm");
1706 if (elm_widget_item_disabled_get(it))
1708 edje_object_signal_emit(VIEW(it),
1709 "elm,state,disabled", "elm");
1711 edje_object_signal_emit(it->edit_obj,
1712 "elm,state,disabled", "elm");
1714 if (it->item->expanded)
1716 edje_object_signal_emit(VIEW(it),
1717 "elm,state,expanded", "elm");
1719 edje_object_signal_emit(it->edit_obj,
1720 "elm,state,expanded", "elm");
1726 _item_cache_free(Item_Cache *itc)
1728 if (itc->spacer) evas_object_del(itc->spacer);
1729 if (itc->base_view) evas_object_del(itc->base_view);
1730 if (itc->item_style) eina_stringshare_del(itc->item_style);
1735 _item_text_realize(Elm_Gen_Item *it,
1736 Evas_Object *target,
1740 if (it->itc->func.text_get)
1745 *source = elm_widget_stringlist_get(edje_object_data_get(target, "texts"));
1746 EINA_LIST_FOREACH(*source, l, key)
1748 if (parts && fnmatch(parts, key, FNM_PERIOD))
1751 char *s = it->itc->func.text_get
1752 ((void *)it->base.data, WIDGET(it), key);
1756 edje_object_part_text_set(target, key, s);
1761 edje_object_part_text_set(target, key, "");
1768 _item_content_unrealize(Elm_Gen_Item *it,
1769 Evas_Object *target,
1773 Eina_List *res = it->content_objs;
1775 if (it->itc->func.content_get)
1779 Evas_Object *ic = NULL;
1781 EINA_LIST_FOREACH(*source, l, key)
1783 if (parts && fnmatch(parts, key, FNM_PERIOD))
1786 ic = edje_object_part_swallow_get(target, key);
1789 res = eina_list_remove(res, ic);
1790 edje_object_part_unswallow(target, ic);
1791 evas_object_del(ic);
1800 _item_content_realize(Elm_Gen_Item *it,
1801 Evas_Object *target,
1805 Eina_List *res = NULL;
1807 if (it->itc->func.content_get)
1811 Evas_Object *ic = NULL;
1813 *source = elm_widget_stringlist_get(edje_object_data_get(target, "contents"));
1815 if (parts && (eina_list_count(*source) != eina_list_count(it->content_objs)))
1816 res = it->content_objs;
1818 EINA_LIST_FOREACH(*source, l, key)
1820 if (parts && fnmatch(parts, key, FNM_PERIOD))
1823 if (it->itc->func.content_get)
1824 ic = it->itc->func.content_get
1825 ((void *)it->base.data, WIDGET(it), key);
1828 res = eina_list_append(res, ic);
1829 edje_object_part_swallow(target, key, ic);
1830 evas_object_show(ic);
1831 elm_widget_sub_object_add(WIDGET(it), ic);
1832 if (elm_widget_item_disabled_get(it))
1833 elm_widget_disabled_set(ic, EINA_TRUE);
1842 _item_state_realize(Elm_Gen_Item *it,
1843 Evas_Object *target,
1847 if (it->itc->func.state_get)
1853 *source = elm_widget_stringlist_get(edje_object_data_get(target, "states"));
1854 EINA_LIST_FOREACH(*source, l, key)
1856 if (parts && fnmatch(parts, key, FNM_PERIOD))
1859 Eina_Bool on = it->itc->func.state_get
1860 ((void *)it->base.data, WIDGET(it), key);
1864 snprintf(buf, sizeof(buf), "elm,state,%s,active", key);
1865 edje_object_signal_emit(target, buf, "elm");
1869 snprintf(buf, sizeof(buf), "elm,state,%s,passive", key);
1870 edje_object_signal_emit(target, buf, "elm");
1877 _item_realize(Elm_Gen_Item *it,
1881 const char *treesize;
1884 Item_Cache *itc = NULL;
1886 if (it->generation < it->wd->generation) return;
1887 //evas_event_freeze(evas_object_evas_get(it->wd->obj));
1890 if (it->item->order_num_in != in)
1892 it->item->order_num_in = in;
1893 _elm_genlist_item_odd_even_update(it);
1894 _elm_genlist_item_state_update(it, NULL);
1895 _elm_genlist_item_index_update(it);
1897 //evas_event_thaw(evas_object_evas_get(it->wd->obj));
1898 //evas_event_thaw_eval(evas_object_evas_get(it->wd->obj));
1901 it->item->order_num_in = in;
1903 if (it->item->nocache)
1904 it->item->nocache = EINA_FALSE;
1906 itc = _item_cache_find(it);
1909 VIEW(it) = itc->base_view;
1910 itc->base_view = NULL;
1911 it->spacer = itc->spacer;
1916 const char *stacking_even;
1917 const char *stacking;
1919 VIEW(it) = edje_object_add(evas_object_evas_get(WIDGET(it)));
1920 edje_object_scale_set(VIEW(it),
1921 elm_widget_scale_get(WIDGET(it)) *
1922 _elm_config->scale);
1923 evas_object_smart_member_add(VIEW(it), it->wd->pan_smart);
1924 elm_widget_sub_object_add(WIDGET(it), VIEW(it));
1926 if (it->item->flags & ELM_GENLIST_ITEM_SUBITEMS)
1927 strncpy(buf, "tree", sizeof(buf));
1928 else strncpy(buf, "item", sizeof(buf));
1929 if (it->wd->compress)
1930 strncat(buf, "_compress", sizeof(buf) - strlen(buf));
1932 strncat(buf, "/", sizeof(buf) - strlen(buf));
1933 strncat(buf, it->itc->item_style, sizeof(buf) - strlen(buf));
1935 _elm_theme_object_set(WIDGET(it), VIEW(it), "genlist", buf,
1936 elm_widget_style_get(WIDGET(it)));
1938 stacking_even = edje_object_data_get(VIEW(it), "stacking_even");
1939 if (!stacking_even) stacking_even = "above";
1940 it->item->stacking_even = !!strcmp("above", stacking_even);
1942 stacking = edje_object_data_get(VIEW(it), "stacking");
1943 if (!stacking) stacking = "yes";
1944 it->item->nostacking = !!strcmp("yes", stacking);
1946 edje_object_mirrored_set(VIEW(it),
1947 elm_widget_mirrored_get(WIDGET(it)));
1949 evas_object_rectangle_add(evas_object_evas_get(WIDGET(it)));
1950 evas_object_color_set(it->spacer, 0, 0, 0, 0);
1951 elm_widget_sub_object_add(WIDGET(it), it->spacer);
1954 _elm_genlist_item_odd_even_update(it);
1956 treesize = edje_object_data_get(VIEW(it), "treesize");
1957 if (treesize) tsize = atoi(treesize);
1958 evas_object_size_hint_min_set(it->spacer,
1959 (it->item->expanded_depth * tsize) * _elm_config->scale, 1);
1960 edje_object_part_swallow(VIEW(it), "elm.swallow.pad", it->spacer);
1963 edje_object_signal_callback_add(VIEW(it),
1964 "elm,action,expand,toggle",
1965 "elm", _signal_expand_toggle, it);
1966 edje_object_signal_callback_add(VIEW(it), "elm,action,expand",
1967 "elm", _signal_expand, it);
1968 edje_object_signal_callback_add(VIEW(it), "elm,action,contract",
1969 "elm", _signal_contract, it);
1970 evas_object_event_callback_add(VIEW(it), EVAS_CALLBACK_MOUSE_DOWN,
1972 evas_object_event_callback_add(VIEW(it), EVAS_CALLBACK_MOUSE_UP,
1974 evas_object_event_callback_add(VIEW(it), EVAS_CALLBACK_MOUSE_MOVE,
1976 evas_object_event_callback_add(VIEW(it), EVAS_CALLBACK_MULTI_DOWN,
1978 evas_object_event_callback_add(VIEW(it), EVAS_CALLBACK_MULTI_UP,
1980 evas_object_event_callback_add(VIEW(it), EVAS_CALLBACK_MULTI_MOVE,
1983 if ((it->wd->edit_mode) && (!it->edit_obj) &&
1984 (it->item->flags != ELM_GENLIST_ITEM_GROUP) && (it->itc->edit_item_style))
1985 _edit_mode_item_realize(it, EINA_FALSE);
1987 _elm_genlist_item_state_update(it, itc);
1988 _elm_genlist_item_index_update(it);
1991 if ((calc) && (it->wd->homogeneous) &&
1992 ((it->wd->item_width) ||
1993 ((it->wd->item_width) && (it->wd->group_item_width))))
1995 /* homogenous genlist shortcut */
1996 if (!it->item->mincalcd)
2000 it->item->w = it->item->minw = it->wd->group_item_width;
2001 it->item->h = it->item->minh = it->wd->group_item_height;
2005 it->item->w = it->item->minw = it->wd->item_width;
2006 it->item->h = it->item->minh = it->wd->item_height;
2008 it->item->mincalcd = EINA_TRUE;
2013 /* FIXME: If you see that assert, please notify us and we
2014 will clean our mess */
2015 assert(eina_list_count(it->content_objs) == 0);
2017 _item_text_realize(it, VIEW(it), &it->texts, NULL);
2018 it->content_objs = _item_content_realize(it, VIEW(it), &it->contents, NULL);
2019 _item_state_realize(it, VIEW(it), &it->states, NULL);
2021 if (!it->item->mincalcd)
2023 Evas_Coord mw = -1, mh = -1;
2025 if (!it->display_only)
2026 elm_coords_finger_size_adjust(1, &mw, 1, &mh);
2027 if (it->wd->height_for_width) mw = it->wd->prev_viewport_w;
2028 edje_object_size_min_restricted_calc(VIEW(it), &mw, &mh, mw,
2030 if (!it->display_only)
2031 elm_coords_finger_size_adjust(1, &mw, 1, &mh);
2032 it->item->w = it->item->minw = mw;
2033 it->item->h = it->item->minh = mh;
2034 it->item->mincalcd = EINA_TRUE;
2036 if ((!it->wd->group_item_width) && (it->group))
2038 it->wd->group_item_width = mw;
2039 it->wd->group_item_height = mh;
2041 else if ((!it->wd->item_width) && (it->item->flags == ELM_GENLIST_ITEM_NONE))
2043 it->wd->item_width = mw;
2044 it->wd->item_height = mh;
2047 if (!calc) evas_object_show(VIEW(it));
2050 if (it->tooltip.content_cb)
2052 elm_widget_item_tooltip_content_cb_set(it,
2053 it->tooltip.content_cb,
2054 it->tooltip.data, NULL);
2055 elm_widget_item_tooltip_style_set(it, it->tooltip.style);
2056 elm_widget_item_tooltip_window_mode_set(it, it->tooltip.free_size);
2059 if (it->mouse_cursor)
2060 elm_widget_item_cursor_set(it, it->mouse_cursor);
2062 it->realized = EINA_TRUE;
2063 it->want_unrealize = EINA_FALSE;
2065 if (itc) _item_cache_free(itc);
2066 //evas_event_thaw(evas_object_evas_get(it->wd->obj));
2067 //evas_event_thaw_eval(evas_object_evas_get(it->wd->obj));
2069 evas_object_smart_callback_call(WIDGET(it), SIG_REALIZED, it);
2071 if ((!calc) && (it->wd->edit_mode) && (it->item->flags != ELM_GENLIST_ITEM_GROUP))
2073 if (it->itc->edit_item_style)
2075 if (!it->edit_obj) _edit_mode_item_realize(it, EINA_FALSE);
2076 edje_object_message_signal_process(it->edit_obj);
2079 edje_object_message_signal_process(VIEW(it));
2083 _item_unrealize_cb(Elm_Gen_Item *it)
2085 if (it->item->nocache)
2087 evas_object_del(VIEW(it));
2089 evas_object_del(it->spacer);
2094 edje_object_mirrored_set(VIEW(it),
2095 elm_widget_mirrored_get(WIDGET(it)));
2096 edje_object_scale_set(VIEW(it),
2097 elm_widget_scale_get(WIDGET(it))
2098 * _elm_config->scale);
2099 _item_cache_add(it);
2102 _mode_item_unrealize(it);
2104 it->realized = EINA_FALSE;
2105 it->want_unrealize = EINA_FALSE;
2106 if (it->wd->edit_mode) _edit_mode_item_unrealize(it);
2110 _item_block_recalc(Item_Block *itb,
2116 Evas_Coord minw = 0, minh = 0;
2117 Eina_Bool showme = EINA_FALSE, changed = EINA_FALSE;
2120 //evas_event_freeze(evas_object_evas_get(itb->wd->obj));
2122 EINA_LIST_FOREACH(itb->items, l, it)
2124 if (it->generation < it->wd->generation) continue;
2125 showme |= it->item->showme;
2130 if (!it->item->mincalcd) changed = EINA_TRUE;
2133 _item_realize(it, in, EINA_TRUE);
2134 _elm_genlist_item_unrealize(it, EINA_TRUE);
2139 _item_realize(it, in, EINA_TRUE);
2140 _elm_genlist_item_unrealize(it, EINA_TRUE);
2144 _item_realize(it, in, EINA_FALSE);
2145 minh += it->item->minh;
2146 if (minw < it->item->minw) minw = it->item->minw;
2154 itb->changed = EINA_FALSE;
2155 itb->position_update = EINA_FALSE;
2156 //evas_event_thaw(evas_object_evas_get(itb->wd->obj));
2157 //evas_event_thaw_eval(evas_object_evas_get(itb->wd->obj));
2162 _item_block_realize(Item_Block *itb)
2164 if (itb->realized) return;
2165 itb->realized = EINA_TRUE;
2166 itb->want_unrealize = EINA_FALSE;
2170 _item_block_unrealize(Item_Block *itb)
2174 Eina_Bool dragging = EINA_FALSE;
2176 if (!itb->realized) return;
2177 evas_event_freeze(evas_object_evas_get(itb->wd->obj));
2178 EINA_LIST_FOREACH(itb->items, l, it)
2180 if (itb->must_recalc || !it->group)
2184 dragging = EINA_TRUE;
2185 it->want_unrealize = EINA_TRUE;
2188 _elm_genlist_item_unrealize(it, EINA_FALSE);
2193 itb->realized = EINA_FALSE;
2194 itb->want_unrealize = EINA_TRUE;
2197 itb->want_unrealize = EINA_FALSE;
2198 evas_event_thaw(evas_object_evas_get(itb->wd->obj));
2199 evas_event_thaw_eval(evas_object_evas_get(itb->wd->obj));
2203 _get_space_for_reorder_item(Elm_Gen_Item *it)
2205 Evas_Coord rox, roy, row, roh, oy, oh;
2206 Eina_Bool top = EINA_FALSE;
2207 Elm_Gen_Item *reorder_it = it->wd->reorder_it;
2208 if (!reorder_it) return 0;
2210 evas_object_geometry_get(it->wd->pan_smart, NULL, &oy, NULL, &oh);
2211 evas_object_geometry_get(it->wd->VIEW(reorder_it), &rox, &roy, &row, &roh);
2213 if ((it->wd->reorder_start_y < it->item->block->y) &&
2214 (roy - oy + (roh / 2) >= it->item->block->y - it->wd->pan_y))
2216 it->item->block->reorder_offset = it->wd->reorder_it->item->h * -1;
2217 if (it->item->block->count == 1)
2218 it->wd->reorder_rel = it;
2220 else if ((it->wd->reorder_start_y >= it->item->block->y) &&
2221 (roy - oy + (roh / 2) <= it->item->block->y - it->wd->pan_y))
2223 it->item->block->reorder_offset = it->wd->reorder_it->item->h;
2226 it->item->block->reorder_offset = 0;
2228 it->item->scrl_y += it->item->block->reorder_offset;
2230 top = (ELM_RECTS_INTERSECT(it->item->scrl_x, it->item->scrl_y, it->item->w, it->item->h,
2231 rox, roy + (roh / 2), row, 1));
2234 it->wd->reorder_rel = it;
2235 it->item->scrl_y += it->wd->reorder_it->item->h;
2236 return it->wd->reorder_it->item->h;
2243 _reorder_move_animator_cb(void *data)
2245 Elm_Gen_Item *it = data;
2246 Eina_Bool down = EINA_FALSE;
2248 int y, dy = it->item->h / 10 * _elm_config->scale, diff;
2250 t = ((0.0 > (t = ecore_loop_time_get()-it->wd->start_time)) ? 0.0 : t);
2252 if (t <= REORDER_EFFECT_TIME) y = (1 * sin((t / REORDER_EFFECT_TIME) * (M_PI / 2)) * dy);
2255 diff = abs(it->item->old_scrl_y - it->item->scrl_y);
2256 if (diff > it->item->h) y = diff / 2;
2258 if (it->item->old_scrl_y < it->item->scrl_y)
2260 it->item->old_scrl_y += y;
2263 else if (it->item->old_scrl_y > it->item->scrl_y)
2265 it->item->old_scrl_y -= y;
2270 _item_position(it, it->edit_obj, it->item->scrl_x, it->item->old_scrl_y);
2272 _item_position(it, VIEW(it), it->item->scrl_x, it->item->old_scrl_y);
2273 _group_items_recalc(it->wd);
2275 if ((it->wd->reorder_pan_move) ||
2276 (down && it->item->old_scrl_y >= it->item->scrl_y) ||
2277 (!down && it->item->old_scrl_y <= it->item->scrl_y))
2279 it->item->old_scrl_y = it->item->scrl_y;
2280 it->item->move_effect_enabled = EINA_FALSE;
2281 it->wd->reorder_move_animator = NULL;
2282 return ECORE_CALLBACK_CANCEL;
2284 return ECORE_CALLBACK_RENEW;
2288 _item_position(Elm_Gen_Item *it,
2296 evas_event_freeze(evas_object_evas_get(it->wd->obj));
2297 evas_object_resize(view, it->item->w, it->item->h);
2298 evas_object_move(view, it_x, it_y);
2299 evas_object_show(view);
2300 evas_event_thaw(evas_object_evas_get(it->wd->obj));
2301 evas_event_thaw_eval(evas_object_evas_get(it->wd->obj));
2305 _item_block_position(Item_Block *itb,
2311 Evas_Coord y = 0, ox, oy, ow, oh, cvx, cvy, cvw, cvh;
2312 Eina_Bool vis = EINA_FALSE;
2314 evas_event_freeze(evas_object_evas_get(itb->wd->obj));
2315 evas_object_geometry_get(itb->wd->pan_smart, &ox, &oy, &ow, &oh);
2316 evas_output_viewport_get(evas_object_evas_get(itb->wd->obj), &cvx, &cvy,
2318 EINA_LIST_FOREACH(itb->items, l, it)
2320 if (it->generation < it->wd->generation) continue;
2321 else if (it->wd->reorder_it == it) continue;
2324 it->item->w = itb->w;
2325 it->item->scrl_x = itb->x + it->x - it->wd->pan_x + ox;
2326 it->item->scrl_y = itb->y + it->y - it->wd->pan_y + oy;
2328 vis = (ELM_RECTS_INTERSECT(it->item->scrl_x, it->item->scrl_y, it->item->w, it->item->h,
2329 cvx, cvy, cvw, cvh));
2332 if ((itb->realized) && (!it->realized))
2334 if (vis) _item_realize(it, in, EINA_FALSE);
2340 if (it->wd->reorder_mode)
2341 y += _get_space_for_reorder_item(it);
2342 git = it->item->group_item;
2345 if (git->item->scrl_y < oy)
2346 git->item->scrl_y = oy;
2347 if ((git->item->scrl_y + git->item->h) > (it->item->scrl_y + it->item->h))
2348 git->item->scrl_y = (it->item->scrl_y + it->item->h) - git->item->h;
2349 git->item->want_realize = EINA_TRUE;
2351 if ((it->wd->reorder_it) && (it->item->old_scrl_y != it->item->scrl_y))
2353 if (!it->item->move_effect_enabled)
2355 it->item->move_effect_enabled = EINA_TRUE;
2356 it->wd->reorder_move_animator =
2358 _reorder_move_animator_cb, it);
2361 if (!it->item->move_effect_enabled)
2363 if ((it->wd->edit_mode) && (it->itc->edit_item_style))
2364 _edit_mode_item_position(it, it->item->scrl_x,
2368 if (it->item->mode_view)
2369 _item_position(it, it->item->mode_view,
2373 _item_position(it, VIEW(it), it->item->scrl_x,
2376 it->item->old_scrl_y = it->item->scrl_y;
2381 if (!it->dragging) _elm_genlist_item_unrealize(it, EINA_FALSE);
2388 if (vis) it->item->want_realize = EINA_TRUE;
2392 evas_event_thaw(evas_object_evas_get(itb->wd->obj));
2393 evas_event_thaw_eval(evas_object_evas_get(itb->wd->obj));
2397 _group_items_recalc(void *data)
2399 Widget_Data *wd = data;
2403 evas_event_freeze(evas_object_evas_get(wd->obj));
2404 EINA_LIST_FOREACH(wd->group_items, l, git)
2406 if (git->item->want_realize)
2409 _item_realize(git, 0, EINA_FALSE);
2410 evas_object_resize(VIEW(git), wd->minw, git->item->h);
2411 evas_object_move(VIEW(git), git->item->scrl_x, git->item->scrl_y);
2412 evas_object_show(VIEW(git));
2413 evas_object_raise(VIEW(git));
2415 else if (!git->item->want_realize && git->realized)
2418 _elm_genlist_item_unrealize(git, EINA_FALSE);
2421 evas_event_thaw(evas_object_evas_get(wd->obj));
2422 evas_event_thaw_eval(evas_object_evas_get(wd->obj));
2426 _must_recalc_idler(void *data)
2428 Widget_Data *wd = data;
2429 if (wd->calc_job) ecore_job_del(wd->calc_job);
2430 wd->calc_job = ecore_job_add(_calc_job, wd);
2431 wd->must_recalc_idler = NULL;
2432 return ECORE_CALLBACK_CANCEL;
2436 _scroll_item(Widget_Data *wd)
2438 Elm_Gen_Item *it = NULL;
2439 Evas_Coord gith = 0;
2440 Evas_Coord ow, oh, dx = 0, dy = 0, dw = 0, dh = 0;
2442 evas_object_geometry_get(wd->pan_smart, NULL, NULL, &ow, &oh);
2444 dx = it->x + it->item->block->x;
2445 dy = it->y + it->item->block->y;
2446 dw = it->item->block->w;
2448 switch (wd->scrollto_type)
2450 case ELM_GENLIST_ITEM_SCROLLTO_TOP:
2451 if (it->item->group_item) gith = it->item->group_item->item->h;
2454 case ELM_GENLIST_ITEM_SCROLLTO_MIDDLE:
2455 dy += (it->item->h / 2 - oh / 2);
2457 case ELM_GENLIST_ITEM_SCROLLTO_IN:
2459 if ((wd->expanded_item) &&
2460 ((wd->show_item->y + wd->show_item->item->block->y + wd->show_item->item->h)
2461 - (wd->expanded_item->y + wd->expanded_item->item->block->y) > oh))
2463 it = wd->expanded_item;
2464 if (it->item->group_item) gith = it->item->group_item->item->h;
2465 dx = it->x + it->item->block->x;
2466 dy = it->y + it->item->block->y - gith;
2467 dw = it->item->block->w;
2471 if ((it->item->group_item) && (wd->pan_y > (it->y + it->item->block->y)))
2472 gith = it->item->group_item->item->h;
2479 elm_smart_scroller_region_bring_in(wd->scr, dx, dy, dw, dh);
2481 elm_smart_scroller_child_region_show(wd->scr, dx, dy, dw, dh);
2483 it->item->showme = EINA_FALSE;
2484 wd->show_item = NULL;
2485 wd->auto_scroll_enabled = EINA_FALSE;
2486 wd->check_scroll = EINA_FALSE;
2490 _calc_job(void *data)
2492 Widget_Data *wd = data;
2493 Item_Block *itb, *chb = NULL;
2494 Evas_Coord minw = -1, minh = 0, y = 0, ow, dy = 0, vw;
2495 Evas_Coord pan_w = 0, pan_h = 0;
2497 Eina_Bool minw_change = EINA_FALSE;
2498 Eina_Bool did_must_recalc = EINA_FALSE;
2501 evas_object_geometry_get(wd->pan_smart, NULL, NULL, &ow, &wd->h);
2502 elm_smart_scroller_child_viewport_size_get(wd->scr, &vw, NULL);
2507 evas_event_freeze(evas_object_evas_get(wd->obj));
2508 EINA_INLIST_FOREACH(wd->blocks, itb)
2510 Eina_Bool showme = EINA_FALSE;
2513 showme = itb->showme;
2514 itb->showme = EINA_FALSE;
2517 if (itb->realized) _item_block_unrealize(itb);
2519 if ((itb->changed) || ((itb->must_recalc) && (!did_must_recalc)))
2521 if (itb->must_recalc)
2525 EINA_LIST_FOREACH(itb->items, l, it)
2526 if (it->item->mincalcd) it->item->mincalcd = EINA_FALSE;
2527 itb->changed = EINA_TRUE;
2528 if (itb->must_recalc) did_must_recalc = EINA_TRUE;
2529 if (itb->realized) _item_block_unrealize(itb);
2530 itb->must_recalc = EINA_FALSE;
2532 showme = _item_block_recalc(itb, in, EINA_FALSE);
2538 if (minw == -1) minw = itb->minw;
2539 else if ((!itb->must_recalc) && (minw < itb->minw))
2542 minw_change = EINA_TRUE;
2547 minw_change = EINA_TRUE;
2553 if ((showme) && (wd->show_item) && (!wd->show_item->item->queued))
2554 wd->check_scroll = EINA_TRUE;
2558 EINA_INLIST_FOREACH(wd->blocks, itb)
2564 if ((chb) && (EINA_INLIST_GET(chb)->next))
2566 EINA_INLIST_FOREACH(EINA_INLIST_GET(chb)->next, itb)
2568 if (itb->realized) _item_block_unrealize(itb);
2571 wd->realminw = minw;
2572 if (minw < wd->w) minw = wd->w;
2573 if ((minw != wd->minw) || (minh != wd->minh))
2577 evas_object_smart_callback_call(wd->pan_smart, "changed", NULL);
2578 _sizing_eval(wd->obj);
2579 if ((wd->anchor_item) && (wd->anchor_item->item->block) && (!wd->auto_scroll_enabled))
2584 it = wd->anchor_item;
2585 it_y = wd->anchor_y;
2586 elm_smart_scroller_child_pos_set(wd->scr, wd->pan_x,
2587 it->item->block->y + it->y + it_y);
2588 wd->anchor_item = it;
2589 wd->anchor_y = it_y;
2592 if (did_must_recalc)
2594 if (!wd->must_recalc_idler)
2595 wd->must_recalc_idler = ecore_idler_add(_must_recalc_idler, wd);
2597 if (wd->check_scroll)
2599 _pan_child_size_get(wd->pan_smart, &pan_w, &pan_h);
2600 if (EINA_INLIST_GET(wd->show_item) == wd->items->last)
2601 wd->scrollto_type = ELM_GENLIST_ITEM_SCROLLTO_IN;
2602 switch (wd->scrollto_type)
2604 case ELM_GENLIST_ITEM_SCROLLTO_TOP:
2607 case ELM_GENLIST_ITEM_SCROLLTO_MIDDLE:
2610 case ELM_GENLIST_ITEM_SCROLLTO_IN:
2615 if ((pan_w > (wd->show_item->x + wd->show_item->item->block->x)) &&
2616 (pan_h > (wd->show_item->y + wd->show_item->item->block->y + dy)))
2621 wd->calc_job = NULL;
2622 evas_object_smart_changed(wd->pan_smart);
2623 evas_event_thaw(evas_object_evas_get(wd->obj));
2624 evas_event_thaw_eval(evas_object_evas_get(wd->obj));
2628 _update_job(void *data)
2630 Widget_Data *wd = data;
2634 Eina_Bool position = EINA_FALSE, recalc = EINA_FALSE;
2636 wd->update_job = NULL;
2639 evas_event_freeze(evas_object_evas_get(wd->obj));
2640 EINA_INLIST_FOREACH(wd->blocks, itb)
2642 Evas_Coord itminw, itminh;
2649 _item_block_position(itb, num);
2653 recalc = EINA_FALSE;
2654 EINA_LIST_FOREACH(itb->items, l2, it)
2656 if (it->item->updateme)
2658 itminw = it->item->minw;
2659 itminh = it->item->minh;
2661 it->item->updateme = EINA_FALSE;
2664 _elm_genlist_item_unrealize(it, EINA_FALSE);
2665 _item_realize(it, num, EINA_FALSE);
2666 position = EINA_TRUE;
2670 _item_realize(it, num, EINA_TRUE);
2671 _elm_genlist_item_unrealize(it, EINA_TRUE);
2673 if ((it->item->minw != itminw) || (it->item->minh != itminh))
2678 itb->updateme = EINA_FALSE;
2681 position = EINA_TRUE;
2682 itb->changed = EINA_TRUE;
2683 _item_block_recalc(itb, num0, EINA_FALSE);
2684 _item_block_position(itb, num0);
2689 if (wd->calc_job) ecore_job_del(wd->calc_job);
2690 wd->calc_job = ecore_job_add(_calc_job, wd);
2692 evas_event_thaw(evas_object_evas_get(wd->obj));
2693 evas_event_thaw_eval(evas_object_evas_get(wd->obj));
2697 _pan_set(Evas_Object *obj,
2701 Pan *sd = evas_object_smart_data_get(obj);
2705 // Evas_Coord ow, oh;
2706 // evas_object_geometry_get(obj, NULL, NULL, &ow, &oh);
2707 // ow = sd->wd->minw - ow;
2708 // if (ow < 0) ow = 0;
2709 // oh = sd->wd->minh - oh;
2710 // if (oh < 0) oh = 0;
2711 // if (x < 0) x = 0;
2712 // if (y < 0) y = 0;
2713 // if (x > ow) x = ow;
2714 // if (y > oh) y = oh;
2715 if ((x == sd->wd->pan_x) && (y == sd->wd->pan_y)) return;
2719 EINA_INLIST_FOREACH(sd->wd->blocks, itb)
2721 if ((itb->y + itb->h) > y)
2726 EINA_LIST_FOREACH(itb->items, l2, it)
2728 if ((itb->y + it->y) >= y)
2730 sd->wd->anchor_item = it;
2731 sd->wd->anchor_y = -(itb->y + it->y - y);
2738 if (!sd->wd->reorder_move_animator) evas_object_smart_changed(obj);
2742 _pan_get(Evas_Object *obj,
2746 Pan *sd = evas_object_smart_data_get(obj);
2749 if (x) *x = sd->wd->pan_x;
2750 if (y) *y = sd->wd->pan_y;
2754 _pan_max_get(Evas_Object *obj,
2758 Pan *sd = evas_object_smart_data_get(obj);
2762 evas_object_geometry_get(obj, NULL, NULL, &ow, &oh);
2763 ow = sd->wd->minw - ow;
2765 oh = sd->wd->minh - oh;
2772 _pan_min_get(Evas_Object *obj __UNUSED__,
2781 _pan_child_size_get(Evas_Object *obj,
2785 Pan *sd = evas_object_smart_data_get(obj);
2788 if (w) *w = sd->wd->minw;
2789 if (h) *h = sd->wd->minh;
2793 _pan_add(Evas_Object *obj)
2796 Evas_Object_Smart_Clipped_Data *cd;
2799 cd = evas_object_smart_data_get(obj);
2802 sd->__clipped_data = *cd;
2804 evas_object_smart_data_set(obj, sd);
2808 _pan_del(Evas_Object *obj)
2810 Pan *sd = evas_object_smart_data_get(obj);
2815 ecore_job_del(sd->resize_job);
2816 sd->resize_job = NULL;
2822 _pan_resize_job(void *data)
2826 _sizing_eval(sd->wd->obj);
2827 sd->resize_job = NULL;
2831 _pan_resize(Evas_Object *obj,
2835 Pan *sd = evas_object_smart_data_get(obj);
2839 evas_object_geometry_get(obj, NULL, NULL, &ow, &oh);
2840 if ((ow == w) && (oh == h)) return;
2841 if ((sd->wd->height_for_width) && (ow != w))
2844 if (sd->resize_job) ecore_job_del(sd->resize_job);
2845 sd->resize_job = ecore_job_add(_pan_resize_job, sd);
2847 sd->wd->pan_changed = EINA_TRUE;
2848 evas_object_smart_changed(obj);
2849 if (sd->wd->calc_job) ecore_job_del(sd->wd->calc_job);
2850 sd->wd->calc_job = NULL;
2852 if (sd->wd->calc_job) ecore_job_del(sd->wd->calc_job);
2853 sd->wd->calc_job = ecore_job_add(_calc_job, sd->wd);
2858 _pan_calculate(Evas_Object *obj)
2860 Pan *sd = evas_object_smart_data_get(obj);
2862 Evas_Coord ox, oy, ow, oh, cvx, cvy, cvw, cvh;
2868 evas_event_freeze(evas_object_evas_get(obj));
2870 if (sd->wd->pan_changed)
2873 sd->wd->pan_changed = EINA_FALSE;
2876 evas_object_geometry_get(obj, &ox, &oy, &ow, &oh);
2877 evas_output_viewport_get(evas_object_evas_get(obj), &cvx, &cvy, &cvw, &cvh);
2878 EINA_LIST_FOREACH(sd->wd->group_items, l, git)
2880 git->item->want_realize = EINA_FALSE;
2882 EINA_INLIST_FOREACH(sd->wd->blocks, itb)
2884 itb->w = sd->wd->minw;
2885 if (ELM_RECTS_INTERSECT(itb->x - sd->wd->pan_x + ox,
2886 itb->y - sd->wd->pan_y + oy,
2888 cvx, cvy, cvw, cvh))
2890 if ((!itb->realized) || (itb->changed))
2891 _item_block_realize(itb);
2892 _item_block_position(itb, in);
2896 if (itb->realized) _item_block_unrealize(itb);
2900 if ((!sd->wd->reorder_it) || (sd->wd->reorder_pan_move))
2901 _group_items_recalc(sd->wd);
2902 if ((sd->wd->reorder_mode) && (sd->wd->reorder_it))
2904 if (sd->wd->pan_y != sd->wd->reorder_old_pan_y)
2905 sd->wd->reorder_pan_move = EINA_TRUE;
2906 else sd->wd->reorder_pan_move = EINA_FALSE;
2907 evas_object_raise(sd->wd->VIEW(reorder_it));
2908 sd->wd->reorder_old_pan_y = sd->wd->pan_y;
2909 sd->wd->start_time = ecore_loop_time_get();
2911 _item_auto_scroll(sd->wd);
2912 evas_event_thaw(evas_object_evas_get(obj));
2913 evas_event_thaw_eval(evas_object_evas_get(obj));
2917 _pan_move(Evas_Object *obj,
2918 Evas_Coord x __UNUSED__,
2919 Evas_Coord y __UNUSED__)
2921 Pan *sd = evas_object_smart_data_get(obj);
2925 sd->wd->pan_changed = EINA_TRUE;
2926 evas_object_smart_changed(obj);
2927 if (sd->wd->calc_job) ecore_job_del(sd->wd->calc_job);
2928 sd->wd->calc_job = NULL;
2932 _hold_on(void *data __UNUSED__,
2934 void *event_info __UNUSED__)
2936 Widget_Data *wd = elm_widget_data_get(obj);
2938 elm_smart_scroller_hold_set(wd->scr, 1);
2942 _hold_off(void *data __UNUSED__,
2944 void *event_info __UNUSED__)
2946 Widget_Data *wd = elm_widget_data_get(obj);
2948 elm_smart_scroller_hold_set(wd->scr, 0);
2952 _freeze_on(void *data __UNUSED__,
2954 void *event_info __UNUSED__)
2956 Widget_Data *wd = elm_widget_data_get(obj);
2958 elm_smart_scroller_freeze_set(wd->scr, 1);
2962 _freeze_off(void *data __UNUSED__,
2964 void *event_info __UNUSED__)
2966 Widget_Data *wd = elm_widget_data_get(obj);
2968 elm_smart_scroller_freeze_set(wd->scr, 0);
2972 _scr_anim_start(void *data,
2973 Evas_Object *obj __UNUSED__,
2974 void *event_info __UNUSED__)
2976 evas_object_smart_callback_call(data, SIG_SCROLL_ANIM_START, NULL);
2980 _scr_anim_stop(void *data,
2981 Evas_Object *obj __UNUSED__,
2982 void *event_info __UNUSED__)
2984 evas_object_smart_callback_call(data, SIG_SCROLL_ANIM_STOP, NULL);
2988 _scr_drag_start(void *data,
2989 Evas_Object *obj __UNUSED__,
2990 void *event_info __UNUSED__)
2992 evas_object_smart_callback_call(data, SIG_SCROLL_DRAG_START, NULL);
2996 _scr_drag_stop(void *data,
2997 Evas_Object *obj __UNUSED__,
2998 void *event_info __UNUSED__)
3000 evas_object_smart_callback_call(data, SIG_SCROLL_DRAG_STOP, NULL);
3004 _edge_left(void *data,
3005 Evas_Object *scr __UNUSED__,
3006 void *event_info __UNUSED__)
3008 Evas_Object *obj = data;
3009 evas_object_smart_callback_call(obj, SIG_EDGE_LEFT, NULL);
3013 _edge_right(void *data,
3014 Evas_Object *scr __UNUSED__,
3015 void *event_info __UNUSED__)
3017 Evas_Object *obj = data;
3018 evas_object_smart_callback_call(obj, SIG_EDGE_RIGHT, NULL);
3022 _edge_top(void *data,
3023 Evas_Object *scr __UNUSED__,
3024 void *event_info __UNUSED__)
3026 Evas_Object *obj = data;
3027 evas_object_smart_callback_call(obj, SIG_EDGE_TOP, NULL);
3031 _edge_bottom(void *data,
3032 Evas_Object *scr __UNUSED__,
3033 void *event_info __UNUSED__)
3035 Evas_Object *obj = data;
3036 evas_object_smart_callback_call(obj, SIG_EDGE_BOTTOM, NULL);
3040 _mode_item_realize(Elm_Gen_Item *it)
3044 if ((it->item->mode_view) || (it->generation < it->wd->generation)) return;
3046 evas_event_freeze(evas_object_evas_get(it->wd->obj));
3047 it->item->mode_view = edje_object_add(evas_object_evas_get(WIDGET(it)));
3048 edje_object_scale_set(it->item->mode_view,
3049 elm_widget_scale_get(WIDGET(it)) *
3050 _elm_config->scale);
3051 evas_object_smart_member_add(it->item->mode_view, it->wd->pan_smart);
3052 elm_widget_sub_object_add(WIDGET(it), it->item->mode_view);
3054 strncpy(buf, "item", sizeof(buf));
3055 if (it->wd->compress)
3056 strncat(buf, "_compress", sizeof(buf) - strlen(buf));
3058 if (it->item->order_num_in & 0x1) strncat(buf, "_odd", sizeof(buf) - strlen(buf));
3059 strncat(buf, "/", sizeof(buf) - strlen(buf));
3060 strncat(buf, it->itc->mode_item_style, sizeof(buf) - strlen(buf));
3062 _elm_theme_object_set(WIDGET(it), it->item->mode_view, "genlist", buf,
3063 elm_widget_style_get(WIDGET(it)));
3064 edje_object_mirrored_set(it->item->mode_view,
3065 elm_widget_mirrored_get(WIDGET(it)));
3067 /* signal callback add */
3068 evas_object_event_callback_add(it->item->mode_view, EVAS_CALLBACK_MOUSE_DOWN,
3070 evas_object_event_callback_add(it->item->mode_view, EVAS_CALLBACK_MOUSE_UP,
3072 evas_object_event_callback_add(it->item->mode_view, EVAS_CALLBACK_MOUSE_MOVE,
3075 /* text_get, content_get, state_get */
3076 /* FIXME: If you see that assert, please notify us and we
3077 will clean our mess */
3078 assert(eina_list_count(it->item->mode_content_objs) == 0);
3080 _item_text_realize(it, it->item->mode_view, &it->item->mode_texts, NULL);
3081 it->item->mode_content_objs =
3082 _item_content_realize(it, it->item->mode_view,
3083 &it->item->mode_contents, NULL);
3084 _item_state_realize(it, it->item->mode_view, &it->item->mode_states, NULL);
3086 edje_object_part_swallow(it->item->mode_view,
3087 edje_object_data_get(it->item->mode_view, "mode_part"),
3090 it->want_unrealize = EINA_FALSE;
3091 evas_event_thaw(evas_object_evas_get(it->wd->obj));
3092 evas_event_thaw_eval(evas_object_evas_get(it->wd->obj));
3096 _mode_item_unrealize(Elm_Gen_Item *it)
3098 Widget_Data *wd = it->wd;
3099 Evas_Object *content;
3100 if (!it->item->mode_view) return;
3102 evas_event_freeze(evas_object_evas_get(it->wd->obj));
3103 elm_widget_stringlist_free(it->item->mode_texts);
3104 it->item->mode_texts = NULL;
3105 elm_widget_stringlist_free(it->item->mode_contents);
3106 it->item->mode_contents = NULL;
3107 elm_widget_stringlist_free(it->item->mode_states);
3109 EINA_LIST_FREE(it->item->mode_content_objs, content)
3110 evas_object_del(content);
3112 edje_object_part_unswallow(it->item->mode_view, VIEW(it));
3113 evas_object_smart_member_add(VIEW(it), wd->pan_smart);
3114 evas_object_del(it->item->mode_view);
3115 it->item->mode_view = NULL;
3117 if (wd->mode_item == it)
3118 wd->mode_item = NULL;
3119 evas_event_thaw(evas_object_evas_get(it->wd->obj));
3120 evas_event_thaw_eval(evas_object_evas_get(it->wd->obj));
3124 _item_mode_set(Elm_Gen_Item *it)
3127 Widget_Data *wd = it->wd;
3132 it->item->nocache = EINA_TRUE;
3134 if (wd->scr_hold_timer)
3136 ecore_timer_del(wd->scr_hold_timer);
3137 wd->scr_hold_timer = NULL;
3139 elm_smart_scroller_hold_set(wd->scr, EINA_TRUE);
3140 wd->scr_hold_timer = ecore_timer_add(0.1, _scr_hold_timer_cb, wd);
3142 evas_event_freeze(evas_object_evas_get(it->wd->obj));
3143 _mode_item_realize(it);
3144 if (it->item->group_item)
3145 evas_object_raise(it->item->VIEW(group_item));
3146 _item_position(it, it->item->mode_view, it->item->scrl_x, it->item->scrl_y);
3147 evas_event_thaw(evas_object_evas_get(it->wd->obj));
3148 evas_event_thaw_eval(evas_object_evas_get(it->wd->obj));
3150 snprintf(buf, sizeof(buf), "elm,state,%s,active", wd->mode_type);
3151 edje_object_signal_emit(it->item->mode_view, buf, "elm");
3155 _item_mode_unset(Widget_Data *wd)
3158 if (!wd->mode_item) return;
3159 char buf[1024], buf2[1024];
3163 it->item->nocache = EINA_TRUE;
3165 snprintf(buf, sizeof(buf), "elm,state,%s,passive", wd->mode_type);
3166 snprintf(buf2, sizeof(buf2), "elm,state,%s,passive,finished", wd->mode_type);
3168 edje_object_signal_emit(it->item->mode_view, buf, "elm");
3169 edje_object_signal_callback_add(it->item->mode_view, buf2, "elm", _mode_finished_signal_cb, it);
3171 wd->mode_item = NULL;
3175 _edit_mode_item_position(Elm_Gen_Item *it, int itx, int ity)
3177 if ((!it) || (!it->wd->edit_mode)) return;
3178 evas_object_resize(it->edit_obj, it->item->w, it->item->h);
3179 evas_object_move(it->edit_obj, itx, ity);
3183 _edit_mode_item_realize(Elm_Gen_Item *it, Eina_Bool effect_on)
3186 const char *stacking_even;
3187 const char *stacking;
3189 if ((!it) || (it->item->edit_mode_item_realized) ||
3190 (it->generation < it->wd->generation))
3193 it->edit_obj = edje_object_add(evas_object_evas_get(WIDGET(it)));
3194 edje_object_scale_set(it->edit_obj, elm_widget_scale_get(WIDGET(it)) *
3195 _elm_config->scale);
3196 evas_object_smart_member_add(it->edit_obj, it->wd->pan_smart);
3197 elm_widget_sub_object_add(WIDGET(it), it->edit_obj);
3199 if (it->item->flags & ELM_GENLIST_ITEM_SUBITEMS)
3200 strncpy(buf, "tree", sizeof(buf));
3201 else strncpy(buf, "item", sizeof(buf));
3202 if (it->wd->compress)
3203 strncat(buf, "_compress", sizeof(buf) - strlen(buf));
3205 strncat(buf, "/", sizeof(buf) - strlen(buf));
3206 strncat(buf, it->itc->edit_item_style, sizeof(buf) - strlen(buf));
3208 _elm_theme_object_set(WIDGET(it), it->edit_obj, "genlist", buf,
3209 elm_widget_style_get(WIDGET(it)));
3211 stacking_even = edje_object_data_get(VIEW(it), "stacking_even");
3212 if (!stacking_even) stacking_even = "above";
3213 it->item->stacking_even = !!strcmp("above", stacking_even);
3215 stacking = edje_object_data_get(VIEW(it), "stacking");
3216 if (!stacking) stacking = "yes";
3217 it->item->nostacking = !!strcmp("yes", stacking);
3219 edje_object_mirrored_set(it->edit_obj,
3220 elm_widget_mirrored_get(WIDGET(it)));
3222 _elm_genlist_item_odd_even_update(it);
3223 _elm_genlist_item_state_update(it, NULL);
3225 if (effect_on) edje_object_signal_emit(it->edit_obj, "elm,state,edit,enabled,effect", "elm");
3226 else edje_object_signal_emit(it->edit_obj, "elm,state,edit,enabled", "elm");
3228 evas_object_event_callback_add(it->edit_obj, EVAS_CALLBACK_MOUSE_DOWN,
3230 evas_object_event_callback_add(it->edit_obj, EVAS_CALLBACK_MOUSE_UP,
3232 evas_object_event_callback_add(it->edit_obj, EVAS_CALLBACK_MOUSE_MOVE,
3234 evas_object_event_callback_add(it->edit_obj, EVAS_CALLBACK_MULTI_DOWN,
3236 evas_object_event_callback_add(it->edit_obj, EVAS_CALLBACK_MULTI_UP,
3238 evas_object_event_callback_add(it->edit_obj, EVAS_CALLBACK_MULTI_MOVE,
3241 _item_text_realize(it, it->edit_obj, &it->item->edit_texts, NULL);
3242 it->item->edit_content_objs =
3243 _item_content_realize(it, it->edit_obj, &it->item->edit_contents, NULL);
3244 _item_state_realize(it, it->edit_obj, &it->item->edit_states, NULL);
3245 edje_object_part_swallow(it->edit_obj, "elm.swallow.edit.content", VIEW(it));
3247 _edit_mode_item_position(it, it->item->scrl_x, it->item->scrl_y);
3248 evas_object_show(it->edit_obj);
3250 it->item->edit_mode_item_realized = EINA_TRUE;
3251 it->want_unrealize = EINA_FALSE;
3255 _edit_mode_item_unrealize(Elm_Gen_Item *it)
3258 if ((!it) || (!it->item->edit_mode_item_realized)) return;
3260 edje_object_part_unswallow(it->edit_obj, VIEW(it));
3261 evas_object_smart_member_add(VIEW(it), it->wd->pan_smart);
3262 elm_widget_sub_object_add(WIDGET(it), VIEW(it));
3263 _elm_genlist_item_odd_even_update(it);
3264 _elm_genlist_item_state_update(it, NULL);
3266 evas_object_del(it->edit_obj);
3267 it->edit_obj = NULL;
3268 elm_widget_stringlist_free(it->item->edit_texts);
3269 it->item->edit_texts = NULL;
3270 elm_widget_stringlist_free(it->item->edit_contents);
3271 it->item->edit_contents = NULL;
3272 elm_widget_stringlist_free(it->item->edit_states);
3273 it->item->edit_states = NULL;
3274 EINA_LIST_FREE(it->item->edit_content_objs, icon)
3275 evas_object_del(icon);
3276 edje_object_message_signal_process(it->edit_obj);
3278 evas_object_event_callback_del_full(it->edit_obj, EVAS_CALLBACK_MOUSE_DOWN,
3280 evas_object_event_callback_del_full(it->edit_obj, EVAS_CALLBACK_MOUSE_UP,
3282 evas_object_event_callback_del_full(it->edit_obj, EVAS_CALLBACK_MOUSE_MOVE,
3284 evas_object_event_callback_del_full(it->edit_obj, EVAS_CALLBACK_MULTI_DOWN,
3286 evas_object_event_callback_del_full(it->edit_obj, EVAS_CALLBACK_MULTI_UP,
3288 evas_object_event_callback_del_full(it->edit_obj, EVAS_CALLBACK_MULTI_MOVE,
3290 it->item->edit_mode_item_realized = EINA_FALSE;
3294 _item_auto_scroll(Widget_Data *wd)
3297 Elm_Gen_Item *tmp_item = NULL;
3299 if ((wd->expanded_item) && (wd->auto_scroll_enabled))
3301 tmp_item = eina_list_data_get(eina_list_last(wd->expanded_item->item->items));
3302 if (!tmp_item) return;
3303 wd->show_item = tmp_item;
3304 wd->bring_in = EINA_TRUE;
3305 wd->scrollto_type = ELM_GENLIST_ITEM_SCROLLTO_IN;
3306 if ((wd->show_item->item->queued) || (!wd->show_item->item->mincalcd))
3308 wd->show_item->item->showme = EINA_TRUE;
3309 wd->auto_scroll_enabled = EINA_FALSE;
3317 elm_genlist_add(Evas_Object *parent)
3322 Evas_Coord minw, minh;
3323 static Evas_Smart *smart = NULL;
3327 static Evas_Smart_Class sc;
3329 evas_object_smart_clipped_smart_set(&_pan_sc);
3331 sc.name = "elm_genlist_pan";
3332 sc.version = EVAS_SMART_CLASS_VERSION;
3335 sc.resize = _pan_resize;
3336 sc.move = _pan_move;
3337 sc.calculate = _pan_calculate;
3338 if (!(smart = evas_smart_class_new(&sc))) return NULL;
3341 ELM_WIDGET_STANDARD_SETUP(wd, Widget_Data, parent, e, obj, NULL);
3343 ELM_SET_WIDTYPE(widtype, "genlist");
3345 elm_widget_type_set(obj, "genlist");
3346 elm_widget_sub_object_add(parent, obj);
3347 elm_widget_on_focus_hook_set(obj, _on_focus_hook, NULL);
3348 elm_widget_signal_emit_hook_set(obj, _signal_emit_hook);
3349 elm_widget_data_set(obj, wd);
3350 elm_widget_del_hook_set(obj, _del_hook);
3351 elm_widget_del_pre_hook_set(obj, _del_pre_hook);
3352 elm_widget_theme_hook_set(obj, _theme_hook);
3353 elm_widget_can_focus_set(obj, EINA_TRUE);
3354 elm_widget_event_hook_set(obj, _event_hook);
3355 elm_widget_on_show_region_hook_set(obj, _show_region_hook, obj);
3356 elm_widget_translate_hook_set(obj, _translate_hook);
3359 wd->scr = elm_smart_scroller_add(e);
3360 elm_smart_scroller_widget_set(wd->scr, obj);
3361 elm_smart_scroller_object_theme_set(obj, wd->scr, "genlist", "base",
3362 elm_widget_style_get(obj));
3363 elm_smart_scroller_bounce_allow_set(wd->scr, EINA_FALSE,
3364 _elm_config->thumbscroll_bounce_enable);
3365 elm_widget_resize_object_set(obj, wd->scr);
3367 evas_object_smart_callback_add(wd->scr, "animate,start", _scr_anim_start, obj);
3368 evas_object_smart_callback_add(wd->scr, "animate,stop", _scr_anim_stop, obj);
3369 evas_object_smart_callback_add(wd->scr, "drag,start", _scr_drag_start, obj);
3370 evas_object_smart_callback_add(wd->scr, "drag,stop", _scr_drag_stop, obj);
3371 evas_object_smart_callback_add(wd->scr, "edge,left", _edge_left, obj);
3372 evas_object_smart_callback_add(wd->scr, "edge,right", _edge_right, obj);
3373 evas_object_smart_callback_add(wd->scr, "edge,top", _edge_top, obj);
3374 evas_object_smart_callback_add(wd->scr, "edge,bottom", _edge_bottom, obj);
3377 wd->mode = ELM_LIST_SCROLL;
3378 wd->max_items_per_block = MAX_ITEMS_PER_BLOCK;
3379 wd->item_cache_max = wd->max_items_per_block * 2;
3380 wd->longpress_timeout = _elm_config->longpress_timeout;
3382 evas_object_smart_callback_add(obj, "scroll-hold-on", _hold_on, obj);
3383 evas_object_smart_callback_add(obj, "scroll-hold-off", _hold_off, obj);
3384 evas_object_smart_callback_add(obj, "scroll-freeze-on", _freeze_on, obj);
3385 evas_object_smart_callback_add(obj, "scroll-freeze-off", _freeze_off, obj);
3387 wd->pan_smart = evas_object_smart_add(e, smart);
3388 wd->pan = evas_object_smart_data_get(wd->pan_smart);
3391 elm_smart_scroller_extern_pan_set(wd->scr, wd->pan_smart,
3392 _pan_set, _pan_get, _pan_max_get,
3393 _pan_min_get, _pan_child_size_get);
3395 edje_object_size_min_calc(elm_smart_scroller_edje_object_get(wd->scr),
3397 evas_object_size_hint_min_set(obj, minw, minh);
3399 evas_object_smart_callbacks_descriptions_set(obj, _signals);
3401 _mirrored_set(obj, elm_widget_mirrored_get(obj));
3407 _item_select(Elm_Gen_Item *it)
3409 if ((it->wd->no_select) || (it->generation < it->wd->generation) || (it->mode_set)) return;
3412 it->selected = EINA_TRUE;
3413 it->wd->selected = eina_list_append(it->wd->selected, it);
3415 else if (!it->wd->always_select) return;
3417 evas_object_ref(WIDGET(it));
3420 if (it->func.func) it->func.func((void *)it->func.data, WIDGET(it), it);
3421 if (it->generation == it->wd->generation)
3422 evas_object_smart_callback_call(WIDGET(it), SIG_SELECTED, it);
3425 evas_object_unref(WIDGET(it));
3426 if ((it->wd->clear_me) && (!it->wd->walking))
3427 _elm_genlist_clear(WIDGET(it), EINA_TRUE);
3430 if ((!it->walking) && (it->generation < it->wd->generation))
3435 elm_widget_item_free(it);
3439 it->wd->last_selected_item = (Elm_Object_Item *) it;
3443 static Evas_Object *
3444 _item_content_get_hook(Elm_Gen_Item *it, const char *part)
3446 return edje_object_part_swallow_get(VIEW(it), part);
3450 _item_content_set_hook(Elm_Gen_Item *it, const char *part, Evas_Object *content)
3452 if (content && part)
3454 it->content_objs = eina_list_append(it->content_objs, content);
3455 edje_object_part_swallow(VIEW(it), part, content);
3459 static Evas_Object *
3460 _item_content_unset_hook(Elm_Gen_Item *it, const char *part)
3463 obj = edje_object_part_swallow_get(VIEW(it), part);
3464 if (!obj) return NULL;
3465 it->content_objs = eina_list_remove(it->content_objs, obj);
3466 edje_object_part_unswallow(VIEW(it), obj);
3471 _item_text_hook(Elm_Gen_Item *it, const char *part)
3473 if (!it->itc->func.text_get) return NULL;
3474 return edje_object_part_text_get(VIEW(it), part);
3478 _item_disable_hook(Elm_Object_Item *it)
3482 Elm_Gen_Item *_it = (Elm_Gen_Item *) it;
3484 if (_it->generation < _it->wd->generation) return;
3487 elm_genlist_item_selected_set(it, EINA_FALSE);
3491 if (elm_widget_item_disabled_get(it))
3493 edje_object_signal_emit(VIEW(_it), "elm,state,disabled", "elm");
3495 edje_object_signal_emit(_it->edit_obj, "elm,state,disabled", "elm");
3499 edje_object_signal_emit(VIEW(_it), "elm,state,enabled", "elm");
3501 edje_object_signal_emit(_it->edit_obj, "elm,state,enabled", "elm");
3503 EINA_LIST_FOREACH(_it->content_objs, l, obj)
3504 elm_widget_disabled_set(obj, elm_widget_item_disabled_get(_it));
3509 _item_del_pre_hook(Elm_Object_Item *it)
3511 Elm_Gen_Item *_it = (Elm_Gen_Item *) it;
3513 if ((_it->relcount > 0) || (_it->walking > 0))
3515 elm_genlist_item_subitems_clear(it);
3516 if (_it->wd->show_item == _it) _it->wd->show_item = NULL;
3517 _elm_genlist_item_del_notserious(_it);
3518 if (_it->item->block)
3520 if (_it->realized) _elm_genlist_item_unrealize(_it, EINA_FALSE);
3521 _it->item->block->changed = EINA_TRUE;
3522 if (_it->wd->calc_job) ecore_job_del(_it->wd->calc_job);
3523 _it->wd->calc_job = ecore_job_add(_calc_job, _it->wd);
3527 _it->parent->item->items =
3528 eina_list_remove(_it->parent->item->items, it);
3538 _elm_genlist_item_new(Widget_Data *wd,
3539 const Elm_Gen_Item_Class *itc,
3541 Elm_Gen_Item *parent,
3543 const void *func_data)
3547 it = elm_widget_item_new(wd->obj, Elm_Gen_Item);
3548 if (!it) return NULL;
3550 it->generation = wd->generation;
3552 elm_genlist_item_class_ref((Elm_Genlist_Item_Class *)itc);
3553 it->base.data = data;
3554 it->parent = parent;
3555 it->func.func = func;
3556 it->func.data = func_data;
3557 elm_widget_item_content_get_hook_set(it, _item_content_get_hook);
3558 elm_widget_item_content_set_hook_set(it, _item_content_set_hook);
3559 elm_widget_item_content_unset_hook_set(it, _item_content_unset_hook);
3560 elm_widget_item_disable_hook_set(it, _item_disable_hook);
3561 elm_widget_item_del_pre_hook_set(it, _item_del_pre_hook);
3563 it->sel_cb = (Ecore_Cb)_item_select;
3565 elm_widget_item_text_get_hook_set(it, _item_text_hook);
3569 static Elm_Gen_Item *
3570 _item_new(Widget_Data *wd,
3571 const Elm_Genlist_Item_Class *itc,
3573 Elm_Gen_Item *parent,
3574 Elm_Genlist_Item_Flags flags,
3576 const void *func_data)
3578 Elm_Gen_Item *it, *it2;
3581 it = _elm_genlist_item_new(wd, itc, data, parent, func, func_data);
3582 if (!it) return NULL;
3583 it->item = ELM_NEW(Elm_Gen_Item_Type);
3584 it->item->flags = flags;
3585 if (flags & ELM_GENLIST_ITEM_GROUP) it->group++;
3586 it->item->expanded_depth = 0;
3587 ELM_GEN_ITEM_SETUP(it);
3590 if (it->parent->group)
3591 it->item->group_item = parent;
3592 else if (it->parent->item->group_item)
3593 it->item->group_item = it->parent->item->group_item;
3595 for (it2 = it, depth = 0; it2->parent; it2 = it2->parent)
3597 if (!it2->parent->group) depth += 1;
3599 it->item->expanded_depth = depth;
3605 _item_block_new(Widget_Data *wd, Eina_Bool prepend)
3609 itb = calloc(1, sizeof(Item_Block));
3610 if (!itb) return NULL;
3614 wd->blocks = eina_inlist_prepend(wd->blocks, EINA_INLIST_GET(itb));
3615 _item_block_position_update(wd->blocks, 0);
3619 wd->blocks = eina_inlist_append(wd->blocks, EINA_INLIST_GET(itb));
3620 itb->position_update = EINA_TRUE;
3621 if (wd->blocks != EINA_INLIST_GET(itb))
3623 itb->position = ((Item_Block *) (EINA_INLIST_GET(itb)->prev))->position + 1;
3634 _item_block_add(Widget_Data *wd,
3637 Item_Block *itb = NULL;
3644 itb = calloc(1, sizeof(Item_Block));
3645 if (!itb) return EINA_FALSE;
3647 if (!it->item->rel->item->block)
3650 eina_inlist_append(wd->blocks, EINA_INLIST_GET(itb));
3651 itb->items = eina_list_append(itb->items, it);
3652 itb->position_update = EINA_TRUE;
3653 it->position = eina_list_count(itb->items);
3654 it->position_update = EINA_TRUE;
3656 if (wd->blocks != EINA_INLIST_GET(itb))
3658 itb->position = ((Item_Block *) (EINA_INLIST_GET(itb)->prev))->position + 1;
3669 tmp = eina_list_data_find_list(itb->items, it->item->rel);
3670 if (it->item->before)
3672 wd->blocks = eina_inlist_prepend_relative
3673 (wd->blocks, EINA_INLIST_GET(itb),
3674 EINA_INLIST_GET(it->item->rel->item->block));
3676 eina_list_prepend_relative_list(itb->items, it, tmp);
3678 /* Update index from where we prepended */
3679 _item_position_update(eina_list_prev(tmp), it->item->rel->position);
3680 _item_block_position_update(EINA_INLIST_GET(itb),
3681 it->item->rel->item->block->position);
3685 wd->blocks = eina_inlist_append_relative
3686 (wd->blocks, EINA_INLIST_GET(itb),
3687 EINA_INLIST_GET(it->item->rel->item->block));
3689 eina_list_append_relative_list(itb->items, it, tmp);
3691 /* Update block index from where we appended */
3692 _item_position_update(eina_list_next(tmp), it->item->rel->position + 1);
3693 _item_block_position_update(EINA_INLIST_GET(itb),
3694 it->item->rel->item->block->position + 1);
3700 if (it->item->before)
3704 itb = (Item_Block *)(wd->blocks);
3705 if (itb->count >= wd->max_items_per_block)
3707 itb = _item_block_new(wd, EINA_TRUE);
3708 if (!itb) return EINA_FALSE;
3713 itb = _item_block_new(wd, EINA_TRUE);
3714 if (!itb) return EINA_FALSE;
3716 itb->items = eina_list_prepend(itb->items, it);
3718 _item_position_update(itb->items, 0);
3724 itb = (Item_Block *)(wd->blocks->last);
3725 if (itb->count >= wd->max_items_per_block)
3727 itb = _item_block_new(wd, EINA_FALSE);
3728 if (!itb) return EINA_FALSE;
3733 itb = _item_block_new(wd, EINA_FALSE);
3734 if (!itb) return EINA_FALSE;
3736 itb->items = eina_list_append(itb->items, it);
3737 it->position = eina_list_count(itb->items);
3745 if (it->item->rel->item->queued)
3747 /* NOTE: for a strange reason eina_list and eina_inlist don't have the same property
3748 on sorted insertion order, so the queue is not always ordered like the item list.
3749 This lead to issue where we depend on an item that is not yet created. As a quick
3750 work around, we reschedule the calc of the item and stop reordering the list to
3751 prevent any nasty issue to show up here.
3753 wd->queue = eina_list_append(wd->queue, it);
3754 wd->requeued = EINA_TRUE;
3755 it->item->queued = EINA_TRUE;
3758 itb = it->item->rel->item->block;
3759 if (!itb) goto newblock;
3760 tmp = eina_list_data_find_list(itb->items, it->item->rel);
3761 if (it->item->before)
3763 itb->items = eina_list_prepend_relative_list(itb->items, it, tmp);
3764 _item_position_update(eina_list_prev(tmp), it->item->rel->position);
3768 itb->items = eina_list_append_relative_list(itb->items, it, tmp);
3769 _item_position_update(eina_list_next(tmp), it->item->rel->position + 1);
3773 itb->changed = EINA_TRUE;
3774 it->item->block = itb;
3775 if (itb->wd->calc_job) ecore_job_del(itb->wd->calc_job);
3776 itb->wd->calc_job = ecore_job_add(_calc_job, itb->wd);
3779 it->item->rel->relcount--;
3780 if ((it->item->rel->generation < it->wd->generation) && (!it->item->rel->relcount))
3782 _item_del(it->item->rel);
3783 elm_widget_item_free(it->item->rel);
3785 it->item->rel = NULL;
3787 if (itb->count > itb->wd->max_items_per_block)
3792 Eina_Bool done = EINA_FALSE;
3794 newc = itb->count / 2;
3796 if (EINA_INLIST_GET(itb)->prev)
3798 Item_Block *itbp = (Item_Block *)(EINA_INLIST_GET(itb)->prev);
3800 if (itbp->count + newc < wd->max_items_per_block / 2)
3802 /* moving items to previous block */
3803 while ((itb->count > newc) && (itb->items))
3805 it2 = eina_list_data_get(itb->items);
3806 itb->items = eina_list_remove_list(itb->items, itb->items);
3809 itbp->items = eina_list_append(itbp->items, it2);
3810 it2->item->block = itbp;
3818 if (!done && EINA_INLIST_GET(itb)->next)
3820 Item_Block *itbn = (Item_Block *)(EINA_INLIST_GET(itb)->next);
3822 if (itbn->count + newc < wd->max_items_per_block / 2)
3824 /* moving items to next block */
3825 while ((itb->count > newc) && (itb->items))
3829 l = eina_list_last(itb->items);
3830 it2 = eina_list_data_get(l);
3831 itb->items = eina_list_remove_list(itb->items, l);
3834 itbn->items = eina_list_prepend(itbn->items, it2);
3835 it2->item->block = itbn;
3845 /* moving items to new block */
3846 itb2 = calloc(1, sizeof(Item_Block));
3847 if (!itb2) return EINA_FALSE;
3850 eina_inlist_append_relative(wd->blocks, EINA_INLIST_GET(itb2),
3851 EINA_INLIST_GET(itb));
3852 itb2->changed = EINA_TRUE;
3853 while ((itb->count > newc) && (itb->items))
3857 l = eina_list_last(itb->items);
3859 itb->items = eina_list_remove_list(itb->items, l);
3862 itb2->items = eina_list_prepend(itb2->items, it2);
3863 it2->item->block = itb2;
3873 _queue_process(Widget_Data *wd)
3876 Eina_Bool showme = EINA_FALSE;
3879 t0 = ecore_loop_time_get();
3880 //evas_event_freeze(evas_object_evas_get(wd->obj));
3881 for (n = 0; (wd->queue) && (n < 128); n++)
3885 it = eina_list_data_get(wd->queue);
3886 wd->queue = eina_list_remove_list(wd->queue, wd->queue);
3887 it->item->queued = EINA_FALSE;
3888 if (!_item_block_add(wd, it)) continue;
3890 _item_block_realize(it->item->block);
3891 t = ecore_time_get();
3892 if (it->item->block->changed)
3894 showme = _item_block_recalc(it->item->block, it->item->block->num, EINA_TRUE);
3895 it->item->block->changed = 0;
3896 if (wd->pan_changed)
3898 if (wd->calc_job) ecore_job_del(wd->calc_job);
3899 wd->calc_job = NULL;
3901 wd->pan_changed = EINA_FALSE;
3904 if (showme) it->item->block->showme = EINA_TRUE;
3905 /* same as eina_inlist_count > 1 */
3906 if (wd->blocks && wd->blocks->next)
3908 if ((t - t0) > (ecore_animator_frametime_get())) break;
3911 //evas_event_thaw(evas_object_evas_get(wd->obj));
3912 //evas_event_thaw_eval(evas_object_evas_get(wd->obj));
3917 _idle_process(void *data, Eina_Bool *wakeup)
3919 Widget_Data *wd = data;
3922 //static double q_start = 0.0;
3923 //if (q_start == 0.0) q_start = ecore_time_get();
3925 if (_queue_process(wd) > 0) *wakeup = EINA_TRUE;
3929 //printf("PROCESS TIME: %3.3f\n", ecore_time_get() - q_start);
3931 return ECORE_CALLBACK_CANCEL;
3933 return ECORE_CALLBACK_RENEW;
3937 _item_idle_enterer(void *data)
3939 Widget_Data *wd = data;
3940 Eina_Bool wakeup = EINA_FALSE;
3941 Eina_Bool ok = _idle_process(data, &wakeup);
3946 if (wd->calc_job) ecore_job_del(wd->calc_job);
3947 wd->calc_job = ecore_job_add(_calc_job, wd);
3949 if (ok == ECORE_CALLBACK_CANCEL) wd->queue_idle_enterer = NULL;
3954 _item_queue(Widget_Data *wd,
3958 if (it->item->queued) return;
3959 it->item->queued = EINA_TRUE;
3960 if (cb && !wd->requeued)
3961 wd->queue = eina_list_sorted_insert(wd->queue, cb, it);
3963 wd->queue = eina_list_append(wd->queue, it);
3964 // FIXME: why does a freeze then thaw here cause some genlist
3965 // elm_genlist_item_append() to be much much slower?
3966 // evas_event_freeze(evas_object_evas_get(wd->obj));
3967 while ((wd->queue) && ((!wd->blocks) || (!wd->blocks->next)))
3969 if (wd->queue_idle_enterer)
3971 ecore_idle_enterer_del(wd->queue_idle_enterer);
3972 wd->queue_idle_enterer = NULL;
3976 // evas_event_thaw(evas_object_evas_get(wd->obj));
3977 // evas_event_thaw_eval(evas_object_evas_get(wd->obj));
3978 if (!wd->queue_idle_enterer)
3979 wd->queue_idle_enterer = ecore_idle_enterer_add(_item_idle_enterer, wd);
3983 _elm_genlist_item_compare_data(const void *data, const void *data1)
3985 const Elm_Gen_Item *it = data;
3986 const Elm_Gen_Item *item1 = data1;
3988 return it->wd->item_compare_data_cb(it->base.data, item1->base.data);
3992 _elm_genlist_item_compare(const void *data, const void *data1)
3994 const Elm_Gen_Item *it, *item1;
3995 it = ELM_GEN_ITEM_FROM_INLIST(data);
3996 item1 = ELM_GEN_ITEM_FROM_INLIST(data1);
3997 return it->wd->item_compare_cb(it, item1);
4001 _elm_genlist_item_list_compare(const void *data, const void *data1)
4003 const Elm_Gen_Item *it = data;
4004 const Elm_Gen_Item *item1 = data1;
4005 return it->wd->item_compare_cb(it, item1);
4009 _item_move_after(Elm_Gen_Item *it, Elm_Gen_Item *after)
4014 it->wd->items = eina_inlist_remove(it->wd->items, EINA_INLIST_GET(it));
4015 _item_block_del(it);
4017 it->wd->items = eina_inlist_append_relative(it->wd->items, EINA_INLIST_GET(it), EINA_INLIST_GET(after));
4018 it->item->rel = after;
4019 it->item->rel->relcount++;
4020 it->item->before = EINA_FALSE;
4021 if (after->item->group_item) it->item->group_item = after->item->group_item;
4022 _item_queue(it->wd, it, NULL);
4024 evas_object_smart_callback_call(WIDGET(it), SIG_MOVED, it);
4028 _item_move_before(Elm_Gen_Item *it, Elm_Gen_Item *before)
4031 if (!before) return;
4033 it->wd->items = eina_inlist_remove(it->wd->items, EINA_INLIST_GET(it));
4034 _item_block_del(it);
4035 it->wd->items = eina_inlist_prepend_relative(it->wd->items, EINA_INLIST_GET(it), EINA_INLIST_GET(before));
4036 it->item->rel = before;
4037 it->item->rel->relcount++;
4038 it->item->before = EINA_TRUE;
4039 if (before->item->group_item) it->item->group_item = before->item->group_item;
4040 _item_queue(it->wd, it, NULL);
4042 evas_object_smart_callback_call(WIDGET(it), SIG_MOVED, it);
4046 elm_genlist_items_count(const Evas_Object *obj)
4048 ELM_CHECK_WIDTYPE(obj, widtype) 0;
4049 Widget_Data *wd = elm_widget_data_get(obj);
4051 return wd->item_count;
4054 EAPI Elm_Object_Item *
4055 elm_genlist_item_append(Evas_Object *obj,
4056 const Elm_Genlist_Item_Class *itc,
4058 Elm_Object_Item *parent,
4059 Elm_Genlist_Item_Flags flags,
4061 const void *func_data)
4063 ELM_CHECK_WIDTYPE(obj, widtype) NULL;
4064 Widget_Data *wd = elm_widget_data_get(obj);
4065 if (!wd) return NULL;
4066 Elm_Gen_Item *it = _item_new(wd, itc, data, (Elm_Gen_Item *) parent, flags,
4068 if (!it) return NULL;
4072 wd->group_items = eina_list_append(wd->group_items, it);
4073 wd->items = eina_inlist_append(wd->items, EINA_INLIST_GET(it));
4074 it->item->rel = NULL;
4078 Elm_Gen_Item *it2 = NULL;
4079 Eina_List *ll = eina_list_last(it->parent->item->items);
4080 if (ll) it2 = ll->data;
4081 it->parent->item->items = eina_list_append(it->parent->item->items, it);
4082 if (!it2) it2 = it->parent;
4084 eina_inlist_append_relative(wd->items, EINA_INLIST_GET(it),
4085 EINA_INLIST_GET(it2));
4086 it->item->rel = it2;
4087 it->item->rel->relcount++;
4089 it->item->before = EINA_FALSE;
4090 _item_queue(wd, it, NULL);
4091 return (Elm_Object_Item *) it;
4094 EAPI Elm_Object_Item *
4095 elm_genlist_item_prepend(Evas_Object *obj,
4096 const Elm_Genlist_Item_Class *itc,
4098 Elm_Object_Item *parent,
4099 Elm_Genlist_Item_Flags flags,
4101 const void *func_data)
4103 ELM_CHECK_WIDTYPE(obj, widtype) NULL;
4104 Widget_Data *wd = elm_widget_data_get(obj);
4105 if (!wd) return NULL;
4106 Elm_Gen_Item *it = _item_new(wd, itc, data, (Elm_Gen_Item *) parent, flags,
4108 if (!it) return NULL;
4112 wd->group_items = eina_list_prepend(wd->group_items, it);
4113 wd->items = eina_inlist_prepend(wd->items, EINA_INLIST_GET(it));
4114 it->item->rel = NULL;
4118 Elm_Gen_Item *it2 = NULL;
4119 Eina_List *ll = it->parent->item->items;
4120 if (ll) it2 = ll->data;
4121 it->parent->item->items = eina_list_prepend(it->parent->item->items, it);
4122 if (!it2) it2 = it->parent;
4124 eina_inlist_prepend_relative(wd->items, EINA_INLIST_GET(it),
4125 EINA_INLIST_GET(it2));
4126 it->item->rel = it2;
4127 it->item->rel->relcount++;
4129 it->item->before = EINA_TRUE;
4130 _item_queue(wd, it, NULL);
4131 return (Elm_Object_Item *) it;
4134 EAPI Elm_Object_Item *
4135 elm_genlist_item_insert_after(Evas_Object *obj,
4136 const Elm_Genlist_Item_Class *itc,
4138 Elm_Object_Item *parent,
4139 Elm_Object_Item *after,
4140 Elm_Genlist_Item_Flags flags,
4142 const void *func_data)
4144 ELM_CHECK_WIDTYPE(obj, widtype) NULL;
4145 ELM_OBJ_ITEM_CHECK_OR_RETURN(after, NULL);
4146 Widget_Data *wd = elm_widget_data_get(obj);
4147 Elm_Gen_Item *_after = (Elm_Gen_Item *) after;
4148 if (!wd) return NULL;
4149 /* It makes no sense to insert after in an empty list with after != NULL, something really bad is happening in your app. */
4150 EINA_SAFETY_ON_NULL_RETURN_VAL(wd->items, NULL);
4152 Elm_Gen_Item *it = _item_new(wd, itc, data, (Elm_Gen_Item *) parent, flags,
4154 if (!it) return NULL;
4157 if ((it->group) && (_after->group))
4158 wd->group_items = eina_list_append_relative(wd->group_items, it,
4163 it->parent->item->items =
4164 eina_list_append_relative(it->parent->item->items, it, _after);
4166 wd->items = eina_inlist_append_relative(wd->items, EINA_INLIST_GET(it),
4167 EINA_INLIST_GET(_after));
4168 it->item->rel = _after;
4169 it->item->rel->relcount++;
4170 it->item->before = EINA_FALSE;
4171 _item_queue(wd, it, NULL);
4172 return (Elm_Object_Item *) it;
4175 EAPI Elm_Object_Item *
4176 elm_genlist_item_insert_before(Evas_Object *obj,
4177 const Elm_Genlist_Item_Class *itc,
4179 Elm_Object_Item *parent,
4180 Elm_Object_Item *before,
4181 Elm_Genlist_Item_Flags flags,
4183 const void *func_data)
4185 ELM_CHECK_WIDTYPE(obj, widtype) NULL;
4186 ELM_OBJ_ITEM_CHECK_OR_RETURN(before, NULL);
4187 Widget_Data *wd = elm_widget_data_get(obj);
4188 Elm_Gen_Item *_before = (Elm_Gen_Item *) before;
4189 if (!wd) return NULL;
4190 /* It makes no sense to insert before in an empty list with before != NULL, something really bad is happening in your app. */
4191 EINA_SAFETY_ON_NULL_RETURN_VAL(wd->items, NULL);
4193 Elm_Gen_Item *it = _item_new(wd, itc, data, (Elm_Gen_Item *) parent, flags,
4195 if (!it) return NULL;
4198 if (it->group && _before->group)
4199 wd->group_items = eina_list_prepend_relative(wd->group_items, it,
4204 it->parent->item->items =
4205 eina_list_prepend_relative(it->parent->item->items, it, _before);
4207 wd->items = eina_inlist_prepend_relative(wd->items, EINA_INLIST_GET(it),
4208 EINA_INLIST_GET(_before));
4209 it->item->rel = _before;
4210 it->item->rel->relcount++;
4211 it->item->before = EINA_TRUE;
4212 _item_queue(wd, it, NULL);
4213 return (Elm_Object_Item *) it;
4216 EAPI Elm_Object_Item *
4217 elm_genlist_item_direct_sorted_insert(Evas_Object *obj,
4218 const Elm_Genlist_Item_Class *itc,
4220 Elm_Object_Item *parent,
4221 Elm_Genlist_Item_Flags flags,
4222 Eina_Compare_Cb comp,
4224 const void *func_data)
4226 ELM_CHECK_WIDTYPE(obj, widtype) NULL;
4227 Widget_Data *wd = elm_widget_data_get(obj);
4228 if (!wd) return NULL;
4229 Elm_Gen_Item *rel = NULL;
4230 Elm_Gen_Item *it = _item_new(wd, itc, data, (Elm_Gen_Item *) parent, flags,
4232 if (!it) return NULL;
4234 wd->item_compare_cb = comp;
4241 l = eina_list_search_sorted_near_list(it->parent->item->items,
4242 _elm_genlist_item_list_compare, it,
4245 rel = eina_list_data_get(l);
4249 if (cmp_result >= 0)
4251 it->parent->item->items = eina_list_prepend_relative_list(it->parent->item->items, it, l);
4252 wd->items = eina_inlist_prepend_relative(wd->items, EINA_INLIST_GET(it), EINA_INLIST_GET(rel));
4253 it->item->before = EINA_FALSE;
4255 else if (cmp_result < 0)
4257 it->parent->item->items = eina_list_append_relative_list(it->parent->item->items, it, l);
4258 wd->items = eina_inlist_append_relative(wd->items, EINA_INLIST_GET(it), EINA_INLIST_GET(rel));
4259 it->item->before = EINA_TRUE;
4266 wd->state = eina_inlist_sorted_state_new();
4267 eina_inlist_sorted_state_init(wd->state, wd->items);
4268 wd->requeued = EINA_FALSE;
4272 wd->group_items = eina_list_append(wd->group_items, it);
4274 wd->items = eina_inlist_sorted_state_insert(wd->items, EINA_INLIST_GET(it),
4275 _elm_genlist_item_compare, wd->state);
4277 if (EINA_INLIST_GET(it)->next)
4279 rel = ELM_GEN_ITEM_FROM_INLIST(EINA_INLIST_GET(it)->next);
4280 it->item->before = EINA_TRUE;
4282 else if (EINA_INLIST_GET(it)->prev)
4284 rel = ELM_GEN_ITEM_FROM_INLIST(EINA_INLIST_GET(it)->prev);
4285 it->item->before = EINA_FALSE;
4291 it->item->rel = rel;
4292 it->item->rel->relcount++;
4295 _item_queue(wd, it, _elm_genlist_item_list_compare);
4297 return (Elm_Object_Item *) it;
4300 EAPI Elm_Object_Item *
4301 elm_genlist_item_sorted_insert(Evas_Object *obj,
4302 const Elm_Genlist_Item_Class *itc,
4304 Elm_Object_Item *parent,
4305 Elm_Genlist_Item_Flags flags,
4306 Eina_Compare_Cb comp,
4308 const void *func_data)
4310 ELM_CHECK_WIDTYPE(obj, widtype) NULL;
4311 Widget_Data *wd = elm_widget_data_get(obj);
4312 wd->item_compare_data_cb = comp;
4313 return elm_genlist_item_direct_sorted_insert(obj, itc, data, parent, flags,
4314 _elm_genlist_item_compare_data,
4319 _elm_genlist_clear(Evas_Object *obj, Eina_Bool standby)
4321 Eina_Inlist *next, *l;
4323 ELM_CHECK_WIDTYPE(obj, widtype);
4324 Widget_Data *wd = elm_widget_data_get(obj);
4327 if (!standby) wd->generation++;
4331 eina_inlist_sorted_state_free(wd->state);
4335 if (wd->walking > 0)
4340 evas_event_freeze(evas_object_evas_get(wd->obj));
4341 for (l = wd->items, next = l ? l->next : NULL;
4343 l = next, next = next ? next->next : NULL)
4345 Elm_Gen_Item *it = ELM_GEN_ITEM_FROM_INLIST(l);
4347 if (it->generation < wd->generation)
4349 Elm_Gen_Item *itn = NULL;
4351 if (next) itn = ELM_GEN_ITEM_FROM_INLIST(next);
4352 if (itn) itn->walking++; /* prevent early death of subitem */
4354 elm_widget_item_free(it);
4355 if (itn) itn->walking--;
4359 wd->pan_changed = EINA_TRUE;
4362 ecore_job_del(wd->calc_job);
4363 wd->calc_job = NULL;
4365 if (wd->selected) wd->selected = eina_list_free(wd->selected);
4366 if (wd->clear_cb) wd->clear_cb(wd);
4373 evas_object_size_hint_min_set(wd->pan_smart, wd->minw, wd->minh);
4374 evas_object_smart_callback_call(wd->pan_smart, "changed", NULL);
4376 if (wd->sizing_cb) wd->sizing_cb(wd->obj);
4377 elm_smart_scroller_child_region_show(wd->scr, 0, 0, 0, 0);
4378 evas_event_thaw(evas_object_evas_get(wd->obj));
4379 evas_event_thaw_eval(evas_object_evas_get(wd->obj));
4383 elm_genlist_clear(Evas_Object *obj)
4385 _elm_genlist_clear(obj, EINA_FALSE);
4389 elm_genlist_multi_select_set(Evas_Object *obj,
4392 ELM_CHECK_WIDTYPE(obj, widtype);
4393 Widget_Data *wd = elm_widget_data_get(obj);
4399 elm_genlist_multi_select_get(const Evas_Object *obj)
4401 ELM_CHECK_WIDTYPE(obj, widtype) EINA_FALSE;
4402 Widget_Data *wd = elm_widget_data_get(obj);
4403 if (!wd) return EINA_FALSE;
4407 EAPI Elm_Object_Item *
4408 elm_genlist_selected_item_get(const Evas_Object *obj)
4410 ELM_CHECK_WIDTYPE(obj, widtype) NULL;
4411 Widget_Data *wd = elm_widget_data_get(obj);
4412 if (!wd) return NULL;
4413 if (wd->selected) return wd->selected->data;
4417 EAPI const Eina_List *
4418 elm_genlist_selected_items_get(const Evas_Object *obj)
4420 ELM_CHECK_WIDTYPE(obj, widtype) NULL;
4421 Widget_Data *wd = elm_widget_data_get(obj);
4422 if (!wd) return NULL;
4423 return wd->selected;
4427 elm_genlist_realized_items_get(const Evas_Object *obj)
4429 ELM_CHECK_WIDTYPE(obj, widtype) NULL;
4430 Widget_Data *wd = elm_widget_data_get(obj);
4431 Eina_List *list = NULL;
4433 Eina_Bool done = EINA_FALSE;
4434 if (!wd) return NULL;
4435 EINA_INLIST_FOREACH(wd->blocks, itb)
4443 EINA_LIST_FOREACH(itb->items, l, it)
4445 if (it->realized) list = eina_list_append(list, it);
4456 EAPI Elm_Object_Item *
4457 elm_genlist_at_xy_item_get(const Evas_Object *obj,
4462 ELM_CHECK_WIDTYPE(obj, widtype) NULL;
4463 Widget_Data *wd = elm_widget_data_get(obj);
4464 Evas_Coord ox, oy, ow, oh;
4467 if (!wd) return NULL;
4468 evas_object_geometry_get(wd->pan_smart, &ox, &oy, &ow, &oh);
4470 EINA_INLIST_FOREACH(wd->blocks, itb)
4475 if (!ELM_RECTS_INTERSECT(ox + itb->x - itb->wd->pan_x,
4476 oy + itb->y - itb->wd->pan_y,
4477 itb->w, itb->h, x, y, 1, 1))
4479 EINA_LIST_FOREACH(itb->items, l, it)
4481 Evas_Coord itx, ity;
4483 itx = ox + itb->x + it->x - itb->wd->pan_x;
4484 ity = oy + itb->y + it->y - itb->wd->pan_y;
4485 if (ELM_RECTS_INTERSECT(itx, ity, it->item->w, it->item->h, x, y, 1, 1))
4489 if (y <= (ity + (it->item->h / 4))) *posret = -1;
4490 else if (y >= (ity + it->item->h - (it->item->h / 4)))
4494 return (Elm_Object_Item *) it;
4496 lasty = ity + it->item->h;
4501 if (y > lasty) *posret = 1;
4507 EAPI Elm_Object_Item *
4508 elm_genlist_first_item_get(const Evas_Object *obj)
4510 ELM_CHECK_WIDTYPE(obj, widtype) NULL;
4511 Widget_Data *wd = elm_widget_data_get(obj);
4512 if (!wd) return NULL;
4513 if (!wd->items) return NULL;
4514 Elm_Gen_Item *it = ELM_GEN_ITEM_FROM_INLIST(wd->items);
4515 while ((it) && (it->generation < wd->generation))
4516 it = ELM_GEN_ITEM_FROM_INLIST(EINA_INLIST_GET(it)->next);
4517 return (Elm_Object_Item *) it;
4520 EAPI Elm_Object_Item *
4521 elm_genlist_last_item_get(const Evas_Object *obj)
4523 ELM_CHECK_WIDTYPE(obj, widtype) NULL;
4524 Widget_Data *wd = elm_widget_data_get(obj);
4525 if (!wd) return NULL;
4526 if (!wd->items) return NULL;
4527 Elm_Gen_Item *it = ELM_GEN_ITEM_FROM_INLIST(wd->items->last);
4528 while ((it) && (it->generation < wd->generation))
4529 it = ELM_GEN_ITEM_FROM_INLIST(EINA_INLIST_GET(it)->prev);
4530 return (Elm_Object_Item *) it;
4533 EAPI Elm_Object_Item *
4534 elm_genlist_item_next_get(const Elm_Object_Item *it)
4536 ELM_OBJ_ITEM_CHECK_OR_RETURN(it, NULL);
4537 Elm_Gen_Item *_it = (Elm_Gen_Item *) it;
4540 _it = ELM_GEN_ITEM_FROM_INLIST(EINA_INLIST_GET(_it)->next);
4541 if ((_it) && (_it->generation == _it->wd->generation)) break;
4543 return (Elm_Object_Item *) _it;
4546 EAPI Elm_Object_Item *
4547 elm_genlist_item_prev_get(const Elm_Object_Item *it)
4549 ELM_OBJ_ITEM_CHECK_OR_RETURN(it, NULL);
4550 Elm_Gen_Item *_it = (Elm_Gen_Item *) it;
4553 _it = ELM_GEN_ITEM_FROM_INLIST(EINA_INLIST_GET(_it)->prev);
4554 if ((_it) && (_it->generation == _it->wd->generation)) break;
4556 return (Elm_Object_Item *) _it;
4560 elm_genlist_item_genlist_get(const Elm_Object_Item *it)
4562 return elm_object_item_widget_get(it);
4565 EAPI Elm_Object_Item *
4566 elm_genlist_item_parent_get(const Elm_Object_Item *it)
4568 ELM_OBJ_ITEM_CHECK_OR_RETURN(it, NULL);
4569 return (Elm_Object_Item *) ((Elm_Gen_Item *) it)->parent;
4573 elm_genlist_item_subitems_clear(Elm_Object_Item *it)
4575 ELM_OBJ_ITEM_CHECK_OR_RETURN(it);
4576 Eina_List *tl = NULL, *l;
4578 Elm_Object_Item *it2;
4579 _it = (Elm_Gen_Item *) it;
4581 EINA_LIST_FOREACH(_it->item->items, l, it2)
4582 tl = eina_list_append(tl, it2);
4583 EINA_LIST_FREE(tl, it2)
4584 elm_object_item_del(it2);
4588 elm_genlist_item_selected_set(Elm_Object_Item *it,
4591 ELM_OBJ_ITEM_CHECK_OR_RETURN(it);
4592 Elm_Gen_Item *_it = (Elm_Gen_Item *) it;
4593 Widget_Data *wd = _it->wd;
4595 if ((_it->generation < wd->generation) || elm_widget_item_disabled_get(_it))
4597 selected = !!selected;
4598 if (_it->selected == selected) return;
4604 while (wd->selected)
4606 if (_it->unhighlight_cb) _it->unhighlight_cb(wd->selected->data);
4607 _it->unsel_cb(wd->selected->data);
4610 _it->highlight_cb(_it);
4614 if (_it->unhighlight_cb) _it->unhighlight_cb(_it);
4619 elm_genlist_item_selected_get(const Elm_Object_Item *it)
4621 ELM_OBJ_ITEM_CHECK_OR_RETURN(it, EINA_FALSE);
4622 return ((Elm_Gen_Item *) it)->selected;
4626 elm_genlist_item_expanded_set(Elm_Object_Item *it,
4629 ELM_OBJ_ITEM_CHECK_OR_RETURN(it);
4630 Elm_Gen_Item *_it = (Elm_Gen_Item *) it;
4631 if (_it->item->expanded == expanded) return;
4632 _it->item->expanded = expanded;
4633 _it->wd->expanded_item = _it;
4634 if (_it->item->expanded)
4637 edje_object_signal_emit(VIEW(_it), "elm,state,expanded", "elm");
4638 evas_object_smart_callback_call(WIDGET(_it), SIG_EXPANDED, _it);
4639 _it->wd->auto_scroll_enabled = EINA_TRUE;
4644 edje_object_signal_emit(VIEW(_it), "elm,state,contracted", "elm");
4645 evas_object_smart_callback_call(WIDGET(_it), SIG_CONTRACTED, _it);
4646 _it->wd->auto_scroll_enabled = EINA_FALSE;
4651 elm_genlist_item_expanded_get(const Elm_Object_Item *it)
4653 ELM_OBJ_ITEM_CHECK_OR_RETURN(it, EINA_FALSE);
4654 return ((Elm_Gen_Item *) it)->item->expanded;
4658 elm_genlist_item_expanded_depth_get(const Elm_Object_Item *it)
4660 ELM_OBJ_ITEM_CHECK_OR_RETURN(it, 0);
4661 return ((Elm_Gen_Item *) it)->item->expanded_depth;
4665 elm_genlist_item_disabled_set(Elm_Object_Item *it,
4668 elm_object_item_disabled_set(it, disabled);
4672 elm_genlist_item_disabled_get(const Elm_Object_Item *it)
4674 return elm_object_item_disabled_get(it);
4678 elm_genlist_item_display_only_set(Elm_Object_Item *it,
4679 Eina_Bool display_only)
4681 ELM_OBJ_ITEM_CHECK_OR_RETURN(it);
4682 Elm_Gen_Item *_it = (Elm_Gen_Item *) it;
4683 display_only = !!display_only;
4684 if (_it->display_only == display_only) return;
4685 if (_it->generation < _it->wd->generation) return;
4686 _it->display_only = display_only;
4687 _it->item->mincalcd = EINA_FALSE;
4688 _it->item->updateme = EINA_TRUE;
4689 if (_it->item->block) _it->item->block->updateme = EINA_TRUE;
4690 if (_it->wd->update_job) ecore_job_del(_it->wd->update_job);
4691 _it->wd->update_job = ecore_job_add(_update_job, _it->wd);
4695 elm_genlist_item_display_only_get(const Elm_Object_Item *it)
4697 ELM_OBJ_ITEM_CHECK_OR_RETURN(it, EINA_FALSE);
4698 Elm_Gen_Item *_it = (Elm_Gen_Item *) it;
4699 if (_it->generation < _it->wd->generation) return EINA_FALSE;
4700 return _it->display_only;
4704 elm_genlist_item_show(Elm_Object_Item *it)
4706 ELM_OBJ_ITEM_CHECK_OR_RETURN(it);
4707 Elm_Gen_Item *_it = (Elm_Gen_Item *) it;
4708 Evas_Coord gith = 0;
4709 if (_it->generation < _it->wd->generation) return;
4710 if ((_it->item->queued) || (!_it->item->mincalcd))
4712 _it->wd->show_item = _it;
4713 _it->wd->bring_in = EINA_FALSE;
4714 _it->wd->scrollto_type = ELM_GENLIST_ITEM_SCROLLTO_IN;
4715 _it->item->showme = EINA_TRUE;
4718 if (_it->wd->show_item)
4720 _it->wd->show_item->item->showme = EINA_FALSE;
4721 _it->wd->show_item = NULL;
4723 if ((_it->item->group_item) &&
4724 (_it->wd->pan_y > (_it->y + _it->item->block->y)))
4725 gith = _it->item->group_item->item->h;
4726 elm_smart_scroller_child_region_show(_it->wd->scr,
4727 _it->x + _it->item->block->x,
4728 _it->y + _it->item->block->y - gith,
4729 _it->item->block->w, _it->item->h);
4733 elm_genlist_item_promote(Elm_Object_Item *it)
4735 ELM_OBJ_ITEM_CHECK_OR_RETURN(it);
4736 Elm_Gen_Item *_it = (Elm_Gen_Item *) it;
4737 if (_it->generation < _it->wd->generation) return;
4738 _item_move_before(_it,
4739 (Elm_Gen_Item *) elm_genlist_first_item_get(WIDGET(_it)));
4743 elm_genlist_item_demote(Elm_Object_Item *it)
4745 ELM_OBJ_ITEM_CHECK_OR_RETURN(it);
4746 Elm_Gen_Item *_it = (Elm_Gen_Item *) it;
4747 if (_it->generation < _it->wd->generation) return;
4748 _item_move_after(_it,
4749 (Elm_Gen_Item *) elm_genlist_last_item_get(WIDGET(_it)));
4753 elm_genlist_item_bring_in(Elm_Object_Item *it)
4755 ELM_OBJ_ITEM_CHECK_OR_RETURN(it);
4756 Elm_Gen_Item *_it = (Elm_Gen_Item *) it;
4757 Evas_Coord gith = 0;
4758 if (_it->generation < _it->wd->generation) return;
4759 if ((_it->item->queued) || (!_it->item->mincalcd))
4761 _it->wd->show_item = _it;
4762 _it->wd->bring_in = EINA_TRUE;
4763 _it->wd->scrollto_type = ELM_GENLIST_ITEM_SCROLLTO_IN;
4764 _it->item->showme = EINA_TRUE;
4767 if (_it->wd->show_item)
4769 _it->wd->show_item->item->showme = EINA_FALSE;
4770 _it->wd->show_item = NULL;
4772 if ((_it->item->group_item) &&
4773 (_it->wd->pan_y > (_it->y + _it->item->block->y)))
4774 gith = _it->item->group_item->item->h;
4775 elm_smart_scroller_region_bring_in(_it->wd->scr,
4776 _it->x + _it->item->block->x,
4777 _it->y + _it->item->block->y - gith,
4778 _it->item->block->w, _it->item->h);
4782 elm_genlist_item_top_show(Elm_Object_Item *it)
4784 ELM_OBJ_ITEM_CHECK_OR_RETURN(it);
4785 Elm_Gen_Item *_it = (Elm_Gen_Item *) it;
4787 Evas_Coord gith = 0;
4789 if (_it->generation < _it->wd->generation) return;
4790 if ((_it->item->queued) || (!_it->item->mincalcd))
4792 _it->wd->show_item = _it;
4793 _it->wd->bring_in = EINA_FALSE;
4794 _it->wd->scrollto_type = ELM_GENLIST_ITEM_SCROLLTO_TOP;
4795 _it->item->showme = EINA_TRUE;
4798 if (_it->wd->show_item)
4800 _it->wd->show_item->item->showme = EINA_FALSE;
4801 _it->wd->show_item = NULL;
4803 evas_object_geometry_get(_it->wd->pan_smart, NULL, NULL, &ow, &oh);
4804 if (_it->item->group_item) gith = _it->item->group_item->item->h;
4805 elm_smart_scroller_child_region_show(_it->wd->scr,
4806 _it->x + _it->item->block->x,
4807 _it->y + _it->item->block->y - gith,
4808 _it->item->block->w, oh);
4812 elm_genlist_item_top_bring_in(Elm_Object_Item *it)
4814 ELM_OBJ_ITEM_CHECK_OR_RETURN(it);
4815 Elm_Gen_Item *_it = (Elm_Gen_Item *) it;
4817 Evas_Coord gith = 0;
4819 if (_it->generation < _it->wd->generation) return;
4820 if ((_it->item->queued) || (!_it->item->mincalcd))
4822 _it->wd->show_item = _it;
4823 _it->wd->bring_in = EINA_TRUE;
4824 _it->wd->scrollto_type = ELM_GENLIST_ITEM_SCROLLTO_TOP;
4825 _it->item->showme = EINA_TRUE;
4828 if (_it->wd->show_item)
4830 _it->wd->show_item->item->showme = EINA_FALSE;
4831 _it->wd->show_item = NULL;
4833 evas_object_geometry_get(_it->wd->pan_smart, NULL, NULL, &ow, &oh);
4834 if (_it->item->group_item) gith = _it->item->group_item->item->h;
4835 elm_smart_scroller_region_bring_in(_it->wd->scr,
4836 _it->x + _it->item->block->x,
4837 _it->y + _it->item->block->y - gith,
4838 _it->item->block->w, oh);
4842 elm_genlist_item_middle_show(Elm_Object_Item *it)
4844 ELM_OBJ_ITEM_CHECK_OR_RETURN(it);
4845 Elm_Gen_Item *_it = (Elm_Gen_Item *) it;
4848 if (_it->generation < _it->wd->generation) return;
4849 if ((_it->item->queued) || (!_it->item->mincalcd))
4851 _it->wd->show_item = _it;
4852 _it->wd->bring_in = EINA_FALSE;
4853 _it->wd->scrollto_type = ELM_GENLIST_ITEM_SCROLLTO_MIDDLE;
4854 _it->item->showme = EINA_TRUE;
4857 if (_it->wd->show_item)
4859 _it->wd->show_item->item->showme = EINA_FALSE;
4860 _it->wd->show_item = NULL;
4862 evas_object_geometry_get(_it->wd->pan_smart, NULL, NULL, &ow, &oh);
4863 elm_smart_scroller_child_region_show(_it->wd->scr,
4864 _it->x + _it->item->block->x,
4865 _it->y + _it->item->block->y - oh / 2 +
4866 _it->item->h / 2, _it->item->block->w,
4871 elm_genlist_item_middle_bring_in(Elm_Object_Item *it)
4873 ELM_OBJ_ITEM_CHECK_OR_RETURN(it);
4874 Elm_Gen_Item *_it = (Elm_Gen_Item *) it;
4877 if (_it->generation < _it->wd->generation) return;
4878 if ((_it->item->queued) || (!_it->item->mincalcd))
4880 _it->wd->show_item = _it;
4881 _it->wd->bring_in = EINA_TRUE;
4882 _it->wd->scrollto_type = ELM_GENLIST_ITEM_SCROLLTO_MIDDLE;
4883 _it->item->showme = EINA_TRUE;
4886 if (_it->wd->show_item)
4888 _it->wd->show_item->item->showme = EINA_FALSE;
4889 _it->wd->show_item = NULL;
4891 evas_object_geometry_get(_it->wd->pan_smart, NULL, NULL, &ow, &oh);
4892 elm_smart_scroller_region_bring_in(_it->wd->scr,
4893 _it->x + _it->item->block->x,
4894 _it->y + _it->item->block->y - oh / 2 +
4895 _it->item->h / 2, _it->item->block->w,
4900 elm_genlist_item_del(Elm_Object_Item *it)
4902 elm_object_item_del(it);
4906 elm_genlist_item_data_set(Elm_Object_Item *it,
4909 elm_object_item_data_set(it, (void *) data);
4913 elm_genlist_item_data_get(const Elm_Object_Item *it)
4915 return elm_object_item_data_get(it);
4919 elm_genlist_item_icons_orphan(Elm_Object_Item *it)
4921 elm_genlist_item_contents_orphan(it);
4925 elm_genlist_item_contents_orphan(Elm_Object_Item *it)
4927 ELM_OBJ_ITEM_CHECK_OR_RETURN(it);
4929 Evas_Object *content;
4930 EINA_LIST_FREE(((Elm_Gen_Item *) it)->content_objs, content)
4932 elm_widget_sub_object_del(WIDGET(it), content);
4933 evas_object_smart_member_del(content);
4934 evas_object_hide(content);
4938 EAPI const Evas_Object *
4939 elm_genlist_item_object_get(const Elm_Object_Item *it)
4941 ELM_OBJ_ITEM_CHECK_OR_RETURN(it, NULL);
4946 elm_genlist_item_update(Elm_Object_Item *it)
4948 ELM_OBJ_ITEM_CHECK_OR_RETURN(it);
4949 Elm_Gen_Item *_it = (Elm_Gen_Item *) it;
4951 if (!_it->item->block) return;
4952 if (_it->generation < _it->wd->generation) return;
4953 _it->item->mincalcd = EINA_FALSE;
4954 _it->item->updateme = EINA_TRUE;
4955 _it->item->block->updateme = EINA_TRUE;
4956 if (_it->wd->update_job) ecore_job_del(_it->wd->update_job);
4957 _it->wd->update_job = ecore_job_add(_update_job, _it->wd);
4961 elm_genlist_item_fields_update(Elm_Object_Item *it,
4963 Elm_Genlist_Item_Field_Flags itf)
4965 ELM_OBJ_ITEM_CHECK_OR_RETURN(it);
4966 Elm_Gen_Item *_it = (Elm_Gen_Item *) it;
4968 if (!_it->item->block) return;
4969 if (_it->generation < _it->wd->generation) return;
4971 if ((!itf) || (itf & ELM_GENLIST_ITEM_FIELD_LABEL))
4972 _item_text_realize(_it, VIEW(_it), &_it->texts, parts);
4973 if ((!itf) || (itf & ELM_GENLIST_ITEM_FIELD_CONTENT))
4975 _it->content_objs = _item_content_unrealize(_it, VIEW(_it),
4976 &_it->contents, parts);
4977 _it->content_objs = _item_content_realize(_it, VIEW(_it),
4978 &_it->contents, parts);
4980 if ((!itf) || (itf & ELM_GENLIST_ITEM_FIELD_STATE))
4981 _item_state_realize(_it, VIEW(_it), &_it->states, parts);
4985 elm_genlist_item_item_class_update(Elm_Object_Item *it,
4986 const Elm_Genlist_Item_Class *itc)
4988 ELM_OBJ_ITEM_CHECK_OR_RETURN(it);
4989 Elm_Gen_Item *_it = (Elm_Gen_Item *) it;
4991 if (!_it->item->block) return;
4992 EINA_SAFETY_ON_NULL_RETURN(itc);
4993 if (_it->generation < _it->wd->generation) return;
4995 _it->item->nocache = EINA_TRUE;
4996 elm_genlist_item_update(it);
4999 EAPI const Elm_Genlist_Item_Class *
5000 elm_genlist_item_item_class_get(const Elm_Object_Item *it)
5002 ELM_OBJ_ITEM_CHECK_OR_RETURN(it, NULL);
5003 Elm_Gen_Item *_it = (Elm_Gen_Item *) it;
5004 if (_it->generation < _it->wd->generation) return NULL;
5008 static Evas_Object *
5009 _elm_genlist_item_label_create(void *data,
5010 Evas_Object *obj __UNUSED__,
5011 Evas_Object *tooltip,
5012 void *it __UNUSED__)
5014 Evas_Object *label = elm_label_add(tooltip);
5017 elm_object_style_set(label, "tooltip");
5018 elm_object_text_set(label, data);
5023 _elm_genlist_item_label_del_cb(void *data,
5024 Evas_Object *obj __UNUSED__,
5025 void *event_info __UNUSED__)
5027 eina_stringshare_del(data);
5031 elm_genlist_item_tooltip_text_set(Elm_Object_Item *it,
5034 ELM_OBJ_ITEM_CHECK_OR_RETURN(it);
5035 text = eina_stringshare_add(text);
5036 elm_genlist_item_tooltip_content_cb_set(it, _elm_genlist_item_label_create,
5038 _elm_genlist_item_label_del_cb);
5042 elm_genlist_item_tooltip_content_cb_set(Elm_Object_Item *it,
5043 Elm_Tooltip_Item_Content_Cb func,
5045 Evas_Smart_Cb del_cb)
5047 ELM_OBJ_ITEM_CHECK_OR_GOTO(it, error);
5048 Elm_Gen_Item *_it = (Elm_Gen_Item *) it;
5050 if ((_it->tooltip.content_cb == func) && (_it->tooltip.data == data))
5053 if (_it->tooltip.del_cb)
5054 _it->tooltip.del_cb((void *) _it->tooltip.data, WIDGET(it), it);
5056 _it->tooltip.content_cb = func;
5057 _it->tooltip.data = data;
5058 _it->tooltip.del_cb = del_cb;
5062 elm_widget_item_tooltip_content_cb_set(_it,
5063 _it->tooltip.content_cb,
5064 _it->tooltip.data, NULL);
5065 elm_widget_item_tooltip_style_set(_it, _it->tooltip.style);
5066 elm_widget_item_tooltip_window_mode_set(_it, _it->tooltip.free_size);
5072 if (del_cb) del_cb((void *)data, NULL, NULL);
5076 elm_genlist_item_tooltip_unset(Elm_Object_Item *it)
5078 ELM_OBJ_ITEM_CHECK_OR_RETURN(it);
5079 Elm_Gen_Item *_it = (Elm_Gen_Item *) it;
5081 if ((VIEW(_it)) && (_it->tooltip.content_cb))
5082 elm_widget_item_tooltip_unset(_it);
5084 if (_it->tooltip.del_cb)
5085 _it->tooltip.del_cb((void *) _it->tooltip.data, WIDGET(_it), _it);
5086 _it->tooltip.del_cb = NULL;
5087 _it->tooltip.content_cb = NULL;
5088 _it->tooltip.data = NULL;
5089 _it->tooltip.free_size = EINA_FALSE;
5090 if (_it->tooltip.style)
5091 elm_genlist_item_tooltip_style_set(it, NULL);
5095 elm_genlist_item_tooltip_style_set(Elm_Object_Item *it,
5098 ELM_OBJ_ITEM_CHECK_OR_RETURN(it);
5099 Elm_Gen_Item *_it = (Elm_Gen_Item *) it;
5101 eina_stringshare_replace(&_it->tooltip.style, style);
5102 if (VIEW(_it)) elm_widget_item_tooltip_style_set(_it, style);
5106 elm_genlist_item_tooltip_style_get(const Elm_Object_Item *it)
5108 return elm_object_item_tooltip_style_get(it);
5112 elm_genlist_item_tooltip_window_mode_set(Elm_Object_Item *it,
5115 ELM_OBJ_ITEM_CHECK_OR_RETURN(it, EINA_FALSE);
5116 Elm_Gen_Item *_it = (Elm_Gen_Item *) it;
5118 _it->tooltip.free_size = disable;
5119 if (VIEW(_it)) return elm_widget_item_tooltip_window_mode_set(_it, disable);
5124 elm_genlist_item_tooltip_window_mode_get(const Elm_Object_Item *it)
5126 return elm_object_tooltip_window_mode_get(VIEW(it));
5130 elm_genlist_item_cursor_set(Elm_Object_Item *it,
5133 ELM_OBJ_ITEM_CHECK_OR_RETURN(it);
5134 Elm_Gen_Item *_it = (Elm_Gen_Item *) it;
5135 eina_stringshare_replace(&_it->mouse_cursor, cursor);
5136 if (VIEW(_it)) elm_widget_item_cursor_set(_it, cursor);
5140 elm_genlist_item_cursor_get(const Elm_Object_Item *it)
5142 return elm_widget_item_cursor_get(it);
5146 elm_genlist_item_cursor_unset(Elm_Object_Item *it)
5148 ELM_OBJ_ITEM_CHECK_OR_RETURN(it);
5149 Elm_Gen_Item *_it = (Elm_Gen_Item *) it;
5151 if (!_it->mouse_cursor) return;
5153 if (VIEW(_it)) elm_widget_item_cursor_unset(_it);
5155 eina_stringshare_del(_it->mouse_cursor);
5156 _it->mouse_cursor = NULL;
5160 elm_genlist_item_cursor_style_set(Elm_Object_Item *it,
5163 elm_widget_item_cursor_style_set(it, style);
5167 elm_genlist_item_cursor_style_get(const Elm_Object_Item *it)
5169 return elm_widget_item_cursor_style_get(it);
5173 elm_genlist_item_cursor_engine_only_set(Elm_Object_Item *it,
5174 Eina_Bool engine_only)
5176 elm_widget_item_cursor_engine_only_set(it, engine_only);
5180 elm_genlist_item_cursor_engine_only_get(const Elm_Object_Item *it)
5182 return elm_widget_item_cursor_engine_only_get(it);
5186 elm_genlist_item_index_get(Elm_Object_Item *it)
5188 ELM_OBJ_ITEM_CHECK_OR_RETURN(it, -1);
5189 Elm_Gen_Item *_it = (Elm_Gen_Item *) it;
5191 if (_it->item->block)
5192 return _it->position + _it->item->block->position;
5197 elm_genlist_mode_set(Evas_Object *obj,
5200 ELM_CHECK_WIDTYPE(obj, widtype);
5201 Widget_Data *wd = elm_widget_data_get(obj);
5203 if (wd->mode == mode) return;
5209 elm_genlist_horizontal_set(Evas_Object *obj,
5212 elm_genlist_mode_set(obj, mode);
5216 elm_genlist_horizontal_mode_set(Evas_Object *obj,
5219 elm_genlist_mode_set(obj, mode);
5223 elm_genlist_mode_get(const Evas_Object *obj)
5225 ELM_CHECK_WIDTYPE(obj, widtype) ELM_LIST_LAST;
5226 Widget_Data *wd = elm_widget_data_get(obj);
5227 if (!wd) return ELM_LIST_LAST;
5232 elm_genlist_horizontal_get(const Evas_Object *obj)
5234 return elm_genlist_mode_get(obj);
5238 elm_genlist_horizontal_mode_get(const Evas_Object *obj)
5240 return elm_genlist_mode_get(obj);
5244 elm_genlist_always_select_mode_set(Evas_Object *obj,
5245 Eina_Bool always_select)
5247 ELM_CHECK_WIDTYPE(obj, widtype);
5248 Widget_Data *wd = elm_widget_data_get(obj);
5250 wd->always_select = always_select;
5254 elm_genlist_always_select_mode_get(const Evas_Object *obj)
5256 ELM_CHECK_WIDTYPE(obj, widtype) EINA_FALSE;
5257 Widget_Data *wd = elm_widget_data_get(obj);
5258 if (!wd) return EINA_FALSE;
5259 return wd->always_select;
5263 elm_genlist_no_select_mode_set(Evas_Object *obj,
5264 Eina_Bool no_select)
5266 ELM_CHECK_WIDTYPE(obj, widtype);
5267 Widget_Data *wd = elm_widget_data_get(obj);
5269 wd->no_select = no_select;
5273 elm_genlist_no_select_mode_get(const Evas_Object *obj)
5275 ELM_CHECK_WIDTYPE(obj, widtype) EINA_FALSE;
5276 Widget_Data *wd = elm_widget_data_get(obj);
5277 if (!wd) return EINA_FALSE;
5278 return wd->no_select;
5282 elm_genlist_compress_mode_set(Evas_Object *obj,
5285 ELM_CHECK_WIDTYPE(obj, widtype);
5286 Widget_Data *wd = elm_widget_data_get(obj);
5288 wd->compress = compress;
5289 if (!compress) elm_genlist_homogeneous_set(obj, EINA_FALSE);
5293 elm_genlist_compress_mode_get(const Evas_Object *obj)
5295 ELM_CHECK_WIDTYPE(obj, widtype) EINA_FALSE;
5296 Widget_Data *wd = elm_widget_data_get(obj);
5297 if (!wd) return EINA_FALSE;
5298 return wd->compress;
5302 elm_genlist_height_for_width_mode_set(Evas_Object *obj,
5303 Eina_Bool height_for_width)
5305 ELM_CHECK_WIDTYPE(obj, widtype);
5306 Widget_Data *wd = elm_widget_data_get(obj);
5308 wd->height_for_width = !!height_for_width;
5309 if (wd->height_for_width)
5311 elm_genlist_homogeneous_set(obj, EINA_FALSE);
5312 elm_genlist_compress_mode_set(obj, EINA_TRUE);
5317 elm_genlist_height_for_width_mode_get(const Evas_Object *obj)
5319 ELM_CHECK_WIDTYPE(obj, widtype) EINA_FALSE;
5320 Widget_Data *wd = elm_widget_data_get(obj);
5321 if (!wd) return EINA_FALSE;
5322 return wd->height_for_width;
5326 elm_genlist_bounce_set(Evas_Object *obj,
5330 ELM_CHECK_WIDTYPE(obj, widtype);
5331 Widget_Data *wd = elm_widget_data_get(obj);
5333 elm_smart_scroller_bounce_allow_set(wd->scr, h_bounce, v_bounce);
5334 wd->h_bounce = h_bounce;
5335 wd->v_bounce = v_bounce;
5339 elm_genlist_bounce_get(const Evas_Object *obj,
5340 Eina_Bool *h_bounce,
5341 Eina_Bool *v_bounce)
5343 ELM_CHECK_WIDTYPE(obj, widtype);
5344 Widget_Data *wd = elm_widget_data_get(obj);
5346 if (h_bounce) *h_bounce = wd->h_bounce;
5347 if (v_bounce) *v_bounce = wd->v_bounce;
5351 elm_genlist_homogeneous_set(Evas_Object *obj,
5352 Eina_Bool homogeneous)
5354 ELM_CHECK_WIDTYPE(obj, widtype);
5355 Widget_Data *wd = elm_widget_data_get(obj);
5357 if (homogeneous) elm_genlist_compress_mode_set(obj, EINA_TRUE);
5358 wd->homogeneous = homogeneous;
5362 elm_genlist_homogeneous_get(const Evas_Object *obj)
5364 ELM_CHECK_WIDTYPE(obj, widtype) EINA_FALSE;
5365 Widget_Data *wd = elm_widget_data_get(obj);
5366 if (!wd) return EINA_FALSE;
5367 return wd->homogeneous;
5371 elm_genlist_block_count_set(Evas_Object *obj,
5374 ELM_CHECK_WIDTYPE(obj, widtype);
5375 Widget_Data *wd = elm_widget_data_get(obj);
5377 wd->max_items_per_block = n;
5378 wd->item_cache_max = wd->max_items_per_block * 2;
5379 _item_cache_clean(wd);
5383 elm_genlist_block_count_get(const Evas_Object *obj)
5385 ELM_CHECK_WIDTYPE(obj, widtype) 0;
5386 Widget_Data *wd = elm_widget_data_get(obj);
5388 return wd->max_items_per_block;
5392 elm_genlist_longpress_timeout_set(Evas_Object *obj,
5395 ELM_CHECK_WIDTYPE(obj, widtype);
5396 Widget_Data *wd = elm_widget_data_get(obj);
5398 wd->longpress_timeout = timeout;
5402 elm_genlist_longpress_timeout_get(const Evas_Object *obj)
5404 ELM_CHECK_WIDTYPE(obj, widtype) 0;
5405 Widget_Data *wd = elm_widget_data_get(obj);
5407 return wd->longpress_timeout;
5411 elm_genlist_scroller_policy_set(Evas_Object *obj,
5412 Elm_Scroller_Policy policy_h,
5413 Elm_Scroller_Policy policy_v)
5415 ELM_CHECK_WIDTYPE(obj, widtype);
5416 Widget_Data *wd = elm_widget_data_get(obj);
5417 if ((!wd) || (!wd->scr)) return;
5418 if ((policy_h >= ELM_SCROLLER_POLICY_LAST) ||
5419 (policy_v >= ELM_SCROLLER_POLICY_LAST))
5421 elm_smart_scroller_policy_set(wd->scr, policy_h, policy_v);
5425 elm_genlist_scroller_policy_get(const Evas_Object *obj,
5426 Elm_Scroller_Policy *policy_h,
5427 Elm_Scroller_Policy *policy_v)
5429 ELM_CHECK_WIDTYPE(obj, widtype);
5430 Widget_Data *wd = elm_widget_data_get(obj);
5431 Elm_Smart_Scroller_Policy s_policy_h, s_policy_v;
5432 if ((!wd) || (!wd->scr)) return;
5433 elm_smart_scroller_policy_get(wd->scr, &s_policy_h, &s_policy_v);
5434 if (policy_h) *policy_h = (Elm_Scroller_Policy)s_policy_h;
5435 if (policy_v) *policy_v = (Elm_Scroller_Policy)s_policy_v;
5439 elm_genlist_realized_items_update(Evas_Object *obj)
5441 ELM_CHECK_WIDTYPE(obj, widtype);
5443 Eina_List *list, *l;
5444 Elm_Object_Item *it;
5446 list = elm_genlist_realized_items_get(obj);
5447 EINA_LIST_FOREACH(list, l, it)
5448 elm_genlist_item_update(it);
5452 elm_genlist_item_mode_set(Elm_Object_Item *it,
5453 const char *mode_type,
5456 ELM_OBJ_ITEM_CHECK_OR_RETURN(it);
5457 Elm_Gen_Item *_it = (Elm_Gen_Item *) it;
5459 Widget_Data *wd = _it->wd;
5461 Elm_Object_Item *it2;
5464 if (!mode_type) return;
5465 if ((_it->generation < _it->wd->generation) ||
5466 elm_widget_item_disabled_get(_it)) return;
5467 if (wd->edit_mode) return;
5469 if ((wd->mode_item == _it) &&
5470 (!strcmp(mode_type, wd->mode_type)) &&
5473 if (!_it->itc->mode_item_style) return;
5474 _it->mode_set = mode_set;
5478 EINA_LIST_FOREACH(wd->selected, l, it2)
5479 if (((Elm_Gen_Item *) it2)->realized)
5480 elm_genlist_item_selected_set(it2, EINA_FALSE);
5484 it2 = elm_genlist_selected_item_get(wd->obj);
5485 if ((it2) && (((Elm_Gen_Item *) it2)->realized))
5486 elm_genlist_item_selected_set(it2, EINA_FALSE);
5489 if (((wd->mode_type) && (strcmp(mode_type, wd->mode_type))) ||
5491 ((_it == wd->mode_item) && (!mode_set)))
5492 _item_mode_unset(wd);
5494 eina_stringshare_replace(&wd->mode_type, mode_type);
5495 if (mode_set) _item_mode_set(_it);
5499 elm_genlist_mode_item_style_get(const Evas_Object *obj)
5501 ELM_CHECK_WIDTYPE(obj, widtype) NULL;
5502 Widget_Data *wd = elm_widget_data_get(obj);
5503 if (!wd) return NULL;
5504 return wd->mode_item->itc->mode_item_style;
5508 elm_genlist_mode_item_style_set(Evas_Object *obj, const char *style)
5510 ELM_CHECK_WIDTYPE(obj, widtype);
5511 Widget_Data *wd = elm_widget_data_get(obj);
5513 if ((style == wd->mode_item->itc->mode_item_style) ||
5514 (style && wd->mode_item->itc->mode_item_style &&
5515 (!strcmp(style, wd->mode_item->itc->mode_item_style))))
5517 eina_stringshare_replace((const char**)&wd->mode_item->itc->mode_item_style, style);
5518 elm_genlist_realized_items_update(obj);
5522 elm_genlist_mode_type_get(const Evas_Object *obj)
5524 ELM_CHECK_WIDTYPE(obj, widtype) NULL;
5525 Widget_Data *wd = elm_widget_data_get(obj);
5526 if (!wd) return NULL;
5527 return wd->mode_type;
5530 EAPI const Elm_Object_Item *
5531 elm_genlist_mode_item_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 (Elm_Object_Item *) wd->mode_item;
5540 elm_genlist_edit_mode_get(const Evas_Object *obj)
5542 ELM_CHECK_WIDTYPE(obj, widtype) EINA_FALSE;
5543 Widget_Data *wd = elm_widget_data_get(obj);
5544 if (!wd) return EINA_FALSE;
5546 return wd->edit_mode;
5550 elm_genlist_edit_mode_set(Evas_Object *obj, Eina_Bool edit_mode)
5552 ELM_CHECK_WIDTYPE(obj, widtype);
5553 Eina_List *list, *l;
5556 Widget_Data *wd = elm_widget_data_get(obj);
5558 if (wd->edit_mode == edit_mode) return;
5560 wd->edit_mode = !!edit_mode;
5561 list = elm_genlist_realized_items_get(obj);
5564 EINA_LIST_FOREACH(list, l, it)
5566 if (it->item->flags != ELM_GENLIST_ITEM_GROUP)
5567 _edit_mode_item_unrealize(it);
5569 _item_cache_zero(wd);
5573 EINA_LIST_FOREACH(list, l, it)
5575 if (it->item->flags != ELM_GENLIST_ITEM_GROUP)
5577 if (it->selected) _item_unselect(it);
5578 if (it->itc->edit_item_style)
5579 _edit_mode_item_realize(it, EINA_TRUE);
5583 if (wd->calc_job) ecore_job_del(wd->calc_job);
5584 wd->calc_job = ecore_job_add(_calc_job, wd);
5588 elm_genlist_reorder_mode_set(Evas_Object *obj,
5589 Eina_Bool reorder_mode)
5591 ELM_CHECK_WIDTYPE(obj, widtype);
5592 Widget_Data *wd = elm_widget_data_get(obj);
5594 wd->reorder_mode = reorder_mode;
5598 elm_genlist_reorder_mode_get(const Evas_Object *obj)
5600 ELM_CHECK_WIDTYPE(obj, widtype) EINA_FALSE;
5601 Widget_Data *wd = elm_widget_data_get(obj);
5602 if (!wd) return EINA_FALSE;
5603 return wd->reorder_mode;
5606 EAPI Elm_Genlist_Item_Flags
5607 elm_genlist_item_flags_get(const Elm_Object_Item *it)
5609 ELM_OBJ_ITEM_CHECK_OR_RETURN(it, ELM_GENLIST_ITEM_MAX);
5610 Elm_Gen_Item *_it = (Elm_Gen_Item *) it;
5611 return _it->item->flags;
5614 EAPI Elm_Genlist_Item_Class *
5615 elm_genlist_item_class_new(void)
5617 Elm_Genlist_Item_Class *itc;
5619 itc = calloc(1, sizeof(Elm_Genlist_Item_Class));
5622 itc->version = ELM_GENLIST_ITEM_CLASS_VERSION;
5624 itc->delete_me = EINA_FALSE;
5630 elm_genlist_item_class_free(Elm_Genlist_Item_Class *itc)
5632 if (itc && (itc->version == ELM_GENLIST_ITEM_CLASS_VERSION))
5634 if (!itc->delete_me) itc->delete_me = EINA_TRUE;
5635 if (itc->refcount > 0) elm_genlist_item_class_unref(itc);
5645 elm_genlist_item_class_ref(Elm_Genlist_Item_Class *itc)
5647 if (itc && (itc->version == ELM_GENLIST_ITEM_CLASS_VERSION))
5650 if (itc->refcount == 0) itc->refcount--;
5655 elm_genlist_item_class_unref(Elm_Genlist_Item_Class *itc)
5657 if (itc && (itc->version == ELM_GENLIST_ITEM_CLASS_VERSION))
5659 if (itc->refcount > 0) itc->refcount--;
5660 if (itc->delete_me && (!itc->refcount))
5661 elm_genlist_item_class_free(itc);
5665 /* for gengrid as of now */
5667 _elm_genlist_page_relative_set(Evas_Object *obj,
5671 Evas_Coord pagesize_h;
5672 Evas_Coord pagesize_v;
5674 ELM_CHECK_WIDTYPE(obj, widtype);
5675 Widget_Data *wd = elm_widget_data_get(obj);
5678 elm_smart_scroller_paging_get(wd->scr, NULL, NULL, &pagesize_h, &pagesize_v);
5679 elm_smart_scroller_paging_set(wd->scr, h_pagerel, v_pagerel, pagesize_h,
5683 /* for gengrid as of now */
5685 _elm_genlist_page_relative_get(const Evas_Object *obj,
5689 ELM_CHECK_WIDTYPE(obj, widtype);
5690 Widget_Data *wd = elm_widget_data_get(obj);
5693 elm_smart_scroller_paging_get(wd->scr, h_pagerel, v_pagerel, NULL, NULL);
5696 /* for gengrid as of now */
5698 _elm_genlist_page_size_set(Evas_Object *obj,
5699 Evas_Coord h_pagesize,
5700 Evas_Coord v_pagesize)
5705 ELM_CHECK_WIDTYPE(obj, widtype);
5706 Widget_Data *wd = elm_widget_data_get(obj);
5708 elm_smart_scroller_paging_get(wd->scr, &pagerel_h, &pagerel_v, NULL, NULL);
5709 elm_smart_scroller_paging_set(wd->scr, pagerel_h, pagerel_v, h_pagesize,
5713 /* for gengrid as of now */
5715 _elm_genlist_current_page_get(const Evas_Object *obj,
5719 ELM_CHECK_WIDTYPE(obj, widtype);
5720 Widget_Data *wd = elm_widget_data_get(obj);
5723 elm_smart_scroller_current_page_get(wd->scr, h_pagenumber, v_pagenumber);
5726 /* for gengrid as of now */
5728 _elm_genlist_last_page_get(const Evas_Object *obj,
5732 ELM_CHECK_WIDTYPE(obj, widtype);
5733 Widget_Data *wd = elm_widget_data_get(obj);
5736 elm_smart_scroller_last_page_get(wd->scr, h_pagenumber, v_pagenumber);
5739 /* for gengrid as of now */
5741 _elm_genlist_page_show(const Evas_Object *obj,
5745 ELM_CHECK_WIDTYPE(obj, widtype);
5746 Widget_Data *wd = elm_widget_data_get(obj);
5749 elm_smart_scroller_page_show(wd->scr, h_pagenumber, v_pagenumber);
5752 /* for gengrid as of now */
5754 _elm_genlist_page_bring_in(const Evas_Object *obj,
5758 ELM_CHECK_WIDTYPE(obj, widtype);
5759 Widget_Data *wd = elm_widget_data_get(obj);
5762 elm_smart_scroller_page_bring_in(wd->scr, h_pagenumber, v_pagenumber);
5766 _elm_genlist_item_unrealize(Elm_Gen_Item *it,
5769 Evas_Object *content;
5771 if (!it->realized) return;
5772 if (it->wd->reorder_it == it) return;
5774 evas_event_freeze(evas_object_evas_get(WIDGET(it)));
5776 evas_object_smart_callback_call(WIDGET(it), SIG_UNREALIZED, it);
5779 ecore_timer_del(it->long_timer);
5780 it->long_timer = NULL;
5783 elm_widget_stringlist_free(it->texts);
5785 elm_widget_stringlist_free(it->contents);
5786 it->contents = NULL;
5787 elm_widget_stringlist_free(it->states);
5790 EINA_LIST_FREE(it->content_objs, content)
5791 evas_object_del(content);
5793 it->unrealize_cb(it);
5795 it->realized = EINA_FALSE;
5796 it->want_unrealize = EINA_FALSE;
5797 evas_event_thaw(evas_object_evas_get(WIDGET(it)));
5798 evas_event_thaw_eval(evas_object_evas_get(WIDGET(it)));
5802 _elm_genlist_item_del_notserious(Elm_Gen_Item *it)
5804 elm_widget_item_pre_notify_del(it);
5805 it->generation = it->wd->generation - 1; /* This means that the item is deleted */
5806 if (it->selected) it->wd->selected = eina_list_remove(it->wd->selected, it);
5808 if (it->itc->func.del)
5809 it->itc->func.del((void *)it->base.data, WIDGET(it));
5813 _elm_genlist_item_del_serious(Elm_Gen_Item *it)
5815 _elm_genlist_item_del_notserious(it);
5816 it->wd->items = eina_inlist_remove(it->wd->items, EINA_INLIST_GET(it));
5817 if (it->tooltip.del_cb)
5818 it->tooltip.del_cb((void *)it->tooltip.data, WIDGET(it), it);
5819 it->wd->walking -= it->walking;
5820 if (it->long_timer) ecore_timer_del(it->long_timer);
5822 it->wd->group_items = eina_list_remove(it->wd->group_items, it);
5826 eina_inlist_sorted_state_free(it->wd->state);
5827 it->wd->state = NULL;
5829 if (it->wd->calc_job) ecore_job_del(it->wd->calc_job);
5830 it->wd->calc_job = ecore_job_add(it->wd->calc_cb, it->wd);
5834 if (it->wd->last_selected_item == (Elm_Object_Item *) it)
5835 it->wd->last_selected_item = NULL;
5836 it->wd->item_count--;