1 #include <Elementary.h>
4 #include "elm_widget_spinner.h"
6 EAPI const char ELM_SPINNER_SMART_NAME[] = "elm_spinner";
8 static const char SIG_CHANGED[] = "changed";
9 static const char SIG_DELAY_CHANGED[] = "delay,changed";
10 static const Evas_Smart_Cb_Description _smart_callbacks[] = {
12 {SIG_DELAY_CHANGED, ""},
16 EVAS_SMART_SUBCLASS_NEW
17 (ELM_SPINNER_SMART_NAME, _elm_spinner, Elm_Spinner_Smart_Class,
18 Elm_Layout_Smart_Class, elm_layout_smart_class_get, _smart_callbacks);
21 _entry_show(Elm_Spinner_Smart_Data *sd)
23 char buf[32], fmt[32] = "%0.f";
25 /* try to construct just the format from given label
26 * completely ignoring pre/post words
30 const char *start = strchr(sd->label, '%');
37 start = strchr(start + 2, '%');
42 const char *itr, *end = NULL;
43 for (itr = start + 1; *itr != '\0'; itr++)
45 /* allowing '%d' is quite dangerous, remove it? */
46 if ((*itr == 'd') || (*itr == 'f'))
53 if ((end) && ((size_t)(end - start + 1) < sizeof(fmt)))
55 memcpy(fmt, start, end - start);
56 fmt[end - start] = '\0';
60 snprintf(buf, sizeof(buf), fmt, sd->val);
61 elm_object_text_set(sd->ent, buf);
65 _label_write(Evas_Object *obj)
69 Elm_Spinner_Special_Value *sv;
71 ELM_SPINNER_DATA_GET(obj, sd);
73 EINA_LIST_FOREACH(sd->special_values, l, sv)
75 if (sv->value == sd->val)
77 snprintf(buf, sizeof(buf), "%s", sv->label);
82 snprintf(buf, sizeof(buf), sd->label, sd->val);
84 snprintf(buf, sizeof(buf), "%.0f", sd->val);
87 elm_layout_text_set(obj, "elm.text", buf);
88 if (sd->entry_visible) _entry_show(sd);
92 _delay_change(void *data)
94 ELM_SPINNER_DATA_GET(data, sd);
97 evas_object_smart_callback_call(data, SIG_DELAY_CHANGED, NULL);
99 return ECORE_CALLBACK_CANCEL;
103 _value_set(Evas_Object *obj,
106 ELM_SPINNER_DATA_GET(obj, sd);
109 new_val = sd->val_base +
110 (double)((((int)(new_val - sd->val_base)) / sd->round) * sd->round);
114 if (new_val < sd->val_min)
115 new_val = sd->val_max;
116 else if (new_val > sd->val_max)
117 new_val = sd->val_min;
121 if (new_val < sd->val_min)
122 new_val = sd->val_min;
123 else if (new_val > sd->val_max)
124 new_val = sd->val_max;
127 if (new_val == sd->val) return EINA_FALSE;
130 evas_object_smart_callback_call(obj, SIG_CHANGED, NULL);
131 if (sd->delay) ecore_timer_del(sd->delay);
132 sd->delay = ecore_timer_add(0.2, _delay_change, obj);
138 _val_set(Evas_Object *obj)
142 ELM_SPINNER_DATA_GET(obj, sd);
144 if (sd->val_max > sd->val_min)
145 pos = ((sd->val - sd->val_min) / (sd->val_max - sd->val_min));
146 if (pos < 0.0) pos = 0.0;
149 edje_object_part_drag_value_set
150 (ELM_WIDGET_DATA(sd)->resize_obj, "elm.dragable.slider", pos, pos);
155 Evas_Object *_obj __UNUSED__,
156 const char *emission __UNUSED__,
157 const char *source __UNUSED__)
159 double pos = 0.0, offset, delta;
160 Evas_Object *obj = data;
162 ELM_SPINNER_DATA_GET(obj, sd);
164 if (sd->entry_visible) return;
165 edje_object_part_drag_value_get
166 (ELM_WIDGET_DATA(sd)->resize_obj, "elm.dragable.slider", &pos, NULL);
168 offset = sd->step * _elm_config->scale;
169 delta = (pos - sd->drag_start_pos) * offset;
170 /* If we are on rtl mode, change the delta to be negative on such changes */
171 if (elm_widget_mirrored_get(obj)) delta *= -1;
172 if (_value_set(data, sd->drag_start_pos + delta)) _label_write(data);
177 _drag_start_cb(void *data,
178 Evas_Object *obj __UNUSED__,
179 const char *emission __UNUSED__,
180 const char *source __UNUSED__)
184 ELM_SPINNER_DATA_GET(data, sd);
186 edje_object_part_drag_value_get
187 (ELM_WIDGET_DATA(sd)->resize_obj, "elm.dragable.slider", &pos, NULL);
188 sd->drag_start_pos = pos;
192 _drag_stop_cb(void *data,
193 Evas_Object *obj __UNUSED__,
194 const char *emission __UNUSED__,
195 const char *source __UNUSED__)
197 ELM_SPINNER_DATA_GET(data, sd);
199 sd->drag_start_pos = 0;
200 edje_object_part_drag_value_set
201 (ELM_WIDGET_DATA(sd)->resize_obj, "elm.dragable.slider", 0.0, 0.0);
205 _entry_hide(Evas_Object *obj)
207 ELM_SPINNER_DATA_GET(obj, sd);
209 elm_layout_signal_emit(obj, "elm,state,inactive", "elm");
210 sd->entry_visible = EINA_FALSE;
214 _reset_value(Evas_Object *obj)
216 ELM_SPINNER_DATA_GET(obj, sd);
219 elm_spinner_value_set(obj, sd->orig_val);
223 _entry_value_apply(Evas_Object *obj)
229 ELM_SPINNER_DATA_GET(obj, sd);
231 if (!sd->entry_visible) return;
234 str = elm_object_text_get(sd->ent);
236 val = strtod(str, &end);
237 if ((*end != '\0') && (!isspace(*end))) return;
238 elm_spinner_value_set(obj, val);
242 _entry_toggle_cb(void *data,
243 Evas_Object *obj __UNUSED__,
244 const char *emission __UNUSED__,
245 const char *source __UNUSED__)
247 ELM_SPINNER_DATA_GET(data, sd);
254 if (elm_widget_disabled_get(data)) return;
255 if (!sd->editable) return;
256 if (sd->entry_visible) _entry_value_apply(data);
259 sd->orig_val = sd->val;
260 elm_layout_signal_emit(data, "elm,state,active", "elm");
262 elm_entry_select_all(sd->ent);
263 elm_widget_focus_set(sd->ent, 1);
264 sd->entry_visible = EINA_TRUE;
269 _spin_value(void *data)
271 ELM_SPINNER_DATA_GET(data, sd);
272 double real_speed = sd->spin_speed;
274 /* Sanity check: our step size should be at least as large as our rounding value */
275 if ((sd->spin_speed != 0.0) && (abs(sd->spin_speed) < sd->round))
277 WRN("The spinning step is smaller than the rounding value, please check your code");
278 real_speed = sd->spin_speed > 0 ? sd->round : -sd->round;
281 if (_value_set(data, sd->val + real_speed)) _label_write(data);
282 sd->interval = sd->interval / 1.05;
283 ecore_timer_interval_set(sd->spin, sd->interval);
285 return ECORE_CALLBACK_RENEW;
289 _val_inc_start(Evas_Object *obj)
291 ELM_SPINNER_DATA_GET(obj, sd);
293 sd->interval = sd->first_interval;
294 sd->spin_speed = sd->step;
295 if (sd->spin) ecore_timer_del(sd->spin);
296 sd->spin = ecore_timer_add(sd->interval, _spin_value, obj);
301 _val_inc_stop(Evas_Object *obj)
303 ELM_SPINNER_DATA_GET(obj, sd);
305 sd->interval = sd->first_interval;
307 if (sd->spin) ecore_timer_del(sd->spin);
312 _val_dec_start(Evas_Object *obj)
314 ELM_SPINNER_DATA_GET(obj, sd);
316 sd->interval = sd->first_interval;
317 sd->spin_speed = -sd->step;
318 if (sd->spin) ecore_timer_del(sd->spin);
319 sd->spin = ecore_timer_add(sd->interval, _spin_value, obj);
324 _val_dec_stop(Evas_Object *obj)
326 ELM_SPINNER_DATA_GET(obj, sd);
328 sd->interval = sd->first_interval;
330 if (sd->spin) ecore_timer_del(sd->spin);
335 _button_inc_start_cb(void *data,
336 Evas_Object *obj __UNUSED__,
337 const char *emission __UNUSED__,
338 const char *source __UNUSED__)
340 ELM_SPINNER_DATA_GET(data, sd);
342 if (sd->entry_visible)
347 _val_inc_start(data);
351 _button_inc_stop_cb(void *data,
352 Evas_Object *obj __UNUSED__,
353 const char *emission __UNUSED__,
354 const char *source __UNUSED__)
360 _button_dec_start_cb(void *data,
361 Evas_Object *obj __UNUSED__,
362 const char *emission __UNUSED__,
363 const char *source __UNUSED__)
365 ELM_SPINNER_DATA_GET(data, sd);
367 if (sd->entry_visible)
372 _val_dec_start(data);
376 _button_dec_stop_cb(void *data,
377 Evas_Object *obj __UNUSED__,
378 const char *emission __UNUSED__,
379 const char *source __UNUSED__)
385 _entry_activated_cb(void *data,
386 Evas_Object *obj __UNUSED__,
387 void *event_info __UNUSED__)
389 ELM_SPINNER_DATA_GET(data, sd);
391 _entry_value_apply(data);
392 evas_object_smart_callback_call(data, SIG_CHANGED, NULL);
393 if (sd->delay) ecore_timer_del(sd->delay);
394 sd->delay = ecore_timer_add(0.2, _delay_change, data);
398 _elm_spinner_smart_sizing_eval(Evas_Object *obj)
400 Evas_Coord minw = -1, minh = -1;
402 ELM_SPINNER_DATA_GET(obj, sd);
404 elm_coords_finger_size_adjust(1, &minw, 1, &minh);
405 edje_object_size_min_restricted_calc
406 (ELM_WIDGET_DATA(sd)->resize_obj, &minw, &minh, minw, minh);
407 elm_coords_finger_size_adjust(1, &minw, 1, &minh);
408 evas_object_size_hint_min_set(obj, minw, minh);
409 evas_object_size_hint_max_set(obj, -1, -1);
413 _elm_spinner_smart_event(Evas_Object *obj,
414 Evas_Object *src __UNUSED__,
415 Evas_Callback_Type type,
418 if (elm_widget_disabled_get(obj)) return EINA_FALSE;
419 if (type == EVAS_CALLBACK_KEY_DOWN)
421 Evas_Event_Key_Down *ev = event_info;
423 if (ev->event_flags & EVAS_EVENT_FLAG_ON_HOLD) return EINA_FALSE;
424 else if (!strcmp(ev->keyname, "Left") ||
425 ((!strcmp(ev->keyname, "KP_Left")) && (!ev->string)) ||
426 !strcmp(ev->keyname, "Down") ||
427 ((!strcmp(ev->keyname, "KP_Down")) && (!ev->string)))
430 elm_layout_signal_emit(obj, "elm,left,anim,activate", "elm");
431 ev->event_flags |= EVAS_EVENT_FLAG_ON_HOLD;
434 else if (!strcmp(ev->keyname, "Right") ||
435 ((!strcmp(ev->keyname, "KP_Right")) && (!ev->string)) ||
436 !strcmp(ev->keyname, "Up") ||
437 ((!strcmp(ev->keyname, "KP_Up")) && (!ev->string)))
440 elm_layout_signal_emit(obj, "elm,right,anim,activate", "elm");
441 ev->event_flags |= EVAS_EVENT_FLAG_ON_HOLD;
445 else if (type == EVAS_CALLBACK_KEY_UP)
447 Evas_Event_Key_Down *ev = event_info;
449 if (ev->event_flags & EVAS_EVENT_FLAG_ON_HOLD) return EINA_FALSE;
450 if (!strcmp(ev->keyname, "Right") ||
451 ((!strcmp(ev->keyname, "KP_Right")) && (!ev->string)) ||
452 !strcmp(ev->keyname, "Up") ||
453 ((!strcmp(ev->keyname, "KP_Up")) && (!ev->string)))
455 else if (!strcmp(ev->keyname, "Left") ||
456 ((!strcmp(ev->keyname, "KP_Left")) && (!ev->string)) ||
457 !strcmp(ev->keyname, "Down") ||
458 ((!strcmp(ev->keyname, "KP_Down")) && (!ev->string)))
460 else return EINA_FALSE;
462 ev->event_flags |= EVAS_EVENT_FLAG_ON_HOLD;
471 _elm_spinner_smart_on_focus(Evas_Object *obj)
473 if (!ELM_WIDGET_CLASS(_elm_spinner_parent_sc)->on_focus(obj))
476 if (!elm_widget_focus_get(obj))
477 _entry_value_apply(obj);
483 _access_info_cb(void *data, Evas_Object *obj)
485 Evas_Object *spinner;
486 const char *txt = elm_widget_access_info_get(obj);
488 spinner = ELM_WIDGET_DATA(data)->obj;
489 if (!txt) txt = elm_layout_text_get(spinner, "elm.text");
490 if (txt) return strdup(txt);
496 _access_state_cb(void *data, Evas_Object *obj __UNUSED__)
498 if (elm_widget_disabled_get(ELM_WIDGET_DATA(data)->obj))
499 return strdup(E_("State: Disabled"));
505 _access_activate_cb(void *data,
506 Evas_Object *part_obj,
507 Elm_Object_Item *item __UNUSED__)
511 Evas_Object *eo, *inc_btn;
512 const char* increment_part;
514 if (!strcmp(elm_widget_style_get(data), "vertical"))
515 increment_part = "up_bt";
517 increment_part = "right_bt";
519 eo = elm_layout_edje_get(data);
520 inc_btn = (Evas_Object *)edje_object_part_object_get(eo, increment_part);
522 if (part_obj != inc_btn)
524 _val_dec_start(data);
525 elm_layout_signal_emit(data, "elm,left,anim,activate", "elm");
527 text = "decremented";
531 _val_inc_start(data);
532 elm_layout_signal_emit(data, "elm,right,anim,activate", "elm");
534 text = "incremented";
537 buf = eina_strbuf_new();
539 eina_strbuf_append_printf(buf, "%s, %s", text,
540 elm_layout_text_get(data, "elm.text"));
542 text = eina_strbuf_string_steal(buf);
543 eina_strbuf_free(buf);
545 _elm_access_say(text);
549 _access_spinner_register(Evas_Object *obj, Eina_Bool is_access)
553 const char* increment_part;
554 const char* decrement_part;
556 if (!strcmp(elm_widget_style_get(obj), "vertical"))
558 increment_part = "up_bt";
559 decrement_part = "down_bt";
563 increment_part = "right_bt";
564 decrement_part = "left_bt";
569 /* unregister increment button, decrement button and spinner label */
570 _elm_access_edje_object_part_object_unregister
571 (obj, elm_layout_edje_get(obj), increment_part);
573 _elm_access_edje_object_part_object_unregister
574 (obj, elm_layout_edje_get(obj), decrement_part);
576 _elm_access_edje_object_part_object_unregister
577 (obj, elm_layout_edje_get(obj), "access_text");
582 /* register increment button */
583 ao = _elm_access_edje_object_part_object_register
584 (obj, elm_layout_edje_get(obj), increment_part);
586 ai = _elm_access_object_get(ao);
587 _elm_access_text_set(ai, ELM_ACCESS_TYPE,
588 E_("spinner increment button"));
589 _elm_access_activate_callback_set(ai, _access_activate_cb, obj);
591 /* register decrement button */
592 ao = _elm_access_edje_object_part_object_register
593 (obj, elm_layout_edje_get(obj), decrement_part);
595 ai = _elm_access_object_get(ao);
596 _elm_access_text_set(ai, ELM_ACCESS_TYPE,
597 E_("spinner decrement button"));
598 _elm_access_activate_callback_set(ai, _access_activate_cb, obj);
600 /* register spinner label */
601 ao = _elm_access_edje_object_part_object_register
602 (obj, elm_layout_edje_get(obj), "access_text");
604 ai = _elm_access_object_get(ao);
605 _elm_access_text_set(ai, ELM_ACCESS_TYPE, E_("spinner"));
606 _elm_access_callback_set(ai, ELM_ACCESS_INFO, _access_info_cb, obj);
607 _elm_access_callback_set(ai, ELM_ACCESS_STATE, _access_state_cb, obj);
611 _elm_spinner_smart_add(Evas_Object *obj)
613 EVAS_SMART_DATA_ALLOC(obj, Elm_Spinner_Smart_Data);
615 ELM_WIDGET_CLASS(_elm_spinner_parent_sc)->base.add(obj);
619 priv->val_max = 100.0;
622 priv->first_interval = 0.85;
623 priv->entry_visible = EINA_FALSE;
624 priv->editable = EINA_TRUE;
626 elm_layout_theme_set(obj, "spinner", "base", elm_widget_style_get(obj));
627 elm_layout_signal_callback_add(obj, "drag", "*", _drag_cb, obj);
628 elm_layout_signal_callback_add(obj, "drag,start", "*", _drag_start_cb, obj);
629 elm_layout_signal_callback_add(obj, "drag,stop", "*", _drag_stop_cb, obj);
630 elm_layout_signal_callback_add(obj, "drag,step", "*", _drag_stop_cb, obj);
631 elm_layout_signal_callback_add(obj, "drag,page", "*", _drag_stop_cb, obj);
633 elm_layout_signal_callback_add
634 (obj, "elm,action,increment,start", "*", _button_inc_start_cb, obj);
635 elm_layout_signal_callback_add
636 (obj, "elm,action,increment,stop", "*", _button_inc_stop_cb, obj);
637 elm_layout_signal_callback_add
638 (obj, "elm,action,decrement,start", "*", _button_dec_start_cb, obj);
639 elm_layout_signal_callback_add
640 (obj, "elm,action,decrement,stop", "*", _button_dec_stop_cb, obj);
642 edje_object_part_drag_value_set
643 (ELM_WIDGET_DATA(priv)->resize_obj, "elm.dragable.slider", 0.0, 0.0);
645 priv->ent = elm_entry_add(obj);
646 elm_entry_single_line_set(priv->ent, EINA_TRUE);
647 evas_object_smart_callback_add
648 (priv->ent, "activated", _entry_activated_cb, obj);
650 elm_layout_content_set(obj, "elm.swallow.entry", priv->ent);
651 elm_layout_signal_callback_add
652 (obj, "elm,action,entry,toggle", "*", _entry_toggle_cb, obj);
655 elm_widget_can_focus_set(obj, EINA_TRUE);
657 elm_layout_sizing_eval(obj);
660 if (_elm_config->access_mode)
661 _access_spinner_register(obj, EINA_TRUE);
665 _elm_spinner_smart_del(Evas_Object *obj)
667 Elm_Spinner_Special_Value *sv;
669 ELM_SPINNER_DATA_GET(obj, sd);
671 if (sd->label) eina_stringshare_del(sd->label);
672 if (sd->delay) ecore_timer_del(sd->delay);
673 if (sd->spin) ecore_timer_del(sd->spin);
674 if (sd->special_values)
676 EINA_LIST_FREE (sd->special_values, sv)
678 eina_stringshare_del(sv->label);
683 ELM_WIDGET_CLASS(_elm_spinner_parent_sc)->base.del(obj);
687 _elm_spinner_smart_theme(Evas_Object *obj)
690 ret = elm_layout_theme_set(obj, "spinner", "base",
691 elm_widget_style_get(obj));
693 if (_elm_config->access_mode)
694 _access_spinner_register(obj, EINA_TRUE);
700 _access_object_get(const Evas_Object *obj, const char* part)
702 Evas_Object *eo, *po, *ao;
704 eo = elm_layout_edje_get(obj);
706 po = (Evas_Object *)edje_object_part_object_get(eo, part);
707 ao = evas_object_data_get(po, "_part_access_obj");
713 _elm_spinner_smart_focus_next(const Evas_Object *obj,
714 Elm_Focus_Direction dir,
718 Eina_List *items = NULL;
719 const char* increment_part;
720 const char* decrement_part;
722 ELM_SPINNER_CHECK(obj) EINA_FALSE;
724 if (!strcmp(elm_widget_style_get(obj), "vertical"))
726 increment_part = "up_bt";
727 decrement_part = "down_bt";
731 increment_part = "right_bt";
732 decrement_part = "left_bt";
735 ao = _access_object_get(obj, "access_text");
736 items = eina_list_append(items, ao);
738 ao = _access_object_get(obj, decrement_part);
739 items = eina_list_append(items, ao);
741 ao = _access_object_get(obj, increment_part);
742 items = eina_list_append(items, ao);
744 return elm_widget_focus_list_next_get
745 (obj, items, eina_list_data_get, dir, next);
749 _access_hook(Evas_Object *obj, Eina_Bool is_access)
751 ELM_SPINNER_CHECK(obj);
752 ELM_SPINNER_DATA_GET(obj, sd);
755 ELM_WIDGET_CLASS(ELM_WIDGET_DATA(sd)->api)->focus_next =
756 _elm_spinner_smart_focus_next;
758 ELM_WIDGET_CLASS(ELM_WIDGET_DATA(sd)->api)->focus_next = NULL;
760 _access_spinner_register(obj, is_access);
764 _elm_spinner_smart_set_user(Elm_Spinner_Smart_Class *sc)
766 ELM_WIDGET_CLASS(sc)->base.add = _elm_spinner_smart_add;
767 ELM_WIDGET_CLASS(sc)->base.del = _elm_spinner_smart_del;
769 /* not a 'focus chain manager' */
770 ELM_WIDGET_CLASS(sc)->focus_next = NULL;
771 ELM_WIDGET_CLASS(sc)->focus_direction = NULL;
773 ELM_WIDGET_CLASS(sc)->on_focus = _elm_spinner_smart_on_focus;
774 ELM_WIDGET_CLASS(sc)->event = _elm_spinner_smart_event;
776 ELM_LAYOUT_CLASS(sc)->sizing_eval = _elm_spinner_smart_sizing_eval;
778 ELM_WIDGET_CLASS(sc)->theme = _elm_spinner_smart_theme;
781 if (_elm_config->access_mode)
782 ELM_WIDGET_CLASS(sc)->focus_next = _elm_spinner_smart_focus_next;
784 ELM_WIDGET_CLASS(sc)->access = _access_hook;
787 EAPI const Elm_Spinner_Smart_Class *
788 elm_spinner_smart_class_get(void)
790 static Elm_Spinner_Smart_Class _sc =
791 ELM_SPINNER_SMART_CLASS_INIT_NAME_VERSION(ELM_SPINNER_SMART_NAME);
792 static const Elm_Spinner_Smart_Class *class = NULL;
793 Evas_Smart_Class *esc = (Evas_Smart_Class *)&_sc;
795 if (class) return class;
797 _elm_spinner_smart_set(&_sc);
798 esc->callbacks = _smart_callbacks;
805 elm_spinner_add(Evas_Object *parent)
809 EINA_SAFETY_ON_NULL_RETURN_VAL(parent, NULL);
811 obj = elm_widget_add(_elm_spinner_smart_class_new(), parent);
812 if (!obj) return NULL;
814 if (!elm_widget_sub_object_add(parent, obj))
815 ERR("could not add %p as sub object of %p", obj, parent);
821 elm_spinner_label_format_set(Evas_Object *obj,
824 ELM_SPINNER_CHECK(obj);
825 ELM_SPINNER_DATA_GET(obj, sd);
827 eina_stringshare_replace(&sd->label, fmt);
829 elm_layout_sizing_eval(obj);
833 elm_spinner_label_format_get(const Evas_Object *obj)
835 ELM_SPINNER_CHECK(obj) NULL;
836 ELM_SPINNER_DATA_GET(obj, sd);
842 elm_spinner_min_max_set(Evas_Object *obj,
846 ELM_SPINNER_CHECK(obj);
847 ELM_SPINNER_DATA_GET(obj, sd);
849 if ((sd->val_min == min) && (sd->val_max == max)) return;
852 if (sd->val < sd->val_min) sd->val = sd->val_min;
853 if (sd->val > sd->val_max) sd->val = sd->val_max;
859 elm_spinner_min_max_get(const Evas_Object *obj,
866 ELM_SPINNER_CHECK(obj);
867 ELM_SPINNER_DATA_GET(obj, sd);
869 if (min) *min = sd->val_min;
870 if (max) *max = sd->val_max;
874 elm_spinner_step_set(Evas_Object *obj,
877 ELM_SPINNER_CHECK(obj);
878 ELM_SPINNER_DATA_GET(obj, sd);
884 elm_spinner_step_get(const Evas_Object *obj)
886 ELM_SPINNER_CHECK(obj) 0.0;
887 ELM_SPINNER_DATA_GET(obj, sd);
893 elm_spinner_value_set(Evas_Object *obj,
896 ELM_SPINNER_CHECK(obj);
897 ELM_SPINNER_DATA_GET(obj, sd);
899 if (sd->val == val) return;
901 if (sd->val < sd->val_min) sd->val = sd->val_min;
902 if (sd->val > sd->val_max) sd->val = sd->val_max;
908 elm_spinner_value_get(const Evas_Object *obj)
910 ELM_SPINNER_CHECK(obj) 0.0;
911 ELM_SPINNER_DATA_GET(obj, sd);
917 elm_spinner_wrap_set(Evas_Object *obj,
920 ELM_SPINNER_CHECK(obj);
921 ELM_SPINNER_DATA_GET(obj, sd);
927 elm_spinner_wrap_get(const Evas_Object *obj)
929 ELM_SPINNER_CHECK(obj) EINA_FALSE;
930 ELM_SPINNER_DATA_GET(obj, sd);
936 elm_spinner_special_value_add(Evas_Object *obj,
940 Elm_Spinner_Special_Value *sv;
943 ELM_SPINNER_CHECK(obj);
944 ELM_SPINNER_DATA_GET(obj, sd);
946 EINA_LIST_FOREACH(sd->special_values, l, sv)
948 if (sv->value != value)
951 eina_stringshare_replace(&sv->label, label);
956 sv = calloc(1, sizeof(*sv));
959 sv->label = eina_stringshare_add(label);
961 sd->special_values = eina_list_append(sd->special_values, sv);
966 elm_spinner_special_value_del(Evas_Object *obj,
969 Elm_Spinner_Special_Value *sv;
972 ELM_SPINNER_CHECK(obj);
973 ELM_SPINNER_DATA_GET(obj, sd);
975 EINA_LIST_FOREACH(sd->special_values, l, sv)
977 if (sv->value != value)
980 sd->special_values = eina_list_remove_list(sd->special_values, l);
981 eina_stringshare_del(sv->label);
989 elm_spinner_special_value_get(Evas_Object *obj,
992 Elm_Spinner_Special_Value *sv;
995 ELM_SPINNER_CHECK(obj) NULL;
996 ELM_SPINNER_DATA_GET(obj, sd);
998 EINA_LIST_FOREACH(sd->special_values, l, sv)
1000 if (sv->value == value)
1008 elm_spinner_editable_set(Evas_Object *obj,
1011 ELM_SPINNER_CHECK(obj);
1012 ELM_SPINNER_DATA_GET(obj, sd);
1014 sd->editable = editable;
1018 elm_spinner_editable_get(const Evas_Object *obj)
1020 ELM_SPINNER_CHECK(obj) EINA_FALSE;
1021 ELM_SPINNER_DATA_GET(obj, sd);
1023 return sd->editable;
1027 elm_spinner_interval_set(Evas_Object *obj,
1030 ELM_SPINNER_CHECK(obj);
1031 ELM_SPINNER_DATA_GET(obj, sd);
1033 sd->first_interval = interval;
1037 elm_spinner_interval_get(const Evas_Object *obj)
1039 ELM_SPINNER_CHECK(obj) 0.0;
1040 ELM_SPINNER_DATA_GET(obj, sd);
1042 return sd->first_interval;
1046 elm_spinner_base_set(Evas_Object *obj,
1049 ELM_SPINNER_CHECK(obj);
1050 ELM_SPINNER_DATA_GET(obj, sd);
1052 sd->val_base = base;
1056 elm_spinner_base_get(const Evas_Object *obj)
1058 ELM_SPINNER_CHECK(obj) 0.0;
1059 ELM_SPINNER_DATA_GET(obj, sd);
1061 return sd->val_base;
1065 elm_spinner_round_set(Evas_Object *obj,
1068 ELM_SPINNER_CHECK(obj);
1069 ELM_SPINNER_DATA_GET(obj, sd);
1075 elm_spinner_round_get(const Evas_Object *obj)
1077 ELM_SPINNER_CHECK(obj) 0;
1078 ELM_SPINNER_DATA_GET(obj, sd);