From 28db114b5aad4dd70e15fc50adaccdd76d183622 Mon Sep 17 00:00:00 2001 From: Jung Chanwook Date: Wed, 15 Feb 2012 15:00:12 +0900 Subject: [PATCH] [Genlist] genlist svn migration --- src/lib/elm_genlist.c | 1089 ++++++++-------- src/lib/elm_genlist.h | 3443 +++++++++++++++++++++++++------------------------ 2 files changed, 2276 insertions(+), 2256 deletions(-) diff --git a/src/lib/elm_genlist.c b/src/lib/elm_genlist.c index 9508d59..f52a259 100644 --- a/src/lib/elm_genlist.c +++ b/src/lib/elm_genlist.c @@ -4,6 +4,7 @@ #include #include "elm_priv.h" #include "els_scroller.h" +//#include "elm_gen_common.h" //upstream #define SWIPE_MOVES 12 #define MAX_ITEMS_PER_BLOCK 32 @@ -289,6 +290,10 @@ static void _item_auto_scroll(Widget_Data *wd); static void _pan_child_size_get(Evas_Object *obj, Evas_Coord *w, Evas_Coord *h); +static void _elm_genlist_clear(Evas_Object *obj, + Eina_Bool standby); +static void _elm_genlist_item_del_serious(Elm_Genlist_Item *it); +static void _elm_genlist_item_del_notserious(Elm_Genlist_Item *it); static Evas_Smart_Class _pan_sc = EVAS_SMART_CLASS_INIT_VERSION; @@ -313,10 +318,10 @@ static const char SIG_SCROLL_ANIM_START[] = "scroll,anim,start"; static const char SIG_SCROLL_ANIM_STOP[] = "scroll,anim,stop"; static const char SIG_SCROLL_DRAG_START[] = "scroll,drag,start"; static const char SIG_SCROLL_DRAG_STOP[] = "scroll,drag,stop"; -static const char SIG_SCROLL_EDGE_TOP[] = "scroll,edge,top"; -static const char SIG_SCROLL_EDGE_BOTTOM[] = "scroll,edge,bottom"; -static const char SIG_SCROLL_EDGE_LEFT[] = "scroll,edge,left"; -static const char SIG_SCROLL_EDGE_RIGHT[] = "scroll,edge,right"; +static const char SIG_EDGE_TOP[] = "edge,top"; +static const char SIG_EDGE_BOTTOM[] = "edge,bottom"; +static const char SIG_EDGE_LEFT[] = "edge,left"; +static const char SIG_EDGE_RIGHT[] = "edge,right"; static const char SIG_MULTI_SWIPE_LEFT[] = "multi,swipe,left"; static const char SIG_MULTI_SWIPE_RIGHT[] = "multi,swipe,right"; static const char SIG_MULTI_SWIPE_UP[] = "multi,swipe,up"; @@ -347,10 +352,10 @@ static const Evas_Smart_Cb_Description _signals[] = { {SIG_SCROLL_ANIM_STOP, ""}, {SIG_SCROLL_DRAG_START, ""}, {SIG_SCROLL_DRAG_STOP, ""}, - {SIG_SCROLL_EDGE_TOP, ""}, - {SIG_SCROLL_EDGE_BOTTOM, ""}, - {SIG_SCROLL_EDGE_LEFT, ""}, - {SIG_SCROLL_EDGE_RIGHT, ""}, + {SIG_EDGE_TOP, ""}, + {SIG_EDGE_BOTTOM, ""}, + {SIG_EDGE_LEFT, ""}, + {SIG_EDGE_RIGHT, ""}, {SIG_MULTI_SWIPE_LEFT, ""}, {SIG_MULTI_SWIPE_RIGHT, ""}, {SIG_MULTI_SWIPE_UP, ""}, @@ -518,7 +523,8 @@ _item_multi_select_down(Widget_Data *wd) if (!wd->selected) return EINA_FALSE; if (!wd->multi) return EINA_FALSE; - Elm_Object_Item *next = elm_genlist_item_next_get(wd->last_selected_item); + Elm_Object_Item *next; + next = elm_genlist_item_next_get(wd->last_selected_item); if (!next) return EINA_TRUE; if (elm_genlist_item_selected_get(next)) @@ -755,7 +761,7 @@ _item_highlight(Elm_Genlist_Item *it) { const char *selectraise; if ((it->wd->no_select) || (it->no_select) || (it->delete_me) || (it->highlighted) || - (it->disabled) || (it->display_only)) + elm_widget_item_disabled_get(it) || (it->display_only)) return; edje_object_signal_emit(VIEW(it), "elm,state,selected", "elm"); if (it->edit_obj) edje_object_signal_emit(it->edit_obj, "elm,state,selected", "elm"); @@ -865,19 +871,14 @@ _item_subitems_clear(Elm_Genlist_Item *it) static void _item_del(Elm_Genlist_Item *it) { - Evas_Object *tob = it->wd->obj; + Evas_Object *obj = WIDGET(it); - evas_event_freeze(evas_object_evas_get(tob)); - elm_widget_item_pre_notify_del(it); + evas_event_freeze(evas_object_evas_get(obj)); elm_genlist_item_subitems_clear((Elm_Object_Item *) it); - it->wd->walking -= it->walking; if (it->wd->show_item == it) it->wd->show_item = NULL; if (it->realized) _item_unrealize(it, EINA_FALSE); - if (it->effect_item_realized) _effect_item_unrealize(it); if (it->block) _item_block_del(it); - if ((!it->delete_me) && (it->itc->func.del)) - it->itc->func.del((void *)it->base.data, WIDGET(it)); - it->delete_me = EINA_TRUE; + if (it->effect_item_realized) _effect_item_unrealize(it); if (it->queued) it->wd->queue = eina_list_remove(it->wd->queue, it); #ifdef ANCHOR_ITEM @@ -888,21 +889,12 @@ _item_del(Elm_Genlist_Item *it) it->wd->anchor_item = ELM_GENLIST_ITEM_FROM_INLIST(EINA_INLIST_GET(it)->prev); } #endif - it->wd->items = eina_inlist_remove(it->wd->items, EINA_INLIST_GET(it)); if (it->parent) it->parent->items = eina_list_remove(it->parent->items, it); - if (it->flags & ELM_GENLIST_ITEM_GROUP) - it->wd->group_items = eina_list_remove(it->wd->group_items, it); - if (it->long_timer) ecore_timer_del(it->long_timer); if (it->swipe_timer) ecore_timer_del(it->swipe_timer); - - if (it->tooltip.del_cb) - it->tooltip.del_cb((void *)it->tooltip.data, WIDGET(it), it); - - evas_event_thaw(evas_object_evas_get(tob)); - evas_event_thaw_eval(evas_object_evas_get(tob)); - - elm_widget_item_del(it); + _elm_genlist_item_del_serious(it); + evas_event_thaw(evas_object_evas_get(obj)); + evas_event_thaw_eval(evas_object_evas_get(obj)); } static void @@ -941,7 +933,7 @@ call: it->wd->walking--; if ((it->wd->clear_me) && (!it->wd->walking)) { - elm_genlist_clear(parent); + _elm_genlist_clear(WIDGET(it), EINA_TRUE); goto end; } else @@ -982,82 +974,6 @@ _item_unselect(Elm_Genlist_Item *it) } } -static Evas_Object * -_item_content_get_hook(Elm_Genlist_Item *it, const char *part) -{ - return edje_object_part_swallow_get(VIEW(it), part); -} - -static void -_item_content_set_hook(Elm_Genlist_Item *it, const char *part, Evas_Object *content) -{ - edje_object_part_swallow(VIEW(it), part, content); -} - -static Evas_Object * -_item_content_unset_hook(Elm_Genlist_Item *it, const char *part) -{ - Evas_Object *obj; - - obj = edje_object_part_swallow_get(VIEW(it), part); - if (!obj) return NULL; - edje_object_part_unswallow(VIEW(it), obj); - return obj; -} - -static void -_item_disable_hook(Elm_Object_Item *it) -{ - ELM_OBJ_ITEM_CHECK_OR_RETURN(it); - Eina_List *l; - Evas_Object *obj; - Elm_Genlist_Item *_it = (Elm_Genlist_Item *) it; - - if (_it->delete_me) return; - - if (_it->selected) - elm_genlist_item_selected_set(it, EINA_FALSE); - - if (_it->realized) - { - if (elm_widget_item_disabled_get(it)) - edje_object_signal_emit(VIEW(_it), "elm,state,disabled", "elm"); - else - edje_object_signal_emit(VIEW(_it), "elm,state,enabled", "elm"); - EINA_LIST_FOREACH(_it->content_objs, l, obj) - elm_widget_disabled_set(obj, elm_widget_item_disabled_get(_it)); - } -} - -static Eina_Bool -_item_del_pre_hook(Elm_Object_Item *it) -{ - ELM_OBJ_ITEM_CHECK_OR_RETURN(it, EINA_FALSE); - Elm_Genlist_Item *_it = (Elm_Genlist_Item *) it; - - if ((_it->relcount > 0) || (_it->walking > 0)) - { - elm_genlist_item_subitems_clear(it); - if (_it->wd->show_item == _it) _it->wd->show_item = NULL; - if (_it->block) - { - if (_it->realized) _elm_genlist_item_unrealize(_it, EINA_FALSE); - _it->block->changed = EINA_TRUE; - if (_it->wd->calc_job) ecore_job_del(_it->wd->calc_job); - _it->wd->calc_job = ecore_job_add(_calc_job, _it->wd); - } - if (_it->parent) - { - _it->parent->items = - eina_list_remove(_it->parent->items, it); - _it->parent = NULL; - } - return EINA_FALSE; - } - _item_del(_it); - return EINA_TRUE; -} - static void _mouse_move(void *data, Evas *evas __UNUSED__, @@ -1200,7 +1116,7 @@ _long_press(void *data) Eina_List *list, *l; it->long_timer = NULL; - if ((it->disabled) || (it->dragging) || (it->display_only) || (it->wd->rename_it)) + if (elm_widget_item_disabled_get(it) || (it->dragging) || (it->display_only) || (it->wd->rename_it)) return ECORE_CALLBACK_CANCEL; it->wd->longpressed = EINA_TRUE; evas_object_smart_callback_call(WIDGET(it), SIG_LONGPRESSED, it); @@ -1252,7 +1168,7 @@ _swipe(Elm_Genlist_Item *it) int i, sum = 0; if (!it) return; - if ((it->display_only) || (it->disabled)) return; + if ((it->display_only) || elm_widget_item_disabled_get(it)) return; it->wd->swipe = EINA_FALSE; for (i = 0; i < it->wd->movements; i++) { @@ -1466,7 +1382,7 @@ _mouse_down(void *data, it->wd->wasselected = it->selected; _item_highlight(it); if (ev->flags & EVAS_BUTTON_DOUBLE_CLICK) - if ((!it->disabled) && (!it->display_only)) + if ((!elm_widget_item_disabled_get(it)) && (!it->display_only)) { evas_object_smart_callback_call(WIDGET(it), SIG_CLICKED_DOUBLE, it); evas_object_smart_callback_call(WIDGET(it), SIG_ACTIVATED, it); @@ -1576,7 +1492,8 @@ _mouse_up(void *data, _item_block_unrealize(it->block); } } - if ((it->disabled) || (dragged) || (it->display_only)) return; + if (elm_widget_item_disabled_get(it) || (dragged) || (it->display_only)) + return; if (ev->event_flags & EVAS_EVENT_FLAG_ON_HOLD) return; if (it->wd->multi) { @@ -1809,7 +1726,7 @@ _item_cache_add(Elm_Genlist_Item *it) itc->compress = (it->wd->compress); itc->odd = (it->order_num_in & 0x1); itc->selected = it->selected; - itc->disabled = it->disabled; + itc->disabled = elm_widget_item_disabled_get(it); itc->expanded = it->expanded; if (it->long_timer) { @@ -1874,22 +1791,6 @@ _item_cache_find(Elm_Genlist_Item *it) } static void -_item_cache_free(Item_Cache *itc) -{ - if (itc->spacer) evas_object_del(itc->spacer); - if (itc->base_view) evas_object_del(itc->base_view); - if (itc->item_style) eina_stringshare_del(itc->item_style); - free(itc); -} - -static const char * -_item_text_hook(Elm_Genlist_Item *it, const char *part) -{ - if (!it->itc->func.text_get) return NULL; - return edje_object_part_text_get(VIEW(it), part); -} - -static void _content_focused(void *data, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__) { Elm_Genlist_Item *it = data; @@ -1903,50 +1804,6 @@ _content_unfocused(void *data, Evas_Object *obj __UNUSED__, void *event_info __U if (it) it->defer_unrealize = EINA_FALSE; } -static void -_item_del_hook(void *data __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info) -{ - Elm_Genlist_Item *it = event_info; - if (!it) return; - if (it->selected) it->wd->selected = eina_list_remove(it->wd->selected, it); - if ((Elm_Genlist_Item *)it->wd->last_selected_item == it) - it->wd->last_selected_item = NULL; -} - -static void -_item_text_realize(Elm_Genlist_Item *it, - Evas_Object *target, - Eina_List **source, - const char *parts) -{ - if (it->itc->func.text_get) - { - const Eina_List *l; - const char *key; - - *source = elm_widget_stringlist_get(edje_object_data_get(target, "texts")); - EINA_LIST_FOREACH(*source, l, key) - { - if (parts && fnmatch(parts, key, FNM_PERIOD)) - continue; - - char *s = it->itc->func.text_get - ((void *)it->base.data, WIDGET(it), key); - - if (s) - { - edje_object_part_text_set(target, key, s); - free(s); - } - else - { - edje_object_part_text_set(target, key, ""); - } - - } - } -} - static Eina_List * _item_mode_content_unrealize(Elm_Genlist_Item *it, Evas_Object *target, @@ -2032,6 +1889,48 @@ _item_mode_content_realize(Elm_Genlist_Item *it, return res; } +static void +_item_cache_free(Item_Cache *itc) +{ + if (itc->spacer) evas_object_del(itc->spacer); + if (itc->base_view) evas_object_del(itc->base_view); + if (itc->item_style) eina_stringshare_del(itc->item_style); + free(itc); +} + +static void +_item_text_realize(Elm_Genlist_Item *it, + Evas_Object *target, + Eina_List **source, + const char *parts) +{ + if (it->itc->func.text_get) + { + const Eina_List *l; + const char *key; + + *source = elm_widget_stringlist_get(edje_object_data_get(target, "texts")); + EINA_LIST_FOREACH(*source, l, key) + { + if (parts && fnmatch(parts, key, FNM_PERIOD)) + continue; + + char *s = it->itc->func.text_get + ((void *)it->base.data, WIDGET(it), key); + + if (s) + { + edje_object_part_text_set(target, key, s); + free(s); + } + else + { + edje_object_part_text_set(target, key, ""); + } + } + } +} + static Eina_List * _item_content_unrealize(Elm_Genlist_Item *it, Evas_Object *target, @@ -2076,18 +1975,21 @@ _item_content_realize(Elm_Genlist_Item *it, { const Eina_List *l; const char *key; + Evas_Object *ic = NULL; *source = elm_widget_stringlist_get(edje_object_data_get(target, "contents")); + if (parts && (eina_list_count(*source) != eina_list_count(it->content_objs))) res = it->content_objs; + EINA_LIST_FOREACH(*source, l, key) { if (parts && fnmatch(parts, key, FNM_PERIOD)) continue; - Evas_Object *ic = it->itc->func.content_get - ((void *)it->base.data, WIDGET(it), key); - + if (it->itc->func.content_get) + ic = it->itc->func.content_get + ((void *)it->base.data, WIDGET(it), key); if (ic) { res = eina_list_append(res, ic); @@ -2095,7 +1997,7 @@ _item_content_realize(Elm_Genlist_Item *it, evas_object_show(ic); elm_widget_sub_object_add(WIDGET(it), ic); evas_object_event_callback_add(ic, EVAS_CALLBACK_CHANGED_SIZE_HINTS, _changed_size_hints, it); - if (it->disabled) + if (elm_widget_item_disabled_get(it)) elm_widget_disabled_set(ic, EINA_TRUE); } } @@ -2377,6 +2279,7 @@ _item_realize(Elm_Genlist_Item *it, it->tooltip.content_cb, it->tooltip.data, NULL); elm_widget_item_tooltip_style_set(it, it->tooltip.style); + //elm_widget_item_tooltip_window_mode_set(it, it->tooltip.free_size); //upstream } if (it->mouse_cursor) @@ -2722,7 +2625,7 @@ _item_block_position(Item_Block *itb, } else { - if (!it->dragging && (!it->wd->item_moving_effect_timer) || (it->wd->expanded_item->block != itb)) _item_unrealize(it, EINA_FALSE); + if ((!it->dragging && (!it->wd->item_moving_effect_timer)) || (it->wd->expanded_item->block != itb)) _item_unrealize(it, EINA_FALSE); } } in++; @@ -3429,39 +3332,39 @@ _scr_drag_stop(void *data, } static void -_scroll_edge_left(void *data, +_edge_left(void *data, Evas_Object *scr __UNUSED__, void *event_info __UNUSED__) { Evas_Object *obj = data; - evas_object_smart_callback_call(obj, SIG_SCROLL_EDGE_LEFT, NULL); + evas_object_smart_callback_call(obj, SIG_EDGE_LEFT, NULL); } static void -_scroll_edge_right(void *data, +_edge_right(void *data, Evas_Object *scr __UNUSED__, void *event_info __UNUSED__) { Evas_Object *obj = data; - evas_object_smart_callback_call(obj, SIG_SCROLL_EDGE_RIGHT, NULL); + evas_object_smart_callback_call(obj, SIG_EDGE_RIGHT, NULL); } static void -_scroll_edge_top(void *data, +_edge_top(void *data, Evas_Object *scr __UNUSED__, void *event_info __UNUSED__) { Evas_Object *obj = data; - evas_object_smart_callback_call(obj, SIG_SCROLL_EDGE_TOP, NULL); + evas_object_smart_callback_call(obj, SIG_EDGE_TOP, NULL); } static void -_scroll_edge_bottom(void *data, +_edge_bottom(void *data, Evas_Object *scr __UNUSED__, void *event_info __UNUSED__) { Evas_Object *obj = data; - evas_object_smart_callback_call(obj, SIG_SCROLL_EDGE_BOTTOM, NULL); + evas_object_smart_callback_call(obj, SIG_EDGE_BOTTOM, NULL); } static void @@ -3697,12 +3600,10 @@ elm_genlist_add(Evas_Object *parent) evas_object_smart_callback_add(wd->scr, "animate,stop", _scr_anim_stop, obj); evas_object_smart_callback_add(wd->scr, "drag,start", _scr_drag_start, obj); evas_object_smart_callback_add(wd->scr, "drag,stop", _scr_drag_stop, obj); - evas_object_smart_callback_add(wd->scr, "edge,left", _scroll_edge_left, obj); - evas_object_smart_callback_add(wd->scr, "edge,right", _scroll_edge_right, - obj); - evas_object_smart_callback_add(wd->scr, "edge,top", _scroll_edge_top, obj); - evas_object_smart_callback_add(wd->scr, "edge,bottom", _scroll_edge_bottom, - obj); + evas_object_smart_callback_add(wd->scr, "edge,left", _edge_left, obj); + evas_object_smart_callback_add(wd->scr, "edge,right", _edge_right, obj); + evas_object_smart_callback_add(wd->scr, "edge,top", _edge_top, obj); + evas_object_smart_callback_add(wd->scr, "edge,bottom", _edge_bottom, obj); wd->obj = obj; wd->mode = ELM_LIST_SCROLL; @@ -3729,65 +3630,179 @@ elm_genlist_add(Evas_Object *parent) evas_object_size_hint_min_set(obj, minw, minh); evas_object_smart_callbacks_descriptions_set(obj, _signals); + _mirrored_set(obj, elm_widget_mirrored_get(obj)); _sizing_eval(obj); return obj; } -static Elm_Genlist_Item * -_item_new(Widget_Data *wd, - const Elm_Genlist_Item_Class *itc, - const void *data, - Elm_Genlist_Item *parent, - Elm_Genlist_Item_Flags flags, - Evas_Smart_Cb func, - const void *func_data) +static Evas_Object * +_item_content_get_hook(Elm_Genlist_Item *it, const char *part) { - Elm_Genlist_Item *it, *it2; - int depth = 0; - - it = elm_widget_item_new(wd->obj, Elm_Genlist_Item); - if (!it) return NULL; - it->wd = wd; - it->itc = itc; - it->base.data = data; - it->parent = parent; - it->flags = flags; - it->func.func = func; - it->func.data = func_data; - it->mouse_cursor = NULL; - it->expanded_depth = 0; - it->can_focus = EINA_TRUE; - elm_widget_item_content_get_hook_set(it, _item_content_get_hook); - elm_widget_item_content_set_hook_set(it, _item_content_set_hook); - elm_widget_item_content_unset_hook_set(it, _item_content_unset_hook); - elm_widget_item_disable_hook_set(it, _item_disable_hook); -// elm_widget_item_del_pre_hook_set(it, _item_del_pre_hook); - elm_widget_item_text_get_hook_set(it, _item_text_hook); - elm_widget_item_del_cb_set(it, _item_del_hook); + return edje_object_part_swallow_get(VIEW(it), part); +} - if (it->parent) - { - if (it->parent->flags & ELM_GENLIST_ITEM_GROUP) - it->group_item = parent; - else if (it->parent->group_item) - it->group_item = it->parent->group_item; - } - for (it2 = it, depth = 0; it2->parent; it2 = it2->parent) +static void +_item_content_set_hook(Elm_Genlist_Item *it, const char *part, Evas_Object *content) +{ + if (content && part) { - if (it2->parent->flags != ELM_GENLIST_ITEM_GROUP) depth += 1; + it->content_objs = eina_list_append(it->content_objs, content); + edje_object_part_swallow(VIEW(it), part, content); } - it->expanded_depth = depth; - return it; } -static void -_item_block_add(Widget_Data *wd, - Elm_Genlist_Item *it) +static Evas_Object * +_item_content_unset_hook(Elm_Genlist_Item *it, const char *part) { - Item_Block *itb = NULL; + Evas_Object *obj; + obj = edje_object_part_swallow_get(VIEW(it), part); + if (!obj) return NULL; + it->content_objs = eina_list_remove(it->content_objs, obj); + edje_object_part_unswallow(VIEW(it), obj); + return obj; +} - if (!it->rel) +static const char * +_item_text_hook(Elm_Genlist_Item *it, const char *part) +{ + if (!it->itc->func.text_get) return NULL; + return edje_object_part_text_get(VIEW(it), part); +} + +static void +_item_disable_hook(Elm_Object_Item *it) +{ + ELM_OBJ_ITEM_CHECK_OR_RETURN(it); + Eina_List *l; + Evas_Object *obj; + Elm_Genlist_Item *_it = (Elm_Genlist_Item *) it; + + if (_it->delete_me) return; + + if (_it->selected) + elm_genlist_item_selected_set(it, EINA_FALSE); + + if (_it->realized) + { + if (elm_widget_item_disabled_get(it)) + { + edje_object_signal_emit(VIEW(_it), "elm,state,disabled", "elm"); + if (_it->edit_obj) + edje_object_signal_emit(_it->edit_obj, "elm,state,disabled", "elm"); + } + else + { + edje_object_signal_emit(VIEW(_it), "elm,state,enabled", "elm"); + if (_it->edit_obj) + edje_object_signal_emit(_it->edit_obj, "elm,state,enabled", "elm"); + } + EINA_LIST_FOREACH(_it->content_objs, l, obj) + elm_widget_disabled_set(obj, elm_widget_item_disabled_get(_it)); + } +} + +static Eina_Bool +_item_del_pre_hook(Elm_Object_Item *it) +{ + ELM_OBJ_ITEM_CHECK_OR_RETURN(it, EINA_FALSE); + Elm_Genlist_Item *_it = (Elm_Genlist_Item *) it; + + if ((_it->relcount > 0) || (_it->walking > 0)) + { + elm_genlist_item_subitems_clear(it); + if (_it->wd->show_item == _it) _it->wd->show_item = NULL; + _elm_genlist_item_del_notserious(_it); + if (_it->block) + { + if (_it->realized) _item_unrealize(_it, EINA_FALSE); + _it->block->changed = EINA_TRUE; + if (_it->wd->calc_job) ecore_job_del(_it->wd->calc_job); + _it->wd->calc_job = ecore_job_add(_calc_job, _it->wd); + } + if (_it->parent) + { + _it->parent->items = + eina_list_remove(_it->parent->items, it); + _it->parent = NULL; + } + return EINA_FALSE; + } + _item_del(_it); + return EINA_TRUE; +} + +Elm_Genlist_Item * +_elm_genlist_item_new(Widget_Data *wd, + const Elm_Genlist_Item_Class *itc, + const void *data, + Elm_Genlist_Item *parent, + Evas_Smart_Cb func, + const void *func_data) +{ + Elm_Genlist_Item *it; + + it = elm_widget_item_new(wd->obj, Elm_Genlist_Item); + if (!it) return NULL; + it->wd = wd; + //it->generation = wd->generation; //upstream + it->itc = itc; + it->base.data = data; + it->parent = parent; + it->func.func = func; + it->func.data = func_data; + elm_widget_item_content_get_hook_set(it, _item_content_get_hook); + elm_widget_item_content_set_hook_set(it, _item_content_set_hook); + elm_widget_item_content_unset_hook_set(it, _item_content_unset_hook); + elm_widget_item_disable_hook_set(it, _item_disable_hook); + elm_widget_item_del_pre_hook_set(it, _item_del_pre_hook); + /* TEMPORARY */ +// it->sel_cb = (Ecore_Cb)_item_select; + + elm_widget_item_text_get_hook_set(it, _item_text_hook); + return it; +} + +static Elm_Genlist_Item * +_item_new(Widget_Data *wd, + const Elm_Genlist_Item_Class *itc, + const void *data, + Elm_Genlist_Item *parent, + Elm_Genlist_Item_Flags flags, + Evas_Smart_Cb func, + const void *func_data) +{ + Elm_Genlist_Item *it, *it2; + int depth = 0; + + it = _elm_genlist_item_new(wd, itc, data, parent, func, func_data); + if (!it) return NULL; + it->flags = flags; + it->mouse_cursor = NULL; + it->expanded_depth = 0; + it->can_focus = EINA_TRUE; + if (it->parent) + { + if (it->parent->flags & ELM_GENLIST_ITEM_GROUP) + it->group_item = parent; + else if (it->parent->group_item) + it->group_item = it->parent->group_item; + } + for (it2 = it, depth = 0; it2->parent; it2 = it2->parent) + { + if (it2->parent->flags != ELM_GENLIST_ITEM_GROUP) depth += 1; + } + it->expanded_depth = depth; + return it; +} + +static void +_item_block_add(Widget_Data *wd, + Elm_Genlist_Item *it) +{ + Item_Block *itb = NULL; + + if (!it->rel) { newblock: if (it->rel) @@ -3933,16 +3948,18 @@ _queue_process(Widget_Data *wd) Eina_Bool showme = EINA_FALSE; double t0, t; - t0 = ecore_time_get(); + t0 = ecore_loop_time_get(); //evas_event_freeze(evas_object_evas_get(wd->obj)); for (n = 0; (wd->queue) && (n < 128); n++) { Elm_Genlist_Item *it; - it = wd->queue->data; + it = eina_list_data_get(wd->queue); wd->queue = eina_list_remove_list(wd->queue, wd->queue); it->queued = EINA_FALSE; _item_block_add(wd, it); + if (!wd->blocks) + _item_block_realize(it->block); t = ecore_time_get(); if (it->block->changed) { @@ -4172,15 +4189,15 @@ elm_genlist_item_insert_after(Evas_Object *obj, const void *func_data) { ELM_CHECK_WIDTYPE(obj, widtype) NULL; - EINA_SAFETY_ON_NULL_RETURN_VAL(after, NULL); + ELM_OBJ_ITEM_CHECK_OR_RETURN(after, NULL); Widget_Data *wd = elm_widget_data_get(obj); Elm_Genlist_Item *_after = (Elm_Genlist_Item *) after; if (!wd) return NULL; EINA_SAFETY_ON_NULL_RETURN_VAL(wd->items, NULL); + Elm_Genlist_Item *it = _item_new(wd, itc, data, (Elm_Genlist_Item *)parent, flags, func, func_data); if (!it) return NULL; - if (!it->parent) { if ((flags & ELM_GENLIST_ITEM_GROUP) && @@ -4213,16 +4230,16 @@ elm_genlist_item_insert_before(Evas_Object *obj, const void *func_data) { ELM_CHECK_WIDTYPE(obj, widtype) NULL; - EINA_SAFETY_ON_NULL_RETURN_VAL(before, NULL); + ELM_OBJ_ITEM_CHECK_OR_RETURN(before, NULL); Widget_Data *wd = elm_widget_data_get(obj); Elm_Genlist_Item *_before = (Elm_Genlist_Item *) before; if (!wd) return NULL; EINA_SAFETY_ON_NULL_RETURN_VAL(wd->items, NULL); + Elm_Genlist_Item *it = _item_new(wd, itc, data, (Elm_Genlist_Item *)parent, flags, func, func_data); if (!it) return NULL; - if (!it->parent) { if ((flags & ELM_GENLIST_ITEM_GROUP) && @@ -4244,8 +4261,8 @@ elm_genlist_item_insert_before(Evas_Object *obj, return (Elm_Object_Item *) it; } -EAPI void -elm_genlist_clear(Evas_Object *obj) +static void +_elm_genlist_clear(Evas_Object *obj, Eina_Bool standby) { ELM_CHECK_WIDTYPE(obj, widtype); Widget_Data *wd = elm_widget_data_get(obj); @@ -4285,7 +4302,7 @@ elm_genlist_clear(Evas_Object *obj) it->itc->func.del((void *)it->base.data, WIDGET(it)); if (it->long_timer) ecore_timer_del(it->long_timer); if (it->swipe_timer) ecore_timer_del(it->swipe_timer); - elm_widget_item_del(it); +// elm_widget_item_del(it); } wd->clear_me = EINA_FALSE; wd->anchor_item = NULL; @@ -4351,6 +4368,12 @@ elm_genlist_clear(Evas_Object *obj) } EAPI void +elm_genlist_clear(Evas_Object *obj) +{ + _elm_genlist_clear(obj, EINA_FALSE); +} + +EAPI void elm_genlist_multi_select_set(Evas_Object *obj, Eina_Bool multi) { @@ -4524,7 +4547,6 @@ elm_genlist_item_prev_get(const Elm_Object_Item *it) EAPI Evas_Object * elm_genlist_item_genlist_get(const Elm_Object_Item *it) { - ELM_OBJ_ITEM_CHECK_OR_RETURN(it, NULL); return elm_object_item_widget_get(it); } @@ -4602,7 +4624,8 @@ elm_genlist_item_selected_set(Elm_Object_Item *it, Elm_Genlist_Item *_it = (Elm_Genlist_Item *) it; Widget_Data *wd = elm_widget_data_get(WIDGET(_it)); if (!wd) return; - if ((_it->delete_me) || (_it->disabled)) return; + if ((_it->delete_me) || elm_widget_item_disabled_get(_it)) + return; selected = !!selected; if (_it->selected == selected) return; @@ -4637,9 +4660,8 @@ elm_genlist_item_expanded_set(Elm_Object_Item *it, if (_it->expanded == expanded) return; _it->expanded = expanded; _it->wd->expanded_item = _it; - if (_it->wd->effect_mode && !_it->wd->alpha_bg) - _it->wd->alpha_bg = _create_tray_alpha_bg(WIDGET(it)); + _it->wd->alpha_bg = _create_tray_alpha_bg(WIDGET(_it)); if (_it->expanded) { @@ -4647,8 +4669,8 @@ elm_genlist_item_expanded_set(Elm_Object_Item *it, _it->wd->expanded_move_effect_set = EINA_TRUE; _it->wd->expanded_next_item = (Elm_Genlist_Item *) elm_genlist_item_next_get(it); if (_it->realized) - edje_object_signal_emit(VIEW(it), "elm,state,expanded", "elm"); - evas_object_smart_callback_call(WIDGET(it), SIG_EXPANDED, _it); + edje_object_signal_emit(VIEW(_it), "elm,state,expanded", "elm"); + evas_object_smart_callback_call(WIDGET(_it), SIG_EXPANDED, _it); _it->wd->auto_scroll_enabled = EINA_TRUE; } else @@ -4656,8 +4678,8 @@ elm_genlist_item_expanded_set(Elm_Object_Item *it, _it->wd->move_effect_mode = ELM_GENLIST_ITEM_MOVE_EFFECT_CONTRACT; _it->wd->expanded_next_item = NULL; if (_it->realized) - edje_object_signal_emit(VIEW(it), "elm,state,contracted", "elm"); - evas_object_smart_callback_call(WIDGET(it), SIG_CONTRACTED, _it); + edje_object_signal_emit(VIEW(_it), "elm,state,contracted", "elm"); + evas_object_smart_callback_call(WIDGET(_it), SIG_CONTRACTED, _it); _it->wd->auto_scroll_enabled = EINA_FALSE; } } @@ -4680,40 +4702,14 @@ EAPI void elm_genlist_item_disabled_set(Elm_Object_Item *it, Eina_Bool disabled) { - ELM_OBJ_ITEM_CHECK_OR_RETURN(it); - Eina_List *l; - Evas_Object *obj; - Elm_Genlist_Item *_it = (Elm_Genlist_Item *) it; - if (_it->disabled == disabled) return; - if (_it->delete_me) return; - _it->disabled = !!disabled; - if (_it->selected) - elm_genlist_item_selected_set(it, EINA_FALSE); - if (_it->realized) - { - if (_it->disabled) - { - edje_object_signal_emit(VIEW(_it), "elm,state,disabled", "elm"); - if (_it->edit_obj) - edje_object_signal_emit(_it->edit_obj, "elm,state,disabled", "elm"); - } - else - { - edje_object_signal_emit(VIEW(_it), "elm,state,enabled", "elm"); - if (_it->edit_obj) - edje_object_signal_emit(_it->edit_obj, "elm,state,enabled", "elm"); - } - EINA_LIST_FOREACH(_it->content_objs, l, obj) - elm_widget_disabled_set(obj, disabled); - } + elm_object_item_disabled_set(it, disabled); } EAPI Eina_Bool elm_genlist_item_disabled_get(const Elm_Object_Item *it) { - ELM_OBJ_ITEM_CHECK_OR_RETURN(it, EINA_FALSE); if (((Elm_Genlist_Item *) it)->delete_me) return EINA_FALSE; - return ((Elm_Genlist_Item *) it)->disabled; + return elm_object_item_disabled_get(it); } EAPI void @@ -4722,7 +4718,8 @@ elm_genlist_item_display_only_set(Elm_Object_Item *it, { ELM_OBJ_ITEM_CHECK_OR_RETURN(it); Elm_Genlist_Item *_it = (Elm_Genlist_Item *) it; - if (_it->display_only == display_only) return; + display_only = !!display_only; +if (_it->display_only == display_only) return; if (_it->delete_me) return; _it->display_only = display_only; _it->mincalcd = EINA_FALSE; @@ -4945,51 +4942,28 @@ elm_genlist_item_middle_bring_in(Elm_Object_Item *it) EAPI void elm_genlist_item_del(Elm_Object_Item *it) { - ELM_OBJ_ITEM_CHECK_OR_RETURN(it); - Elm_Genlist_Item *_it = (Elm_Genlist_Item *) it; - if ((_it->relcount > 0) || (_it->walking > 0)) - { - elm_widget_item_pre_notify_del(_it); - elm_genlist_item_subitems_clear(it); - _it->delete_me = EINA_TRUE; - if (_it->wd->show_item == _it) _it->wd->show_item = NULL; - if (_it->selected) - _it->wd->selected = eina_list_remove(_it->wd->selected, - _it); - if (_it->block) - { - if (_it->realized) _item_unrealize(_it, EINA_FALSE); - _it->block->changed = EINA_TRUE; - if (_it->wd->calc_job) ecore_job_del(_it->wd->calc_job); - _it->wd->calc_job = ecore_job_add(_calc_job, _it->wd); - } - if (_it->itc->func.del) - _it->itc->func.del((void *)_it->base.data, WIDGET(_it)); - return; - } - _item_del(_it); + elm_object_item_del(it); } EAPI void elm_genlist_item_data_set(Elm_Object_Item *it, const void *data) { - ELM_OBJ_ITEM_CHECK_OR_RETURN(it); - elm_widget_item_data_set(it, data); + elm_object_item_data_set(it, (void *) data); } EAPI void * elm_genlist_item_data_get(const Elm_Object_Item *it) { - ELM_OBJ_ITEM_CHECK_OR_RETURN(it, NULL); - return elm_widget_item_data_get(it); + return elm_object_item_data_get(it); } EAPI void elm_genlist_item_contents_orphan(Elm_Object_Item *it) { - Evas_Object *content; ELM_OBJ_ITEM_CHECK_OR_RETURN(it); + + Evas_Object *content; EINA_LIST_FREE(((Elm_Genlist_Item *) it)->content_objs, content) { elm_widget_sub_object_del(WIDGET(it), content); @@ -5010,6 +4984,7 @@ elm_genlist_item_update(Elm_Object_Item *it) { ELM_OBJ_ITEM_CHECK_OR_RETURN(it); Elm_Genlist_Item *_it = (Elm_Genlist_Item *) it; + if (!_it->block) return; if (_it->delete_me) return; _it->mincalcd = EINA_FALSE; @@ -5027,6 +5002,7 @@ elm_genlist_item_fields_update(Elm_Object_Item *it, { ELM_OBJ_ITEM_CHECK_OR_RETURN(it); Elm_Genlist_Item *_it = (Elm_Genlist_Item *) it; + if (!_it->block) return; if (_it->delete_me) return; @@ -5086,14 +5062,16 @@ EAPI const Elm_Genlist_Item_Class * elm_genlist_item_item_class_get(const Elm_Object_Item *it) { ELM_OBJ_ITEM_CHECK_OR_RETURN(it, NULL); - if (((Elm_Genlist_Item *) it)->delete_me) return NULL; - return ((Elm_Genlist_Item *) it)->itc; + Elm_Genlist_Item *_it = (Elm_Genlist_Item *) it; + if (_it->delete_me) return NULL; + return _it->itc; } + static Evas_Object * _elm_genlist_item_label_create(void *data, Evas_Object *obj __UNUSED__, Evas_Object *tooltip, - void *item __UNUSED__) + void *it __UNUSED__) { Evas_Object *label = elm_label_add(tooltip); if (!label) @@ -5135,8 +5113,7 @@ elm_genlist_item_tooltip_content_cb_set(Elm_Object_Item *it, return; if (_it->tooltip.del_cb) - _it->tooltip.del_cb((void *)_it->tooltip.data, - _it->base.widget, it); + _it->tooltip.del_cb((void *) _it->tooltip.data, WIDGET(it), it); _it->tooltip.content_cb = func; _it->tooltip.data = data; @@ -5147,7 +5124,8 @@ elm_genlist_item_tooltip_content_cb_set(Elm_Object_Item *it, elm_widget_item_tooltip_content_cb_set(_it, _it->tooltip.content_cb, _it->tooltip.data, NULL); - elm_widget_item_tooltip_style_set(it, _it->tooltip.style); + elm_widget_item_tooltip_style_set(_it, _it->tooltip.style); + //elm_widget_item_tooltip_window_mode_set(_it, _it->tooltip.free_size); //upstream } return; @@ -5161,14 +5139,16 @@ elm_genlist_item_tooltip_unset(Elm_Object_Item *it) { ELM_OBJ_ITEM_CHECK_OR_RETURN(it); Elm_Genlist_Item *_it = (Elm_Genlist_Item *) it; - if ((_it->base.view) && (_it->tooltip.content_cb)) + + if ((VIEW(_it)) && (_it->tooltip.content_cb)) elm_widget_item_tooltip_unset(_it); if (_it->tooltip.del_cb) - _it->tooltip.del_cb((void *)_it->tooltip.data, _it->base.widget, _it); + _it->tooltip.del_cb((void *)_it->tooltip.data, WIDGET(_it), _it); _it->tooltip.del_cb = NULL; _it->tooltip.content_cb = NULL; _it->tooltip.data = NULL; + //_it->tooltip.free_size = EINA_FALSE; //upstream if (_it->tooltip.style) elm_genlist_item_tooltip_style_set(it, NULL); } @@ -5179,31 +5159,33 @@ elm_genlist_item_tooltip_style_set(Elm_Object_Item *it, { ELM_OBJ_ITEM_CHECK_OR_RETURN(it); Elm_Genlist_Item *_it = (Elm_Genlist_Item *) it; + eina_stringshare_replace(&_it->tooltip.style, style); - if (_it->base.view) elm_widget_item_tooltip_style_set(it, style); + if (VIEW(_it)) elm_widget_item_tooltip_style_set(_it, style); } EAPI const char * elm_genlist_item_tooltip_style_get(const Elm_Object_Item *it) { - ELM_OBJ_ITEM_CHECK_OR_RETURN(it, NULL); - return ((Elm_Genlist_Item *) it)->tooltip.style; + return elm_object_item_tooltip_style_get(it); } EAPI Eina_Bool -elm_genlist_item_tooltip_size_restrict_disable(Elm_Object_Item *it, Eina_Bool disable) +elm_genlist_item_tooltip_window_mode_set(Elm_Object_Item *it, + Eina_Bool disable) { ELM_OBJ_ITEM_CHECK_OR_RETURN(it, EINA_FALSE); - // return elm_widget_item_tooltip_size_restrict_disable(it, disable); - return EINA_FALSE; + Elm_Genlist_Item *_it = (Elm_Genlist_Item *) it; + +// _it->tooltip.free_size = disable; //temp + if (VIEW(_it)) return elm_widget_item_tooltip_window_mode_set(_it, disable); + return EINA_TRUE; } EAPI Eina_Bool -elm_genlist_item_tooltip_size_restrict_disabled_get(const Elm_Object_Item *it) +elm_genlist_item_tooltip_window_mode_get(const Elm_Object_Item *it) { - ELM_OBJ_ITEM_CHECK_OR_RETURN(it, EINA_FALSE); - //return elm_widget_item_tooltip_size_restrict_disabled_get(it); - return EINA_FALSE; + return elm_object_tooltip_window_mode_get(VIEW(it)); } EAPI void @@ -5213,7 +5195,7 @@ elm_genlist_item_cursor_set(Elm_Object_Item *it, ELM_OBJ_ITEM_CHECK_OR_RETURN(it); Elm_Genlist_Item *_it = (Elm_Genlist_Item *) it; eina_stringshare_replace(&_it->mouse_cursor, cursor); - if (_it->base.view) elm_widget_item_cursor_set(it, cursor); + if (VIEW(_it)) elm_widget_item_cursor_set(it, cursor); } EAPI const char * @@ -5229,11 +5211,9 @@ elm_genlist_item_cursor_unset(Elm_Object_Item *it) ELM_OBJ_ITEM_CHECK_OR_RETURN(it); Elm_Genlist_Item *_it = (Elm_Genlist_Item *) it; - if (!_it->mouse_cursor) - return; + if (!_it->mouse_cursor) return; - if (VIEW(_it)) - elm_widget_item_cursor_unset(_it); + if (VIEW(_it)) elm_widget_item_cursor_unset(_it); eina_stringshare_del(_it->mouse_cursor); _it->mouse_cursor = NULL; @@ -5269,8 +5249,19 @@ elm_genlist_item_cursor_engine_only_get(const Elm_Object_Item *it) return elm_widget_item_cursor_engine_only_get(it); } +EAPI int +elm_genlist_item_index_get(Elm_Object_Item *it) +{ + ELM_OBJ_ITEM_CHECK_OR_RETURN(it, -1); + Elm_Genlist_Item *_it = (Elm_Genlist_Item *) it; + + if (_it->block) + return 0; //_it->position + _it->block->position; //upstream + return -1; +} + EAPI void -elm_genlist_horizontal_mode_set(Evas_Object *obj, +elm_genlist_mode_set(Evas_Object *obj, Elm_List_Mode mode) { ELM_CHECK_WIDTYPE(obj, widtype); @@ -5281,8 +5272,22 @@ elm_genlist_horizontal_mode_set(Evas_Object *obj, _sizing_eval(obj); } +EAPI void +elm_genlist_horizontal_set(Evas_Object *obj, + Elm_List_Mode mode) +{ + elm_genlist_mode_set(obj, mode); +} + +EAPI void +elm_genlist_horizontal_mode_set(Evas_Object *obj, + Elm_List_Mode mode) +{ + elm_genlist_mode_set(obj, mode); +} + EAPI Elm_List_Mode -elm_genlist_horizontal_mode_get(const Evas_Object *obj) +elm_genlist_mode_get(const Evas_Object *obj) { ELM_CHECK_WIDTYPE(obj, widtype) ELM_LIST_LAST; Widget_Data *wd = elm_widget_data_get(obj); @@ -5290,6 +5295,18 @@ elm_genlist_horizontal_mode_get(const Evas_Object *obj) return wd->mode; } +EAPI Elm_List_Mode +elm_genlist_horizontal_get(const Evas_Object *obj) +{ + return elm_genlist_mode_get(obj); +} + +EAPI Elm_List_Mode +elm_genlist_horizontal_mode_get(const Evas_Object *obj) +{ + return elm_genlist_mode_get(obj); +} + EAPI void elm_genlist_always_select_mode_set(Evas_Object *obj, Eina_Bool always_select) @@ -5336,6 +5353,7 @@ elm_genlist_compress_mode_set(Evas_Object *obj, Widget_Data *wd = elm_widget_data_get(obj); if (!wd) return; wd->compress = compress; + if (!compress) elm_genlist_homogeneous_set(obj, EINA_FALSE); } EAPI Eina_Bool @@ -5501,13 +5519,15 @@ elm_genlist_item_mode_set(Elm_Object_Item *it, { ELM_OBJ_ITEM_CHECK_OR_RETURN(it); Elm_Genlist_Item *_it = (Elm_Genlist_Item *) it; + Widget_Data *wd = _it->wd; Eina_List *l; Elm_Object_Item *it2; if (!wd) return; if (!mode_type) return; - if ((_it->delete_me) || (_it->disabled)) return; + if ((_it->delete_me) || + elm_widget_item_disabled_get(_it)) return; if (wd->edit_mode) return; if ((wd->mode_item == _it) && @@ -5538,6 +5558,7 @@ elm_genlist_item_mode_set(Elm_Object_Item *it, if (mode_set) _item_mode_set(_it); } + EAPI const char * elm_genlist_mode_item_style_get(const Evas_Object *obj) { @@ -5562,7 +5583,7 @@ elm_genlist_mode_item_style_set(Evas_Object *obj, const char *style) } EAPI const char * -elm_genlist_mode_get(const Evas_Object *obj) +elm_genlist_mode_type_get(const Evas_Object *obj) { ELM_CHECK_WIDTYPE(obj, widtype) NULL; Widget_Data *wd = elm_widget_data_get(obj); @@ -5598,14 +5619,189 @@ elm_genlist_reorder_mode_get(const Evas_Object *obj) return wd->reorder_mode; } -EAPI void -elm_genlist_item_move_after(Elm_Object_Item *it __UNUSED__, Elm_Object_Item *after __UNUSED__) +/* for gengrid as of now */ +void +_elm_genlist_page_relative_set(Evas_Object *obj, + double h_pagerel, + double v_pagerel) { - return; -} + Evas_Coord pagesize_h; + Evas_Coord pagesize_v; -EAPI void -elm_genlist_item_move_before(Elm_Object_Item *it __UNUSED__, Elm_Object_Item *before __UNUSED__) + ELM_CHECK_WIDTYPE(obj, widtype); + Widget_Data *wd = elm_widget_data_get(obj); + if (!wd) return; + + elm_smart_scroller_paging_get(wd->scr, NULL, NULL, &pagesize_h, &pagesize_v); + elm_smart_scroller_paging_set(wd->scr, h_pagerel, v_pagerel, pagesize_h, + pagesize_v); +} + +/* for gengrid as of now */ +void +_elm_genlist_page_relative_get(const Evas_Object *obj, + double *h_pagerel, + double *v_pagerel) +{ + ELM_CHECK_WIDTYPE(obj, widtype); + Widget_Data *wd = elm_widget_data_get(obj); + if (!wd) return; + + elm_smart_scroller_paging_get(wd->scr, h_pagerel, v_pagerel, NULL, NULL); +} + +/* for gengrid as of now */ +void +_elm_genlist_page_size_set(Evas_Object *obj, + Evas_Coord h_pagesize, + Evas_Coord v_pagesize) +{ + double pagerel_h; + double pagerel_v; + + ELM_CHECK_WIDTYPE(obj, widtype); + Widget_Data *wd = elm_widget_data_get(obj); + if (!wd) return; + elm_smart_scroller_paging_get(wd->scr, &pagerel_h, &pagerel_v, NULL, NULL); + elm_smart_scroller_paging_set(wd->scr, pagerel_h, pagerel_v, h_pagesize, + v_pagesize); +} + +/* for gengrid as of now */ +void +_elm_genlist_current_page_get(const Evas_Object *obj, + int *h_pagenumber, + int *v_pagenumber) +{ + ELM_CHECK_WIDTYPE(obj, widtype); + Widget_Data *wd = elm_widget_data_get(obj); + if (!wd) return; + if (wd->scr) + elm_smart_scroller_current_page_get(wd->scr, h_pagenumber, v_pagenumber); +} + +/* for gengrid as of now */ +void +_elm_genlist_last_page_get(const Evas_Object *obj, + int *h_pagenumber, + int *v_pagenumber) +{ + ELM_CHECK_WIDTYPE(obj, widtype); + Widget_Data *wd = elm_widget_data_get(obj); + if (!wd) return; + if (wd->scr) + elm_smart_scroller_last_page_get(wd->scr, h_pagenumber, v_pagenumber); +} + +/* for gengrid as of now */ +void +_elm_genlist_page_show(const Evas_Object *obj, + int h_pagenumber, + int v_pagenumber) +{ + ELM_CHECK_WIDTYPE(obj, widtype); + Widget_Data *wd = elm_widget_data_get(obj); + if (!wd) return; + if (wd->scr) + elm_smart_scroller_page_show(wd->scr, h_pagenumber, v_pagenumber); +} + +/* for gengrid as of now */ +void +_elm_genlist_page_bring_in(const Evas_Object *obj, + int h_pagenumber, + int v_pagenumber) +{ + ELM_CHECK_WIDTYPE(obj, widtype); + Widget_Data *wd = elm_widget_data_get(obj); + if (!wd) return; + if (wd->scr) + elm_smart_scroller_page_bring_in(wd->scr, h_pagenumber, v_pagenumber); +} + +void +_elm_genlist_item_unrealize(Elm_Genlist_Item *it, + Eina_Bool calc) +{ + Evas_Object *content; + + if (!it->realized) return; + if (it->wd->reorder_it == it) return; + evas_event_freeze(evas_object_evas_get(WIDGET(it))); + if (!calc) + evas_object_smart_callback_call(WIDGET(it), SIG_UNREALIZED, it); + if (it->long_timer) + { + ecore_timer_del(it->long_timer); + it->long_timer = NULL; + } + + elm_widget_stringlist_free(it->texts); + it->texts = NULL; + elm_widget_stringlist_free(it->contents); + it->contents = NULL; + elm_widget_stringlist_free(it->states); + it->states = NULL; + + EINA_LIST_FREE(it->content_objs, content) + evas_object_del(content); + + _item_unrealize(it, EINA_FALSE);//it->unrealize_cb(it); //upstream + + it->realized = EINA_FALSE; + it->want_unrealize = EINA_FALSE; + evas_event_thaw(evas_object_evas_get(WIDGET(it))); + evas_event_thaw_eval(evas_object_evas_get(WIDGET(it))); +} + +void +_elm_genlist_item_del_notserious(Elm_Genlist_Item *it) +{ + elm_widget_item_pre_notify_del(it); + it->delete_me = EINA_TRUE; + //it->generation = it->wd->generation - 1; /* This means that the item is deleted */ //upstream + if (it->selected) it->wd->selected = eina_list_remove(it->wd->selected, it); + + if (it->itc->func.del) + it->itc->func.del((void *)it->base.data, WIDGET(it)); +} + +void +_elm_genlist_item_del_serious(Elm_Genlist_Item *it) +{ + _elm_genlist_item_del_notserious(it); + it->wd->items = eina_inlist_remove(it->wd->items, EINA_INLIST_GET(it)); + if (it->tooltip.del_cb) + it->tooltip.del_cb((void *)it->tooltip.data, WIDGET(it), it); + it->wd->walking -= it->walking; + if (it->long_timer) ecore_timer_del(it->long_timer); + if (it->flags & ELM_GENLIST_ITEM_GROUP) + it->wd->group_items = eina_list_remove(it->wd->group_items, it); + +/* + if (it->wd->state) + { + eina_inlist_sorted_state_free(it->wd->state); + it->wd->state = NULL; + } +*/ + if (it->wd->calc_job) ecore_job_del(it->wd->calc_job); + it->wd->calc_job = ecore_job_add(_calc_job, it->wd); + //free(it->item); //temp + + //it->item = NULL; //temp + if (it->wd->last_selected_item == (Elm_Object_Item *) it) + it->wd->last_selected_item = NULL; +} + +EAPI void +elm_genlist_item_move_after(Elm_Object_Item *it __UNUSED__, Elm_Object_Item *after __UNUSED__) +{ + return; +} + +EAPI void +elm_genlist_item_move_before(Elm_Object_Item *it __UNUSED__, Elm_Object_Item *before __UNUSED__) { return; } @@ -6208,208 +6404,3 @@ elm_genlist_item_no_select_mode_get(const Elm_Object_Item *it) ELM_OBJ_ITEM_CHECK_OR_RETURN(it, EINA_FALSE); return ((Elm_Genlist_Item *) it)->no_select; } - -void -_elm_genlist_item_del_notserious(Elm_Genlist_Item *it) -{ - elm_widget_item_pre_notify_del(it); - if (it->selected) it->wd->selected = eina_list_remove(it->wd->selected, it); - - if (it->itc->func.del) - it->itc->func.del((void *)it->base.data, WIDGET(it)); -} - -void -_elm_genlist_item_del_serious(Elm_Genlist_Item *it) -{ - _elm_genlist_item_del_notserious(it); - it->wd->items = eina_inlist_remove(it->wd->items, EINA_INLIST_GET(it)); - if (it->tooltip.del_cb) - it->tooltip.del_cb((void *)it->tooltip.data, WIDGET(it), it); - it->wd->walking -= it->walking; - if (it->long_timer) ecore_timer_del(it->long_timer); - if (it->flags & ELM_GENLIST_ITEM_GROUP) - it->wd->group_items = eina_list_remove(it->wd->group_items, it); - -/* - if (it->wd->state) - { - eina_inlist_sorted_state_free(it->wd->state); - it->wd->state = NULL; - } -*/ - if (it->wd->calc_job) ecore_job_del(it->wd->calc_job); - it->wd->calc_job = ecore_job_add(_calc_job, it->wd); - - elm_genlist_item_del((Elm_Object_Item *) it); - if (it->wd->last_selected_item == (Elm_Object_Item *) it) - it->wd->last_selected_item = NULL; -} - - -/* for gengrid as of now */ -void -_elm_genlist_current_page_get(const Evas_Object *obj, - int *h_pagenumber, - int *v_pagenumber) -{ - ELM_CHECK_WIDTYPE(obj, widtype); - Widget_Data *wd = elm_widget_data_get(obj); - if (!wd) return; - if (wd->scr) - elm_smart_scroller_current_page_get(wd->scr, h_pagenumber, v_pagenumber); -} - -/* for gengrid as of now */ -void -_elm_genlist_last_page_get(const Evas_Object *obj, - int *h_pagenumber, - int *v_pagenumber) -{ - ELM_CHECK_WIDTYPE(obj, widtype); - Widget_Data *wd = elm_widget_data_get(obj); - if (!wd) return; - if (wd->scr) - elm_smart_scroller_last_page_get(wd->scr, h_pagenumber, v_pagenumber); -} - -/* for gengrid as of now */ -void -_elm_genlist_page_show(const Evas_Object *obj, - int h_pagenumber, - int v_pagenumber) -{ - ELM_CHECK_WIDTYPE(obj, widtype); - Widget_Data *wd = elm_widget_data_get(obj); - if (!wd) return; - if (wd->scr) - elm_smart_scroller_page_show(wd->scr, h_pagenumber, v_pagenumber); -} - -/* for gengrid as of now */ -void -_elm_genlist_page_bring_in(const Evas_Object *obj, - int h_pagenumber, - int v_pagenumber) -{ - ELM_CHECK_WIDTYPE(obj, widtype); - Widget_Data *wd = elm_widget_data_get(obj); - if (!wd) return; - if (wd->scr) - elm_smart_scroller_page_bring_in(wd->scr, h_pagenumber, v_pagenumber); -} - -/* for gengrid as of now */ -void -_elm_genlist_page_relative_set(Evas_Object *obj, - double h_pagerel, - double v_pagerel) -{ - Evas_Coord pagesize_h; - Evas_Coord pagesize_v; - - ELM_CHECK_WIDTYPE(obj, widtype); - Widget_Data *wd = elm_widget_data_get(obj); - if (!wd) return; - - elm_smart_scroller_paging_get(wd->scr, NULL, NULL, &pagesize_h, &pagesize_v); - elm_smart_scroller_paging_set(wd->scr, h_pagerel, v_pagerel, pagesize_h, - pagesize_v); -} - -/* for gengrid as of now */ -void -_elm_genlist_page_relative_get(const Evas_Object *obj, - double *h_pagerel, - double *v_pagerel) -{ - ELM_CHECK_WIDTYPE(obj, widtype); - Widget_Data *wd = elm_widget_data_get(obj); - if (!wd) return; - - elm_smart_scroller_paging_get(wd->scr, h_pagerel, v_pagerel, NULL, NULL); -} - -/* for gengrid as of now */ -void -_elm_genlist_page_size_set(Evas_Object *obj, - Evas_Coord h_pagesize, - Evas_Coord v_pagesize) -{ - double pagerel_h; - double pagerel_v; - - ELM_CHECK_WIDTYPE(obj, widtype); - Widget_Data *wd = elm_widget_data_get(obj); - if (!wd) return; - elm_smart_scroller_paging_get(wd->scr, &pagerel_h, &pagerel_v, NULL, NULL); - elm_smart_scroller_paging_set(wd->scr, pagerel_h, pagerel_v, h_pagesize, - v_pagesize); -} - -Elm_Genlist_Item * -_elm_genlist_item_new(Widget_Data *wd, - const Elm_Genlist_Item_Class *itc, - const void *data, - Elm_Genlist_Item *parent, - Evas_Smart_Cb func, - const void *func_data) -{ - Elm_Genlist_Item *it; - - it = elm_widget_item_new(wd->obj, Elm_Genlist_Item); - if (!it) return NULL; - it->wd = wd; - it->itc = itc; - it->base.data = data; - it->parent = parent; - it->func.func = func; - it->func.data = func_data; - elm_widget_item_content_get_hook_set(it, _item_content_get_hook); - elm_widget_item_content_set_hook_set(it, _item_content_set_hook); - elm_widget_item_content_unset_hook_set(it, _item_content_unset_hook); - elm_widget_item_disable_hook_set(it, _item_disable_hook); -// elm_widget_item_del_pre_hook_set(it, _item_del_pre_hook); - /* TEMPORARY */ -// it->sel_cb = (Ecore_Cb)_item_select; - - elm_widget_item_text_get_hook_set(it, _item_text_hook); - return it; -} - -void -_elm_genlist_item_unrealize(Elm_Genlist_Item *it, - Eina_Bool calc) -{ - Evas_Object *content; - - if (!it->realized) return; - if (it->wd->reorder_it == it) return; - evas_event_freeze(evas_object_evas_get(WIDGET(it))); - if (!calc) - evas_object_smart_callback_call(WIDGET(it), SIG_UNREALIZED, it); - if (it->long_timer) - { - ecore_timer_del(it->long_timer); - it->long_timer = NULL; - } - - elm_widget_stringlist_free(it->texts); - it->texts = NULL; - elm_widget_stringlist_free(it->contents); - it->contents = NULL; - elm_widget_stringlist_free(it->states); - it->states = NULL; - - EINA_LIST_FREE(it->content_objs, content) - evas_object_del(content); - - //it->unrealize_cb(it); - _item_unrealize(it, EINA_FALSE); - - it->realized = EINA_FALSE; - it->want_unrealize = EINA_FALSE; - evas_event_thaw(evas_object_evas_get(WIDGET(it))); - evas_event_thaw_eval(evas_object_evas_get(WIDGET(it))); -} - diff --git a/src/lib/elm_genlist.h b/src/lib/elm_genlist.h index b796979..0cb3670 100644 --- a/src/lib/elm_genlist.h +++ b/src/lib/elm_genlist.h @@ -1,343 +1,352 @@ - /** - * @defgroup Genlist Genlist - * - * @image html img/widget/genlist/preview-00.png - * @image latex img/widget/genlist/preview-00.eps - * @image html img/genlist.png - * @image latex img/genlist.eps - * - * This widget aims to have more expansive list than the simple list in - * Elementary that could have more flexible items and allow many more entries - * while still being fast and low on memory usage. At the same time it was - * also made to be able to do tree structures. But the price to pay is more - * complexity when it comes to usage. If all you want is a simple list with - * icons and a single label, use the normal @ref List object. - * - * Genlist has a fairly large API, mostly because it's relatively complex, - * trying to be both expansive, powerful and efficient. First we will begin - * an overview on the theory behind genlist. - * - * @section Genlist_Item_Class Genlist item classes - creating items - * - * In order to have the ability to add and delete items on the fly, genlist - * implements a class (callback) system where the application provides a - * structure with information about that type of item (genlist may contain - * multiple different items with different classes, states and styles). - * Genlist will call the functions in this struct (methods) when an item is - * "realized" (i.e., created dynamically, while the user is scrolling the - * grid). All objects will simply be deleted when no longer needed with - * evas_object_del(). The #Elm_Genlist_Item_Class structure contains the - * following members: - * - @c item_style - This is a constant string and simply defines the name - * of the item style. It @b must be specified and the default should be @c - * "default". - * - * - @c func - A struct with pointers to functions that will be called when - * an item is going to be actually created. All of them receive a @c data - * parameter that will point to the same data passed to - * elm_genlist_item_append() and related item creation functions, and a @c - * obj parameter that points to the genlist object itself. - * - * The function pointers inside @c func are @c text_get, @c content_get, @c - * state_get and @c del. The 3 first functions also receive a @c part - * parameter described below. A brief description of these functions follows: - * - * - @c text_get - The @c part parameter is the name string of one of the - * existing text parts in the Edje group implementing the item's theme. - * This function @b must return a strdup'()ed string, as the caller will - * free() it when done. See #Elm_Genlist_Item_text_get_Cb. - * - @c content_get - The @c part parameter is the name string of one of the - * existing (content) swallow parts in the Edje group implementing the item's - * theme. It must return @c NULL, when no content is desired, or a valid - * object handle, otherwise. The object will be deleted by the genlist on - * its deletion or when the item is "unrealized". See - * #Elm_Genlist_Item_Content_Get_Cb. - * - @c func.state_get - The @c part parameter is the name string of one of - * the state parts in the Edje group implementing the item's theme. Return - * @c EINA_FALSE for false/off or @c EINA_TRUE for true/on. Genlists will - * emit a signal to its theming Edje object with @c "elm,state,XXX,active" - * and @c "elm" as "emission" and "source" arguments, respectively, when - * the state is true (the default is false), where @c XXX is the name of - * the (state) part. See #Elm_Genlist_Item_State_Get_Cb. - * - @c func.del - This is intended for use when genlist items are deleted, - * so any data attached to the item (e.g. its data parameter on creation) - * can be deleted. See #Elm_Genlist_Item_Del_Cb. - * - * available item styles: - * - default - * - default_style - The text part is a textblock - * - * @image html img/widget/genlist/preview-04.png - * @image latex img/widget/genlist/preview-04.eps - * - * - double_label - * - * @image html img/widget/genlist/preview-01.png - * @image latex img/widget/genlist/preview-01.eps - * - * - icon_top_text_bottom - * - * @image html img/widget/genlist/preview-02.png - * @image latex img/widget/genlist/preview-02.eps - * - * - group_index - * - * @image html img/widget/genlist/preview-03.png - * @image latex img/widget/genlist/preview-03.eps - * - * @section Genlist_Items Structure of items - * - * An item in a genlist can have 0 or more texts (they can be regular - * text or textblock Evas objects - that's up to the style to determine), 0 - * or more contents (which are simply objects swallowed into the genlist item's - * theming Edje object) and 0 or more boolean states, which have the - * behavior left to the user to define. The Edje part names for each of - * these properties will be looked up, in the theme file for the genlist, - * under the Edje (string) data items named @c "texts", @c "contents" and @c - * "states", respectively. For each of those properties, if more than one - * part is provided, they must have names listed separated by spaces in the - * data fields. For the default genlist item theme, we have @b one text - * part (@c "elm.text"), @b two content parts (@c "elm.swalllow.icon" and @c - * "elm.swallow.end") and @b no state parts. - * - * A genlist item may be at one of several styles. Elementary provides one - * by default - "default", but this can be extended by system or application - * custom themes/overlays/extensions (see @ref Theme "themes" for more - * details). - * - * @section Genlist_Manipulation Editing and Navigating - * - * Items can be added by several calls. All of them return a @ref - * Elm_Object_Item handle that is an internal member inside the genlist. - * They all take a data parameter that is meant to be used for a handle to - * the applications internal data (eg the struct with the original item - * data). The parent parameter is the parent genlist item this belongs to if - * it is a tree or an indexed group, and NULL if there is no parent. The - * flags can be a bitmask of #ELM_GENLIST_ITEM_NONE, - * #ELM_GENLIST_ITEM_SUBITEMS and #ELM_GENLIST_ITEM_GROUP. If - * #ELM_GENLIST_ITEM_SUBITEMS is set then this item is displayed as an item - * that is able to expand and have child items. If ELM_GENLIST_ITEM_GROUP - * is set then this item is group index item that is displayed at the top - * until the next group comes. The func parameter is a convenience callback - * that is called when the item is selected and the data parameter will be - * the func_data parameter, obj be the genlist object and event_info will be - * the genlist item. - * - * elm_genlist_item_append() adds an item to the end of the list, or if - * there is a parent, to the end of all the child items of the parent. - * elm_genlist_item_prepend() is the same but adds to the beginning of - * the list or children list. elm_genlist_item_insert_before() inserts at - * item before another item and elm_genlist_item_insert_after() inserts after - * the indicated item. - * - * The application can clear the list with elm_gen_clear() which deletes - * all the items in the list and elm_genlist_item_del() will delete a specific - * item. elm_genlist_item_subitems_clear() will clear all items that are - * children of the indicated parent item. - * - * To help inspect list items you can jump to the item at the top of the list - * with elm_genlist_first_item_get() which will return the item pointer, and - * similarly elm_genlist_last_item_get() gets the item at the end of the list. - * elm_genlist_item_next_get() and elm_genlist_item_prev_get() get the next - * and previous items respectively relative to the indicated item. Using - * these calls you can walk the entire item list/tree. Note that as a tree - * the items are flattened in the list, so elm_genlist_item_parent_get() will - * let you know which item is the parent (and thus know how to skip them if - * wanted). - * - * @section Genlist_Muti_Selection Multi-selection - * - * If the application wants multiple items to be able to be selected, - * elm_genlist_multi_select_set() can enable this. If the list is - * single-selection only (the default), then elm_genlist_selected_item_get() - * will return the selected item, if any, or NULL if none is selected. If the - * list is multi-select then elm_genlist_selected_items_get() will return a - * list (that is only valid as long as no items are modified (added, deleted, - * selected or unselected)). - * - * @section Genlist_Usage_Hints Usage hints - * - * There are also convenience functions. elm_gen_item_genlist_get() will - * return the genlist object the item belongs to. elm_genlist_item_show() - * will make the scroller scroll to show that specific item so its visible. - * elm_genlist_item_data_get() returns the data pointer set by the item - * creation functions. - * - * If an item changes (state of boolean changes, text or contents change), - * then use elm_genlist_item_update() to have genlist update the item with - * the new state. Genlist will re-realize the item thus call the functions - * in the _Elm_Genlist_Item_Class for that item. - * - * To programmatically (un)select an item use elm_genlist_item_selected_set(). - * To get its selected state use elm_genlist_item_selected_get(). Similarly - * to expand/contract an item and get its expanded state, use - * elm_genlist_item_expanded_set() and elm_genlist_item_expanded_get(). And - * again to make an item disabled (unable to be selected and appear - * differently) use elm_genlist_item_disabled_set() to set this and - * elm_genlist_item_disabled_get() to get the disabled state. - * - * In general to indicate how the genlist should expand items horizontally to - * fill the list area, use elm_genlist_horizontal_set(). Valid modes are - * ELM_LIST_LIMIT and ELM_LIST_SCROLL. The default is ELM_LIST_SCROLL. This - * mode means that if items are too wide to fit, the scroller will scroll - * horizontally. Otherwise items are expanded to fill the width of the - * viewport of the scroller. If it is ELM_LIST_LIMIT, items will be expanded - * to the viewport width and limited to that size. This can be combined with - * a different style that uses edjes' ellipsis feature (cutting text off like - * this: "tex..."). - * - * Items will only call their selection func and callback when first becoming - * selected. Any further clicks will do nothing, unless you enable always - * select with elm_gen_always_select_mode_set(). This means even if - * selected, every click will make the selected callbacks be called. - * elm_genlist_no_select_mode_set() will turn off the ability to select - * items entirely and they will neither appear selected nor call selected - * callback functions. - * - * Remember that you can create new styles and add your own theme augmentation - * per application with elm_theme_extension_add(). If you absolutely must - * have a specific style that overrides any theme the user or system sets up - * you can use elm_theme_overlay_add() to add such a file. - * - * @section Genlist_Implementation Implementation - * - * Evas tracks every object you create. Every time it processes an event - * (mouse move, down, up etc.) it needs to walk through objects and find out - * what event that affects. Even worse every time it renders display updates, - * in order to just calculate what to re-draw, it needs to walk through many - * many many objects. Thus, the more objects you keep active, the more - * overhead Evas has in just doing its work. It is advisable to keep your - * active objects to the minimum working set you need. Also remember that - * object creation and deletion carries an overhead, so there is a - * middle-ground, which is not easily determined. But don't keep massive lists - * of objects you can't see or use. Genlist does this with list objects. It - * creates and destroys them dynamically as you scroll around. It groups them - * into blocks so it can determine the visibility etc. of a whole block at - * once as opposed to having to walk the whole list. This 2-level list allows - * for very large numbers of items to be in the list (tests have used up to - * 2,000,000 items). Also genlist employs a queue for adding items. As items - * may be different sizes, every item added needs to be calculated as to its - * size and thus this presents a lot of overhead on populating the list, this - * genlist employs a queue. Any item added is queued and spooled off over - * time, actually appearing some time later, so if your list has many members - * you may find it takes a while for them to all appear, with your process - * consuming a lot of CPU while it is busy spooling. - * - * Genlist also implements a tree structure, but it does so with callbacks to - * the application, with the application filling in tree structures when - * requested (allowing for efficient building of a very deep tree that could - * even be used for file-management). See the above smart signal callbacks for - * details. - * - * @section Genlist_Smart_Events Genlist smart events - * - * Signals that you can add callbacks for are: - * - @c "activated" - The user has double-clicked or pressed - * (enter|return|spacebar) on an item. The @c event_info parameter is the - * item that was activated. - * - @c "clicked,double" - The user has double-clicked an item. The @c - * event_info parameter is the item that was double-clicked. - * - @c "selected" - This is called when a user has made an item selected. - * The event_info parameter is the genlist item that was selected. - * - @c "unselected" - This is called when a user has made an item - * unselected. The event_info parameter is the genlist item that was - * unselected. - * - @c "expanded" - This is called when elm_genlist_item_expanded_set() is - * called and the item is now meant to be expanded. The event_info - * parameter is the genlist item that was indicated to expand. It is the - * job of this callback to then fill in the child items. - * - @c "contracted" - This is called when elm_genlist_item_expanded_set() is - * called and the item is now meant to be contracted. The event_info - * parameter is the genlist item that was indicated to contract. It is the - * job of this callback to then delete the child items. - * - @c "expand,request" - This is called when a user has indicated they want - * to expand a tree branch item. The callback should decide if the item can - * expand (has any children) and then call elm_genlist_item_expanded_set() - * appropriately to set the state. The event_info parameter is the genlist - * item that was indicated to expand. - * - @c "contract,request" - This is called when a user has indicated they - * want to contract a tree branch item. The callback should decide if the - * item can contract (has any children) and then call - * elm_genlist_item_expanded_set() appropriately to set the state. The - * event_info parameter is the genlist item that was indicated to contract. - * - @c "realized" - This is called when the item in the list is created as a - * real evas object. event_info parameter is the genlist item that was - * created. The object may be deleted at any time, so it is up to the - * caller to not use the object pointer from elm_genlist_item_object_get() - * in a way where it may point to freed objects. - * - @c "unrealized" - This is called just before an item is unrealized. - * After this call content objects provided will be deleted and the item - * object itself delete or be put into a floating cache. - * - @c "drag,start,up" - This is called when the item in the list has been - * dragged (not scrolled) up. - * - @c "drag,start,down" - This is called when the item in the list has been - * dragged (not scrolled) down. - * - @c "drag,start,left" - This is called when the item in the list has been - * dragged (not scrolled) left. - * - @c "drag,start,right" - This is called when the item in the list has - * been dragged (not scrolled) right. - * - @c "drag,stop" - This is called when the item in the list has stopped - * being dragged. - * - @c "drag" - This is called when the item in the list is being dragged. - * - @c "longpressed" - This is called when the item is pressed for a certain - * amount of time. By default it's 1 second. - * - @c "scroll,anim,start" - This is called when scrolling animation has - * started. - * - @c "scroll,anim,stop" - This is called when scrolling animation has - * stopped. - * - @c "scroll,drag,start" - This is called when dragging the content has - * started. - * - @c "scroll,drag,stop" - This is called when dragging the content has - * stopped. - * - @c "edge,top" - This is called when the genlist is scrolled until - * the top edge. - * - @c "edge,bottom" - This is called when the genlist is scrolled - * until the bottom edge. - * - @c "edge,left" - This is called when the genlist is scrolled - * until the left edge. - * - @c "edge,right" - This is called when the genlist is scrolled - * until the right edge. - * - @c "multi,swipe,left" - This is called when the genlist is multi-touch - * swiped left. - * - @c "multi,swipe,right" - This is called when the genlist is multi-touch - * swiped right. - * - @c "multi,swipe,up" - This is called when the genlist is multi-touch - * swiped up. - * - @c "multi,swipe,down" - This is called when the genlist is multi-touch - * swiped down. - * - @c "multi,pinch,out" - This is called when the genlist is multi-touch - * pinched out. "- @c multi,pinch,in" - This is called when the genlist is - * multi-touch pinched in. - * - @c "swipe" - This is called when the genlist is swiped. - * - @c "moved" - This is called when a genlist item is moved. - * - @c "language,changed" - This is called when the program's language is - * changed. - * - * @section Genlist_Examples Examples - * - * Here is a list of examples that use the genlist, trying to show some of - * its capabilities: - * - @ref genlist_example_01 - * - @ref genlist_example_02 - * - @ref genlist_example_03 - * - @ref genlist_example_04 - * - @ref genlist_example_05 - */ +/** + * @defgroup Genlist Genlist + * + * @image html img/widget/genlist/preview-00.png + * @image latex img/widget/genlist/preview-00.eps + * @image html img/genlist.png + * @image latex img/genlist.eps + * + * This widget aims to have more expansive list than the simple list in + * Elementary that could have more flexible items and allow many more entries + * while still being fast and low on memory usage. At the same time it was + * also made to be able to do tree structures. But the price to pay is more + * complexity when it comes to usage. If all you want is a simple list with + * icons and a single text, use the normal @ref List object. + * + * Genlist has a fairly large API, mostly because it's relatively complex, + * trying to be both expansive, powerful and efficient. First we will begin + * an overview on the theory behind genlist. + * + * @section Genlist_Item_Class Genlist item classes - creating items + * + * In order to have the ability to add and delete items on the fly, genlist + * implements a class (callback) system where the application provides a + * structure with information about that type of item (genlist may contain + * multiple different items with different classes, states and styles). + * Genlist will call the functions in this struct (methods) when an item is + * "realized" (i.e., created dynamically, while the user is scrolling the + * grid). All objects will simply be deleted when no longer needed with + * evas_object_del(). The #Elm_Genlist_Item_Class structure contains the + * following members: + * - @c item_style - This is a constant string and simply defines the name + * of the item style. It @b must be specified and the default should be @c + * "default". + * + * - @c func - A struct with pointers to functions that will be called when + * an item is going to be actually created. All of them receive a @c data + * parameter that will point to the same data passed to + * elm_genlist_item_append() and related item creation functions, and an @c + * obj parameter that points to the genlist object itself. + * + * The function pointers inside @c func are @c text_get, @c content_get, @c + * state_get and @c del. The 3 first functions also receive a @c part + * parameter described below. A brief description of these functions follows: + * + * - @c text_get - The @c part parameter is the name string of one of the + * existing text parts in the Edje group implementing the item's theme. + * This function @b must return a strdup'()ed string, as the caller will + * free() it when done. See #Elm_Genlist_Item_Text_Get_Cb. + * - @c content_get - The @c part parameter is the name string of one of the + * existing (content) swallow parts in the Edje group implementing the item's + * theme. It must return @c NULL, when no content is desired, or a valid + * object handle, otherwise. The object will be deleted by the genlist on + * its deletion or when the item is "unrealized". See + * #Elm_Genlist_Item_Content_Get_Cb. + * - @c func.state_get - The @c part parameter is the name string of one of + * the state parts in the Edje group implementing the item's theme. Return + * @c EINA_FALSE for false/off or @c EINA_TRUE for true/on. Genlists will + * emit a signal to its theming Edje object with @c "elm,state,XXX,active" + * and @c "elm" as "emission" and "source" arguments, respectively, when + * the state is true (the default is false), where @c XXX is the name of + * the (state) part. See #Elm_Genlist_Item_State_Get_Cb. + * - @c func.del - This is intended for use when genlist items are deleted, + * so any data attached to the item (e.g. its data parameter on creation) + * can be deleted. See #Elm_Genlist_Item_Del_Cb. + * + * available item styles: + * - default + * - default_style - The text part is a textblock + * + * @image html img/widget/genlist/preview-04.png + * @image latex img/widget/genlist/preview-04.eps + * + * - double_label + * + * @image html img/widget/genlist/preview-01.png + * @image latex img/widget/genlist/preview-01.eps + * + * - icon_top_text_bottom + * + * @image html img/widget/genlist/preview-02.png + * @image latex img/widget/genlist/preview-02.eps + * + * - group_index + * + * @image html img/widget/genlist/preview-03.png + * @image latex img/widget/genlist/preview-03.eps + * + * @section Genlist_Items Structure of items + * + * An item in a genlist can have 0 or more texts (they can be regular + * text or textblock Evas objects - that's up to the style to determine), 0 + * or more contents (which are simply objects swallowed into the genlist item's + * theming Edje object) and 0 or more boolean states, which have the + * behavior left to the user to define. The Edje part names for each of + * these properties will be looked up, in the theme file for the genlist, + * under the Edje (string) data items named @c "labels", @c "contents" and @c + * "states", respectively. For each of those properties, if more than one + * part is provided, they must have names listed separated by spaces in the + * data fields. For the default genlist item theme, we have @b one text + * part (@c "elm.text"), @b two content parts (@c "elm.swalllow.icon" and @c + * "elm.swallow.end") and @b no state parts. + * + * A genlist item may be at one of several styles. Elementary provides one + * by default - "default", but this can be extended by system or application + * custom themes/overlays/extensions (see @ref Theme "themes" for more + * details). + * + * @section Genlist_Manipulation Editing and Navigating + * + * Items can be added by several calls. All of them return a @ref + * Elm_Object_Item handle that is an internal member inside the genlist. + * They all take a data parameter that is meant to be used for a handle to + * the applications internal data (eg the struct with the original item + * data). The parent parameter is the parent genlist item this belongs to if + * it is a tree or an indexed group, and NULL if there is no parent. The + * flags can be a bitmask of #ELM_GENLIST_ITEM_NONE, + * #ELM_GENLIST_ITEM_SUBITEMS and #ELM_GENLIST_ITEM_GROUP. If + * #ELM_GENLIST_ITEM_SUBITEMS is set then this item is displayed as an item + * that is able to expand and have child items. If ELM_GENLIST_ITEM_GROUP + * is set then this item is group index item that is displayed at the top + * until the next group comes. The func parameter is a convenience callback + * that is called when the item is selected and the data parameter will be + * the func_data parameter, obj be the genlist object and event_info will be + * the genlist item. + * + * elm_genlist_item_append() adds an item to the end of the list, or if + * there is a parent, to the end of all the child items of the parent. + * elm_genlist_item_prepend() is the same but adds to the beginning of + * the list or children list. elm_genlist_item_insert_before() inserts at + * item before another item and elm_genlist_item_insert_after() inserts after + * the indicated item. + * + * The application can clear the list with elm_genlist_clear() which deletes + * all the items in the list and elm_object_item_del() will delete a specific + * item. elm_genlist_item_subitems_clear() will clear all items that are + * children of the indicated parent item. + * + * To help inspect list items you can jump to the item at the top of the list + * with elm_genlist_first_item_get() which will return the item pointer, and + * similarly elm_genlist_last_item_get() gets the item at the end of the list. + * elm_genlist_item_next_get() and elm_genlist_item_prev_get() get the next + * and previous items respectively relative to the indicated item. Using + * these calls you can walk the entire item list/tree. Note that as a tree + * the items are flattened in the list, so elm_genlist_item_parent_get() will + * let you know which item is the parent (and thus know how to skip them if + * wanted). + * + * @section Genlist_Muti_Selection Multi-selection + * + * If the application wants multiple items to be able to be selected, + * elm_genlist_multi_select_set() can enable this. If the list is + * single-selection only (the default), then elm_genlist_selected_item_get() + * will return the selected item, if any, or NULL if none is selected. If the + * list is multi-select then elm_genlist_selected_items_get() will return a + * list (that is only valid as long as no items are modified (added, deleted, + * selected or unselected)). + * + * @section Genlist_Usage_Hints Usage hints + * + * There are also convenience functions. elm_genlist_item_genlist_get() will + * return the genlist object the item belongs to. elm_genlist_item_show() + * will make the scroller scroll to show that specific item so its visible. + * elm_object_item_data_get() returns the data pointer set by the item + * creation functions. + * + * If an item changes (state of boolean changes, text or contents change), + * then use elm_genlist_item_update() to have genlist update the item with + * the new state. Genlist will re-realize the item and thus call the functions + * in the _Elm_Genlist_Item_Class for that item. + * + * To programmatically (un)select an item use elm_genlist_item_selected_set(). + * To get its selected state use elm_genlist_item_selected_get(). Similarly + * to expand/contract an item and get its expanded state, use + * elm_genlist_item_expanded_set() and elm_genlist_item_expanded_get(). And + * again to make an item disabled (unable to be selected and appear + * differently) use elm_object_item_disabled_set() to set this and + * elm_object_item_disabled_get() to get the disabled state. + * + * In general to indicate how the genlist should expand items horizontally to + * fill the list area, use elm_genlist_horizontal_set(). Valid modes are + * ELM_LIST_LIMIT and ELM_LIST_SCROLL. The default is ELM_LIST_SCROLL. This + * mode means that if items are too wide to fit, the scroller will scroll + * horizontally. Otherwise items are expanded to fill the width of the + * viewport of the scroller. If it is ELM_LIST_LIMIT, items will be expanded + * to the viewport width and limited to that size. This can be combined with + * a different style that uses edjes' ellipsis feature (cutting text off like + * this: "tex..."). + * + * Items will only call their selection func and callback when first becoming + * selected. Any further clicks will do nothing, unless you enable always + * select with elm_genlist_always_select_mode_set(). This means even if + * selected, every click will make the selected callbacks be called. + * elm_genlist_no_select_mode_set() will turn off the ability to select + * items entirely and they will neither appear selected nor call selected + * callback functions. + * + * Remember that you can create new styles and add your own theme augmentation + * per application with elm_theme_extension_add(). If you absolutely must + * have a specific style that overrides any theme the user or system sets up + * you can use elm_theme_overlay_add() to add such a file. + * + * @section Genlist_Implementation Implementation + * + * Evas tracks every object you create. Every time it processes an event + * (mouse move, down, up etc.) it needs to walk through objects and find out + * what event that affects. Even worse every time it renders display updates, + * in order to just calculate what to re-draw, it needs to walk through many + * many many objects. Thus, the more objects you keep active, the more + * overhead Evas has in just doing its work. It is advisable to keep your + * active objects to the minimum working set you need. Also remember that + * object creation and deletion carries an overhead, so there is a + * middle-ground, which is not easily determined. But don't keep massive lists + * of objects you can't see or use. Genlist does this with list objects. It + * creates and destroys them dynamically as you scroll around. It groups them + * into blocks so it can determine the visibility etc. of a whole block at + * once as opposed to having to walk the whole list. This 2-level list allows + * for very large numbers of items to be in the list (tests have used up to + * 2,000,000 items). Also genlist employs a queue for adding items. As items + * may be different sizes, every item added needs to be calculated as to its + * size and thus this presents a lot of overhead on populating the list, this + * genlist employs a queue. Any item added is queued and spooled off over + * time, actually appearing some time later, so if your list has many members + * you may find it takes a while for them to all appear, with your process + * consuming a lot of CPU while it is busy spooling. + * + * Genlist also implements a tree structure, but it does so with callbacks to + * the application, with the application filling in tree structures when + * requested (allowing for efficient building of a very deep tree that could + * even be used for file-management). See the above smart signal callbacks for + * details. + * + * @section Genlist_Smart_Events Genlist smart events + * + * Signals that you can add callbacks for are: + * - @c "activated" - The user has double-clicked or pressed + * (enter|return|spacebar) on an item. The @c event_info parameter is the + * item that was activated. + * - @c "clicked,double" - The user has double-clicked an item. The @c + * event_info parameter is the item that was double-clicked. + * - @c "selected" - This is called when a user has made an item selected. + * The event_info parameter is the genlist item that was selected. + * - @c "unselected" - This is called when a user has made an item + * unselected. The event_info parameter is the genlist item that was + * unselected. + * - @c "expanded" - This is called when elm_genlist_item_expanded_set() is + * called and the item is now meant to be expanded. The event_info + * parameter is the genlist item that was indicated to expand. It is the + * job of this callback to then fill in the child items. + * - @c "contracted" - This is called when elm_genlist_item_expanded_set() is + * called and the item is now meant to be contracted. The event_info + * parameter is the genlist item that was indicated to contract. It is the + * job of this callback to then delete the child items. + * - @c "expand,request" - This is called when a user has indicated they want + * to expand a tree branch item. The callback should decide if the item can + * expand (has any children) and then call elm_genlist_item_expanded_set() + * appropriately to set the state. The event_info parameter is the genlist + * item that was indicated to expand. + * - @c "contract,request" - This is called when a user has indicated they + * want to contract a tree branch item. The callback should decide if the + * item can contract (has any children) and then call + * elm_genlist_item_expanded_set() appropriately to set the state. The + * event_info parameter is the genlist item that was indicated to contract. + * - @c "realized" - This is called when the item in the list is created as a + * real evas object. event_info parameter is the genlist item that was + * created. The object may be deleted at any time, so it is up to the + * caller to not use the object pointer from elm_genlist_item_object_get() + * in a way where it may point to freed objects. + * - @c "unrealized" - This is called just before an item is unrealized. + * After this call content objects provided will be deleted and the item + * object itself delete or be put into a floating cache. + * - @c "drag,start,up" - This is called when the item in the list has been + * dragged (not scrolled) up. + * - @c "drag,start,down" - This is called when the item in the list has been + * dragged (not scrolled) down. + * - @c "drag,start,left" - This is called when the item in the list has been + * dragged (not scrolled) left. + * - @c "drag,start,right" - This is called when the item in the list has + * been dragged (not scrolled) right. + * - @c "drag,stop" - This is called when the item in the list has stopped + * being dragged. + * - @c "drag" - This is called when the item in the list is being dragged. + * - @c "longpressed" - This is called when the item is pressed for a certain + * amount of time. By default it's 1 second. + * - @c "scroll,anim,start" - This is called when scrolling animation has + * started. + * - @c "scroll,anim,stop" - This is called when scrolling animation has + * stopped. + * - @c "scroll,drag,start" - This is called when dragging the content has + * started. + * - @c "scroll,drag,stop" - This is called when dragging the content has + * stopped. + * - @c "edge,top" - This is called when the genlist is scrolled until + * the top edge. + * - @c "edge,bottom" - This is called when the genlist is scrolled + * until the bottom edge. + * - @c "edge,left" - This is called when the genlist is scrolled + * until the left edge. + * - @c "edge,right" - This is called when the genlist is scrolled + * until the right edge. + * - @c "multi,swipe,left" - This is called when the genlist is multi-touch + * swiped left. + * - @c "multi,swipe,right" - This is called when the genlist is multi-touch + * swiped right. + * - @c "multi,swipe,up" - This is called when the genlist is multi-touch + * swiped up. + * - @c "multi,swipe,down" - This is called when the genlist is multi-touch + * swiped down. + * - @c "multi,pinch,out" - This is called when the genlist is multi-touch + * pinched out. "- @c multi,pinch,in" - This is called when the genlist is + * multi-touch pinched in. + * - @c "swipe" - This is called when the genlist is swiped. + * - @c "moved" - This is called when a genlist item is moved. + * - @c "language,changed" - This is called when the program's language is + * changed. + * + * Supported elm_object common APIs + * @li elm_object_signal_emit() + * + * Supported elm_object_item common APIs + * @li elm_object_item_part_content_get() + * @li elm_object_item_part_content_set() + * @li elm_object_item_part_content_unset() + * @li elm_object_item_part_text_set() + * @li elm_object_item_part_text_get() + * @li elm_object_item_disabled_set() + * @li elm_object_item_disabled_get() + * + * @section Genlist_Examples Examples + * + * Here is a list of examples that use the genlist, trying to show some of + * its capabilities: + * - @ref genlist_example_01 + * - @ref genlist_example_02 + * - @ref genlist_example_03 + * - @ref genlist_example_04 + * - @ref genlist_example_05 + */ - /** - * @addtogroup Genlist - * @{ - */ +/** + * @addtogroup Genlist + * @{ + */ - /** - * @enum _Elm_Genlist_Item_Flags - * @typedef Elm_Genlist_Item_Flags - * - * Defines if the item is of any special type (has subitems or it's the - * index of a group), or is just a simple item. - * - * @ingroup Genlist - */ +/** + * Defines if the item is of any special type (has subitems or it's the + * index of a group), or is just a simple item. + * + * @ingroup Genlist + */ typedef enum _Elm_Genlist_Item_Flags { ELM_GENLIST_ITEM_NONE = 0, /**< simple item */ @@ -383,1377 +392,1397 @@ const char *edit_item_style; const char *mode_item_style; }; - #define Elm_Genlist_Item_Class_Func Elm_Gen_Item_Class_Func - /** - * Add a new genlist widget to the given parent Elementary - * (container) object - * - * @param parent The parent object - * @return a new genlist widget handle or @c NULL, on errors - * - * This function inserts a new genlist widget on the canvas. - * - * @see elm_genlist_item_append() - * @see elm_genlist_item_del() - * @see elm_gen_clear() - * - * @ingroup Genlist - */ - EAPI Evas_Object *elm_genlist_add(Evas_Object *parent) EINA_ARG_NONNULL(1); - /** - * Remove all items from a given genlist widget. - * - * @param obj The genlist object - * - * This removes (and deletes) all items in @p obj, leaving it empty. - * - * This is deprecated. Please use elm_gen_clear() instead. - * - * @see elm_genlist_item_del(), to remove just one item. - * - * @ingroup Genlist - */ - EAPI void elm_genlist_clear(Evas_Object *obj) EINA_ARG_NONNULL(1); - /** - * Enable or disable multi-selection in the genlist - * - * @param obj The genlist object - * @param multi Multi-select enable/disable. Default is disabled. - * - * This enables (@c EINA_TRUE) or disables (@c EINA_FALSE) multi-selection in - * the list. This allows more than 1 item to be selected. To retrieve the list - * of selected items, use elm_genlist_selected_items_get(). - * - * @see elm_genlist_selected_items_get() - * @see elm_genlist_multi_select_get() - * - * @ingroup Genlist - */ - EAPI void elm_genlist_multi_select_set(Evas_Object *obj, Eina_Bool multi) EINA_ARG_NONNULL(1); - /** - * Gets if multi-selection in genlist is enabled or disabled. - * - * @param obj The genlist object - * @return Multi-select enabled/disabled - * (@c EINA_TRUE = enabled/@c EINA_FALSE = disabled). Default is @c EINA_FALSE. - * - * @see elm_genlist_multi_select_set() - * - * @ingroup Genlist - */ - EAPI Eina_Bool elm_genlist_multi_select_get(const Evas_Object *obj) EINA_ARG_NONNULL(1); - /** - * This sets the horizontal stretching mode. - * - * @param obj The genlist object - * @param mode The mode to use (one of #ELM_LIST_SCROLL or #ELM_LIST_LIMIT). - * - * This sets the mode used for sizing items horizontally. Valid modes - * are #ELM_LIST_LIMIT and #ELM_LIST_SCROLL. The default is - * ELM_LIST_SCROLL. This mode means that if items are too wide to fit, - * the scroller will scroll horizontally. Otherwise items are expanded - * to fill the width of the viewport of the scroller. If it is - * ELM_LIST_LIMIT, items will be expanded to the viewport width and - * limited to that size. - * - * @see elm_genlist_horizontal_get() - * - * @ingroup Genlist - */ - EAPI void elm_genlist_horizontal_mode_set(Evas_Object *obj, Elm_List_Mode mode) EINA_ARG_NONNULL(1); - /** - * Gets the horizontal stretching mode. - * - * @param obj The genlist object - * @return The mode to use - * (#ELM_LIST_LIMIT, #ELM_LIST_SCROLL) - * - * @see elm_genlist_horizontal_set() - * - * @ingroup Genlist - */ - EAPI Elm_List_Mode elm_genlist_horizontal_mode_get(const Evas_Object *obj) EINA_ARG_NONNULL(1); - /** - * Set the always select mode. - * - * @param obj The genlist object - * @param always_select The always select mode (@c EINA_TRUE = on, @c - * EINA_FALSE = off). Default is @c EINA_FALSE. - * - * Items will only call their selection func and callback when first - * becoming selected. Any further clicks will do nothing, unless you - * enable always select with elm_gen_always_select_mode_set(). - * This means that, even if selected, every click will make the selected - * callbacks be called. - * - * This function is deprecated. please see elm_gen_always_select_mode_set() - * - * @see elm_genlist_always_select_mode_get() - * - * @ingroup Genlist - */ - EAPI void elm_genlist_always_select_mode_set(Evas_Object *obj, Eina_Bool always_select) EINA_ARG_NONNULL(1); - /** - * Get the always select mode. - * - * @param obj The genlist object - * @return The always select mode - * (@c EINA_TRUE = on, @c EINA_FALSE = off) - * - * @see elm_genlist_always_select_mode_set() - * - * @ingroup Genlist - */ - EAPI Eina_Bool elm_genlist_always_select_mode_get(const Evas_Object *obj) EINA_ARG_NONNULL(1); - /** - * Enable/disable the no select mode. - * - * @param obj The genlist object - * @param no_select The no select mode - * (EINA_TRUE = on, EINA_FALSE = off) - * - * This will turn off the ability to select items entirely and they - * will neither appear selected nor call selected callback functions. - * - * @see elm_genlist_no_select_mode_get() - * - * @ingroup Genlist - */ - EAPI void elm_genlist_no_select_mode_set(Evas_Object *obj, Eina_Bool no_select) EINA_ARG_NONNULL(1); - /** - * Gets whether the no select mode is enabled. - * - * @param obj The genlist object - * @return The no select mode - * (@c EINA_TRUE = on, @c EINA_FALSE = off) - * - * @see elm_genlist_no_select_mode_set() - * - * @ingroup Genlist - */ - EAPI Eina_Bool elm_genlist_no_select_mode_get(const Evas_Object *obj) EINA_ARG_NONNULL(1); - /** - * Enable/disable compress mode. - * - * @param obj The genlist object - * @param compress The compress mode - * (@c EINA_TRUE = on, @c EINA_FALSE = off). Default is @c EINA_FALSE. - * - * This will enable the compress mode where items are "compressed" - * horizontally to fit the genlist scrollable viewport width. This is - * special for genlist. Do not rely on - * elm_genlist_horizontal_set() being set to @c ELM_LIST_COMPRESS to - * work as genlist needs to handle it specially. - * - * @see elm_genlist_compress_mode_get() - * - * @ingroup Genlist - */ - EAPI void elm_genlist_compress_mode_set(Evas_Object *obj, Eina_Bool compress) EINA_ARG_NONNULL(1); - /** - * Get whether the compress mode is enabled. - * - * @param obj The genlist object - * @return The compress mode - * (@c EINA_TRUE = on, @c EINA_FALSE = off) - * - * @see elm_genlist_compress_mode_set() - * - * @ingroup Genlist - */ - EAPI Eina_Bool elm_genlist_compress_mode_get(const Evas_Object *obj) EINA_ARG_NONNULL(1); - /** - * Enable/disable height-for-width mode. - * - * @param obj The genlist object - * @param setting The height-for-width mode (@c EINA_TRUE = on, - * @c EINA_FALSE = off). Default is @c EINA_FALSE. - * - * With height-for-width mode the item width will be fixed (restricted - * to a minimum of) to the list width when calculating its size in - * order to allow the height to be calculated based on it. This allows, - * for instance, text block to wrap lines if the Edje part is - * configured with "text.min: 0 1". - * - * @note This mode will make list resize slower as it will have to - * recalculate every item height again whenever the list width - * changes! - * - * @note When height-for-width mode is enabled, it also enables - * compress mode (see elm_genlist_compress_mode_set()) and - * disables homogeneous (see elm_genlist_homogeneous_set()). - * - * @ingroup Genlist - */ - EAPI void elm_genlist_height_for_width_mode_set(Evas_Object *obj, Eina_Bool height_for_width) EINA_ARG_NONNULL(1); - /** - * Get whether the height-for-width mode is enabled. - * - * @param obj The genlist object - * @return The height-for-width mode (@c EINA_TRUE = on, @c EINA_FALSE = - * off) - * - * @ingroup Genlist - */ - EAPI Eina_Bool elm_genlist_height_for_width_mode_get(const Evas_Object *obj) EINA_ARG_NONNULL(1); - /** - * Enable/disable horizontal and vertical bouncing effect. - * - * @param obj The genlist object - * @param h_bounce Allow bounce horizontally (@c EINA_TRUE = on, @c - * EINA_FALSE = off). Default is @c EINA_FALSE. - * @param v_bounce Allow bounce vertically (@c EINA_TRUE = on, @c - * EINA_FALSE = off). Default is @c EINA_TRUE. - * - * This will enable or disable the scroller bouncing effect for the - * genlist. See elm_scroller_bounce_set() for details. - * - * @see elm_scroller_bounce_set() - * @see elm_genlist_bounce_get() - * - * @ingroup Genlist - */ - EAPI void elm_genlist_bounce_set(Evas_Object *obj, Eina_Bool h_bounce, Eina_Bool v_bounce) EINA_ARG_NONNULL(1); - /** - * Get whether the horizontal and vertical bouncing effect is enabled. - * - * @param obj The genlist object - * @param h_bounce Pointer to a bool to receive if the bounce horizontally - * option is set. - * @param v_bounce Pointer to a bool to receive if the bounce vertically - * option is set. - * - * @see elm_genlist_bounce_set() - * - * @ingroup Genlist - */ - EAPI void elm_genlist_bounce_get(const Evas_Object *obj, Eina_Bool *h_bounce, Eina_Bool *v_bounce) EINA_ARG_NONNULL(1); - /** - * Enable/disable homogenous mode. - * - * @param obj The genlist object - * @param homogeneous Assume the items within the genlist are of the - * same height and width (EINA_TRUE = on, EINA_FALSE = off). Default is @c - * EINA_FALSE. - * - * This will enable the homogeneous mode where items are of the same - * height and width so that genlist may do the lazy-loading at its - * maximum (which increases the performance for scrolling the list). This - * implies 'compressed' mode. - * - * @see elm_genlist_compress_mode_set() - * @see elm_genlist_homogeneous_get() - * - * @ingroup Genlist - */ - EAPI void elm_genlist_homogeneous_set(Evas_Object *obj, Eina_Bool homogeneous) EINA_ARG_NONNULL(1); - /** - * Get whether the homogenous mode is enabled. - * - * @param obj The genlist object - * @return Assume the items within the genlist are of the same height - * and width (EINA_TRUE = on, EINA_FALSE = off) - * - * @see elm_genlist_homogeneous_set() - * - * @ingroup Genlist - */ - EAPI Eina_Bool elm_genlist_homogeneous_get(const Evas_Object *obj) EINA_ARG_NONNULL(1); - /** - * Set the maximum number of items within an item block - * - * @param obj The genlist object - * @param n Maximum number of items within an item block. Default is 32. - * - * This will configure the block count to tune to the target with - * particular performance matrix. - * - * A block of objects will be used to reduce the number of operations due to - * many objects in the screen. It can determine the visibility, or if the - * object has changed, it theme needs to be updated, etc. doing this kind of - * calculation to the entire block, instead of per object. - * - * The default value for the block count is enough for most lists, so unless - * you know you will have a lot of objects visible in the screen at the same - * time, don't try to change this. - * - * @see elm_genlist_block_count_get() - * @see @ref Genlist_Implementation - * - * @ingroup Genlist - */ - EAPI void elm_genlist_block_count_set(Evas_Object *obj, int n) EINA_ARG_NONNULL(1); - /** - * Get the maximum number of items within an item block - * - * @param obj The genlist object - * @return Maximum number of items within an item block - * - * @see elm_genlist_block_count_set() - * - * @ingroup Genlist - */ - EAPI int elm_genlist_block_count_get(const Evas_Object *obj) EINA_ARG_NONNULL(1); - /** - * Set the timeout in seconds for the longpress event. - * - * @param obj The genlist object - * @param timeout timeout in seconds. Default is 1. - * - * This option will change how long it takes to send an event "longpressed" - * after the mouse down signal is sent to the list. If this event occurs, no - * "clicked" event will be sent. - * - * @see elm_genlist_longpress_timeout_set() - * - * @ingroup Genlist - */ - EAPI void elm_genlist_longpress_timeout_set(Evas_Object *obj, double timeout) EINA_ARG_NONNULL(1); - /** - * Get the timeout in seconds for the longpress event. - * - * @param obj The genlist object - * @return timeout in seconds - * - * @see elm_genlist_longpress_timeout_get() - * - * @ingroup Genlist - */ - EAPI double elm_genlist_longpress_timeout_get(const Evas_Object *obj) EINA_ARG_NONNULL(1); - /** - * Append a new item in a given genlist widget. - * - * @param obj The genlist object - * @param itc The item class for the item - * @param data The item data - * @param parent The parent item, or NULL if none - * @param flags Item flags - * @param func Convenience function called when the item is selected - * @param func_data Data passed to @p func above. - * @return A handle to the item added or @c NULL if not possible - * - * This adds the given item to the end of the list or the end of - * the children list if the @p parent is given. - * - * @see elm_genlist_item_prepend() - * @see elm_genlist_item_insert_before() - * @see elm_genlist_item_insert_after() - * @see elm_genlist_item_del() - * - * @ingroup Genlist - */ - EAPI Elm_Object_Item *elm_genlist_item_append(Evas_Object *obj, const Elm_Genlist_Item_Class *itc, const void *data, Elm_Object_Item *parent, Elm_Genlist_Item_Flags flags, Evas_Smart_Cb func, const void *func_data) EINA_ARG_NONNULL(1); - /** - * Prepend a new item in a given genlist widget. - * - * @param obj The genlist object - * @param itc The item class for the item - * @param data The item data - * @param parent The parent item, or NULL if none - * @param flags Item flags - * @param func Convenience function called when the item is selected - * @param func_data Data passed to @p func above. - * @return A handle to the item added or NULL if not possible - * - * This adds an item to the beginning of the list or beginning of the - * children of the parent if given. - * - * @see elm_genlist_item_append() - * @see elm_genlist_item_insert_before() - * @see elm_genlist_item_insert_after() - * @see elm_genlist_item_del() - * - * @ingroup Genlist - */ - EAPI Elm_Object_Item *elm_genlist_item_prepend(Evas_Object *obj, const Elm_Genlist_Item_Class *itc, const void *data, Elm_Object_Item *parent, Elm_Genlist_Item_Flags flags, Evas_Smart_Cb func, const void *func_data) EINA_ARG_NONNULL(1); - /** - * Insert an item before another in a genlist widget - * - * @param obj The genlist object - * @param itc The item class for the item - * @param data The item data - * @param before The item to place this new one before. - * @param flags Item flags - * @param func Convenience function called when the item is selected - * @param func_data Data passed to @p func above. - * @return A handle to the item added or @c NULL if not possible - * - * This inserts an item before another in the list. It will be in the - * same tree level or group as the item it is inserted before. - * - * @see elm_genlist_item_append() - * @see elm_genlist_item_prepend() - * @see elm_genlist_item_insert_after() - * @see elm_genlist_item_del() - * - * @ingroup Genlist - */ - EAPI Elm_Object_Item *elm_genlist_item_insert_before(Evas_Object *obj, const Elm_Genlist_Item_Class *itc, const void *data, Elm_Object_Item *parent, Elm_Object_Item *before, Elm_Genlist_Item_Flags flags, Evas_Smart_Cb func, const void *func_data) EINA_ARG_NONNULL(1, 5); - /** - * Insert an item after another in a genlist widget - * - * @param obj The genlist object - * @param itc The item class for the item - * @param data The item data - * @param after The item to place this new one after. - * @param flags Item flags - * @param func Convenience function called when the item is selected - * @param func_data Data passed to @p func above. - * @return A handle to the item added or @c NULL if not possible - * - * This inserts an item after another in the list. It will be in the - * same tree level or group as the item it is inserted after. - * - * @see elm_genlist_item_append() - * @see elm_genlist_item_prepend() - * @see elm_genlist_item_insert_before() - * @see elm_genlist_item_del() - * - * @ingroup Genlist - */ - EAPI Elm_Object_Item *elm_genlist_item_insert_after(Evas_Object *obj, const Elm_Genlist_Item_Class *itc, const void *data, Elm_Object_Item *parent, Elm_Object_Item *after, Elm_Genlist_Item_Flags flags, Evas_Smart_Cb func, const void *func_data) EINA_ARG_NONNULL(1, 5); - /** - * Insert a new item into the sorted genlist object - * - * @param obj The genlist object - * @param itc The item class for the item - * @param data The item data - * @param parent The parent item, or NULL if none - * @param flags Item flags - * @param comp The function called for the sort - * @param func Convenience function called when item selected - * @param func_data Data passed to @p func above. - * @return A handle to the item added or NULL if not possible - * - * @ingroup Genlist - */ - EAPI Elm_Object_Item *elm_genlist_item_sorted_insert(Evas_Object *obj, const Elm_Genlist_Item_Class *itc, const void *data, Elm_Object_Item *parent, Elm_Genlist_Item_Flags flags, Eina_Compare_Cb comp, Evas_Smart_Cb func,const void *func_data); - EAPI Elm_Object_Item *elm_genlist_item_direct_sorted_insert(Evas_Object *obj, const Elm_Genlist_Item_Class *itc, const void *data, Elm_Object_Item *parent, Elm_Genlist_Item_Flags flags, Eina_Compare_Cb comp, Evas_Smart_Cb func, const void *func_data); - /* operations to retrieve existing items */ - /** - * Get the selectd item in the genlist. - * - * @param obj The genlist object - * @return The selected item, or NULL if none is selected. - * - * This gets the selected item in the list (if multi-selection is enabled, only - * the item that was first selected in the list is returned - which is not very - * useful, so see elm_genlist_selected_items_get() for when multi-selection is - * used). - * - * If no item is selected, NULL is returned. - * - * @see elm_genlist_selected_items_get() - * - * @ingroup Genlist - */ - EAPI Elm_Object_Item *elm_genlist_selected_item_get(const Evas_Object *obj) EINA_ARG_NONNULL(1); - /** - * Get a list of selected items in the genlist. - * - * @param obj The genlist object - * @return The list of selected items, or NULL if none are selected. - * - * It returns a list of the selected items. This list pointer is only valid so - * long as the selection doesn't change (no items are selected or unselected, or - * unselected implicitly by deletion). The list contains Elm_Genlist_Item - * pointers. The order of the items in this list is the order which they were - * selected, i.e. the first item in this list is the first item that was - * selected, and so on. - * - * @note If not in multi-select mode, consider using function - * elm_genlist_selected_item_get() instead. - * - * @see elm_genlist_multi_select_set() - * @see elm_genlist_selected_item_get() - * - * @ingroup Genlist - */ - EAPI const Eina_List *elm_genlist_selected_items_get(const Evas_Object *obj) EINA_ARG_NONNULL(1); - /** - * Get the mode item style of items in the genlist - * @param obj The genlist object - * @return The mode item style string, or NULL if none is specified - * - * This is a constant string and simply defines the name of the - * style that will be used for mode animations. It can be - * @c NULL if you don't plan to use Genlist mode. See - * elm_genlist_item_mode_set() for more info. - * - * @ingroup Genlist - */ - EAPI const char *elm_genlist_mode_item_style_get(const Evas_Object *obj) EINA_ARG_NONNULL(1); - /** - * Set the mode item style of items in the genlist - * @param obj The genlist object - * @param style The mode item style string, or NULL if none is desired - * - * This is a constant string and simply defines the name of the - * style that will be used for mode animations. It can be - * @c NULL if you don't plan to use Genlist mode. See - * elm_genlist_item_mode_set() for more info. - * - * @ingroup Genlist - */ - EAPI void elm_genlist_mode_item_style_set(Evas_Object *obj, const char *style) EINA_ARG_NONNULL(1); - /** - * Get a list of realized items in genlist - * - * @param obj The genlist object - * @return The list of realized items, nor NULL if none are realized. - * - * This returns a list of the realized items in the genlist. The list - * contains Elm_Genlist_Item pointers. The list must be freed by the - * caller when done with eina_list_free(). The item pointers in the - * list are only valid so long as those items are not deleted or the - * genlist is not deleted. - * - * @see elm_genlist_realized_items_update() - * - * @ingroup Genlist - */ - EAPI Eina_List *elm_genlist_realized_items_get(const Evas_Object *obj) EINA_ARG_NONNULL(1); - /** - * Get the item that is at the x, y canvas coords. - * - * @param obj The gelinst object. - * @param x The input x coordinate - * @param y The input y coordinate - * @param posret The position relative to the item returned here - * @return The item at the coordinates or NULL if none - * - * This returns the item at the given coordinates (which are canvas - * relative, not object-relative). If an item is at that coordinate, - * that item handle is returned, and if @p posret is not NULL, the - * integer pointed to is set to a value of -1, 0 or 1, depending if - * the coordinate is on the upper portion of that item (-1), on the - * middle section (0) or on the lower part (1). If NULL is returned as - * an item (no item found there), then posret may indicate -1 or 1 - * based if the coordinate is above or below all items respectively in - * the genlist. - * - * @ingroup Genlist - */ - EAPI Elm_Object_Item *elm_genlist_at_xy_item_get(const Evas_Object *obj, Evas_Coord x, Evas_Coord y, int *posret) EINA_ARG_NONNULL(1); - /** - * Get the first item in the genlist - * - * This returns the first item in the list. - * - * @param obj The genlist object - * @return The first item, or NULL if none - * - * @ingroup Genlist - */ - EAPI Elm_Object_Item *elm_genlist_first_item_get(const Evas_Object *obj) EINA_ARG_NONNULL(1); - /** - * Get the last item in the genlist - * - * This returns the last item in the list. - * - * @return The last item, or NULL if none - * - * @ingroup Genlist - */ - EAPI Elm_Object_Item *elm_genlist_last_item_get(const Evas_Object *obj) EINA_ARG_NONNULL(1); - /** - * Set the scrollbar policy - * - * @param obj The genlist object - * @param policy_h Horizontal scrollbar policy. - * @param policy_v Vertical scrollbar policy. - * - * This sets the scrollbar visibility policy for the given genlist - * scroller. #ELM_SMART_SCROLLER_POLICY_AUTO means the scrollbar is - * made visible if it is needed, and otherwise kept hidden. - * #ELM_SMART_SCROLLER_POLICY_ON turns it on all the time, and - * #ELM_SMART_SCROLLER_POLICY_OFF always keeps it off. This applies - * respectively for the horizontal and vertical scrollbars. Default is - * #ELM_SMART_SCROLLER_POLICY_AUTO - * - * @see elm_genlist_scroller_policy_get() - * - * @ingroup Genlist - */ - EAPI void elm_genlist_scroller_policy_set(Evas_Object *obj, Elm_Scroller_Policy policy_h, Elm_Scroller_Policy policy_v) EINA_ARG_NONNULL(1); - /** - * Get the scrollbar policy - * - * @param obj The genlist object - * @param policy_h Pointer to store the horizontal scrollbar policy. - * @param policy_v Pointer to store the vertical scrollbar policy. - * - * @see elm_genlist_scroller_policy_set() - * - * @ingroup Genlist - */ - EAPI void elm_genlist_scroller_policy_get(const Evas_Object *obj, Elm_Scroller_Policy *policy_h, Elm_Scroller_Policy *policy_v) EINA_ARG_NONNULL(1); - /** - * Get the @b next item in a genlist widget's internal list of items, - * given a handle to one of those items. - * - * @param item The genlist item to fetch next from - * @return The item after @p item, or @c NULL if there's none (and - * on errors) - * - * This returns the item placed after the @p item, on the container - * genlist. - * - * @see elm_genlist_item_prev_get() - * - * @ingroup Genlist - */ - EAPI Elm_Object_Item *elm_genlist_item_next_get(const Elm_Object_Item *item) EINA_ARG_NONNULL(1); - /** - * Get the @b previous item in a genlist widget's internal list of items, - * given a handle to one of those items. - * - * @param item The genlist item to fetch previous from - * @return The item before @p item, or @c NULL if there's none (and - * on errors) - * - * This returns the item placed before the @p item, on the container - * genlist. - * - * @see elm_genlist_item_next_get() - * - * @ingroup Genlist - */ - EAPI Elm_Object_Item *elm_genlist_item_prev_get(const Elm_Object_Item *item) EINA_ARG_NONNULL(1); - /** - * Get the genlist object's handle which contains a given genlist - * item - * - * @param item The item to fetch the container from - * @return The genlist (parent) object - * - * This returns the genlist object itself that an item belongs to. - * - * This function is deprecated. Please use elm_gen_item_widget_get() - * - * @ingroup Genlist - */ - EAPI Evas_Object *elm_genlist_item_genlist_get(const Elm_Object_Item *item) EINA_ARG_NONNULL(1); - /** - * Get the parent item of the given item - * - * @param it The item - * @return The parent of the item or @c NULL if it has no parent. - * - * This returns the item that was specified as parent of the item @p it on - * elm_genlist_item_append() and insertion related functions. - * - * @ingroup Genlist - */ - EAPI Elm_Object_Item *elm_genlist_item_parent_get(const Elm_Object_Item *it) EINA_ARG_NONNULL(1); - /** - * Remove all sub-items (children) of the given item - * - * @param it The item - * - * This removes all items that are children (and their descendants) of the - * given item @p it. - * - * @see elm_genlist_clear() - * @see elm_genlist_item_del() - * - * @ingroup Genlist - */ - EAPI void elm_genlist_item_subitems_clear(Elm_Object_Item *item) EINA_ARG_NONNULL(1); - /** - * Set whether a given genlist item is selected or not - * - * @param it The item - * @param selected Use @c EINA_TRUE, to make it selected, @c - * EINA_FALSE to make it unselected - * - * This sets the selected state of an item. If multi selection is - * not enabled on the containing genlist and @p selected is @c - * EINA_TRUE, any other previously selected items will get - * unselected in favor of this new one. - * - * @see elm_genlist_item_selected_get() - * - * @ingroup Genlist - */ - EAPI void elm_genlist_item_selected_set(Elm_Object_Item *item, Eina_Bool selected) EINA_ARG_NONNULL(1); - /** - * Get whether a given genlist item is selected or not - * - * @param it The item - * @return @c EINA_TRUE, if it's selected, @c EINA_FALSE otherwise - * - * @see elm_genlist_item_selected_set() for more details - * - * @ingroup Genlist - */ - EAPI Eina_Bool elm_genlist_item_selected_get(const Elm_Object_Item *item) EINA_ARG_NONNULL(1); - /** - * Sets the expanded state of an item. - * - * @param it The item - * @param expanded The expanded state (@c EINA_TRUE expanded, @c EINA_FALSE not expanded). - * - * This function flags the item of type #ELM_GENLIST_ITEM_SUBITEMS as - * expanded or not. - * - * The theme will respond to this change visually, and a signal "expanded" or - * "contracted" will be sent from the genlist with a pointer to the item that - * has been expanded/contracted. - * - * Calling this function won't show or hide any child of this item (if it is - * a parent). You must manually delete and create them on the callbacks fo - * the "expanded" or "contracted" signals. - * - * @see elm_genlist_item_expanded_get() - * - * @ingroup Genlist - */ - EAPI void elm_genlist_item_expanded_set(Elm_Object_Item *item, Eina_Bool expanded) EINA_ARG_NONNULL(1); - /** - * Get the expanded state of an item - * - * @param it The item - * @return The expanded state - * - * This gets the expanded state of an item. - * - * @see elm_genlist_item_expanded_set() - * - * @ingroup Genlist - */ - EAPI Eina_Bool elm_genlist_item_expanded_get(const Elm_Object_Item *item) EINA_ARG_NONNULL(1); - /** - * Get the depth of expanded item - * - * @param it The genlist item object - * @return The depth of expanded item - * - * @ingroup Genlist - */ - EAPI int elm_genlist_item_expanded_depth_get(const Elm_Object_Item *it) EINA_ARG_NONNULL(1); - /** - * Set whether a given genlist item is disabled or not. - * - * @param it The item - * @param disabled Use @c EINA_TRUE, true disable it, @c EINA_FALSE - * to enable it back. - * - * A disabled item cannot be selected or unselected. It will also - * change its appearance, to signal the user it's disabled. - * - * @see elm_genlist_item_disabled_get() - * - * @ingroup Genlist - */ - EAPI void elm_genlist_item_disabled_set(Elm_Object_Item *item, Eina_Bool disabled) EINA_ARG_NONNULL(1); - /** - * Get whether a given genlist item is disabled or not. - * - * @param it The item - * @return @c EINA_TRUE, if it's disabled, @c EINA_FALSE otherwise - * (and on errors). - * - * @see elm_genlist_item_disabled_set() for more details - * - * @ingroup Genlist - */ - EAPI Eina_Bool elm_genlist_item_disabled_get(const Elm_Object_Item *item) EINA_ARG_NONNULL(1); - /** - * Sets the display only state of an item. - * - * @param it The item - * @param display_only @c EINA_TRUE if the item is display only, @c - * EINA_FALSE otherwise. - * - * A display only item cannot be selected or unselected. It is for - * display only and not selecting or otherwise clicking, dragging - * etc. by the user, thus finger size rules will not be applied to - * this item. - * - * It's good to set group index items to display only state. - * - * @see elm_genlist_item_display_only_get() - * - * @ingroup Genlist - */ - EAPI void elm_genlist_item_display_only_set(Elm_Object_Item *it, Eina_Bool display_only) EINA_ARG_NONNULL(1); - /** - * Get the display only state of an item - * - * @param it The item - * @return @c EINA_TRUE if the item is display only, @c - * EINA_FALSE otherwise. - * - * @see elm_genlist_item_display_only_set() - * - * @ingroup Genlist - */ - EAPI Eina_Bool elm_genlist_item_display_only_get(const Elm_Object_Item *it) EINA_ARG_NONNULL(1); - /** - * Show the portion of a genlist's internal list containing a given - * item, immediately. - * - * @param it The item to display - * - * This causes genlist to jump to the given item @p it and show it (by - * immediately scrolling to that position), if it is not fully visible. - * - * @see elm_genlist_item_bring_in() - * @see elm_genlist_item_top_show() - * @see elm_genlist_item_middle_show() - * - * @ingroup Genlist - */ - EAPI void elm_genlist_item_show(Elm_Object_Item *item) EINA_ARG_NONNULL(1); - /** - * Animatedly bring in, to the visible are of a genlist, a given - * item on it. - * - * @param it The item to display - * - * This causes genlist to jump to the given item @p it and show it (by - * animatedly scrolling), if it is not fully visible. This may use animation - * to do so and take a period of time - * - * @see elm_genlist_item_show() - * @see elm_genlist_item_top_bring_in() - * @see elm_genlist_item_middle_bring_in() - * - * @ingroup Genlist - */ - EAPI void elm_genlist_item_bring_in(Elm_Object_Item *item) EINA_ARG_NONNULL(1); - /** - * Show the portion of a genlist's internal list containing a given - * item, immediately. - * - * @param it The item to display - * - * This causes genlist to jump to the given item @p it and show it (by - * immediately scrolling to that position), if it is not fully visible. - * - * The item will be positioned at the top of the genlist viewport. - * - * @see elm_genlist_item_show() - * @see elm_genlist_item_top_bring_in() - * - * @ingroup Genlist - */ - EAPI void elm_genlist_item_top_show(Elm_Object_Item *item) EINA_ARG_NONNULL(1); - /** - * Animatedly bring in, to the visible are of a genlist, a given - * item on it. - * - * @param it The item - * - * This causes genlist to jump to the given item @p it and show it (by - * animatedly scrolling), if it is not fully visible. This may use animation - * to do so and take a period of time - * - * The item will be positioned at the top of the genlist viewport. - * - * @see elm_genlist_item_bring_in() - * @see elm_genlist_item_top_show() - * - * @ingroup Genlist - */ - EAPI void elm_genlist_item_top_bring_in(Elm_Object_Item *item) EINA_ARG_NONNULL(1); - /** - * Show the portion of a genlist's internal list containing a given - * item, immediately. - * - * @param it The item to display - * - * This causes genlist to jump to the given item @p it and show it (by - * immediately scrolling to that position), if it is not fully visible. - * - * The item will be positioned at the middle of the genlist viewport. - * - * @see elm_genlist_item_show() - * @see elm_genlist_item_middle_bring_in() - * - * @ingroup Genlist - */ - EAPI void elm_genlist_item_middle_show(Elm_Object_Item *it) EINA_ARG_NONNULL(1); - /** - * Animatedly bring in, to the visible are of a genlist, a given - * item on it. - * - * @param it The item - * - * This causes genlist to jump to the given item @p it and show it (by - * animatedly scrolling), if it is not fully visible. This may use animation - * to do so and take a period of time - * - * The item will be positioned at the middle of the genlist viewport. - * - * @see elm_genlist_item_bring_in() - * @see elm_genlist_item_middle_show() - * - * @ingroup Genlist - */ - EAPI void elm_genlist_item_middle_bring_in(Elm_Object_Item *it) EINA_ARG_NONNULL(1); - /** - * Remove a genlist item from the its parent, deleting it. - * - * @param item The item to be removed. - * @return @c EINA_TRUE on success or @c EINA_FALSE, otherwise. - * - * @see elm_genlist_clear(), to remove all items in a genlist at - * once. - * - * @ingroup Genlist - */ - EAPI void elm_genlist_item_del(Elm_Object_Item *item) EINA_ARG_NONNULL(1); - /** - * Return the data associated to a given genlist item - * - * @param item The genlist item. - * @return the data associated to this item. - * - * This returns the @c data value passed on the - * elm_genlist_item_append() and related item addition calls. - * - * @see elm_genlist_item_append() - * @see elm_genlist_item_data_set() - * - * @ingroup Genlist - */ - EAPI void *elm_genlist_item_data_get(const Elm_Object_Item *item) EINA_ARG_NONNULL(1); - /** - * Set the data associated to a given genlist item - * - * @param item The genlist item - * @param data The new data pointer to set on it - * - * This @b overrides the @c data value passed on the - * elm_genlist_item_append() and related item addition calls. This - * function @b won't call elm_genlist_item_update() automatically, - * so you'd issue it afterwards if you want to hove the item - * updated to reflect the that new data. - * - * @see elm_genlist_item_data_get() - * - * @ingroup Genlist - */ - EAPI void elm_genlist_item_data_set(Elm_Object_Item *it, const void *data) EINA_ARG_NONNULL(1); - /** - * Tells genlist to "orphan" contents fetchs by the item class - * - * @param it The item - * - * This instructs genlist to release references to contents in the item, - * meaning that they will no longer be managed by genlist and are - * floating "orphans" that can be re-used elsewhere if the user wants - * to. - * - * @ingroup Genlist - */ - EAPI void elm_genlist_item_contents_orphan(Elm_Object_Item *it) EINA_ARG_NONNULL(1); - /** - * Get the real Evas object created to implement the view of a - * given genlist item - * - * @param item The genlist item. - * @return the Evas object implementing this item's view. - * - * This returns the actual Evas object used to implement the - * specified genlist item's view. This may be @c NULL, as it may - * not have been created or may have been deleted, at any time, by - * the genlist. Do not modify this object (move, resize, - * show, hide, etc.), as the genlist is controlling it. This - * function is for querying, emitting custom signals or hooking - * lower level callbacks for events on that object. Do not delete - * this object under any circumstances. - * - * @see elm_genlist_item_data_get() - * - * @ingroup Genlist - */ - EAPI const Evas_Object *elm_genlist_item_object_get(const Elm_Object_Item *it) EINA_ARG_NONNULL(1); - /** - * Update the contents of an item - * - * @param it The item - * - * This updates an item by calling all the item class functions again - * to get the contents, texts and states. Use this when the original - * item data has changed and the changes are desired to be reflected. - * - * Use elm_genlist_realized_items_update() to update all already realized - * items. - * - * @see elm_genlist_realized_items_update() - * - * @ingroup Genlist - */ - EAPI void elm_genlist_item_update(Elm_Object_Item *item) EINA_ARG_NONNULL(1); - EAPI void elm_genlist_item_fields_update(Elm_Object_Item *it, const char *parts, Elm_Genlist_Item_Field_Flags itf) EINA_ARG_NONNULL(1); - /** - * Update the item class of an item - * - * @param it The item - * @param itc The item class for the item - * - * This sets another class fo the item, changing the way that it is - * displayed. After changing the item class, elm_genlist_item_update() is - * called on the item @p it. - * - * @ingroup Genlist - */ - EAPI void elm_genlist_item_item_class_update(Elm_Object_Item *it, const Elm_Genlist_Item_Class *itc) EINA_ARG_NONNULL(1, 2); - EAPI const Elm_Genlist_Item_Class *elm_genlist_item_item_class_get(const Elm_Object_Item *it) EINA_ARG_NONNULL(1); - /** - * Set the text to be shown in a given genlist item's tooltips. - * - * @param item The genlist item - * @param text The text to set in the content - * - * This call will setup the text to be used as tooltip to that item - * (analogous to elm_object_tooltip_text_set(), but being item - * tooltips with higher precedence than object tooltips). It can - * have only one tooltip at a time, so any previous tooltip data - * will get removed. - * - * In order to set an icon or something else as a tooltip, look at - * elm_genlist_item_tooltip_content_cb_set(). - * - * @ingroup Genlist - */ - EAPI void elm_genlist_item_tooltip_text_set(Elm_Object_Item *item, const char *text) EINA_ARG_NONNULL(1); - /** - * Set the content to be shown in a given genlist item's tooltips - * - * @param item The genlist item. - * @param func The function returning the tooltip contents. - * @param data What to provide to @a func as callback data/context. - * @param del_cb Called when data is not needed anymore, either when - * another callback replaces @p func, the tooltip is unset with - * elm_genlist_item_tooltip_unset() or the owner @p item - * dies. This callback receives as its first parameter the - * given @p data, being @c event_info the item handle. - * - * This call will setup the tooltip's contents to @p item - * (analogous to elm_object_tooltip_content_cb_set(), but being - * item tooltips with higher precedence than object tooltips). It - * can have only one tooltip at a time, so any previous tooltip - * content will get removed. @p func (with @p data) will be called - * every time Elementary needs to show the tooltip and it should - * return a valid Evas object, which will be fully managed by the - * tooltip system, getting deleted when the tooltip is gone. - * - * In order to set just a text as a tooltip, look at - * elm_genlist_item_tooltip_text_set(). - * - * @ingroup Genlist - */ - EAPI void elm_genlist_item_tooltip_content_cb_set(Elm_Object_Item *item, Elm_Tooltip_Item_Content_Cb func, const void *data, Evas_Smart_Cb del_cb) EINA_ARG_NONNULL(1); - /** - * Unset a tooltip from a given genlist item - * - * @param item genlist item to remove a previously set tooltip from. - * - * This call removes any tooltip set on @p item. The callback - * provided as @c del_cb to - * elm_genlist_item_tooltip_content_cb_set() will be called to - * notify it is not used anymore (and have resources cleaned, if - * need be). - * - * @see elm_genlist_item_tooltip_content_cb_set() - * - * @ingroup Genlist - */ - EAPI void elm_genlist_item_tooltip_unset(Elm_Object_Item *item) EINA_ARG_NONNULL(1); - /** - * Set a different @b style for a given genlist item's tooltip. - * - * @param item genlist item with tooltip set - * @param style the theme style to use on tooltips (e.g. @c - * "default", @c "transparent", etc) - * - * Tooltips can have alternate styles to be displayed on, - * which are defined by the theme set on Elementary. This function - * works analogously as elm_object_tooltip_style_set(), but here - * applied only to genlist item objects. The default style for - * tooltips is @c "default". - * - * @note before you set a style you should define a tooltip with - * elm_genlist_item_tooltip_content_cb_set() or - * elm_genlist_item_tooltip_text_set() - * - * @see elm_genlist_item_tooltip_style_get() - * - * @ingroup Genlist - */ - EAPI void elm_genlist_item_tooltip_style_set(Elm_Object_Item *item, const char *style) EINA_ARG_NONNULL(1); - /** - * Get the style set a given genlist item's tooltip. - * - * @param item genlist item with tooltip already set on. - * @return style the theme style in use, which defaults to - * "default". If the object does not have a tooltip set, - * then @c NULL is returned. - * - * @see elm_genlist_item_tooltip_style_set() for more details - * - * @ingroup Genlist - */ - EAPI const char *elm_genlist_item_tooltip_style_get(const Elm_Object_Item *item) EINA_ARG_NONNULL(1); - /** - * @brief Disable size restrictions on an object's tooltip - * @param item The tooltip's anchor object - * @param disable If EINA_TRUE, size restrictions are disabled - * @return EINA_FALSE on failure, EINA_TRUE on success - * - * This function allows a tooltip to expand beyond its parant window's canvas. - * It will instead be limited only by the size of the display. - */ - EAPI Eina_Bool elm_genlist_item_tooltip_size_restrict_disable(Elm_Object_Item *item, Eina_Bool disable); - /** - * @brief Retrieve size restriction state of an object's tooltip - * @param item The tooltip's anchor object - * @return If EINA_TRUE, size restrictions are disabled - * - * This function returns whether a tooltip is allowed to expand beyond - * its parant window's canvas. - * It will instead be limited only by the size of the display. - */ - EAPI Eina_Bool elm_genlist_item_tooltip_size_restrict_disabled_get(const Elm_Object_Item *item); - /** - * Set the type of mouse pointer/cursor decoration to be shown, - * when the mouse pointer is over the given genlist widget item - * - * @param item genlist item to customize cursor on - * @param cursor the cursor type's name - * - * This function works analogously as elm_object_cursor_set(), but - * here the cursor's changing area is restricted to the item's - * area, and not the whole widget's. Note that that item cursors - * have precedence over widget cursors, so that a mouse over @p - * item will always show cursor @p type. - * - * If this function is called twice for an object, a previously set - * cursor will be unset on the second call. - * - * @see elm_object_cursor_set() - * @see elm_genlist_item_cursor_get() - * @see elm_genlist_item_cursor_unset() - * - * @ingroup Genlist - */ - EAPI void elm_genlist_item_cursor_set(Elm_Object_Item *item, const char *cursor) EINA_ARG_NONNULL(1); - /** - * Get the type of mouse pointer/cursor decoration set to be shown, - * when the mouse pointer is over the given genlist widget item - * - * @param item genlist item with custom cursor set - * @return the cursor type's name or @c NULL, if no custom cursors - * were set to @p item (and on errors) - * - * @see elm_object_cursor_get() - * @see elm_genlist_item_cursor_set() for more details - * @see elm_genlist_item_cursor_unset() - * - * @ingroup Genlist - */ - EAPI const char *elm_genlist_item_cursor_get(const Elm_Object_Item *item) EINA_ARG_NONNULL(1); - /** - * Unset any custom mouse pointer/cursor decoration set to be - * shown, when the mouse pointer is over the given genlist widget - * item, thus making it show the @b default cursor again. - * - * @param item a genlist item - * - * Use this call to undo any custom settings on this item's cursor - * decoration, bringing it back to defaults (no custom style set). - * - * @see elm_object_cursor_unset() - * @see elm_genlist_item_cursor_set() for more details - * - * @ingroup Genlist - */ - EAPI void elm_genlist_item_cursor_unset(Elm_Object_Item *item) EINA_ARG_NONNULL(1); - /** - * Set a different @b style for a given custom cursor set for a - * genlist item. - * - * @param item genlist item with custom cursor set - * @param style the theme style to use (e.g. @c "default", - * @c "transparent", etc) - * - * This function only makes sense when one is using custom mouse - * cursor decorations defined in a theme file , which can - * have, given a cursor name/type, alternate styles on - * it. It works analogously as elm_object_cursor_style_set(), but - * here applied only to genlist item objects. - * - * @warning Before you set a cursor style you should have defined a - * custom cursor previously on the item, with - * elm_genlist_item_cursor_set() - * - * @see elm_genlist_item_cursor_engine_only_set() - * @see elm_genlist_item_cursor_style_get() - * - * @ingroup Genlist - */ - EAPI void elm_genlist_item_cursor_style_set(Elm_Object_Item *item, const char *style) EINA_ARG_NONNULL(1); - /** - * Get the current @b style set for a given genlist item's custom - * cursor - * - * @param item genlist item with custom cursor set. - * @return style the cursor style in use. If the object does not - * have a cursor set, then @c NULL is returned. - * - * @see elm_genlist_item_cursor_style_set() for more details - * - * @ingroup Genlist - */ - EAPI const char *elm_genlist_item_cursor_style_get(const Elm_Object_Item *item) EINA_ARG_NONNULL(1); - /** - * Set if the (custom) cursor for a given genlist item should be - * searched in its theme, also, or should only rely on the - * rendering engine. - * - * @param item item with custom (custom) cursor already set on - * @param engine_only Use @c EINA_TRUE to have cursors looked for - * only on those provided by the rendering engine, @c EINA_FALSE to - * have them searched on the widget's theme, as well. - * - * @note This call is of use only if you've set a custom cursor - * for genlist items, with elm_genlist_item_cursor_set(). - * - * @note By default, cursors will only be looked for between those - * provided by the rendering engine. - * - * @ingroup Genlist - */ - EAPI void elm_genlist_item_cursor_engine_only_set(Elm_Object_Item *item, Eina_Bool engine_only) EINA_ARG_NONNULL(1); - /** - * Get if the (custom) cursor for a given genlist item is being - * searched in its theme, also, or is only relying on the rendering - * engine. - * - * @param item a genlist item - * @return @c EINA_TRUE, if cursors are being looked for only on - * those provided by the rendering engine, @c EINA_FALSE if they - * are being searched on the widget's theme, as well. - * - * @see elm_genlist_item_cursor_engine_only_set(), for more details - * - * @ingroup Genlist - */ - EAPI Eina_Bool elm_genlist_item_cursor_engine_only_get(const Elm_Object_Item *item) EINA_ARG_NONNULL(1); - /** - * Update the contents of all realized items. - * - * @param obj The genlist object. - * - * This updates all realized items by calling all the item class functions again - * to get the contents, texts and states. Use this when the original - * item data has changed and the changes are desired to be reflected. - * - * To update just one item, use elm_genlist_item_update(). - * - * @see elm_genlist_realized_items_get() - * @see elm_genlist_item_update() - * - * @ingroup Genlist - */ - EAPI void elm_genlist_realized_items_update(Evas_Object *obj) EINA_ARG_NONNULL(1); - /** - * Activate a genlist mode on an item - * - * @param item The genlist item - * @param mode Mode name - * @param mode_set Boolean to define set or unset mode. - * - * A genlist mode is a different way of selecting an item. Once a mode is - * activated on an item, any other selected item is immediately unselected. - * This feature provides an easy way of implementing a new kind of animation - * for selecting an item, without having to entirely rewrite the item style - * theme. However, the elm_genlist_selected_* API can't be used to get what - * item is activate for a mode. - * - * The current item style will still be used, but applying a genlist mode to - * an item will select it using a different kind of animation. - * - * The current active item for a mode can be found by - * elm_genlist_mode_item_get(). - * - * The characteristics of genlist mode are: - * - Only one mode can be active at any time, and for only one item. - * - Genlist handles deactivating other items when one item is activated. - * - A mode is defined in the genlist theme (edc), and more modes can easily - * be added. - * - A mode style and the genlist item style are different things. They - * can be combined to provide a default style to the item, with some kind - * of animation for that item when the mode is activated. - * - * When a mode is activated on an item, a new view for that item is created. - * The theme of this mode defines the animation that will be used to transit - * the item from the old view to the new view. This second (new) view will be - * active for that item while the mode is active on the item, and will be - * destroyed after the mode is totally deactivated from that item. - * - * @see elm_genlist_mode_get() - * @see elm_genlist_mode_item_get() - * - * @ingroup Genlist - */ - EAPI void elm_genlist_item_mode_set(Elm_Object_Item *it, const char *mode_type, Eina_Bool mode_set) EINA_ARG_NONNULL(1, 2); - /** - * Get the last (or current) genlist mode used. - * - * @param obj The genlist object - * - * This function just returns the name of the last used genlist mode. It will - * be the current mode if it's still active. - * - * @see elm_genlist_item_mode_set() - * @see elm_genlist_mode_item_get() - * - * @ingroup Genlist - */ - EAPI const char *elm_genlist_mode_get(const Evas_Object *obj) EINA_ARG_NONNULL(1); - /** - * Get active genlist mode item - * - * @param obj The genlist object - * @return The active item for that current mode. Or @c NULL if no item is - * activated with any mode. - * - * This function returns the item that was activated with a mode, by the - * function elm_genlist_item_mode_set(). - * - * @see elm_genlist_item_mode_set() - * @see elm_genlist_mode_get() - * - * @ingroup Genlist - */ - EAPI const Elm_Object_Item *elm_genlist_mode_item_get(const Evas_Object *obj) EINA_ARG_NONNULL(1); +#define Elm_Genlist_Item_Class_Func Elm_Gen_Item_Class_Func +/** + * Add a new genlist widget to the given parent Elementary + * (container) object + * + * @param parent The parent object + * @return a new genlist widget handle or @c NULL, on errors + * + * This function inserts a new genlist widget on the canvas. + * + * @see elm_genlist_item_append() + * @see elm_object_item_del() + * @see elm_genlist_clear() + * + * @ingroup Genlist + */ +EAPI Evas_Object *elm_genlist_add(Evas_Object *parent); - /** - * Set reorder mode - * - * @param obj The genlist object - * @param reorder_mode The reorder mode - * (EINA_TRUE = on, EINA_FALSE = off) - * - * @ingroup Genlist - */ - EAPI void elm_genlist_reorder_mode_set(Evas_Object *obj, Eina_Bool reorder_mode) EINA_ARG_NONNULL(1); +/** + * Remove all items from a given genlist widget. + * + * @param obj The genlist object + * + * This removes (and deletes) all items in @p obj, leaving it empty. + * + * @see elm_object_item_del(), to remove just one item. + * + * @ingroup Genlist + */ +EAPI void elm_genlist_clear(Evas_Object *obj); - /** - * Get the reorder mode - * - * @param obj The genlist object - * @return The reorder mode - * (EINA_TRUE = on, EINA_FALSE = off) - * - * @ingroup Genlist - */ - EAPI Eina_Bool elm_genlist_reorder_mode_get(const Evas_Object *obj) EINA_ARG_NONNULL(1); +/** + * Enable or disable multi-selection in the genlist + * + * @param obj The genlist object + * @param multi Multi-select enable/disable. Default is disabled. + * + * This enables (@c EINA_TRUE) or disables (@c EINA_FALSE) multi-selection in + * the list. This allows more than 1 item to be selected. To retrieve the list + * of selected items, use elm_genlist_selected_items_get(). + * + * @see elm_genlist_selected_items_get() + * @see elm_genlist_multi_select_get() + * + * @ingroup Genlist + */ +EAPI void elm_genlist_multi_select_set(Evas_Object *obj, Eina_Bool multi); + +/** + * Gets if multi-selection in genlist is enabled or disabled. + * + * @param obj The genlist object + * @return Multi-select enabled/disabled + * (@c EINA_TRUE = enabled/@c EINA_FALSE = disabled). Default is @c EINA_FALSE. + * + * @see elm_genlist_multi_select_set() + * + * @ingroup Genlist + */ +EAPI Eina_Bool elm_genlist_multi_select_get(const Evas_Object *obj); + +/** + * This sets the horizontal stretching mode. + * + * @param obj The genlist object + * @param mode The mode to use (one of #ELM_LIST_SCROLL or #ELM_LIST_LIMIT). + * + * This sets the mode used for sizing items horizontally. Valid modes + * are #ELM_LIST_LIMIT and #ELM_LIST_SCROLL. The default is + * ELM_LIST_SCROLL. This mode means that if items are too wide to fit, + * the scroller will scroll horizontally. Otherwise items are expanded + * to fill the width of the viewport of the scroller. If it is + * ELM_LIST_LIMIT, items will be expanded to the viewport width and + * limited to that size. + * + * @see elm_genlist_mode_get() + * + * @ingroup Genlist + */ +EAPI void elm_genlist_mode_set(Evas_Object *obj, Elm_List_Mode mode); + +/** + * Gets the horizontal stretching mode. + * + * @param obj The genlist object + * @return The mode to use + * (#ELM_LIST_LIMIT, #ELM_LIST_SCROLL) + * + * @see elm_genlist_horizontal_set() + * + * @ingroup Genlist + */ +EAPI Elm_List_Mode elm_genlist_mode_get(const Evas_Object *obj); + +/** + * Set the always select mode. + * + * @param obj The genlist object + * @param always_select The always select mode (@c EINA_TRUE = on, @c + * EINA_FALSE = off). Default is @c EINA_FALSE. + * + * Items will only call their selection func and callback when first + * becoming selected. Any further clicks will do nothing, unless you + * enable always select with elm_genlist_always_select_mode_set(). + * This means that, even if selected, every click will make the selected + * callbacks be called. + * + * @see elm_genlist_always_select_mode_get() + * + * @ingroup Genlist + */ +EAPI void elm_genlist_always_select_mode_set(Evas_Object *obj, Eina_Bool always_select); + +/** + * Get the always select mode. + * + * @param obj The genlist object + * @return The always select mode + * (@c EINA_TRUE = on, @c EINA_FALSE = off) + * + * @see elm_genlist_always_select_mode_set() + * + * @ingroup Genlist + */ +EAPI Eina_Bool elm_genlist_always_select_mode_get(const Evas_Object *obj); + +/** + * Enable/disable the no select mode. + * + * @param obj The genlist object + * @param no_select The no select mode + * (EINA_TRUE = on, EINA_FALSE = off) + * + * This will turn off the ability to select items entirely and they + * will neither appear selected nor call selected callback functions. + * + * @see elm_genlist_no_select_mode_get() + * + * @ingroup Genlist + */ +EAPI void elm_genlist_no_select_mode_set(Evas_Object *obj, Eina_Bool no_select); + +/** + * Gets whether the no select mode is enabled. + * + * @param obj The genlist object + * @return The no select mode + * (@c EINA_TRUE = on, @c EINA_FALSE = off) + * + * @see elm_genlist_no_select_mode_set() + * + * @ingroup Genlist + */ +EAPI Eina_Bool elm_genlist_no_select_mode_get(const Evas_Object *obj); + +/** + * Enable/disable compress mode. + * + * @param obj The genlist object + * @param compress The compress mode + * (@c EINA_TRUE = on, @c EINA_FALSE = off). Default is @c EINA_FALSE. + * + * This will enable the compress mode where items are "compressed" + * horizontally to fit the genlist scrollable viewport width. This is + * special for genlist. Do not rely on + * elm_genlist_horizontal_set() being set to @c ELM_LIST_COMPRESS to + * work as genlist needs to handle it specially. + * + * @see elm_genlist_compress_mode_get() + * + * @ingroup Genlist + */ +EAPI void elm_genlist_compress_mode_set(Evas_Object *obj, Eina_Bool compress); + +/** + * Get whether the compress mode is enabled. + * + * @param obj The genlist object + * @return The compress mode + * (@c EINA_TRUE = on, @c EINA_FALSE = off) + * + * @see elm_genlist_compress_mode_set() + * + * @ingroup Genlist + */ +EAPI Eina_Bool elm_genlist_compress_mode_get(const Evas_Object *obj); + +/** + * Enable/disable height-for-width mode. + * + * @param obj The genlist object + * @param setting The height-for-width mode (@c EINA_TRUE = on, + * @c EINA_FALSE = off). Default is @c EINA_FALSE. + * + * With height-for-width mode the item width will be fixed (restricted + * to a minimum of) to the list width when calculating its size in + * order to allow the height to be calculated based on it. This allows, + * for instance, text block to wrap lines if the Edje part is + * configured with "text.min: 0 1". + * + * @note This mode will make list resize slower as it will have to + * recalculate every item height again whenever the list width + * changes! + * + * @note When height-for-width mode is enabled, it also enables + * compress mode (see elm_genlist_compress_mode_set()) and + * disables homogeneous (see elm_genlist_homogeneous_set()). + * + * @ingroup Genlist + */ +EAPI void elm_genlist_height_for_width_mode_set(Evas_Object *obj, Eina_Bool height_for_width); + +/** + * Get whether the height-for-width mode is enabled. + * + * @param obj The genlist object + * @return The height-for-width mode (@c EINA_TRUE = on, @c EINA_FALSE = + * off) + * + * @ingroup Genlist + */ +EAPI Eina_Bool elm_genlist_height_for_width_mode_get(const Evas_Object *obj); + +/** + * Enable/disable horizontal and vertical bouncing effect. + * + * @param obj The genlist object + * @param h_bounce Allow bounce horizontally (@c EINA_TRUE = on, @c + * EINA_FALSE = off). Default is @c EINA_FALSE. + * @param v_bounce Allow bounce vertically (@c EINA_TRUE = on, @c + * EINA_FALSE = off). Default is @c EINA_TRUE. + * + * This will enable or disable the scroller bouncing effect for the + * genlist. See elm_scroller_bounce_set() for details. + * + * @see elm_scroller_bounce_set() + * @see elm_genlist_bounce_get() + * + * @ingroup Genlist + */ +EAPI void elm_genlist_bounce_set(Evas_Object *obj, Eina_Bool h_bounce, Eina_Bool v_bounce); + +/** + * Get whether the horizontal and vertical bouncing effect is enabled. + * + * @param obj The genlist object + * @param h_bounce Pointer to a bool to receive if the bounce horizontally + * option is set. + * @param v_bounce Pointer to a bool to receive if the bounce vertically + * option is set. + * + * @see elm_genlist_bounce_set() + * + * @ingroup Genlist + */ +EAPI void elm_genlist_bounce_get(const Evas_Object *obj, Eina_Bool *h_bounce, Eina_Bool *v_bounce); + +/** + * Enable/disable homogeneous mode. + * + * @param obj The genlist object + * @param homogeneous Assume the items within the genlist are of the + * same height and width (EINA_TRUE = on, EINA_FALSE = off). Default is @c + * EINA_FALSE. + * + * This will enable the homogeneous mode where items are of the same + * height and width so that genlist may do the lazy-loading at its + * maximum (which increases the performance for scrolling the list). This + * implies 'compressed' mode. + * + * @see elm_genlist_compress_mode_set() + * @see elm_genlist_homogeneous_get() + * + * @ingroup Genlist + */ +EAPI void elm_genlist_homogeneous_set(Evas_Object *obj, Eina_Bool homogeneous); + +/** + * Get whether the homogeneous mode is enabled. + * + * @param obj The genlist object + * @return Assume the items within the genlist are of the same height + * and width (EINA_TRUE = on, EINA_FALSE = off) + * + * @see elm_genlist_homogeneous_set() + * + * @ingroup Genlist + */ +EAPI Eina_Bool elm_genlist_homogeneous_get(const Evas_Object *obj); + +/** + * Set the maximum number of items within an item block + * + * @param obj The genlist object + * @param n Maximum number of items within an item block. Default is 32. + * + * This will configure the block count to tune to the target with + * particular performance matrix. + * + * A block of objects will be used to reduce the number of operations due to + * many objects in the screen. It can determine the visibility, or if the + * object has changed, it theme needs to be updated, etc. doing this kind of + * calculation to the entire block, instead of per object. + * + * The default value for the block count is enough for most lists, so unless + * you know you will have a lot of objects visible in the screen at the same + * time, don't try to change this. + * + * @see elm_genlist_block_count_get() + * @see @ref Genlist_Implementation + * + * @ingroup Genlist + */ +EAPI void elm_genlist_block_count_set(Evas_Object *obj, int n); + +/** + * Get the maximum number of items within an item block + * + * @param obj The genlist object + * @return Maximum number of items within an item block + * + * @see elm_genlist_block_count_set() + * + * @ingroup Genlist + */ +EAPI int elm_genlist_block_count_get(const Evas_Object *obj); + +/** + * Set the timeout in seconds for the longpress event. + * + * @param obj The genlist object + * @param timeout timeout in seconds. Default is 1. + * + * This option will change how long it takes to send an event "longpressed" + * after the mouse down signal is sent to the list. If this event occurs, no + * "clicked" event will be sent. + * + * @see elm_genlist_longpress_timeout_set() + * + * @ingroup Genlist + */ +EAPI void elm_genlist_longpress_timeout_set(Evas_Object *obj, double timeout); + +/** + * Get the timeout in seconds for the longpress event. + * + * @param obj The genlist object + * @return timeout in seconds + * + * @see elm_genlist_longpress_timeout_get() + * + * @ingroup Genlist + */ +EAPI double elm_genlist_longpress_timeout_get(const Evas_Object *obj); + +/** + * Append a new item in a given genlist widget. + * + * @param obj The genlist object + * @param itc The item class for the item + * @param data The item data + * @param parent The parent item, or NULL if none + * @param flags Item flags + * @param func Convenience function called when the item is selected + * @param func_data Data passed to @p func above. + * @return A handle to the item added or @c NULL if not possible + * + * This adds the given item to the end of the list or the end of + * the children list if the @p parent is given. + * + * @see elm_genlist_item_prepend() + * @see elm_genlist_item_insert_before() + * @see elm_genlist_item_insert_after() + * @see elm_object_item_del() + * + * @ingroup Genlist + */ +EAPI Elm_Object_Item *elm_genlist_item_append(Evas_Object *obj, const Elm_Genlist_Item_Class *itc, const void *data, Elm_Object_Item *parent, Elm_Genlist_Item_Flags flags, Evas_Smart_Cb func, const void *func_data); + +/** + * Prepend a new item in a given genlist widget. + * + * @param obj The genlist object + * @param itc The item class for the item + * @param data The item data + * @param parent The parent item, or NULL if none + * @param flags Item flags + * @param func Convenience function called when the item is selected + * @param func_data Data passed to @p func above. + * @return A handle to the item added or NULL if not possible + * + * This adds an item to the beginning of the list or beginning of the + * children of the parent if given. + * + * @see elm_genlist_item_append() + * @see elm_genlist_item_insert_before() + * @see elm_genlist_item_insert_after() + * @see elm_object_item_del() + * + * @ingroup Genlist + */ +EAPI Elm_Object_Item *elm_genlist_item_prepend(Evas_Object *obj, const Elm_Genlist_Item_Class *itc, const void *data, Elm_Object_Item *parent, Elm_Genlist_Item_Flags flags, Evas_Smart_Cb func, const void *func_data); + +/** + * Insert an item before another in a genlist widget + * + * @param obj The genlist object + * @param itc The item class for the item + * @param data The item data + * @param before The item to place this new one before. + * @param flags Item flags + * @param func Convenience function called when the item is selected + * @param func_data Data passed to @p func above. + * @return A handle to the item added or @c NULL if not possible + * + * This inserts an item before another in the list. It will be in the + * same tree level or group as the item it is inserted before. + * + * @see elm_genlist_item_append() + * @see elm_genlist_item_prepend() + * @see elm_genlist_item_insert_after() + * @see elm_object_item_del() + * + * @ingroup Genlist + */ +EAPI Elm_Object_Item *elm_genlist_item_insert_before(Evas_Object *obj, const Elm_Genlist_Item_Class *itc, const void *data, Elm_Object_Item *parent, Elm_Object_Item *before, Elm_Genlist_Item_Flags flags, Evas_Smart_Cb func, const void *func_data); + +/** + * Insert an item after another in a genlist widget + * + * @param obj The genlist object + * @param itc The item class for the item + * @param data The item data + * @param after The item to place this new one after. + * @param flags Item flags + * @param func Convenience function called when the item is selected + * @param func_data Data passed to @p func above. + * @return A handle to the item added or @c NULL if not possible + * + * This inserts an item after another in the list. It will be in the + * same tree level or group as the item it is inserted after. + * + * @see elm_genlist_item_append() + * @see elm_genlist_item_prepend() + * @see elm_genlist_item_insert_before() + * @see elm_object_item_del() + * + * @ingroup Genlist + */ +EAPI Elm_Object_Item *elm_genlist_item_insert_after(Evas_Object *obj, const Elm_Genlist_Item_Class *itc, const void *data, Elm_Object_Item *parent, Elm_Object_Item *after, Elm_Genlist_Item_Flags flags, Evas_Smart_Cb func, const void *func_data); + +/** + * Insert a new item into the sorted genlist object + * + * @param obj The genlist object + * @param itc The item class for the item + * @param data The item data + * @param parent The parent item, or NULL if none + * @param flags Item flags + * @param comp The function called for the sort + * @param func Convenience function called when item selected + * @param func_data Data passed to @p func above. + * @return A handle to the item added or NULL if not possible + * + * @ingroup Genlist + */ +// XXX: deprecate elm_genlist_item_sorted_insert() and rename +// elm_genlist_item_direct_sorted_insert() +EAPI Elm_Object_Item *elm_genlist_item_sorted_insert(Evas_Object *obj, const Elm_Genlist_Item_Class *itc, const void *data, Elm_Object_Item *parent, Elm_Genlist_Item_Flags flags, Eina_Compare_Cb comp, Evas_Smart_Cb func, const void *func_data); +EAPI Elm_Object_Item *elm_genlist_item_direct_sorted_insert(Evas_Object *obj, const Elm_Genlist_Item_Class *itc, const void *data, Elm_Object_Item *parent, Elm_Genlist_Item_Flags flags, Eina_Compare_Cb comp, Evas_Smart_Cb func, const void *func_data); + +/* operations to retrieve existing items */ +/** + * Get the selectd item in the genlist. + * + * @param obj The genlist object + * @return The selected item, or NULL if none is selected. + * + * This gets the selected item in the list (if multi-selection is enabled, only + * the item that was first selected in the list is returned - which is not very + * useful, so see elm_genlist_selected_items_get() for when multi-selection is + * used). + * + * If no item is selected, NULL is returned. + * + * @see elm_genlist_selected_items_get() + * + * @ingroup Genlist + */ +EAPI Elm_Object_Item *elm_genlist_selected_item_get(const Evas_Object *obj); + +/** + * Get a list of selected items in the genlist. + * + * @param obj The genlist object + * @return The list of selected items, or NULL if none are selected. + * + * It returns a list of the selected items. This list pointer is only valid so + * long as the selection doesn't change (no items are selected or unselected, or + * unselected implicitly by deletion). The list contains genlist items + * pointers. The order of the items in this list is the order which they were + * selected, i.e. the first item in this list is the first item that was + * selected, and so on. + * + * @note If not in multi-select mode, consider using function + * elm_genlist_selected_item_get() instead. + * + * @see elm_genlist_multi_select_set() + * @see elm_genlist_selected_item_get() + * + * @ingroup Genlist + */ +EAPI const Eina_List *elm_genlist_selected_items_get(const Evas_Object *obj); + +/** + * Get the mode item style of items in the genlist + * @param obj The genlist object + * @return The mode item style string, or NULL if none is specified + * + * This is a constant string and simply defines the name of the + * style that will be used for mode animations. It can be + * @c NULL if you don't plan to use Genlist mode. See + * elm_genlist_item_mode_set() for more info. + * + * @ingroup Genlist + */ +EAPI const char *elm_genlist_mode_item_style_get(const Evas_Object *obj); + +/** + * Set the mode item style of items in the genlist + * @param obj The genlist object + * @param style The mode item style string, or NULL if none is desired + * + * This is a constant string and simply defines the name of the + * style that will be used for mode animations. It can be + * @c NULL if you don't plan to use Genlist mode. See + * elm_genlist_item_mode_set() for more info. + * + * @ingroup Genlist + */ +EAPI void elm_genlist_mode_item_style_set(Evas_Object *obj, const char *style); + +/** + * Get a list of realized items in genlist + * + * @param obj The genlist object + * @return The list of realized items, nor NULL if none are realized. + * + * This returns a list of the realized items in the genlist. The list + * contains genlist item pointers. The list must be freed by the + * caller when done with eina_list_free(). The item pointers in the + * list are only valid so long as those items are not deleted or the + * genlist is not deleted. + * + * @see elm_genlist_realized_items_update() + * + * @ingroup Genlist + */ +EAPI Eina_List *elm_genlist_realized_items_get(const Evas_Object *obj); + +/** + * Get the item that is at the x, y canvas coords. + * + * @param obj The gelinst object. + * @param x The input x coordinate + * @param y The input y coordinate + * @param posret The position relative to the item returned here + * @return The item at the coordinates or NULL if none + * + * This returns the item at the given coordinates (which are canvas + * relative, not object-relative). If an item is at that coordinate, + * that item handle is returned, and if @p posret is not NULL, the + * integer pointed to is set to a value of -1, 0 or 1, depending if + * the coordinate is on the upper portion of that item (-1), on the + * middle section (0) or on the lower part (1). If NULL is returned as + * an item (no item found there), then posret may indicate -1 or 1 + * based if the coordinate is above or below all items respectively in + * the genlist. + * + * @ingroup Genlist + */ +EAPI Elm_Object_Item *elm_genlist_at_xy_item_get(const Evas_Object *obj, Evas_Coord x, Evas_Coord y, int *posret); + +/** + * Get the first item in the genlist + * + * This returns the first item in the list. + * + * @param obj The genlist object + * @return The first item, or NULL if none + * + * @ingroup Genlist + */ +EAPI Elm_Object_Item *elm_genlist_first_item_get(const Evas_Object *obj); + +/** + * Get the last item in the genlist + * + * This returns the last item in the list. + * + * @return The last item, or NULL if none + * + * @ingroup Genlist + */ +EAPI Elm_Object_Item *elm_genlist_last_item_get(const Evas_Object *obj); + +/** + * Set the scrollbar policy + * + * @param obj The genlist object + * @param policy_h Horizontal scrollbar policy. + * @param policy_v Vertical scrollbar policy. + * + * This sets the scrollbar visibility policy for the given genlist + * scroller. #ELM_SMART_SCROLLER_POLICY_AUTO means the scrollbar is + * made visible if it is needed, and otherwise kept hidden. + * #ELM_SMART_SCROLLER_POLICY_ON turns it on all the time, and + * #ELM_SMART_SCROLLER_POLICY_OFF always keeps it off. This applies + * respectively for the horizontal and vertical scrollbars. Default is + * #ELM_SMART_SCROLLER_POLICY_AUTO + * + * @see elm_genlist_scroller_policy_get() + * + * @ingroup Genlist + */ +EAPI void elm_genlist_scroller_policy_set(Evas_Object *obj, Elm_Scroller_Policy policy_h, Elm_Scroller_Policy policy_v); + +/** + * Get the scrollbar policy + * + * @param obj The genlist object + * @param policy_h Pointer to store the horizontal scrollbar policy. + * @param policy_v Pointer to store the vertical scrollbar policy. + * + * @see elm_genlist_scroller_policy_set() + * + * @ingroup Genlist + */ +EAPI void elm_genlist_scroller_policy_get(const Evas_Object *obj, Elm_Scroller_Policy *policy_h, Elm_Scroller_Policy *policy_v); + +/** + * Get the @b next item in a genlist widget's internal list of items, + * given a handle to one of those items. + * + * @param it The genlist item to fetch next from + * @return The item after @p item, or @c NULL if there's none (and + * on errors) + * + * This returns the item placed after the @p item, on the container + * genlist. + * + * @see elm_genlist_item_prev_get() + * + * @ingroup Genlist + */ +EAPI Elm_Object_Item *elm_genlist_item_next_get(const Elm_Object_Item *it); + +/** + * Get the @b previous item in a genlist widget's internal list of items, + * given a handle to one of those items. + * + * @param it The genlist item to fetch previous from + * @return The item before @p item, or @c NULL if there's none (and + * on errors) + * + * This returns the item placed before the @p item, on the container + * genlist. + * + * @see elm_genlist_item_next_get() + * + * @ingroup Genlist + */ +EAPI Elm_Object_Item *elm_genlist_item_prev_get(const Elm_Object_Item *it); + +/** + * Get the parent item of the given item + * + * @param it The item + * @return The parent of the item or @c NULL if it has no parent. + * + * This returns the item that was specified as parent of the item @p it on + * elm_genlist_item_append() and insertion related functions. + * + * @ingroup Genlist + */ +EAPI Elm_Object_Item *elm_genlist_item_parent_get(const Elm_Object_Item *it); + +/** + * Remove all sub-items (children) of the given item + * + * @param it The item + * + * This removes all items that are children (and their descendants) of the + * given item @p it. + * + * @see elm_genlist_clear() + * @see elm_object_item_del() + * + * @ingroup Genlist + */ +EAPI void elm_genlist_item_subitems_clear(Elm_Object_Item *it); + +/** + * Set whether a given genlist item is selected or not + * + * @param it The item + * @param selected Use @c EINA_TRUE, to make it selected, @c + * EINA_FALSE to make it unselected + * + * This sets the selected state of an item. If multi selection is + * not enabled on the containing genlist and @p selected is @c + * EINA_TRUE, any other previously selected items will get + * unselected in favor of this new one. + * + * @see elm_genlist_item_selected_get() + * + * @ingroup Genlist + */ +EAPI void elm_genlist_item_selected_set(Elm_Object_Item *it, Eina_Bool selected); + +/** + * Get whether a given genlist item is selected or not + * + * @param it The item + * @return @c EINA_TRUE, if it's selected, @c EINA_FALSE otherwise + * + * @see elm_genlist_item_selected_set() for more details + * + * @ingroup Genlist + */ +EAPI Eina_Bool elm_genlist_item_selected_get(const Elm_Object_Item *it); + +/** + * Sets the expanded state of an item. + * + * @param it The item + * @param expanded The expanded state (@c EINA_TRUE expanded, @c EINA_FALSE not expanded). + * + * This function flags the item of type #ELM_GENLIST_ITEM_SUBITEMS as + * expanded or not. + * + * The theme will respond to this change visually, and a signal "expanded" or + * "contracted" will be sent from the genlist with a pointer to the item that + * has been expanded/contracted. + * + * Calling this function won't show or hide any child of this item (if it is + * a parent). You must manually delete and create them on the callbacks fo + * the "expanded" or "contracted" signals. + * + * @see elm_genlist_item_expanded_get() + * + * @ingroup Genlist + */ +EAPI void elm_genlist_item_expanded_set(Elm_Object_Item *it, Eina_Bool expanded); + +/** + * Get the expanded state of an item + * + * @param it The item + * @return The expanded state + * + * This gets the expanded state of an item. + * + * @see elm_genlist_item_expanded_set() + * + * @ingroup Genlist + */ +EAPI Eina_Bool elm_genlist_item_expanded_get(const Elm_Object_Item *it); + +/** + * Get the depth of expanded item + * + * @param it The genlist item object + * @return The depth of expanded item + * + * @ingroup Genlist + */ +EAPI int elm_genlist_item_expanded_depth_get(const Elm_Object_Item *it); + + +/** + * Sets the display only state of an item. + * + * @param it The item + * @param display_only @c EINA_TRUE if the item is display only, @c + * EINA_FALSE otherwise. + * + * A display only item cannot be selected or unselected. It is for + * display only and not selecting or otherwise clicking, dragging + * etc. by the user, thus finger size rules will not be applied to + * this item. + * + * It's good to set group index items to display only state. + * + * @see elm_genlist_item_display_only_get() + * + * @ingroup Genlist + */ +EAPI void elm_genlist_item_display_only_set(Elm_Object_Item *it, Eina_Bool display_only); + +/** + * Get the display only state of an item + * + * @param it The item + * @return @c EINA_TRUE if the item is display only, @c + * EINA_FALSE otherwise. + * + * @see elm_genlist_item_display_only_set() + * + * @ingroup Genlist + */ +EAPI Eina_Bool elm_genlist_item_display_only_get(const Elm_Object_Item *it); + +/** + * Show the portion of a genlist's internal list containing a given + * item, immediately. + * + * @param it The item to display + * + * This causes genlist to jump to the given item @p it and show it (by + * immediately scrolling to that position), if it is not fully visible. + * + * @see elm_genlist_item_bring_in() + * @see elm_genlist_item_top_show() + * @see elm_genlist_item_middle_show() + * + * @ingroup Genlist + */ +EAPI void elm_genlist_item_show(Elm_Object_Item *it); + +/** + * Animatedly bring in, to the visible are of a genlist, a given + * item on it. + * + * @param it The item to display + * + * This causes genlist to jump to the given item @p it and show it (by + * animatedly scrolling), if it is not fully visible. This may use animation + * to do so and take a period of time + * + * @see elm_genlist_item_show() + * @see elm_genlist_item_top_bring_in() + * @see elm_genlist_item_middle_bring_in() + * + * @ingroup Genlist + */ +EAPI void elm_genlist_item_bring_in(Elm_Object_Item *it); + +/** + * Show the portion of a genlist's internal list containing a given + * item, immediately. + * + * @param it The item to display + * + * This causes genlist to jump to the given item @p it and show it (by + * immediately scrolling to that position), if it is not fully visible. + * + * The item will be positioned at the top of the genlist viewport. + * + * @see elm_genlist_item_show() + * @see elm_genlist_item_top_bring_in() + * + * @ingroup Genlist + */ +EAPI void elm_genlist_item_top_show(Elm_Object_Item *it); + +/** + * Animatedly bring in, to the visible are of a genlist, a given + * item on it. + * + * @param it The item + * + * This causes genlist to jump to the given item @p it and show it (by + * animatedly scrolling), if it is not fully visible. This may use animation + * to do so and take a period of time + * + * The item will be positioned at the top of the genlist viewport. + * + * @see elm_genlist_item_bring_in() + * @see elm_genlist_item_top_show() + * + * @ingroup Genlist + */ +EAPI void elm_genlist_item_top_bring_in(Elm_Object_Item *it); + +/** + * Show the portion of a genlist's internal list containing a given + * item, immediately. + * + * @param it The item to display + * + * This causes genlist to jump to the given item @p it and show it (by + * immediately scrolling to that position), if it is not fully visible. + * + * The item will be positioned at the middle of the genlist viewport. + * + * @see elm_genlist_item_show() + * @see elm_genlist_item_middle_bring_in() + * + * @ingroup Genlist + */ +EAPI void elm_genlist_item_middle_show(Elm_Object_Item *it); + +/** + * Animatedly bring in, to the visible are of a genlist, a given + * item on it. + * + * @param it The item + * + * This causes genlist to jump to the given item @p it and show it (by + * animatedly scrolling), if it is not fully visible. This may use animation + * to do so and take a period of time + * + * The item will be positioned at the middle of the genlist viewport. + * + * @see elm_genlist_item_bring_in() + * @see elm_genlist_item_middle_show() + * + * @ingroup Genlist + */ +EAPI void elm_genlist_item_middle_bring_in(Elm_Object_Item *it); + +/** + * Tells genlist to "orphan" contents fetchs by the item class + * + * @param it The item + * + * This instructs genlist to release references to contents in the item, + * meaning that they will no longer be managed by genlist and are + * floating "orphans" that can be re-used elsewhere if the user wants + * to. + * + * @ingroup Genlist + */ +EAPI void elm_genlist_item_contents_orphan(Elm_Object_Item *it); + +/** + * Get the real Evas object created to implement the view of a + * given genlist item + * + * @param it The genlist item. + * @return the Evas object implementing this item's view. + * + * This returns the actual Evas object used to implement the + * specified genlist item's view. This may be @c NULL, as it may + * not have been created or may have been deleted, at any time, by + * the genlist. Do not modify this object (move, resize, + * show, hide, etc.), as the genlist is controlling it. This + * function is for querying, emitting custom signals or hooking + * lower level callbacks for events on that object. Do not delete + * this object under any circumstances. + * + * @see elm_object_item_data_get() + * + * @ingroup Genlist + */ +EAPI const Evas_Object *elm_genlist_item_object_get(const Elm_Object_Item *it); + +/** + * Update the contents of an item + * + * @param it The item + * + * This updates an item by calling all the item class functions again + * to get the contents, texts and states. Use this when the original + * item data has changed and the changes are desired to be reflected. + * + * Use elm_genlist_realized_items_update() to update all already realized + * items. + * + * @see elm_genlist_realized_items_update() + * + * @ingroup Genlist + */ +EAPI void elm_genlist_item_update(Elm_Object_Item *it); + +/** + * Update the part of an item + * + * @param it The item + * @param parts The name of item's part + * @param itf The flags of item's part type + * + * This updates an item's part by calling item's fetching functions again + * to get the contents, texts and states. Use this when the original + * item data has changed and the changes are desired to be reflected. + * Second parts argument is used for globbing to match '*', '?', and '.' + * It can be used at updating multi fields. + * + * Use elm_genlist_realized_items_update() to update an item's all + * property. + * + * @see elm_genlist_item_update() + * + * @ingroup Genlist + */ +EAPI void elm_genlist_item_fields_update(Elm_Object_Item *it, const char *parts, Elm_Genlist_Item_Field_Flags itf); + +/** + * Update the item class of an item + * + * @param it The item + * @param itc The item class for the item + * + * This sets another class fo the item, changing the way that it is + * displayed. After changing the item class, elm_genlist_item_update() is + * called on the item @p it. + * + * @ingroup Genlist + */ +EAPI void elm_genlist_item_item_class_update(Elm_Object_Item *it, const Elm_Genlist_Item_Class *itc); +EAPI const Elm_Genlist_Item_Class *elm_genlist_item_item_class_get(const Elm_Object_Item *it); + +/** + * Set the text to be shown in a given genlist item's tooltips. + * + * @param it The genlist item + * @param text The text to set in the content + * + * This call will setup the text to be used as tooltip to that item + * (analogous to elm_object_tooltip_text_set(), but being item + * tooltips with higher precedence than object tooltips). It can + * have only one tooltip at a time, so any previous tooltip data + * will get removed. + * + * In order to set a content or something else as a tooltip, look at + * elm_genlist_item_tooltip_content_cb_set(). + * + * @ingroup Genlist + */ +EAPI void elm_genlist_item_tooltip_text_set(Elm_Object_Item *it, const char *text); + +/** + * Set the content to be shown in a given genlist item's tooltips + * + * @param it The genlist item. + * @param func The function returning the tooltip contents. + * @param data What to provide to @a func as callback data/context. + * @param del_cb Called when data is not needed anymore, either when + * another callback replaces @p func, the tooltip is unset with + * elm_genlist_item_tooltip_unset() or the owner @p item + * dies. This callback receives as its first parameter the + * given @p data, being @c event_info the item handle. + * + * This call will setup the tooltip's contents to @p item + * (analogous to elm_object_tooltip_content_cb_set(), but being + * item tooltips with higher precedence than object tooltips). It + * can have only one tooltip at a time, so any previous tooltip + * content will get removed. @p func (with @p data) will be called + * every time Elementary needs to show the tooltip and it should + * return a valid Evas object, which will be fully managed by the + * tooltip system, getting deleted when the tooltip is gone. + * + * In order to set just a text as a tooltip, look at + * elm_genlist_item_tooltip_text_set(). + * + * @ingroup Genlist + */ +EAPI void elm_genlist_item_tooltip_content_cb_set(Elm_Object_Item *it, Elm_Tooltip_Item_Content_Cb func, const void *data, Evas_Smart_Cb del_cb); + +/** + * Unset a tooltip from a given genlist item + * + * @param it genlist item to remove a previously set tooltip from. + * + * This call removes any tooltip set on @p item. The callback + * provided as @c del_cb to + * elm_genlist_item_tooltip_content_cb_set() will be called to + * notify it is not used anymore (and have resources cleaned, if + * need be). + * + * @see elm_genlist_item_tooltip_content_cb_set() + * + * @ingroup Genlist + */ +EAPI void elm_genlist_item_tooltip_unset(Elm_Object_Item *it); + +/** + * Set a different @b style for a given genlist item's tooltip. + * + * @param it genlist item with tooltip set + * @param style the theme style to use on tooltips (e.g. @c + * "default", @c "transparent", etc) + * + * Tooltips can have alternate styles to be displayed on, + * which are defined by the theme set on Elementary. This function + * works analogously as elm_object_tooltip_style_set(), but here + * applied only to genlist item objects. The default style for + * tooltips is @c "default". + * + * @note before you set a style you should define a tooltip with + * elm_genlist_item_tooltip_content_cb_set() or + * elm_genlist_item_tooltip_text_set() + * + * @see elm_genlist_item_tooltip_style_get() + * + * @ingroup Genlist + */ +EAPI void elm_genlist_item_tooltip_style_set(Elm_Object_Item *it, const char *style); + +/** + * Get the style set a given genlist item's tooltip. + * + * @param it genlist item with tooltip already set on. + * @return style the theme style in use, which defaults to + * "default". If the object does not have a tooltip set, + * then @c NULL is returned. + * + * @see elm_genlist_item_tooltip_style_set() for more details + * + * @ingroup Genlist + */ +EAPI const char *elm_genlist_item_tooltip_style_get(const Elm_Object_Item *it); + +/** + * @brief Disable size restrictions on an object's tooltip + * @param it The tooltip's anchor object + * @param disable If EINA_TRUE, size restrictions are disabled + * @return EINA_FALSE on failure, EINA_TRUE on success + * + * This function allows a tooltip to expand beyond its parant window's canvas. + * It will instead be limited only by the size of the display. + */ +EAPI Eina_Bool elm_genlist_item_tooltip_window_mode_set(Elm_Object_Item *it, Eina_Bool disable); + +/** + * @brief Retrieve size restriction state of an object's tooltip + * @param it The tooltip's anchor object + * @return If EINA_TRUE, size restrictions are disabled + * + * This function returns whether a tooltip is allowed to expand beyond + * its parant window's canvas. + * It will instead be limited only by the size of the display. + */ +EAPI Eina_Bool elm_genlist_item_tooltip_window_mode_get(const Elm_Object_Item *it); + +/** + * Set the type of mouse pointer/cursor decoration to be shown, + * when the mouse pointer is over the given genlist widget item + * + * @param it genlist item to customize cursor on + * @param cursor the cursor type's name + * + * This function works analogously as elm_object_cursor_set(), but + * here the cursor's changing area is restricted to the item's + * area, and not the whole widget's. Note that that item cursors + * have precedence over widget cursors, so that a mouse over @p + * item will always show cursor @p type. + * + * If this function is called twice for an object, a previously set + * cursor will be unset on the second call. + * + * @see elm_object_cursor_set() + * @see elm_genlist_item_cursor_get() + * @see elm_genlist_item_cursor_unset() + * + * @ingroup Genlist + */ +EAPI void elm_genlist_item_cursor_set(Elm_Object_Item *it, const char *cursor); + +/** + * Get the type of mouse pointer/cursor decoration set to be shown, + * when the mouse pointer is over the given genlist widget item + * + * @param it genlist item with custom cursor set + * @return the cursor type's name or @c NULL, if no custom cursors + * were set to @p item (and on errors) + * + * @see elm_object_cursor_get() + * @see elm_genlist_item_cursor_set() for more details + * @see elm_genlist_item_cursor_unset() + * + * @ingroup Genlist + */ +EAPI const char *elm_genlist_item_cursor_get(const Elm_Object_Item *it); + +/** + * Unset any custom mouse pointer/cursor decoration set to be + * shown, when the mouse pointer is over the given genlist widget + * item, thus making it show the @b default cursor again. + * + * @param it a genlist item + * + * Use this call to undo any custom settings on this item's cursor + * decoration, bringing it back to defaults (no custom style set). + * + * @see elm_object_cursor_unset() + * @see elm_genlist_item_cursor_set() for more details + * + * @ingroup Genlist + */ +EAPI void elm_genlist_item_cursor_unset(Elm_Object_Item *it); + +/** + * Set a different @b style for a given custom cursor set for a + * genlist item. + * + * @param it genlist item with custom cursor set + * @param style the theme style to use (e.g. @c "default", + * @c "transparent", etc) + * + * This function only makes sense when one is using custom mouse + * cursor decorations defined in a theme file , which can + * have, given a cursor name/type, alternate styles on + * it. It works analogously as elm_object_cursor_style_set(), but + * here applied only to genlist item objects. + * + * @warning Before you set a cursor style you should have defined a + * custom cursor previously on the item, with + * elm_genlist_item_cursor_set() + * + * @see elm_genlist_item_cursor_engine_only_set() + * @see elm_genlist_item_cursor_style_get() + * + * @ingroup Genlist + */ +EAPI void elm_genlist_item_cursor_style_set(Elm_Object_Item *it, const char *style); + +/** + * Get the current @b style set for a given genlist item's custom + * cursor + * + * @param it genlist item with custom cursor set. + * @return style the cursor style in use. If the object does not + * have a cursor set, then @c NULL is returned. + * + * @see elm_genlist_item_cursor_style_set() for more details + * + * @ingroup Genlist + */ +EAPI const char *elm_genlist_item_cursor_style_get(const Elm_Object_Item *it); + +/** + * Set if the (custom) cursor for a given genlist item should be + * searched in its theme, also, or should only rely on the + * rendering engine. + * + * @param it item with custom (custom) cursor already set on + * @param engine_only Use @c EINA_TRUE to have cursors looked for + * only on those provided by the rendering engine, @c EINA_FALSE to + * have them searched on the widget's theme, as well. + * + * @note This call is of use only if you've set a custom cursor + * for genlist items, with elm_genlist_item_cursor_set(). + * + * @note By default, cursors will only be looked for between those + * provided by the rendering engine. + * + * @ingroup Genlist + */ +EAPI void elm_genlist_item_cursor_engine_only_set(Elm_Object_Item *it, Eina_Bool engine_only); + +/** + * Get if the (custom) cursor for a given genlist item is being + * searched in its theme, also, or is only relying on the rendering + * engine. + * + * @param it a genlist item + * @return @c EINA_TRUE, if cursors are being looked for only on + * those provided by the rendering engine, @c EINA_FALSE if they + * are being searched on the widget's theme, as well. + * + * @see elm_genlist_item_cursor_engine_only_set(), for more details + * + * @ingroup Genlist + */ +EAPI Eina_Bool elm_genlist_item_cursor_engine_only_get(const Elm_Object_Item *it); + +/** + * Get the index of the item. It is only valid once displayed. + * + * @param item a genlist item + * @return the position inside the list of item. + * + * @ingroup Genlist + */ +EAPI int elm_genlist_item_index_get(Elm_Object_Item *it); + +/** + * Update the contents of all realized items. + * + * @param obj The genlist object. + * + * This updates all realized items by calling all the item class functions again + * to get the contents, texts and states. Use this when the original + * item data has changed and the changes are desired to be reflected. + * + * To update just one item, use elm_genlist_item_update(). + * + * @see elm_genlist_realized_items_get() + * @see elm_genlist_item_update() + * + * @ingroup Genlist + */ +EAPI void elm_genlist_realized_items_update(Evas_Object *obj); + +/** + * Activate a genlist mode on an item + * + * @param item The genlist item + * @param mode Mode name + * @param mode_set Boolean to define set or unset mode. + * + * A genlist mode is a different way of selecting an item. Once a mode is + * activated on an item, any other selected item is immediately unselected. + * This feature provides an easy way of implementing a new kind of animation + * for selecting an item, without having to entirely rewrite the item style + * theme. However, the elm_genlist_selected_* API can't be used to get what + * item is activate for a mode. + * + * The current item style will still be used, but applying a genlist mode to + * an item will select it using a different kind of animation. + * + * The current active item for a mode can be found by + * elm_genlist_mode_item_get(). + * + * The characteristics of genlist mode are: + * - Only one mode can be active at any time, and for only one item. + * - Genlist handles deactivating other items when one item is activated. + * - A mode is defined in the genlist theme (edc), and more modes can easily + * be added. + * - A mode style and the genlist item style are different things. They + * can be combined to provide a default style to the item, with some kind + * of animation for that item when the mode is activated. + * + * When a mode is activated on an item, a new view for that item is created. + * The theme of this mode defines the animation that will be used to transit + * the item from the old view to the new view. This second (new) view will be + * active for that item while the mode is active on the item, and will be + * destroyed after the mode is totally deactivated from that item. + * + * @see elm_genlist_mode_get() + * @see elm_genlist_mode_item_get() + * + * @ingroup Genlist + */ +EAPI void elm_genlist_item_mode_set(Elm_Object_Item *it, const char *mode_type, Eina_Bool mode_set); + +/** + * Get the last (or current) genlist mode used. + * + * @param obj The genlist object + * + * This function just returns the name of the last used genlist mode. It will + * be the current mode if it's still active. + * + * @see elm_genlist_item_mode_set() + * @see elm_genlist_mode_item_get() + * + * @ingroup Genlist + */ +EAPI const char *elm_genlist_mode_type_get(const Evas_Object *obj); + +/** + * Get active genlist mode item + * + * @param obj The genlist object + * @return The active item for that current mode. Or @c NULL if no item is + * activated with any mode. + * + * This function returns the item that was activated with a mode, by the + * function elm_genlist_item_mode_set(). + * + * @see elm_genlist_item_mode_set() + * @see elm_genlist_mode_get() + * + * @ingroup Genlist + */ +EAPI const Elm_Object_Item *elm_genlist_mode_item_get(const Evas_Object *obj); + +/** + * Set reorder mode + * + * @param obj The genlist object + * @param reorder_mode The reorder mode + * (EINA_TRUE = on, EINA_FALSE = off) + * + * @ingroup Genlist + */ +EAPI void elm_genlist_reorder_mode_set(Evas_Object *obj, Eina_Bool reorder_mode); + +/** + * Get the reorder mode + * + * @param obj The genlist object + * @return The reorder mode + * (EINA_TRUE = on, EINA_FALSE = off) + * + * @ingroup Genlist + */ +EAPI Eina_Bool elm_genlist_reorder_mode_get(const Evas_Object *obj); EAPI void elm_genlist_edit_mode_set(Evas_Object *obj, Eina_Bool edit_mode) EINA_ARG_NONNULL(1); EAPI Eina_Bool elm_genlist_edit_mode_get(const Evas_Object *obj) EINA_ARG_NONNULL(1); -- 2.7.4