1 #include <Elementary.h>
3 #include "elm_widget_slider.h"
5 EAPI const char ELM_SLIDER_SMART_NAME[] = "elm_slider";
7 static const Elm_Layout_Part_Alias_Description _content_aliases[] =
9 {"icon", "elm.swallow.icon"},
10 {"end", "elm.swallow.end"},
14 static const Elm_Layout_Part_Alias_Description _text_aliases[] =
16 {"default", "elm.text"},
20 static const char SIG_CHANGED[] = "changed";
21 static const char SIG_DELAY_CHANGED[] = "delay,changed";
22 static const char SIG_DRAG_START[] = "slider,drag,start";
23 static const char SIG_DRAG_STOP[] = "slider,drag,stop";
24 static const Evas_Smart_Cb_Description _smart_callbacks[] = {
26 {SIG_DELAY_CHANGED, ""},
32 EVAS_SMART_SUBCLASS_NEW
33 (ELM_SLIDER_SMART_NAME, _elm_slider, Elm_Slider_Smart_Class,
34 Elm_Layout_Smart_Class, elm_layout_smart_class_get, _smart_callbacks);
37 _delay_change(void *data)
39 ELM_SLIDER_DATA_GET(data, sd);
42 evas_object_smart_callback_call(data, SIG_DELAY_CHANGED, NULL);
44 return ECORE_CALLBACK_CANCEL;
48 _val_fetch(Evas_Object *obj)
51 double posx = 0.0, posy = 0.0, pos = 0.0, val;
52 char text[1024] = {0,};
53 Eina_Strbuf *buf = NULL;
56 ELM_SLIDER_DATA_GET(obj, sd);
58 edje_object_part_drag_value_get
59 (ELM_WIDGET_DATA(sd)->resize_obj, "elm.dragable.slider", &posx, &posy);
60 if (sd->horizontal) pos = posx;
63 rtl = elm_widget_mirrored_get(obj);
64 if ((!rtl && sd->inverted) ||
65 (rtl && ((!sd->horizontal && sd->inverted) ||
66 (sd->horizontal && !sd->inverted))))
69 val = (pos * (sd->val_max - sd->val_min)) + sd->val_min;
70 if ((float)val != (float)sd->val)
73 evas_object_smart_callback_call(obj, SIG_CHANGED, NULL);
74 if (sd->delay) ecore_timer_del(sd->delay);
75 sd->delay = ecore_timer_add(0.2, _delay_change, obj);
77 if (_elm_config->access_mode != ELM_ACCESS_MODE_OFF)
79 buf = eina_strbuf_new();
80 if (sd->indicator_format_func)
82 str = sd->indicator_format_func(sd->val);
83 eina_strbuf_append(buf, str);
84 if (sd->indicator_format_free) sd->indicator_format_free(str);
85 eina_strbuf_append(buf, E_(" of "));
86 str = sd->indicator_format_func(sd->val_max);
87 eina_strbuf_append(buf, str);
88 if (sd->indicator_format_free) sd->indicator_format_free(str);
90 else if (sd->indicator)
92 snprintf(text, sizeof(text), sd->indicator, sd->val);
93 eina_strbuf_append(buf, text);
94 eina_strbuf_append(buf, E_(" of "));
95 snprintf(text, sizeof(text), sd->indicator, sd->val_max);
96 eina_strbuf_append(buf, text);
99 _elm_access_say(eina_strbuf_string_get(buf));
100 eina_strbuf_free(buf);
106 _val_set(Evas_Object *obj)
111 ELM_SLIDER_DATA_GET(obj, sd);
113 if (sd->val_max > sd->val_min)
114 pos = (sd->val - sd->val_min) / (sd->val_max - sd->val_min);
117 if (pos < 0.0) pos = 0.0;
121 rtl = elm_widget_mirrored_get(obj);
122 if ((!rtl && sd->inverted) ||
123 (rtl && ((!sd->horizontal && sd->inverted) ||
124 (sd->horizontal && !sd->inverted))))
127 edje_object_part_drag_value_set
128 (ELM_WIDGET_DATA(sd)->resize_obj, "elm.dragable.slider", pos, pos);
132 _units_set(Evas_Object *obj)
134 ELM_SLIDER_DATA_GET(obj, sd);
136 if (sd->units_format_func)
140 buf = sd->units_format_func(sd->val);
141 elm_layout_text_set(obj, "elm.units", buf);
143 if (sd->units_format_free) sd->units_format_free(buf);
149 snprintf(buf, sizeof(buf), sd->units, sd->val);
150 elm_layout_text_set(obj, "elm.units", buf);
152 else elm_layout_text_set(obj, "elm.units", NULL);
156 _indicator_set(Evas_Object *obj)
158 ELM_SLIDER_DATA_GET(obj, sd);
160 if (sd->indicator_format_func)
164 buf = sd->indicator_format_func(sd->val);
165 elm_layout_text_set(obj, "elm.indicator", buf);
166 elm_layout_text_set(obj, "elm.dragable.slider:elm.indicator", buf);
168 edje_object_part_text_set(sd->popup, "elm.indicator", buf);
170 if (sd->indicator_format_free) sd->indicator_format_free(buf);
172 else if (sd->indicator)
176 snprintf(buf, sizeof(buf), sd->indicator, sd->val);
177 elm_layout_text_set(obj, "elm.indicator", buf);
178 elm_layout_text_set(obj, "elm.dragable.slider:elm.indicator", buf);
180 edje_object_part_text_set(sd->popup, "elm.indicator", buf);
184 elm_layout_text_set(obj, "elm.indicator", NULL);
185 elm_layout_text_set(obj, "elm.dragable.slider:elm.indicator", NULL);
187 edje_object_part_text_set(sd->popup, "elm.indicator", NULL);
192 _slider_update(Evas_Object *obj)
194 evas_object_smart_changed(obj);
199 Evas_Object *obj __UNUSED__,
200 const char *emission __UNUSED__,
201 const char *source __UNUSED__)
203 _slider_update(data);
207 _drag_start(void *data,
208 Evas_Object *obj __UNUSED__,
209 const char *emission __UNUSED__,
210 const char *source __UNUSED__)
212 _slider_update(data);
213 evas_object_smart_callback_call(data, SIG_DRAG_START, NULL);
214 elm_widget_scroll_freeze_push(data);
218 _drag_stop(void *data,
219 Evas_Object *obj __UNUSED__,
220 const char *emission __UNUSED__,
221 const char *source __UNUSED__)
223 _slider_update(data);
224 evas_object_smart_callback_call(data, SIG_DRAG_STOP, NULL);
225 elm_widget_scroll_freeze_pop(data);
229 _drag_step(void *data,
230 Evas_Object *obj __UNUSED__,
231 const char *emission __UNUSED__,
232 const char *source __UNUSED__)
234 _slider_update(data);
239 Evas_Object *obj __UNUSED__,
240 const char *emission __UNUSED__,
241 const char *source __UNUSED__)
245 ELM_SLIDER_DATA_GET(data, sd);
248 if (sd->inverted) step *= -1.0;
250 edje_object_part_drag_step
251 (ELM_WIDGET_DATA(sd)->resize_obj, "elm.dragable.slider", step, step);
255 _drag_down(void *data,
256 Evas_Object *obj __UNUSED__,
257 const char *emission __UNUSED__,
258 const char *source __UNUSED__)
262 ELM_SLIDER_DATA_GET(data, sd);
265 if (sd->inverted) step *= -1.0;
267 edje_object_part_drag_step
268 (ELM_WIDGET_DATA(sd)->resize_obj, "elm.dragable.slider", step, step);
272 _popup_show(void *data,
273 Evas_Object *obj __UNUSED__,
274 const char *emission __UNUSED__,
275 const char *source __UNUSED__)
277 ELM_SLIDER_DATA_GET(data, sd);
280 evas_object_layer_set(sd->popup, evas_object_layer_get(data));
281 evas_object_raise(sd->popup);
282 evas_object_show(sd->popup);
283 edje_object_signal_emit(sd->popup, "popup,show", "elm");
288 _popup_hide(void *data,
289 Evas_Object *obj __UNUSED__,
290 const char *emission __UNUSED__,
291 const char *source __UNUSED__)
293 ELM_SLIDER_DATA_GET(data, sd);
296 if (!sd->popup_hiding)
298 edje_object_signal_emit(sd->popup, "popup,hide", "elm");
299 sd->popup_hiding = EINA_TRUE;
305 _popup_hide_done(void *data,
306 Evas_Object *obj __UNUSED__,
307 const char *emission __UNUSED__,
308 const char *source __UNUSED__)
310 ELM_SLIDER_DATA_GET(data, sd);
313 if (sd->popup_hiding)
315 evas_object_hide(sd->popup);
316 sd->popup_hiding = EINA_FALSE;
322 _popup_emit(void *data,
323 Evas_Object *obj __UNUSED__,
324 const char *emission,
327 ELM_SLIDER_DATA_GET(data, sd);
330 edje_object_signal_emit(sd->popup, emission, source);
335 _elm_slider_smart_event(Evas_Object *obj,
336 Evas_Object *src __UNUSED__,
337 Evas_Callback_Type type,
340 Evas_Event_Mouse_Wheel *mev;
341 Evas_Event_Key_Down *ev;
343 ELM_SLIDER_DATA_GET(obj, sd);
345 if (elm_widget_disabled_get(obj)) return EINA_FALSE;
347 if (type == EVAS_CALLBACK_KEY_DOWN) goto key_down;
348 else if (type != EVAS_CALLBACK_MOUSE_WHEEL)
352 if (mev->event_flags & EVAS_EVENT_FLAG_ON_HOLD) return EINA_FALSE;
354 if (mev->z < 0) _drag_up(obj, NULL, NULL, NULL);
355 else _drag_down(obj, NULL, NULL, NULL);
356 mev->event_flags |= EVAS_EVENT_FLAG_ON_HOLD;
362 if (ev->event_flags & EVAS_EVENT_FLAG_ON_HOLD) return EINA_FALSE;
363 if (elm_widget_disabled_get(obj)) return EINA_FALSE;
364 if ((!strcmp(ev->keyname, "Left")) ||
365 ((!strcmp(ev->keyname, "KP_Left")) && (!ev->string)))
367 if (!sd->horizontal) return EINA_FALSE;
368 if (!sd->inverted) _drag_down(obj, NULL, NULL, NULL);
369 else _drag_up(obj, NULL, NULL, NULL);
370 ev->event_flags |= EVAS_EVENT_FLAG_ON_HOLD;
373 else if ((!strcmp(ev->keyname, "Right")) ||
374 ((!strcmp(ev->keyname, "KP_Right")) && (!ev->string)))
376 if (!sd->horizontal) return EINA_FALSE;
377 if (!sd->inverted) _drag_up(obj, NULL, NULL, NULL);
378 else _drag_down(obj, NULL, NULL, NULL);
379 ev->event_flags |= EVAS_EVENT_FLAG_ON_HOLD;
382 else if ((!strcmp(ev->keyname, "Up")) ||
383 ((!strcmp(ev->keyname, "KP_Up")) && (!ev->string)))
385 if (sd->horizontal) return EINA_FALSE;
386 if (sd->inverted) _drag_up(obj, NULL, NULL, NULL);
387 else _drag_down(obj, NULL, NULL, NULL);
388 ev->event_flags |= EVAS_EVENT_FLAG_ON_HOLD;
391 else if ((!strcmp(ev->keyname, "Down")) ||
392 ((!strcmp(ev->keyname, "KP_Down")) && (!ev->string)))
394 if (sd->horizontal) return EINA_FALSE;
395 if (sd->inverted) _drag_down(obj, NULL, NULL, NULL);
396 else _drag_up(obj, NULL, NULL, NULL);
397 ev->event_flags |= EVAS_EVENT_FLAG_ON_HOLD;
400 else return EINA_FALSE;
409 _elm_slider_smart_activate(Evas_Object *obj, Elm_Activate act)
411 ELM_SLIDER_DATA_GET(obj, sd);
413 if ((elm_widget_disabled_get(obj)) ||
414 (act == ELM_ACTIVATE_DEFAULT)) return EINA_FALSE;
416 if ((act == ELM_ACTIVATE_UP) ||
417 (act == ELM_ACTIVATE_RIGHT))
419 if (!sd->inverted) _drag_up(obj, NULL, NULL, NULL);
420 else _drag_down(obj, NULL, NULL, NULL);
422 else if ((act == ELM_ACTIVATE_DOWN) ||
423 (act == ELM_ACTIVATE_LEFT))
425 if (!sd->inverted) _drag_down(obj, NULL, NULL, NULL);
426 else _drag_up(obj, NULL, NULL, NULL);
435 _visuals_refresh(Evas_Object *obj)
438 evas_object_smart_changed(obj);
442 _elm_slider_smart_theme(Evas_Object *obj)
444 ELM_SLIDER_DATA_GET(obj, sd);
448 eina_stringshare_replace(&ELM_LAYOUT_DATA(sd)->group, "horizontal");
450 _elm_theme_set(NULL, sd->popup,
451 "slider", "horizontal/popup",
452 elm_widget_style_get(obj));
456 eina_stringshare_replace(&ELM_LAYOUT_DATA(sd)->group, "vertical");
458 _elm_theme_set(NULL, sd->popup,
459 "slider", "vertical/popup",
460 elm_widget_style_get(obj));
463 if (!ELM_WIDGET_CLASS(_elm_slider_parent_sc)->theme(obj)) return EINA_FALSE;
466 edje_object_scale_set(sd->popup, elm_widget_scale_get(obj) *
467 elm_config_scale_get());
470 elm_layout_signal_emit(obj, "elm,state,units,visible", "elm");
473 evas_object_size_hint_min_set
474 (sd->spacer, (double)sd->size * elm_widget_scale_get(obj) *
475 elm_config_scale_get(), 1);
477 evas_object_size_hint_min_set
478 (sd->spacer, 1, (double)sd->size * elm_widget_scale_get(obj) *
479 elm_config_scale_get());
483 elm_layout_signal_emit(obj, "elm,state,inverted,on", "elm");
485 edje_object_signal_emit(sd->popup, "elm,state,inverted,on", "elm");
488 _visuals_refresh(obj);
490 edje_object_message_signal_process(ELM_WIDGET_DATA(sd)->resize_obj);
492 edje_object_message_signal_process(sd->popup);
494 evas_object_smart_changed(obj);
500 _elm_slider_smart_sizing_eval(Evas_Object *obj)
502 ELM_SLIDER_DATA_GET(obj, sd);
504 Evas_Coord minw = -1, minh = -1, maxw = -1, maxh = -1;
506 elm_coords_finger_size_adjust(1, &minw, 1, &minh);
507 edje_object_size_min_restricted_calc
508 (ELM_WIDGET_DATA(sd)->resize_obj, &minw, &minh, minw, minh);
509 elm_coords_finger_size_adjust(1, &minw, 1, &minh);
510 evas_object_size_hint_min_set(obj, minw, minh);
511 evas_object_size_hint_max_set(obj, maxw, maxh);
515 _spacer_down_cb(void *data,
517 Evas_Object *obj __UNUSED__,
520 ELM_SLIDER_DATA_GET(data, sd);
522 Evas_Event_Mouse_Down *ev = event_info;
523 Evas_Coord x, y, w, h;
524 double button_x = 0.0, button_y = 0.0;
526 sd->spacer_down = EINA_TRUE;
528 evas_object_geometry_get(sd->spacer, &x, &y, &w, &h);
529 sd->downx = ev->canvas.x - x;
530 sd->downy = ev->canvas.y - y;
533 button_x = ((double)ev->canvas.x - (double)x) / (double)w;
534 if (button_x > 1) button_x = 1;
535 if (button_x < 0) button_x = 0;
539 button_y = ((double)ev->canvas.y - (double)y) / (double)h;
540 if (button_y > 1) button_y = 1;
541 if (button_y < 0) button_y = 0;
544 edje_object_part_drag_value_set
545 (ELM_WIDGET_DATA(sd)->resize_obj, "elm.dragable.slider",
547 _slider_update(data);
548 evas_object_smart_callback_call(data, SIG_DRAG_START, NULL);
549 elm_layout_signal_emit(data, "elm,state,indicator,show", "elm");
553 _spacer_move_cb(void *data,
555 Evas_Object *obj __UNUSED__,
558 ELM_SLIDER_DATA_GET(data, sd);
560 Evas_Coord x, y, w, h;
561 double button_x = 0.0, button_y = 0.0;
562 Evas_Event_Mouse_Move *ev = event_info;
568 evas_object_geometry_get(sd->spacer, &x, &y, &w, &h);
569 if (sd->horizontal) d = abs(ev->cur.canvas.x - x - sd->downx);
570 else d = abs(ev->cur.canvas.y - y - sd->downy);
571 if (d > (_elm_config->thumbscroll_threshold - 1))
575 elm_widget_scroll_freeze_push(data);
576 sd->frozen = EINA_TRUE;
578 ev->event_flags &= ~EVAS_EVENT_FLAG_ON_HOLD;
581 if (ev->event_flags & EVAS_EVENT_FLAG_ON_HOLD)
583 if (sd->spacer_down) sd->spacer_down = EINA_FALSE;
584 _slider_update(data);
585 evas_object_smart_callback_call(data, SIG_DRAG_STOP, NULL);
588 elm_widget_scroll_freeze_pop(data);
589 sd->frozen = EINA_FALSE;
591 elm_layout_signal_emit(data, "elm,state,indicator,hide", "elm");
592 elm_slider_value_set(data, sd->val2);
597 button_x = ((double)ev->cur.canvas.x - (double)x) / (double)w;
598 if (button_x > 1) button_x = 1;
599 if (button_x < 0) button_x = 0;
603 button_y = ((double)ev->cur.canvas.y - (double)y) / (double)h;
604 if (button_y > 1) button_y = 1;
605 if (button_y < 0) button_y = 0;
608 edje_object_part_drag_value_set
609 (ELM_WIDGET_DATA(sd)->resize_obj, "elm.dragable.slider",
612 _slider_update(data);
617 _spacer_up_cb(void *data,
619 Evas_Object *obj __UNUSED__,
620 void *event_info __UNUSED__)
622 ELM_SLIDER_DATA_GET(data, sd);
624 if (!sd->spacer_down) return;
625 if (sd->spacer_down) sd->spacer_down = EINA_FALSE;
627 _slider_update(data);
628 evas_object_smart_callback_call(data, SIG_DRAG_STOP, NULL);
632 elm_widget_scroll_freeze_pop(data);
633 sd->frozen = EINA_FALSE;
635 elm_layout_signal_emit(data, "elm,state,indicator,hide", "elm");
639 _track_move_cb(void *data,
642 void *event_info __UNUSED__)
646 ELM_SLIDER_DATA_GET(data, sd);
647 evas_object_geometry_get(obj, &x, &y, NULL, NULL);
648 evas_object_move(sd->popup, x, y);
652 _track_resize_cb(void *data,
655 void *event_info __UNUSED__)
659 ELM_SLIDER_DATA_GET(data, sd);
660 evas_object_geometry_get(obj, NULL, NULL, &w, &h);
661 evas_object_resize(sd->popup, w, h);
665 _min_max_set(Evas_Object *obj)
667 char *buf_min = NULL;
668 char *buf_max = NULL;
670 ELM_SLIDER_DATA_GET(obj, sd);
672 if (sd->units_format_func)
674 buf_min = sd->units_format_func(sd->val_min);
675 buf_max = sd->units_format_func(sd->val_max);
679 int length = strlen(sd->units);
681 buf_min = alloca(length + 128);
682 buf_max = alloca(length + 128);
684 snprintf((char *)buf_min, length + 128, sd->units, sd->val_min);
685 snprintf((char *)buf_max, length + 128, sd->units, sd->val_max);
688 elm_layout_text_set(obj, "elm.units.min", buf_min);
689 elm_layout_text_set(obj, "elm.units.max", buf_max);
691 if (sd->units_format_func && sd->units_format_free)
693 sd->units_format_free(buf_min);
694 sd->units_format_free(buf_max);
699 _elm_slider_smart_calculate(Evas_Object *obj)
701 ELM_SLIDER_DATA_GET(obj, sd);
703 elm_layout_freeze(obj);
706 evas_object_size_hint_min_set
707 (sd->spacer, (double)sd->size * elm_widget_scale_get(obj) *
708 elm_config_scale_get(), 1);
710 evas_object_size_hint_min_set
711 (sd->spacer, 1, (double)sd->size * elm_widget_scale_get(obj) *
712 elm_config_scale_get());
719 elm_layout_thaw(obj);
723 _access_info_cb(void *data __UNUSED__, Evas_Object *obj)
725 const char *txt = elm_widget_access_info_get(obj);
727 if (!txt) txt = elm_layout_text_get(obj, NULL);
728 if (txt) return strdup(txt);
734 _access_state_cb(void *data __UNUSED__, Evas_Object *obj)
737 Eina_Strbuf *buf = eina_strbuf_new();
738 const char *txt = elm_layout_text_get(obj, "elm.units");
740 if (txt) eina_strbuf_append(buf, txt);
742 if (elm_widget_disabled_get(obj))
743 eina_strbuf_append(buf, " state: disabled");
745 if (eina_strbuf_length_get(buf))
747 ret = eina_strbuf_string_steal(buf);
748 eina_strbuf_free(buf);
752 eina_strbuf_free(buf);
757 _elm_slider_smart_add(Evas_Object *obj)
759 EVAS_SMART_DATA_ALLOC(obj, Elm_Slider_Smart_Data);
761 ELM_WIDGET_CLASS(_elm_slider_parent_sc)->base.add(obj);
763 priv->horizontal = EINA_TRUE;
764 priv->indicator_show = EINA_TRUE;
770 (obj, "slider", "horizontal", elm_widget_style_get(obj));
772 elm_layout_signal_callback_add(obj, "drag", "*", _drag, obj);
773 elm_layout_signal_callback_add(obj, "drag,start", "*", _drag_start, obj);
774 elm_layout_signal_callback_add(obj, "drag,stop", "*", _drag_stop, obj);
775 elm_layout_signal_callback_add(obj, "drag,step", "*", _drag_step, obj);
776 elm_layout_signal_callback_add(obj, "drag,page", "*", _drag_stop, obj);
777 elm_layout_signal_callback_add(obj, "popup,show", "elm", _popup_show, obj);
778 elm_layout_signal_callback_add(obj, "popup,hide", "elm", _popup_hide, obj);
779 elm_layout_signal_callback_add(obj, "*", "popup,emit", _popup_emit, obj);
780 edje_object_part_drag_value_set
781 (ELM_WIDGET_DATA(priv)->resize_obj, "elm.dragable.slider", 0.0, 0.0);
783 priv->spacer = evas_object_rectangle_add(evas_object_evas_get(obj));
784 evas_object_color_set(priv->spacer, 0, 0, 0, 0);
785 evas_object_pass_events_set(priv->spacer, EINA_TRUE);
786 elm_layout_content_set(obj, "elm.swallow.bar", priv->spacer);
788 /* if theme has an overlayed slider mode, then lets support it */
789 if (edje_object_part_exists(elm_layout_edje_get(obj),
792 // XXX popup needs to adapt to theme etc.
793 priv->popup = edje_object_add(evas_object_evas_get(obj));
794 _elm_theme_set(NULL, priv->popup,
795 "slider", "horizontal/popup",
796 elm_widget_style_get(obj));
797 edje_object_scale_set(priv->popup, elm_widget_scale_get(obj) *
798 elm_config_scale_get());
799 edje_object_signal_callback_add(priv->popup, "popup,hide,done", "elm",
800 _popup_hide_done, obj);
802 /* create a rectangle to track position+size of the dragable */
803 priv->track = evas_object_rectangle_add(evas_object_evas_get(obj));
804 evas_object_event_callback_add
805 (priv->track, EVAS_CALLBACK_MOVE, _track_move_cb, obj);
806 evas_object_event_callback_add
807 (priv->track, EVAS_CALLBACK_RESIZE, _track_resize_cb, obj);
809 evas_object_color_set(priv->track, 0, 0, 0, 0);
810 evas_object_pass_events_set(priv->track, EINA_TRUE);
811 elm_layout_content_set(obj, "elm.track.slider", priv->track);
814 evas_object_event_callback_add
815 (priv->spacer, EVAS_CALLBACK_MOUSE_DOWN, _spacer_down_cb, obj);
816 evas_object_event_callback_add
817 (priv->spacer, EVAS_CALLBACK_MOUSE_MOVE, _spacer_move_cb, obj);
818 evas_object_event_callback_add
819 (priv->spacer, EVAS_CALLBACK_MOUSE_UP, _spacer_up_cb, obj);
821 elm_widget_can_focus_set(obj, EINA_TRUE);
823 _elm_access_object_register(obj, ELM_WIDGET_DATA(priv)->resize_obj);
825 (_elm_access_object_get(obj), ELM_ACCESS_TYPE, E_("slider"));
826 _elm_access_callback_set
827 (_elm_access_object_get(obj), ELM_ACCESS_INFO, _access_info_cb, NULL);
828 _elm_access_callback_set
829 (_elm_access_object_get(obj), ELM_ACCESS_STATE, _access_state_cb, priv);
831 evas_object_smart_changed(obj);
835 _elm_slider_smart_del(Evas_Object *obj)
837 ELM_SLIDER_DATA_GET(obj, sd);
839 // Because "drag,stop" edje signal is queued,
840 // It can be discarded after object is deletd.
841 if (0 != elm_widget_scroll_freeze_get(obj))
842 elm_widget_scroll_freeze_pop(obj);
844 if (sd->indicator) eina_stringshare_del(sd->indicator);
845 if (sd->units) eina_stringshare_del(sd->units);
846 if (sd->delay) ecore_timer_del(sd->delay);
848 if (sd->popup) evas_object_del(sd->popup);
850 ELM_WIDGET_CLASS(_elm_slider_parent_sc)->base.del(obj);
854 _elm_slider_smart_set_user(Elm_Slider_Smart_Class *sc)
856 ELM_WIDGET_CLASS(sc)->base.add = _elm_slider_smart_add;
857 ELM_WIDGET_CLASS(sc)->base.del = _elm_slider_smart_del;
858 ELM_WIDGET_CLASS(sc)->base.calculate = _elm_slider_smart_calculate;
860 ELM_WIDGET_CLASS(sc)->theme = _elm_slider_smart_theme;
861 ELM_WIDGET_CLASS(sc)->event = _elm_slider_smart_event;
862 ELM_WIDGET_CLASS(sc)->activate = _elm_slider_smart_activate;
864 /* not a 'focus chain manager' */
865 ELM_WIDGET_CLASS(sc)->focus_next = NULL;
866 ELM_WIDGET_CLASS(sc)->focus_direction = NULL;
868 ELM_LAYOUT_CLASS(sc)->sizing_eval = _elm_slider_smart_sizing_eval;
870 ELM_LAYOUT_CLASS(sc)->content_aliases = _content_aliases;
871 ELM_LAYOUT_CLASS(sc)->text_aliases = _text_aliases;
874 EAPI const Elm_Slider_Smart_Class *
875 elm_slider_smart_class_get(void)
877 static Elm_Slider_Smart_Class _sc =
878 ELM_SLIDER_SMART_CLASS_INIT_NAME_VERSION(ELM_SLIDER_SMART_NAME);
879 static const Elm_Slider_Smart_Class *class = NULL;
880 Evas_Smart_Class *esc = (Evas_Smart_Class *)&_sc;
885 _elm_slider_smart_set(&_sc);
886 esc->callbacks = _smart_callbacks;
893 elm_slider_add(Evas_Object *parent)
897 EINA_SAFETY_ON_NULL_RETURN_VAL(parent, NULL);
899 obj = elm_widget_add(_elm_slider_smart_class_new(), parent);
900 if (!obj) return NULL;
902 if (!elm_widget_sub_object_add(parent, obj))
903 ERR("could not add %p as sub object of %p", obj, parent);
909 elm_slider_span_size_set(Evas_Object *obj,
912 ELM_SLIDER_CHECK(obj);
913 ELM_SLIDER_DATA_GET(obj, sd);
915 if (sd->size == size) return;
918 if (sd->indicator_show)
920 elm_layout_signal_emit(obj, "elm,state,val,show", "elm");
922 edje_object_signal_emit(sd->popup, "elm,state,val,show", "elm");
926 elm_layout_signal_emit(obj, "elm,state,val,hide", "elm");
928 edje_object_signal_emit(sd->popup, "elm,state,val,hide", "elm");
931 evas_object_smart_changed(obj);
935 elm_slider_span_size_get(const Evas_Object *obj)
937 ELM_SLIDER_CHECK(obj) 0;
938 ELM_SLIDER_DATA_GET(obj, sd);
944 elm_slider_unit_format_set(Evas_Object *obj,
947 ELM_SLIDER_CHECK(obj);
948 ELM_SLIDER_DATA_GET(obj, sd);
950 eina_stringshare_replace(&sd->units, units);
953 elm_layout_signal_emit(obj, "elm,state,units,visible", "elm");
954 edje_object_message_signal_process(ELM_WIDGET_DATA(sd)->resize_obj);
956 edje_object_signal_emit(sd->popup, "elm,state,units,visible", "elm");
960 elm_layout_signal_emit(obj, "elm,state,units,hidden", "elm");
961 edje_object_message_signal_process(ELM_WIDGET_DATA(sd)->resize_obj);
963 edje_object_signal_emit(sd->popup, "elm,state,units,hidden", "elm");
966 evas_object_smart_changed(obj);
970 elm_slider_unit_format_get(const Evas_Object *obj)
972 ELM_SLIDER_CHECK(obj) NULL;
973 ELM_SLIDER_DATA_GET(obj, sd);
979 elm_slider_indicator_format_set(Evas_Object *obj,
980 const char *indicator)
982 ELM_SLIDER_CHECK(obj);
983 ELM_SLIDER_DATA_GET(obj, sd);
985 eina_stringshare_replace(&sd->indicator, indicator);
986 evas_object_smart_changed(obj);
990 elm_slider_indicator_format_get(const Evas_Object *obj)
992 ELM_SLIDER_CHECK(obj) NULL;
993 ELM_SLIDER_DATA_GET(obj, sd);
995 return sd->indicator;
999 elm_slider_horizontal_set(Evas_Object *obj,
1000 Eina_Bool horizontal)
1002 ELM_SLIDER_CHECK(obj);
1003 ELM_SLIDER_DATA_GET(obj, sd);
1005 horizontal = !!horizontal;
1006 if (sd->horizontal == horizontal) return;
1007 sd->horizontal = horizontal;
1009 ELM_WIDGET_DATA(sd)->api->theme(obj);
1013 elm_slider_horizontal_get(const Evas_Object *obj)
1015 ELM_SLIDER_CHECK(obj) EINA_FALSE;
1016 ELM_SLIDER_DATA_GET(obj, sd);
1018 return sd->horizontal;
1022 elm_slider_min_max_set(Evas_Object *obj,
1026 ELM_SLIDER_CHECK(obj);
1027 ELM_SLIDER_DATA_GET(obj, sd);
1029 if ((sd->val_min == min) && (sd->val_max == max)) return;
1032 if (sd->val < sd->val_min) sd->val = sd->val_min;
1033 if (sd->val > sd->val_max) sd->val = sd->val_max;
1035 _visuals_refresh(obj);
1039 elm_slider_min_max_get(const Evas_Object *obj,
1043 if (min) *min = 0.0;
1044 if (max) *max = 0.0;
1046 ELM_SLIDER_CHECK(obj);
1047 ELM_SLIDER_DATA_GET(obj, sd);
1049 if (min) *min = sd->val_min;
1050 if (max) *max = sd->val_max;
1054 elm_slider_value_set(Evas_Object *obj,
1057 ELM_SLIDER_CHECK(obj);
1058 ELM_SLIDER_DATA_GET(obj, sd);
1060 if (sd->val == val) return;
1063 if (sd->val < sd->val_min) sd->val = sd->val_min;
1064 if (sd->val > sd->val_max) sd->val = sd->val_max;
1066 _visuals_refresh(obj);
1070 elm_slider_value_get(const Evas_Object *obj)
1072 ELM_SLIDER_CHECK(obj) 0.0;
1073 ELM_SLIDER_DATA_GET(obj, sd);
1079 elm_slider_inverted_set(Evas_Object *obj,
1082 ELM_SLIDER_CHECK(obj);
1083 ELM_SLIDER_DATA_GET(obj, sd);
1085 inverted = !!inverted;
1086 if (sd->inverted == inverted) return;
1087 sd->inverted = inverted;
1091 elm_layout_signal_emit(obj, "elm,state,inverted,on", "elm");
1093 edje_object_signal_emit(sd->popup, "elm,state,inverted,on", "elm");
1097 elm_layout_signal_emit(obj, "elm,state,inverted,off", "elm");
1099 edje_object_signal_emit(sd->popup, "elm,state,inverted,off", "elm");
1102 edje_object_message_signal_process(ELM_WIDGET_DATA(sd)->resize_obj);
1104 _visuals_refresh(obj);
1108 elm_slider_inverted_get(const Evas_Object *obj)
1110 ELM_SLIDER_CHECK(obj) EINA_FALSE;
1111 ELM_SLIDER_DATA_GET(obj, sd);
1113 return sd->inverted;
1117 elm_slider_indicator_format_function_set(Evas_Object *obj,
1118 char *(*func)(double),
1119 void (*free_func)(char *))
1121 ELM_SLIDER_CHECK(obj);
1122 ELM_SLIDER_DATA_GET(obj, sd);
1124 sd->indicator_format_func = func;
1125 sd->indicator_format_free = free_func;
1126 evas_object_smart_changed(obj);
1130 elm_slider_units_format_function_set(Evas_Object *obj,
1131 char *(*func)(double),
1132 void (*free_func)(char *))
1134 ELM_SLIDER_CHECK(obj);
1135 ELM_SLIDER_DATA_GET(obj, sd);
1137 sd->units_format_func = func;
1138 sd->units_format_free = free_func;
1140 evas_object_smart_changed(obj);
1144 elm_slider_indicator_show_set(Evas_Object *obj,
1147 ELM_SLIDER_CHECK(obj);
1148 ELM_SLIDER_DATA_GET(obj, sd);
1152 sd->indicator_show = EINA_TRUE;
1153 elm_layout_signal_emit(obj, "elm,state,val,show", "elm");
1155 edje_object_signal_emit(sd->popup, "elm,state,val,show", "elm");
1158 sd->indicator_show = EINA_FALSE;
1159 elm_layout_signal_emit(obj, "elm,state,val,hide", "elm");
1161 edje_object_signal_emit(sd->popup, "elm,state,val,hide", "elm");
1164 evas_object_smart_changed(obj);
1168 elm_slider_indicator_show_get(const Evas_Object *obj)
1170 ELM_SLIDER_CHECK(obj) EINA_FALSE;
1171 ELM_SLIDER_DATA_GET(obj, sd);
1173 return sd->indicator_show;