X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=src%2Flib%2Felm_slider.c;h=335afb4f9bbb0026ab34bda2ba3101f7f53d7eef;hb=3d267c63a7c3ecc6417481dcb976ab8c0cb56da4;hp=2a3e6acf8e854d2788153127a5b934997c477f7c;hpb=66348ed7014f37f9bf0b608ae5c61ef3e19bc61a;p=framework%2Fuifw%2Felementary.git diff --git a/src/lib/elm_slider.c b/src/lib/elm_slider.c index 2a3e6ac..335afb4 100644 --- a/src/lib/elm_slider.c +++ b/src/lib/elm_slider.c @@ -8,18 +8,6 @@ * The slider adds a dragable “slider” widget for selecting the value of * something within a range. * - * Signals that you can add callbacks for are: - * - * changed - Whenever the slider value is changed by the user. - * - * delay,changed - A short time after the value is changed by the user. - * This will be called only when the user stops dragging for a very short - * period or when they release their finger/mouse, so it avoids possibly - * expensive reactions to the value change. - * - * slider,drag,start - dragging the slider indicator around has started - * - * slider,drag,stop - dragging the slider indicator around has stopped * * A slider can be horizontal or vertical. It can contain an Icon and has a * primary label as well as a units label (that is formatted with floating @@ -38,6 +26,17 @@ * slider is its length (horizontally or vertically). This will be scaled by * the object or applications scaling factor. At any point code can query the * slider for its value with elm_slider_value_get(). + * + * Signals that you can add callbacks for are: + * + * "changed" - Whenever the slider value is changed by the user. + * "slider,drag,start" - dragging the slider indicator around has started + * "slider,drag,stop" - dragging the slider indicator around has stopped + * "delay,changed" - A short time after the value is changed by the user. + * This will be called only when the user stops dragging for + * a very short period or when they release their + * finger/mouse, so it avoids possibly expensive reactions to + * the value change. */ typedef struct _Widget_Data Widget_Data; @@ -65,6 +64,7 @@ struct _Widget_Data static const char *widtype = NULL; static void _del_hook(Evas_Object *obj); +static void _mirrored_set(Evas_Object *obj, Eina_Bool rtl); static void _theme_hook(Evas_Object *obj); static void _disable_hook(Evas_Object *obj); static void _sizing_eval(Evas_Object *obj); @@ -103,6 +103,7 @@ _event_hook(Evas_Object *obj, Evas_Object *src __UNUSED__, Evas_Callback_Type ty wd = elm_widget_data_get(obj); if (!wd) return EINA_FALSE; + if (elm_widget_disabled_get(obj)) return EINA_FALSE; if (type == EVAS_CALLBACK_KEY_DOWN) goto key_down; else if (type != EVAS_CALLBACK_MOUSE_WHEEL) return EINA_FALSE; @@ -175,25 +176,39 @@ _on_focus_hook(void *data __UNUSED__, Evas_Object *obj) if (!wd) return; if (elm_widget_focus_get(obj)) { - edje_object_signal_emit(wd->slider, "elm,action,focus", "elm"); - evas_object_focus_set(wd->slider, EINA_TRUE); + edje_object_signal_emit(wd->slider, "elm,action,focus", "elm"); + evas_object_focus_set(wd->slider, EINA_TRUE); } else { - edje_object_signal_emit(wd->slider, "elm,action,unfocus", "elm"); - evas_object_focus_set(wd->slider, EINA_FALSE); + edje_object_signal_emit(wd->slider, "elm,action,unfocus", "elm"); + evas_object_focus_set(wd->slider, EINA_FALSE); } } static void +_mirrored_set(Evas_Object *obj, Eina_Bool rtl) +{ + Widget_Data *wd = elm_widget_data_get(obj); + if (!wd) return; + edje_object_mirrored_set(wd->slider, rtl); +} + +static void _theme_hook(Evas_Object *obj) { Widget_Data *wd = elm_widget_data_get(obj); if (!wd) return; + _elm_widget_mirrored_reload(obj); + _mirrored_set(obj, elm_widget_mirrored_get(obj)); if (wd->horizontal) _elm_theme_object_set(obj, wd->slider, "slider", "horizontal", elm_widget_style_get(obj)); else _elm_theme_object_set(obj, wd->slider, "slider", "vertical", elm_widget_style_get(obj)); + if (elm_widget_disabled_get(obj)) + edje_object_signal_emit(wd->slider, "elm,state,disabled", "elm"); + else + edje_object_signal_emit(wd->slider, "elm,state,enabled", "elm"); if (wd->icon) { edje_object_part_swallow(wd->slider, "elm.swallow.content", wd->icon); @@ -208,18 +223,18 @@ _theme_hook(Evas_Object *obj) edje_object_part_text_set(wd->slider, "elm.text", wd->label); edje_object_signal_emit(wd->slider, "elm,state,text,visible", "elm"); } - + if (wd->units) edje_object_signal_emit(wd->slider, "elm,state,units,visible", "elm"); - + if (wd->horizontal) evas_object_size_hint_min_set(wd->spacer, (double)wd->size * elm_widget_scale_get(obj) * _elm_config->scale, 1); else evas_object_size_hint_min_set(wd->spacer, 1, (double)wd->size * elm_widget_scale_get(obj) * _elm_config->scale); - + if (wd->inverted) - edje_object_signal_emit(wd->slider, "elm,state,inverted,on", "elm"); - + edje_object_signal_emit(wd->slider, "elm,state,inverted,on", "elm"); + edje_object_part_swallow(wd->slider, "elm.swallow.bar", wd->spacer); _units_set(obj); _indicator_set(obj); @@ -235,14 +250,14 @@ _disable_hook(Evas_Object *obj) Widget_Data *wd = elm_widget_data_get(obj); if (!wd) return; if (elm_widget_disabled_get(obj)) - edje_object_signal_emit(wd->slider, "elm,state,disabled", "elm"); + edje_object_signal_emit(wd->slider, "elm,state,disabled", "elm"); else - edje_object_signal_emit(wd->slider, "elm,state,enabled", "elm"); + edje_object_signal_emit(wd->slider, "elm,state,enabled", "elm"); } static void _sizing_eval(Evas_Object *obj) -{ +{ Widget_Data *wd = elm_widget_data_get(obj); Evas_Coord minw = -1, minh = -1, maxw = -1, maxh = -1; if (!wd) return; @@ -270,12 +285,12 @@ _sub_del(void *data __UNUSED__, Evas_Object *obj, void *event_info) if (!wd) return; if (sub == wd->icon) { - edje_object_signal_emit(wd->slider, "elm,state,icon,hidden", "elm"); - evas_object_event_callback_del_full - (sub, EVAS_CALLBACK_CHANGED_SIZE_HINTS, _changed_size_hints, obj); - wd->icon = NULL; - edje_object_message_signal_process(wd->slider); - _sizing_eval(obj); + edje_object_signal_emit(wd->slider, "elm,state,icon,hidden", "elm"); + evas_object_event_callback_del_full + (sub, EVAS_CALLBACK_CHANGED_SIZE_HINTS, _changed_size_hints, obj); + wd->icon = NULL; + edje_object_message_signal_process(wd->slider); + _sizing_eval(obj); } if (sub == wd->end) { @@ -302,27 +317,33 @@ _delay_change(void *data) static void _val_fetch(Evas_Object *obj) { + Eina_Bool rtl; Widget_Data *wd = elm_widget_data_get(obj); double posx = 0.0, posy = 0.0, pos = 0.0, val; if (!wd) return; edje_object_part_drag_value_get(wd->slider, "elm.dragable.slider", - &posx, &posy); + &posx, &posy); if (wd->horizontal) pos = posx; else pos = posy; - if (wd->inverted) pos = 1.0 - pos; + + rtl = elm_widget_mirrored_get(obj); + if ((!rtl && wd->inverted) || (rtl && + ((!wd->horizontal && wd->inverted) || + (wd->horizontal && !wd->inverted)))) pos = 1.0 - pos; val = (pos * (wd->val_max - wd->val_min)) + wd->val_min; if (val != wd->val) { - wd->val = val; - evas_object_smart_callback_call(obj, SIG_CHANGED, NULL); - if (wd->delay) ecore_timer_del(wd->delay); - wd->delay = ecore_timer_add(0.2, _delay_change, obj); + wd->val = val; + evas_object_smart_callback_call(obj, SIG_CHANGED, NULL); + if (wd->delay) ecore_timer_del(wd->delay); + wd->delay = ecore_timer_add(0.2, _delay_change, obj); } } static void _val_set(Evas_Object *obj) { + Eina_Bool rtl; Widget_Data *wd = elm_widget_data_get(obj); double pos; if (!wd) return; @@ -332,7 +353,11 @@ _val_set(Evas_Object *obj) pos = 0.0; if (pos < 0.0) pos = 0.0; else if (pos > 1.0) pos = 1.0; - if (wd->inverted) pos = 1.0 - pos; + + rtl = elm_widget_mirrored_get(obj); + if ((!rtl && wd->inverted) || (rtl && + ((!wd->horizontal && wd->inverted) || + (wd->horizontal && !wd->inverted)))) pos = 1.0 - pos; edje_object_part_drag_value_set(wd->slider, "elm.dragable.slider", pos, pos); } @@ -343,10 +368,10 @@ _units_set(Evas_Object *obj) if (!wd) return; if (wd->units) { - char buf[1024]; + char buf[1024]; - snprintf(buf, sizeof(buf), wd->units, wd->val); - edje_object_part_text_set(wd->slider, "elm.units", buf); + snprintf(buf, sizeof(buf), wd->units, wd->val); + edje_object_part_text_set(wd->slider, "elm.units", buf); } else edje_object_part_text_set(wd->slider, "elm.units", NULL); @@ -359,24 +384,25 @@ _indicator_set(Evas_Object *obj) if (!wd) return; if (wd->indicator_format_func) { - const char *buf; - buf = wd->indicator_format_func(wd->val); - edje_object_part_text_set(wd->slider, "elm.indicator", buf); + const char *buf; + buf = wd->indicator_format_func(wd->val); + edje_object_part_text_set(wd->slider, "elm.dragable.slider:elm.indicator", buf); } else if (wd->indicator) { - char buf[1024]; - snprintf(buf, sizeof(buf), wd->indicator, wd->val); - edje_object_part_text_set(wd->slider, "elm.indicator", buf); + char buf[1024]; + snprintf(buf, sizeof(buf), wd->indicator, wd->val); + edje_object_part_text_set(wd->slider, "elm.dragable.slider:elm.indicator", buf); } else - edje_object_part_text_set(wd->slider, "elm.indicator", NULL); + edje_object_part_text_set(wd->slider, "elm.dragable.slider:elm.indicator", NULL); } static void _drag(void *data, Evas_Object *obj __UNUSED__, const char *emission __UNUSED__, const char *source __UNUSED__) { Widget_Data *wd = elm_widget_data_get((Evas_Object*)data); + if (elm_widget_disabled_get(data)) return; edje_object_signal_emit(wd->slider, "elm,state,drag", "elm"); edje_object_message_signal_process(wd->slider); _val_fetch(data); @@ -388,28 +414,31 @@ static void _drag_start(void *data, Evas_Object *obj __UNUSED__, const char *emission __UNUSED__, const char *source __UNUSED__) { Widget_Data *wd = elm_widget_data_get((Evas_Object*)data); + if (elm_widget_disabled_get(data)) return; _val_fetch(data); evas_object_smart_callback_call(data, SIG_DRAG_START, NULL); edje_object_signal_emit(wd->slider, "elm,state,drag", "elm"); edje_object_message_signal_process(wd->slider); _units_set(data); _indicator_set(data); - elm_widget_scroll_hold_push(data); + elm_widget_scroll_freeze_push(data); } static void _drag_stop(void *data, Evas_Object *obj __UNUSED__, const char *emission __UNUSED__, const char *source __UNUSED__) { + if (elm_widget_disabled_get(data)) return; _val_fetch(data); evas_object_smart_callback_call(data, SIG_DRAG_STOP, NULL); _units_set(data); _indicator_set(data); - elm_widget_scroll_hold_pop(data); + elm_widget_scroll_freeze_pop(data); } static void _drag_step(void *data, Evas_Object *obj __UNUSED__, const char *emission __UNUSED__, const char *source __UNUSED__) { + if (elm_widget_disabled_get(data)) return; _val_fetch(data); _units_set(data); _indicator_set(data); @@ -420,6 +449,7 @@ _drag_up(void *data, Evas_Object *obj __UNUSED__, const char *emission __UNUSED_ { double step; Widget_Data *wd; + if (elm_widget_disabled_get(data)) return; wd = elm_widget_data_get(data); step = 0.05; @@ -434,6 +464,7 @@ _drag_down(void *data, Evas_Object *obj __UNUSED__, const char *emission __UNUSE { double step; Widget_Data *wd; + if (elm_widget_disabled_get(data)) return; wd = elm_widget_data_get(data); step = -0.05; @@ -450,7 +481,8 @@ _spacer_cb(void *data, Evas *e, Evas_Object *obj __UNUSED__, void *event_info) Evas_Event_Mouse_Down *ev = event_info; Evas_Coord x, y, w, h; double button_x, button_y; - + if (elm_widget_disabled_get(data)) return; + evas_object_geometry_get(wd->spacer, &x, &y, &w, &h); edje_object_part_drag_value_get(wd->slider, "elm.dragable.slider", &button_x, &button_y); if (wd->horizontal) @@ -459,7 +491,7 @@ _spacer_cb(void *data, Evas *e, Evas_Object *obj __UNUSED__, void *event_info) if (button_x > 1) button_x = 1; if (button_x < 0) button_x = 0; } - else + else { button_y = ((double)ev->output.y - (double)y) / (double)h; if (button_y > 1) button_y = 1; @@ -469,7 +501,7 @@ _spacer_cb(void *data, Evas *e, Evas_Object *obj __UNUSED__, void *event_info) evas_event_feed_mouse_cancel(e, 0, NULL); wd->feed_cnt ++; if(wd->feed_cnt < 3) - evas_event_feed_mouse_down(e, 1, EVAS_BUTTON_NONE, 0, NULL); + evas_event_feed_mouse_down(e, 1, EVAS_BUTTON_NONE, 0, NULL); wd->feed_cnt = 0; } @@ -488,12 +520,8 @@ elm_slider_add(Evas_Object *parent) Evas *e; Widget_Data *wd; - EINA_SAFETY_ON_NULL_RETURN_VAL(parent, NULL); + ELM_WIDGET_STANDARD_SETUP(wd, Widget_Data, parent, e, obj, NULL); - wd = ELM_NEW(Widget_Data); - e = evas_object_evas_get(parent); - if (!e) return NULL; - obj = elm_widget_add(e); ELM_SET_WIDTYPE(widtype, "slider"); elm_widget_type_set(obj, "slider"); elm_widget_sub_object_add(parent, obj); @@ -520,7 +548,7 @@ elm_slider_add(Evas_Object *parent) edje_object_signal_callback_add(wd->slider, "drag,stop", "*", _drag_stop, obj); edje_object_signal_callback_add(wd->slider, "drag,step", "*", _drag_step, obj); edje_object_signal_callback_add(wd->slider, "drag,page", "*", _drag_stop, obj); -// edje_object_signal_callback_add(wd->slider, "drag,set", "*", _drag_stop, obj); + // edje_object_signal_callback_add(wd->slider, "drag,set", "*", _drag_stop, obj); edje_object_part_drag_value_set(wd->slider, "elm.dragable.slider", 0.0, 0.0); wd->spacer = evas_object_rectangle_add(e); @@ -531,6 +559,7 @@ elm_slider_add(Evas_Object *parent) evas_object_event_callback_add(wd->spacer, EVAS_CALLBACK_MOUSE_DOWN, _spacer_cb, obj); evas_object_smart_callback_add(obj, "sub-object-del", _sub_del, obj); + _mirrored_set(obj, elm_widget_mirrored_get(obj)); _sizing_eval(obj); // TODO: convert Elementary to subclassing of Evas_Smart_Class @@ -556,13 +585,13 @@ elm_slider_label_set(Evas_Object *obj, const char *label) eina_stringshare_replace(&wd->label, label); if (label) { - edje_object_signal_emit(wd->slider, "elm,state,text,visible", "elm"); - edje_object_message_signal_process(wd->slider); + edje_object_signal_emit(wd->slider, "elm,state,text,visible", "elm"); + edje_object_message_signal_process(wd->slider); } else { - edje_object_signal_emit(wd->slider, "elm,state,text,hidden", "elm"); - edje_object_message_signal_process(wd->slider); + edje_object_signal_emit(wd->slider, "elm,state,text,hidden", "elm"); + edje_object_message_signal_process(wd->slider); } edje_object_part_text_set(wd->slider, "elm.text", label); _sizing_eval(obj); @@ -611,12 +640,12 @@ elm_slider_icon_set(Evas_Object *obj, Evas_Object *icon) wd->icon = icon; if (icon) { - elm_widget_sub_object_add(obj, icon); - evas_object_event_callback_add(icon, EVAS_CALLBACK_CHANGED_SIZE_HINTS, - _changed_size_hints, obj); - edje_object_part_swallow(wd->slider, "elm.swallow.icon", icon); - edje_object_signal_emit(wd->slider, "elm,state,icon,visible", "elm"); - edje_object_message_signal_process(wd->slider); + elm_widget_sub_object_add(obj, icon); + evas_object_event_callback_add(icon, EVAS_CALLBACK_CHANGED_SIZE_HINTS, + _changed_size_hints, obj); + edje_object_part_swallow(wd->slider, "elm.swallow.icon", icon); + edje_object_signal_emit(wd->slider, "elm,state,icon,visible", "elm"); + edje_object_message_signal_process(wd->slider); } _sizing_eval(obj); } @@ -642,12 +671,12 @@ elm_slider_icon_unset(Evas_Object *obj) if (!wd) return NULL; if (wd->icon) { - elm_widget_sub_object_del(obj, wd->icon); - ret = wd->icon; - edje_object_part_unswallow(wd->slider, wd->icon); - edje_object_signal_emit(wd->slider, "elm,state,icon,hidden", "elm"); - wd->icon = NULL; - _sizing_eval(obj); + elm_widget_sub_object_del(obj, wd->icon); + ret = wd->icon; + edje_object_part_unswallow(wd->slider, wd->icon); + edje_object_signal_emit(wd->slider, "elm,state,icon,hidden", "elm"); + wd->icon = NULL; + _sizing_eval(obj); } return ret; } @@ -696,9 +725,9 @@ elm_slider_span_size_set(Evas_Object *obj, Evas_Coord size) else evas_object_size_hint_min_set(wd->spacer, 1, (double)wd->size * elm_widget_scale_get(obj) * _elm_config->scale); if (wd->indicator_show) - edje_object_signal_emit(wd->slider, "elm,state,val,show", "elm"); + edje_object_signal_emit(wd->slider, "elm,state,val,show", "elm"); else - edje_object_signal_emit(wd->slider, "elm,state,val,hide", "elm"); + edje_object_signal_emit(wd->slider, "elm,state,val,hide", "elm"); edje_object_part_swallow(wd->slider, "elm.swallow.bar", wd->spacer); _sizing_eval(obj); } @@ -747,13 +776,13 @@ elm_slider_unit_format_set(Evas_Object *obj, const char *units) eina_stringshare_replace(&wd->units, units); if (units) { - edje_object_signal_emit(wd->slider, "elm,state,units,visible", "elm"); - edje_object_message_signal_process(wd->slider); + edje_object_signal_emit(wd->slider, "elm,state,units,visible", "elm"); + edje_object_message_signal_process(wd->slider); } else { - edje_object_signal_emit(wd->slider, "elm,state,units,hidden", "elm"); - edje_object_message_signal_process(wd->slider); + edje_object_signal_emit(wd->slider, "elm,state,units,hidden", "elm"); + edje_object_message_signal_process(wd->slider); } _units_set(obj); _sizing_eval(obj); @@ -1048,12 +1077,12 @@ elm_slider_end_set(Evas_Object *obj, Evas_Object *end) wd->end = end; if (end) { - elm_widget_sub_object_add(obj, end); - evas_object_event_callback_add(end, EVAS_CALLBACK_CHANGED_SIZE_HINTS, - _changed_size_hints, obj); - edje_object_part_swallow(wd->slider, "elm.swallow.end", end); - edje_object_signal_emit(wd->slider, "elm,state,end,visible", "elm"); - edje_object_message_signal_process(wd->slider); + elm_widget_sub_object_add(obj, end); + evas_object_event_callback_add(end, EVAS_CALLBACK_CHANGED_SIZE_HINTS, + _changed_size_hints, obj); + edje_object_part_swallow(wd->slider, "elm.swallow.end", end); + edje_object_signal_emit(wd->slider, "elm,state,end,visible", "elm"); + edje_object_message_signal_process(wd->slider); } _sizing_eval(obj); } @@ -1079,12 +1108,12 @@ elm_slider_end_unset(Evas_Object *obj) if (!wd) return NULL; if (wd->end) { - elm_widget_sub_object_del(obj, wd->end); - ret = wd->end; - edje_object_part_unswallow(wd->slider, wd->end); - edje_object_signal_emit(wd->slider, "elm,state,end,hidden", "elm"); - wd->end = NULL; - _sizing_eval(obj); + elm_widget_sub_object_del(obj, wd->end); + ret = wd->end; + edje_object_part_unswallow(wd->slider, wd->end); + edje_object_signal_emit(wd->slider, "elm,state,end,hidden", "elm"); + wd->end = NULL; + _sizing_eval(obj); } return ret; } @@ -1125,12 +1154,12 @@ elm_slider_indicator_show_set(Evas_Object *obj, Eina_Bool show) ELM_CHECK_WIDTYPE(obj, widtype); Widget_Data *wd = elm_widget_data_get(obj); if (show) { - wd->indicator_show = EINA_TRUE; - edje_object_signal_emit(wd->slider, "elm,state,val,show", "elm"); + wd->indicator_show = EINA_TRUE; + edje_object_signal_emit(wd->slider, "elm,state,val,show", "elm"); } else { - wd->indicator_show = EINA_FALSE; - edje_object_signal_emit(wd->slider, "elm,state,val,hide", "elm"); + wd->indicator_show = EINA_FALSE; + edje_object_signal_emit(wd->slider, "elm,state,val,hide", "elm"); } } @@ -1152,3 +1181,4 @@ elm_slider_indicator_show_get(const Evas_Object *obj) if (!wd) return EINA_FALSE; return wd->indicator_show; } +