1 #include <Elementary.h>
5 * @addtogroup Flipselector Flipselector
7 * A flip selector is a widget to show a set of label items, one at a
8 * time, with an animation when one changes the current selection
9 * (like the flip of calendar sheets, in the default theme).
11 * Signals that you can add callbacks for are:
13 * "selected" - when flipselector selected item is changed
14 * "overflowed" - when flipselector item is changed to first item
16 * "underflowed" - when flipselector item is changed to last item
20 /* TODO: ideally, the default theme would use map{} blocks on the TEXT
21 parts to implement their fading in/out propertly (as in the clock
23 /* TODO: if one ever wants to extend it to receiving generic widgets
24 as items, be my guest. in this case, remember to implement the
25 items tooltip infra. */
26 /* TODO: implement disabled mode -- disable_hook() and stuff. */
27 /* TODO: fix default theme image borders for looong strings as item
29 /* TODO: set text elipsis on labels if one enforces mininum size on
30 * the overall widget less the required for displaying it. */
31 /* TODO: find a way to, in the default theme, to detect we are
32 * bootstrapping (receiving the 1st message) and populate the downmost
33 * TEXT parts with the same text as the upmost, where appropriate. */
35 #define FLIP_FIRST_INTERVAL (0.85)
36 #define FLIP_MIN_INTERVAL (0.1)
37 #define MSG_FLIP_DOWN (1)
38 #define MSG_FLIP_UP (2)
39 #define MAX_LEN_DEFAULT (50)
41 #define DATA_GET eina_list_data_get
43 struct _Elm_Flipselector_Item
52 typedef struct _Widget_Data Widget_Data;
60 Eina_List *sentinel; /* item containing the largest label string */
64 double interval, first_interval;
67 static const char *widtype = NULL;
68 static void _del_hook(Evas_Object *obj);
69 static void _theme_hook(Evas_Object *obj);
70 static void _sizing_eval(Evas_Object *obj);
71 static void _update_view(Evas_Object *obj);
72 static void _callbacks_set(Evas_Object *obj);
73 static void _flip_up(Widget_Data *wd);
74 static void _flip_down(Widget_Data *wd);
76 static const char SIG_SELECTED[] = "selected";
77 static const char SIG_UNDERFLOWED[] = "underflowed";
78 static const char SIG_OVERFLOWED[] = "overflowed";
79 static const Evas_Smart_Cb_Description _signals[] = {
81 {SIG_UNDERFLOWED, ""},
86 #define ELM_FLIPSELECTOR_ITEM_CHECK_DELETED_RETURN(it, ...) \
87 ELM_WIDGET_ITEM_WIDTYPE_CHECK_OR_RETURN(it, __VA_ARGS__); \
90 ERR(""#it" has been DELETED.\n"); \
94 static Elm_Flipselector_Item *
95 _item_new(Evas_Object *obj, const char *label, Evas_Smart_Cb func, const void *data)
98 Elm_Flipselector_Item *it;
99 Widget_Data *wd = elm_widget_data_get(obj);
101 it = elm_widget_item_new(obj, Elm_Flipselector_Item);
106 if (len > wd->max_len)
109 it->label = eina_stringshare_add_length(label, len);
111 it->base.data = data;
113 /* TODO: no view here, but if one desires general contents in the
119 _item_free(Elm_Flipselector_Item *it)
121 eina_stringshare_del(it->label);
122 elm_widget_item_del(it);
126 _del_hook(Evas_Object *obj)
128 Elm_Flipselector_Item *item;
130 Widget_Data *wd = elm_widget_data_get(obj);
135 ERR("flipselector deleted while walking.\n");
137 EINA_LIST_FREE(wd->items, item)
140 if (wd->spin) ecore_timer_del(wd->spin);
145 _theme_hook(Evas_Object *obj)
150 wd = elm_widget_data_get(obj);
154 _elm_theme_object_set(obj, wd->base, "flipselector", "base",
155 elm_widget_style_get(obj));
156 edje_object_scale_set(wd->base,
157 elm_widget_scale_get(obj) * _elm_config->scale);
159 max_len = edje_object_data_get(wd->base, "max_len");
161 wd->max_len = MAX_LEN_DEFAULT;
164 wd->max_len = atoi(max_len);
166 wd->max_len = MAX_LEN_DEFAULT;
174 _sentinel_eval(Widget_Data *wd)
176 Elm_Flipselector_Item *it;
185 wd->sentinel = wd->items;
187 EINA_LIST_FOREACH(wd->items, l, it)
189 if (strlen(elm_flipselector_item_label_get(it)) >
190 strlen(elm_flipselector_item_label_get(DATA_GET(wd->sentinel))))
195 /* TODO: create a flag to avoid looping here all times */
197 _flipselector_process_deletions(Widget_Data *wd)
199 Elm_Flipselector_Item *it;
201 Eina_Bool skip = EINA_TRUE;
202 Eina_Bool sentinel_eval = EINA_FALSE;
204 wd->walking++; /* avoid nested deletions */
206 EINA_LIST_FOREACH(wd->items, l, it)
211 if (wd->current == l)
213 if (wd->current == wd->sentinel)
214 sentinel_eval = EINA_TRUE;
216 wd->current = eina_list_prev(wd->current);
218 wd->items = eina_list_remove(wd->items, it);
221 wd->current = wd->items;
226 if (eina_list_count(wd->items) <= 1)
227 edje_object_signal_emit(wd->base, "elm,state,button,hidden", "elm");
229 edje_object_signal_emit(wd->base, "elm,state,button,visible", "elm");
233 _update_view(wd->self);
242 _flipselector_walk(Widget_Data *wd)
246 ERR("walking was negative. fixed!\n");
253 _flipselector_unwalk(Widget_Data *wd)
258 ERR("walking became negative. fixed!\n");
265 _flipselector_process_deletions(wd);
269 _event_hook(Evas_Object *obj, Evas_Object *src __UNUSED__, Evas_Callback_Type type, void *event_info)
271 Evas_Event_Key_Down *ev;
273 Eina_Bool is_up = EINA_TRUE;
275 if (type != EVAS_CALLBACK_KEY_DOWN)
278 wd = elm_widget_data_get(obj);
283 if (ev->event_flags & EVAS_EVENT_FLAG_ON_HOLD)
286 if (elm_widget_disabled_get(obj))
289 if ((!strcmp(ev->keyname, "Down")) || (!strcmp(ev->keyname, "KP_Down")))
291 else if ((strcmp(ev->keyname, "Up")) && (strcmp(ev->keyname, "KP_Up")))
294 if (wd->spin) ecore_timer_del(wd->spin);
296 /* TODO: if direction setting via API is not coming in, replace
297 these calls by flip_{next,prev} */
298 _flipselector_walk(wd);
303 _flipselector_unwalk(wd);
305 ev->event_flags |= EVAS_EVENT_FLAG_ON_HOLD;
310 _on_focus_hook(void *data __UNUSED__, Evas_Object *obj)
312 Widget_Data *wd = elm_widget_data_get(obj);
316 /* FIXME: no treatment of this signal so far */
317 if (elm_widget_focus_get(obj))
319 edje_object_signal_emit(wd->base, "elm,action,focus", "elm");
320 evas_object_focus_set(wd->base, EINA_TRUE);
324 edje_object_signal_emit(wd->base, "elm,action,unfocus", "elm");
325 evas_object_focus_set(wd->base, EINA_FALSE);
330 _sizing_eval(Evas_Object *obj)
333 const char *tmp = NULL;
334 Evas_Coord minw = -1, minh = -1, w, h;
336 wd = elm_widget_data_get(obj);
340 elm_coords_finger_size_adjust(1, &minw, 2, &minh);
344 const char *label = \
345 elm_flipselector_item_label_get(DATA_GET(wd->sentinel));
347 tmp = edje_object_part_text_get(wd->base, "top");
348 edje_object_part_text_set(wd->base, "top", label);
351 edje_object_size_min_restricted_calc(wd->base, &minw, &minh, minw, minh);
352 elm_coords_finger_size_adjust(1, &minw, 2, &minh);
353 evas_object_size_hint_min_get(obj, &w, &h);
356 edje_object_part_text_set(wd->base, "top", tmp);
358 if (w > minw) minw = w;
359 if (h > minh) minh = h;
361 evas_object_size_hint_min_set(obj, minw, minh);
365 _update_view(Evas_Object *obj)
369 Elm_Flipselector_Item *item;
371 wd = elm_widget_data_get(obj);
376 item = DATA_GET(wd->current);
380 edje_object_part_text_set(wd->base, "top", label ? label : "");
381 edje_object_part_text_set(wd->base, "bottom", label ? label : "");
383 edje_object_message_signal_process(wd->base);
387 _changed(Widget_Data *wd)
389 Elm_Flipselector_Item *item;
391 item = DATA_GET(wd->current);
396 item->func((void *)item->base.data, item->base.widget, item);
398 evas_object_smart_callback_call(wd->self, SIG_SELECTED, item);
402 _send_msg(Widget_Data *wd, int flipside, char *label)
404 Edje_Message_String msg;
407 edje_object_message_send(wd->base, EDJE_MESSAGE_STRING, flipside, &msg);
408 edje_object_message_signal_process(wd->base);
414 _flip_up(Widget_Data *wd)
416 Elm_Flipselector_Item *item;
421 if (wd->current == wd->items)
423 wd->current = eina_list_last(wd->items);
424 evas_object_smart_callback_call(wd->self, SIG_UNDERFLOWED, NULL);
427 wd->current = eina_list_prev(wd->current);
429 item = DATA_GET(wd->current);
433 _send_msg(wd, MSG_FLIP_UP, (char *)item->label);
437 _signal_val_up(void *data)
439 Widget_Data *wd = elm_widget_data_get(data);
442 goto val_up_exit_on_error;
444 _flipselector_walk(wd);
446 if (wd->interval > FLIP_MIN_INTERVAL)
447 wd->interval = wd->interval / 1.05;
449 ecore_timer_interval_set(wd->spin, wd->interval);
453 _flipselector_unwalk(wd);
455 return ECORE_CALLBACK_RENEW;
457 val_up_exit_on_error:
458 return ECORE_CALLBACK_CANCEL;
462 _signal_val_up_start(void *data, Evas_Object *obj __UNUSED__, const char *emission __UNUSED__, const char *source __UNUSED__)
464 Widget_Data *wd = elm_widget_data_get(data);
468 wd->interval = wd->first_interval;
471 ecore_timer_del(wd->spin);
472 wd->spin = ecore_timer_add(wd->interval, _signal_val_up, data);
474 _signal_val_up(data);
478 _flip_down(Widget_Data *wd)
480 Elm_Flipselector_Item *item;
485 wd->current = eina_list_next(wd->current);
488 wd->current = wd->items;
489 evas_object_smart_callback_call(wd->self, SIG_OVERFLOWED, NULL);
492 item = DATA_GET(wd->current);
496 _send_msg(wd, MSG_FLIP_DOWN, (char *)item->label);
500 _signal_val_down(void *data)
502 Widget_Data *wd = elm_widget_data_get(data);
505 goto val_down_exit_on_error;
507 _flipselector_walk(wd);
509 if (wd->interval > FLIP_MIN_INTERVAL)
510 wd->interval = wd->interval / 1.05;
511 ecore_timer_interval_set(wd->spin, wd->interval);
515 _flipselector_unwalk(wd);
517 return ECORE_CALLBACK_RENEW;
519 val_down_exit_on_error:
520 return ECORE_CALLBACK_CANCEL;
524 _signal_val_down_start(void *data, Evas_Object *obj __UNUSED__, const char *emission __UNUSED__, const char *source __UNUSED__)
526 Widget_Data *wd = elm_widget_data_get(data);
530 wd->interval = wd->first_interval;
533 ecore_timer_del(wd->spin);
534 wd->spin = ecore_timer_add(wd->interval, _signal_val_down, data);
536 _signal_val_down(data);
540 _signal_val_change_stop(void *data, Evas_Object *obj __UNUSED__, const char *emission __UNUSED__, const char *source __UNUSED__)
542 Widget_Data *wd = elm_widget_data_get(data);
547 ecore_timer_del(wd->spin);
552 _callbacks_set(Evas_Object *obj)
554 Widget_Data *wd = elm_widget_data_get(obj);
556 edje_object_signal_callback_add(wd->base, "elm,action,up,start",
557 "", _signal_val_up_start, obj);
558 edje_object_signal_callback_add(wd->base, "elm,action,up,stop",
559 "", _signal_val_change_stop, obj);
560 edje_object_signal_callback_add(wd->base, "elm,action,down,start",
561 "", _signal_val_down_start, obj);
562 edje_object_signal_callback_add(wd->base, "elm,action,down,stop",
563 "", _signal_val_change_stop, obj);
567 * Add a new flipselector to the parent.
569 * @param parent The parent object
570 * @return The new object or NULL, if it cannot be created
572 * @ingroup Flipselector
575 elm_flipselector_add(Evas_Object *parent)
581 ELM_WIDGET_STANDARD_SETUP(wd, Widget_Data, parent, e, obj, NULL);
583 ELM_SET_WIDTYPE(widtype, "flipselector");
584 elm_widget_type_set(obj, "flipselector");
585 elm_widget_sub_object_add(parent, obj);
586 elm_widget_data_set(obj, wd);
588 elm_widget_del_hook_set(obj, _del_hook);
589 elm_widget_theme_hook_set(obj, _theme_hook);
590 /* TODO: elm_widget_disable_hook_set(obj, _disable_hook); */
592 elm_widget_can_focus_set(obj, EINA_TRUE);
593 elm_widget_on_focus_hook_set(obj, _on_focus_hook, NULL);
594 elm_widget_event_hook_set(obj, _event_hook);
596 wd->base = edje_object_add(e);
597 elm_widget_resize_object_set(obj, wd->base);
601 wd->first_interval = FLIP_FIRST_INTERVAL;
605 evas_object_smart_callbacks_descriptions_set(obj, _signals);
610 * Select next item of a flipselector.
612 * @param obj The flipselector object
614 * @ingroup Flipselector
617 elm_flipselector_flip_next(Evas_Object *obj)
619 ELM_CHECK_WIDTYPE(obj, widtype);
621 Widget_Data *wd = elm_widget_data_get(obj);
625 if (wd->spin) ecore_timer_del(wd->spin);
627 _flipselector_walk(wd);
629 _flipselector_unwalk(wd);
633 * Select previous item of a flipselector.
635 * @param obj The flipselector object
637 * @ingroup Flipselector
640 elm_flipselector_flip_prev(Evas_Object *obj)
642 ELM_CHECK_WIDTYPE(obj, widtype);
644 Widget_Data *wd = elm_widget_data_get(obj);
648 if (wd->spin) ecore_timer_del(wd->spin);
650 _flipselector_walk(wd);
652 _flipselector_unwalk(wd);
656 * Append item to a flipselector.
658 * @param obj The flipselector object
659 * @param label The label of new item
660 * @param func Convenience function called when item selected
661 * @param data Data passed to @p func above
662 * @return A handle to the item added or NULL, on errors
664 * @note The maximum length of the label is going to be determined by
665 * the widget's theme. Strings larger than that value are going to be
668 * @ingroup Flipselector
670 EAPI Elm_Flipselector_Item *
671 elm_flipselector_item_append(Evas_Object *obj, const char *label, void (*func)(void *data, Evas_Object *obj, void *event_info), void *data)
673 ELM_CHECK_WIDTYPE(obj, widtype) NULL;
675 Elm_Flipselector_Item *item;
678 wd = elm_widget_data_get(obj);
682 item = _item_new(obj, label, func, data);
686 wd->items = eina_list_append(wd->items, item);
688 wd->current = wd->items;
693 (strlen(elm_flipselector_item_label_get(item)) >
694 strlen(elm_flipselector_item_label_get(DATA_GET(wd->sentinel)))))
696 wd->sentinel = eina_list_last(wd->items);
700 if (eina_list_count(wd->items) >= 2)
701 edje_object_signal_emit(wd->base, "elm,state,button,visible", "elm");
707 * Prepend item to a flipselector.
709 * @param obj The flipselector object
710 * @param label The label of new item
711 * @param func Convenience function called when item selected
712 * @param data Data passed to @p func above
713 * @return A handle to the item added or NULL, on errors
715 * @note The maximum length of the label is going to be determined by
716 * the widget's theme. Strings larger than that value are going to be
719 * @ingroup Flipselector
721 EAPI Elm_Flipselector_Item *
722 elm_flipselector_item_prepend(Evas_Object *obj, const char *label, void (*func)(void *data, Evas_Object *obj, void *event_info), void *data)
724 ELM_CHECK_WIDTYPE(obj, widtype) NULL;
726 Elm_Flipselector_Item *item;
729 wd = elm_widget_data_get(obj);
733 item = _item_new(obj, label, func, data);
737 wd->items = eina_list_prepend(wd->items, item);
739 wd->current = wd->items;
744 (strlen(elm_flipselector_item_label_get(item)) >
745 strlen(elm_flipselector_item_label_get(DATA_GET(wd->sentinel)))))
747 wd->sentinel = wd->items;
751 if (eina_list_count(wd->items) >= 2)
752 edje_object_signal_emit(wd->base, "elm,state,button,visible", "elm");
757 /* TODO: account for deleted items? */
759 * Get a list of items in the flipselector.
761 * @param obj The flipselector object
762 * @return The list of items, or NULL on errors.
764 * @ingroup Flipselector
766 EAPI const Eina_List *
767 elm_flipselector_items_get(const Evas_Object *obj)
769 ELM_CHECK_WIDTYPE(obj, widtype) NULL;
771 Widget_Data *wd = elm_widget_data_get(obj);
779 * Get the first item in the flipselector
781 * @param obj The flipselector object
782 * @return The first item, or NULL if none
784 * @ingroup Flipselector
786 EAPI Elm_Flipselector_Item *
787 elm_flipselector_first_item_get(const Evas_Object *obj)
789 ELM_CHECK_WIDTYPE(obj, widtype) NULL;
791 Elm_Flipselector_Item *it;
795 wd = elm_widget_data_get(obj);
796 if (!wd || !wd->items)
799 EINA_LIST_FOREACH(wd->items, l, it)
811 * Get the last item in the flipselector
813 * @param obj The flipselector object
814 * @return The last item, or NULL if none
816 * @ingroup Flipselector
818 EAPI Elm_Flipselector_Item *
819 elm_flipselector_last_item_get(const Evas_Object *obj)
821 ELM_CHECK_WIDTYPE(obj, widtype) NULL;
823 Elm_Flipselector_Item *it;
827 wd = elm_widget_data_get(obj);
828 if (!wd || !wd->items)
831 EINA_LIST_REVERSE_FOREACH(wd->items, l, it)
843 * Get the selected item in a flipselector.
845 * @param obj The flipselector object
846 * @return The selected item, or NULL if none
848 * @ingroup Flipselector
850 EAPI Elm_Flipselector_Item *
851 elm_flipselector_selected_item_get(const Evas_Object *obj)
853 ELM_CHECK_WIDTYPE(obj, widtype) NULL;
855 Widget_Data *wd = elm_widget_data_get(obj);
856 if (!wd || !wd->current)
859 return DATA_GET(wd->current);
863 * Set the selected state of an item
865 * This sets the selected state (EINA_TRUE selected, EINA_FALSE not selected)
866 * of the given item @p item.
867 * If a new item is selected the previosly selected will be unselected.
868 * If the item @p item is unselected, the first item will be selected.
870 * @param item The item
871 * @param selected The selected state
873 * @ingroup Flipselector
876 elm_flipselector_item_selected_set(Elm_Flipselector_Item *item, Eina_Bool selected)
878 ELM_FLIPSELECTOR_ITEM_CHECK_DELETED_RETURN(item);
880 Elm_Flipselector_Item *_item, *cur;
881 int flipside = MSG_FLIP_UP;
885 wd = elm_widget_data_get(item->base.widget);
889 cur = DATA_GET(wd->current);
890 if ((selected) && (cur == item))
893 _flipselector_walk(wd);
895 if ((!selected) && (cur == item))
897 EINA_LIST_FOREACH(wd->items, l, _item)
902 _send_msg(wd, MSG_FLIP_UP, (char *)_item->label);
906 _flipselector_unwalk(wd);
910 EINA_LIST_FOREACH(wd->items, l, _item)
913 flipside = MSG_FLIP_DOWN;
918 _send_msg(wd, flipside, (char *)item->label);
923 _flipselector_unwalk(wd);
927 * Get the selected state of @p item.
929 * @param item The flipselector item
930 * @return If true, the item is selected
932 * @ingroup Flipselector
935 elm_flipselector_item_selected_get(const Elm_Flipselector_Item *item)
937 ELM_FLIPSELECTOR_ITEM_CHECK_DELETED_RETURN(item, EINA_FALSE);
940 wd = elm_widget_data_get(item->base.widget);
941 if (!wd) return EINA_FALSE;
942 return (eina_list_data_get(wd->current) == item);
946 * Delete a given item from a flipselector.
948 * @param item The item
950 * @ingroup Flipselector
953 elm_flipselector_item_del(Elm_Flipselector_Item *item)
955 ELM_FLIPSELECTOR_ITEM_CHECK_DELETED_RETURN(item);
959 wd = elm_widget_data_get(item->base.widget);
965 item->deleted = EINA_TRUE;
969 _flipselector_walk(wd);
971 wd->items = eina_list_remove(wd->items, item);
975 _flipselector_unwalk(wd);
979 * Get the label of a given flipselector item.
981 * @param item The item
982 * @return The label of a given item, or NULL if none
984 * @ingroup Flipselector
987 elm_flipselector_item_label_get(const Elm_Flipselector_Item *item)
989 ELM_FLIPSELECTOR_ITEM_CHECK_DELETED_RETURN(item, NULL);
991 Elm_Flipselector_Item *_item;
995 wd = elm_widget_data_get(item->base.widget);
996 if ((!wd) || (!wd->items))
999 EINA_LIST_FOREACH(wd->items, l, _item)
1007 * Set the label of a given flipselector item.
1009 * @param item The item
1010 * @param label The text label string in UTF-8
1012 * @ingroup Flipselector
1015 elm_flipselector_item_label_set(Elm_Flipselector_Item *item, const char *label)
1017 ELM_FLIPSELECTOR_ITEM_CHECK_DELETED_RETURN(item);
1022 if ((!item) || (!label))
1025 wd = elm_widget_data_get(item->base.widget);
1026 if ((!wd) || (!wd->items))
1029 l = eina_list_data_find_list(wd->items, item);
1033 eina_stringshare_del(item->label);
1034 item->label = eina_stringshare_add_length(label, wd->max_len);
1037 strlen(elm_flipselector_item_label_get(DATA_GET(wd->sentinel))))
1040 if (wd->current == l)
1042 _update_view(item->base.widget);
1043 _sizing_eval(wd->self);
1050 * Gets the item before @p item in a flipselector.
1052 * @param item The item
1053 * @return The item before the item @p item
1055 * @ingroup Flipselector
1057 EAPI Elm_Flipselector_Item *
1058 elm_flipselector_item_prev_get(Elm_Flipselector_Item *item)
1060 ELM_FLIPSELECTOR_ITEM_CHECK_DELETED_RETURN(item, NULL);
1062 Elm_Flipselector_Item *_item;
1066 wd = elm_widget_data_get(item->base.widget);
1067 if ((!wd) || (!wd->items))
1070 EINA_LIST_FOREACH(wd->items, l, _item)
1073 l = eina_list_prev(l);
1083 * Gets the item after @p item in a flipselector.
1085 * @param item The item
1086 * @return The item after the item @p item
1088 * @ingroup Flipselector
1090 EAPI Elm_Flipselector_Item *
1091 elm_flipselector_item_next_get(Elm_Flipselector_Item *item)
1093 ELM_FLIPSELECTOR_ITEM_CHECK_DELETED_RETURN(item, NULL);
1095 Elm_Flipselector_Item *_item;
1099 wd = elm_widget_data_get(item->base.widget);
1100 if ((!wd) || (!wd->items))
1103 EINA_LIST_FOREACH(wd->items, l, _item)
1106 l = eina_list_next(l);
1116 * Set the flipping interval for the flipselector.
1118 * @param obj The flipselector object
1119 * @param interval The interval value in seconds
1121 * The interval value is decreased while the user flips the widget up
1122 * or down repeatedly. The next interval value is the previous
1123 * interval / 1.05, so it speeds up a bit. Default value is 0.85
1126 * @ingroup Flipselector
1129 elm_flipselector_interval_set(Evas_Object *obj, double interval)
1131 ELM_CHECK_WIDTYPE(obj, widtype);
1133 Widget_Data *wd = elm_widget_data_get(obj);
1137 wd->first_interval = interval;
1141 * Get the flipping interval of the flipselector.
1143 * @param obj The flipselector object
1144 * @return The value of the first interval in seconds
1146 * The interval value is decreased while the user flips the widget up
1147 * or down repeatedly. The next interval value is the previous
1148 * interval / 1.05, so it speeds up a bit. Default value is 0.85
1151 * @ingroup Flipselector
1154 elm_flipselector_interval_get(const Evas_Object *obj)
1156 ELM_CHECK_WIDTYPE(obj, widtype) 0.0;
1158 Widget_Data *wd = elm_widget_data_get(obj);
1162 return wd->first_interval;