2 # include "elementary_config.h"
7 #define ELM_INTERFACE_ATSPI_ACCESSIBLE_PROTECTED
8 //TIZEN_ONLY(20160329): genlist: enhance accessibility scroll & highlight (30d9a6012e629cd9ea60eae8d576f3ebb94ada86)
9 #define ELM_INTERFACE_ATSPI_COMPONENT_PROTECTED
11 #define ELM_INTERFACE_ATSPI_SELECTION_PROTECTED
12 #define ELM_INTERFACE_ATSPI_WIDGET_ACTION_PROTECTED
13 #define ELM_WIDGET_ITEM_PROTECTED
14 #define ELM_ATSPI_BRIDGE_PROTECTED
16 #include <Elementary.h>
17 #include <Elementary_Cursor.h>
20 #include "elm_widget_genlist.h"
21 #include "elm_interface_scrollable.h"
23 #define MY_PAN_CLASS ELM_GENLIST_PAN_CLASS
25 #define MY_PAN_CLASS_NAME "Elm_Genlist_Pan"
26 #define MY_PAN_CLASS_NAME_LEGACY "elm_genlist_pan"
28 #define MY_CLASS ELM_GENLIST_CLASS
30 #define MY_CLASS_NAME "Elm_Genlist"
31 #define MY_CLASS_NAME_LEGACY "elm_genlist"
33 // internally allocated
34 #define CLASS_ALLOCATED 0x3a70f11f
36 #define REORDERED_ITEM_OFFSET (8 * elm_config_scale_get())
37 #define REORDER_FASTER (15 * elm_config_scale_get())
38 #define REORDER_ANIM_OFFSET (10 * elm_config_scale_get())
39 #define MAX_ITEMS_PER_BLOCK 32
40 #define PINCH_ZOOM_TOLERANCE 0.4
41 #define ITEM_SELECT_TIMER 0.05 // This is needed for highlight effect when item is unhighlighted right after item is highlighted and selected
42 #define ANIM_CNT_MAX (_elm_config->genlist_animation_duration / 1000 * _elm_config->fps) // frame time
43 #define HIGHLIGHT_ALPHA_MAX 0.74
44 #define ELM_ITEM_HIGHLIGHT_TIMER 0.1
45 #define ITEM_QUEUE_MAX 128
46 #define DIMED_ITEM_COLOR 50
47 #define ALIGNED_ITEM_SCALE_FACTOR 1.5
48 #define CENTER_CHECK_GAP 50
51 #define ERR_ABORT(_msg) \
54 if (getenv("ELM_ERROR_ABORT")) abort(); \
57 #define GL_IT(_it) (_it->item)
59 #define IS_ROOT_PARENT_IT(_it) \
60 ((_it->group) || ((GL_IT(_it)->items && GL_IT(_it)->expanded_depth == 0) \
61 &&(!(GL_IT(_it)->type & ELM_GENLIST_ITEM_TREE)))) \
63 #define ELM_PRIV_GENLIST_SIGNALS(cmd) \
64 cmd(SIG_ACTIVATED, "activated", "") \
65 cmd(SIG_CLICKED_DOUBLE, "clicked,double", "") \
66 cmd(SIG_SELECTED, "selected", "") \
67 cmd(SIG_UNSELECTED, "unselected", "") \
68 cmd(SIG_EXPANDED, "expanded", "") \
69 cmd(SIG_CONTRACTED, "contracted", "") \
70 cmd(SIG_EXPAND_REQUEST, "expand,request", "") \
71 cmd(SIG_CONTRACT_REQUEST, "contract,request", "") \
72 cmd(SIG_REALIZED, "realized", "") \
73 cmd(SIG_UNREALIZED, "unrealized", "") \
74 cmd(SIG_DRAG_START_UP, "drag,start,up", "") \
75 cmd(SIG_DRAG_START_DOWN, "drag,start,down", "") \
76 cmd(SIG_DRAG_START_LEFT, "drag,start,left", "") \
77 cmd(SIG_DRAG_START_RIGHT, "drag,start,right", "") \
78 cmd(SIG_DRAG_STOP, "drag,stop", "") \
79 cmd(SIG_DRAG, "drag", "") \
80 cmd(SIG_LONGPRESSED, "longpressed", "") \
81 cmd(SIG_SCROLL_ANIM_START, "scroll,anim,start", "") \
82 cmd(SIG_SCROLL_ANIM_STOP, "scroll,anim,stop", "") \
83 cmd(SIG_SCROLL_DRAG_START, "scroll,drag,start", "") \
84 cmd(SIG_SCROLL_DRAG_STOP, "scroll,drag,stop", "") \
85 cmd(SIG_SCROLL, "scroll", "") \
86 cmd(SIG_EDGE_TOP, "edge,top", "") \
87 cmd(SIG_EDGE_BOTTOM, "edge,bottom", "") \
88 cmd(SIG_EDGE_LEFT, "edge,left", "") \
89 cmd(SIG_EDGE_RIGHT, "edge,right", "") \
90 cmd(SIG_VBAR_DRAG, "vbar,drag", "") \
91 cmd(SIG_VBAR_PRESS, "vbar,press", "") \
92 cmd(SIG_VBAR_UNPRESS, "vbar,unpress", "") \
93 cmd(SIG_HBAR_DRAG, "hbar,drag", "") \
94 cmd(SIG_HBAR_PRESS, "hbar,press", "") \
95 cmd(SIG_HBAR_UNPRESS, "hbar,unpress", "") \
96 cmd(SIG_MULTI_SWIPE_LEFT, "multi,swipe,left", "") \
97 cmd(SIG_MULTI_SWIPE_RIGHT, "multi,swipe,right", "") \
98 cmd(SIG_MULTI_SWIPE_UP, "multi,swipe,up", "") \
99 cmd(SIG_MULTI_SWIPE_DOWN, "multi,swipe,down", "") \
100 cmd(SIG_MULTI_PINCH_OUT, "multi,pinch,out", "") \
101 cmd(SIG_MULTI_PINCH_IN, "multi,pinch,in", "") \
102 cmd(SIG_SWIPE, "swipe", "") \
103 cmd(SIG_MOVED, "moved", "") \
104 cmd(SIG_MOVED_AFTER, "moved,after", "") \
105 cmd(SIG_MOVED_BEFORE, "moved,before", "") \
106 cmd(SIG_INDEX_UPDATE, "index,update", "") \
107 cmd(SIG_TREE_EFFECT_FINISHED , "tree,effect,finished", "") \
108 cmd(SIG_HIGHLIGHTED, "highlighted", "") \
109 cmd(SIG_UNHIGHLIGHTED, "unhighlighted", "") \
110 cmd(SIG_LANG_CHANGED, "language,changed", "") \
111 cmd(SIG_PRESSED, "pressed", "") \
112 cmd(SIG_RELEASED, "released", "") \
113 cmd(SIG_ITEM_FOCUSED, "item,focused", "") \
114 cmd(SIG_ITEM_UNFOCUSED, "item,unfocused", "") \
115 cmd(SIG_ACCESS_CHANGED, "access,changed", "") \
116 cmd(SIG_LOADED, "loaded", "") \
117 cmd(SIG_ATSPI_SCREEN_READER_CHANGED, "atspi,screen,reader,changed", "") \
118 cmd(SIG_WIDGET_ATSPI_HIGHLIGHTED, "atspi,highlighted", "") \
119 cmd(SIG_FILTER_DONE, "filter,done", "")
121 ELM_PRIV_GENLIST_SIGNALS(ELM_PRIV_STATIC_VARIABLE_DECLARE);
123 static const Evas_Smart_Cb_Description _smart_callbacks[] = {
124 ELM_PRIV_GENLIST_SIGNALS(ELM_PRIV_SMART_CALLBACKS_DESC)
125 {SIG_WIDGET_LANG_CHANGED, ""}, /**< handled by elm_widget */
126 {SIG_WIDGET_ACCESS_CHANGED, ""}, /**< handled by elm_widget */
127 {SIG_LAYOUT_FOCUSED, ""}, /**< handled by elm_layout */
128 {SIG_LAYOUT_UNFOCUSED, ""}, /**< handled by elm_layout */
129 {SIG_ITEM_FOCUSED, ""},
130 {SIG_ITEM_UNFOCUSED, ""},
131 //TIZEN_ONLY(20161213): apply screen_reader_changed callback
132 {SIG_ATSPI_SCREEN_READER_CHANGED, ""},
134 //TIZEN_ONLY(20170724): grab highlight using unrealized item
135 {SIG_WIDGET_ATSPI_HIGHLIGHTED, ""},
140 #undef ELM_PRIV_GENLIST_SIGNALS
142 // **** edje interface signals *** //
143 static const char SIGNAL_ENABLED[] = "elm,state,enabled";
144 static const char SIGNAL_DISABLED[] = "elm,state,disabled";
145 static const char SIGNAL_HIGHLIGHTED[] = "elm,state,selected"; // actually highlighted
146 static const char SIGNAL_UNHIGHLIGHTED[] = "elm,state,unselected"; // actually unhighlighted
147 static const char SIGNAL_CLICKED[] = "elm,state,clicked";
148 static const char SIGNAL_EXPANDED[] = "elm,state,expanded";
149 static const char SIGNAL_CONTRACTED[] = "elm,state,contracted";
150 static const char SIGNAL_FLIP_ENABLED[] = "elm,state,flip,enabled";
151 static const char SIGNAL_FLIP_DISABLED[] = "elm,state,flip,disabled";
152 static const char SIGNAL_DECORATE_ENABLED[] = "elm,state,decorate,enabled";
153 static const char SIGNAL_DECORATE_ENABLED_EFFECT[] = "elm,state,decorate,enabled,effect";
154 static const char SIGNAL_DECORATE_DISABLED[] = "elm,state,decorate,disabled";
155 static const char SIGNAL_REORDER_ENABLED[] = "elm,state,reorder,enabled";
156 static const char SIGNAL_REORDER_DISABLED[] = "elm,state,reorder,disabled";
157 static const char SIGNAL_REORDER_MODE_SET[] = "elm,state,reorder,mode_set";
158 static const char SIGNAL_REORDER_MODE_UNSET[] = "elm,state,reorder,mode_unset";
160 static const char SIGNAL_DEFAULT[] = "elm,state,default";
161 static const char SIGNAL_FOCUSED[] = "elm,state,focused";
162 static const char SIGNAL_UNFOCUSED[] = "elm,state,unfocused";
163 static const char SIGNAL_BG_CHANGE[] = "bg_color_change";
164 static const char SIGNAL_ITEM_HIGHLIGHTED[] = "elm,state,highlighted";
165 static const char SIGNAL_ITEM_UNHIGHLIGHTED[] = "elm,state,unhighlighted";
166 static const char SIGNAL_FOCUS_BG_SHOW[] = "elm,state,focus_bg,show";
167 static const char SIGNAL_FOCUS_BG_HIDE[] = "elm,state,focus_bg,hide";
177 static void _item_mouse_down_cb(void *data, Evas *evas, Evas_Object *obj, void *event_info);
178 static void _item_mouse_move_cb(void *data, Evas *evas EINA_UNUSED, Evas_Object *obj, void *event_info);
179 static void _item_mouse_up_cb(void *data, Evas *evas, Evas_Object *obj EINA_UNUSED, void *event_info);
180 static Eina_Bool _long_press_cb(void *data);
182 static void _item_edje_callbacks_add(Elm_Gen_Item *it);
183 static void _item_edje_callbacks_del(Elm_Gen_Item *it);
185 static void _item_block_calc(Item_Block *itb, Evas_Coord vw, Evas_Coord vh);
186 static void _item_min_calc(Elm_Gen_Item *it);
187 static void _item_calc(Elm_Gen_Item *it);
188 static void _item_mouse_callbacks_add(Elm_Gen_Item *, Evas_Object *);
189 static void _item_mouse_callbacks_del(Elm_Gen_Item *, Evas_Object *);
190 static void _item_select(Elm_Gen_Item *it);
191 static void _item_realize(Elm_Gen_Item *it, Eina_Bool calc);
192 static void _item_unrealize(Elm_Gen_Item *it, Eina_Bool calc);
194 static void _expand_toggle_signal_cb(void *data, Evas_Object *obj EINA_UNUSED, const char *emission EINA_UNUSED, const char *source EINA_UNUSED);
195 static void _expand_signal_cb(void *data, Evas_Object *obj EINA_UNUSED, const char *emission EINA_UNUSED, const char *source EINA_UNUSED);
196 static void _contract_signal_cb(void *data, Evas_Object *obj EINA_UNUSED, const char *emission EINA_UNUSED, const char *source EINA_UNUSED);
197 static void _decorate_item_unrealize(Elm_Gen_Item *it);
198 static void _decorate_item_realize(Elm_Gen_Item *it);
199 static void _decorate_all_item_unrealize(Elm_Gen_Item *it);
200 static void _item_queue(Elm_Gen_Item *it, Eina_Compare_Cb cb);
201 static Eina_Bool _queue_idle_enter(void *data);
202 static void _dummy_job(void *data);
203 static void _item_free(Elm_Gen_Item *it);
204 static void _evas_viewport_resize_cb(void *d, Evas *e EINA_UNUSED, void *ei EINA_UNUSED);
205 static Eina_Bool _item_process(Elm_Genlist_Data *sd, Elm_Gen_Item *it);
206 static int _is_item_in_viewport(int viewport_y, int viewport_h, int obj_y, int obj_h);
207 static Eina_Bool _item_filtered_get(Elm_Gen_Item *it);
208 static Eina_Bool _item_focusable_search(Elm_Gen_Item **it, int dir);
210 typedef struct _Size_Cache {
216 // TIZEN ONLY : for banded ux
218 _banded_item_bg_add(Elm_Gen_Item *it, Evas_Object *target)
222 Elm_Genlist_Data *sd = GL_IT(it)->wsd;
224 if (sd->banded_bg_on)
226 bg_area = edje_object_data_get(VIEW(it), "banded_bg_area");
228 if (bg_area && !GL_IT(it)->banded_bg)
230 GL_IT(it)->banded_bg = evas_object_rectangle_add(evas_object_evas_get(WIDGET(it)));
231 edje_object_part_swallow(target, bg_area, GL_IT(it)->banded_bg);
233 snprintf(buf, sizeof(buf), "elm,state,%s,visible", bg_area);
234 edje_object_signal_emit(VIEW(it), buf, "elm");
238 if (!sd->banded_bg_rect)
240 sd->banded_bg_rect = evas_object_rectangle_add(evas_object_evas_get(sd->obj));
241 if (sd->banded_bg_on)
242 evas_object_color_set(sd->banded_bg_rect, 250, 250, 250, 255);
244 evas_object_color_set(sd->banded_bg_rect, 0, 0, 0, 0);
245 evas_object_smart_member_add(sd->banded_bg_rect, sd->pan_obj);
246 elm_widget_sub_object_add(sd->obj, sd->banded_bg_rect);
247 evas_object_move(sd->banded_bg_rect, -9999, -9999);
248 evas_object_resize(sd->banded_bg_rect, 0, 0);
249 evas_object_repeat_events_set(sd->banded_bg_rect, EINA_TRUE);
254 _banded_bg_state_check(Eo *obj, Elm_Genlist_Data *sd)
256 ELM_WIDGET_DATA_GET_OR_RETURN(obj, wd);
258 const char *banded_bg = edje_object_data_get(wd->resize_obj, "banded_bg");
260 if (banded_bg && !strcmp("on", banded_bg))
261 sd->banded_bg_on = EINA_TRUE;
263 sd->banded_bg_on = EINA_FALSE;
267 _banded_item_bg_color_change(Elm_Gen_Item *it, Eina_Bool highlight)
269 if (GL_IT(it)->banded_bg)
271 int alpha = 255 * (1 - 0.04 * GL_IT(it)->banded_color_index);
275 alpha *= HIGHLIGHT_ALPHA_MAX;
277 color = (color * alpha) / 255;
278 evas_object_color_set(GL_IT(it)->banded_bg, color, color, color, alpha);
283 _banded_item_bg_index_color_set(Elm_Gen_Item *it_top, Evas_Coord ox, Evas_Coord oy, Evas_Coord ow, Evas_Coord oh)
286 Elm_Genlist_Data *sd = GL_IT(it_top)->wsd;
287 Elm_Gen_Item *prev = NULL, *next = it_top;
288 int item_count, i = 0, j = 0;
292 if (!sd->banded_bg_on || !next->realized) return;
294 item_count = eina_list_count(l = elm_genlist_realized_items_get(WIDGET(it_top)));
297 while ((i < item_count) && (next))
299 if (!next->realized || next->want_hidden)
302 next = ELM_GEN_ITEM_FROM_INLIST(EINA_INLIST_GET(next)->next);
306 if (next != it_top && !ELM_RECTS_INTERSECT(GL_IT(next)->scrl_x, GL_IT(next)->scrl_y,
307 GL_IT(next)->w, GL_IT(next)->h, ox, oy, ow, oh))
312 ((GL_IT(prev)->type == ELM_GENLIST_ITEM_GROUP) ||
313 (prev->itc->item_style && !strncmp("group", prev->itc->item_style, 5))))
316 if (GL_IT(next)->banded_bg)
318 GL_IT(next)->banded_color_index = j;
319 _banded_item_bg_color_change(next, next->highlighted);
324 next = ELM_GEN_ITEM_FROM_INLIST(EINA_INLIST_GET(next)->next);
327 if ((j < 0) || (j > (BANDED_MAX_ITEMS - 1)))
337 _item_content_free(Evas_Object *content)
339 // FIXME: For animation, befor del, processing edc.
340 if (evas_object_smart_type_check(content, "elm_layout"))
341 edje_object_message_signal_process(elm_layout_edje_get(content));
342 // FIXME: If parent-child relationship was broken before 'ic'
343 // is deleted, freeze_pop will not be called. ex) elm_slider
344 // If layout is used instead of edje, this problme can be
346 if (elm_widget_is(content) && (0 != elm_widget_scroll_freeze_get(content)))
347 elm_widget_scroll_freeze_pop(content);
348 evas_object_del(content);
352 _item_cache_free(Elm_Genlist_Data *sd, Item_Cache *ic)
357 if (ic->base_view) evas_object_del(ic->base_view);
358 ic->item_class = NULL;
359 EINA_LIST_FREE(ic->contents, c)
361 _item_content_free(c);
363 sd->item_cache = eina_inlist_remove(sd->item_cache, EINA_INLIST_GET(ic));
364 sd->item_cache_count--;
365 // Free should be performed after inlist is poped
370 _item_cache_all_free(Elm_Genlist_Data *sd)
372 // It would be better not to use
373 // EINA_INLIST_FOREACH or EINA_INLIST_FOREACH_SAFE
374 while (sd->item_cache)
376 Item_Cache *ic = EINA_INLIST_CONTAINER_GET(sd->item_cache->last, Item_Cache);
377 _item_cache_free(sd, ic);
379 sd->item_cache = NULL;
380 sd->item_cache_count = 0;
384 _item_cache_push(Elm_Gen_Item *it, Eina_List *contents)
386 Elm_Genlist_Data *sd = GL_IT(it)->wsd;
387 Item_Cache *ic = NULL;
388 Evas_Object *content;
392 if (VIEW(it)) evas_object_del(VIEW(it));
394 EINA_LIST_FREE(contents, content)
396 _item_content_free(content);
401 if (sd->item_cache_count >= sd->item_cache_max)
403 ic = EINA_INLIST_CONTAINER_GET(sd->item_cache->last, Item_Cache);
404 _item_cache_free(sd, ic);
407 ic = ELM_NEW(Item_Cache);
410 if (VIEW(it)) evas_object_del(VIEW(it));
412 EINA_LIST_FREE(contents, content)
414 _item_content_free(content);
418 // set item's state as default before pushing item into cache.
419 edje_object_signal_emit(VIEW(it), SIGNAL_DEFAULT, "elm");
420 edje_object_message_signal_process(VIEW(it));
422 edje_object_mirrored_set(VIEW(it),
423 elm_widget_mirrored_get(WIDGET(it)));
424 edje_object_scale_set(VIEW(it),
425 elm_widget_scale_get(WIDGET(it))
426 * elm_config_scale_get());
428 ic->base_view = VIEW(it);
429 ic->multiline = GL_IT(it)->multiline;
430 ic->item_class = it->itc;
431 ic->contents = contents;
432 evas_object_hide(ic->base_view);
433 evas_object_move(ic->base_view, -9999, -9999);
435 sd->item_cache = eina_inlist_prepend(sd->item_cache, EINA_INLIST_GET(ic));
436 sd->item_cache_count++;
442 _item_cache_pop(Elm_Gen_Item *it)
444 Item_Cache *ic = NULL;
446 Elm_Genlist_Data *sd = GL_IT(it)->wsd;
448 if (!it->itc) return EINA_FALSE;
450 EINA_INLIST_FOREACH_SAFE(sd->item_cache, l, ic)
452 if (it->itc && ic->item_class &&
453 (it->itc == ic->item_class))
456 eina_inlist_remove(sd->item_cache, EINA_INLIST_GET(ic));
457 sd->item_cache_count--;
459 VIEW(it) = ic->base_view;
460 GL_IT(it)->multiline = ic->multiline;
462 eina_list_free(ic->contents);
471 // TIZEN_ONLY(20150828) : to prevent unnecessary genlist rendering
472 // _changed is called instead of evas_object_smart_changed API.
474 _changed(Evas_Object *pan_obj)
476 Elm_Genlist_Pan_Data *psd = eo_data_scope_get(pan_obj, MY_PAN_CLASS);
477 Elm_Genlist_Data *sd = psd->wsd;
479 if (sd->viewport_w > 1) evas_object_smart_changed(pan_obj);
484 _elm_genlist_pan_elm_pan_pos_set(Eo *obj, Elm_Genlist_Pan_Data *psd, Evas_Coord x, Evas_Coord y)
486 if ((x == psd->wsd->pan_x) && (y == psd->wsd->pan_y)) return;
488 if (y > psd->wsd->pan_y) psd->wsd->dir = 1;
489 else psd->wsd->dir = -1;
497 _elm_genlist_pan_elm_pan_pos_get(Eo *obj EINA_UNUSED, Elm_Genlist_Pan_Data *psd, Evas_Coord *x, Evas_Coord *y)
499 if (x) *x = psd->wsd->pan_x;
500 if (y) *y = psd->wsd->pan_y;
503 // TIZEN_ONLY(20150705): genlist item align feature
504 static Elm_Gen_Item *
505 _elm_genlist_pos_adjust_xy_item_get(const Evas_Object *obj,
511 ELM_GENLIST_CHECK(obj) NULL;
512 ELM_GENLIST_DATA_GET(obj, sd);
514 EINA_INLIST_FOREACH(sd->blocks, itb)
518 if (!ELM_RECTS_INTERSECT(itb->x - sd->pan_x,
520 sd->minw, itb->minh, x, y, 1, 1))
522 EINA_LIST_FOREACH(itb->items, l, it)
524 Evas_Coord itx, ity, itw, ith;
526 itx = itb->x + it->x - sd->pan_x;
527 ity = itb->y + it->y - sd->pan_y;
529 itw = (GL_IT(it)->w ? GL_IT(it)->w : sd->minw);
530 ith = GL_IT(it)->minh;
532 if (ELM_RECTS_INTERSECT(itx, ity, itw, ith, x, y, 1, 1))
540 static Elm_Gen_Item *
541 _adjust_item_align(Elm_Gen_Item *it)
543 if (!it) return NULL;
546 Elm_Gen_Item *adjust_item = it;
547 Elm_Object_Item *eo_item = NULL;
548 Elm_Genlist_Data *sd = GL_IT(it)->wsd;
550 ELM_WIDGET_DATA_GET_OR_RETURN(WIDGET(adjust_item), wd, NULL);
552 if (!wd || !(wd->scroll_item_align_enable)) return it;
553 if (!sd || !sd->aligned_item || (it == sd->aligned_item)) return it;
555 direction = GL_IT(adjust_item)->scrl_y - GL_IT(sd->aligned_item)->scrl_y;
556 while (adjust_item && loop_count < 10)
558 const char *align = NULL;
559 if (!VIEW(adjust_item))
561 _item_realize(adjust_item, EINA_TRUE);
562 align = edje_object_data_get(VIEW(adjust_item), "align");
563 _item_unrealize(adjust_item, EINA_TRUE);
566 align = edje_object_data_get(VIEW(adjust_item), "align");
568 if (align && !strcmp(align, "off"))
571 eo_item = elm_genlist_item_prev_get(EO_OBJ(adjust_item));
573 eo_item = elm_genlist_item_next_get(EO_OBJ(adjust_item));
574 adjust_item = eo_data_scope_get(eo_item, ELM_GENLIST_ITEM_CLASS);
581 if (adjust_item) return adjust_item;
584 while (adjust_item && loop_count < 10)
586 const char *align = NULL;
587 if (!VIEW(adjust_item))
589 _item_realize(adjust_item, EINA_TRUE);
590 align = edje_object_data_get(VIEW(adjust_item), "align");
591 _item_unrealize(adjust_item, EINA_TRUE);
594 align = edje_object_data_get(VIEW(adjust_item), "align");
596 if (align && !strcmp(align, "off"))
599 eo_item = elm_genlist_item_prev_get(EO_OBJ(adjust_item));
601 eo_item = elm_genlist_item_next_get(EO_OBJ(adjust_item));
602 adjust_item = eo_data_scope_get(eo_item, ELM_GENLIST_ITEM_CLASS);
616 _elm_genlist_pan_elm_pan_pos_adjust(Eo *obj EINA_UNUSED, Elm_Genlist_Pan_Data *psd, Evas_Coord *x EINA_UNUSED, Evas_Coord *y)
618 ELM_WIDGET_DATA_GET_OR_RETURN(psd->wobj, wd);
619 Elm_Genlist_Data *sd = psd->wsd;
621 if (!(wd->scroll_item_align_enable)) return;
625 Elm_Object_Item *eo_it;
627 Evas_Coord cx = 0, cy = 0;
628 Evas_Coord it_y, it_h;
631 eo_do(sd->obj, elm_interface_scrollable_content_viewport_geometry_get
632 (NULL, NULL, &vw, &vh));
633 if (!strcmp(wd->scroll_item_valign, "center"))
639 sd->adjusted_item = _elm_genlist_pos_adjust_xy_item_get(sd->obj, cx, cy);
641 if ((abs(*y) > FLICK_GAP) && (sd->adjusted_item == sd->aligned_item))
643 Elm_Gen_Item *adjusted_item = NULL;
645 eo_it = elm_genlist_item_next_get(EO_OBJ(sd->adjusted_item));
647 eo_it = elm_genlist_item_prev_get(EO_OBJ(sd->adjusted_item));
648 adjusted_item = eo_data_scope_get(eo_it, ELM_GENLIST_ITEM_CLASS);
650 sd->adjusted_item = adjusted_item;
652 sd->adjusted_item = _adjust_item_align(sd->adjusted_item);
653 if (!sd->adjusted_item) return;
655 cy += psd->wsd->pan_y;
656 it_y = sd->adjusted_item->y + GL_IT(sd->adjusted_item)->block->y;
657 it_h = GL_IT(sd->adjusted_item)->h;
659 if (GL_IT(sd->adjusted_item)->h <= vh)
661 it_h = it_y + (it_h / 2);
666 int it_b_y = it_y + it_h;
668 if (it_y <= cy && it_y >= cy - half_vh)
670 *y -= half_vh - (cy - it_y);
672 else if (it_b_y >= cy && it_b_y <= cy + half_vh)
674 *y += half_vh - (it_b_y - cy);
678 if (!*y && !sd->unhighlighted)
679 sd->adjusted_item = NULL;
681 evas_object_smart_changed(sd->pan_obj);
686 _elm_genlist_pan_elm_pan_pos_max_get(Eo *obj, Elm_Genlist_Pan_Data *psd, Evas_Coord *x, Evas_Coord *y)
690 evas_object_geometry_get(obj, NULL, NULL, &ow, &oh);
691 ow = psd->wsd->minw - ow;
693 oh = psd->wsd->minh - oh;
700 _elm_genlist_pan_elm_pan_pos_min_get(Eo *obj EINA_UNUSED, Elm_Genlist_Pan_Data *_pd EINA_UNUSED, Evas_Coord *x,Evas_Coord *y)
707 _elm_genlist_pan_elm_pan_content_size_get(Eo *obj EINA_UNUSED, Elm_Genlist_Pan_Data *psd, Evas_Coord *w, Evas_Coord *h)
709 if (w) *w = psd->wsd->minw;
710 if (h) *h = psd->wsd->minh;
714 _elm_genlist_pan_evas_object_smart_del(Eo *obj, Elm_Genlist_Pan_Data *psd)
716 ecore_job_del(psd->resize_job);
718 eo_do_super(obj, MY_PAN_CLASS, evas_obj_smart_del());
722 _elm_genlist_pan_evas_object_smart_move(Eo *obj, Elm_Genlist_Pan_Data *psd, Evas_Coord _gen_param2 EINA_UNUSED,
723 Evas_Coord _gen_param3 EINA_UNUSED)
730 _elm_genlist_pan_evas_object_smart_resize(Eo *obj, Elm_Genlist_Pan_Data *psd, Evas_Coord w, Evas_Coord h)
732 if ((w > 1 || h > 1))
734 if (psd->wsd->queue && !psd->wsd->queue_idle_enterer)
736 psd->wsd->queue_idle_enterer = ecore_idle_enterer_add(_queue_idle_enter, psd->wsd);
739 if (psd->wsd->mode == ELM_LIST_COMPRESS &&
740 psd->wsd->prev_viewport_w != w)
743 ELM_WIDGET_DATA_GET_OR_RETURN(psd->wsd->obj, wd);
744 EINA_INLIST_FOREACH(psd->wsd->blocks, itb)
748 EINA_LIST_FOREACH(itb->items, l, it)
750 if (!wd->scroll_item_align_enable && !GL_IT(it)->multiline) continue;
751 if (GL_IT(it)->wsd->realization_mode)
753 GL_IT(it)->calc_done = EINA_FALSE;
754 GL_IT(it)->block->calc_done = EINA_FALSE;
758 GL_IT(it)->resized = EINA_TRUE;
761 GL_IT(it)->calc_done = EINA_FALSE;
762 GL_IT(it)->block->calc_done = EINA_FALSE;
764 else _item_queue(it, NULL);
768 psd->wsd->prev_viewport_w = w;
770 psd->wsd->viewport_w = w;
771 psd->wsd->viewport_h = h;
773 psd->wsd->calc_done = EINA_FALSE;
778 _item_text_realize(Elm_Gen_Item *it,
784 if (it->itc->func.text_get)
789 source = elm_widget_stringlist_get
790 (edje_object_data_get(target, "texts"));
791 EINA_LIST_FREE(source, key)
793 if (parts && fnmatch(parts, key, FNM_PERIOD))
796 char *s = it->itc->func.text_get
797 ((void *)WIDGET_ITEM_DATA_GET(EO_OBJ(it)), WIDGET(it), key);
801 edje_object_part_text_escaped_set(target, key, s);
804 snprintf(buf, sizeof(buf), "elm,state,%s,visible", key);
805 edje_object_signal_emit(target, buf, "elm");
809 edje_object_part_text_set(target, key, "");
810 snprintf(buf, sizeof(buf), "elm,state,%s,hidden", key);
811 edje_object_signal_emit(target, buf, "elm");
814 edje_object_message_signal_process(target);
815 if (_elm_atspi_enabled())
816 elm_interface_atspi_accessible_name_changed_signal_emit(EO_OBJ(it));
821 _changed_size_hints(void *data, Evas *e EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
823 Elm_Gen_Item *it = data;
824 GL_IT(it)->calc_done = EINA_FALSE;
825 GL_IT(it)->block->calc_done = EINA_FALSE;
826 GL_IT(it)->wsd->calc_done = EINA_FALSE;
827 _changed(GL_IT(it)->wsd->pan_obj);
830 // FIXME: There are applications which do not use elm_win as top widget.
831 // This is workaround! Those could not use focus!
833 static Eina_Bool _focus_enabled(Evas_Object *obj)
835 if (!elm_widget_focus_get(obj)) return EINA_FALSE;
837 const Evas_Object *win = elm_widget_top_get(obj);
838 const char *type = evas_object_type_get(win);
840 if (type && !strcmp(type, "elm_win"))
842 return elm_win_focus_highlight_enabled_get(win);
849 _widget_calculate_recursive(Eo *obj)
851 Elm_Widget_Smart_Data *pd = NULL;
855 if (!eo_isa(obj, ELM_WIDGET_CLASS)) return;
857 pd = eo_data_scope_get(obj, ELM_WIDGET_CLASS);
860 if (!evas_object_smart_need_recalculate_get(obj) &&
861 !evas_object_smart_need_recalculate_get(pd->resize_obj))
864 EINA_LIST_FOREACH(pd->subobjs, l, child)
865 _widget_calculate_recursive(child);
867 evas_object_smart_calculate(obj);
871 _item_content_realize(Elm_Gen_Item *it,
873 Eina_List **contents,
878 Evas_Object *content;
885 EINA_LIST_FREE(*contents, content)
886 _item_content_free(content);
888 if ((!it->itc->func.content_get) &&
889 ((it->itc->version < 3) || (!it->itc->func.reusable_content_get))) return;
891 source = elm_widget_stringlist_get(edje_object_data_get(target, src));
893 EINA_LIST_FREE(source, key)
895 if (parts && fnmatch(parts, key, FNM_PERIOD))
898 Evas_Object *old = NULL;
899 old = edje_object_part_swallow_get(target, key);
901 // Reuse content by popping from the cache
903 if (it->itc->version >= 3 && it->itc->func.reusable_content_get)
904 content = it->itc->func.reusable_content_get(
905 (void *)WIDGET_ITEM_DATA_GET(EO_OBJ(it)), WIDGET(it), key, old);
908 // Call the content get
909 if (it->itc->func.content_get)
910 content = it->itc->func.content_get
911 ((void *)WIDGET_ITEM_DATA_GET(EO_OBJ(it)), WIDGET(it), key);
914 snprintf(buf, sizeof(buf), "elm,state,%s,hidden", key);
915 edje_object_signal_emit(target, buf, "elm");
921 // FIXME: Genlist item doesn't update its size when the size of
922 // content is changed, so deferred calculation for content should
923 // be performed before realization.
924 if (eo_isa(content, ELM_WIDGET_CLASS))
926 ELM_WIDGET_DATA_GET_OR_RETURN(content, wd);
928 // FIXME : Layout need sizing eval before group calculate
929 if (eo_class_get(content) == ELM_LAYOUT_CLASS)
930 eo_do(content, elm_obj_layout_sizing_eval());
932 _widget_calculate_recursive(content);
935 if (!edje_object_part_swallow(target, key, content))
937 ERR("%s (%p) can not be swallowed into %s",
938 evas_object_type_get(content), content, key);
939 evas_object_del(content);
942 elm_widget_sub_object_add(WIDGET(it), content);
944 *contents = eina_list_append(*contents, content);
946 if (eo_do_ret(EO_OBJ(it), tmp, elm_wdg_item_disabled_get()))
947 elm_widget_disabled_set(content, EINA_TRUE);
949 if (GL_IT(it)->wsd->realization_mode)
951 evas_object_event_callback_add
952 (content, EVAS_CALLBACK_CHANGED_SIZE_HINTS,
953 _changed_size_hints, it);
956 snprintf(buf, sizeof(buf), "elm,state,%s,visible", key);
957 edje_object_signal_emit(target, buf, "elm");
959 // If content object is focused,
960 // genlist item should be focused.
961 if (elm_widget_focused_object_get(content))
963 if (GL_IT(it)->wsd->focused_item != it)
964 elm_object_item_focus_set(EO_OBJ(it), EINA_TRUE);
966 GL_IT(it)->wsd->focused_content = content;
969 if (old && content != old)
971 *contents = eina_list_remove(*contents, old);
972 _item_content_free(old);
978 _item_state_realize(Elm_Gen_Item *it,
982 if (it->itc->func.state_get)
988 src = elm_widget_stringlist_get
989 (edje_object_data_get(target, "states"));
990 EINA_LIST_FREE(src, key)
992 if (parts && fnmatch(parts, key, FNM_PERIOD))
995 Eina_Bool on = it->itc->func.state_get
996 ((void *)WIDGET_ITEM_DATA_GET(EO_OBJ(it)), WIDGET(it), key);
1000 snprintf(buf, sizeof(buf), "elm,state,%s,active", key);
1001 edje_object_signal_emit(target, buf, "elm");
1005 snprintf(buf, sizeof(buf), "elm,state,%s,passive", key);
1006 edje_object_signal_emit(target, buf, "elm");
1013 _view_theme_update(Elm_Gen_Item *it, Evas_Object *view, const char *style)
1019 snprintf(buf, sizeof(buf), "item/%s", style ? : "default");
1021 Elm_Theme_Apply th_ret =
1022 elm_widget_theme_object_set(WIDGET(it), view, "genlist", buf,
1023 elm_widget_style_get(WIDGET(it)));
1024 if (th_ret == ELM_THEME_APPLY_FAILED)
1026 ERR("%s is not a valid genlist item style. "
1027 "Automatically falls back into default style.",
1029 elm_widget_theme_object_set
1030 (WIDGET(it), view, "genlist", "item/default", "default");
1033 edje_object_mirrored_set(view, elm_widget_mirrored_get(WIDGET(it)));
1034 edje_object_scale_set(view, elm_widget_scale_get(WIDGET(it))
1035 * elm_config_scale_get());
1037 GL_IT(it)->multiline = EINA_FALSE;
1038 Eina_List *txts = elm_widget_stringlist_get
1039 (edje_object_data_get(view, "texts"));
1040 EINA_LIST_FOREACH(txts, l, key)
1042 const Evas_Object *txt_obj = NULL;
1043 const char *type = NULL;
1044 txt_obj = edje_object_part_object_get(view, key);
1045 if (txt_obj) type = evas_object_type_get(txt_obj);
1046 if (!type) continue;
1047 if (type && strcmp(type, "textblock")) continue;
1049 const Evas_Textblock_Style *tb_style =
1050 evas_object_textblock_style_get(txt_obj);
1053 const char *str = evas_textblock_style_get(tb_style);
1056 if (strstr(str, "wrap="))
1058 GL_IT(it)->multiline = EINA_TRUE;
1064 eina_list_free(txts);
1067 static Evas_Object *
1068 _view_create(Elm_Gen_Item *it, const char *style)
1070 Evas_Object *view = edje_object_add(evas_object_evas_get(WIDGET(it)));
1071 evas_object_smart_member_add(view, GL_IT(it)->wsd->pan_obj);
1072 elm_widget_sub_object_add(WIDGET(it), view);
1073 edje_object_scale_set(view, elm_widget_scale_get(WIDGET(it)) *
1074 elm_config_scale_get());
1076 _view_theme_update(it, view, style);
1081 _view_clear(Evas_Object *view, Eina_List **contents)
1086 Eina_List *texts = elm_widget_stringlist_get
1087 (edje_object_data_get(view, "texts"));
1088 EINA_LIST_FREE(texts, part)
1089 edje_object_part_text_set(view, part, NULL);
1093 EINA_LIST_FREE(*contents, c)
1094 _item_content_free(c);
1099 _view_inflate(Evas_Object *view, Elm_Gen_Item *it, Eina_List **contents)
1102 _item_text_realize(it, view, NULL);
1103 if (contents) _item_content_realize(it, view, contents, "contents", NULL);
1104 _item_state_realize(it, view, NULL);
1108 _elm_genlist_item_index_update(Elm_Gen_Item *it)
1110 if (it->position_update || GL_IT(it)->block->position_update)
1112 evas_object_smart_callback_call(WIDGET(it), SIG_INDEX_UPDATE, EO_OBJ(it));
1113 it->position_update = EINA_FALSE;
1118 _access_info_cb(void *data, Evas_Object *obj EINA_UNUSED)
1123 Elm_Gen_Item *it = (Elm_Gen_Item *)data;
1124 ELM_GENLIST_ITEM_CHECK_OR_RETURN(it, NULL);
1126 buf = eina_strbuf_new();
1128 if (it->itc->func.text_get)
1134 elm_widget_stringlist_get(edje_object_data_get(VIEW(it), "texts"));
1136 EINA_LIST_FREE(texts, key)
1138 char *s = it->itc->func.text_get
1139 ((void *)WIDGET_ITEM_DATA_GET(EO_OBJ(it)), WIDGET(it), key);
1141 s = _elm_util_mkup_to_text(s);
1145 if (eina_strbuf_length_get(buf) > 0) eina_strbuf_append(buf, ", ");
1146 eina_strbuf_append(buf, s);
1152 ret = eina_strbuf_string_steal(buf);
1153 eina_strbuf_free(buf);
1158 _access_state_cb(void *data, Evas_Object *obj EINA_UNUSED)
1160 Elm_Gen_Item *it = (Elm_Gen_Item *)data;
1162 ELM_GENLIST_ITEM_CHECK_OR_RETURN(it, NULL);
1164 if (eo_do_ret(EO_OBJ(it), ret, elm_wdg_item_disabled_get()))
1165 return strdup(E_("Disabled"));
1171 _access_activate_cb(void *data,
1172 Evas_Object *part_obj EINA_UNUSED,
1173 Elm_Object_Item *item EINA_UNUSED)
1175 Elm_Gen_Item *it = data;
1176 Evas_Object *parent = WIDGET(it);
1180 if (evas_object_freeze_events_get(parent)) return;
1181 parent = evas_object_smart_parent_get(parent);
1188 _access_widget_item_register(Elm_Gen_Item *it)
1190 Elm_Access_Info *ai;
1191 Eina_List *orders = NULL;
1192 Eina_List *l = NULL;
1193 Evas_Object *c, *child, *ret;
1194 Eina_List *listn, *ln;
1195 Eina_List *texts, *contents;
1197 if (!_elm_config->access_mode) return;
1199 /* access: unregister item which have no text and content */
1200 texts = elm_widget_stringlist_get(edje_object_data_get(VIEW(it), "texts"));
1201 contents = elm_widget_stringlist_get(edje_object_data_get(VIEW(it),
1203 if (!texts && !contents) return;
1204 eina_list_free(texts);
1205 eina_list_free(contents);
1207 _elm_access_widget_item_unregister(it->base);
1208 // FIXME: if item->view is not it->item->deco_all_view!!
1209 if (it->deco_all_view)
1211 Evas_Object *acc = elm_access_object_register
1212 (it->deco_all_view, WIDGET(it));
1213 it->base->access_obj = acc;
1217 _elm_access_widget_item_register(it->base);
1220 ai = _elm_access_info_get(eo_do_ret(EO_OBJ(it), ret, elm_wdg_item_access_object_get()));
1221 _elm_access_callback_set(ai, ELM_ACCESS_INFO, _access_info_cb, it);
1222 _elm_access_callback_set(ai, ELM_ACCESS_STATE, _access_state_cb, it);
1223 _elm_access_activate_callback_set(ai, _access_activate_cb, it);
1225 elm_object_item_access_order_unset(EO_OBJ(it));
1228 EINA_LIST_FOREACH(GL_IT(it)->flip_content_objs, l, c)
1230 if (elm_widget_can_focus_get(c))
1232 orders = eina_list_append(orders, c);
1238 if (it->deco_all_view)
1240 EINA_LIST_FOREACH(GL_IT(it)->deco_all_contents, l, c)
1242 if (elm_widget_can_focus_get(c))
1244 orders = eina_list_append(orders, c);
1248 EINA_LIST_FOREACH(it->content_objs, l, c)
1250 if (elm_widget_can_focus_get(c))
1252 /*FIXME The below change is done to push datetime's access objects
1253 like date field and time field in to genlist focus list to get focus.*/
1254 listn = elm_widget_can_focus_child_list_get(c);
1257 EINA_LIST_FOREACH(listn, ln, child)
1259 orders = eina_list_append(orders, child);
1264 orders = eina_list_append(orders, c);
1270 elm_object_item_access_order_set(EO_OBJ(it), orders);
1274 _item_unrealize(Elm_Gen_Item *it,
1277 Evas_Object *content;
1278 Eina_List *cache = NULL;
1280 if (!it->realized) return;
1282 if (GL_IT(it)->wsd->reorder.it == it)
1284 WRN("reordering item should not be unrealized");
1289 evas_object_smart_callback_call(WIDGET(it), SIG_UNREALIZED, EO_OBJ(it));
1290 _elm_access_widget_item_unregister(it->base);
1291 elm_object_item_access_order_unset(EO_OBJ(it));
1292 //TIZEN_ONLY(20150709) Do not register children of MANAGES_DESCENDATS objects
1293 if (_elm_atspi_enabled())
1295 elm_interface_atspi_accessible_removed(EO_OBJ(it));
1296 elm_interface_atspi_accessible_children_changed_del_signal_emit(GL_IT(it)->wsd->obj, EO_OBJ(it));
1302 Elm_Widget_Item_Signal_Data *wisd;
1303 EINA_LIST_FOREACH(it->base->signals, l, wisd)
1305 eo_do(EO_OBJ(it), elm_wdg_item_signal_callback_del
1306 (wisd->emission, wisd->source, (Elm_Object_Item_Signal_Cb)wisd->func));
1309 _decorate_item_unrealize(it);
1310 _decorate_all_item_unrealize(it);
1312 _item_edje_callbacks_del(it);
1314 _item_mouse_callbacks_del(it, VIEW(it));
1315 if (!calc && it->item->proxy)
1317 evas_object_image_source_visible_set(it->item->proxy, EINA_TRUE);
1318 evas_object_smart_member_del(it->item->proxy);
1319 evas_object_del(it->item->proxy);
1320 it->item->proxy = NULL;
1323 EINA_LIST_FREE(GL_IT(it)->flip_content_objs, content)
1324 evas_object_del(content);
1325 if (it->spacer) evas_object_del(it->spacer);
1326 _view_clear(VIEW(it), NULL);
1328 // TIZEN ONLY : for banded ux
1329 if (!TIZEN_PROFILE_WEARABLE)
1331 if (GL_IT(it)->banded_bg)
1332 ELM_SAFE_FREE(GL_IT(it)->banded_bg, evas_object_del);
1333 if (GL_IT(it)->wsd->banded_bg_on)
1335 if (it->item->banded_anim) ecore_animator_del(it->item->banded_anim);
1336 it->item->banded_anim = NULL;
1340 if (GL_IT(it)->highlight_timer)
1342 ecore_timer_del(GL_IT(it)->highlight_timer);
1343 GL_IT(it)->highlight_timer = NULL;
1347 ecore_timer_del(it->long_timer);
1348 it->long_timer = NULL;
1351 eo_do(EO_OBJ(it), elm_wdg_item_track_cancel());
1352 //TIZEN_ONLY(20161013): clean up elm color class feature
1353 if (it->base->color_classes)
1354 edje_object_color_class_clear(VIEW(it));
1356 EINA_LIST_FREE(it->content_objs, content)
1358 if (it->itc->version >= 3 && it->itc->func.reusable_content_get)
1360 // Unfocus content object for initialization.
1361 if (GL_IT(it)->wsd->focused_content == content)
1363 elm_object_focus_set(content, EINA_FALSE);
1364 GL_IT(it)->wsd->focused_content = NULL;
1366 if (elm_widget_disabled_get(content))
1367 elm_widget_disabled_set(content, EINA_FALSE);
1369 cache = eina_list_append(cache, content);
1373 if (GL_IT(it)->wsd->focused_content == content)
1374 GL_IT(it)->wsd->focused_content = NULL;
1375 elm_object_focus_set(content, EINA_FALSE);
1376 evas_object_del(content);
1380 _item_cache_push(it, cache);
1382 it->realized = EINA_FALSE;
1386 _item_block_unrealize(Item_Block *itb)
1389 const Eina_List *l, *ll;
1390 Evas_Object *content;
1391 Eina_Bool unrealize = EINA_TRUE;
1393 // Do not check itb->realized
1394 // because it->item->block can be changed
1396 EINA_LIST_FOREACH(itb->items, l, it)
1398 if (!(((GL_IT(it)->wsd->reorder_force) || (GL_IT(it)->wsd->reorder_mode))
1399 && (GL_IT(it)->wsd->reorder.it == it))
1400 && !it->flipped && it->realized)
1402 /* FIXME: when content is on focused and unrealize item,
1403 focus is set to other object and scroll will be bring in */
1404 if (_elm_config->access_mode)
1406 EINA_LIST_FOREACH(it->content_objs, ll, content)
1408 if (elm_object_focus_get(content))
1410 unrealize = EINA_FALSE;
1416 _item_unrealize(it, EINA_FALSE);
1417 unrealize = EINA_TRUE;
1420 itb->realized = EINA_FALSE;
1426 Elm_Genlist_Data *sd = data;
1428 Evas_Coord minw = 99999999, minh = 0, vw = 0, vh = 0, current_minh = 0;
1429 Evas_Coord processed_size = sd->minh;
1432 if (sd->calc_done) return;
1434 // TIZEN_ONLY(20150828) : Calculate item which position on viewport area
1436 ((sd->viewport_h > processed_size) && (cnt < MAX_ITEMS_PER_BLOCK)))
1439 tmp = eina_list_data_get(sd->queue);
1440 sd->queue = eina_list_remove_list(sd->queue, sd->queue);
1441 if (!_item_process(sd, tmp)) continue;
1442 processed_size += GL_IT(tmp)->minh;
1443 tmp->item->queued = EINA_FALSE;
1447 eo_do(sd->obj, elm_interface_scrollable_content_viewport_geometry_get
1448 (NULL, NULL, &vw, &vh));
1449 EINA_INLIST_FOREACH(sd->blocks, itb)
1453 _item_block_calc(itb, vw, vh);
1454 if (minw > itb->minw) minw = itb->minw;
1458 if ((sd->mode == ELM_LIST_COMPRESS) && (minw > vw))
1460 else if (minw < vw) minw = vw;
1462 if ((minw != sd->minw) || (minh != sd->minh))
1464 Eina_Bool load_done = EINA_FALSE;
1466 current_minh = sd->minh;
1469 if (!sd->queue && (minh != current_minh)) load_done = EINA_TRUE;
1470 elm_layout_sizing_eval(sd->obj);
1471 evas_object_smart_callback_call(sd->pan_obj, "changed", NULL);
1473 evas_object_smart_callback_call(sd->obj, SIG_LOADED, NULL);
1474 sd->processed_sizes = 0;
1477 sd->calc_done = EINA_TRUE;
1481 _elm_genlist_elm_layout_sizing_eval(Eo *obj, Elm_Genlist_Data *sd)
1483 Evas_Coord minw = 0, minh = 0, maxw = -1, maxh = -1;
1485 ELM_WIDGET_DATA_GET_OR_RETURN(obj, wd);
1487 if (sd->on_sub_del) return;;
1489 evas_object_size_hint_min_get(obj, &minw, NULL);
1490 evas_object_size_hint_max_get(obj, &maxw, &maxh);
1491 edje_object_size_min_calc(wd->resize_obj, &minw, &minh);
1496 minw = minw + sd->minw;
1501 minh = minh + sd->minh;
1504 if ((maxw > 0) && (minw > maxw))
1506 if ((maxh > 0) && (minh > maxh))
1509 evas_object_size_hint_min_set(obj, minw, minh);
1510 evas_object_size_hint_max_set(obj, maxw, maxh);
1514 _elm_genlist_content_min_limit_cb(Evas_Object *obj,
1518 ELM_GENLIST_DATA_GET(obj, sd);
1520 if ((sd->mode == ELM_LIST_LIMIT) ||
1521 (sd->mode == ELM_LIST_EXPAND)) return;
1525 elm_layout_sizing_eval(obj);
1529 _focus_bg_show(Elm_Gen_Item *it)
1532 Evas_Coord h = 0, rectangle_h = GL_IT(it)->h;
1533 ELM_WIDGET_DATA_GET_OR_RETURN(WIDGET(it), wd);
1534 const Evas_Object *top, *bottom;
1535 Evas_Object *rectangle;
1536 const char *focus_bg;
1538 if (!VIEW(it)) return;
1539 focus_bg = edje_object_data_get(VIEW(it), "focus_bg");
1540 if (focus_bg && !strcmp(focus_bg, "off"))
1542 edje_object_signal_emit(wd->resize_obj, SIGNAL_FOCUS_BG_HIDE, "elm");
1546 evas_object_geometry_get(wd->resize_obj, NULL, NULL, &w, NULL);
1547 top = edje_object_part_object_get(VIEW(it), "elm.padding.focus_bg.top");
1548 bottom = edje_object_part_object_get(VIEW(it), "elm.padding.focus_bg.bottom");
1552 evas_object_geometry_get(top, NULL, NULL, NULL, &h);
1554 evas_object_geometry_get(bottom, NULL, NULL, NULL, &h);
1558 rectangle = evas_object_rectangle_add(evas_object_evas_get(wd->obj));
1559 evas_object_size_hint_min_set(rectangle, w, rectangle_h);
1560 evas_object_size_hint_max_set(rectangle, w, rectangle_h);
1561 evas_object_color_set(rectangle, 0, 0, 0, 0);
1562 elm_object_part_content_set(wd->obj, "focus_bg_size", rectangle);
1564 edje_object_signal_emit(wd->resize_obj, SIGNAL_FOCUS_BG_SHOW, "elm");
1568 _item_position(Elm_Gen_Item *it,
1576 Evas_Coord ox = 0, oy = 0, ow = 0, oh = 0;
1577 Evas_Coord ix = 0, iy = 0, iw = 0, ih = 0;
1578 Elm_Gen_Item *target = it;
1579 Elm_Genlist_Data *sd = GL_IT(target)->wsd;
1580 ELM_WIDGET_DATA_GET_OR_RETURN(WIDGET(target), wsd);
1584 iw = GL_IT(target)->w;
1585 ih = GL_IT(target)->h;
1587 evas_object_resize(view, iw, ih);
1588 evas_object_move(view, ix, iy);
1589 evas_object_show(view);
1591 if (wsd->scroll_item_align_enable)
1594 int pre_multiplied_color = 0;
1595 int resize_width = 0;
1596 int resize_hight = 0;
1599 double move_v[4] = {0.49, 0.99, 0.45, 1.0};
1600 double scale_v[4] = {0.49, 0.14, 1, 0.63};
1602 evas_object_geometry_get(wsd->obj, &ox, &oy, &ow, &oh);
1603 int g_center = oy + oh / 2;
1604 int i_center = GL_IT(target)->scrl_y + GL_IT(target)->h / 2;
1606 if (target->item->proxy && !ELM_RECTS_INTERSECT(ix, iy, iw, ih, ox, oy, ow, oh))
1607 evas_object_hide(target->item->proxy);
1610 const char *vi_effect = edje_object_data_get(VIEW(target), "vi_effect");
1611 if (vi_effect && !strcmp(vi_effect, "on"))
1613 ratio = (float)abs(g_center - i_center) / (float)((oh / 2) + ih / 2);
1614 color = DIMED_ITEM_COLOR + ((255 - DIMED_ITEM_COLOR) * (1.0 - ratio));
1615 double scale_p = ecore_animator_pos_map_n(ratio, ECORE_POS_MAP_CUBIC_BEZIER, 4, scale_v);
1616 scale = elm_config_scale_get() - (scale_p * ALIGNED_ITEM_SCALE_FACTOR);
1618 resize_width = GL_IT(target)->w * (scale / elm_config_scale_get());
1619 if (!((iw - resize_width) % 2))
1622 iw = resize_width + 1;
1623 ix = GL_IT(target)->scrl_x + (GL_IT(target)->w - iw) / 2;
1624 resize_hight = GL_IT(target)->h * (scale / elm_config_scale_get());
1626 if (!((ih - resize_hight) % 2))
1629 ih = resize_hight + 1;
1631 if (i_center < g_center)
1633 double move_p = ecore_animator_pos_map_n(ratio, ECORE_POS_MAP_CUBIC_BEZIER, 4, move_v);
1634 iy = GL_IT(target)->scrl_y + move_p * (GL_IT(target)->h - ih);
1637 iy = GL_IT(target)->scrl_y;
1639 const char *dim = edje_object_data_get(view, "dim");
1640 if (!dim || (dim && !strcmp(dim, "on")))
1642 pre_multiplied_color = 255 * color >> 8;
1643 if (!elm_object_item_disabled_get(EO_OBJ(target)))
1644 evas_object_color_set(target->item->proxy, pre_multiplied_color, pre_multiplied_color, pre_multiplied_color, color);
1646 evas_object_color_set(target->item->proxy, 255, 255, 255, 255);
1649 evas_object_move(target->item->proxy, ix, iy);
1650 evas_object_resize(target->item->proxy, iw, ih);
1651 evas_object_show(target->item->proxy);
1654 ELM_RECTS_INTERSECT(GL_IT(target)->scrl_x, GL_IT(target)->scrl_y,
1655 GL_IT(target)->w, GL_IT(target)->h,
1656 ox, g_center - CENTER_CHECK_GAP,
1657 ow, CENTER_CHECK_GAP * 2))
1659 if ((sd->adjusted_item == target) &&
1660 ((sd->adjusted_item != sd->aligned_item) || (sd->unhighlighted)))
1662 edje_object_signal_emit(VIEW(sd->adjusted_item), SIGNAL_ITEM_HIGHLIGHTED, "elm");
1664 if (sd->aligned_item && sd->adjusted_item != sd->aligned_item)
1665 edje_object_signal_emit(VIEW(sd->aligned_item), SIGNAL_ITEM_UNHIGHLIGHTED, "elm");
1666 sd->aligned_item = sd->adjusted_item;
1667 sd->unhighlighted = EINA_FALSE;
1670 if (sd->adjusted_item == target &&
1671 sd->aligned_item == sd->adjusted_item &&
1672 ((i_center >= g_center && i_center < g_center + 10) ||
1673 (i_center <= g_center && i_center > g_center - 10)))
1675 sd->adjusted_item = NULL;
1676 _focus_bg_show(sd->aligned_item);
1684 _item_all_position(Elm_Gen_Item *it,
1690 if (it->deco_all_view)
1691 _item_position(it, it->deco_all_view, it_x, it_y);
1692 else if (GL_IT(it)->deco_it_view)
1693 _item_position(it, GL_IT(it)->deco_it_view, it_x, it_y);
1695 _item_position(it, VIEW(it), it_x, it_y);
1699 _decorate_item_unrealize(Elm_Gen_Item *it)
1701 if (!GL_IT(it)->deco_it_view) return;
1703 edje_object_part_unswallow(GL_IT(it)->deco_it_view, VIEW(it));
1704 _view_clear(GL_IT(it)->deco_it_view, &(GL_IT(it)->deco_it_contents));
1705 evas_object_del(GL_IT(it)->deco_it_view);
1706 GL_IT(it)->deco_it_view = NULL;
1708 _item_mouse_callbacks_add(it, VIEW(it));
1709 evas_object_smart_member_add(VIEW(it), GL_IT(it)->wsd->pan_obj);
1713 _decorate_all_item_realize(Elm_Gen_Item *it, Eina_Bool effect)
1716 if (it->deco_all_view || !it->itc->decorate_all_item_style) return;
1718 // Before adding & swallowing, delete it from smart member
1719 evas_object_smart_member_del(VIEW(it));
1721 it->deco_all_view = _view_create(it, it->itc->decorate_all_item_style);
1722 _view_inflate(it->deco_all_view, it, &(GL_IT(it)->deco_all_contents));
1723 edje_object_part_swallow
1724 (it->deco_all_view, "elm.swallow.decorate.content", VIEW(it));
1725 evas_object_show(it->deco_all_view);
1727 if (eo_do_ret(EO_OBJ(it), ret, elm_wdg_item_disabled_get()))
1728 edje_object_signal_emit(it->deco_all_view, SIGNAL_DISABLED, "elm");
1730 edje_object_signal_emit(it->deco_all_view, SIGNAL_HIGHLIGHTED, "elm");
1731 if (GL_IT(it)->wsd->reorder_force ||
1732 GL_IT(it)->wsd->reorder_mode)
1733 edje_object_signal_emit
1734 (it->deco_all_view, SIGNAL_REORDER_MODE_SET, "elm");
1738 edje_object_signal_emit(VIEW(it),
1739 SIGNAL_DECORATE_ENABLED_EFFECT, "elm");
1740 edje_object_signal_emit(it->deco_all_view,
1741 SIGNAL_DECORATE_ENABLED_EFFECT, "elm");
1745 edje_object_signal_emit(VIEW(it), SIGNAL_DECORATE_ENABLED, "elm");
1746 edje_object_signal_emit(it->deco_all_view,
1747 SIGNAL_DECORATE_ENABLED,"elm");
1750 edje_object_signal_emit(it->deco_all_view, SIGNAL_FLIP_ENABLED, "elm");
1752 _item_mouse_callbacks_add(it, it->deco_all_view);
1753 _item_mouse_callbacks_del(it, VIEW(it));
1757 _expand_toggle_signal_cb(void *data,
1758 Evas_Object *obj EINA_UNUSED,
1759 const char *emission EINA_UNUSED,
1760 const char *source EINA_UNUSED)
1762 Elm_Gen_Item *it = data;
1764 if (GL_IT(it)->expanded)
1765 evas_object_smart_callback_call(WIDGET(it), SIG_CONTRACT_REQUEST, EO_OBJ(it));
1767 evas_object_smart_callback_call(WIDGET(it), SIG_EXPAND_REQUEST, EO_OBJ(it));
1771 _expand_signal_cb(void *data,
1772 Evas_Object *obj EINA_UNUSED,
1773 const char *emission EINA_UNUSED,
1774 const char *source EINA_UNUSED)
1776 Elm_Gen_Item *it = data;
1778 if (!GL_IT(it)->expanded)
1779 evas_object_smart_callback_call(WIDGET(it), SIG_EXPAND_REQUEST, EO_OBJ(it));
1783 _contract_signal_cb(void *data,
1784 Evas_Object *obj EINA_UNUSED,
1785 const char *emission EINA_UNUSED,
1786 const char *source EINA_UNUSED)
1788 Elm_Gen_Item *it = data;
1790 if (GL_IT(it)->expanded)
1791 evas_object_smart_callback_call(WIDGET(it), SIG_CONTRACT_REQUEST, EO_OBJ(it));
1795 _item_mouse_callbacks_add(Elm_Gen_Item *it,
1798 evas_object_event_callback_add
1799 (view, EVAS_CALLBACK_MOUSE_DOWN, _item_mouse_down_cb, it);
1800 evas_object_event_callback_add
1801 (view, EVAS_CALLBACK_MOUSE_UP, _item_mouse_up_cb, it);
1802 evas_object_event_callback_add
1803 (view, EVAS_CALLBACK_MOUSE_MOVE, _item_mouse_move_cb, it);
1807 _item_mouse_callbacks_del(Elm_Gen_Item *it,
1810 evas_object_event_callback_del_full
1811 (view, EVAS_CALLBACK_MOUSE_DOWN, _item_mouse_down_cb, it);
1812 evas_object_event_callback_del_full
1813 (view, EVAS_CALLBACK_MOUSE_UP, _item_mouse_up_cb, it);
1814 evas_object_event_callback_del_full
1815 (view, EVAS_CALLBACK_MOUSE_MOVE, _item_mouse_move_cb, it);
1820 _item_edje_callbacks_add(Elm_Gen_Item *it)
1822 edje_object_signal_callback_add
1823 (VIEW(it), "elm,action,expand,toggle", "elm",
1824 _expand_toggle_signal_cb, it);
1825 edje_object_signal_callback_add
1826 (VIEW(it), "elm,action,expand", "elm", _expand_signal_cb, it);
1827 edje_object_signal_callback_add
1828 (VIEW(it), "elm,action,contract", "elm", _contract_signal_cb, it);
1832 _item_edje_callbacks_del(Elm_Gen_Item *it)
1834 edje_object_signal_callback_del_full(VIEW(it), "elm,action,expand,toggle",
1835 "elm", _expand_toggle_signal_cb, it);
1836 edje_object_signal_callback_del_full(VIEW(it), "elm,action,expand", "elm",
1837 _expand_signal_cb, it);
1838 edje_object_signal_callback_del_full(VIEW(it), "elm,action,contract", "elm",
1839 _contract_signal_cb, it);
1843 _item_realize(Elm_Gen_Item *it,
1846 const char *treesize;
1849 if (it->realized) return;
1850 Elm_Genlist_Data *sd = GL_IT(it)->wsd;
1851 ELM_WIDGET_DATA_GET_OR_RETURN(sd->obj, wd);
1853 it->realized = EINA_TRUE;
1855 if (!_item_cache_pop(it))
1856 VIEW(it) = _view_create(it, it->itc->item_style);
1858 //TIZEN_ONLY(20161013): clean up elm color class feature
1859 if (it->base->color_classes)
1860 _elm_widget_item_color_class_update(it->base);
1863 treesize = edje_object_data_get(VIEW(it), "treesize");
1866 int tsize = atoi(treesize);
1869 (GL_IT(it->parent)->type == ELM_GENLIST_ITEM_TREE))
1872 evas_object_rectangle_add(evas_object_evas_get(WIDGET(it)));
1873 evas_object_color_set(it->spacer, 0, 0, 0, 0);
1874 evas_object_size_hint_min_set
1875 (it->spacer, (GL_IT(it)->expanded_depth * tsize) *
1876 elm_config_scale_get(), 1);
1877 edje_object_part_swallow(VIEW(it), "elm.swallow.pad", it->spacer);
1880 _view_inflate(VIEW(it), it, &it->content_objs);
1881 if (wd->scroll_item_align_enable && !calc)
1883 const char *vi_effect = edje_object_data_get(VIEW(it), "vi_effect");
1884 if (vi_effect && !strcmp(vi_effect, "on"))
1886 Evas_Object *clip = evas_object_clip_get(VIEW(it));
1887 if (clip) evas_object_data_set(VIEW(it), "view,clip", clip);
1888 else clip = evas_object_data_get(VIEW(it), "view,clip");
1890 if (!it->item->proxy)
1892 it->item->proxy = evas_object_image_filled_add(evas_object_evas_get(wd->obj));
1893 evas_object_smart_member_add(it->item->proxy, sd->pan_obj);
1895 evas_object_clip_set(it->item->proxy, clip);
1896 if (evas_object_clip_get(VIEW(it))) evas_object_clip_unset(VIEW(it));
1897 evas_object_image_source_set(it->item->proxy, VIEW(it));
1898 evas_object_image_source_visible_set(it->item->proxy, EINA_FALSE);
1899 evas_object_image_source_events_set(it->item->proxy, EINA_TRUE);
1900 evas_object_image_source_clip_set(it->item->proxy, EINA_FALSE);
1901 evas_object_size_hint_min_set(it->item->proxy, GL_IT(it)->w, GL_IT(it)->h);
1902 evas_object_repeat_events_set(it->item->proxy, EINA_TRUE);
1906 _item_mouse_callbacks_add(it, VIEW(it));
1907 // Expand can be supported by only VIEW(it)
1908 _item_edje_callbacks_add(it);
1910 if (eo_do_ret(EO_OBJ(it), ret, elm_wdg_item_disabled_get()))
1911 edje_object_signal_emit(VIEW(it), SIGNAL_DISABLED, "elm");
1913 edje_object_signal_emit(VIEW(it), SIGNAL_ENABLED, "elm");
1916 if (!TIZEN_PROFILE_WEARABLE)
1918 if (sd->banded_bg_on)
1919 _banded_item_bg_color_change(it, EINA_TRUE);
1921 edje_object_signal_emit(VIEW(it), SIGNAL_HIGHLIGHTED, "elm");
1922 evas_object_smart_callback_call(WIDGET(it), SIG_HIGHLIGHTED, EO_OBJ(it));
1924 if (GL_IT(it)->expanded)
1925 edje_object_signal_emit(VIEW(it), SIGNAL_EXPANDED, "elm");
1926 if (sd->reorder_force || sd->reorder_mode)
1927 edje_object_signal_emit(VIEW(it), SIGNAL_REORDER_MODE_SET, "elm");
1928 if (GL_IT(it)->expanded_depth > 0)
1929 edje_object_signal_emit(VIEW(it), SIGNAL_BG_CHANGE, "elm");
1932 _item_content_realize(it, VIEW(it), &GL_IT(it)->flip_contents,
1934 edje_object_signal_emit(VIEW(it), SIGNAL_FLIP_ENABLED, "elm");
1937 if (elm_widget_focus_highlight_enabled_get(WIDGET(it)) && (it == sd->focused_item))
1939 edje_object_signal_emit(VIEW(it), SIGNAL_FOCUSED, "elm");
1941 if (sd->decorate_all_mode && it->itc->decorate_all_item_style)
1943 _decorate_all_item_realize(it, EINA_FALSE);
1945 else if (it->decorate_it_set && it->itc->decorate_item_style &&
1946 (sd->mode_item == it))
1948 _decorate_item_realize(it);
1950 it->realized = EINA_TRUE;
1953 _elm_genlist_item_index_update(it);
1955 if (it->tooltip.content_cb)
1958 elm_wdg_item_tooltip_content_cb_set(
1959 it->tooltip.content_cb, it->tooltip.data, NULL),
1960 elm_wdg_item_tooltip_style_set(it->tooltip.style),
1961 elm_wdg_item_tooltip_window_mode_set(it->tooltip.free_size));
1963 if (it->mouse_cursor)
1964 eo_do(EO_OBJ(it), elm_wdg_item_cursor_set(it->mouse_cursor));
1966 //TIZEN_ONLY(20150709) Do not register children of MANAGES_DESCENDATS objects
1967 if (_elm_atspi_enabled())
1969 elm_interface_atspi_accessible_added(EO_OBJ(it));
1970 elm_interface_atspi_accessible_children_changed_added_signal_emit(sd->obj, EO_OBJ(it));
1973 if (!TIZEN_PROFILE_WEARABLE)
1974 _banded_item_bg_add(it, VIEW(it));
1976 // Register accessibility before realized callback
1977 // because user can customize accessibility.
1978 _access_widget_item_register(it);
1979 evas_object_smart_callback_call(WIDGET(it), SIG_REALIZED, EO_OBJ(it));
1981 edje_object_message_signal_process(VIEW(it));
1982 if (it->deco_all_view)
1983 edje_object_message_signal_process(it->deco_all_view);
1984 if (GL_IT(it)->resized)
1986 sd->queue = eina_list_remove(sd->queue, it);
1987 GL_IT(it)->queued = EINA_FALSE;
1988 GL_IT(it)->resized = EINA_FALSE;
1989 GL_IT(it)->calc_done = EINA_FALSE;
1990 GL_IT(it)->block->calc_done = EINA_FALSE;
1991 sd->calc_done = EINA_FALSE;
1993 if (sd->atspi_item_to_highlight == it)
1995 sd->atspi_item_to_highlight = NULL;
1996 elm_object_accessibility_highlight_set(EO_OBJ(it), EINA_TRUE);
1997 //TIZEN_ONLY(20170724): grab highlight using unrealized item
1998 elm_interface_atspi_accessible_state_changed_signal_emit(EO_OBJ(it),
1999 ELM_ATSPI_STATE_HIGHLIGHTED, EINA_TRUE);
2000 evas_object_smart_callback_call(WIDGET(it),
2001 SIG_WIDGET_ATSPI_HIGHLIGHTED, EO_OBJ(it));
2003 //TIZEN_ONLY(20161104) : Accessibility : synchronized highlight of atspi and item align feature for wearable profile
2004 edje_object_signal_emit(VIEW(it), SIGNAL_ITEM_HIGHLIGHTED, "elm");
2010 _reorder_anim(void *data)
2014 Elm_Genlist_Data *sd = data;
2015 Evas_Coord oy, r_y, r_y_scrl, r_y_scrl_max, r_offset;
2016 evas_object_geometry_get(sd->pan_obj, NULL, &oy, NULL, NULL);
2018 r_y = sd->reorder.it->y + sd->reorder.it->item->block->y;
2019 r_y_scrl = sd->reorder.it->item->scrl_y;
2020 r_y_scrl_max = r_y_scrl + sd->reorder.it->item->h;
2023 // FIXME: 1. Reorder animation time should be equal regardless of item's height
2024 // 2. All item have same animation speed in reordering.
2025 // To support 1 and 2, offset value is scaled to reorder item's height.
2026 r_offset = (Evas_Coord) (GL_IT(sd->reorder.it)->h / REORDER_ANIM_OFFSET);
2027 if (r_offset < REORDER_ANIM_OFFSET) r_offset = REORDER_ANIM_OFFSET;
2030 EINA_LIST_FOREACH(sd->reorder.move_items, l, it)
2032 Evas_Coord it_y, it_y_scrl_center;
2033 it_y = it->y + GL_IT(it)->block->y;
2034 it_y_scrl_center = GL_IT(it)->scrl_y + (GL_IT(it)->h / 2);
2036 if ((sd->reorder.dir == -1) && (r_y_scrl <= it_y_scrl_center))
2037 GL_IT(it)->reorder_offset += r_offset;
2038 else if ((sd->reorder.dir == 1) && (r_y_scrl_max >= it_y_scrl_center))
2039 GL_IT(it)->reorder_offset -= r_offset;
2043 if (sd->reorder.it->item->h < GL_IT(it)->reorder_offset)
2044 GL_IT(it)->reorder_offset = sd->reorder.it->item->h;
2045 else if (0 > GL_IT(it)->reorder_offset)
2046 GL_IT(it)->reorder_offset = 0;
2048 else if (r_y < it_y)
2050 if (-(sd->reorder.it->item->h) > GL_IT(it)->reorder_offset)
2051 GL_IT(it)->reorder_offset = -(sd->reorder.it->item->h);
2052 else if (0 < GL_IT(it)->reorder_offset)
2053 GL_IT(it)->reorder_offset = 0;
2056 if (!sd->reorder.move_items)
2058 sd->reorder.anim = NULL;
2059 return ECORE_CALLBACK_CANCEL;
2062 _changed(sd->pan_obj);
2063 return ECORE_CALLBACK_RENEW;
2067 _reorder_space_get(Elm_Gen_Item *it)
2069 Elm_Genlist_Data *sd = GL_IT(it)->wsd;
2070 Evas_Coord oy, r_y, it_y, r_y_scrl, r_y_scrl_max, it_y_center;
2071 evas_object_geometry_get(sd->pan_obj, NULL, &oy, NULL, NULL);
2073 if (GL_IT(it)->type == ELM_GENLIST_ITEM_GROUP) return 0;
2074 if (sd->reorder.it->parent != it->parent) return 0;
2076 r_y = sd->reorder.it->y + sd->reorder.it->item->block->y;
2077 it_y = it->y + GL_IT(it)->block->y;
2079 r_y_scrl = sd->reorder.it->item->scrl_y;
2080 r_y_scrl_max = r_y_scrl + sd->reorder.it->item->h;
2081 it_y_center = it_y + (GL_IT(it)->h / 2) - sd->pan_y + oy;
2083 if ((r_y > it_y) && (r_y_scrl <= it_y_center))
2085 if (!eina_list_data_find(sd->reorder.move_items, it))
2086 sd->reorder.move_items = eina_list_append(sd->reorder.move_items, it);
2087 if (!sd->reorder.anim)
2088 sd->reorder.anim = ecore_animator_add(_reorder_anim,
2091 else if ((r_y < it_y) && (r_y_scrl_max >= it_y_center))
2093 if (!eina_list_data_find(sd->reorder.move_items, it))
2094 sd->reorder.move_items = eina_list_append(sd->reorder.move_items, it);
2095 if (!sd->reorder.anim)
2096 sd->reorder.anim = ecore_animator_add(_reorder_anim,
2099 return GL_IT(it)->reorder_offset;
2103 _reorder_calc(Elm_Gen_Item *it, Elm_Genlist_Data *sd)
2105 Elm_Gen_Item *git = NULL;
2106 Elm_Gen_Item *ngit = NULL;
2108 Evas_Coord ox, oy, ow, oh;
2109 evas_object_geometry_get(sd->pan_obj, &ox, &oy, &ow, &oh);
2111 // Do not cross the parent group items and
2112 // Do not exceeds viewport
2114 ngit = eina_list_data_get(eina_list_next
2115 (eina_list_data_find_list
2116 (sd->group_items, git)));
2117 if (git && git->realized && (GL_IT(it)->scrl_y <= (GL_IT(git)->scrl_y + GL_IT(git)->h)))
2119 GL_IT(it)->scrl_y = GL_IT(git)->scrl_y + GL_IT(git)->h;
2121 else if (ngit && ngit->realized && (GL_IT(it)->scrl_y >= (GL_IT(ngit)->scrl_y - GL_IT(it)->h)))
2123 GL_IT(it)->scrl_y = GL_IT(ngit)->scrl_y - GL_IT(ngit)->h;
2126 if (GL_IT(it)->scrl_y < oy)
2128 GL_IT(it)->scrl_y = oy;
2129 eo_do((sd)->obj, elm_interface_scrollable_content_region_show(sd->pan_x, sd->pan_y
2130 - REORDER_FASTER, ow, oh));
2132 else if (GL_IT(it)->scrl_y + GL_IT(it)->h > oy + oh)
2134 GL_IT(it)->scrl_y = oy + oh - GL_IT(it)->h;
2135 eo_do((sd)->obj, elm_interface_scrollable_content_region_show(sd->pan_x, sd->pan_y
2136 + REORDER_FASTER, ow, oh));
2139 if (TIZEN_PROFILE_WEARABLE)
2141 _item_all_position(it, GL_IT(it)->scrl_x - REORDERED_ITEM_OFFSET,
2142 GL_IT(it)->scrl_y - REORDERED_ITEM_OFFSET);
2146 _item_all_position(it, GL_IT(it)->scrl_x, GL_IT(it)->scrl_y - REORDERED_ITEM_OFFSET);
2149 if (it->deco_all_view)
2150 evas_object_raise(it->deco_all_view);
2151 else if (GL_IT(it)->deco_it_view)
2152 evas_object_raise(GL_IT(it)->deco_it_view);
2154 evas_object_raise(VIEW(it));
2157 #ifdef GENLIST_FX_SUPPORT
2159 _add_fx_anim(void *data)
2161 Elm_Genlist_Data *sd = data;
2166 _changed(sd->pan_obj);
2167 if (sd->add_fx.cnt <= 0)
2169 while (sd->add_fx.items)
2171 it = eina_list_data_get(sd->add_fx.items);
2172 sd->add_fx.items = eina_list_remove(sd->add_fx.items, it);
2173 if (it->deco_all_view)
2174 evas_object_color_set(it->deco_all_view, 255, 255, 255, 255);
2175 else if (it->item->deco_it_view)
2176 evas_object_color_set(it->item->deco_it_view, 255, 255, 255, 255);
2178 evas_object_color_set(VIEW(it), 255, 255, 255, 255);
2180 sd->add_fx.cnt = ANIM_CNT_MAX;
2181 sd->add_fx.anim = NULL;
2182 return ECORE_CALLBACK_CANCEL;
2184 return ECORE_CALLBACK_RENEW;
2188 _add_fx_space_get(Elm_Gen_Item *it)
2191 Elm_Genlist_Data *sd = it->item->wsd;
2192 Evas_Coord size = 0;
2194 if (it->deco_all_view) evas_object_raise(it->deco_all_view);
2195 else if (it->item->deco_it_view) evas_object_raise(it->item->deco_it_view);
2196 else if (VIEW(it)) evas_object_raise(VIEW(it));
2198 itt = ELM_GEN_ITEM_FROM_INLIST(EINA_INLIST_GET(it)->prev);
2199 while (itt && itt->realized)
2201 if (eina_list_data_find_list(sd->add_fx.items, itt))
2203 size += itt->item->minh;
2205 itt = ELM_GEN_ITEM_FROM_INLIST(EINA_INLIST_GET(itt)->prev);
2207 size = size * ((double)sd->add_fx.cnt/ANIM_CNT_MAX);
2212 _del_fx_anim(void *data)
2214 Elm_Genlist_Data *sd = data;
2219 _changed(sd->pan_obj);
2220 if (sd->del_fx.cnt <= 0)
2222 while (sd->del_fx.pending_items)
2224 it = eina_list_data_get(sd->del_fx.pending_items);
2225 sd->del_fx.pending_items = eina_list_remove(sd->del_fx.pending_items, it);
2228 while (sd->del_fx.items)
2230 it = eina_list_data_get(sd->del_fx.items);
2231 sd->del_fx.items = eina_list_remove(sd->del_fx.items, it);
2232 if (it->deco_all_view)
2233 evas_object_color_set(it->deco_all_view, 255, 255, 255, 255);
2234 else if (it->item->deco_it_view)
2235 evas_object_color_set(it->item->deco_it_view, 255, 255, 255, 255);
2237 evas_object_color_set(VIEW(it), 255, 255, 255, 255);
2240 sd->del_fx.cnt = ANIM_CNT_MAX;
2241 sd->del_fx.anim = NULL;
2242 return ECORE_CALLBACK_CANCEL;
2244 return ECORE_CALLBACK_RENEW;
2248 _del_fx_space_get(Elm_Gen_Item *it)
2251 Elm_Genlist_Data *sd = it->item->wsd;
2252 Evas_Coord size = 0;
2254 if (it->deco_all_view) evas_object_raise(it->deco_all_view);
2255 else if (it->item->deco_it_view) evas_object_raise(it->item->deco_it_view);
2256 else if (VIEW(it)) evas_object_raise(VIEW(it));
2257 itt = ELM_GEN_ITEM_FROM_INLIST(EINA_INLIST_GET(it)->prev);
2258 while (itt && itt->realized)
2260 if (eina_list_data_find_list(sd->del_fx.items, itt))
2262 size += itt->item->minh;
2264 itt = ELM_GEN_ITEM_FROM_INLIST(EINA_INLIST_GET(itt)->prev);
2266 size = size * (1 - ((double)sd->del_fx.cnt/ANIM_CNT_MAX));
2272 _item_block_realize(Item_Block *itb, Eina_Bool force)
2274 Elm_Genlist_Data *sd = itb->sd;
2276 Elm_Gen_Item *aligned_item = NULL;
2277 Elm_Gen_Item *top_drawn_item = NULL;
2278 const Eina_List *l, *ll;
2279 Evas_Object *content;
2280 Eina_Bool unrealize = EINA_TRUE;
2281 Evas_Coord ox = 0, oy = 0, ow = 0, oh = 0, cvx = 0, cvy = 0, cvw = 0, cvh = 0;
2282 ELM_WIDGET_DATA_GET_OR_RETURN(sd->obj, wsd);
2284 // Do not check itb->realized
2285 // because it->item->block can be changed
2287 evas_object_geometry_get(sd->pan_obj, &ox, &oy, &ow, &oh);
2288 evas_output_viewport_get(evas_object_evas_get(sd->obj),
2289 &cvx, &cvy, &cvw, &cvh);
2291 if (_elm_config->access_mode || _elm_atspi_enabled())
2293 // If access is on, realize more items (3 times)
2297 #ifdef GENLIST_FX_SUPPORT
2298 else if (sd->del_fx.anim)
2301 EINA_LIST_FOREACH(sd->del_fx.items, l, it)
2303 size += it->item->minh;
2307 else if (sd->add_fx.anim)
2310 EINA_LIST_FOREACH(sd->add_fx.items, l, it)
2312 size += it->item->minh;
2318 if (sd->reorder.it) _reorder_calc(sd->reorder.it, sd);
2319 EINA_LIST_FOREACH(itb->items, l, it)
2321 if (sd->reorder.it == it) continue;
2322 if (!it->filtered) _item_filtered_get(it);
2323 if (it->want_hidden)
2325 if (it->realized) evas_object_hide(VIEW(it));
2328 GL_IT(it)->scrl_x = it->x + itb->x - sd->pan_x + ox;
2329 GL_IT(it)->scrl_y = it->y + itb->y - sd->pan_y + oy;
2330 GL_IT(it)->w = sd->minw;
2331 GL_IT(it)->h = GL_IT(it)->minh;
2333 if (!TIZEN_PROFILE_WEARABLE)
2336 if (!top_drawn_item)
2338 if (GL_IT(it)->scrl_y <= oy && ELM_RECTS_INTERSECT(GL_IT(it)->scrl_x, GL_IT(it)->scrl_y,
2339 GL_IT(it)->w, GL_IT(it)->h, ox, oy, ow, oh))
2341 top_drawn_item = it;
2342 sd->top_drawn_item = top_drawn_item;
2347 if (wsd->scroll_item_align_enable)
2349 if (!sd->aligned_item)
2351 if (ELM_RECTS_INTERSECT(GL_IT(it)->scrl_x, GL_IT(it)->scrl_y,
2352 GL_IT(it)->w, GL_IT(it)->h,
2353 ox + ow / 2, oy + oh / 2, 1, 1))
2354 aligned_item = sd->aligned_item = it;
2357 if (force || sd->realization_mode ||
2359 (ELM_RECTS_INTERSECT(GL_IT(it)->scrl_x, GL_IT(it)->scrl_y,
2360 GL_IT(it)->w, GL_IT(it)->h,
2361 cvx, cvy, cvw, cvh)))
2363 if (!it->realized) _item_realize(it, EINA_FALSE);
2365 GL_IT(it)->scrl_y += _reorder_space_get(it);
2366 #ifdef GENLIST_FX_SUPPORT
2367 if (sd->del_fx.anim && !eina_list_data_find(sd->del_fx.items, it))
2368 it->item->scrl_y -= _del_fx_space_get(it);
2369 if (sd->add_fx.anim && !eina_list_data_find(sd->add_fx.items, it))
2370 it->item->scrl_y -= _add_fx_space_get(it);
2373 _item_all_position(it, GL_IT(it)->scrl_x, GL_IT(it)->scrl_y);
2375 else if (it->realized)
2377 /* FIXME: when content is on focused and unrealize item,
2378 focus is set to other object and scroll will be bring in */
2379 if (_elm_config->access_mode)
2381 EINA_LIST_FOREACH(it->content_objs, ll, content)
2383 if (elm_object_focus_get(content))
2385 unrealize = EINA_FALSE;
2391 _item_unrealize(it, EINA_FALSE);
2392 unrealize = EINA_TRUE;
2396 itb->realized = EINA_TRUE;
2398 if (!TIZEN_PROFILE_WEARABLE)
2400 if (sd->banded_bg_on)
2401 _banded_item_bg_index_color_set(sd->top_drawn_item, ox, oy, ow, oh);
2406 edje_object_signal_emit(VIEW(aligned_item), SIGNAL_ITEM_HIGHLIGHTED, "elm");
2407 _focus_bg_show(aligned_item);
2409 edje_object_message_signal_process(VIEW(sd->aligned_item));
2413 // FIXME: Remove below macro after opensource is patched
2414 #define EINA_INLIST_REVERSE_FOREACH_FROM(list, it) \
2415 for (it = NULL, it = (list ? _EINA_INLIST_CONTAINER(it, list) : NULL); \
2416 it; it = (EINA_INLIST_GET(it)->prev ? _EINA_INLIST_CONTAINER(it, EINA_INLIST_GET(it)->prev) : NULL))
2419 _elm_genlist_pan_evas_object_smart_calculate(Eo *obj, Elm_Genlist_Pan_Data *psd)
2421 Evas_Coord ox, oy, ow, oh, cvx, cvy, cvw, cvh;
2423 ELM_WIDGET_DATA_GET_OR_RETURN(psd->wsd->obj, wd);
2425 evas_object_geometry_get(obj, &ox, &oy, &ow, &oh);
2426 evas_output_viewport_get(evas_object_evas_get(obj), &cvx, &cvy, &cvw, &cvh);
2428 //FIXME: This is for optimizing genlist calculation after
2429 // genlist sizing eval properly.
2430 if (ow <= 1) return;
2432 _calc((void *)psd->wsd);
2434 if (_elm_config->access_mode || _elm_atspi_enabled())
2436 // If access is on, realize more items (3 times)
2440 #ifdef GENLIST_FX_SUPPORT
2441 else if (psd->wsd->del_fx.anim)
2446 EINA_LIST_FOREACH(psd->wsd->del_fx.items, l, it)
2448 size += it->item->minh;
2452 else if (psd->wsd->add_fx.anim)
2457 EINA_LIST_FOREACH(psd->wsd->add_fx.items, l, it)
2459 size += it->item->minh;
2465 // Belows are tweaks for performance
2466 // Block is not needed anymore because of below algorithm..
2467 // later, we should remove dirty block algorithm
2468 Eina_Inlist *start = NULL;
2469 Eina_List *realized_new = NULL;
2470 Eina_Bool flag = EINA_FALSE;
2471 if ((psd->wsd->blocks_realized) && (psd->wsd->dir == -1) &&
2472 (!_elm_config->access_mode) && (!_elm_atspi_enabled()))
2474 start = EINA_INLIST_GET((Item_Block *)eina_list_data_get
2475 (eina_list_last(psd->wsd->blocks_realized)));
2476 EINA_INLIST_REVERSE_FOREACH_FROM(start, itb)
2478 Evas_Coord itb_x, itb_y, itb_w, itb_h;
2479 itb_x = itb->x - psd->wsd->pan_x + ox;
2480 itb_y = itb->y - psd->wsd->pan_y + oy;
2481 itb_w = psd->wsd->minw;
2483 if (psd->wsd->realization_mode ||
2484 ELM_RECTS_INTERSECT(itb_x, itb_y, itb_w, itb_h,
2485 cvx, cvy, cvw, cvh))
2488 realized_new = eina_list_prepend(realized_new, itb);
2489 _item_block_realize(itb, EINA_FALSE);
2493 _item_block_unrealize(itb);
2498 else if ((psd->wsd->blocks_realized) && (psd->wsd->dir == 1) &&
2499 (!_elm_config->access_mode) && (!_elm_atspi_enabled()))
2501 start = EINA_INLIST_GET((Item_Block *)eina_list_data_get
2502 (psd->wsd->blocks_realized));
2503 EINA_INLIST_FOREACH(start, itb)
2505 Evas_Coord itb_x, itb_y, itb_w, itb_h;
2506 itb_x = itb->x - psd->wsd->pan_x + ox;
2507 itb_y = itb->y - psd->wsd->pan_y + oy;
2508 itb_w = psd->wsd->minw;
2510 if (psd->wsd->realization_mode ||
2511 ELM_RECTS_INTERSECT(itb_x, itb_y, itb_w, itb_h,
2512 cvx, cvy, cvw, cvh))
2515 realized_new = eina_list_append(realized_new, itb);
2516 _item_block_realize(itb, EINA_FALSE);
2520 _item_block_unrealize(itb);
2527 if (!psd->wsd->show_item)
2529 EINA_INLIST_FOREACH(psd->wsd->blocks, itb)
2531 Evas_Coord itb_x, itb_y, itb_w, itb_h;
2532 itb_x = itb->x - psd->wsd->pan_x + ox;
2533 itb_y = itb->y - psd->wsd->pan_y + oy;
2534 itb_w = psd->wsd->minw;
2536 if (psd->wsd->realization_mode ||
2537 ELM_RECTS_INTERSECT(itb_x, itb_y, itb_w, itb_h,
2538 cvx, cvy, cvw, cvh))
2540 realized_new = eina_list_append(realized_new, itb);
2541 _item_block_realize(itb, EINA_FALSE);
2545 _item_block_unrealize(itb);
2550 eina_list_free(psd->wsd->blocks_realized);
2551 psd->wsd->blocks_realized = realized_new;
2553 // TIZEN_ONLY(20150701) : banded color background feature. enabled only un-scrollable
2554 if (!TIZEN_PROFILE_WEARABLE)
2556 if (psd->wsd->banded_bg_rect && !psd->wsd->reorder.it)
2558 Evas_Coord bg_x, bg_y, bg_w, bg_h, svy, svh;
2559 Elm_Gen_Item *tmp = NULL, *prev = NULL;
2561 tmp = ELM_GEN_ITEM_FROM_INLIST(psd->wsd->items->last);
2565 if (tmp->want_hidden || !tmp->realized )
2566 tmp = ELM_GEN_ITEM_FROM_INLIST(EINA_INLIST_GET(tmp)->prev);
2571 prev = ELM_GEN_ITEM_FROM_INLIST(EINA_INLIST_GET(tmp)->prev);
2575 if(prev->want_hidden)
2576 prev = ELM_GEN_ITEM_FROM_INLIST(EINA_INLIST_GET(prev)->prev);
2585 eo_do(psd->wsd->obj, elm_interface_scrollable_content_viewport_geometry_get
2586 (NULL, &svy, NULL, &svh));
2588 bg_x = GL_IT(tmp)->scrl_x;
2589 bg_y = GL_IT(tmp)->scrl_y + GL_IT(tmp)->h;
2590 bg_w = GL_IT(tmp)->w;
2591 bg_h = svy + svh - bg_y;
2593 evas_object_stack_below(psd->wsd->banded_bg_rect, VIEW(tmp));
2594 evas_object_resize(psd->wsd->banded_bg_rect, bg_w, bg_h);
2595 evas_object_move(psd->wsd->banded_bg_rect, bg_x, bg_y);
2597 //GET COLOR OF LAST ITEM AND SET NEXT COLOR TO BANDED BG RECT
2598 if (psd->wsd->banded_bg_on)
2601 index = GL_IT(tmp)->banded_color_index + 1;
2604 int sign = GL_IT(tmp)->banded_color_index - GL_IT(prev)->banded_color_index;
2608 prev = ELM_GEN_ITEM_FROM_INLIST(EINA_INLIST_GET(prev)->prev);
2612 if(prev->want_hidden)
2613 prev = ELM_GEN_ITEM_FROM_INLIST(EINA_INLIST_GET(prev)->prev);
2621 sign = GL_IT(tmp)->banded_color_index - GL_IT(prev)->banded_color_index;
2624 index = GL_IT(tmp)->banded_color_index + sign;
2626 if (index < 0) index += 2;
2627 else if (index >= BANDED_MAX_ITEMS)
2628 index = BANDED_MAX_ITEMS - 2;
2631 int alpha = 255 * (1 - 0.04 * index);
2632 int color = (250 * alpha) / 255;
2634 evas_object_color_set(psd->wsd->banded_bg_rect, color, color, color, alpha);
2638 evas_object_color_set
2639 (psd->wsd->banded_bg_rect, 0, 0, 0, 0);
2642 evas_object_show(psd->wsd->banded_bg_rect);
2648 if (psd->wsd->comp_y)
2650 psd->wsd->unhighlight_skip = EINA_TRUE;
2651 eo_do((psd->wsd)->obj, elm_interface_scrollable_content_region_show(psd->wsd->pan_x,
2652 psd->wsd->pan_y + psd->wsd->comp_y, ow, oh));
2653 psd->wsd->comp_y = 0;
2654 psd->wsd->unhighlight_skip = EINA_FALSE;
2656 else if (psd->wsd->expanded_item &&
2657 GL_IT(psd->wsd->expanded_item)->calc_done)
2660 Evas_Coord size = GL_IT(psd->wsd->expanded_item)->minh;
2661 Elm_Object_Item *eo_tmp;
2662 EINA_LIST_FOREACH(psd->wsd->expanded_item->item->items, l, eo_tmp)
2664 ELM_GENLIST_ITEM_DATA_GET(eo_tmp, tmp);
2665 size += GL_IT(tmp)->minh;
2668 elm_genlist_item_bring_in
2669 (EO_OBJ(psd->wsd->expanded_item),
2670 ELM_GENLIST_ITEM_SCROLLTO_TOP);
2673 eo_tmp = eina_list_data_get
2674 (eina_list_last(psd->wsd->expanded_item->item->items));
2677 elm_genlist_item_bring_in(eo_tmp,
2678 ELM_GENLIST_ITEM_SCROLLTO_IN);
2680 psd->wsd->expanded_item = NULL;
2682 if (psd->wsd->show_item &&
2683 !psd->wsd->show_item->item->queued &&
2684 psd->wsd->show_item->item->calc_done &&
2685 psd->wsd->show_item->item->block->calc_done &&
2686 psd->wsd->calc_done)
2688 Evas_Coord x, y, w, h;
2689 Elm_Gen_Item *it = psd->wsd->show_item;
2690 psd->wsd->show_item = NULL;
2691 x = it->x + GL_IT(it)->block->x + psd->wsd->pan_x;
2692 y = it->y + GL_IT(it)->block->y;
2696 switch (psd->wsd->scroll_to_type)
2698 case ELM_GENLIST_ITEM_SCROLLTO_IN:
2702 case ELM_GENLIST_ITEM_SCROLLTO_MIDDLE:
2703 y = y - (oh / 2) + (GL_IT(it)->h / 2);
2706 case ELM_GENLIST_ITEM_SCROLLTO_BOTTOM:
2707 y = y - oh + GL_IT(it)->h;
2713 if (psd->wsd->bring_in)
2714 eo_do(WIDGET(it), elm_interface_scrollable_region_bring_in(x, y, w, h));
2717 if (psd->wsd->aligned_item && (psd->wsd->aligned_item != psd->wsd->adjusted_item))
2718 edje_object_signal_emit(VIEW(psd->wsd->aligned_item), SIGNAL_ITEM_UNHIGHLIGHTED, "elm");
2719 edje_object_signal_emit(wd->resize_obj, SIGNAL_FOCUS_BG_HIDE, "elm");
2720 psd->wsd->aligned_item = NULL;
2721 psd->wsd->unhighlight_skip = EINA_TRUE;
2722 eo_do(WIDGET(it), elm_interface_scrollable_content_region_show(x, y, ow, oh));
2723 psd->wsd->unhighlight_skip = EINA_FALSE;
2726 _changed(psd->wsd->pan_obj);
2728 #ifdef GENLIST_FX_SUPPORT
2729 if (psd->wsd->add_fx.anim)
2734 int alpha = 255 * (1 - ((double)psd->wsd->add_fx.cnt/ANIM_CNT_MAX));
2735 EINA_LIST_FOREACH(psd->wsd->add_fx.items, l, it)
2737 if (!it->realized) continue;
2738 if (it->deco_all_view)
2739 evas_object_color_set(it->deco_all_view, alpha, alpha, alpha, alpha);
2740 else if (it->item->deco_it_view)
2741 evas_object_color_set(it->item->deco_it_view, alpha, alpha, alpha, alpha);
2743 evas_object_color_set(VIEW(it), alpha, alpha, alpha, alpha);
2746 if (psd->wsd->del_fx.anim)
2751 int alpha = 255 * ((double)psd->wsd->del_fx.cnt/ANIM_CNT_MAX);
2752 EINA_LIST_FOREACH(psd->wsd->del_fx.items, l, it)
2754 if (it->deco_all_view)
2755 evas_object_color_set(it->deco_all_view, alpha, alpha, alpha, alpha);
2756 else if (it->item->deco_it_view)
2757 evas_object_color_set(it->item->deco_it_view, alpha, alpha, alpha, alpha);
2759 evas_object_color_set(VIEW(it), alpha, alpha, alpha, alpha);
2763 eo_do(psd->wobj, eo_event_callback_call
2764 (ELM_INTERFACE_SCROLLABLE_EVENT_CHANGED, NULL));
2768 _elm_genlist_pan_eo_base_destructor(Eo *obj, Elm_Genlist_Pan_Data *psd)
2770 eo_data_unref(psd->wobj, psd->wsd);
2771 eo_do_super(obj, MY_PAN_CLASS, eo_destructor());
2775 _elm_genlist_pan_class_constructor(Eo_Class *klass)
2777 evas_smart_legacy_type_register(MY_PAN_CLASS_NAME_LEGACY, klass);
2780 #include "elm_genlist_pan.eo.c"
2782 //#ifdef ELM_FOCUSED_UI
2784 _item_multi_select_up(Elm_Genlist_Data *sd)
2786 Elm_Object_Item *prev;
2788 if (!sd->selected) return EINA_FALSE;
2789 if (!sd->multi) return EINA_FALSE;
2791 prev = elm_genlist_item_prev_get(sd->last_selected_item);
2792 if (!prev) return EINA_TRUE;
2794 if (elm_genlist_item_selected_get(prev))
2796 elm_genlist_item_selected_set(sd->last_selected_item, EINA_FALSE);
2797 sd->last_selected_item = prev;
2798 elm_genlist_item_show
2799 (sd->last_selected_item, ELM_GENLIST_ITEM_SCROLLTO_IN);
2803 elm_genlist_item_selected_set(prev, EINA_TRUE);
2804 elm_genlist_item_show(prev, ELM_GENLIST_ITEM_SCROLLTO_IN);
2810 _item_multi_select_down(Elm_Genlist_Data *sd)
2812 Elm_Object_Item *next;
2814 if (!sd->selected) return EINA_FALSE;
2815 if (!sd->multi) return EINA_FALSE;
2817 next = elm_genlist_item_next_get(sd->last_selected_item);
2818 if (!next) return EINA_TRUE;
2820 if (elm_genlist_item_selected_get(next))
2822 elm_genlist_item_selected_set(sd->last_selected_item, EINA_FALSE);
2823 sd->last_selected_item = next;
2824 elm_genlist_item_show
2825 (sd->last_selected_item, ELM_GENLIST_ITEM_SCROLLTO_IN);
2829 elm_genlist_item_selected_set(next, EINA_TRUE);
2830 elm_genlist_item_show(next, ELM_GENLIST_ITEM_SCROLLTO_IN);
2837 _all_items_deselect(Elm_Genlist_Data *sd)
2839 if (!sd->selected) return EINA_FALSE;
2841 while (sd->selected)
2842 elm_genlist_item_selected_set(sd->selected->data, EINA_FALSE);
2848 _item_single_select_up(Elm_Genlist_Data *sd)
2850 Elm_Object_Item *eo_prev;
2855 prev = ELM_GEN_ITEM_FROM_INLIST(sd->items->last);
2857 prev = ELM_GEN_ITEM_FROM_INLIST(EINA_INLIST_GET(prev)->prev);
2861 eo_prev = elm_genlist_item_prev_get(sd->last_selected_item);
2862 prev = eo_data_scope_get(eo_prev, ELM_GENLIST_ITEM_CLASS);
2865 if (!prev) return EINA_FALSE;
2867 _all_items_deselect(sd);
2869 elm_genlist_item_selected_set(EO_OBJ(prev), EINA_TRUE);
2870 elm_genlist_item_show(EO_OBJ(prev), ELM_GENLIST_ITEM_SCROLLTO_IN);
2875 _item_single_select_down(Elm_Genlist_Data *sd)
2877 Elm_Object_Item *eo_next;
2882 next = ELM_GEN_ITEM_FROM_INLIST(sd->items);
2884 next = ELM_GEN_ITEM_FROM_INLIST(EINA_INLIST_GET(next)->next);
2888 eo_next = elm_genlist_item_next_get(sd->last_selected_item);
2889 next = eo_data_scope_get(eo_next, ELM_GENLIST_ITEM_CLASS);
2892 if (!next) return EINA_FALSE;
2894 _all_items_deselect(sd);
2896 elm_genlist_item_selected_set(EO_OBJ(next), EINA_TRUE);
2897 elm_genlist_item_show
2898 (EO_OBJ(next), ELM_GENLIST_ITEM_SCROLLTO_IN);
2904 static void _item_unfocused(Elm_Gen_Item *it)
2907 Elm_Genlist_Data *sd = GL_IT(it)->wsd;
2908 if (!sd->focused_item || it != sd->focused_item) return;
2910 edje_object_signal_emit
2911 (VIEW(sd->focused_item), SIGNAL_UNFOCUSED, "elm");
2912 if (sd->focused_item->deco_all_view)
2913 edje_object_signal_emit
2914 (sd->focused_item->deco_all_view, SIGNAL_UNFOCUSED, "elm");
2915 sd->focused_item = NULL;
2916 evas_object_smart_callback_call(WIDGET(it), SIG_ITEM_UNFOCUSED, EO_OBJ(it));
2919 static void _item_focused(Elm_Gen_Item *it, Elm_Genlist_Item_Scrollto_Type type)
2921 Evas_Coord x, y, w, h, sx, sy, sw, sh;
2923 Elm_Genlist_Data *sd = GL_IT(it)->wsd;
2925 evas_object_geometry_get(VIEW(it), &x, &y, &w, &h);
2926 evas_object_geometry_get(sd->obj, &sx, &sy, &sw, &sh);
2927 if ((x < sx) || (y < sy) || ((x + w) > (sx + sw)) || ((y + h) > (sy + sh)))
2929 elm_genlist_item_bring_in(EO_OBJ(it), type);
2932 if (elm_widget_focus_highlight_enabled_get(sd->obj))
2934 if (it->deco_all_view)
2935 edje_object_signal_emit
2936 (it->deco_all_view, SIGNAL_FOCUSED, "elm");
2938 edje_object_signal_emit
2939 (VIEW(it), SIGNAL_FOCUSED, "elm");
2942 sd->focused_item = it;
2943 evas_object_smart_callback_call(WIDGET(it), SIG_ITEM_FOCUSED, EO_OBJ(it));
2944 if (_elm_atspi_enabled())
2945 elm_interface_atspi_accessible_active_descendant_changed_signal_emit(WIDGET(it), EO_OBJ(it));
2949 _banded_item_highlight_anim(void *data, double pos)
2951 Elm_Gen_Item *it = data;
2953 double v[4] = {0.25, 0.46, 0.45, 1.00};
2955 if (GL_IT(it)->banded_bg)
2958 frame = ecore_animator_pos_map_n(pos, ECORE_POS_MAP_CUBIC_BEZIER, 4, v);
2960 it->item->banded_anim = NULL;
2962 if (it->highlighted)
2963 frame = HIGHLIGHT_ALPHA_MAX + (1.0 - HIGHLIGHT_ALPHA_MAX) * (1.0 - frame);
2965 frame = HIGHLIGHT_ALPHA_MAX + (1.0 - HIGHLIGHT_ALPHA_MAX) * frame;
2967 int alpha = 255 * frame * (1 - 0.04 * GL_IT(it)->banded_color_index);
2970 color = (color * alpha) / 255;
2971 evas_object_color_set(GL_IT(it)->banded_bg, color, color, color, alpha);
2978 _item_highlight(Elm_Gen_Item *it)
2980 Elm_Genlist_Data *sd = GL_IT(it)->wsd;
2981 ELM_WIDGET_DATA_GET_OR_RETURN(WIDGET(it), wsd);
2984 if (!sd->highlight) return;
2985 if (eo_do_ret(EO_OBJ(it), ret, elm_wdg_item_disabled_get())) return;
2986 if ((sd->select_mode == ELM_OBJECT_SELECT_MODE_NONE) ||
2987 (sd->select_mode == ELM_OBJECT_SELECT_MODE_DISPLAY_ONLY ) ||
2988 (it->select_mode == ELM_OBJECT_SELECT_MODE_NONE) ||
2989 (it->select_mode == ELM_OBJECT_SELECT_MODE_DISPLAY_ONLY ))
2991 if (it->highlighted) return;
2992 if (wsd->scroll_item_align_enable)
2994 if (sd->aligned_item == it)
2995 edje_object_signal_emit(wsd->resize_obj, SIGNAL_HIGHLIGHTED, "elm");
3000 it->highlighted = EINA_TRUE;
3001 sd->highlighted_item = it;
3003 if (!it->realized) goto end;
3005 if (!TIZEN_PROFILE_WEARABLE)
3007 if (sd->banded_bg_on)
3009 if (it->item->banded_anim) ecore_animator_del(it->item->banded_anim);
3010 it->item->banded_anim = ecore_animator_timeline_add(ELM_ITEM_HIGHLIGHT_TIMER, _banded_item_highlight_anim, it);
3013 if (it->deco_all_view)
3015 edje_object_signal_emit(it->deco_all_view, SIGNAL_HIGHLIGHTED, "elm");
3016 edje_object_message_signal_process(it->deco_all_view);
3018 edje_object_signal_emit(VIEW(it), SIGNAL_HIGHLIGHTED, "elm");
3019 edje_object_message_signal_process(VIEW(it));
3021 //***************** TIZEN Only
3022 // If check or radio is used on genlist item, highlight it also.
3024 Evas_Object *content;
3025 if (sd->decorate_all_mode)
3027 EINA_LIST_FOREACH(GL_IT(it)->deco_all_contents, l, content)
3029 const char *type = elm_widget_type_get(content);
3030 if (type && (!strcmp(type, "elm_check") || (!strcmp(type, "elm_radio"))))
3031 elm_object_signal_emit(content, "elm,state,mouse,down", "elm");
3036 EINA_LIST_FOREACH(it->content_objs, l, content)
3038 const char *type = elm_widget_type_get(content);
3039 if (type && (!strcmp(type, "elm_check") || (!strcmp(type, "elm_radio"))))
3040 elm_object_signal_emit(content, "elm,state,mouse,down", "elm");
3043 //****************************
3045 evas_object_smart_callback_call(WIDGET(it), SIG_HIGHLIGHTED, EO_OBJ(it));
3046 if (_elm_atspi_enabled())
3047 elm_interface_atspi_accessible_active_descendant_changed_signal_emit(WIDGET(it), EO_OBJ(it));
3051 _item_unhighlight(Elm_Gen_Item *it, Eina_Bool effect EINA_UNUSED)
3053 ELM_WIDGET_DATA_GET_OR_RETURN(WIDGET(it), wsd);
3054 if (!it->highlighted) return;
3056 it->highlighted = EINA_FALSE;
3057 GL_IT(it)->wsd->highlighted_item = NULL;
3059 if (!it->realized) goto end;
3061 if (!TIZEN_PROFILE_WEARABLE)
3063 if (GL_IT(it)->wsd->banded_bg_on && effect)
3065 if (it->item->banded_anim) ecore_animator_del(it->item->banded_anim);
3066 it->item->banded_anim = ecore_animator_timeline_add(ELM_ITEM_HIGHLIGHT_TIMER, _banded_item_highlight_anim, it);
3070 if (it->item->banded_anim) ELM_SAFE_FREE(it->item->banded_anim, ecore_animator_del);
3071 _banded_item_bg_color_change(it, EINA_FALSE);
3074 if (it->deco_all_view)
3075 edje_object_signal_emit(it->deco_all_view, SIGNAL_UNHIGHLIGHTED, "elm");
3076 edje_object_signal_emit(VIEW(it), SIGNAL_UNHIGHLIGHTED, "elm");
3077 if (wsd->scroll_item_align_enable)
3078 edje_object_signal_emit(wsd->resize_obj, SIGNAL_UNHIGHLIGHTED, "elm");
3080 edje_object_signal_emit(VIEW(it), SIGNAL_UNHIGHLIGHTED, "elm");
3081 //******************** TIZEN Only
3082 // If check is used on genlist item, unhighlight it also.
3084 Evas_Object *content;
3085 if (GL_IT(it)->wsd->decorate_all_mode)
3087 EINA_LIST_FOREACH(GL_IT(it)->deco_all_contents, l, content)
3089 const char *type = elm_widget_type_get(content);
3090 if (type && (!strcmp(type, "elm_check") || (!strcmp(type, "elm_radio"))))
3091 elm_object_signal_emit(content, "elm,state,mouse,up", "elm");
3096 EINA_LIST_FOREACH(it->content_objs, l, content)
3098 const char *type = elm_widget_type_get(content);
3099 if (type && (!strcmp(type, "elm_check") || (!strcmp(type, "elm_radio"))))
3100 elm_object_signal_emit(content, "elm,state,mouse,up", "elm");
3103 //*******************************
3105 evas_object_smart_callback_call(WIDGET(it), SIG_UNHIGHLIGHTED, EO_OBJ(it));
3109 _item_unselect(Elm_Gen_Item *it)
3111 Elm_Genlist_Data *sd = GL_IT(it)->wsd;
3113 if (!it->selected) return;
3115 it->selected = EINA_FALSE;
3116 sd->selected = eina_list_remove(sd->selected, EO_OBJ(it));
3117 _item_unhighlight(it, EINA_TRUE);
3118 evas_object_smart_callback_call(WIDGET(it), SIG_UNSELECTED, EO_OBJ(it));
3122 _item_select(Elm_Gen_Item *it)
3124 Evas_Object *obj = WIDGET(it);
3125 Elm_Genlist_Data *sd = GL_IT(it)->wsd;
3127 if (eo_do_ret(EO_OBJ(it), ret, elm_wdg_item_disabled_get())) return;
3128 if ((sd->select_mode == ELM_OBJECT_SELECT_MODE_NONE) ||
3129 (sd->select_mode == ELM_OBJECT_SELECT_MODE_DISPLAY_ONLY) ||
3130 (it->select_mode == ELM_OBJECT_SELECT_MODE_NONE) ||
3131 (it->select_mode == ELM_OBJECT_SELECT_MODE_DISPLAY_ONLY))
3133 if (sd->select_mode != ELM_OBJECT_SELECT_MODE_ALWAYS &&
3134 it->select_mode != ELM_OBJECT_SELECT_MODE_ALWAYS &&
3139 const Eina_List *l, *ll;
3140 Elm_Object_Item *eo_it2;
3141 EINA_LIST_FOREACH_SAFE(sd->selected, l, ll, eo_it2)
3142 if (eo_it2 != EO_OBJ(it))
3144 ELM_GENLIST_ITEM_DATA_GET(eo_it2, it2);
3145 _item_unselect(it2);
3151 sd->selected = eina_list_append(sd->selected, EO_OBJ(it));
3152 it->selected = EINA_TRUE;
3154 sd->last_selected_item = EO_OBJ(it);
3155 _item_highlight(it);
3157 if (sd->focused_content)
3159 elm_object_focus_set(sd->focused_content, EINA_FALSE);
3160 evas_object_focus_set(obj, EINA_TRUE);
3161 sd->focused_content = NULL;
3164 sd->focus_scrollto_type = ELM_GENLIST_ITEM_SCROLLTO_IN;
3165 elm_object_item_focus_set(EO_OBJ(it), EINA_TRUE);
3169 // FIXME: after evas_object_raise, mouse event callbacks(ex, UP, DOWN)
3170 // can be called again eventhough already received it.
3171 const char *selectraise = edje_object_data_get(VIEW(it), "selectraise");
3172 if ((selectraise) && (!strcmp(selectraise, "on")))
3174 if (it->deco_all_view) evas_object_raise(it->deco_all_view);
3175 else evas_object_raise(VIEW(it));
3176 if ((GL_IT(it)->group_item) && (GL_IT(it)->group_item->realized))
3177 evas_object_raise(GL_IT(it)->VIEW(group_item));
3180 edje_object_signal_emit
3181 (VIEW(it), SIGNAL_CLICKED, "elm");
3182 edje_object_message_signal_process(VIEW(it));
3184 evas_object_ref(obj);
3185 if (it->func.func) it->func.func((void *)it->func.data, obj, EO_OBJ(it));
3186 if (EINA_MAGIC_CHECK(it->base, ELM_WIDGET_ITEM_MAGIC))
3187 evas_object_smart_callback_call(obj, SIG_SELECTED, EO_OBJ(it));
3188 evas_object_unref(obj);
3192 _highlight_timer(void *data)
3194 Elm_Gen_Item *it = data;
3195 GL_IT(it)->highlight_timer = NULL;
3196 _item_highlight(it);
3201 _select_timer(void *data)
3203 Elm_Gen_Item *it = data;
3204 GL_IT(it)->highlight_timer = NULL;
3206 if ((GL_IT(it)->wsd->select_mode == ELM_OBJECT_SELECT_MODE_ALWAYS) ||
3207 (it->select_mode == ELM_OBJECT_SELECT_MODE_ALWAYS))
3211 // TIZEN Only(20150708) : unselect when selected item is selected again
3212 // There need to be implemented 'SELECT_UNSELECT' mode in elm_config
3213 // select mode for support upsteam and TIZEN both.
3214 if (!it->selected) _item_select(it);
3215 else _item_unselect(it);
3223 *_item_focusable_content_search(Evas_Object *obj, Eina_List *l, int dir)
3225 if ((dir != 1) && (dir != -1)) return NULL;
3227 Evas_Object *next = NULL;
3228 Elm_Object_Item *next_item = NULL;
3232 next = eina_list_data_get(l);
3233 if (next && (elm_widget_can_focus_get(next) &&
3234 (evas_object_visible_get(next))))
3236 else if (next && (elm_widget_child_can_focus_get(next)))
3238 if (elm_widget_focused_object_get(next))
3242 Evas_Object *child = next;
3244 (elm_widget_focus_next_get(next, ELM_FOCUS_RIGHT, &child, &next_item)))
3246 else if ((dir == -1) &&
3247 (elm_widget_focus_next_get(next, ELM_FOCUS_LEFT, &child, &next_item)))
3253 if (dir == 1) l = eina_list_next(l);
3254 else l = eina_list_prev(l);
3257 if (!next) next = obj;
3262 static Eina_Bool _item_focusable_search(Elm_Gen_Item **it, int dir)
3264 if (!(*it)) return EINA_FALSE;
3265 if ((dir != 1) && (dir != -1)) return EINA_FALSE;
3267 Elm_Gen_Item *tmp = *it;
3271 if (!elm_object_item_disabled_get(EO_OBJ(tmp)) &&
3272 (!tmp->want_hidden))
3274 if ((tmp->select_mode == ELM_OBJECT_SELECT_MODE_DISPLAY_ONLY) ||
3275 (tmp->select_mode == ELM_OBJECT_SELECT_MODE_NONE) ||
3278 Evas_Object *obj = NULL;
3279 Eina_List *contents = NULL;
3281 contents = GL_IT(tmp)->flip_content_objs;
3284 contents = tmp->content_objs;
3285 if (tmp->deco_all_view)
3288 contents = GL_IT(tmp)->deco_all_contents;
3290 contents = eina_list_merge(contents,
3291 GL_IT(tmp)->deco_all_contents);
3296 obj = _item_focusable_content_search(NULL, contents, 1);
3299 contents = eina_list_last(contents);
3300 obj = _item_focusable_content_search(NULL, contents, -1);
3305 if (GL_IT(tmp)->wsd->focused_content)
3306 elm_object_focus_set(GL_IT(tmp)->wsd->focused_content, EINA_FALSE);
3307 GL_IT(tmp)->wsd->focused_content = obj;
3308 elm_object_focus_set(obj, EINA_TRUE);
3313 if (GL_IT(tmp)->wsd->focused_content)
3315 elm_object_focus_set(GL_IT(tmp)->wsd->focused_content, EINA_FALSE);
3316 evas_object_focus_set(WIDGET(tmp), EINA_TRUE);
3317 GL_IT(tmp)->wsd->focused_content = NULL;
3323 tmp = ELM_GEN_ITEM_FROM_INLIST(EINA_INLIST_GET(tmp)->next);
3325 tmp = ELM_GEN_ITEM_FROM_INLIST(EINA_INLIST_GET(tmp)->prev);
3332 static Eina_Bool _item_focus_next(Elm_Genlist_Data *sd, Focus_Dir dir)
3334 Elm_Gen_Item *it = NULL;
3335 Elm_Gen_Item *old_focused = sd->focused_item;
3336 Evas_Object *old_content = sd->focused_content;
3338 if (dir == FOCUS_DIR_DOWN || dir == FOCUS_DIR_UP)
3340 Eina_Bool find_item;
3342 if (dir == FOCUS_DIR_DOWN)
3344 if (sd->focused_item)
3346 it = ELM_GEN_ITEM_FROM_INLIST
3347 (EINA_INLIST_GET(sd->focused_item)->next);
3348 elm_object_item_focus_set(EO_OBJ(sd->focused_item), EINA_FALSE);
3350 else it = ELM_GEN_ITEM_FROM_INLIST(sd->items);
3351 find_item = _item_focusable_search(&it, 1);
3353 else if (dir == FOCUS_DIR_UP)
3355 if (sd->focused_item)
3357 it = ELM_GEN_ITEM_FROM_INLIST
3358 (EINA_INLIST_GET(sd->focused_item)->prev);
3359 elm_object_item_focus_set(EO_OBJ(sd->focused_item), EINA_FALSE);
3361 else it = ELM_GEN_ITEM_FROM_INLIST(sd->items->last);
3362 find_item = _item_focusable_search(&it, -1);
3371 sd->focused_content = old_content;
3372 elm_object_focus_set(old_content, EINA_TRUE);
3376 sd->focus_scrollto_type = ELM_GENLIST_ITEM_SCROLLTO_IN;
3377 elm_object_item_focus_set(EO_OBJ(old_focused), EINA_TRUE);
3382 else if (!find_item)
3385 sd->focus_scrollto_type = ELM_GENLIST_ITEM_SCROLLTO_IN;
3386 elm_object_item_focus_set(EO_OBJ(it), EINA_TRUE);
3388 else if (dir == FOCUS_DIR_LEFT || dir == FOCUS_DIR_RIGHT)
3390 Evas_Object *obj = NULL;
3391 Eina_List *contents = NULL;
3392 Eina_List *l = NULL;
3394 if (!sd->focused_item) return EINA_FALSE;
3395 if (sd->focused_item->flipped)
3396 contents = GL_IT(sd->focused_item)->flip_content_objs;
3399 contents = sd->focused_item->content_objs;
3400 if (sd->focused_item->deco_all_view)
3403 contents = GL_IT(sd->focused_item)->deco_all_contents;
3405 contents = eina_list_merge(contents,
3406 GL_IT(sd->focused_item)->deco_all_contents);
3410 if (sd->focused_content)
3412 l = eina_list_data_find_list(contents,
3413 sd->focused_content);
3414 obj = sd->focused_content;
3417 if (dir == FOCUS_DIR_LEFT)
3419 if ((l) && (eina_list_prev(l)))
3421 l = eina_list_prev(l);
3422 obj = _item_focusable_content_search(obj, l, -1);
3423 if (!obj) obj = sd->focused_content;
3427 //search focused content is child of content
3428 if (sd->focused_content)
3429 l = eina_list_data_find_list(contents,
3430 sd->focused_content);
3431 if (!l) l = eina_list_last(contents);
3432 obj = _item_focusable_content_search(obj, l, -1);
3434 else obj = sd->focused_content;
3436 else if (dir == FOCUS_DIR_RIGHT)
3438 if ((l) && (eina_list_next(l)))
3440 l = eina_list_next(l);
3441 obj = _item_focusable_content_search(obj, l, 1);
3442 if (!obj) obj = sd->focused_content;
3446 //search focused content is child of content
3447 if (sd->focused_content)
3448 l = eina_list_data_find_list(contents,
3449 sd->focused_content);
3450 if (!l) l = contents;
3451 obj = _item_focusable_content_search(obj, l, 1);
3453 else obj = sd->focused_content;
3458 sd->focused_content = obj;
3459 elm_object_focus_set(obj, EINA_TRUE);
3463 sd->focused_content = NULL;
3467 else return EINA_FALSE;
3472 //#ifdef ELM_FOCUSED_UI
3473 EOLIAN static Eina_Bool
3474 _elm_genlist_elm_widget_event(Eo *obj, Elm_Genlist_Data *sd, Evas_Object *src EINA_UNUSED, Evas_Callback_Type type, void *event_info)
3480 Evas_Coord step_x = 0;
3481 Evas_Coord step_y = 0;
3482 Evas_Coord page_x = 0;
3483 Evas_Coord page_y = 0;
3484 Evas_Event_Key_Down *ev = event_info;
3485 Evas_Coord pan_max_x = 0, pan_max_y = 0;
3487 //ELM_GENLIST_DATA_GET(obj, sd);
3489 // TIZEN ONLY(20131221) : When access mode, focused ui is disabled.
3490 if (_elm_config->access_mode) return EINA_FALSE;
3492 if ((type != EVAS_CALLBACK_KEY_DOWN) && (type != EVAS_CALLBACK_KEY_UP))
3494 if (!sd->items) return EINA_FALSE;
3495 if (ev->event_flags & EVAS_EVENT_FLAG_ON_HOLD) return EINA_FALSE;
3496 if (elm_widget_disabled_get(obj)) return EINA_FALSE;
3499 elm_interface_scrollable_content_pos_get(&x, &y),
3500 elm_interface_scrollable_step_size_get(&step_x, &step_y),
3501 elm_interface_scrollable_page_size_get(&page_x, &page_y),
3502 elm_interface_scrollable_content_viewport_geometry_get
3503 (NULL, NULL, &v_w, &v_h));
3505 if ((!strcmp(ev->keyname, "Left")) ||
3506 ((!strcmp(ev->keyname, "KP_Left")) && (!ev->string)) ||
3507 (!strcmp(ev->keyname, "Right")) ||
3508 ((!strcmp(ev->keyname, "KP_Right")) && (!ev->string)) ||
3509 (!strcmp(ev->keyname, "Up")) ||
3510 ((!strcmp(ev->keyname, "KP_Up")) && (!ev->string)) ||
3511 (!strcmp(ev->keyname, "Down")) ||
3512 ((!strcmp(ev->keyname, "KP_Down")) && (!ev->string)) ||
3513 (!strcmp(ev->keyname, "Home")) ||
3514 ((!strcmp(ev->keyname, "KP_Home")) && (!ev->string)) ||
3515 (!strcmp(ev->keyname, "End")) ||
3516 ((!strcmp(ev->keyname, "KP_End")) && (!ev->string)) ||
3517 (!strcmp(ev->keyname, "Prior")) ||
3518 ((!strcmp(ev->keyname, "KP_Prior")) && (!ev->string)) ||
3519 (!strcmp(ev->keyname, "Next")) ||
3520 ((!strcmp(ev->keyname, "KP_Next")) && (!ev->string)))
3522 if (type != EVAS_CALLBACK_KEY_DOWN) return EINA_FALSE;
3523 _elm_widget_focus_auto_show(obj);
3526 if ((!strcmp(ev->keyname, "Left")) ||
3527 ((!strcmp(ev->keyname, "KP_Left")) && (!ev->string)))
3529 if (type != EVAS_CALLBACK_KEY_DOWN) return EINA_FALSE;
3530 if (sd->select_on_focus_enabled) x -= step_x;
3533 if (_item_focus_next(sd, FOCUS_DIR_LEFT))
3535 ev->event_flags |= EVAS_EVENT_FLAG_ON_HOLD;
3542 else if ((!strcmp(ev->keyname, "Right")) ||
3543 ((!strcmp(ev->keyname, "KP_Right")) && (!ev->string)))
3545 if (type != EVAS_CALLBACK_KEY_DOWN) return EINA_FALSE;
3546 if (sd->select_on_focus_enabled) x += step_x;
3549 if (_item_focus_next(sd, FOCUS_DIR_RIGHT))
3551 ev->event_flags |= EVAS_EVENT_FLAG_ON_HOLD;
3558 else if ((!strcmp(ev->keyname, "Up")) ||
3559 ((!strcmp(ev->keyname, "KP_Up")) && (!ev->string)))
3561 if (type != EVAS_CALLBACK_KEY_DOWN) return EINA_FALSE;
3562 if (sd->select_on_focus_enabled)
3564 if (((evas_key_modifier_is_set(ev->modifiers, "Shift")) &&
3565 (_item_multi_select_up(sd))) || (_item_single_select_up(sd)))
3567 ev->event_flags |= EVAS_EVENT_FLAG_ON_HOLD;
3573 if (_item_focus_next(sd, FOCUS_DIR_UP))
3575 ev->event_flags |= EVAS_EVENT_FLAG_ON_HOLD;
3582 else if ((!strcmp(ev->keyname, "Down")) ||
3583 ((!strcmp(ev->keyname, "KP_Down")) && (!ev->string)))
3585 if (type != EVAS_CALLBACK_KEY_DOWN) return EINA_FALSE;
3586 if (sd->select_on_focus_enabled)
3588 if (((evas_key_modifier_is_set(ev->modifiers, "Shift")) &&
3589 (_item_multi_select_down(sd))) ||
3590 (_item_single_select_down(sd)))
3592 ev->event_flags |= EVAS_EVENT_FLAG_ON_HOLD;
3598 if (_item_focus_next(sd, FOCUS_DIR_DOWN))
3600 ev->event_flags |= EVAS_EVENT_FLAG_ON_HOLD;
3607 else if ((!strcmp(ev->keyname, "Home")) ||
3608 ((!strcmp(ev->keyname, "KP_Home")) && (!ev->string)))
3610 if (type != EVAS_CALLBACK_KEY_DOWN) return EINA_FALSE;
3611 if (sd->select_on_focus_enabled)
3613 Elm_Object_Item *it = elm_genlist_first_item_get(obj);
3614 elm_genlist_item_bring_in(it, ELM_GENLIST_ITEM_SCROLLTO_IN);
3615 elm_genlist_item_selected_set(it, EINA_TRUE);
3616 ev->event_flags |= EVAS_EVENT_FLAG_ON_HOLD;
3620 elm_object_item_focus_set(EO_OBJ(sd->focused_item), EINA_FALSE);
3621 _item_focus_next(sd, FOCUS_DIR_DOWN);
3622 ev->event_flags |= EVAS_EVENT_FLAG_ON_HOLD;
3626 else if ((!strcmp(ev->keyname, "End")) ||
3627 ((!strcmp(ev->keyname, "KP_End")) && (!ev->string)))
3629 if (type != EVAS_CALLBACK_KEY_DOWN) return EINA_FALSE;
3630 if (sd->select_on_focus_enabled)
3632 Elm_Object_Item *it = elm_genlist_last_item_get(obj);
3633 elm_genlist_item_bring_in(it, ELM_GENLIST_ITEM_SCROLLTO_IN);
3634 elm_genlist_item_selected_set(it, EINA_TRUE);
3638 elm_object_item_focus_set(EO_OBJ(sd->focused_item), EINA_FALSE);
3639 sd->focused_item = ELM_GEN_ITEM_FROM_INLIST(sd->items->last);
3640 _item_focus_next(sd, FOCUS_DIR_UP);
3642 ev->event_flags |= EVAS_EVENT_FLAG_ON_HOLD;
3645 else if ((!strcmp(ev->keyname, "Prior")) ||
3646 ((!strcmp(ev->keyname, "KP_Prior")) && (!ev->string)))
3648 if (type != EVAS_CALLBACK_KEY_DOWN) return EINA_FALSE;
3649 Elm_Gen_Item *it = sd->focused_item;
3650 Elm_Object_Item *eo_prev;
3652 while (page_y <= v_h)
3654 if (elm_genlist_item_prev_get(EO_OBJ(it)))
3656 eo_prev = elm_genlist_item_prev_get(EO_OBJ(it));
3657 it = eo_data_scope_get(eo_prev, ELM_GENLIST_ITEM_CLASS);
3660 page_y += GL_IT(it)->minh;
3662 if (_item_focusable_search(&it, -1))
3664 sd->focus_scrollto_type = ELM_GENLIST_ITEM_SCROLLTO_TOP;
3665 elm_object_item_focus_set(EO_OBJ(it), EINA_TRUE);
3669 _item_focusable_search(&it, 1);
3670 sd->focus_scrollto_type = ELM_GENLIST_ITEM_SCROLLTO_TOP;
3671 elm_object_item_focus_set(EO_OBJ(it), EINA_TRUE);
3674 ev->event_flags |= EVAS_EVENT_FLAG_ON_HOLD;
3677 else if ((!strcmp(ev->keyname, "Next")) ||
3678 ((!strcmp(ev->keyname, "KP_Next")) && (!ev->string)))
3680 if (type != EVAS_CALLBACK_KEY_DOWN) return EINA_FALSE;
3681 Elm_Gen_Item *it = sd->focused_item;
3682 Elm_Object_Item *eo_next;
3684 page_y = GL_IT(it)->minh;
3686 while (page_y <= v_h)
3688 if (elm_genlist_item_next_get(EO_OBJ(it)))
3690 eo_next = elm_genlist_item_next_get(EO_OBJ(it));
3691 it = eo_data_scope_get(eo_next, ELM_GENLIST_ITEM_CLASS);
3694 page_y += GL_IT(it)->minh;
3696 if (_item_focusable_search(&it, 1))
3698 sd->focus_scrollto_type = ELM_GENLIST_ITEM_SCROLLTO_TOP;
3699 elm_object_item_focus_set(EO_OBJ(it), EINA_TRUE);
3703 _item_focusable_search(&it, -1);
3704 sd->focus_scrollto_type = ELM_GENLIST_ITEM_SCROLLTO_TOP;
3705 elm_object_item_focus_set(EO_OBJ(it), EINA_TRUE);
3708 sd->focus_scrollto_type = ELM_GENLIST_ITEM_SCROLLTO_TOP;
3709 elm_object_item_focus_set(EO_OBJ(it), EINA_TRUE);
3711 ev->event_flags |= EVAS_EVENT_FLAG_ON_HOLD;
3714 else if (!strcmp(ev->keyname, "Escape"))
3716 if (type != EVAS_CALLBACK_KEY_DOWN) return EINA_FALSE;
3717 if (!_all_items_deselect(sd)) return EINA_FALSE;
3718 ev->event_flags |= EVAS_EVENT_FLAG_ON_HOLD;
3721 else if (!strcmp(ev->keyname, "Return") ||
3722 !strcmp(ev->keyname, "KP_Enter") ||
3723 !strcmp(ev->keyname, "space"))
3726 if (type == EVAS_CALLBACK_KEY_DOWN && !sd->key_down_item)
3728 if (sd->focused_item)
3730 sd->key_down_item = sd->focused_item;
3732 edje_object_signal_emit
3733 (VIEW(sd->focused_item), SIGNAL_UNFOCUSED, "elm");
3734 if (sd->focused_item->deco_all_view)
3735 edje_object_signal_emit
3736 (sd->focused_item->deco_all_view, SIGNAL_UNFOCUSED, "elm");
3738 _item_highlight(sd->key_down_item);
3739 if (sd->key_down_item->long_timer)
3740 ecore_timer_del(sd->key_down_item->long_timer);
3741 sd->key_down_item->long_timer = ecore_timer_add
3742 (sd->longpress_timeout,
3743 _long_press_cb, sd->key_down_item);
3744 ev->event_flags |= EVAS_EVENT_FLAG_ON_HOLD;
3745 evas_object_smart_callback_call(obj, SIG_ACTIVATED, EO_OBJ(sd->key_down_item));
3748 else return EINA_FALSE;
3750 else if (type == EVAS_CALLBACK_KEY_UP && sd->key_down_item)
3752 edje_object_signal_emit
3753 (VIEW(sd->key_down_item), SIGNAL_FOCUSED, "elm");
3754 if (sd->key_down_item->deco_all_view)
3755 edje_object_signal_emit
3756 (sd->key_down_item->deco_all_view, SIGNAL_FOCUSED, "elm");
3758 if (sd->key_down_item->long_timer)
3759 ecore_timer_del(sd->key_down_item->long_timer);
3760 sd->key_down_item->long_timer = NULL;
3761 if (GL_IT(sd->key_down_item)->highlight_timer)
3762 ecore_timer_del(GL_IT(sd->key_down_item)->highlight_timer);
3763 GL_IT(sd->key_down_item)->highlight_timer = ecore_timer_add
3764 (ITEM_SELECT_TIMER, _select_timer, sd->key_down_item);
3765 sd->key_down_item = NULL;
3766 ev->event_flags |= EVAS_EVENT_FLAG_ON_HOLD;
3769 else return EINA_FALSE;
3771 else return EINA_FALSE;
3773 ev->event_flags |= EVAS_EVENT_FLAG_ON_HOLD;
3774 eo_do(sd->pan_obj, elm_obj_pan_pos_max_get(&pan_max_x, &pan_max_y));
3776 if (x > pan_max_x) x = pan_max_x;
3778 if (y > pan_max_y) y = pan_max_y;
3780 eo_do(obj, elm_interface_scrollable_content_pos_set(x, y, EINA_TRUE));
3786 /* This function disables the specific code of the layout sub object add.
3787 * Only the widget sub_object_add is called.
3789 EOLIAN static Eina_Bool
3790 _elm_genlist_elm_layout_sub_object_add_enable(Eo *obj EINA_UNUSED, Elm_Genlist_Data *_pd EINA_UNUSED)
3795 EOLIAN static Eina_Bool
3796 _elm_genlist_elm_widget_sub_object_add(Eo *obj, Elm_Genlist_Data *_pd EINA_UNUSED, Evas_Object *sobj)
3798 Eina_Bool int_ret = EINA_FALSE;
3800 /* skipping layout's code, which registers size hint changing
3801 * callback on sub objects. this is here because items'
3802 * content_get() routines may change hints on the objects after
3803 * creation, thus issuing TOO MANY sizing_eval()'s here. they are
3804 * not needed at here anyway, so let's skip listening to those
3807 eo_do_super(obj, MY_CLASS, int_ret = elm_obj_widget_sub_object_add(sobj));
3808 if (!int_ret) return EINA_FALSE;
3810 //if (!parent_parent->sub_object_add(obj, sobj))
3811 // return EINA_FALSE;
3816 EOLIAN static Eina_Bool
3817 _elm_genlist_elm_widget_sub_object_del(Eo *obj, Elm_Genlist_Data *sd, Evas_Object *sobj)
3819 Eina_Bool int_ret = EINA_FALSE;
3821 /* XXX: hack -- also skipping sizing recalculation on
3822 * sub-object-del. genlist's crazy code paths (like groups and
3823 * such) seem to issue a whole lot of deletions and Evas bitches
3824 * about too many recalculations */
3825 sd->on_sub_del = EINA_TRUE;
3827 eo_do_super(obj, MY_CLASS, int_ret = elm_obj_widget_sub_object_del(sobj));
3828 if (!int_ret) return EINA_FALSE;
3830 sd->on_sub_del = EINA_FALSE;
3836 _elm_genlist_focus_highlight_show(void *data EINA_UNUSED,
3838 const char *emission EINA_UNUSED,
3839 const char *src EINA_UNUSED)
3841 ELM_GENLIST_DATA_GET(obj, sd);
3843 if (sd->focused_item)
3845 if (!sd->focused_content)
3847 Eina_Bool found = EINA_FALSE;
3848 Elm_Gen_Item *it = sd->focused_item;
3849 found = _item_focusable_search(&it, 1);
3852 sd->focus_scrollto_type = ELM_GENLIST_ITEM_SCROLLTO_IN;
3853 elm_object_item_focus_set(EO_OBJ(it), EINA_TRUE);
3856 else elm_object_focus_set(sd->focused_content, EINA_TRUE);
3861 _elm_genlist_focus_highlight_hide(void *data EINA_UNUSED,
3863 const char *emission EINA_UNUSED,
3864 const char *src EINA_UNUSED)
3866 ELM_GENLIST_DATA_GET(obj, sd);
3867 if (sd->focused_item)
3869 // Do not use _item_unfocused because focus should be remained
3870 edje_object_signal_emit
3871 (VIEW(sd->focused_item), SIGNAL_UNFOCUSED, "elm");
3872 if (sd->focused_item->deco_all_view)
3873 edje_object_signal_emit
3874 (sd->focused_item->deco_all_view, SIGNAL_UNFOCUSED, "elm");
3879 _elm_genlist_elm_widget_focus_highlight_geometry_get(const Eo *obj EINA_UNUSED, Elm_Genlist_Data *sd, Evas_Coord *x, Evas_Coord *y, Evas_Coord *w, Evas_Coord *h)
3881 Evas_Coord ox, oy, oh, ow, item_x = 0, item_y = 0, item_w = 0, item_h = 0;
3882 Elm_Gen_Item *focus_it;
3884 evas_object_geometry_get(sd->pan_obj, &ox, &oy, &ow, &oh);
3886 if (sd->focused_item)
3888 focus_it = sd->focused_item;
3889 evas_object_geometry_get(VIEW(focus_it), &item_x, &item_y, &item_w, &item_h);
3890 elm_widget_focus_highlight_focus_part_geometry_get(VIEW(focus_it), &item_x, &item_y, &item_w, &item_h);
3902 if (item_y > (oy + oh - item_h))
3904 *y = oy + oh - item_h;
3907 if ((item_x + item_w) > (ox + ow))
3917 EOLIAN static Eina_Bool
3918 _elm_genlist_elm_widget_on_focus(Eo *obj, Elm_Genlist_Data *sd, Elm_Object_Item *item EINA_UNUSED)
3920 ELM_WIDGET_DATA_GET_OR_RETURN(obj, wd, EINA_FALSE);
3921 Eina_Bool int_ret = EINA_FALSE;
3923 eo_do_super(obj, MY_CLASS, int_ret = elm_obj_widget_on_focus(NULL));
3924 if (!int_ret) return EINA_FALSE;
3926 if ((sd->items) && (sd->selected) && (!sd->last_selected_item))
3927 sd->last_selected_item = eina_list_data_get(sd->selected);
3929 if (sd->select_on_focus_enabled) return EINA_TRUE;
3930 if (elm_widget_focus_get(obj))
3932 // Do nothing if on_focus is called by child's parent_focus
3933 if (!wd->is_focus_target) return EINA_TRUE;
3935 if (sd->focused_item)
3937 if (!sd->focused_content)
3939 Eina_Bool found = EINA_FALSE;
3940 Elm_Gen_Item *it = sd->focused_item;
3941 found = _item_focusable_search(&it, 1);
3944 sd->focus_scrollto_type = ELM_GENLIST_ITEM_SCROLLTO_IN;
3945 elm_object_item_focus_set(EO_OBJ(it), EINA_TRUE);
3949 elm_object_focus_set(sd->focused_content, EINA_TRUE);
3953 Item_Block *itb, *nib;
3954 EINA_INLIST_FOREACH(sd->blocks, itb)
3958 Elm_Gen_Item *tmp = eina_list_data_get(itb->items);
3959 while(tmp && tmp->item->block == itb)
3963 Elm_Gen_Item *old = tmp;
3964 Evas_Coord x, y, w, h, sx, sy, sw, sh;
3965 evas_object_geometry_get(VIEW(tmp), &x, &y, &w, &h);
3966 evas_object_geometry_get(obj, &sx, &sy, &sw, &sh);
3967 /* Item is included viewport and focusable */
3968 if ((ELM_RECTS_INCLUDE(sx, sy, sw, sh, x, y, w, h)) &&
3969 (_item_focusable_search(&tmp, 1)))
3971 Eina_Bool include = EINA_TRUE;
3972 if (old != tmp && tmp->realized)
3974 evas_object_geometry_get(VIEW(tmp), &x, &y, &w, &h);
3975 evas_object_geometry_get(obj, &sx, &sy, &sw, &sh);
3976 include = ELM_RECTS_INCLUDE(sx, sy, sw, sh, x, y, w, h);
3978 else if (!tmp->realized) include = EINA_FALSE;
3982 elm_object_item_focus_set(EO_OBJ(tmp), EINA_TRUE);
3989 tmp = ELM_GEN_ITEM_FROM_INLIST(EINA_INLIST_GET(tmp)->next);
3992 nib = EINA_INLIST_CONTAINER_GET(EINA_INLIST_GET(itb)->next, Item_Block);
3993 if (!nib || !nib->realized) break;
3996 if (!sd->focused_item) _item_focus_next(sd, FOCUS_DIR_DOWN);
4001 // when key down and not called key up
4002 // and focus is not on genlist, call select_timer forcely
4003 if (sd->key_down_item)
4005 _select_timer(sd->key_down_item);
4006 sd->key_down_item = NULL;
4009 if (sd->focused_item)
4011 if (sd->focused_content)
4013 //FIXME: when genlist contents loose their focus,
4014 // focus unset should automatically work.
4015 elm_object_focus_set(sd->focused_content, EINA_FALSE);
4017 // Do not use _item_unfocused because focus should be remained
4018 edje_object_signal_emit
4019 (VIEW(sd->focused_item), SIGNAL_UNFOCUSED, "elm");
4020 if (sd->focused_item->deco_all_view)
4021 edje_object_signal_emit
4022 (sd->focused_item->deco_all_view, SIGNAL_UNFOCUSED, "elm");
4030 _elm_genlist_item_elm_widget_item_focus_set(Eo *eo_it EINA_UNUSED, Elm_Gen_Item *it, Eina_Bool focused)
4032 Evas_Object *obj = WIDGET(it);
4033 ELM_GENLIST_DATA_GET(obj, sd);
4037 if (!elm_object_focus_get(obj))
4038 elm_object_focus_set(obj, EINA_TRUE);
4040 if (!elm_widget_focus_get(obj))
4043 if (sd->focused_content)
4045 elm_object_focus_set(sd->focused_content, EINA_FALSE);
4046 sd->focused_content = NULL;
4049 if (it != sd->focused_item)
4051 if (sd->focused_item)
4052 _item_unfocused(sd->focused_item);
4053 _item_focused(it, sd->focus_scrollto_type);
4055 /* If item is not realized state, widget couldn't get focus_highlight data. */
4058 _elm_widget_item_highlight_in_theme(obj, EO_OBJ(it));
4059 _elm_widget_highlight_in_theme_update(obj);
4060 _elm_widget_focus_highlight_start(obj);
4066 if (!elm_widget_focus_get(obj))
4068 _item_unfocused(it);
4072 EOLIAN static Eina_Bool
4073 _elm_genlist_item_elm_widget_item_focus_get(Eo *eo_it EINA_UNUSED, Elm_Gen_Item *it)
4075 Evas_Object *obj = WIDGET(it);
4076 ELM_GENLIST_DATA_GET(obj, sd);
4078 if (it == sd->focused_item)
4084 EOLIAN static Elm_Object_Item*
4085 _elm_genlist_elm_widget_focused_item_get(Eo *obj EINA_UNUSED, Elm_Genlist_Data *sd)
4087 return EO_OBJ(sd->focused_item);
4090 static Eina_Bool _elm_genlist_smart_focus_next_enable = EINA_FALSE;
4092 EOLIAN static Eina_Bool
4093 _elm_genlist_elm_widget_focus_next_manager_is(Eo *obj EINA_UNUSED, Elm_Genlist_Data *_pd EINA_UNUSED)
4095 return _elm_genlist_smart_focus_next_enable;
4098 EOLIAN static Eina_Bool
4099 _elm_genlist_elm_widget_focus_direction_manager_is(Eo *obj EINA_UNUSED, Elm_Genlist_Data *_pd EINA_UNUSED)
4104 EOLIAN static Eina_Bool
4105 _elm_genlist_elm_widget_focus_next(Eo *obj, Elm_Genlist_Data *sd, Elm_Focus_Direction dir, Evas_Object **next, Elm_Object_Item **next_item)
4107 Eina_List *items = NULL;
4108 Item_Block *itb = NULL;
4109 Elm_Object_Item *eo_it = NULL;
4111 if (!sd->blocks) return EINA_FALSE;
4112 if (!sd->is_access) return EINA_FALSE;
4114 if (!elm_widget_highlight_get(obj))
4116 if (ELM_FOCUS_PREVIOUS == dir)
4118 eo_it = elm_genlist_last_item_get(obj);
4119 itb = EINA_INLIST_CONTAINER_GET(sd->blocks->last, Item_Block);
4121 else if (ELM_FOCUS_NEXT == dir)
4123 eo_it = elm_genlist_first_item_get(obj);
4124 itb = EINA_INLIST_CONTAINER_GET(sd->blocks, Item_Block);
4126 else return EINA_FALSE;
4128 if (eo_it && itb && itb->calc_done)
4130 _item_block_realize(itb, EINA_TRUE);
4131 elm_genlist_item_show(eo_it, ELM_GENLIST_ITEM_SCROLLTO_IN);
4133 else return EINA_FALSE;
4136 // FIXME: do not use realized items get
4137 // because of above forcing realization case.
4138 EINA_INLIST_FOREACH(sd->blocks, itb)
4143 if (!itb->realized) continue;
4145 EINA_LIST_FOREACH(itb->items, l, it)
4148 Evas_Object *c, *ret;
4151 if (!(it->realized)) continue;
4153 if (eo_do_ret(EO_OBJ(it), ret, elm_wdg_item_access_object_get()))
4154 items = eina_list_append(items, eo_do_ret(EO_OBJ(it), ret, elm_wdg_item_access_object_get()));
4156 items = eina_list_append(items, VIEW(it));
4158 orders = (Eina_List *)elm_object_item_access_order_get(EO_OBJ(it));
4159 EINA_LIST_FOREACH(orders, ll, c)
4161 items = eina_list_append(items, c);
4166 return elm_widget_focus_list_next_get
4167 (obj, items, eina_list_data_get, dir, next, next_item);
4171 _mirrored_set(Evas_Object *obj,
4174 eo_do(obj, elm_interface_scrollable_mirrored_set(rtl));
4177 EOLIAN static Elm_Theme_Apply
4178 _elm_genlist_elm_widget_theme_apply(Eo *obj, Elm_Genlist_Data *sd)
4181 Elm_Theme_Apply int_ret = ELM_THEME_APPLY_FAILED;
4182 ELM_WIDGET_DATA_GET_OR_RETURN(obj, wsd, ELM_THEME_APPLY_FAILED);
4184 eo_do_super(obj, MY_CLASS, int_ret = elm_obj_widget_theme_apply());
4185 if (!int_ret) return ELM_THEME_APPLY_FAILED;
4187 if (!TIZEN_PROFILE_WEARABLE)
4188 _banded_bg_state_check(obj, sd);
4190 EINA_INLIST_FOREACH(sd->blocks, itb)
4194 EINA_LIST_FOREACH(itb->items, l, it)
4198 _item_unrealize(it, EINA_FALSE);
4199 GL_IT(it)->calc_done = EINA_FALSE;
4200 GL_IT(it)->block->calc_done = EINA_FALSE;
4202 else _item_queue(it, NULL);
4205 sd->calc_done = EINA_FALSE;
4206 _item_cache_all_free(sd);
4207 eina_hash_free_buckets(sd->size_caches);
4208 elm_layout_sizing_eval(obj);
4209 _changed(sd->pan_obj);
4211 edje_object_signal_emit(wsd->resize_obj, SIGNAL_FOCUS_BG_HIDE, "elm");
4213 if (wsd->scroll_item_align_enable && sd->aligned_item)
4214 elm_genlist_item_show(EO_OBJ(sd->aligned_item), ELM_GENLIST_ITEM_SCROLLTO_MIDDLE);
4219 /* FIXME: take off later. maybe this show region coords belong in the
4220 * interface (new api functions, set/get)? */
4222 _show_region_hook(void *data,
4225 Evas_Coord x, y, w, h;
4227 ELM_GENLIST_DATA_GET(data, sd);
4229 elm_widget_show_region_get(obj, &x, &y, &w, &h);
4230 //x & y are screen coordinates, Add with pan coordinates
4234 eo_do(obj, elm_interface_scrollable_content_region_show(x, y, w, h));
4237 EOLIAN static Eina_Bool
4238 _elm_genlist_elm_widget_translate(Eo *obj, Elm_Genlist_Data *sd)
4242 // Before calling text_get, inform user first.
4243 evas_object_smart_callback_call(obj, SIG_LANG_CHANGED, NULL);
4245 // FIXME: We should change item's height if lang is changed??
4246 EINA_INLIST_FOREACH(sd->blocks, itb)
4250 EINA_LIST_FOREACH(itb->items, l, it)
4254 elm_genlist_item_fields_update(EO_OBJ(it),
4256 ELM_GENLIST_ITEM_FIELD_TEXT |
4257 ELM_GENLIST_ITEM_FIELD_CONTENT);
4259 else GL_IT(it)->calc_done = EINA_FALSE;
4261 itb->calc_done = EINA_FALSE;
4264 eina_hash_free_buckets(sd->size_caches);
4265 sd->calc_done = EINA_FALSE;
4271 _elm_genlist_elm_widget_item_loop_enabled_set(Eo *obj EINA_UNUSED, Elm_Genlist_Data *sd EINA_UNUSED, Eina_Bool enable EINA_UNUSED)
4273 // Need to be implemented
4274 //sd->item_loop_enable = !!enable;
4277 EOLIAN static Eina_Bool
4278 _elm_genlist_elm_widget_item_loop_enabled_get(Eo *obj EINA_UNUSED, Elm_Genlist_Data *sd EINA_UNUSED)
4280 // Need to be implemented
4281 //return sd->item_loop_enable;
4286 _item_block_position_update(Eina_Inlist *list,
4291 EINA_INLIST_FOREACH(list, tmp)
4293 tmp->position = idx++;
4294 tmp->position_update = EINA_TRUE;
4299 _item_position_update(Eina_List *list,
4305 EINA_LIST_FOREACH(list, l, it)
4307 it->position = idx++;
4308 it->position_update = EINA_TRUE;
4313 _item_block_merge(Item_Block *left,
4319 EINA_LIST_FOREACH(right->items, l, it2)
4321 it2->item->block = left;
4323 left->calc_done = EINA_FALSE;
4325 left->items = eina_list_merge(left->items, right->items);
4329 _item_block_del(Elm_Gen_Item *it)
4331 Elm_Genlist_Data *sd = GL_IT(it)->wsd;
4333 Item_Block *itb = GL_IT(it)->block;
4334 Eina_Bool block_changed = EINA_FALSE;
4337 eo_do(sd->obj, elm_interface_scrollable_content_viewport_geometry_get
4338 (NULL, NULL, NULL, &vh));
4339 if (sd->processed_sizes >= vh) sd->processed_sizes = 0;
4341 itb->items = eina_list_remove(itb->items, it);
4343 itb->calc_done = EINA_FALSE;
4344 sd->calc_done = EINA_FALSE;
4345 _changed(sd->pan_obj);
4350 il = EINA_INLIST_GET(itb);
4351 itbn = (Item_Block *)(il->next);
4353 it->parent->item->items =
4354 eina_list_remove(it->parent->item->items, EO_OBJ(it));
4357 _item_block_position_update(il->next, itb->position);
4359 GL_IT(it)->wsd->blocks =
4360 eina_inlist_remove(GL_IT(it)->wsd->blocks, il);
4361 GL_IT(it)->wsd->blocks_realized = eina_list_remove
4362 (GL_IT(it)->wsd->blocks_realized, itb);
4365 if (itbn) itbn->calc_done = EINA_FALSE;
4369 if (itb->count < (itb->sd->max_items_per_block / 2))
4374 il = EINA_INLIST_GET(itb);
4375 itbp = (Item_Block *)(il->prev);
4376 itbn = (Item_Block *)(il->next);
4378 /* merge block with previous */
4380 ((itbp->count + itb->count) <
4381 (itb->sd->max_items_per_block +
4382 (itb->sd->max_items_per_block / 2))))
4384 _item_block_merge(itbp, itb);
4385 _item_block_position_update
4386 (EINA_INLIST_GET(itb)->next, itb->position);
4387 GL_IT(it)->wsd->blocks = eina_inlist_remove
4388 (GL_IT(it)->wsd->blocks, EINA_INLIST_GET(itb));
4389 GL_IT(it)->wsd->blocks_realized = eina_list_remove
4390 (GL_IT(it)->wsd->blocks_realized, itb);
4392 block_changed = EINA_TRUE;
4394 /* merge block with next */
4396 ((itbn->count + itb->count) <
4397 (itb->sd->max_items_per_block +
4398 (itb->sd->max_items_per_block / 2))))
4400 _item_block_merge(itb, itbn);
4401 _item_block_position_update
4402 (EINA_INLIST_GET(itbn)->next, itbn->position);
4403 GL_IT(it)->wsd->blocks =
4404 eina_inlist_remove(GL_IT(it)->wsd->blocks,
4405 EINA_INLIST_GET(itbn));
4406 GL_IT(it)->wsd->blocks_realized = eina_list_remove
4407 (GL_IT(it)->wsd->blocks_realized, itbn);
4409 block_changed = EINA_TRUE;
4416 _changed(sd->pan_obj);
4419 GL_IT(it)->block = NULL;
4423 _decorate_all_item_unrealize(Elm_Gen_Item *it)
4425 if (!it->deco_all_view) return;
4427 edje_object_part_unswallow(it->deco_all_view, VIEW(it));
4428 _view_clear(it->deco_all_view, &(GL_IT(it)->deco_all_contents));
4429 evas_object_del(it->deco_all_view);
4430 it->deco_all_view = NULL;
4432 edje_object_signal_emit(VIEW(it), SIGNAL_DECORATE_DISABLED, "elm");
4434 _item_mouse_callbacks_add(it, VIEW(it));
4435 evas_object_smart_member_add(VIEW(it), GL_IT(it)->wsd->pan_obj);
4440 _item_mouse_move_cb(void *data,
4441 Evas *evas EINA_UNUSED,
4445 Evas_Event_Mouse_Move *ev = event_info;
4446 Elm_Gen_Item *it = data;
4447 Elm_Genlist_Data *sd = GL_IT(it)->wsd;
4449 if (!it->down) return;
4451 if (((sd->reorder_force) || (sd->reorder_mode)) &&
4452 (sd->reorder.it == it) &&
4456 evas_object_geometry_get(sd->pan_obj, &ox, NULL, NULL, NULL);
4458 if ((ev->cur.canvas.y - it->dy) > GL_IT(it)->scrl_y)
4459 sd->reorder.dir = 1;
4460 else if ((ev->cur.canvas.y - it->dy) < GL_IT(it)->scrl_y)
4461 sd->reorder.dir = -1;
4463 GL_IT(it)->scrl_x = it->x + GL_IT(it)->block->x - sd->pan_x + ox;
4464 GL_IT(it)->scrl_y = ev->cur.canvas.y - it->dy;
4465 GL_IT(it)->w = sd->minw;
4466 GL_IT(it)->h = GL_IT(it)->minh;
4467 _changed(sd->pan_obj);
4470 if (ev->event_flags & EVAS_EVENT_FLAG_ON_HOLD)
4472 if (GL_IT(it)->highlight_timer)
4474 ecore_timer_del(GL_IT(it)->highlight_timer);
4475 GL_IT(it)->highlight_timer = NULL;
4477 else if (!it->selected) _item_unhighlight(it, EINA_FALSE);
4481 ecore_timer_del(it->long_timer);
4482 it->long_timer = NULL;
4484 sd->on_hold = EINA_TRUE; /* for checking need to start select timer */
4486 //******************** TIZEN Only
4489 if (((sd->reorder_force) || (sd->reorder_mode)) &&
4490 (sd->reorder.it == it) && (!it->want_hidden))
4492 Evas_Coord x, y, w, h;
4493 evas_object_geometry_get(obj, &x, &y, &w, &h);
4494 if (ELM_RECTS_POINT_OUT(x, y, w, h, ev->cur.canvas.x, ev->cur.canvas.y))
4498 ecore_timer_del(it->long_timer);
4499 it->long_timer = NULL;
4501 if (GL_IT(it)->highlight_timer)
4503 ecore_timer_del(GL_IT(it)->highlight_timer);
4504 GL_IT(it)->highlight_timer = NULL;
4506 else if (!it->selected) _item_unhighlight(it, EINA_FALSE);
4509 //*******************************
4511 evas_object_ref(obj);
4515 Evas_Coord minw = 0, minh = 0, x, y, dx, dy, adx, ady;
4516 minw = GL_IT(it)->wsd->finger_minw;
4517 minh = GL_IT(it)->wsd->finger_minh;
4519 evas_object_geometry_get(obj, &x, &y, NULL, NULL);
4520 dx = ev->cur.canvas.x - x;
4521 dy = ev->cur.canvas.y - y;
4526 if (adx < 0) adx = -dx;
4527 if (ady < 0) ady = -dy;
4528 if ((adx > minw) || (ady > minh))
4530 it->dragging = EINA_TRUE;
4531 /* Genlist is scrolled vertically, so reduce left or right case for accuracy. */
4532 if (adx > (ady * 2))
4535 evas_object_smart_callback_call
4536 (WIDGET(it), SIG_DRAG_START_LEFT, EO_OBJ(it));
4538 evas_object_smart_callback_call
4539 (WIDGET(it), SIG_DRAG_START_RIGHT, EO_OBJ(it));
4544 evas_object_smart_callback_call
4545 (WIDGET(it), SIG_DRAG_START_UP, EO_OBJ(it));
4547 evas_object_smart_callback_call
4548 (WIDGET(it), SIG_DRAG_START_DOWN, EO_OBJ(it));
4553 /* If item magic value is changed, do not call smart callback*/
4554 if (EINA_MAGIC_CHECK(it->base, ELM_WIDGET_ITEM_MAGIC))
4557 evas_object_smart_callback_call(WIDGET(it), SIG_DRAG, EO_OBJ(it));
4560 evas_object_unref(obj);
4565 _long_press_cb(void *data)
4567 Elm_Gen_Item *it = data;
4568 Elm_Object_Item *eo_it2;
4569 Elm_Genlist_Data *sd;
4573 sd = GL_IT(it)->wsd;
4574 it->long_timer = NULL;
4576 if (eo_do_ret(EO_OBJ(it), ret, elm_wdg_item_disabled_get()) ||
4577 (it->select_mode == ELM_OBJECT_SELECT_MODE_DISPLAY_ONLY) ||
4578 (it->select_mode == ELM_OBJECT_SELECT_MODE_NONE) ||
4579 (sd->select_mode == ELM_OBJECT_SELECT_MODE_DISPLAY_ONLY) ||
4580 (sd->select_mode == ELM_OBJECT_SELECT_MODE_NONE))
4583 if ((sd->reorder_mode) &&
4584 (GL_IT(it)->type != ELM_GENLIST_ITEM_GROUP) &&
4585 (!sd->key_down_item))
4587 if (elm_genlist_item_expanded_get(EO_OBJ(it)))
4589 elm_genlist_item_expanded_set(EO_OBJ(it), EINA_FALSE);
4591 EINA_LIST_FOREACH_SAFE(sd->selected, l, ll, eo_it2)
4593 ELM_GENLIST_ITEM_DATA_GET(eo_it2, it2);
4594 _item_unselect(it2);
4597 eo_do(sd->obj, elm_interface_scrollable_hold_set(EINA_TRUE));
4598 eo_do(sd->obj, elm_interface_scrollable_bounce_allow_set
4599 (EINA_FALSE, EINA_FALSE));
4601 if (TIZEN_PROFILE_WEARABLE)
4604 if (sd->decorate_all_mode)
4605 edje_object_signal_emit(VIEW(it), SIGNAL_REORDER_ENABLED, "elm");
4609 edje_object_signal_emit(VIEW(it), SIGNAL_REORDER_ENABLED, "elm");
4612 sd->reorder.it = it;
4613 _changed(sd->pan_obj);
4615 evas_object_smart_callback_call(WIDGET(it), SIG_LONGPRESSED, EO_OBJ(it));
4618 it->long_timer = NULL;
4619 return ECORE_CALLBACK_CANCEL;
4623 _gesture_do(void *data)
4625 Elm_Genlist_Data *sd = data;
4627 if ((sd->g_item) && (sd->g_type))
4629 if (!strcmp(sd->g_type, SIG_MULTI_SWIPE_LEFT))
4630 evas_object_smart_callback_call
4631 (WIDGET(sd->g_item), SIG_MULTI_SWIPE_LEFT, EO_OBJ(sd->g_item));
4632 else if (!strcmp(sd->g_type, SIG_MULTI_SWIPE_RIGHT))
4633 evas_object_smart_callback_call
4634 (WIDGET(sd->g_item), SIG_MULTI_SWIPE_RIGHT, EO_OBJ(sd->g_item));
4635 else if (!strcmp(sd->g_type, SIG_MULTI_SWIPE_UP))
4636 evas_object_smart_callback_call
4637 (WIDGET(sd->g_item), SIG_MULTI_SWIPE_UP, EO_OBJ(sd->g_item));
4638 else if (!strcmp(sd->g_type, SIG_MULTI_SWIPE_DOWN))
4639 evas_object_smart_callback_call
4640 (WIDGET(sd->g_item), SIG_MULTI_SWIPE_DOWN, EO_OBJ(sd->g_item));
4641 else if (!strcmp(sd->g_type, SIG_MULTI_PINCH_OUT))
4642 evas_object_smart_callback_call
4643 (WIDGET(sd->g_item), SIG_MULTI_PINCH_OUT, EO_OBJ(sd->g_item));
4644 else if (!strcmp(sd->g_type, SIG_MULTI_PINCH_IN))
4645 evas_object_smart_callback_call
4646 (WIDGET(sd->g_item), SIG_MULTI_PINCH_IN, EO_OBJ(sd->g_item));
4647 else if (!strcmp(sd->g_type, SIG_SWIPE))
4648 evas_object_smart_callback_call
4649 (WIDGET(sd->g_item), SIG_SWIPE, EO_OBJ(sd->g_item));
4657 _item_mouse_down_cb(void *data,
4662 Evas_Event_Mouse_Down *ev = event_info;
4663 Elm_Gen_Item *it = data;
4664 Elm_Genlist_Data *sd = GL_IT(it)->wsd;
4667 if (ev->event_flags & EVAS_EVENT_FLAG_ON_SCROLL)
4671 elm_genlist_item_reorder_stop(EO_OBJ(sd->reorder.it));
4672 sd->reorder.it = NULL;
4673 eo_do(sd->obj, elm_interface_scrollable_hold_set(EINA_FALSE));
4674 eo_do(sd->obj, elm_interface_scrollable_bounce_allow_set(sd->h_bounce, sd->v_bounce));
4679 if (ev->button != 1) return;
4680 // mouse down is activate only one finger
4681 if (evas_event_down_count_get(evas) != 1) return;
4683 if (GL_IT(it)->highlight_timer)
4684 ecore_timer_del(GL_IT(it)->highlight_timer);
4685 // FIXME: To prevent timing issue about select and highlight
4686 else if (!sd->multi && sd->highlighted_item &&
4687 (GL_IT(sd->highlighted_item)->highlight_timer))
4690 it->down = EINA_TRUE;
4692 evas_object_geometry_get(obj, &x, &y, NULL, NULL);
4693 it->dx = ev->canvas.x - x;
4694 it->dy = ev->canvas.y - y;
4696 GL_IT(it)->wsd->was_selected = it->selected;
4697 GL_IT(it)->highlight_timer = ecore_timer_add(ELM_ITEM_HIGHLIGHT_TIMER,
4698 _highlight_timer, it);
4699 if (it->long_timer) ecore_timer_del(it->long_timer);
4700 it->long_timer = ecore_timer_add(sd->longpress_timeout, _long_press_cb, it);
4702 if (ev->flags & EVAS_BUTTON_DOUBLE_CLICK)
4704 evas_object_smart_callback_call(WIDGET(it), SIG_CLICKED_DOUBLE, EO_OBJ(it));
4705 evas_object_smart_callback_call(WIDGET(it), SIG_ACTIVATED, EO_OBJ(it));
4707 evas_object_smart_callback_call(WIDGET(it), SIG_PRESSED, EO_OBJ(it));
4711 _item_block_new(Elm_Genlist_Data *sd,
4716 itb = calloc(1, sizeof(Item_Block));
4717 if (!itb) return NULL;
4721 sd->blocks = eina_inlist_prepend(sd->blocks, EINA_INLIST_GET(itb));
4722 _item_block_position_update(sd->blocks, 0);
4726 sd->blocks = eina_inlist_append(sd->blocks, EINA_INLIST_GET(itb));
4727 itb->position_update = EINA_TRUE;
4728 if (sd->blocks != EINA_INLIST_GET(itb))
4731 ((Item_Block *)(EINA_INLIST_GET(itb)->prev))->position + 1;
4743 _item_block_add(Elm_Genlist_Data *sd,
4746 Item_Block *itb = NULL;
4747 if (GL_IT(it)->block) return EINA_TRUE;
4749 if (!GL_IT(it)->rel)
4754 itb = calloc(1, sizeof(Item_Block));
4755 if (!itb) return EINA_FALSE;
4757 if (!GL_IT(it)->rel->item->block)
4760 eina_inlist_append(sd->blocks, EINA_INLIST_GET(itb));
4761 itb->items = eina_list_append(itb->items, it);
4762 itb->position_update = EINA_TRUE;
4763 it->position = eina_list_count(itb->items);
4764 it->position_update = EINA_TRUE;
4766 if (sd->blocks != EINA_INLIST_GET(itb))
4770 (EINA_INLIST_GET(itb)->prev))->position + 1;
4781 tmp = eina_list_data_find_list(itb->items, GL_IT(it)->rel);
4782 if (GL_IT(it)->before)
4784 sd->blocks = eina_inlist_prepend_relative
4785 (sd->blocks, EINA_INLIST_GET(itb),
4786 EINA_INLIST_GET(GL_IT(it)->rel->item->block));
4788 eina_list_prepend_relative_list(itb->items, it, tmp);
4790 /* Update index from where we prepended */
4791 _item_position_update
4792 (eina_list_prev(tmp), GL_IT(it)->rel->position);
4793 _item_block_position_update
4794 (EINA_INLIST_GET(itb),
4795 GL_IT(it)->rel->item->block->position);
4799 sd->blocks = eina_inlist_append_relative
4800 (sd->blocks, EINA_INLIST_GET(itb),
4801 EINA_INLIST_GET(GL_IT(it)->rel->item->block));
4803 eina_list_append_relative_list(itb->items, it, tmp);
4805 /* Update block index from where we appended */
4806 _item_position_update
4807 (eina_list_next(tmp), GL_IT(it)->rel->position + 1);
4808 _item_block_position_update
4809 (EINA_INLIST_GET(itb),
4810 GL_IT(it)->rel->item->block->position + 1);
4816 if (GL_IT(it)->before)
4820 itb = (Item_Block *)(sd->blocks);
4821 if (itb->count >= sd->max_items_per_block)
4823 itb = _item_block_new(sd, EINA_TRUE);
4824 if (!itb) return EINA_FALSE;
4829 itb = _item_block_new(sd, EINA_TRUE);
4830 if (!itb) return EINA_FALSE;
4832 itb->items = eina_list_prepend(itb->items, it);
4833 _item_position_update(itb->items, 1);
4839 itb = (Item_Block *)(sd->blocks->last);
4840 if (itb->count >= sd->max_items_per_block)
4842 itb = _item_block_new(sd, EINA_FALSE);
4843 if (!itb) return EINA_FALSE;
4848 itb = _item_block_new(sd, EINA_FALSE);
4849 if (!itb) return EINA_FALSE;
4851 itb->items = eina_list_append(itb->items, it);
4852 it->position = eina_list_count(itb->items);
4861 if ((!GL_IT(it)->wsd->sorting) && (GL_IT(it)->rel->item->queued))
4863 /* NOTE: for a strange reason eina_list and eina_inlist
4864 don't have the same property on sorted insertion
4865 order, so the queue is not always ordered like the
4866 item list. This lead to issue where we depend on an
4867 item that is not yet created. As a quick work around,
4868 we reschedule the calc of the item and stop reordering
4869 the list to prevent any nasty issue to show up here.
4871 sd->queue = eina_list_append(sd->queue, it);
4872 sd->requeued = EINA_TRUE;
4873 GL_IT(it)->queued = EINA_TRUE;
4878 itb = GL_IT(it)->rel->item->block;
4879 if (!itb) goto newblock;
4880 tmp = eina_list_data_find_list(itb->items, GL_IT(it)->rel);
4881 if (GL_IT(it)->before)
4883 itb->items = eina_list_prepend_relative_list(itb->items, it, tmp);
4884 _item_position_update
4885 (eina_list_prev(tmp), GL_IT(it)->rel->position);
4889 itb->items = eina_list_append_relative_list(itb->items, it, tmp);
4890 _item_position_update
4891 (eina_list_next(tmp), GL_IT(it)->rel->position + 1);
4896 itb->calc_done = EINA_FALSE;
4897 sd->calc_done = EINA_FALSE;
4898 GL_IT(it)->block = itb;
4899 _changed(itb->sd->pan_obj);
4901 if (itb->count > itb->sd->max_items_per_block)
4906 Eina_Bool done = EINA_FALSE;
4908 newc = itb->count / 2;
4910 if (EINA_INLIST_GET(itb)->prev)
4912 Item_Block *itbp = (Item_Block *)(EINA_INLIST_GET(itb)->prev);
4914 if (itbp->count + newc < sd->max_items_per_block / 2)
4916 /* moving items to previous block */
4917 while ((itb->count > newc) && (itb->items))
4919 it2 = eina_list_data_get(itb->items);
4920 itb->items = eina_list_remove_list
4921 (itb->items, itb->items);
4924 itbp->items = eina_list_append(itbp->items, it2);
4925 it2->item->block = itbp;
4933 if (!done && EINA_INLIST_GET(itb)->next)
4935 Item_Block *itbn = (Item_Block *)(EINA_INLIST_GET(itb)->next);
4937 if (itbn->count + newc < sd->max_items_per_block / 2)
4939 /* moving items to next block */
4940 while ((itb->count > newc) && (itb->items))
4944 l = eina_list_last(itb->items);
4945 it2 = eina_list_data_get(l);
4946 itb->items = eina_list_remove_list(itb->items, l);
4949 itbn->items = eina_list_prepend(itbn->items, it2);
4950 it2->item->block = itbn;
4960 /* moving items to new block */
4961 itb2 = calloc(1, sizeof(Item_Block));
4962 if (!itb2) return EINA_FALSE;
4965 eina_inlist_append_relative(sd->blocks, EINA_INLIST_GET(itb2),
4966 EINA_INLIST_GET(itb));
4967 itb2->calc_done = EINA_FALSE;
4968 while ((itb->count > newc) && (itb->items))
4972 l = eina_list_last(itb->items);
4974 itb->items = eina_list_remove_list(itb->items, l);
4977 itb2->items = eina_list_prepend(itb2->items, it2);
4978 it2->item->block = itb2;
4988 _item_min_calc(Elm_Gen_Item *it)
4990 Elm_Genlist_Data *sd = GL_IT(it)->wsd;
4991 ELM_WIDGET_DATA_GET_OR_RETURN(WIDGET(it), wd);
4992 Evas_Coord mw = 0, mh = 0;
4995 eo_do(sd->obj, elm_interface_scrollable_content_viewport_geometry_get
4996 (NULL, NULL, &vw, NULL));
4998 if ((it->select_mode != ELM_OBJECT_SELECT_MODE_DISPLAY_ONLY) &&
4999 (sd->select_mode != ELM_OBJECT_SELECT_MODE_DISPLAY_ONLY))
5001 mw = sd->finger_minw;
5002 mh = sd->finger_minh;
5005 if ((sd->mode == ELM_LIST_COMPRESS) && vw && mw < vw)
5008 //FIXME: Some widget such as entry, label need to have fixed width size before
5009 // min calculation to get proper height size by multiline.
5010 if (sd->realization_mode || GL_IT(it)->resized)
5011 evas_object_resize(VIEW(it), mw, mh);
5013 edje_object_size_min_restricted_calc(VIEW(it), &mw, &mh, mw, mh);
5015 if ((sd->mode != ELM_LIST_LIMIT) && vw && mw < vw)
5018 // TIZEN ONLY(20160630): Support homogeneous mode in item class.
5019 if (sd->homogeneous || it->itc->homogeneous)
5021 Size_Cache *size, *tmp;
5022 tmp = eina_hash_find(sd->size_caches, it->itc->item_style);
5024 eina_hash_del_by_key(sd->size_caches, it->itc->item_style);
5026 size = ELM_NEW(Size_Cache);
5029 eina_hash_add(sd->size_caches, it->itc->item_style, size);
5032 GL_IT(it)->w = GL_IT(it)->minw = mw;
5033 GL_IT(it)->h = GL_IT(it)->minh = mh;
5035 // FIXME: This is workaround for entry size issue.
5036 if (sd->realization_mode || GL_IT(it)->resized)
5038 GL_IT(it)->resized = EINA_FALSE;
5039 if (it->deco_all_view)
5040 evas_object_resize(it->deco_all_view, GL_IT(it)->w, GL_IT(it)->h);
5041 else if (GL_IT(it)->deco_it_view)
5042 evas_object_resize(GL_IT(it)->deco_it_view, GL_IT(it)->w, GL_IT(it)->h);
5044 evas_object_resize(VIEW(it), GL_IT(it)->w, GL_IT(it)->h);
5047 if (wd->scroll_item_align_enable && (sd->aligned_item == it))
5048 _focus_bg_show(sd->aligned_item);
5052 _item_calc(Elm_Gen_Item *it)
5054 Elm_Genlist_Data *sd = GL_IT(it)->wsd;
5055 Size_Cache *size = NULL;
5056 Evas_Coord p_minw, p_minh;
5058 if (GL_IT(it)->calc_done) return;
5060 p_minw = GL_IT(it)->minw;
5061 p_minh = GL_IT(it)->minh;
5063 // TIZEN ONLY(20160630): Support homogeneous mode in item class.
5064 if (sd->homogeneous || it->itc->homogeneous)
5065 size = eina_hash_find(sd->size_caches, it->itc->item_style);
5068 GL_IT(it)->w = GL_IT(it)->minw = size->minw;
5069 GL_IT(it)->h = GL_IT(it)->minh = size->minh;
5075 if (sd->realization_mode)
5077 _item_realize(it, EINA_FALSE);
5082 _item_realize(it, EINA_TRUE);
5084 _item_unrealize(it, EINA_TRUE);
5091 GL_IT(it)->calc_done = EINA_TRUE;
5092 if ((p_minw != GL_IT(it)->minw) || (p_minh != GL_IT(it)->minh))
5094 GL_IT(it)->block->calc_done = EINA_FALSE;
5095 sd->calc_done = EINA_FALSE;
5100 _item_process(Elm_Genlist_Data *sd,
5103 if (!_item_block_add(sd, it)) return EINA_FALSE;
5105 GL_IT(it)->calc_done = EINA_FALSE;
5112 _dummy_job(void *data)
5114 Elm_Genlist_Data *sd = data;
5115 sd->dummy_job = NULL;
5120 _queue_idle_enter(void *data)
5122 Elm_Genlist_Data *sd = data;
5127 eo_do(sd->obj, elm_interface_scrollable_content_viewport_geometry_get
5128 (NULL, NULL, &vw, NULL));
5129 if (!sd->queue || (vw <= 1))
5133 ecore_job_del(sd->dummy_job);
5134 sd->dummy_job = NULL;
5136 sd->queue_idle_enterer = NULL;
5137 return ECORE_CALLBACK_CANCEL;
5140 ft = ecore_animator_frametime_get()/2;
5141 t0 = ecore_time_get();
5142 for (n = 0; (sd->queue) && (n < ITEM_QUEUE_MAX); n++)
5147 it = eina_list_data_get(sd->queue);
5148 sd->queue = eina_list_remove_list(sd->queue, sd->queue);
5149 GL_IT(it)->queued = EINA_FALSE;
5150 GL_IT(it)->resized = EINA_FALSE;
5151 if (!_item_process(sd, it)) continue;
5152 t = ecore_time_get();
5153 /* same as eina_inlist_count > 1 */
5154 if (sd->blocks && sd->blocks->next)
5156 if ((t - t0) > ft) break;
5160 _changed(sd->pan_obj);
5165 ecore_job_del(sd->dummy_job);
5166 sd->dummy_job = NULL;
5168 sd->queue_idle_enterer = NULL;
5169 return ECORE_CALLBACK_CANCEL;
5172 // Do not use smart_changed
5173 // Instead make any events (job, idler, etc.) to call idle enterer
5174 if (sd->dummy_job) ecore_job_del(sd->dummy_job);
5175 sd->dummy_job = ecore_job_add(_dummy_job, sd);
5177 return ECORE_CALLBACK_RENEW;
5181 _item_queue(Elm_Gen_Item *it,
5182 Eina_Compare_Cb cb EINA_UNUSED)
5184 if (GL_IT(it)->queued) return;
5186 GL_IT(it)->queued = EINA_TRUE;
5187 Elm_Genlist_Data *sd = GL_IT(it)->wsd;
5189 // FIXME: Below code occurs item unsorted result.
5190 // genlist already calculate items position by sd->items
5191 // so no need to requeue items by sorting insert.
5192 // if (cb && !sd->requeued)
5193 // sd->queue = eina_list_sorted_insert(sd->queue, cb, it);
5195 sd->queue = eina_list_append(sd->queue, it);
5197 if (sd->queue_idle_enterer)
5198 ecore_idle_enterer_del(sd->queue_idle_enterer);
5199 sd->queue_idle_enterer = ecore_idle_enterer_add(_queue_idle_enter, sd);
5203 _item_queue_direct(Elm_Gen_Item *it,
5206 Elm_Genlist_Data *sd = GL_IT(it)->wsd;
5208 // Processing items within viewport if items already exist.
5209 // This can prevent flickering issue when content size is changed.
5210 // This can fix the flickering issue when expanded item have subitems whose total height > vh
5211 if (!sd->queue && (sd->viewport_w > 1) &&
5212 ((sd->processed_sizes <= sd->viewport_h) || (GL_IT(it)->expanded_depth > 0)))
5214 #ifdef GENLIST_FX_SUPPORT
5215 if (sd->fx_mode)// && !it->item->is_prepend) // For support preppended items - hs619.choi@samsung.com
5217 sd->add_fx.items = eina_list_append(sd->add_fx.items, it);
5218 if (!sd->add_fx.anim)
5220 sd->add_fx.cnt = ANIM_CNT_MAX;
5221 sd->add_fx.anim = ecore_animator_add(_add_fx_anim, sd);
5225 _item_process(sd, it);
5226 sd->processed_sizes += GL_IT(it)->minh;
5228 _changed(sd->pan_obj);
5231 _item_queue(it, cb);
5234 /* If the application wants to know the relative item, use
5235 * elm_genlist_item_prev_get(it)*/
5237 _item_move_after(Elm_Gen_Item *it,
5238 Elm_Gen_Item *after)
5242 if (it == after) return;
5244 GL_IT(it)->wsd->items =
5245 eina_inlist_remove(GL_IT(it)->wsd->items, EINA_INLIST_GET(it));
5246 if (GL_IT(it)->block) _item_block_del(it);
5248 GL_IT(it)->wsd->items = eina_inlist_append_relative
5249 (GL_IT(it)->wsd->items, EINA_INLIST_GET(it), EINA_INLIST_GET(after));
5252 GL_IT(it)->rel->item->rel_revs =
5253 eina_list_remove(GL_IT(it)->rel->item->rel_revs, it);
5254 GL_IT(it)->rel = after;
5255 after->item->rel_revs = eina_list_append(after->item->rel_revs, it);
5256 GL_IT(it)->before = EINA_FALSE;
5257 if (after->item->group_item) GL_IT(it)->group_item = after->item->group_item;
5259 if (GL_IT(it)->queued)
5261 GL_IT(it)->wsd->queue = eina_list_remove(GL_IT(it)->wsd->queue, it);
5262 GL_IT(it)->queued = EINA_FALSE;
5264 _item_queue_direct(it, NULL);
5266 evas_object_smart_callback_call(WIDGET(it), SIG_MOVED_AFTER, EO_OBJ(it));
5269 /* If the application wants to know the relative item, use
5270 * elm_genlist_item_next_get(it)*/
5272 _item_move_before(Elm_Gen_Item *it,
5273 Elm_Gen_Item *before)
5276 if (!before) return;
5277 if (it == before) return;
5279 GL_IT(it)->wsd->items =
5280 eina_inlist_remove(GL_IT(it)->wsd->items, EINA_INLIST_GET(it));
5281 if (GL_IT(it)->block) _item_block_del(it);
5282 GL_IT(it)->wsd->items = eina_inlist_prepend_relative
5283 (GL_IT(it)->wsd->items, EINA_INLIST_GET(it), EINA_INLIST_GET(before));
5286 GL_IT(it)->rel->item->rel_revs =
5287 eina_list_remove(GL_IT(it)->rel->item->rel_revs, it);
5288 GL_IT(it)->rel = before;
5289 before->item->rel_revs = eina_list_append(before->item->rel_revs, it);
5290 GL_IT(it)->before = EINA_TRUE;
5291 if (before->item->group_item)
5292 GL_IT(it)->group_item = before->item->group_item;
5293 _item_queue_direct(it, NULL);
5295 evas_object_smart_callback_call(WIDGET(it), SIG_MOVED_BEFORE, EO_OBJ(it));
5299 _item_mouse_up_cb(void *data,
5301 Evas_Object *obj EINA_UNUSED,
5304 Evas_Event_Mouse_Up *ev = event_info;
5305 Elm_Gen_Item *it = data;
5306 Elm_Genlist_Data *sd = GL_IT(it)->wsd;
5308 ELM_WIDGET_DATA_GET_OR_RETURN(sd->obj, wd);
5310 if (!it->down) return;
5311 it->down = EINA_FALSE;
5313 if (ev->button != 1) return;
5317 it->dragging = EINA_FALSE;
5318 evas_object_smart_callback_call(WIDGET(it), SIG_DRAG_STOP, EO_OBJ(it));
5320 // When the event is cancelled, need to initialize mouse flags and timers.
5321 if (ev->event_flags & EVAS_EVENT_FLAG_ON_HOLD) sd->on_hold = EINA_TRUE;
5325 if (evas_event_down_count_get(evas) != 0)
5327 if (!GL_IT(it)->highlight_timer) _item_unhighlight(it, EINA_TRUE);
5332 ecore_timer_del(it->long_timer);
5333 it->long_timer = NULL;
5335 if (GL_IT(it)->highlight_timer)
5337 ecore_timer_del(GL_IT(it)->highlight_timer);
5338 GL_IT(it)->highlight_timer = NULL;
5339 // Because naviframe can drop the all evevents.
5340 // highlight it before select timer is called.
5341 if (evas_event_down_count_get(evas) == 0) _item_highlight(it);
5344 if (!sd->reorder.it && (evas_event_down_count_get(evas) == 0))
5346 // FIXME: if highlight mode is not used, mouse move cannot disable
5348 if ((sd->was_selected == it->selected) && (!sd->on_hold))
5350 if (wd->scroll_item_align_enable)
5352 const char *align = edje_object_data_get(VIEW(it), "align");
5353 if (!align || strcmp(align, "off"))
5355 if (it != sd->aligned_item)
5357 elm_genlist_item_bring_in(EO_OBJ(it), ELM_GENLIST_ITEM_SCROLLTO_MIDDLE);
5361 if (((sd->highlight && it->highlighted) || !sd->highlight) &&
5362 ((!wd->scroll_item_align_enable) || (it == sd->aligned_item)))
5363 GL_IT(it)->highlight_timer =
5364 ecore_timer_add(ITEM_SELECT_TIMER, _select_timer, it);
5365 else if ((it->select_mode == ELM_OBJECT_SELECT_MODE_DISPLAY_ONLY) ||
5366 (it->select_mode == ELM_OBJECT_SELECT_MODE_NONE))
5369 Evas_Object *content;
5370 if (sd->focused_item != it)
5371 elm_object_item_focus_set(EO_OBJ(it), EINA_TRUE);
5373 sd->focused_content = NULL;
5374 EINA_LIST_FOREACH(it->content_objs, l, content)
5376 if (elm_widget_focused_object_get(content))
5377 sd->focused_content = content;
5382 else if (sd->reorder.it == it)
5384 if (TIZEN_PROFILE_WEARABLE)
5386 Elm_Gen_Item *it2, *it_max = NULL, *it_min = NULL;
5387 Evas_Coord r_y_scrl, it_y_max = -99999999, it_y_min = 99999999;
5389 if (!it->selected) _item_unhighlight(it, EINA_TRUE);
5390 r_y_scrl = GL_IT(it)->scrl_y;
5391 EINA_LIST_FREE(sd->reorder.move_items, it2)
5393 if (sd->reorder.it->parent != it2->parent)
5395 it2->item->reorder_offset = 0;
5398 Evas_Coord it_y = it2->item->scrl_y +
5399 it2->item->reorder_offset + (it2->item->h / 2) +
5400 it2->item->block->y;
5402 if ((it_y < r_y_scrl) &&
5408 else if ((it_y > r_y_scrl) &&
5414 it2->item->reorder_offset = 0;
5418 _item_move_after(it, it_max);
5419 evas_object_smart_callback_call(WIDGET(it), SIG_MOVED, EO_OBJ(it));
5423 _item_move_before(it, it_min);
5424 evas_object_smart_callback_call(WIDGET(it), SIG_MOVED, EO_OBJ(it));
5430 Elm_Gen_Item *moved_it = NULL;
5431 Elm_Gen_Item *ptr_it = sd->top_drawn_item;
5432 Elm_Gen_Item *last_it = NULL;
5433 Eina_Bool after = EINA_TRUE;
5435 if (!it->selected) _item_unhighlight(it, EINA_FALSE);
5441 if (ELM_RECTS_INTERSECT(GL_IT(it)->scrl_x, GL_IT(it)->scrl_y, GL_IT(it)->w, GL_IT(it)->h,
5442 GL_IT(ptr_it)->scrl_x, GL_IT(ptr_it)->scrl_y, GL_IT(ptr_it)->w, GL_IT(ptr_it)->h))
5444 if (GL_IT(it)->scrl_y < GL_IT(ptr_it)->scrl_y)
5451 if ((GL_IT(it)->scrl_y + GL_IT(it)->h) > (GL_IT(ptr_it)->scrl_y + GL_IT(ptr_it)->h))
5453 if ((GL_IT(it)->scrl_y + GL_IT(it)->h) == GL_IT(ptr_it)->scrl_y)
5461 ptr_it = ELM_GEN_ITEM_FROM_INLIST(EINA_INLIST_GET(ptr_it)->next);
5466 if (GL_IT(it)->scrl_y > GL_IT(last_it)->scrl_y + GL_IT(last_it)->h)
5470 moved_it = sd->top_drawn_item;
5475 EINA_LIST_FREE(sd->reorder.move_items, ptr_it)
5477 ptr_it->item->reorder_offset = 0;
5482 _item_move_after(it, moved_it);
5483 evas_object_smart_callback_call(WIDGET(it), SIG_MOVED, EO_OBJ(it));
5487 _item_move_before(it, moved_it);
5488 evas_object_smart_callback_call(WIDGET(it), SIG_MOVED, EO_OBJ(it));
5491 sd->reorder.it = NULL;
5492 sd->reorder.dir = 0;
5493 if (sd->reorder.anim)
5495 ecore_animator_del(sd->reorder.anim);
5496 sd->reorder.anim = NULL;
5499 eo_do(sd->obj, elm_interface_scrollable_hold_set(EINA_FALSE));
5500 eo_do(sd->obj, elm_interface_scrollable_bounce_allow_set
5501 (sd->h_bounce, sd->v_bounce));
5503 edje_object_signal_emit(VIEW(it), SIGNAL_REORDER_DISABLED, "elm");
5504 _changed(sd->pan_obj);
5506 sd->on_hold = EINA_FALSE; /* for checking need to start select timer */
5507 evas_object_smart_callback_call(WIDGET(it), SIG_RELEASED, EO_OBJ(it));
5511 _scroll_hold_timer_cb(void *data)
5513 Elm_Genlist_Data *sd = data;
5514 sd->scr_hold_timer = NULL;
5516 eo_do(sd->obj, elm_interface_scrollable_hold_set(EINA_FALSE));
5518 return ECORE_CALLBACK_CANCEL;
5522 _decorate_item_finished_signal_cb(void *data,
5524 const char *emission EINA_UNUSED,
5525 const char *source EINA_UNUSED)
5527 Elm_Gen_Item *it = data;
5529 if (!data || !obj) return;
5530 if ((!it->realized)) return;
5532 _decorate_item_unrealize(it);
5536 _item_update(Elm_Gen_Item *it)
5539 if (!it->realized) return;
5541 _view_clear(VIEW(it), &(it->content_objs));
5542 EINA_LIST_FREE(GL_IT(it)->flip_content_objs, c)
5544 _view_clear(GL_IT(it)->deco_it_view, &(GL_IT(it)->deco_it_contents));
5545 _view_clear(it->deco_all_view, &(GL_IT(it)->deco_all_contents));
5547 _view_inflate(VIEW(it), it, &(it->content_objs));
5550 _item_content_realize(it, VIEW(it), &(GL_IT(it)->flip_content_objs),
5552 edje_object_signal_emit(VIEW(it), SIGNAL_FLIP_ENABLED, "elm");
5554 if (GL_IT(it)->wsd->decorate_all_mode)
5555 _view_inflate(it->deco_all_view, it, &(GL_IT(it)->deco_all_contents));
5556 else if (GL_IT(it)->deco_it_view)
5557 _view_inflate(GL_IT(it)->deco_it_view, it, &(GL_IT(it)->deco_it_contents));
5559 if (!TIZEN_PROFILE_WEARABLE)
5560 _banded_item_bg_add(it, VIEW(it));
5563 evas_object_smart_callback_call(WIDGET(it), SIG_HIGHLIGHTED, EO_OBJ(it));
5565 if (GL_IT(it)->wsd->aligned_item == it)
5566 edje_object_signal_emit(VIEW(it), SIGNAL_ITEM_HIGHLIGHTED, "elm");
5568 edje_object_message_signal_process(VIEW(it));
5572 _item_block_calc(Item_Block *itb, Evas_Coord vw EINA_UNUSED, Evas_Coord vh)
5576 Evas_Coord minw = 9999999, minh = 0;
5577 int sum_item_height = 0;
5578 ELM_WIDGET_DATA_GET_OR_RETURN(itb->sd->obj, wsd);
5580 if (itb->calc_done) return;
5582 EINA_LIST_FOREACH(itb->items, l, it)
5584 if (it->want_hidden) continue;
5585 if (GL_IT(it)->updateme)
5591 GL_IT(it)->calc_done = EINA_FALSE;
5592 GL_IT(it)->updateme = EINA_FALSE;
5594 if (!GL_IT(it)->queued) _item_calc(it);
5596 if (wsd->scroll_item_align_enable)
5598 int vcenter = vh / 2;
5599 int icenter = GL_IT(it)->h / 2;
5600 if ((itb->y + sum_item_height < vcenter && itb->y + sum_item_height + GL_IT(it)->h > vcenter) &&
5601 (sum_item_height + icenter < vcenter - 1 || sum_item_height + icenter > vcenter + 1))
5603 int first_item_height = sum_item_height = vcenter - icenter;
5605 Elm_Object_Item *eo_prev = elm_genlist_item_prev_get(EO_OBJ(it));
5606 Elm_Gen_Item *prev = eo_data_scope_get(eo_prev, ELM_GENLIST_ITEM_CLASS);
5609 minh = sum_item_height;
5612 if (eo_prev == elm_genlist_first_item_get(wsd->obj))
5614 GL_IT(prev)->h = GL_IT(prev)->minh = first_item_height;
5617 first_item_height -= GL_IT(prev)->h;
5618 prev->y = first_item_height;
5619 eo_prev = elm_genlist_item_prev_get(eo_prev);
5620 prev = eo_data_scope_get(eo_prev, ELM_GENLIST_ITEM_CLASS);
5623 sum_item_height += GL_IT(it)->h;
5628 if (minw > GL_IT(it)->minw) minw = GL_IT(it)->minw;
5629 minh += GL_IT(it)->minh;
5630 if (GL_IT(it)->is_prepend)
5632 itb->sd->comp_y += GL_IT(it)->minh;
5633 GL_IT(it)->is_prepend = EINA_FALSE;
5638 itb->calc_done = EINA_TRUE;
5639 itb->position_update = EINA_FALSE;
5643 _scroll_animate_start_cb(Evas_Object *obj,
5644 void *data EINA_UNUSED)
5646 ELM_WIDGET_DATA_GET_OR_RETURN(obj, wd);
5647 evas_object_smart_callback_call(obj, SIG_SCROLL_ANIM_START, NULL);
5648 if (wd->scroll_item_align_enable)
5650 edje_object_signal_emit(wd->resize_obj, SIGNAL_FOCUS_BG_HIDE, "elm");
5655 _scroll_animate_stop_cb(Evas_Object *obj,
5656 void *data EINA_UNUSED)
5658 ELM_WIDGET_DATA_GET_OR_RETURN(obj, wd);
5659 evas_object_smart_callback_call(obj, SIG_SCROLL_ANIM_STOP, NULL);
5661 //TIZEN_ONLY: Let the screen-reader know when scroll animation ends
5662 if (_elm_atspi_enabled())
5664 elm_interface_atspi_accessible_visible_data_changed_signal_emit(obj);
5670 _scroll_drag_start_cb(Evas_Object *obj,
5671 void *data EINA_UNUSED)
5673 ELM_WIDGET_DATA_GET_OR_RETURN(obj, wd);
5674 evas_object_smart_callback_call(obj, SIG_SCROLL_DRAG_START, NULL);
5675 if (wd->scroll_item_align_enable)
5677 edje_object_signal_emit(wd->resize_obj, SIGNAL_FOCUS_BG_HIDE, "elm");
5682 _scroll_timeout_cb(void *data)
5684 Elm_Genlist_Data *sd = data;
5686 sd->scr_timer = NULL;
5687 if (sd->queue && !sd->queue_idle_enterer)
5689 sd->queue_idle_enterer = ecore_idle_enterer_add(_queue_idle_enter, sd);
5690 if (sd->dummy_job) ecore_job_del(sd->dummy_job);
5691 sd->dummy_job = ecore_job_add(_dummy_job, sd);
5693 return ECORE_CALLBACK_CANCEL;
5697 _scroll_cb(Evas_Object *obj,
5698 void *data EINA_UNUSED)
5700 ELM_GENLIST_DATA_GET(obj, sd);
5702 if (sd->queue_idle_enterer)
5704 ecore_idle_enterer_del(sd->queue_idle_enterer);
5705 sd->queue_idle_enterer = NULL;
5708 ecore_job_del(sd->dummy_job);
5709 sd->dummy_job = NULL;
5712 if (sd->scr_timer) ecore_timer_del(sd->scr_timer);
5713 sd->scr_timer = ecore_timer_add(0.25, _scroll_timeout_cb, sd);
5715 evas_object_smart_callback_call(obj, SIG_SCROLL, NULL);
5719 _scroll_drag_stop_cb(Evas_Object *obj,
5720 void *data EINA_UNUSED)
5722 evas_object_smart_callback_call(obj, SIG_SCROLL_DRAG_STOP, NULL);
5723 //TIZEN_ONLY: Let the screen-reader know when drag ends
5724 if (_elm_atspi_enabled())
5726 elm_interface_atspi_accessible_visible_data_changed_signal_emit(obj);
5732 _edge_left_cb(Evas_Object *obj,
5733 void *data EINA_UNUSED)
5735 evas_object_smart_callback_call(obj, SIG_EDGE_LEFT, NULL);
5739 _edge_right_cb(Evas_Object *obj,
5740 void *data EINA_UNUSED)
5742 evas_object_smart_callback_call(obj, SIG_EDGE_RIGHT, NULL);
5746 _edge_top_cb(Evas_Object *obj,
5747 void *data EINA_UNUSED)
5749 evas_object_smart_callback_call(obj, SIG_EDGE_TOP, NULL);
5753 _edge_bottom_cb(Evas_Object *obj,
5754 void *data EINA_UNUSED)
5756 evas_object_smart_callback_call(obj, SIG_EDGE_BOTTOM, NULL);
5760 _vbar_drag_cb(Evas_Object *obj,
5761 void *data EINA_UNUSED)
5763 evas_object_smart_callback_call(obj, SIG_VBAR_DRAG, NULL);
5767 _vbar_press_cb(Evas_Object *obj,
5768 void *data EINA_UNUSED)
5770 evas_object_smart_callback_call(obj, SIG_VBAR_PRESS, NULL);
5774 _vbar_unpress_cb(Evas_Object *obj,
5775 void *data EINA_UNUSED)
5777 evas_object_smart_callback_call(obj, SIG_VBAR_UNPRESS, NULL);
5781 _hbar_drag_cb(Evas_Object *obj,
5782 void *data EINA_UNUSED)
5784 evas_object_smart_callback_call(obj, SIG_HBAR_DRAG, NULL);
5788 _hbar_press_cb(Evas_Object *obj,
5789 void *data EINA_UNUSED)
5791 evas_object_smart_callback_call(obj, SIG_HBAR_PRESS, NULL);
5795 _hbar_unpress_cb(Evas_Object *obj,
5796 void *data EINA_UNUSED)
5798 evas_object_smart_callback_call(obj, SIG_HBAR_UNPRESS, NULL);
5802 _decorate_item_realize(Elm_Gen_Item *it)
5805 if (GL_IT(it)->deco_it_view || !it->itc->decorate_item_style) return;
5807 // Before adding & swallowing, delete it from smart member
5808 evas_object_smart_member_del(VIEW(it));
5810 GL_IT(it)->deco_it_view = _view_create(it, it->itc->decorate_item_style);
5811 edje_object_part_swallow
5812 (GL_IT(it)->deco_it_view,
5813 edje_object_data_get(GL_IT(it)->deco_it_view, "mode_part"), VIEW(it));
5814 _view_inflate(GL_IT(it)->deco_it_view, it, &(GL_IT(it)->deco_it_contents));
5816 snprintf(buf, sizeof(buf), "elm,state,%s,active",
5817 GL_IT(it)->wsd->decorate_it_type);
5818 edje_object_signal_emit(GL_IT(it)->deco_it_view, buf, "elm");
5819 edje_object_signal_emit(VIEW(it), buf, "elm");
5821 _item_mouse_callbacks_add(it, GL_IT(it)->deco_it_view);
5823 _item_mouse_callbacks_del(it, VIEW(it));
5827 // FIXME: difference from upstream
5829 _mouse_down_scroller(void *data,
5830 Evas *evas EINA_UNUSED,
5831 Evas_Object *obj EINA_UNUSED,
5832 void *event_info EINA_UNUSED)
5834 Widget_Data *wd = elm_widget_data_get(data);
5837 wd->drag_started = EINA_FALSE;
5841 _mouse_up_scroller(void *data,
5842 Evas *evas EINA_UNUSED,
5843 Evas_Object *obj EINA_UNUSED,
5844 void *event_info EINA_UNUSED)
5846 Widget_Data *wd = elm_widget_data_get(data);
5849 wd->drag_started = EINA_FALSE;
5853 _mouse_move_scroller(void *data,
5854 Evas *evas EINA_UNUSED,
5855 Evas_Object *obj EINA_UNUSED,
5858 Widget_Data *wd = elm_widget_data_get(data);
5859 Evas_Event_Mouse_Move *ev = event_info;
5860 Evas_Coord minw = 0, minh = 0, dx, dy, adx, ady;
5863 if (wd->drag_started) return;
5865 elm_coords_finger_size_adjust(1, &minw, 1, &minh);
5866 dx = ev->cur.canvas.x - ev->prev.canvas.x;
5867 dy = ev->cur.canvas.y - ev->prev.canvas.y;
5870 if (adx < 0) adx = -dx;
5871 if (ady < 0) ady = -dy;
5872 if (((ady < minh) && (ady > minh / 2)) && (ady > adx))
5876 evas_object_smart_callback_call(data, SIG_DRAG_START_UP, NULL);
5877 wd->drag_started = EINA_TRUE;
5881 evas_object_smart_callback_call(data, SIG_DRAG_START_DOWN, NULL);
5882 wd->drag_started = EINA_TRUE;
5889 _size_cache_free(void *data)
5891 if (data) free(data);
5894 static Evas_Event_Flags
5895 _pinch_zoom_start_cb(void *data, void *event_info)
5897 Elm_Genlist_Data *sd = data;
5898 Elm_Gesture_Zoom_Info *p = (Elm_Gesture_Zoom_Info *) event_info;
5899 Elm_Object_Item *eo_it;
5901 eo_it = elm_genlist_at_xy_item_get(sd->obj, p->x, p->y, NULL);
5902 sd->g_item = eo_data_scope_get(eo_it, ELM_GENLIST_ITEM_CLASS);
5903 return EVAS_EVENT_FLAG_NONE;
5906 static Evas_Event_Flags
5907 _pinch_zoom_cb(void *data, void *event_info)
5909 Elm_Genlist_Data *sd = data;
5910 Elm_Gesture_Zoom_Info *p = (Elm_Gesture_Zoom_Info *) event_info;
5912 if (p->zoom > 1.0 + PINCH_ZOOM_TOLERANCE)
5913 sd->g_type = SIG_MULTI_PINCH_OUT;
5914 else if (p->zoom < 1.0 - PINCH_ZOOM_TOLERANCE)
5915 sd->g_type = SIG_MULTI_PINCH_IN;
5917 return EVAS_EVENT_FLAG_NONE;
5920 static Evas_Event_Flags
5921 _gesture_n_lines_start_cb(void *data , void *event_info)
5923 Elm_Genlist_Data *sd = data;
5924 Elm_Gesture_Line_Info *p = (Elm_Gesture_Line_Info *) event_info;
5926 Elm_Object_Item *eo_it;
5928 x = (p->momentum.x1 + p->momentum.x2) / 2;
5929 y = (p->momentum.y1 + p->momentum.y2) / 2;
5931 eo_it = elm_genlist_at_xy_item_get(sd->obj, x, y, NULL);
5932 sd->g_item = eo_data_scope_get(eo_it, ELM_GENLIST_ITEM_CLASS);
5933 return EVAS_EVENT_FLAG_NONE;
5936 static Evas_Event_Flags
5937 _gesture_n_lines_cb(void *data , void *event_info)
5939 Elm_Genlist_Data *sd = data;
5940 Elm_Gesture_Line_Info *p = (Elm_Gesture_Line_Info *) event_info;
5942 if (p->momentum.n < 2)
5943 return EVAS_EVENT_FLAG_NONE;
5945 Evas_Coord minw = 0, minh = 0;
5946 Evas_Coord x, y, off_x, off_y;
5947 Evas_Coord cur_x, cur_y, prev_x, prev_y;
5948 Elm_Gen_Item *down_it;
5949 Elm_Object_Item *eo_down_it;
5951 minw = sd->finger_minw;
5952 minh = sd->finger_minh;
5954 prev_x = prev_y = 0;
5956 cur_x = p->momentum.x1;
5957 cur_y = p->momentum.y1;
5959 eo_down_it = elm_genlist_at_xy_item_get(sd->obj, cur_x, cur_y, NULL);
5960 down_it = eo_data_scope_get(eo_down_it, ELM_GENLIST_ITEM_CLASS);
5963 evas_object_geometry_get(VIEW(down_it), &x, &y, NULL, NULL);
5964 prev_x = down_it->dx + x;
5965 prev_y = down_it->dy + y;
5967 off_x = abs(cur_x - prev_x);
5968 off_y = abs(cur_y - prev_y);
5970 if ((off_x > minw) || (off_y > minh))
5975 sd->g_type = SIG_MULTI_SWIPE_RIGHT;
5977 sd->g_type = SIG_MULTI_SWIPE_LEFT;
5982 sd->g_type = SIG_MULTI_SWIPE_DOWN;
5984 sd->g_type = SIG_MULTI_SWIPE_UP;
5988 return EVAS_EVENT_FLAG_NONE;
5991 static Evas_Event_Flags
5992 _gesture_n_flicks_cb(void *data , void *event_info)
5994 Elm_Genlist_Data *sd = data;
5995 Elm_Gesture_Line_Info *p = (Elm_Gesture_Line_Info *) event_info;
5997 if (p->momentum.n == 1)
5998 sd->g_type = SIG_SWIPE;
6000 return EVAS_EVENT_FLAG_NONE;
6004 _elm_genlist_evas_object_smart_del(Eo *obj, Elm_Genlist_Data *sd)
6006 sd->no_cache = EINA_TRUE;
6007 elm_genlist_clear(obj);
6008 evas_event_callback_del_full(evas_object_evas_get(obj),
6009 EVAS_CALLBACK_CANVAS_VIEWPORT_RESIZE,
6010 _evas_viewport_resize_cb, sd);
6011 if (sd->size_caches) eina_hash_free(sd->size_caches);
6012 if (sd->decorate_it_type) eina_stringshare_del(sd->decorate_it_type);
6014 evas_object_del(sd->pan_obj);
6015 eo_do_super(obj, MY_CLASS, evas_obj_smart_del());
6019 _elm_genlist_evas_object_smart_move(Eo *obj, Elm_Genlist_Data *sd, Evas_Coord x, Evas_Coord y)
6021 Evas_Coord ox, oy, bg_x, bg_y;
6023 if (!TIZEN_PROFILE_WEARABLE)
6025 evas_object_geometry_get(obj, &ox, &oy, NULL, NULL);
6026 evas_object_geometry_get(sd->banded_bg_rect, &bg_x, &bg_y, NULL, NULL);
6029 eo_do_super(obj, MY_CLASS, evas_obj_smart_move(x, y));
6030 evas_object_move(sd->hit_rect, x, y);
6032 if (!TIZEN_PROFILE_WEARABLE)
6033 evas_object_move(sd->banded_bg_rect, (bg_x + x - ox), (bg_y + y - oy));
6037 _elm_genlist_evas_object_smart_resize(Eo *obj, Elm_Genlist_Data *sd, Evas_Coord w, Evas_Coord h)
6039 eo_do_super(obj, MY_CLASS, evas_obj_smart_resize(w, h));
6041 evas_object_resize(sd->hit_rect, w, h);
6045 _elm_genlist_evas_object_smart_member_add(Eo *obj, Elm_Genlist_Data *sd, Evas_Object *member)
6047 eo_do_super(obj, MY_CLASS, evas_obj_smart_member_add(member));
6050 evas_object_raise(sd->hit_rect);
6055 _elm_genlist_elm_widget_access(Eo *obj EINA_UNUSED, Elm_Genlist_Data *sd, Eina_Bool acs)
6058 Elm_Object_Item *eo_it;
6060 l = elm_genlist_realized_items_get(obj);
6062 EINA_LIST_FREE(l, eo_it)
6064 ELM_GENLIST_ITEM_DATA_GET(eo_it, it);
6065 _item_unrealize(it, EINA_FALSE);
6068 sd->is_access = acs;
6070 _changed(sd->pan_obj);
6071 evas_object_smart_callback_call(obj, SIG_ACCESS_CHANGED, NULL);
6075 _evas_viewport_resize_cb(void *d, Evas *e EINA_UNUSED, void *ei EINA_UNUSED)
6077 Elm_Genlist_Data *priv = d;
6078 _changed(priv->pan_obj);
6082 _elm_genlist_evas_object_smart_add(Eo *obj, Elm_Genlist_Data *priv)
6084 ELM_WIDGET_DATA_GET_OR_RETURN(obj, wd);
6085 Evas_Coord minw, minh;
6086 Elm_Genlist_Pan_Data *pan_data;
6088 eo_do_super(obj, MY_CLASS, evas_obj_smart_add());
6089 elm_widget_sub_object_parent_add(obj);
6091 priv->finger_minw = 0;
6092 priv->finger_minh = 0;
6093 elm_coords_finger_size_adjust(1, &priv->finger_minw, 1, &priv->finger_minh);
6095 priv->size_caches = eina_hash_string_small_new(_size_cache_free);
6096 priv->hit_rect = evas_object_rectangle_add(evas_object_evas_get(obj));
6097 evas_object_smart_member_add(priv->hit_rect, obj);
6098 elm_widget_sub_object_add(obj, priv->hit_rect);
6100 /* common scroller hit rectangle setup */
6101 evas_object_color_set(priv->hit_rect, 0, 0, 0, 0);
6102 evas_object_show(priv->hit_rect);
6103 evas_object_repeat_events_set(priv->hit_rect, EINA_TRUE);
6105 elm_widget_can_focus_set(obj, EINA_TRUE);
6106 elm_widget_on_show_region_hook_set(obj, _show_region_hook, obj);
6108 elm_layout_theme_set(obj, "genlist", "base", elm_widget_style_get(obj));
6110 if (!TIZEN_PROFILE_WEARABLE)
6111 _banded_bg_state_check(obj, priv);
6113 /* interface's add() routine issued AFTER the object's smart_add() */
6114 eo_do(obj, elm_interface_scrollable_objects_set(wd->resize_obj, priv->hit_rect));
6116 eo_do(obj, elm_interface_scrollable_bounce_allow_set
6117 (EINA_FALSE, _elm_config->thumbscroll_bounce_enable));
6118 priv->v_bounce = _elm_config->thumbscroll_bounce_enable;
6121 elm_interface_scrollable_animate_start_cb_set(_scroll_animate_start_cb),
6122 elm_interface_scrollable_animate_stop_cb_set(_scroll_animate_stop_cb),
6123 elm_interface_scrollable_scroll_cb_set(_scroll_cb),
6124 elm_interface_scrollable_drag_start_cb_set(_scroll_drag_start_cb),
6125 elm_interface_scrollable_drag_stop_cb_set(_scroll_drag_stop_cb),
6126 elm_interface_scrollable_edge_left_cb_set(_edge_left_cb),
6127 elm_interface_scrollable_edge_right_cb_set(_edge_right_cb),
6128 elm_interface_scrollable_edge_top_cb_set(_edge_top_cb),
6129 elm_interface_scrollable_edge_bottom_cb_set(_edge_bottom_cb),
6130 elm_interface_scrollable_vbar_drag_cb_set(_vbar_drag_cb),
6131 elm_interface_scrollable_vbar_press_cb_set(_vbar_press_cb),
6132 elm_interface_scrollable_vbar_unpress_cb_set(_vbar_unpress_cb),
6133 elm_interface_scrollable_hbar_drag_cb_set(_hbar_drag_cb),
6134 elm_interface_scrollable_hbar_press_cb_set(_hbar_press_cb),
6135 elm_interface_scrollable_hbar_unpress_cb_set(_hbar_unpress_cb));
6137 eo_do(obj, elm_interface_scrollable_content_min_limit_cb_set(_elm_genlist_content_min_limit_cb));
6139 priv->mode = ELM_LIST_SCROLL;
6140 priv->max_items_per_block = MAX_ITEMS_PER_BLOCK;
6141 priv->item_cache_max = priv->max_items_per_block * 2;
6142 priv->longpress_timeout = _elm_config->longpress_timeout;
6143 priv->highlight = EINA_TRUE;
6144 priv->fx_mode = EINA_FALSE;
6145 priv->on_hold = EINA_FALSE;
6148 if (!TIZEN_PROFILE_WEARABLE)
6149 priv->top_drawn_item = NULL;
6151 priv->pan_obj = eo_add(MY_PAN_CLASS, evas_object_evas_get(obj));
6152 pan_data = eo_data_scope_get(priv->pan_obj, MY_PAN_CLASS);
6153 eo_data_ref(obj, NULL);
6155 pan_data->wobj = obj;
6157 pan_data->wsd = priv;
6160 // FIXME: difference from upstream
6161 evas_object_event_callback_add(pan_obj, EVAS_CALLBACK_MOUSE_DOWN,
6162 _mouse_down_scroller, obj);
6163 evas_object_event_callback_add(pan_obj, EVAS_CALLBACK_MOUSE_UP,
6164 _mouse_up_scroller, obj);
6165 evas_object_event_callback_add(pan_obj, EVAS_CALLBACK_MOUSE_MOVE,
6166 _mouse_move_scroller, obj);
6169 eo_do(obj, elm_interface_scrollable_extern_pan_set(priv->pan_obj));
6171 edje_object_size_min_calc(wd->resize_obj, &minw, &minh);
6172 evas_object_size_hint_min_set(obj, minw, minh);
6174 _item_cache_all_free(priv);
6175 _mirrored_set(obj, elm_widget_mirrored_get(obj));
6177 const char *str = edje_object_data_get(wd->resize_obj,
6179 if ((str) && (!strcmp(str, "on")))
6180 elm_widget_highlight_in_theme_set(obj, EINA_TRUE);
6182 elm_widget_highlight_in_theme_set(obj, EINA_FALSE);
6183 priv->select_on_focus_enabled = EINA_FALSE;
6184 elm_widget_signal_callback_add(obj, "elm,action,focus_highlight,hide", "elm", _elm_genlist_focus_highlight_hide, obj);
6185 elm_widget_signal_callback_add(obj, "elm,action,focus_highlight,show", "elm", _elm_genlist_focus_highlight_show, obj);
6186 evas_event_callback_add(evas_object_evas_get(obj),
6187 EVAS_CALLBACK_CANVAS_VIEWPORT_RESIZE,
6188 _evas_viewport_resize_cb, priv);
6190 priv->g_layer = elm_gesture_layer_add(obj);
6191 if (!priv->g_layer) ERR("elm_gesture_layer_add() failed");
6192 elm_gesture_layer_attach(priv->g_layer, priv->hit_rect);
6193 elm_gesture_layer_cb_set
6194 (priv->g_layer, ELM_GESTURE_ZOOM, ELM_GESTURE_STATE_START,
6195 _pinch_zoom_start_cb, priv);
6196 elm_gesture_layer_cb_set
6197 (priv->g_layer, ELM_GESTURE_ZOOM, ELM_GESTURE_STATE_MOVE,
6198 _pinch_zoom_cb, priv);
6200 elm_gesture_layer_cb_set
6201 (priv->g_layer, ELM_GESTURE_N_LINES, ELM_GESTURE_STATE_START,
6202 _gesture_n_lines_start_cb, priv);
6203 elm_gesture_layer_cb_set
6204 (priv->g_layer, ELM_GESTURE_N_LINES, ELM_GESTURE_STATE_MOVE,
6205 _gesture_n_lines_cb, priv);
6207 elm_gesture_layer_cb_set
6208 (priv->g_layer, ELM_GESTURE_N_FLICKS, ELM_GESTURE_STATE_START,
6209 _gesture_n_lines_start_cb, priv);
6210 elm_gesture_layer_cb_set
6211 (priv->g_layer, ELM_GESTURE_N_FLICKS, ELM_GESTURE_STATE_MOVE,
6212 _gesture_n_flicks_cb, priv);
6214 elm_layout_sizing_eval(obj);
6216 // TIZEN_ONLY(20150705): Genlist item align feature
6217 wd->scroll_item_align_enable = _elm_config->scroll_item_align_enable;
6218 wd->scroll_item_valign = _elm_config->scroll_item_valign;
6220 eo_do(obj, elm_interface_scrollable_content_viewport_geometry_get
6221 (NULL, NULL, &priv->viewport_w, &priv->viewport_h));
6224 //TIZEN_ONLY(20160822): When atspi mode is dynamically switched on/off,
6225 //register/unregister access objects accordingly.
6226 // TIZEN_ONLY(20170516): connect to at-spi dbus based on org.a11y.Status.IsEnabled property
6228 _elm_genlist_elm_widget_screen_reader(Eo *obj EINA_UNUSED, Elm_Genlist_Data *sd, Eina_Bool is_screen_reader)
6231 Eina_Bool done = EINA_FALSE;
6232 Evas_Object *content = NULL;
6236 EINA_INLIST_FOREACH(sd->blocks, itb)
6241 EINA_LIST_FOREACH(itb->items, l, it)
6243 if (!it->realized || it->want_hidden) continue;
6244 if (is_screen_reader)
6246 elm_interface_atspi_accessible_added(EO_OBJ(it));
6247 elm_interface_atspi_accessible_children_changed_added_signal_emit(sd->obj, EO_OBJ(it));
6248 EINA_LIST_FOREACH(it->content_objs, ll, content)
6250 if (eo_isa(content, ELM_INTERFACE_ATSPI_ACCESSIBLE_MIXIN))
6252 eo_do(content, elm_interface_atspi_accessible_parent_set(EO_OBJ(it)));
6253 elm_interface_atspi_accessible_children_changed_added_signal_emit(EO_OBJ(it), content);
6256 elm_interface_atspi_accessible_name_changed_signal_emit(EO_OBJ(it));
6260 elm_interface_atspi_accessible_removed(EO_OBJ(it));
6261 elm_interface_atspi_accessible_children_changed_del_signal_emit(sd->obj, EO_OBJ(it));
6265 else if (done) break;
6268 //TIZEN_ONLY(20161213): apply screen_reader_changed callback
6269 evas_object_smart_callback_call(obj, SIG_ATSPI_SCREEN_READER_CHANGED, &is_screen_reader);
6275 EOLIAN const Elm_Atspi_Action *
6276 _elm_genlist_elm_interface_atspi_widget_action_elm_actions_get(Eo *obj EINA_UNUSED, Elm_Genlist_Data *pd EINA_UNUSED)
6278 /* Need to be implemented
6279 static Elm_Atspi_Action atspi_actions[] = {
6280 { "move,prior", "move", "prior", _key_action_move},
6281 { "move,next", "move", "next", _key_action_move},
6282 { "move,left", "move", "left", _key_action_move},
6283 { "move,right", "move", "right", _key_action_move},
6284 { "move,up", "move", "up", _key_action_move},
6285 { "move,up,multi", "move", "up_multi", _key_action_move},
6286 { "move,down", "move", "down", _key_action_move},
6287 { "move,down,multi", "move", "down_multi", _key_action_move},
6288 { "move,first", "move", "first", _key_action_move},
6289 { "move,last", "move", "last", _key_action_move},
6290 { "select", "select", NULL, _key_action_select},
6291 { "select,multi", "select", "multi", _key_action_select},
6292 { "escape", "escape", NULL, _key_action_escape},
6293 { NULL, NULL, NULL, NULL }
6295 return &atspi_actions[0];
6297 static Elm_Atspi_Action atspi_actions[] = {{NULL, NULL, NULL, NULL}};
6298 return &atspi_actions[0];
6302 elm_genlist_add(Evas_Object *parent)
6304 EINA_SAFETY_ON_NULL_RETURN_VAL(parent, NULL);
6305 Evas_Object *obj = eo_add(MY_CLASS, parent);
6310 _elm_genlist_eo_base_constructor(Eo *obj, Elm_Genlist_Data *sd)
6312 obj = eo_do_super_ret(obj, MY_CLASS, obj, eo_constructor());
6316 evas_obj_type_set(MY_CLASS_NAME_LEGACY),
6317 evas_obj_smart_callbacks_descriptions_set(_smart_callbacks),
6318 elm_interface_atspi_accessible_role_set(ELM_ATSPI_ROLE_LIST));
6323 EOLIAN static Evas_Object *
6324 _elm_genlist_item_elm_widget_item_part_content_get(Eo *eo_it EINA_UNUSED, Elm_Gen_Item *it, const char * part)
6326 Evas_Object *ret = NULL;
6327 if (it->deco_all_view)
6328 ret = edje_object_part_swallow_get(it->deco_all_view, part);
6329 else if (it->decorate_it_set)
6330 ret = edje_object_part_swallow_get(GL_IT(it)->deco_it_view, part);
6332 ret = edje_object_part_swallow_get(VIEW(it), part);
6336 EOLIAN static const char *
6337 _elm_genlist_item_elm_widget_item_part_text_get(Eo *eo_it EINA_UNUSED, Elm_Gen_Item *it, const char * part)
6339 if (!it->itc->func.text_get) return NULL;
6340 const char *ret = NULL;
6341 if (it->deco_all_view)
6342 ret = edje_object_part_text_get(it->deco_all_view, part);
6343 else if (it->decorate_it_set)
6344 ret = edje_object_part_text_get(GL_IT(it)->deco_it_view, part);
6346 ret = edje_object_part_text_get(VIEW(it), part);
6351 _elm_genlist_item_elm_widget_item_disable(Eo *eo_it, Elm_Gen_Item *it)
6358 if (it == GL_IT(it)->wsd->focused_item) elm_object_item_focus_set(EO_OBJ(it), EINA_FALSE);
6359 if (GL_IT(it)->highlight_timer)
6361 ecore_timer_del(GL_IT(it)->highlight_timer);
6362 GL_IT(it)->highlight_timer = NULL;
6366 ecore_timer_del(it->long_timer);
6367 it->long_timer = NULL;
6372 if (eo_do_ret(eo_it, ret, elm_wdg_item_disabled_get()))
6374 edje_object_signal_emit(VIEW(it), SIGNAL_DISABLED, "elm");
6375 if (it->deco_all_view)
6376 edje_object_signal_emit
6377 (it->deco_all_view, SIGNAL_DISABLED, "elm");
6381 edje_object_signal_emit(VIEW(it), SIGNAL_ENABLED, "elm");
6382 if (it->deco_all_view)
6383 edje_object_signal_emit
6384 (it->deco_all_view, SIGNAL_ENABLED, "elm");
6386 EINA_LIST_FOREACH(it->content_objs, l, obj)
6387 elm_widget_disabled_set(obj, eo_do_ret(eo_it, ret, elm_wdg_item_disabled_get()));
6392 _item_free(Elm_Gen_Item *it)
6395 Elm_Object_Item *eo_it2;
6396 Elm_Genlist_Data *sd = GL_IT(it)->wsd;
6397 sd->processed_sizes -= GL_IT(it)->minh;
6398 if (sd->processed_sizes < 0) sd->processed_sizes = 0;
6400 eo_do(EO_OBJ(it), elm_wdg_item_pre_notify_del());
6401 if (it->tooltip.del_cb)
6402 it->tooltip.del_cb((void *)it->tooltip.data, WIDGET(it), it);
6404 #ifdef GENLIST_FX_SUPPORT
6405 sd->del_fx.items = eina_list_remove(sd->del_fx.items, it);
6406 sd->del_fx.pending_items = eina_list_remove(sd->del_fx.pending_items, it);
6407 sd->add_fx.items = eina_list_remove(sd->add_fx.items, it);
6411 GL_IT(it)->rel->item->rel_revs =
6412 eina_list_remove(GL_IT(it)->rel->item->rel_revs, it);
6413 if (GL_IT(it)->rel_revs)
6416 EINA_LIST_FREE(GL_IT(it)->rel_revs, tmp)
6418 if (tmp->item->queued && !(tmp->base)->on_deletion)
6420 GL_IT(tmp)->queued = EINA_FALSE;
6421 GL_IT(tmp)->resized = EINA_FALSE;
6422 sd->queue = eina_list_remove(sd->queue, tmp);
6423 _item_process(sd, tmp);
6425 tmp->item->rel = NULL;
6428 EINA_LIST_FOREACH_SAFE(it->item->items, l, ll, eo_it2)
6430 //elm_widget_item_del(it2);
6431 ELM_GENLIST_ITEM_DATA_GET(eo_it2, it2);
6434 sd->reorder.move_items = eina_list_remove(sd->reorder.move_items, it);
6436 if (GL_IT(it)->block) _item_block_del(it);
6438 it->parent->item->items =
6439 eina_list_remove(it->parent->item->items, EO_OBJ(it));
6440 if (GL_IT(it)->queued)
6442 GL_IT(it)->queued = EINA_FALSE;
6443 sd->queue = eina_list_remove(sd->queue, it);
6445 if (sd->filter_queue && !it->filtered)
6447 l = eina_list_data_find_list(sd->filter_queue, it);
6448 if (l) sd->filter_queue = eina_list_remove_list(sd->filter_queue, l);
6450 if (GL_IT(it)->type == ELM_GENLIST_ITEM_GROUP)
6451 sd->group_items = eina_list_remove(sd->group_items, it);
6455 sd->selected = eina_list_remove(sd->selected, EO_OBJ(it));
6456 it->selected = EINA_FALSE;
6458 if (sd->show_item == it) sd->show_item = NULL;
6460 if ((sd->g_item) && (sd->g_item == it)) sd->g_item = NULL;
6461 if (sd->expanded_item == it) sd->expanded_item = NULL;
6462 if (sd->state) ELM_SAFE_FREE(sd->state, eina_inlist_sorted_state_free);
6464 if (sd->last_selected_item == EO_OBJ(it))
6465 sd->last_selected_item = NULL;
6467 if (sd->realization_mode)
6470 EINA_LIST_FOREACH(GL_IT(it)->flip_content_objs, l, c)
6472 evas_object_event_callback_del_full(c,
6473 EVAS_CALLBACK_CHANGED_SIZE_HINTS,
6474 _changed_size_hints, it);
6476 EINA_LIST_FOREACH(GL_IT(it)->deco_all_contents, l, c)
6478 evas_object_event_callback_del_full(c,
6479 EVAS_CALLBACK_CHANGED_SIZE_HINTS,
6480 _changed_size_hints, it);
6482 EINA_LIST_FOREACH(it->content_objs, l, c)
6484 evas_object_event_callback_del_full(c,
6485 EVAS_CALLBACK_CHANGED_SIZE_HINTS,
6486 _changed_size_hints, it);
6490 if (sd->mode_item) sd->mode_item = NULL;
6491 if (it->selected) _item_unselect(it);
6492 if (it == sd->focused_item)
6496 if (!elm_widget_focus_get(WIDGET(it))) goto failed;
6498 tmp = ELM_GEN_ITEM_FROM_INLIST(EINA_INLIST_GET(it)->next);
6499 find = _item_focusable_search(&tmp, 1);
6502 elm_object_item_focus_set(EO_OBJ(tmp), EINA_TRUE);
6507 tmp = ELM_GEN_ITEM_FROM_INLIST(EINA_INLIST_GET(it)->prev);
6508 find = _item_focusable_search(&tmp, -1);
6511 elm_object_item_focus_set(EO_OBJ(tmp), EINA_TRUE);
6516 elm_object_item_focus_set(EO_OBJ(it), EINA_FALSE);
6517 sd->focused_item = NULL;
6520 if (it == sd->key_down_item) sd->key_down_item = NULL;
6521 if (it == sd->highlighted_item) sd->highlighted_item = NULL;
6522 if (!TIZEN_PROFILE_WEARABLE)
6524 if (it == sd->top_drawn_item) sd->top_drawn_item = NULL;
6527 _item_unrealize(it, EINA_FALSE);
6529 if (sd->aligned_item == it) sd->aligned_item = NULL;
6531 sd->items = eina_inlist_remove(sd->items, EINA_INLIST_GET(it));
6534 if (it->item->proxy)
6536 evas_object_smart_member_del(it->item->proxy);
6537 evas_object_del(it->item->proxy);
6540 if (it->itc->func.del)
6541 it->itc->func.del((void *)WIDGET_ITEM_DATA_GET(EO_OBJ(it)), WIDGET(it));
6543 if (it->itc->refcount <= 1)
6547 EINA_INLIST_FOREACH_SAFE(sd->item_cache, l2, ic)
6549 if (it->itc == ic->item_class)
6550 _item_cache_free(sd, ic);
6554 elm_genlist_item_class_unref((Elm_Genlist_Item_Class *)it->itc);
6559 // TIZEN_ONLY(20150703) : banded color background feature. enabled only un-scrollable
6560 if (!TIZEN_PROFILE_WEARABLE)
6562 if (sd->banded_bg_rect && !sd->items)
6564 evas_object_smart_member_del(sd->banded_bg_rect);
6565 ELM_SAFE_FREE(sd->banded_bg_rect, evas_object_del);
6569 _changed(sd->pan_obj);
6572 EOLIAN static Eina_Bool
6573 _elm_genlist_item_elm_widget_item_del_pre(Eo *eo_it EINA_UNUSED,
6576 #ifdef GENLIST_FX_SUPPORT
6577 Elm_Genlist_Data *sd = it->item->wsd;
6578 Evas_Coord cvx, cvy, cvw, cvh;
6585 #ifdef GENLIST_FX_SUPPORT
6588 sd->add_fx.items = eina_list_remove(sd->add_fx.items, it);
6591 evas_output_viewport_get(evas_object_evas_get(sd->obj),
6592 &cvx, &cvy, &cvw, &cvh);
6593 if (!ELM_RECTS_INTERSECT(GL_IT(it)->scrl_x, GL_IT(it)->scrl_y,
6594 GL_IT(it)->w, GL_IT(it)->h,
6595 cvx, cvy, cvw, cvh))
6597 // Delete later, Above items in the viewport
6598 // Delete right now, below items in the viewport
6599 if (it->item->scrl_y < cvy)
6600 sd->del_fx.pending_items = eina_list_append(sd->del_fx.pending_items, it);
6604 _changed(sd->pan_obj);
6610 if (it->deco_all_view) evas_object_lower(it->deco_all_view);
6611 else if (it->item->deco_it_view) evas_object_lower(it->item->deco_it_view);
6612 else if (VIEW(it)) evas_object_lower(VIEW(it));
6614 if (it->item->expanded_depth > 0)
6617 Elm_Object_Item *itt;
6618 EINA_LIST_FOREACH(it->item->items, l, itt)
6620 eo_do(itt, elm_wdg_item_del());
6623 sd->del_fx.items = eina_list_append(sd->del_fx.items, it);
6625 if (!sd->del_fx.anim)
6627 sd->del_fx.cnt = ANIM_CNT_MAX;
6628 sd->del_fx.anim = ecore_animator_add(_del_fx_anim, sd);
6630 _changed(sd->pan_obj);
6636 _elm_genlist_item_elm_widget_item_signal_emit(Eo *eo_it EINA_UNUSED, Elm_Gen_Item *it, const char *emission, const char *source)
6640 WRN("item is not realized yet");
6643 edje_object_signal_emit
6644 (VIEW(it), emission, source);
6645 if (it->deco_all_view)
6646 edje_object_signal_emit
6647 (it->deco_all_view, emission, source);
6651 _elm_genlist_item_eo_base_constructor(Eo *eo_it, Elm_Gen_Item *it)
6653 eo_it = eo_do_super_ret(eo_it, ELM_GENLIST_ITEM_CLASS, eo_it, eo_constructor());
6655 it->base = eo_data_scope_get(eo_it, ELM_WIDGET_ITEM_CLASS);
6656 eo_do(eo_it, elm_interface_atspi_accessible_role_set(ELM_ATSPI_ROLE_LIST_ITEM));
6660 static Elm_Gen_Item *
6661 _elm_genlist_item_new(Elm_Genlist_Data *sd,
6662 const Elm_Genlist_Item_Class *itc,
6664 Elm_Object_Item *eo_parent,
6665 Elm_Genlist_Item_Type type,
6667 const void *func_data)
6672 if (!itc) return NULL;
6674 Eo *eo_it = eo_add(ELM_GENLIST_ITEM_CLASS, sd->obj);
6675 if (!eo_it) return NULL;
6676 ELM_GENLIST_ITEM_DATA_GET(eo_it, it);
6679 elm_genlist_item_class_ref((Elm_Genlist_Item_Class *)itc);
6681 ELM_GENLIST_ITEM_DATA_GET(eo_parent, parent);
6682 WIDGET_ITEM_DATA_SET(EO_OBJ(it), data);
6683 it->parent = parent;
6684 it->func.func = func;
6685 it->func.data = func_data;
6687 GL_IT(it) = ELM_NEW(Elm_Gen_Item_Type);
6688 GL_IT(it)->wsd = sd;
6689 GL_IT(it)->type = type;
6693 if (GL_IT(it->parent)->type == ELM_GENLIST_ITEM_GROUP)
6694 GL_IT(it)->group_item = parent;
6695 else if (GL_IT(it->parent)->group_item)
6696 GL_IT(it)->group_item = GL_IT(it->parent)->group_item;
6698 for (it2 = it, depth = 0; it2->parent; it2 = it2->parent)
6700 if (GL_IT(it2->parent)->type == ELM_GENLIST_ITEM_TREE) depth += 1;
6702 GL_IT(it)->expanded_depth = depth;
6709 _elm_genlist_item_compare(const void *data,
6712 const Elm_Gen_Item *it, *item1;
6714 it = ELM_GEN_ITEM_FROM_INLIST(data);
6715 item1 = ELM_GEN_ITEM_FROM_INLIST(data1);
6716 return GL_IT(it)->wsd->item_compare_cb(EO_OBJ(it), EO_OBJ(item1));
6720 _elm_genlist_item_list_compare(const void *data,
6723 const Elm_Gen_Item *it = data;
6724 const Elm_Gen_Item *item1 = data1;
6726 return GL_IT(it)->wsd->item_compare_cb(EO_OBJ(it), EO_OBJ(item1));
6729 EOLIAN static unsigned int
6730 _elm_genlist_items_count(const Eo *obj EINA_UNUSED, Elm_Genlist_Data *sd)
6732 return sd->item_count;
6736 _list_last_recursive(Eina_List *list)
6738 Eina_List *ll, *ll2;
6739 Elm_Object_Item *eo_it2;
6741 ll = eina_list_last(list);
6742 if (!ll) return NULL;
6745 ELM_GENLIST_ITEM_DATA_GET(eo_it2, it2);
6747 if (it2->item->items)
6749 ll2 = _list_last_recursive(it2->item->items);
6759 EOLIAN static Elm_Object_Item*
6760 _elm_genlist_item_append(Eo *obj EINA_UNUSED, Elm_Genlist_Data *sd, const Elm_Genlist_Item_Class *itc, const void *data, Elm_Object_Item *eo_parent, Elm_Genlist_Item_Type type, Evas_Smart_Cb func, const void *func_data)
6764 EINA_SAFETY_ON_NULL_RETURN_VAL(itc, NULL);
6768 ELM_GENLIST_ITEM_DATA_GET(eo_parent, parent);
6769 ELM_GENLIST_ITEM_CHECK_OR_RETURN(parent, NULL);
6770 EINA_SAFETY_ON_FALSE_RETURN_VAL(obj == WIDGET(parent), NULL);
6773 it = _elm_genlist_item_new
6774 (sd, itc, data, eo_parent, type, func, func_data);
6775 if (!it) return NULL;
6779 if (GL_IT(it)->type == ELM_GENLIST_ITEM_GROUP)
6780 sd->group_items = eina_list_append(sd->group_items, it);
6781 sd->items = eina_inlist_append(sd->items, EINA_INLIST_GET(it));
6782 GL_IT(it)->rel = NULL;
6786 Elm_Object_Item *eo_it2 = NULL;
6787 Eina_List *ll = _list_last_recursive(it->parent->item->items);
6789 if (ll) eo_it2 = ll->data;
6790 it->parent->item->items =
6791 eina_list_append(it->parent->item->items, EO_OBJ(it));
6792 if (!eo_it2) eo_it2 = EO_OBJ(it->parent);
6793 ELM_GENLIST_ITEM_DATA_GET(eo_it2, it2);
6794 sd->items = eina_inlist_append_relative
6795 (sd->items, EINA_INLIST_GET(it), EINA_INLIST_GET(it2));
6796 GL_IT(it)->rel = it2;
6797 it2->item->rel_revs = eina_list_append(it2->item->rel_revs, it);
6799 GL_IT(it)->before = EINA_FALSE;
6800 _item_queue_direct(it, NULL);
6804 EOLIAN static Elm_Object_Item*
6805 _elm_genlist_item_prepend(Eo *obj EINA_UNUSED, Elm_Genlist_Data *sd, const Elm_Genlist_Item_Class *itc, const void *data, Elm_Object_Item *eo_parent, Elm_Genlist_Item_Type type, Evas_Smart_Cb func, const void *func_data)
6807 Elm_Gen_Item *it = NULL;
6809 EINA_SAFETY_ON_NULL_RETURN_VAL(itc, NULL);
6812 ELM_GENLIST_ITEM_DATA_GET(eo_parent, parent);
6813 ELM_GENLIST_ITEM_CHECK_OR_RETURN(parent, NULL);
6814 EINA_SAFETY_ON_FALSE_RETURN_VAL(obj == WIDGET(parent), NULL);
6815 /* first sub-item should allways be appended */
6816 if (!parent->item->items)
6817 return _elm_genlist_item_append(obj, sd, itc, data, eo_parent, type, func, func_data);
6819 it = _elm_genlist_item_new
6820 (sd, itc, data, eo_parent, type, func, func_data);
6822 if (!it) return NULL;
6824 if (sd->items) GL_IT(it)->is_prepend = EINA_TRUE;
6827 if (GL_IT(it)->type == ELM_GENLIST_ITEM_GROUP)
6828 sd->group_items = eina_list_prepend(sd->group_items, it);
6829 sd->items = eina_inlist_prepend(sd->items, EINA_INLIST_GET(it));
6830 GL_IT(it)->rel = NULL;
6834 Elm_Object_Item *eo_it2 = NULL;
6835 Eina_List *ll = it->parent->item->items;
6837 if (ll) eo_it2 = ll->data;
6838 it->parent->item->items =
6839 eina_list_prepend(it->parent->item->items, EO_OBJ(it));
6840 if (!eo_it2) eo_it2 = EO_OBJ(it->parent);
6841 ELM_GENLIST_ITEM_DATA_GET(eo_it2, it2);
6844 sd->items = eina_inlist_prepend_relative
6845 (sd->items, EINA_INLIST_GET(it), EINA_INLIST_GET(it2));
6846 GL_IT(it)->rel = it2;
6847 it2->item->rel_revs = eina_list_append(it2->item->rel_revs, it);
6850 GL_IT(it)->before = EINA_TRUE;
6851 _item_queue_direct(it, NULL);
6855 EOLIAN static Elm_Object_Item*
6856 _elm_genlist_item_insert_after(Eo *obj EINA_UNUSED, Elm_Genlist_Data *sd, const Elm_Genlist_Item_Class *itc, const void *data, Elm_Object_Item *eo_parent, Elm_Object_Item *eo_after, Elm_Genlist_Item_Type type, Evas_Smart_Cb func, const void *func_data)
6858 EINA_SAFETY_ON_NULL_RETURN_VAL(eo_after, NULL);
6859 ELM_GENLIST_ITEM_DATA_GET(eo_after, after_it);
6862 ELM_GENLIST_ITEM_CHECK_OR_RETURN(after_it, NULL);
6863 EINA_SAFETY_ON_FALSE_RETURN_VAL(obj == WIDGET(after_it), NULL);
6866 ELM_GENLIST_ITEM_DATA_GET(eo_parent, parent);
6867 ELM_GENLIST_ITEM_CHECK_OR_RETURN(parent, NULL);
6868 EINA_SAFETY_ON_FALSE_RETURN_VAL(obj == WIDGET(parent), NULL);
6871 /* It makes no sense to insert after in an empty list with after !=
6872 * NULL, something really bad is happening in your app. */
6873 EINA_SAFETY_ON_NULL_RETURN_VAL(sd->items, NULL);
6875 it = _elm_genlist_item_new
6876 (sd, itc, data, eo_parent, type, func, func_data);
6877 if (!it) return NULL;
6881 if ((GL_IT(it)->type == ELM_GENLIST_ITEM_GROUP) &&
6882 (GL_IT(after_it)->type == ELM_GENLIST_ITEM_GROUP))
6883 sd->group_items = eina_list_append_relative
6884 (sd->group_items, it, after_it);
6888 it->parent->item->items =
6889 eina_list_append_relative(it->parent->item->items, EO_OBJ(it), eo_after);
6891 sd->items = eina_inlist_append_relative
6892 (sd->items, EINA_INLIST_GET(it), EINA_INLIST_GET(after_it));
6894 GL_IT(it)->rel = after_it;
6895 after_it->item->rel_revs = eina_list_append(after_it->item->rel_revs, it);
6896 GL_IT(it)->before = EINA_FALSE;
6897 _item_queue_direct(it, NULL);
6899 if (elm_genlist_item_next_get(eo_after) == EO_OBJ(sd->aligned_item))
6900 sd->aligned_item = NULL;
6904 EOLIAN static Elm_Object_Item*
6905 _elm_genlist_item_insert_before(Eo *obj, Elm_Genlist_Data *sd, const Elm_Genlist_Item_Class *itc, const void *data, Elm_Object_Item *eo_parent, Elm_Object_Item *eo_before, Elm_Genlist_Item_Type type, Evas_Smart_Cb func, const void *func_data)
6907 EINA_SAFETY_ON_NULL_RETURN_VAL(eo_before, NULL);
6908 ELM_GENLIST_ITEM_DATA_GET(eo_before, before_it);
6911 ELM_GENLIST_ITEM_CHECK_OR_RETURN(before_it, NULL);
6912 EINA_SAFETY_ON_FALSE_RETURN_VAL(obj == WIDGET(before_it), NULL);
6915 ELM_GENLIST_ITEM_DATA_GET(eo_parent, parent);
6916 ELM_GENLIST_ITEM_CHECK_OR_RETURN(parent, NULL);
6917 EINA_SAFETY_ON_FALSE_RETURN_VAL(obj == WIDGET(parent), NULL);
6920 /* It makes no sense to insert before in an empty list with before
6921 * != NULL, something really bad is happening in your app. */
6922 EINA_SAFETY_ON_NULL_RETURN_VAL(sd->items, NULL);
6924 it = _elm_genlist_item_new
6925 (sd, itc, data, eo_parent, type, func, func_data);
6926 if (!it) return NULL;
6930 if ((GL_IT(it)->type == ELM_GENLIST_ITEM_GROUP) &&
6931 (GL_IT(before_it)->type == ELM_GENLIST_ITEM_GROUP))
6933 eina_list_prepend_relative(sd->group_items, it, before_it);
6937 it->parent->item->items =
6938 eina_list_prepend_relative(it->parent->item->items, EO_OBJ(it), eo_before);
6940 sd->items = eina_inlist_prepend_relative
6941 (sd->items, EINA_INLIST_GET(it), EINA_INLIST_GET(before_it));
6943 GL_IT(it)->rel = before_it;
6944 before_it->item->rel_revs = eina_list_append(before_it->item->rel_revs, it);
6945 GL_IT(it)->before = EINA_TRUE;
6946 _item_queue_direct(it, NULL);
6948 if (before_it == sd->aligned_item)
6949 sd->aligned_item = NULL;
6954 EOLIAN static Elm_Object_Item*
6955 _elm_genlist_item_sorted_insert(Eo *obj, Elm_Genlist_Data *sd, const Elm_Genlist_Item_Class *itc, const void *data, Elm_Object_Item *eo_parent, Elm_Genlist_Item_Type type, Eina_Compare_Cb comp, Evas_Smart_Cb func, const void *func_data)
6957 Elm_Gen_Item *rel = NULL;
6959 Elm_Object_Item *eo_it;
6963 ELM_GENLIST_ITEM_DATA_GET(eo_parent, parent);
6964 ELM_GENLIST_ITEM_CHECK_OR_RETURN(parent, NULL);
6965 EINA_SAFETY_ON_FALSE_RETURN_VAL(obj == WIDGET(parent), NULL);
6968 it = _elm_genlist_item_new
6969 (sd, itc, data, eo_parent, type, func, func_data);
6970 if (!it) return NULL;
6973 sd->item_compare_cb = comp;
6977 Elm_Object_Item *eo_rel = NULL;
6981 l = eina_list_search_sorted_near_list
6982 (it->parent->item->items, _elm_genlist_item_list_compare, eo_it,
6987 eo_rel = eina_list_data_get(l);
6988 rel = eo_data_scope_get(eo_rel, ELM_GENLIST_ITEM_CLASS);
6990 if (cmp_result >= 0)
6992 it->parent->item->items = eina_list_prepend_relative_list
6993 (it->parent->item->items, eo_it, l);
6994 sd->items = eina_inlist_prepend_relative
6995 (sd->items, EINA_INLIST_GET(it), EINA_INLIST_GET(rel));
6996 it->item->before = EINA_TRUE;
6998 else if (cmp_result < 0)
7000 it->parent->item->items = eina_list_append_relative_list
7001 (it->parent->item->items, eo_it, l);
7002 sd->items = eina_inlist_append_relative
7003 (sd->items, EINA_INLIST_GET(it), EINA_INLIST_GET(rel));
7004 it->item->before = EINA_FALSE;
7005 it->item->is_prepend = EINA_TRUE;
7012 // ignoring the comparison
7013 it->parent->item->items = eina_list_prepend_relative_list
7014 (it->parent->item->items, eo_it, l);
7015 sd->items = eina_inlist_prepend_relative
7016 (sd->items, EINA_INLIST_GET(it), EINA_INLIST_GET(rel));
7017 it->item->before = EINA_FALSE;
7024 sd->state = eina_inlist_sorted_state_new();
7025 eina_inlist_sorted_state_init(sd->state, sd->items);
7026 sd->requeued = EINA_FALSE;
7029 if (GL_IT(it)->type == ELM_GENLIST_ITEM_GROUP)
7030 sd->group_items = eina_list_append(sd->group_items, it);
7032 sd->items = eina_inlist_sorted_state_insert
7033 (sd->items, EINA_INLIST_GET(it), _elm_genlist_item_compare,
7036 if (EINA_INLIST_GET(it)->next)
7038 rel = ELM_GEN_ITEM_FROM_INLIST(EINA_INLIST_GET(it)->next);
7039 GL_IT(it)->before = EINA_TRUE;
7040 GL_IT(it)->is_prepend = EINA_TRUE;
7042 else if (EINA_INLIST_GET(it)->prev)
7044 rel = ELM_GEN_ITEM_FROM_INLIST(EINA_INLIST_GET(it)->prev);
7045 GL_IT(it)->before = EINA_FALSE;
7051 GL_IT(it)->rel = rel;
7052 rel->item->rel_revs = eina_list_append(rel->item->rel_revs, it);
7055 _item_queue_direct(it, _elm_genlist_item_list_compare);
7060 _elm_genlist_clear(Eo *obj, Elm_Genlist_Data *sd)
7064 eina_hash_free_buckets(sd->size_caches);
7065 elm_object_item_focus_set(EO_OBJ(sd->focused_item), EINA_FALSE);
7066 if (sd->key_down_item) sd->key_down_item = NULL;
7067 if (sd->mode_item) sd->mode_item = NULL;
7071 eina_inlist_sorted_state_free(sd->state);
7075 sd->filter_data = NULL;
7076 if (sd->filter_queue)
7077 ELM_SAFE_FREE(sd->queue_filter_enterer, ecore_idle_enterer_del);
7078 ELM_SAFE_FREE(sd->filter_queue, eina_list_free);
7079 ELM_SAFE_FREE(sd->filtered_list, eina_list_free);
7081 // Do not use EINA_INLIST_FOREACH or EINA_INLIST_FOREACH_SAFE
7082 // because sd->items can be modified inside elm_widget_item_del()
7085 it = EINA_INLIST_CONTAINER_GET(sd->items->last, Elm_Gen_Item);
7086 //elm_widget_item_del(it);
7089 sd->reorder.it = NULL;
7090 sd->reorder.dir = 0;
7091 eina_list_free(sd->reorder.move_items);
7095 _item_cache_all_free(sd);
7099 sd->selected = eina_list_free(sd->selected);
7100 sd->selected = NULL;
7103 sd->show_item = NULL;
7112 evas_object_size_hint_min_set(sd->pan_obj, sd->minw, sd->minh);
7113 evas_object_smart_callback_call(sd->pan_obj, "changed", NULL);
7115 elm_layout_sizing_eval(obj);
7117 eo_do(sd->obj, elm_interface_scrollable_content_region_show(0, 0, 0, 0));
7121 ecore_job_del(sd->dummy_job);
7122 sd->dummy_job = NULL;
7124 if (sd->queue_idle_enterer)
7126 ecore_idle_enterer_del(sd->queue_idle_enterer);
7127 sd->queue_idle_enterer = NULL;
7129 if (sd->scr_hold_timer)
7131 ecore_timer_del(sd->scr_hold_timer);
7132 sd->scr_hold_timer = NULL;
7134 if (sd->reorder.anim)
7136 ecore_animator_del(sd->reorder.anim);
7137 sd->reorder.anim = NULL;
7141 ecore_timer_del(sd->scr_timer);
7142 sd->scr_timer = NULL;
7144 #ifdef GENLIST_FX_SUPPORT
7145 if (sd->del_fx.anim)
7147 ecore_animator_del(sd->del_fx.anim);
7148 sd->del_fx.anim = NULL;
7150 if (sd->add_fx.anim)
7152 ecore_animator_del(sd->add_fx.anim);
7153 sd->add_fx.anim = NULL;
7157 if (sd->queue) sd->queue = eina_list_free(sd->queue);
7158 if (sd->g_item) sd->g_item = NULL;
7159 if (sd->g_type) sd->g_type = NULL;
7161 if (!TIZEN_PROFILE_WEARABLE)
7163 if (sd->banded_bg_rect)
7165 evas_object_smart_member_del(sd->banded_bg_rect);
7166 ELM_SAFE_FREE(sd->banded_bg_rect, evas_object_del);
7172 _elm_genlist_multi_select_set(Eo *obj EINA_UNUSED, Elm_Genlist_Data *sd, Eina_Bool multi)
7174 sd->multi = !!multi;
7175 if (!sd->multi && sd->selected)
7178 Elm_Object_Item *eo_it;
7179 Elm_Object_Item *last = sd->selected->data;
7180 EINA_LIST_FOREACH_SAFE(sd->selected, l, ll, eo_it)
7183 ELM_GENLIST_ITEM_DATA_GET(eo_it, it);
7189 EOLIAN static Eina_Bool
7190 _elm_genlist_multi_select_get(Eo *obj EINA_UNUSED, Elm_Genlist_Data *sd)
7196 _elm_genlist_multi_select_mode_set(Eo *obj EINA_UNUSED, Elm_Genlist_Data *sd EINA_UNUSED, Elm_Object_Multi_Select_Mode mode EINA_UNUSED)
7198 /* Need to be implemented
7199 if (mode >= ELM_OBJECT_MULTI_SELECT_MODE_MAX)
7202 if (sd->multi_select_mode != mode)
7203 sd->multi_select_mode = mode;
7208 EOLIAN static Elm_Object_Multi_Select_Mode
7209 _elm_genlist_multi_select_mode_get(Eo *obj EINA_UNUSED, Elm_Genlist_Data *sd EINA_UNUSED)
7211 // Need to be implemented
7212 //return sd->multi_select_mode;
7213 return ELM_OBJECT_MULTI_SELECT_MODE_DEFAULT;
7216 EOLIAN static Elm_Object_Item*
7217 _elm_genlist_selected_item_get(Eo *obj EINA_UNUSED, Elm_Genlist_Data *sd)
7220 return sd->selected->data;
7225 EOLIAN static const Eina_List*
7226 _elm_genlist_selected_items_get(Eo *obj EINA_UNUSED, Elm_Genlist_Data *sd)
7228 return sd->selected;
7231 EOLIAN static Eina_List*
7232 _elm_genlist_realized_items_get(Eo *obj EINA_UNUSED, Elm_Genlist_Data *sd)
7235 Eina_List *list = NULL;
7236 Eina_Bool done = EINA_FALSE;
7238 EINA_INLIST_FOREACH(sd->blocks, itb)
7246 EINA_LIST_FOREACH(itb->items, l, it)
7248 if (it->realized) list = eina_list_append(list, EO_OBJ(it));
7259 EOLIAN static Elm_Object_Item *
7260 _elm_genlist_search_by_text_item_get(Eo *obj EINA_UNUSED,
7261 Elm_Genlist_Data *sd,
7262 Elm_Object_Item *item_to_search_from,
7263 const char *part_name,
7264 const char *pattern,
7265 Elm_Glob_Match_Flags flags)
7267 Elm_Gen_Item *it = NULL;
7269 Eina_Inlist *start = NULL;
7272 if (!pattern) return NULL;
7273 if (!sd->items) return NULL;
7275 if (flags & ELM_GLOB_MATCH_NO_ESCAPE) fnflags |= FNM_NOESCAPE;
7276 if (flags & ELM_GLOB_MATCH_PATH) fnflags |= FNM_PATHNAME;
7277 if (flags & ELM_GLOB_MATCH_PERIOD) fnflags |= FNM_PERIOD;
7279 if (flags & ELM_GLOB_MATCH_NOCASE) fnflags |= FNM_CASEFOLD;
7282 start = (item_to_search_from) ?
7283 EINA_INLIST_GET((Elm_Gen_Item *)eo_data_scope_get(item_to_search_from, ELM_GENLIST_ITEM_CLASS)) :
7285 EINA_INLIST_FOREACH(start, it)
7287 if (!it->itc->func.text_get) continue;
7288 str = it->itc->func.text_get((void *)WIDGET_ITEM_DATA_GET(EO_OBJ(it)), WIDGET(it), part_name);
7290 if (!fnmatch(pattern, str, fnflags))
7300 EOLIAN static Elm_Object_Item*
7301 _elm_genlist_at_xy_item_get(const Eo *obj EINA_UNUSED, Elm_Genlist_Data *sd, Evas_Coord x, Evas_Coord y, int *posret)
7303 Evas_Coord ox, oy, ow, oh;
7307 evas_object_geometry_get(sd->pan_obj, &ox, &oy, &ow, &oh);
7309 EINA_INLIST_FOREACH(sd->blocks, itb)
7313 if (!ELM_RECTS_INTERSECT(ox + itb->x - itb->sd->pan_x,
7314 oy + itb->y - itb->sd->pan_y,
7315 sd->minw, itb->minh, x, y, 1, 1))
7317 EINA_LIST_FOREACH(itb->items, l, it)
7319 Evas_Coord itx, ity;
7321 itx = ox + itb->x + it->x - itb->sd->pan_x;
7322 ity = oy + itb->y + it->y - itb->sd->pan_y;
7323 if (ELM_RECTS_INTERSECT
7324 (itx, ity, GL_IT(it)->w, GL_IT(it)->h, x, y, 1, 1))
7328 if (y <= (ity + (GL_IT(it)->h / 4))) *posret = -1;
7329 else if (y >= (ity + GL_IT(it)->h - (GL_IT(it)->h / 4)))
7336 lasty = ity + GL_IT(it)->h;
7341 if (y > lasty) *posret = 1;
7348 EOLIAN static Elm_Object_Item*
7349 _elm_genlist_first_item_get(Eo *obj EINA_UNUSED, Elm_Genlist_Data *sd)
7351 Elm_Gen_Item *tit, *it = NULL;
7353 EINA_INLIST_REVERSE_FOREACH(sd->items, tit) it = tit;
7358 EOLIAN static Elm_Object_Item*
7359 _elm_genlist_last_item_get(Eo *obj EINA_UNUSED, Elm_Genlist_Data *sd)
7363 if (!sd->items) return NULL;
7365 it = ELM_GEN_ITEM_FROM_INLIST(sd->items->last);
7369 EOLIAN static Elm_Object_Item *
7370 _elm_genlist_item_next_get(Eo *eo_it EINA_UNUSED, Elm_Gen_Item *it)
7374 it = ELM_GEN_ITEM_FROM_INLIST(EINA_INLIST_GET(it)->next);
7378 if (it) return EO_OBJ(it);
7382 EOLIAN static Elm_Object_Item *
7383 _elm_genlist_item_prev_get(Eo *eo_it EINA_UNUSED, Elm_Gen_Item *it)
7387 it = ELM_GEN_ITEM_FROM_INLIST(EINA_INLIST_GET(it)->prev);
7391 if (it) return EO_OBJ(it);
7395 EOLIAN static Elm_Object_Item *
7396 _elm_genlist_item_parent_get(Eo *eo_it EINA_UNUSED, Elm_Gen_Item *it)
7398 ELM_GENLIST_ITEM_CHECK_OR_RETURN(it, NULL);
7400 return EO_OBJ(it->parent);
7403 EOLIAN static unsigned int
7404 _elm_genlist_item_subitems_count(Eo *eo_item EINA_UNUSED, Elm_Gen_Item *item)
7406 ELM_GENLIST_ITEM_CHECK_OR_RETURN(item, 0);
7408 return eina_list_count(item->item->items);
7411 EOLIAN static const Eina_List *
7412 _elm_genlist_item_subitems_get(Eo *eo_item EINA_UNUSED, Elm_Gen_Item *item)
7414 ELM_GENLIST_ITEM_CHECK_OR_RETURN(item, NULL);
7416 return item->item->items;
7420 _elm_genlist_item_subitems_clear(Eo *eo_item EINA_UNUSED, Elm_Gen_Item *it)
7422 ELM_GENLIST_ITEM_CHECK_OR_RETURN(it);
7424 Elm_Object_Item *eo_it2;
7426 EINA_LIST_FOREACH_SAFE(GL_IT(it)->items, l, ll, eo_it2)
7427 eo_do(eo_it2, elm_wdg_item_del());
7431 _elm_genlist_item_selected_set(Eo *eo_item EINA_UNUSED, Elm_Gen_Item *it,
7434 ELM_GENLIST_ITEM_CHECK_OR_RETURN(it);
7437 if (eo_do_ret(EO_OBJ(it), ret, elm_wdg_item_disabled_get())) return;
7438 // FIXME: This API has highlight/unhighlith feature also..
7440 if (selected) _item_highlight(it);
7441 else _item_unhighlight(it, EINA_TRUE);
7443 selected = !!selected;
7444 if (it->selected == selected) return;
7446 if (selected) _item_select(it);
7447 else _item_unselect(it);
7450 EOLIAN static Eina_Bool
7451 _elm_genlist_item_selected_get(Eo *eo_item EINA_UNUSED, Elm_Gen_Item *it)
7453 ELM_GENLIST_ITEM_CHECK_OR_RETURN(it, EINA_FALSE);
7455 return it->selected;
7459 _elm_genlist_item_expanded_set(Eo *eo_item EINA_UNUSED, Elm_Gen_Item *it, Eina_Bool expanded)
7461 ELM_GENLIST_ITEM_CHECK_OR_RETURN(it);
7463 expanded = !!expanded;
7464 if (GL_IT(it)->expanded == expanded) return;
7465 if (GL_IT(it)->type != ELM_GENLIST_ITEM_TREE) return;
7466 GL_IT(it)->expanded = expanded;
7467 GL_IT(it)->wsd->expanded_item = it;
7469 if (GL_IT(it)->expanded)
7472 edje_object_signal_emit(VIEW(it), SIGNAL_EXPANDED, "elm");
7473 evas_object_smart_callback_call(WIDGET(it), SIG_EXPANDED, EO_OBJ(it));
7474 if (_elm_atspi_enabled())
7475 elm_interface_atspi_accessible_active_descendant_changed_signal_emit(WIDGET(it), eo_item);
7480 edje_object_signal_emit(VIEW(it), SIGNAL_CONTRACTED, "elm");
7481 evas_object_smart_callback_call(WIDGET(it), SIG_CONTRACTED, EO_OBJ(it));
7482 if (_elm_atspi_enabled())
7483 elm_interface_atspi_accessible_active_descendant_changed_signal_emit(WIDGET(it), eo_item);
7487 EOLIAN static Eina_Bool
7488 _elm_genlist_item_expanded_get(Eo *eo_item EINA_UNUSED, Elm_Gen_Item *it)
7490 ELM_GENLIST_ITEM_CHECK_OR_RETURN(it, EINA_FALSE);
7492 return GL_IT(it)->expanded;
7496 _elm_genlist_item_expanded_depth_get(Eo *eo_item EINA_UNUSED, Elm_Gen_Item *it)
7498 ELM_GENLIST_ITEM_CHECK_OR_RETURN(it, 0);
7500 return GL_IT(it)->expanded_depth;
7504 _elm_genlist_item_promote(Eo *eo_it EINA_UNUSED, Elm_Gen_Item *it)
7506 ELM_GENLIST_ITEM_CHECK_OR_RETURN(it);
7508 Elm_Object_Item *eo_first_item = elm_genlist_first_item_get(WIDGET(it));
7509 ELM_GENLIST_ITEM_DATA_GET(eo_first_item, first_item);
7510 _item_move_before(it, first_item);
7514 _elm_genlist_item_demote(Eo *eo_it EINA_UNUSED, Elm_Gen_Item *it)
7516 ELM_GENLIST_ITEM_CHECK_OR_RETURN(it);
7517 Elm_Object_Item *eo_last_item = elm_genlist_last_item_get(WIDGET(it));
7518 ELM_GENLIST_ITEM_DATA_GET(eo_last_item, last_item);
7519 _item_move_after(it, last_item);
7523 _elm_genlist_item_show(Eo *eo_item EINA_UNUSED, Elm_Gen_Item *it, Elm_Genlist_Item_Scrollto_Type type)
7525 ELM_GENLIST_ITEM_CHECK_OR_RETURN(it);
7527 if (it->want_hidden)
7529 WRN("Filter hided item cannot move to show");
7533 Elm_Genlist_Data *sd = GL_IT(it)->wsd;
7535 sd->bring_in = EINA_FALSE;
7536 sd->scroll_to_type = type;
7537 _changed(sd->pan_obj);
7541 _elm_genlist_item_bring_in(Eo *eo_item EINA_UNUSED, Elm_Gen_Item *it, Elm_Genlist_Item_Scrollto_Type type)
7543 ELM_GENLIST_ITEM_CHECK_OR_RETURN(it);
7545 if (it->want_hidden)
7547 WRN("Filter hided item cannot move to bring in");
7551 Elm_Genlist_Data *sd = GL_IT(it)->wsd;
7552 ELM_WIDGET_DATA_GET_OR_RETURN(WIDGET(it), wd);
7553 sd->bring_in = EINA_TRUE;
7554 sd->scroll_to_type = type;
7556 if (wd->scroll_item_align_enable)
7558 it = _adjust_item_align(it);
7559 sd->adjusted_item = sd->show_item = it;
7561 if (sd->aligned_item && sd->show_item != sd->aligned_item)
7562 edje_object_signal_emit(VIEW(sd->aligned_item), SIGNAL_ITEM_UNHIGHLIGHTED, "elm");
7567 _changed(sd->pan_obj);
7571 _elm_genlist_item_all_contents_unset(Eo *eo_item EINA_UNUSED, Elm_Gen_Item *it, Eina_List **l)
7573 Evas_Object *content;
7575 ELM_GENLIST_ITEM_CHECK_OR_RETURN(it);
7577 EINA_LIST_FREE (it->content_objs, content)
7579 evas_object_smart_member_del(content);
7580 // edje can be reused by item caching,
7581 // content should be un-swallowed from edje
7582 edje_object_part_unswallow(VIEW(it), content);
7583 evas_object_hide(content);
7584 if (l) *l = eina_list_append(*l, content);
7589 _elm_genlist_item_update(Eo *eo_item EINA_UNUSED, Elm_Gen_Item *it)
7591 ELM_GENLIST_ITEM_CHECK_OR_RETURN(it);
7593 if (!GL_IT(it)->block) return;
7595 GL_IT(it)->updateme = EINA_TRUE;
7596 GL_IT(it)->block->calc_done = EINA_FALSE;
7597 GL_IT(it)->wsd->calc_done = EINA_FALSE;
7598 _changed(GL_IT(it)->wsd->pan_obj);
7602 _elm_genlist_item_fields_update(Eo *eo_item EINA_UNUSED, Elm_Gen_Item *it,
7604 Elm_Genlist_Item_Field_Type itf)
7606 ELM_GENLIST_ITEM_CHECK_OR_RETURN(it);
7608 if (!GL_IT(it)->block) return;
7610 if ((!itf) || (itf & ELM_GENLIST_ITEM_FIELD_TEXT))
7612 _item_text_realize(it, VIEW(it), parts);
7614 if ((!itf) || (itf & ELM_GENLIST_ITEM_FIELD_CONTENT))
7616 _item_content_realize(it, VIEW(it), &it->content_objs, "contents", parts);
7619 _item_content_realize(it, VIEW(it), &GL_IT(it)->flip_content_objs,
7622 if (GL_IT(it)->deco_it_view)
7624 _item_content_realize(it, GL_IT(it)->deco_it_view,
7625 &GL_IT(it)->deco_it_contents,
7628 if (GL_IT(it)->wsd->decorate_all_mode)
7630 _item_content_realize(it, it->deco_all_view,
7631 &GL_IT(it)->deco_all_contents,
7636 if ((!itf) || (itf & ELM_GENLIST_ITEM_FIELD_STATE))
7637 _item_state_realize(it, VIEW(it), parts);
7639 GL_IT(it)->calc_done = EINA_FALSE;
7640 GL_IT(it)->block->calc_done = EINA_FALSE;
7641 GL_IT(it)->wsd->calc_done = EINA_FALSE;
7642 _changed(GL_IT(it)->wsd->pan_obj);
7646 _elm_genlist_item_item_class_update(Eo *eo_it EINA_UNUSED, Elm_Gen_Item *it,
7647 const Elm_Genlist_Item_Class *itc)
7649 ELM_GENLIST_ITEM_CHECK_OR_RETURN(it);
7650 EINA_SAFETY_ON_NULL_RETURN(itc);
7651 Elm_Genlist_Data *sd = GL_IT(it)->wsd;
7654 if (!GL_IT(it)->block) return;
7656 // FIXME(160711): orignal edje object updated by _view_theme_update
7657 // cannot recieve signal emit properly. This edje bug must be fixed.
7658 _item_cache_all_free(sd);
7660 sd->no_cache = EINA_TRUE;
7661 _item_unrealize(it, EINA_FALSE);
7662 sd->no_cache = EINA_FALSE;
7663 _item_realize(it, EINA_FALSE);
7665 if (sd->aligned_item == it)
7666 edje_object_signal_emit(VIEW(it), SIGNAL_ITEM_HIGHLIGHTED, "elm");
7668 GL_IT(it)->calc_done = EINA_FALSE;
7669 GL_IT(it)->block->calc_done = EINA_FALSE;
7670 sd->calc_done = EINA_FALSE;
7672 _changed(sd->pan_obj);
7675 EOLIAN static const Elm_Genlist_Item_Class *
7676 _elm_genlist_item_item_class_get(Eo *eo_item EINA_UNUSED, Elm_Gen_Item *it)
7678 ELM_GENLIST_ITEM_CHECK_OR_RETURN(it, NULL);
7682 static Evas_Object *
7683 _elm_genlist_item_label_create(void *data,
7684 Evas_Object *obj EINA_UNUSED,
7685 Evas_Object *tooltip,
7686 void *it EINA_UNUSED)
7688 Evas_Object *label = elm_label_add(tooltip);
7693 elm_object_style_set(label, "tooltip");
7694 elm_object_text_set(label, data);
7700 _elm_genlist_item_label_del_cb(void *data,
7701 Evas_Object *obj EINA_UNUSED,
7702 void *event_info EINA_UNUSED)
7704 eina_stringshare_del(data);
7708 elm_genlist_item_tooltip_text_set(Elm_Object_Item *it,
7711 eo_do(it, elm_wdg_item_tooltip_text_set(text));
7715 _elm_genlist_item_elm_widget_item_tooltip_text_set(Eo *eo_it, Elm_Gen_Item *it, const char *text)
7717 ELM_GENLIST_ITEM_CHECK_OR_RETURN(it);
7719 text = eina_stringshare_add(text);
7720 elm_genlist_item_tooltip_content_cb_set
7721 (eo_it, _elm_genlist_item_label_create, text,
7722 _elm_genlist_item_label_del_cb);
7726 elm_genlist_item_tooltip_content_cb_set(Elm_Object_Item *item,
7727 Elm_Tooltip_Item_Content_Cb func,
7729 Evas_Smart_Cb del_cb)
7731 eo_do(item, elm_wdg_item_tooltip_content_cb_set(func, data, del_cb));
7736 _elm_genlist_item_elm_widget_item_tooltip_content_cb_set(Eo *eo_it, Elm_Gen_Item *it,
7737 Elm_Tooltip_Item_Content_Cb func,
7739 Evas_Smart_Cb del_cb)
7741 ELM_GENLIST_ITEM_CHECK_OR_RETURN(it);
7743 if ((it->tooltip.content_cb != func) || (it->tooltip.data != data))
7745 if (it->tooltip.del_cb)
7746 it->tooltip.del_cb((void *)it->tooltip.data, WIDGET(it), it);
7748 it->tooltip.content_cb = func;
7749 it->tooltip.data = data;
7750 it->tooltip.del_cb = del_cb;
7755 eo_do_super(eo_it, ELM_GENLIST_ITEM_CLASS,
7756 elm_wdg_item_tooltip_content_cb_set
7757 (it->tooltip.content_cb, it->tooltip.data, NULL));
7759 elm_wdg_item_tooltip_style_set(it->tooltip.style),
7760 elm_wdg_item_tooltip_window_mode_set(it->tooltip.free_size));
7765 elm_genlist_item_tooltip_unset(Elm_Object_Item *item)
7767 eo_do(item, elm_wdg_item_tooltip_unset());
7771 _elm_genlist_item_elm_widget_item_tooltip_unset(Eo *eo_it, Elm_Gen_Item *it)
7773 ELM_GENLIST_ITEM_CHECK_OR_RETURN(it);
7775 if ((VIEW(it)) && (it->tooltip.content_cb))
7776 eo_do_super(eo_it, ELM_GENLIST_ITEM_CLASS,
7777 elm_wdg_item_tooltip_unset());
7779 if (it->tooltip.del_cb)
7780 it->tooltip.del_cb((void *)it->tooltip.data, WIDGET(it), it);
7781 it->tooltip.del_cb = NULL;
7782 it->tooltip.content_cb = NULL;
7783 it->tooltip.data = NULL;
7784 it->tooltip.free_size = EINA_FALSE;
7785 if (it->tooltip.style)
7786 eo_do(eo_it, elm_wdg_item_tooltip_style_set(NULL));
7790 elm_genlist_item_tooltip_style_set(Elm_Object_Item *item,
7793 eo_do(item, elm_wdg_item_tooltip_style_set(style));
7797 _elm_genlist_item_elm_widget_item_tooltip_style_set(Eo *eo_it, Elm_Gen_Item *it,
7800 ELM_GENLIST_ITEM_CHECK_OR_RETURN(it);
7802 eina_stringshare_replace(&it->tooltip.style, style);
7803 if (VIEW(it)) eo_do_super(eo_it, ELM_GENLIST_ITEM_CLASS,
7804 elm_wdg_item_tooltip_style_set(style));
7808 elm_genlist_item_tooltip_style_get(const Elm_Object_Item *it)
7811 return eo_do_ret(it, style, elm_wdg_item_tooltip_style_get());
7814 EOLIAN static const char *
7815 _elm_genlist_item_elm_widget_item_tooltip_style_get(Eo *eo_it EINA_UNUSED, Elm_Gen_Item *it)
7817 return it->tooltip.style;
7821 elm_genlist_item_tooltip_window_mode_set(Elm_Object_Item *item,
7825 return eo_do_ret(item, ret, elm_wdg_item_tooltip_window_mode_set(disable));
7828 EOLIAN static Eina_Bool
7829 _elm_genlist_item_elm_widget_item_tooltip_window_mode_set(Eo *eo_it, Elm_Gen_Item *it,
7832 ELM_GENLIST_ITEM_CHECK_OR_RETURN(it, EINA_FALSE);
7835 it->tooltip.free_size = disable;
7837 return eo_do_super_ret(eo_it, ELM_GENLIST_ITEM_CLASS, ret,
7838 elm_wdg_item_tooltip_window_mode_set(disable));
7844 elm_genlist_item_tooltip_window_mode_get(const Elm_Object_Item *eo_it)
7847 return eo_do_ret(eo_it, ret, elm_wdg_item_tooltip_window_mode_get());
7850 EOLIAN static Eina_Bool
7851 _elm_genlist_item_elm_widget_item_tooltip_window_mode_get(Eo *eo_it EINA_UNUSED, Elm_Gen_Item *it)
7853 return it->tooltip.free_size;
7857 elm_genlist_item_cursor_set(Elm_Object_Item *item,
7860 eo_do(item, elm_wdg_item_cursor_set(cursor));
7864 _elm_genlist_item_elm_widget_item_cursor_set(Eo *eo_it, Elm_Gen_Item *it,
7867 ELM_GENLIST_ITEM_CHECK_OR_RETURN(it);
7868 eina_stringshare_replace(&it->mouse_cursor, cursor);
7869 if (VIEW(it)) eo_do_super(eo_it, ELM_GENLIST_ITEM_CLASS,
7870 elm_wdg_item_cursor_set(cursor));
7874 elm_genlist_item_cursor_get(const Elm_Object_Item *eo_it)
7877 return eo_do_ret(eo_it, cursor, elm_wdg_item_cursor_get());
7881 elm_genlist_item_cursor_unset(Elm_Object_Item *item)
7883 eo_do(item, elm_wdg_item_cursor_unset());
7887 _elm_genlist_item_elm_widget_item_cursor_unset(Eo *eo_it, Elm_Gen_Item *it)
7889 ELM_GENLIST_ITEM_CHECK_OR_RETURN(it);
7891 if (!it->mouse_cursor) return;
7893 if (VIEW(it)) eo_do_super(eo_it, ELM_GENLIST_ITEM_CLASS,
7894 elm_wdg_item_cursor_unset());
7896 ELM_SAFE_FREE(it->mouse_cursor, eina_stringshare_del);
7900 elm_genlist_item_cursor_style_set(Elm_Object_Item *eo_it,
7903 eo_do(eo_it, elm_wdg_item_cursor_style_set(style));
7907 elm_genlist_item_cursor_style_get(const Elm_Object_Item *eo_it)
7910 return eo_do_ret( eo_it, style, elm_wdg_item_cursor_style_get());
7914 elm_genlist_item_cursor_engine_only_set(Elm_Object_Item *eo_it,
7915 Eina_Bool engine_only)
7917 eo_do(eo_it, elm_wdg_item_cursor_engine_only_set(engine_only));
7921 elm_genlist_item_cursor_engine_only_get(const Elm_Object_Item *eo_it)
7924 return eo_do_ret( eo_it, ret, elm_wdg_item_cursor_engine_only_get());
7928 _elm_genlist_item_index_get(Eo *eo_it EINA_UNUSED, Elm_Gen_Item *it)
7932 ELM_GENLIST_ITEM_CHECK_OR_RETURN(it, -1);
7934 EINA_INLIST_FOREACH(GL_IT(it)->wsd->items, tmp)
7936 if (tmp == it) break;
7943 _elm_genlist_mode_set(Eo *obj, Elm_Genlist_Data *sd, Elm_List_Mode mode)
7945 if (sd->mode == mode) return;
7948 if (sd->mode == ELM_LIST_LIMIT)
7950 sd->scr_minw = EINA_TRUE;
7951 sd->scr_minh = EINA_FALSE;
7953 else if (sd->mode == ELM_LIST_EXPAND)
7955 sd->scr_minw = EINA_TRUE;
7956 sd->scr_minh = EINA_TRUE;
7960 sd->scr_minw = EINA_FALSE;
7961 sd->scr_minh = EINA_FALSE;
7964 elm_layout_sizing_eval(obj);
7967 EOLIAN static Elm_List_Mode
7968 _elm_genlist_mode_get(Eo *obj EINA_UNUSED, Elm_Genlist_Data *sd)
7974 elm_genlist_bounce_set(Evas_Object *obj,
7978 ELM_GENLIST_CHECK(obj);
7979 eo_do(obj, elm_interface_scrollable_bounce_allow_set(h_bounce, v_bounce));
7983 _elm_genlist_elm_interface_scrollable_bounce_allow_set(Eo *obj, Elm_Genlist_Data *sd, Eina_Bool h_bounce, Eina_Bool v_bounce)
7985 sd->h_bounce = !!h_bounce;
7986 sd->v_bounce = !!v_bounce;
7988 eo_do_super(obj, MY_CLASS, elm_interface_scrollable_bounce_allow_set
7989 (sd->h_bounce, sd->v_bounce));
7990 //sd->s_iface->bounce_allow_set(obj, sd->h_bounce, sd->v_bounce);
7994 elm_genlist_bounce_get(const Evas_Object *obj,
7995 Eina_Bool *h_bounce,
7996 Eina_Bool *v_bounce)
7998 ELM_GENLIST_CHECK(obj);
7999 eo_do( obj, elm_interface_scrollable_bounce_allow_get
8000 (h_bounce, v_bounce));
8004 _elm_genlist_elm_interface_scrollable_bounce_allow_get(Eo *obj EINA_UNUSED, Elm_Genlist_Data *sd, Eina_Bool *h_bounce, Eina_Bool *v_bounce)
8006 if (h_bounce) *h_bounce = sd->h_bounce;
8007 if (v_bounce) *v_bounce = sd->v_bounce;
8011 _elm_genlist_homogeneous_set(Eo *obj EINA_UNUSED, Elm_Genlist_Data *sd, Eina_Bool homogeneous)
8013 sd->homogeneous = !!homogeneous;
8016 EOLIAN static Eina_Bool
8017 _elm_genlist_homogeneous_get(Eo *obj EINA_UNUSED, Elm_Genlist_Data *sd)
8019 return sd->homogeneous;
8023 _elm_genlist_block_count_set(Eo *obj EINA_UNUSED, Elm_Genlist_Data *sd, int count)
8025 EINA_SAFETY_ON_TRUE_RETURN(count < 1);
8027 sd->max_items_per_block = count;
8028 sd->item_cache_max = sd->max_items_per_block * 2;
8029 _item_cache_all_free(sd);
8033 _elm_genlist_block_count_get(Eo *obj EINA_UNUSED, Elm_Genlist_Data *sd)
8035 return sd->max_items_per_block;
8039 _filter_item_internal(Elm_Gen_Item *it)
8041 ELM_GENLIST_DATA_GET_FROM_ITEM(it, sd);
8042 if (sd->filter_data && it->itc->func.filter_get)
8044 if (!it->itc->func.filter_get(
8045 (void *)WIDGET_ITEM_DATA_GET(EO_OBJ(it)),
8046 WIDGET(it), sd->filter_data))
8048 it->want_hidden = EINA_TRUE;
8049 if (sd->show_item == it) sd->show_item = NULL;
8050 GL_IT(it)->block->calc_done = EINA_FALSE;
8051 sd->calc_done = EINA_FALSE;
8054 sd->filtered_count++;
8056 it->filtered = EINA_TRUE;
8057 sd->processed_count++;
8061 _item_filtered_get(Elm_Gen_Item *it)
8064 if (!it) return EINA_FALSE;
8065 ELM_GENLIST_DATA_GET_FROM_ITEM(it, sd);
8068 l = eina_list_data_find_list(sd->filter_queue, it);
8070 sd->filter_queue = eina_list_remove_list(sd->filter_queue, l);
8071 l = eina_list_data_find_list(sd->queue, it);
8074 sd->queue = eina_list_remove_list(sd->queue, l);
8075 GL_IT(it)->queued = EINA_FALSE;
8076 GL_IT(it)->resized = EINA_FALSE;
8077 _item_process(sd, it);
8080 _filter_item_internal(it);
8081 GL_IT(it)->block->calc_done = EINA_FALSE;
8082 sd->calc_done = EINA_FALSE;
8083 _changed(sd->pan_obj);
8085 if (!it->want_hidden) return EINA_TRUE;
8090 _filter_queue_process(Elm_Genlist_Data *sd)
8093 Elm_Gen_Item *it, *first;
8096 t0 = ecore_time_get();
8097 for (n = 0; ((sd->filter_queue) && (sd->processed_count < ITEM_QUEUE_MAX)); n++)
8099 first = it = eina_list_data_get(sd->filter_queue);
8100 //FIXME: This is added as a fail safe code for items not yet processed.
8101 while (it && it->item->queued)
8103 if ((ecore_time_get() - t0) > (ecore_animator_frametime_get()))
8105 sd->filter_queue = eina_list_remove_list
8106 (sd->filter_queue, sd->filter_queue);
8107 sd->filter_queue = eina_list_append(sd->filter_queue, it);
8108 it = eina_list_data_get(sd->filter_queue);
8110 //Do not iterate more than one loop
8111 if (it == first) return n;
8113 sd->filter_queue = eina_list_remove_list(sd->filter_queue, sd->filter_queue);
8116 _filter_item_internal(it);
8117 GL_IT(it)->block->calc_done = EINA_FALSE;
8119 sd->calc_done = EINA_FALSE;
8120 _changed(sd->pan_obj);
8121 if ((ecore_time_get() - t0) > (ecore_animator_frametime_get()))
8123 //At least 1 item is filtered by this time, so return n+1 for first loop
8132 _filter_process(void *data,
8135 Elm_Genlist_Data *sd = data;
8137 if (_filter_queue_process(sd) > 0) *wakeup = EINA_TRUE;
8138 if (!sd->filter_queue) return ECORE_CALLBACK_CANCEL;
8139 return ECORE_CALLBACK_RENEW;
8143 _item_filter_enterer(void *data)
8145 Eina_Bool wakeup = EINA_FALSE;
8146 ELM_GENLIST_DATA_GET(data, sd);
8147 Eina_Bool ok = _filter_process(sd, &wakeup);
8150 if (sd->dummy_job) ecore_job_del(sd->dummy_job);
8151 sd->dummy_job = ecore_job_add(_dummy_job, sd);
8153 if (ok == ECORE_CALLBACK_CANCEL)
8157 ecore_job_del(sd->dummy_job);
8158 sd->dummy_job = NULL;
8160 sd->queue_idle_enterer = NULL;
8161 evas_object_smart_callback_call((Evas_Object *)data, SIG_FILTER_DONE, NULL);
8168 _elm_genlist_filter_set(Eo *obj EINA_UNUSED, Elm_Genlist_Data *sd, void *filter_data)
8174 if (sd->filter_queue)
8175 ELM_SAFE_FREE(sd->queue_filter_enterer, ecore_idle_enterer_del);
8176 ELM_SAFE_FREE(sd->filter_queue, eina_list_free);
8177 ELM_SAFE_FREE(sd->filtered_list, eina_list_free);
8178 sd->filtered_count = 0;
8179 sd->processed_count = 0;
8180 sd->filter = EINA_TRUE;
8181 sd->filter_data = filter_data;
8183 EINA_INLIST_FOREACH(sd->blocks, itb)
8187 EINA_LIST_FOREACH(itb->items, l, it)
8189 it->filtered = EINA_FALSE;
8190 it->want_hidden = EINA_FALSE;
8192 _filter_item_internal(it);
8194 sd->filter_queue = eina_list_append(sd->filter_queue, it);
8196 itb->calc_done = EINA_FALSE;
8197 sd->calc_done = EINA_FALSE;
8201 EINA_LIST_FOREACH(itb->items, l, it)
8203 it->filtered = EINA_FALSE;
8204 it->want_hidden = EINA_FALSE;
8205 sd->filter_queue = eina_list_append(sd->filter_queue, it);
8209 _changed(sd->pan_obj);
8211 sd->queue_filter_enterer = ecore_idle_enterer_add(_item_filter_enterer,
8216 _filter_iterator_next(Elm_Genlist_Filter *iter, void **data)
8218 if (!iter->current) return EINA_FALSE;
8220 while (iter->current)
8222 item = ELM_GENLIST_FILTER_ITERATOR_ITEM_GET(iter->current, Elm_Gen_Item);
8223 iter->current = iter->current->next;
8224 if (_item_filtered_get(item))
8227 *data = EO_OBJ(item);
8236 _filter_iterator_free(Elm_Genlist_Filter *iter)
8241 static Evas_Object *
8242 _filter_iterator_get_container(Elm_Genlist_Filter *iter)
8244 Elm_Gen_Item *it = ELM_GENLIST_FILTER_ITERATOR_ITEM_GET(iter->head, Elm_Gen_Item);
8248 EOLIAN Eina_Iterator *
8249 _elm_genlist_filter_iterator_new(Eo *obj EINA_UNUSED, Elm_Genlist_Data *sd)
8251 Elm_Genlist_Filter *iter;
8252 iter = calloc(1, sizeof (Elm_Genlist_Filter));
8253 if (!iter) return NULL;
8255 iter->head = sd->items;
8256 iter->current = sd->items;
8258 iter->iterator.version = EINA_ITERATOR_VERSION;
8259 iter->iterator.next = FUNC_ITERATOR_NEXT(_filter_iterator_next);
8260 iter->iterator.get_container = FUNC_ITERATOR_GET_CONTAINER(
8261 _filter_iterator_get_container);
8262 iter->iterator.free = FUNC_ITERATOR_FREE(_filter_iterator_free);
8264 EINA_MAGIC_SET(&iter->iterator, EINA_MAGIC_ITERATOR);
8266 return &iter->iterator;
8270 _elm_genlist_longpress_timeout_set(Eo *obj EINA_UNUSED, Elm_Genlist_Data *sd, double timeout)
8272 sd->longpress_timeout = timeout;
8275 EOLIAN static double
8276 _elm_genlist_longpress_timeout_get(Eo *obj EINA_UNUSED, Elm_Genlist_Data *sd)
8278 return sd->longpress_timeout;
8282 elm_genlist_scroller_policy_set(Evas_Object *obj,
8283 Elm_Scroller_Policy policy_h,
8284 Elm_Scroller_Policy policy_v)
8286 ELM_GENLIST_CHECK(obj);
8287 eo_do(obj, elm_interface_scrollable_policy_set(policy_h, policy_v));
8291 _elm_genlist_elm_interface_scrollable_policy_set(Eo *obj, Elm_Genlist_Data *sd EINA_UNUSED, Elm_Scroller_Policy policy_h, Elm_Scroller_Policy policy_v)
8293 ELM_GENLIST_CHECK(obj);
8295 if ((policy_h >= ELM_SCROLLER_POLICY_LAST) ||
8296 (policy_v >= ELM_SCROLLER_POLICY_LAST))
8299 eo_do_super(obj, MY_CLASS, elm_interface_scrollable_policy_set(policy_h, policy_v));
8303 elm_genlist_scroller_policy_get(const Evas_Object *obj,
8304 Elm_Scroller_Policy *policy_h,
8305 Elm_Scroller_Policy *policy_v)
8307 ELM_GENLIST_CHECK(obj);
8308 eo_do( obj, elm_interface_scrollable_policy_get(policy_h, policy_v));
8312 _elm_genlist_elm_interface_scrollable_policy_get(Eo *obj, Elm_Genlist_Data *sd EINA_UNUSED, Elm_Scroller_Policy *policy_h, Elm_Scroller_Policy *policy_v)
8314 Elm_Scroller_Policy s_policy_h, s_policy_v;
8316 ELM_GENLIST_CHECK(obj);
8318 eo_do((Eo *)obj, elm_interface_scrollable_policy_get(&s_policy_h, &s_policy_v));
8319 if (policy_h) *policy_h = (Elm_Scroller_Policy)s_policy_h;
8320 if (policy_v) *policy_v = (Elm_Scroller_Policy)s_policy_v;
8324 _elm_genlist_realized_items_update(Eo *obj, Elm_Genlist_Data *_pd EINA_UNUSED)
8327 Elm_Object_Item *eo_it;
8329 ELM_GENLIST_CHECK(obj);
8331 list = elm_genlist_realized_items_get(obj);
8332 EINA_LIST_FREE(list, eo_it)
8333 elm_genlist_item_update(eo_it);
8337 _elm_genlist_item_decorate_mode_set(Eo *eo_it EINA_UNUSED, Elm_Gen_Item *it,
8338 const char *decorate_it_type,
8339 Eina_Bool decorate_it_set)
8341 Elm_Genlist_Data *sd;
8344 ELM_GENLIST_ITEM_CHECK_OR_RETURN(it);
8345 sd = GL_IT(it)->wsd;
8347 if (!decorate_it_type) return;
8348 if (eo_do_ret(eo_it, ret, elm_wdg_item_disabled_get())) return;
8349 if (sd->decorate_all_mode) return;
8351 if ((sd->mode_item == it) &&
8352 (!strcmp(decorate_it_type, sd->decorate_it_type)) &&
8355 if (!it->itc->decorate_item_style) return;
8356 it->decorate_it_set = decorate_it_set;
8359 if (((sd->decorate_it_type)
8360 && (strcmp(decorate_it_type, sd->decorate_it_type))) ||
8361 (decorate_it_set) || ((it == sd->mode_item) && (!decorate_it_set)))
8363 char buf[1024], buf2[1024];
8365 eo_do(sd->obj, elm_interface_scrollable_hold_set(EINA_TRUE));
8366 if (sd->scr_hold_timer) ecore_timer_del(sd->scr_hold_timer);
8367 sd->scr_hold_timer = ecore_timer_add(0.1, _scroll_hold_timer_cb, sd);
8369 snprintf(buf, sizeof(buf), "elm,state,%s,passive", sd->decorate_it_type);
8370 edje_object_signal_emit(GL_IT(it)->deco_it_view, buf, "elm");
8371 edje_object_signal_emit(VIEW(it), buf, "elm");
8373 snprintf(buf2, sizeof(buf2), "elm,state,%s,passive,finished",
8374 sd->decorate_it_type);
8375 edje_object_signal_callback_add(GL_IT(it)->deco_it_view, buf2,
8377 _decorate_item_finished_signal_cb, it);
8378 sd->mode_item = NULL;
8381 eina_stringshare_replace(&sd->decorate_it_type, decorate_it_type);
8382 if (decorate_it_set)
8385 eo_do(sd->obj, elm_interface_scrollable_hold_set(EINA_TRUE));
8386 if (sd->scr_hold_timer) ecore_timer_del(sd->scr_hold_timer);
8387 sd->scr_hold_timer = ecore_timer_add(0.1, _scroll_hold_timer_cb, sd);
8389 _decorate_item_realize(it);
8393 EOLIAN static const char *
8394 _elm_genlist_item_decorate_mode_get(Eo *eo_i EINA_UNUSED, Elm_Gen_Item *i)
8396 ELM_GENLIST_ITEM_CHECK_OR_RETURN(i, NULL);
8397 return GL_IT(i)->wsd->decorate_it_type;
8400 EOLIAN static Elm_Object_Item *
8401 _elm_genlist_decorated_item_get(Eo *obj EINA_UNUSED, Elm_Genlist_Data *sd)
8403 return EO_OBJ(sd->mode_item);
8406 EOLIAN static Eina_Bool
8407 _elm_genlist_decorate_mode_get(Eo *obj EINA_UNUSED, Elm_Genlist_Data *sd)
8409 return sd->decorate_all_mode;
8413 _elm_genlist_decorate_mode_set(Eo *obj, Elm_Genlist_Data *sd, Eina_Bool decorated)
8415 Elm_Object_Item *eo_it;
8418 decorated = !!decorated;
8419 if (sd->decorate_all_mode == decorated) return;
8420 // decorate_all_mode should be set first
8421 // because content_get func. will be called after this
8422 // and user can check whether deocrate_all_mode is enabeld.
8423 sd->decorate_all_mode = decorated;
8425 list = elm_genlist_realized_items_get(obj);
8426 EINA_LIST_FREE(list, eo_it)
8428 ELM_GENLIST_ITEM_DATA_GET(eo_it, it);
8430 if (!sd->decorate_all_mode)
8432 _decorate_all_item_unrealize(it);
8434 else if (it->itc->decorate_all_item_style)
8436 _decorate_all_item_realize(it, EINA_TRUE);
8438 _access_widget_item_register(it);
8440 _changed(sd->pan_obj);
8444 _elm_genlist_reorder_mode_set(Eo *obj EINA_UNUSED, Elm_Genlist_Data *sd, Eina_Bool reorder_mode)
8447 Elm_Object_Item *eo_it;
8449 if (sd->reorder_mode == !!reorder_mode) return;
8450 sd->reorder_mode = !!reorder_mode;
8452 list = elm_genlist_realized_items_get(obj);
8453 EINA_LIST_FREE(list, eo_it)
8455 ELM_GENLIST_ITEM_DATA_GET(eo_it, it);
8456 if (sd->reorder_mode)
8458 edje_object_signal_emit
8459 (VIEW(it), SIGNAL_REORDER_MODE_SET, "elm");
8460 if (it->deco_all_view)
8461 edje_object_signal_emit
8462 (it->deco_all_view, SIGNAL_REORDER_MODE_SET, "elm");
8466 edje_object_signal_emit
8467 (VIEW(it), SIGNAL_REORDER_MODE_UNSET, "elm");
8468 if (it->deco_all_view)
8469 edje_object_signal_emit
8470 (it->deco_all_view, SIGNAL_REORDER_MODE_UNSET, "elm");
8475 EOLIAN static Eina_Bool
8476 _elm_genlist_reorder_mode_get(Eo *obj EINA_UNUSED, Elm_Genlist_Data *sd)
8478 return sd->reorder_mode;
8481 EOLIAN static Elm_Genlist_Item_Type
8482 _elm_genlist_item_type_get(Eo *eo_it EINA_UNUSED, Elm_Gen_Item *it)
8484 ELM_GENLIST_ITEM_CHECK_OR_RETURN(it, ELM_GENLIST_ITEM_MAX);
8486 return GL_IT(it)->type;
8489 EAPI Elm_Genlist_Item_Class *
8490 elm_genlist_item_class_new(void)
8492 Elm_Genlist_Item_Class *itc = ELM_NEW(Elm_Genlist_Item_Class);
8493 EINA_SAFETY_ON_NULL_RETURN_VAL(itc, NULL);
8495 itc->version = CLASS_ALLOCATED;
8497 itc->delete_me = EINA_FALSE;
8498 // TIZEN ONLY(20160630): Support homogeneous mode in item class.
8499 itc->homogeneous = EINA_FALSE;
8506 elm_genlist_item_class_free(Elm_Genlist_Item_Class *itc)
8508 if (itc && (itc->version == CLASS_ALLOCATED))
8510 itc->delete_me = EINA_TRUE;
8511 if (itc->refcount > 0) elm_genlist_item_class_unref(itc);
8521 elm_genlist_item_class_ref(Elm_Genlist_Item_Class *itc)
8523 if (itc && (itc->version == CLASS_ALLOCATED))
8526 if (itc->refcount == 0) itc->refcount--;
8531 elm_genlist_item_class_unref(Elm_Genlist_Item_Class *itc)
8533 if (itc && (itc->version == CLASS_ALLOCATED))
8535 if (itc->refcount > 0) itc->refcount--;
8536 if (itc->delete_me && (!itc->refcount))
8537 elm_genlist_item_class_free(itc);
8542 _elm_genlist_item_flip_set(Eo *eo_it EINA_UNUSED, Elm_Gen_Item *it, Eina_Bool flip)
8544 ELM_GENLIST_ITEM_CHECK_OR_RETURN(it);
8547 if (it->flipped == flip) return;
8552 _item_content_realize(it, VIEW(it), &GL_IT(it)->flip_content_objs,
8555 edje_object_signal_emit(VIEW(it), SIGNAL_FLIP_ENABLED, "elm");
8556 if (GL_IT(it)->wsd->decorate_all_mode)
8557 edje_object_signal_emit
8558 (it->deco_all_view, SIGNAL_FLIP_ENABLED, "elm");
8563 edje_object_signal_emit(VIEW(it), SIGNAL_FLIP_DISABLED, "elm");
8564 if (GL_IT(it)->wsd->decorate_all_mode)
8565 edje_object_signal_emit
8566 (it->deco_all_view, SIGNAL_FLIP_DISABLED, "elm");
8568 EINA_LIST_FREE(GL_IT(it)->flip_content_objs, c)
8571 // FIXME: update texts should be done by app?
8572 _item_text_realize(it, VIEW(it), NULL);
8574 _access_widget_item_register(it);
8577 EOLIAN static Eina_Bool
8578 _elm_genlist_item_flip_get(Eo *eo_it EINA_UNUSED, Elm_Gen_Item *it)
8580 ELM_GENLIST_ITEM_CHECK_OR_RETURN(it, EINA_FALSE);
8586 _elm_genlist_select_mode_set(Eo *obj EINA_UNUSED, Elm_Genlist_Data *sd, Elm_Object_Select_Mode mode)
8588 if ((mode >= ELM_OBJECT_SELECT_MODE_MAX) || (sd->select_mode == mode))
8591 sd->select_mode = mode;
8593 if ((sd->select_mode == ELM_OBJECT_SELECT_MODE_NONE) ||
8594 (sd->select_mode == ELM_OBJECT_SELECT_MODE_DISPLAY_ONLY ))
8597 Elm_Object_Item *eo_it;
8598 EINA_LIST_FOREACH_SAFE(sd->selected, l, ll, eo_it)
8600 ELM_GENLIST_ITEM_DATA_GET(eo_it, it);
8604 if (sd->select_mode == ELM_OBJECT_SELECT_MODE_DISPLAY_ONLY)
8607 EINA_INLIST_FOREACH(sd->items, it)
8609 if (!GL_IT(it)->block) continue;
8610 GL_IT(it)->calc_done = EINA_FALSE;
8611 GL_IT(it)->block->calc_done = EINA_FALSE;
8612 sd->calc_done = EINA_FALSE;
8613 _changed(sd->pan_obj);
8618 EOLIAN static Elm_Object_Select_Mode
8619 _elm_genlist_select_mode_get(Eo *obj EINA_UNUSED, Elm_Genlist_Data *sd)
8621 return sd->select_mode;
8625 _elm_genlist_highlight_mode_set(Eo *obj EINA_UNUSED, Elm_Genlist_Data *sd, Eina_Bool highlight)
8627 sd->highlight = !!highlight;
8630 EOLIAN static Eina_Bool
8631 _elm_genlist_highlight_mode_get(Eo *obj EINA_UNUSED, Elm_Genlist_Data *sd)
8633 return sd->highlight;
8637 _elm_genlist_item_select_mode_set(Eo *eo_it EINA_UNUSED, Elm_Gen_Item *it,
8638 Elm_Object_Select_Mode mode)
8640 ELM_GENLIST_ITEM_CHECK_OR_RETURN(it);
8642 if ((mode >= ELM_OBJECT_SELECT_MODE_MAX) || (it->select_mode == mode))
8645 it->select_mode = mode;
8647 if ((it->select_mode == ELM_OBJECT_SELECT_MODE_NONE) ||
8648 (it->select_mode == ELM_OBJECT_SELECT_MODE_DISPLAY_ONLY ))
8651 if (GL_IT(it)->block && it->select_mode == ELM_OBJECT_SELECT_MODE_DISPLAY_ONLY)
8653 GL_IT(it)->calc_done = EINA_FALSE;
8654 GL_IT(it)->block->calc_done = EINA_FALSE;
8655 GL_IT(it)->wsd->calc_done = EINA_FALSE;
8656 _changed(GL_IT(it)->wsd->pan_obj);
8660 EOLIAN static Elm_Object_Select_Mode
8661 _elm_genlist_item_select_mode_get(Eo *eo_it EINA_UNUSED, Elm_Gen_Item *it)
8663 ELM_GENLIST_ITEM_CHECK_OR_RETURN(it, ELM_OBJECT_SELECT_MODE_MAX);
8665 return it->select_mode;
8668 EOLIAN Elm_Atspi_State_Set
8669 _elm_genlist_item_elm_interface_atspi_accessible_state_set_get(Eo *eo_it, Elm_Gen_Item *it EINA_UNUSED)
8671 Elm_Atspi_State_Set ret;
8674 eo_do_super(eo_it, ELM_GENLIST_ITEM_CLASS, ret = elm_interface_atspi_accessible_state_set_get());
8676 eo_do(eo_it, sel = elm_obj_genlist_item_selected_get());
8678 STATE_TYPE_SET(ret, ELM_ATSPI_STATE_SELECTABLE);
8681 STATE_TYPE_SET(ret, ELM_ATSPI_STATE_SELECTED);
8683 if (elm_genlist_item_type_get(eo_it) == ELM_GENLIST_ITEM_TREE)
8685 STATE_TYPE_SET(ret, ELM_ATSPI_STATE_EXPANDABLE);
8686 if (elm_genlist_item_expanded_get(eo_it))
8687 STATE_TYPE_SET(ret, ELM_ATSPI_STATE_EXPANDED);
8688 //TIZEN_ONLY(20160606): In order to distinguish group item(TREE/GROUP) added STATE_TYPE_SET
8690 STATE_TYPE_SET(ret, ELM_ATSPI_STATE_COLLAPSED);
8693 //TIZEN_ONLY(20160608): In order to distinguish group item(TREE/GROUP) added STATE_TYPE_SET
8694 else if (elm_genlist_item_type_get(eo_it) == ELM_GENLIST_ITEM_GROUP)
8696 if (elm_genlist_item_expanded_get(eo_it))
8697 STATE_TYPE_SET(ret, ELM_ATSPI_STATE_EXPANDED);
8699 STATE_TYPE_SET(ret, ELM_ATSPI_STATE_COLLAPSED);
8707 _elm_genlist_item_elm_interface_atspi_accessible_name_get(Eo *eo_it,
8712 char *accessible_name;
8713 eo_do_super(eo_it, ELM_GENLIST_ITEM_CLASS, ret = elm_interface_atspi_accessible_name_get());
8714 if (ret) return ret;
8716 buf = eina_strbuf_new();
8718 if (it->itc->func.text_get)
8724 elm_widget_stringlist_get(edje_object_data_get(VIEW(it), "texts"));
8726 EINA_LIST_FREE(texts, key)
8728 char *str_markup = it->itc->func.text_get
8729 ((void *)WIDGET_ITEM_DATA_GET(EO_OBJ(it)), WIDGET(it), key);
8730 char *str_utf8 = _elm_util_mkup_to_text(str_markup);
8734 if (eina_strbuf_length_get(buf) > 0) eina_strbuf_append(buf, ", ");
8735 eina_strbuf_append(buf, str_utf8);
8741 accessible_name = eina_strbuf_string_steal(buf);
8742 eina_strbuf_free(buf);
8744 eina_stringshare_del(it->base->accessible_name);
8745 it->base->accessible_name = eina_stringshare_add(accessible_name);
8746 free(accessible_name);
8747 return it->base->accessible_name;
8751 _elm_genlist_item_elm_interface_atspi_accessible_children_get(Eo *eo_it EINA_UNUSED, Elm_Gen_Item *it)
8753 Eina_List *ret = NULL;
8758 parts = elm_widget_stringlist_get(edje_object_data_get(VIEW(it), "contents"));
8760 EINA_LIST_FREE(parts, key)
8763 part = edje_object_part_swallow_get(VIEW(it), key);
8764 if (part && eo_isa(part, ELM_INTERFACE_ATSPI_ACCESSIBLE_MIXIN))
8766 ret = eina_list_append(ret, part);
8767 eo_do(part, elm_interface_atspi_accessible_parent_set(eo_it));
8775 ///////////////////////////////////////////////////////////////////////////////
8776 //TIZEN ONLY:(20150623): Region show on item elements fixed
8777 //Grab and clear highlight on genlist items
8778 ///////////////////////////////////////////////////////////////////////////////
8779 EOLIAN static Eina_Bool
8780 _elm_genlist_item_elm_interface_atspi_component_highlight_grab(Eo *eo_it, Elm_Gen_Item *it)
8782 ELM_GENLIST_DATA_GET(WIDGET(it), sd);
8786 //TIZEN_ONLY(20170119): Show the object highlighted by highlight_grab when the object is completely out of the scroll
8787 eo_do_super(EO_OBJ(it), ELM_GENLIST_ITEM_CLASS, elm_interface_atspi_component_highlight_grab());
8789 //TIZEN_ONLY(20170412) Make atspi,(un)highlighted work on widget item
8790 // If you call eo_do_super, then you do NOT have to call smart callback.
8791 evas_object_smart_callback_call(WIDGET(it), "atspi,highlighted", EO_OBJ(it));
8793 //TIZEN_ONLY(20161104) : Accessibility : synchronized highlight of atspi and item align feature for wearable profile
8794 edje_object_signal_emit(VIEW(it), SIGNAL_ITEM_HIGHLIGHTED, "elm");
8799 if (!TIZEN_PROFILE_WEARABLE)
8801 //TIZEN_ONLY(20170724): grab highlight using unrealized item
8802 elm_genlist_item_bring_in(eo_it, ELM_GENLIST_ITEM_SCROLLTO_IN);
8807 Eina_List *realized = elm_genlist_realized_items_get(WIDGET(it));
8810 Elm_Object_Item *first_it = elm_genlist_first_item_get(WIDGET(it));
8811 Elm_Object_Item *last_it = elm_genlist_last_item_get(WIDGET(it));
8812 if (first_it == eo_it || last_it == eo_it)
8813 elm_genlist_item_bring_in(eo_it, ELM_GENLIST_ITEM_SCROLLTO_MIDDLE);
8815 elm_genlist_item_bring_in(eo_it, ELM_GENLIST_ITEM_SCROLLTO_IN);
8816 eina_list_free(realized);
8817 /* FIXME : Adjusted_item is not unnecessary when find unrealized item and highlight
8818 Because In realized function will find unrealized item and highlight focus. */
8819 sd->adjusted_item = NULL;
8822 sd->atspi_item_to_highlight = it;//it will be highlighted when realized
8828 EOLIAN static Eina_Bool
8829 _elm_genlist_item_elm_interface_atspi_component_highlight_clear(Eo *eo_it EINA_UNUSED, Elm_Gen_Item *it)
8831 ELM_GENLIST_DATA_GET(WIDGET(it), sd);
8832 if (sd->atspi_item_to_highlight == it)
8833 sd->atspi_item_to_highlight = NULL;
8834 elm_object_accessibility_highlight_set(EO_OBJ(it), EINA_FALSE);
8835 ///TIZEN_ONLY(20170717) : expose highlight information on atspi
8836 elm_interface_atspi_accessible_state_changed_signal_emit(EO_OBJ(it), ELM_ATSPI_STATE_HIGHLIGHTED, EINA_FALSE);
8839 //TIZEN_ONLY(20161104) : Accessibility : synchronized highlight of atspi and item align feature for wearable profile
8840 edje_object_signal_emit(VIEW(it), SIGNAL_ITEM_UNHIGHLIGHTED, "elm");
8842 //TIZEN_ONLY(20170412) Make atspi,(un)highlighted work on widget item
8843 // If you call eo_do_super, then you do NOT have to call smart callback.
8844 evas_object_smart_callback_call(WIDGET(it), "atspi,unhighlighted", EO_OBJ(it));
8849 ///////////////////////////////////////////////////////////////////////////////
8852 _elm_genlist_tree_effect_enabled_set(Eo *obj EINA_UNUSED, Elm_Genlist_Data *sd EINA_UNUSED, Eina_Bool enabled EINA_UNUSED)
8854 // Need to implemented
8855 //sd->tree_effect_enabled = !!enabled;
8858 EOLIAN static Eina_Bool
8859 _elm_genlist_tree_effect_enabled_get(Eo *obj EINA_UNUSED, Elm_Genlist_Data *sd EINA_UNUSED)
8865 _elm_genlist_focus_on_selection_set(Eo *obj EINA_UNUSED, Elm_Genlist_Data *sd EINA_UNUSED, Eina_Bool enabled EINA_UNUSED)
8867 // Need to Implemented
8868 sd->focus_on_selection_enabled = !!enabled;
8871 EOLIAN static Eina_Bool
8872 _elm_genlist_focus_on_selection_get(Eo *obj EINA_UNUSED, Elm_Genlist_Data *sd EINA_UNUSED)
8874 // Need to Implemented
8875 return sd->focus_on_selection_enabled;
8878 EAPI Elm_Object_Item *
8879 elm_genlist_nth_item_get(const Evas_Object *obj, unsigned int nth)
8881 Elm_Gen_Item *it = NULL;
8885 ELM_GENLIST_CHECK(obj) NULL;
8886 ELM_GENLIST_DATA_GET(obj, sd);
8888 if (!sd->items) return NULL;
8890 a = eina_inlist_accessor_new(sd->items);
8891 if (!a) return NULL;
8892 if (eina_accessor_data_get(a, nth, &data))
8893 it = ELM_GEN_ITEM_FROM_INLIST(data);
8894 eina_accessor_free(a);
8899 elm_genlist_fx_mode_set(Evas_Object *obj, Eina_Bool mode)
8901 ELM_GENLIST_CHECK(obj);
8902 ELM_GENLIST_DATA_GET(obj, sd);
8909 elm_genlist_fx_mode_get(const Evas_Object *obj)
8911 ELM_GENLIST_CHECK(obj) EINA_FALSE;
8912 ELM_GENLIST_DATA_GET(obj, sd);
8918 elm_genlist_item_hide_set(const Elm_Object_Item *eo_item EINA_UNUSED, Eina_Bool hide EINA_UNUSED)
8920 WRN("This API is deprecated, please use filter_set instead of this");
8924 elm_genlist_item_hide_get(const Elm_Object_Item *eo_item EINA_UNUSED)
8926 WRN("This API is deprecated, please use filter_set instead of this");
8930 ///////////////////////////////////////////////////////////////////////////////
8931 //TIZEN ONLY:(20150126): its not decided whether deprecated or not to give away
8932 ///////////////////////////////////////////////////////////////////////////////
8934 elm_genlist_realization_mode_set(Evas_Object *obj, Eina_Bool realization_mode)
8936 ELM_GENLIST_CHECK(obj);
8937 ELM_GENLIST_DATA_GET(obj, sd);
8939 if (sd->realization_mode == realization_mode) return;
8940 sd->realization_mode = realization_mode;
8944 elm_genlist_realization_mode_get(Evas_Object *obj)
8946 ELM_GENLIST_CHECK(obj) EINA_FALSE;
8947 ELM_GENLIST_DATA_GET(obj, sd);
8949 return sd->realization_mode;
8951 ///////////////////////////////////////////////////////////////////////////////
8954 elm_genlist_item_reorder_start(Elm_Object_Item *eo_item)
8956 ELM_GENLIST_ITEM_DATA_GET(eo_item, it);
8957 ELM_GENLIST_ITEM_CHECK_OR_RETURN(it);
8958 Elm_Genlist_Data *sd = GL_IT(it)->wsd;
8960 sd->reorder.it = it;
8962 eo_do(sd->obj, elm_interface_scrollable_hold_set(EINA_TRUE));
8963 eo_do(sd->obj, elm_interface_scrollable_bounce_allow_set
8964 (EINA_FALSE, EINA_FALSE));
8965 //sd->s_iface->hold_set(sd->obj, EINA_TRUE);
8966 //sd->s_iface->bounce_allow_set(sd->obj, EINA_FALSE, EINA_FALSE);
8967 sd->reorder_force = EINA_TRUE;
8971 elm_genlist_item_reorder_stop(Elm_Object_Item *eo_item)
8973 ELM_GENLIST_ITEM_DATA_GET(eo_item, it);
8974 ELM_GENLIST_ITEM_CHECK_OR_RETURN(it);
8975 Elm_Genlist_Data *sd = GL_IT(it)->wsd;
8977 sd->reorder_force = EINA_FALSE;
8981 _elm_genlist_class_constructor(Eo_Class *klass)
8983 if (_elm_config->access_mode)
8984 _elm_genlist_smart_focus_next_enable = EINA_TRUE;
8986 evas_smart_legacy_type_register(MY_CLASS_NAME_LEGACY, klass);
8990 _elm_genlist_elm_interface_atspi_accessible_children_get(Eo *obj EINA_UNUSED, Elm_Genlist_Data *sd)
8992 Eina_List *ret = NULL;
8995 EINA_INLIST_FOREACH(sd->items, it)
8996 ret = eina_list_append(ret, EO_OBJ(it));
9001 EOLIAN Elm_Atspi_State_Set
9002 _elm_genlist_elm_interface_atspi_accessible_state_set_get(Eo *obj, Elm_Genlist_Data *sd EINA_UNUSED)
9004 Elm_Atspi_State_Set ret;
9006 eo_do_super(obj, ELM_GENLIST_CLASS, ret = elm_interface_atspi_accessible_state_set_get());
9008 STATE_TYPE_SET(ret, ELM_ATSPI_STATE_MANAGES_DESCENDANTS);
9010 if (elm_genlist_multi_select_get(obj))
9011 STATE_TYPE_SET(ret, ELM_ATSPI_STATE_MULTISELECTABLE);
9017 _elm_genlist_elm_interface_atspi_selection_selected_children_count_get(Eo *objm EINA_UNUSED, Elm_Genlist_Data *pd)
9019 return eina_list_count(pd->selected);
9023 _elm_genlist_elm_interface_atspi_selection_selected_child_get(Eo *obj EINA_UNUSED, Elm_Genlist_Data *pd, int child_idx)
9025 return eina_list_nth(pd->selected, child_idx);
9029 _elm_genlist_elm_interface_atspi_selection_child_select(Eo *obj EINA_UNUSED, Elm_Genlist_Data *pd, int child_index)
9032 if (pd->select_mode != ELM_OBJECT_SELECT_MODE_NONE)
9034 EINA_INLIST_FOREACH(pd->items, item)
9036 if (child_index-- == 0)
9038 elm_genlist_item_selected_set(EO_OBJ(item), EINA_TRUE);
9047 _elm_genlist_elm_interface_atspi_selection_selected_child_deselect(Eo *obj EINA_UNUSED, Elm_Genlist_Data *pd, int child_index)
9052 EINA_LIST_FOREACH(pd->selected, l, item)
9054 if (child_index-- == 0)
9056 elm_genlist_item_selected_set(item, EINA_FALSE);
9064 _elm_genlist_elm_interface_atspi_selection_is_child_selected(Eo *obj EINA_UNUSED, Elm_Genlist_Data *pd, int child_index)
9068 EINA_INLIST_FOREACH(pd->items, item)
9070 if (child_index-- == 0)
9072 return elm_genlist_item_selected_get(EO_OBJ(item));
9079 _elm_genlist_elm_interface_atspi_selection_all_children_select(Eo *obj, Elm_Genlist_Data *pd)
9083 if (!elm_genlist_multi_select_get(obj))
9086 EINA_INLIST_FOREACH(pd->items, item)
9087 elm_genlist_item_selected_set(EO_OBJ(item), EINA_TRUE);
9093 _elm_genlist_elm_interface_atspi_selection_clear(Eo *obj EINA_UNUSED, Elm_Genlist_Data *pd)
9095 return _all_items_deselect(pd);
9099 _elm_genlist_elm_interface_atspi_selection_child_deselect(Eo *obj EINA_UNUSED, Elm_Genlist_Data *pd, int child_index)
9102 if (pd->select_mode != ELM_OBJECT_SELECT_MODE_NONE)
9104 EINA_INLIST_FOREACH(pd->items, item)
9106 if (child_index-- == 0)
9108 elm_genlist_item_selected_set(EO_OBJ(item), EINA_FALSE);
9116 // TIZEN only (20150914) : Accessibility: updated highlight change during genlist and list scroll
9117 static int _is_item_in_viewport(int viewport_y, int viewport_h, int obj_y, int obj_h)
9119 if (obj_y + obj_h <= viewport_y)
9121 else if (obj_y >= viewport_y + viewport_h)
9127 _elm_genlist_elm_interface_scrollable_content_pos_set(Eo *obj, Elm_Genlist_Data *sd, Evas_Coord x, Evas_Coord y, Eina_Bool sig)
9129 if (!_elm_atspi_enabled())
9131 eo_do_super(obj, MY_CLASS, elm_interface_scrollable_content_pos_set(x,y,sig));
9135 int old_x, old_y, delta_y;
9136 eo_do_super(obj, MY_CLASS, elm_interface_scrollable_content_pos_get(&old_x,&old_y));
9137 eo_do_super(obj, MY_CLASS, elm_interface_scrollable_content_pos_set(x,y,sig));
9138 delta_y = old_y - y;
9140 //check if highlighted item is genlist descendant
9141 Evas_Object * highlighted_obj = _elm_object_accessibility_currently_highlighted_get();
9142 if (eo_isa(highlighted_obj, ELM_WIDGET_ITEM_CLASS))
9144 Elm_Widget_Item_Data *id = eo_data_scope_get(highlighted_obj, ELM_WIDGET_ITEM_CLASS);
9145 highlighted_obj = id->view;
9148 Evas_Object * parent = highlighted_obj;
9149 if (eo_isa(highlighted_obj, ELM_WIDGET_CLASS))
9151 while ((parent = elm_widget_parent_get(parent)))
9155 else if (eo_isa(highlighted_obj, EDJE_OBJECT_CLASS))
9157 while ((parent = evas_object_smart_parent_get(parent)))
9161 // TIZEN_ONLY(20160805): set _accessibility_currently_highlighted_obj to NULL in object delete callback
9164 WRN("Improper highlighted object: %p", highlighted_obj);
9171 int obj_x, obj_y, w, h, hx, hy, hw, hh;
9172 evas_object_geometry_get(obj, &obj_x, &obj_y, &w, &h);
9174 evas_object_geometry_get(highlighted_obj, &hx, &hy, &hw, &hh);
9176 Elm_Gen_Item * next_previous_item = NULL;
9177 // TIZEN_ONLY(20180326) : Atspi: enhance finding next and prev item on screen's edge
9178 /* FIXME : the content_pos_set of genlist differs by 1 pixel from the final call when scrolled up and down.
9179 If the item size is 360x360 on a 360x360 size screen, scrolling upward (0,360) to (0, 0)
9180 will be called until the y coordinate of the highlight object in content_pos_set is 1.
9181 But downward is not same. if scrolling downward (0,0) to (0,360)
9182 will be called y coordinate of highlight object in final called content_pos_set is 360.
9183 This part can be modified according to the content_pos_set call convention.
9185 if(sd->scroll_delta_y_backup < 0)
9188 int viewport_position_result = _is_item_in_viewport(obj_y, h, hy, hh);
9189 //only highlight if move direction is correct
9190 //sometimes highlighted item is brought in and it does not fit viewport
9191 //however content goes to the viewport position so soon it will
9192 //meet _is_item_in_viewport condition
9193 if ((viewport_position_result < 0 && (delta_y != 0 ? delta_y > 0 : sd->scroll_delta_y_backup > 0)) ||
9194 (viewport_position_result > 0 && (delta_y != 0 ? delta_y < 0 : sd->scroll_delta_y_backup < 0)))
9197 Eina_List *realized_items = elm_genlist_realized_items_get(obj);
9200 Eina_Bool traverse_direction = viewport_position_result > 0;
9201 l = traverse_direction ? realized_items: eina_list_last(realized_items);
9205 item = eina_list_data_get(l);
9206 ELM_GENLIST_ITEM_DATA_GET(item, it_data);
9207 next_previous_item = ELM_GEN_ITEM_FROM_INLIST(EINA_INLIST_GET(it_data));
9208 evas_object_geometry_get(VIEW(next_previous_item), &hx, &hy, &hw, &hh);
9209 //FIXME : the content_pos_set of genlist differs by 1 pixel from the final call when scrolled up and down.
9210 if(sd->scroll_delta_y_backup < 0)
9212 if (_is_item_in_viewport(obj_y, h, hy, hh) == 0)
9215 next_previous_item = NULL;
9217 l = traverse_direction ? eina_list_next(l): eina_list_prev(l);
9220 if (next_previous_item)
9222 elm_object_accessibility_highlight_set(EO_OBJ(next_previous_item), EINA_TRUE);
9223 elm_interface_atspi_accessible_state_changed_signal_emit(EO_OBJ(next_previous_item), ELM_ATSPI_STATE_HIGHLIGHTED, EINA_TRUE);
9226 // TIZEN_ONLY(20180326) : Atspi: enhance finding next and prev item on screen's edge
9227 /* FIXME : delta_y means the direction of the scroll. However, old_y and y do not have the proper orientation
9228 when content_pos_set is called twice. Therefore, we use delta_y_backup temporarily.
9230 sd->scroll_delta_y_backup = delta_y;
9233 // Tizen only (20150914)
9234 #include "elm_genlist.eo.c"
9235 #include "elm_genlist_item.eo.c"