zmike pushed a commit to branch master. http://git.enlightenment.org/core/efl.git/commit/?id=ebae12f06a944259b9b4c094bdb009c6391c67ea
commit ebae12f06a944259b9b4c094bdb009c6391c67ea Author: WooHyun Jung <wh0705.j...@samsung.com> Date: Tue Aug 20 09:09:14 2019 -0400 elm_slider: remove dependency with efl_ui_slider Summary: This commit includes follwoing works. 1. change parent class from EFL_UI_SLIDER_INTERVAL to EFL_UI_LAYOUT_BASE 2. get all necessary codes from efl_ui_slider and efl_ui_slider_interval to elm_slider 3. add callbacks to slider test code ref T7893 Test Plan: 1. elementary_test 2. slider 3. operate sliders on the window Reviewers: bu5hm4n, segfaultxavi, eagleeye, zmike Reviewed By: zmike Subscribers: zmike, cedric, #reviewers, #committers Tags: #efl Maniphest Tasks: T7893 Differential Revision: https://phab.enlightenment.org/D9623 --- src/bin/elementary/test_slider.c | 16 + src/lib/elementary/elm_slider.c | 939 +++++++++++++++++++++------------ src/lib/elementary/elm_slider_eo.c | 2 +- src/lib/elementary/elm_widget_slider.h | 13 +- src/tests/elementary/elm_test_slider.c | 8 +- 5 files changed, 628 insertions(+), 350 deletions(-) diff --git a/src/bin/elementary/test_slider.c b/src/bin/elementary/test_slider.c index 1b0b2999c3..10c21441c7 100644 --- a/src/bin/elementary/test_slider.c +++ b/src/bin/elementary/test_slider.c @@ -24,6 +24,18 @@ _change_cb(void *data, Evas_Object *obj, void *event_info EINA_UNUSED) elm_slider_value_set(data, val); } +void +_drag_start_cb(void *data EINA_UNUSED, Evas_Object *obj, void *event_info EINA_UNUSED) +{ + printf("drag,started! slider value : %d\n", (int)round(elm_slider_value_get(obj))); +} + +void +_drag_stop_cb(void *data EINA_UNUSED, Evas_Object *obj, void *event_info EINA_UNUSED) +{ + printf("drag,stopped! slider value : %d\n", (int)round(elm_slider_value_get(obj))); +} + static void _ok_btn_clicked(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) @@ -244,6 +256,10 @@ test_slider(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_in evas_object_show(ic); evas_object_show(sl); + evas_object_smart_callback_add(sl, "slider,drag,start", _drag_start_cb, NULL); + evas_object_smart_callback_add(sl, "slider,drag,stop", _drag_stop_cb, NULL); + + // horizontally inverted slider ic = elm_icon_add(bx); snprintf(buf, sizeof(buf), "%s/images/logo_small.png", elm_app_data_dir_get()); diff --git a/src/lib/elementary/elm_slider.c b/src/lib/elementary/elm_slider.c index eab59c1c0d..cc09ed14b7 100644 --- a/src/lib/elementary/elm_slider.c +++ b/src/lib/elementary/elm_slider.c @@ -81,7 +81,6 @@ _is_horizontal(Efl_Ui_Layout_Orientation dir) static void _units_set(Evas_Object *obj) { - EFL_UI_SLIDER_DATA_GET(obj, sd2); ELM_SLIDER_DATA_GET(obj, sd); if (sd->format_cb) @@ -92,7 +91,7 @@ _units_set(Evas_Object *obj) eina_strbuf_reset(sd->format_strbuf); if (!sd->intvl_enable) - eina_value_set(&val, sd2->val); + eina_value_set(&val, sd->val); else { double v1, v2; @@ -126,8 +125,6 @@ _units_set(Evas_Object *obj) static void _indicator_set(Evas_Object *obj) { - EFL_UI_SLIDER_DATA_GET(obj, sd2); - EFL_UI_SLIDER_INTERVAL_DATA_GET(obj, pd); ELM_SLIDER_DATA_GET(obj, sd); Eina_Value val; @@ -138,7 +135,7 @@ _indicator_set(Evas_Object *obj) eina_value_setup(&val, EINA_VALUE_TYPE_DOUBLE); eina_strbuf_reset(sd->indi_format_strbuf); - eina_value_set(&val, sd2->val); + eina_value_set(&val, sd->val); sd->indi_format_cb(sd->indi_format_cb_data, sd->indi_format_strbuf, val); str = eina_strbuf_string_get(sd->indi_format_strbuf); @@ -151,7 +148,7 @@ _indicator_set(Evas_Object *obj) if (sd->popup2) { eina_strbuf_reset(sd->indi_format_strbuf); - eina_value_set(&val, pd->intvl_to); + eina_value_set(&val, sd->intvl_to); sd->indi_format_cb(sd->indi_format_cb_data, sd->indi_format_strbuf, val); str = eina_strbuf_string_get(sd->indi_format_strbuf); elm_layout_text_set(obj, "elm.dragable2.slider:elm.indicator", str); @@ -164,7 +161,6 @@ _indicator_set(Evas_Object *obj) static void _min_max_set(Evas_Object *obj) { - EFL_UI_SLIDER_DATA_GET(obj, sd2); ELM_SLIDER_DATA_GET(obj, sd); Eina_Strbuf *str; Eina_Value val; @@ -174,13 +170,13 @@ _min_max_set(Evas_Object *obj) str = eina_strbuf_new(); - eina_value_set(&val, sd2->val_max); + eina_value_set(&val, sd->val_max); sd->format_cb(sd->format_cb_data, str, val); elm_layout_text_set(obj, "elm.units.min", eina_strbuf_string_get(str)); eina_strbuf_reset(str); - eina_value_set(&val, sd2->val_min); + eina_value_set(&val, sd->val_min); sd->format_cb(sd->format_cb_data, str, val); elm_layout_text_set(obj, "elm.units.max", eina_strbuf_string_get(str)); @@ -293,6 +289,190 @@ _wheel_indicator_timer_cb(void *data) return ECORE_CALLBACK_CANCEL; } +static void +_val_set(Evas_Object *obj) +{ + double pos, pos2; + + ELM_SLIDER_DATA_GET_OR_RETURN(obj, sd); + ELM_WIDGET_DATA_GET_OR_RETURN(obj, wd); + + if (sd->val_max > sd->val_min) + { + pos = (sd->val - sd->val_min) / (sd->val_max - sd->val_min); + pos2 = (sd->intvl_to - sd->val_min) / (sd->val_max - sd->val_min); + } + else + { + pos = 0.0; + pos2 = 0.0; + } + + if (pos < 0.0) pos = 0.0; + else if (pos > 1.0) + pos = 1.0; + + if (pos2 < 0.0) pos2 = 0.0; + else if (pos2 > 1.0) + pos2 = 1.0; + + if (efl_ui_mirrored_get(obj) ^ efl_ui_layout_orientation_is_inverted(sd->dir)) + { + pos = 1.0 - pos; + pos2 = 1.0 - pos2; + } + + efl_ui_drag_value_set(efl_part(wd->resize_obj, "elm.dragable.slider"), + pos, pos); + if (sd->intvl_enable) + efl_ui_drag_value_set(efl_part(wd->resize_obj, "elm.dragable2.slider"), + pos2, pos2); + + // emit accessibility event also if value was changed by API + if (_elm_config->atspi_mode) + efl_access_value_changed_signal_emit(obj); + + evas_object_smart_changed(obj); +} + +static void +_val_fetch(Evas_Object *obj, Eina_Bool user_event) +{ + double posx = 0.0, posy = 0.0, pos = 0.0, val; + double posx2 = 0.0, posy2 = 0.0, pos2 = 0.0, val2 = 0.0; + Eina_Bool inverted = EINA_FALSE; + Eina_Bool evented = EINA_FALSE; + + ELM_SLIDER_DATA_GET_OR_RETURN(obj, sd); + ELM_WIDGET_DATA_GET_OR_RETURN(obj, wd); + + efl_ui_drag_value_get(efl_part(wd->resize_obj, "elm.dragable.slider"), + &posx, &posy); + if (efl_ui_layout_orientation_is_horizontal(sd->dir, EINA_TRUE)) pos = posx; + else pos = posy; + + if (sd->intvl_enable) + { + efl_ui_drag_value_get(efl_part(wd->resize_obj, "elm.dragable2.slider"), + &posx2, &posy2); + if (efl_ui_layout_orientation_is_horizontal(sd->dir, EINA_TRUE)) pos2 = posx2; + else pos2 = posy2; + } + + if (efl_ui_mirrored_get(obj) ^ efl_ui_layout_orientation_is_inverted(sd->dir)) + { + pos = 1.0 - pos; + pos2 = 1.0 - pos2; + inverted = EINA_TRUE; + } + + val = (pos * (sd->val_max - sd->val_min)) + sd->val_min; + + if (sd->intvl_enable) + { + val2 = (pos2 * (sd->val_max - sd->val_min)) + sd->val_min; + if (!inverted) + { + if (val > sd->intvl_to) + { + val = sd->intvl_to; + _val_set(obj); + } + else if (val2 < sd->intvl_from) + { + val2 = sd->intvl_from; + _val_set(obj); + } + } + else + { + if (val < sd->intvl_to) + { + val = sd->intvl_to; + _val_set(obj); + } + else if (val2 > sd->intvl_from) + { + val2 = sd->intvl_from; + _val_set(obj); + } + } + } + if (fabs(val - sd->val) > DBL_EPSILON) + { + sd->val = val; + sd->intvl_from = val; + if (user_event) + { + evas_object_smart_callback_call(obj, SIG_CHANGED, NULL); + ecore_timer_del(sd->delay); + sd->delay = ecore_timer_add(SLIDER_DELAY_CHANGED_INTERVAL, _delay_change, obj); + evented = EINA_TRUE; + } + } + + if (sd->intvl_enable && fabs(val2 - sd->intvl_to) > DBL_EPSILON) + { + sd->intvl_to = val2; + /* avoid emitting two events and setting a timer twice */ + if (user_event && (!evented)) + { + evas_object_smart_callback_call(obj, SIG_CHANGED, NULL); + ecore_timer_del(sd->delay); + sd->delay = ecore_timer_add(SLIDER_DELAY_CHANGED_INTERVAL, _delay_change, obj); + } + } +} + +static void +_slider_update(Evas_Object *obj, Eina_Bool user_event) +{ + _val_fetch(obj, user_event); + evas_object_smart_changed(obj); +} + +static void +_drag(void *data, + Evas_Object *obj EINA_UNUSED, + const char *emission EINA_UNUSED, + const char *source EINA_UNUSED) +{ + _slider_update(data, EINA_TRUE); +} + +static void +_drag_start(void *data, + Evas_Object *obj EINA_UNUSED, + const char *emission EINA_UNUSED, + const char *source EINA_UNUSED) +{ + if (!efl_ui_focus_object_focus_get(data)) + elm_object_focus_set(data, EINA_TRUE); + _slider_update(data, EINA_TRUE); + evas_object_smart_callback_call(data, SIG_DRAG_START, NULL); + elm_widget_scroll_freeze_push(data); +} + +static void +_drag_stop(void *data, + Evas_Object *obj EINA_UNUSED, + const char *emission EINA_UNUSED, + const char *source EINA_UNUSED) +{ + _slider_update(data, EINA_TRUE); + evas_object_smart_callback_call(data, SIG_DRAG_STOP, NULL); + elm_widget_scroll_freeze_pop(data); +} + +static void +_drag_step(void *data, + Evas_Object *obj EINA_UNUSED, + const char *emission EINA_UNUSED, + const char *source EINA_UNUSED) +{ + _slider_update(data, EINA_TRUE); +} + static void _drag_up(void *data, Evas_Object *obj EINA_UNUSED, @@ -301,7 +481,7 @@ _drag_up(void *data, { double step; - EFL_UI_SLIDER_DATA_GET(data, sd); + ELM_SLIDER_DATA_GET(data, sd); step = sd->step; if (efl_ui_layout_orientation_is_inverted(sd->dir)) step *= -1.0; @@ -319,7 +499,7 @@ _drag_down(void *data, { double step; - EFL_UI_SLIDER_DATA_GET(data, sd); + ELM_SLIDER_DATA_GET(data, sd); step = -sd->step; if (efl_ui_layout_orientation_is_inverted(sd->dir)) step *= -1.0; @@ -332,7 +512,7 @@ _drag_down(void *data, static Eina_Bool _key_action_drag(Evas_Object *obj, const char *params) { - EFL_UI_SLIDER_DATA_GET(obj, sd); + ELM_SLIDER_DATA_GET(obj, sd); const char *dir = params; if (!strcmp(dir, "left")) @@ -405,7 +585,7 @@ _elm_slider_efl_ui_widget_widget_input_event_handler(Eo *obj, Elm_Slider_Data *s else return EINA_FALSE; _popup_show(obj, NULL, NULL, NULL); - efl_ui_slider_val_fetch(obj, EINA_TRUE); + _val_fetch(obj, EINA_TRUE); evas_object_smart_changed(obj); return EINA_TRUE; @@ -466,310 +646,81 @@ _track2_resize_cb(void *data, static void _popup_update(Evas_Object *obj, Elm_Slider_Data *sd, Evas_Object *popup) { - EFL_UI_SLIDER_DATA_GET(obj, sd2); if (elm_widget_is_legacy(obj)) { - if (_is_horizontal(sd2->dir)) - elm_widget_theme_object_set(obj, popup, "slider", "horizontal/popup", elm_widget_style_get(obj)); - else - elm_widget_theme_object_set(obj, popup, "slider", "vertical/popup", elm_widget_style_get(obj)); - } - else - elm_widget_element_update(obj, popup, PART_NAME_POPUP); - edje_object_scale_set(popup, efl_gfx_entity_scale_get(obj) * - elm_config_scale_get()); - - if (!efl_ui_layout_orientation_is_inverted(sd2->dir)) - edje_object_signal_emit(popup, "elm,state,inverted,off", "elm"); - else - edje_object_signal_emit(popup, "elm,state,inverted,on", "elm"); - - if (sd->indicator_show) - edje_object_signal_emit(popup, "elm,state,val,show", "elm"); - else - edje_object_signal_emit(popup, "elm,state,val,hide", "elm"); -} - -static void -_popup_add(Elm_Slider_Data *sd, Eo *obj, Evas_Object **popup, - Evas_Object **track, Eina_Bool is_range) -{ - /* if theme has an overlayed slider mode, then lets support it */ - if (!is_range - && !edje_object_part_exists(elm_layout_edje_get(obj), "elm.track.slider")) - return; - else if (is_range - && !edje_object_part_exists(elm_layout_edje_get(obj), "elm.track2.slider")) - return; - - // XXX popup needs to adapt to theme etc. - *popup = edje_object_add(evas_object_evas_get(obj)); - evas_object_smart_member_add(*popup, obj); - edje_object_signal_callback_add(*popup, "popup,hide,done", "elm", // XXX: for compat - _popup_hide_done, obj); - edje_object_signal_callback_add(*popup, "elm,popup,hide,done", "elm", - _popup_hide_done, obj); - - _popup_update(obj, sd, *popup); - - /* create a rectangle to track position+size of the dragable */ - *track = evas_object_rectangle_add(evas_object_evas_get(obj)); - evas_object_color_set(*track, 0, 0, 0, 0); - evas_object_pass_events_set(*track, EINA_TRUE); - if (!is_range) - { - evas_object_event_callback_add - (*track, EVAS_CALLBACK_MOVE, _track_move_cb, obj); - evas_object_event_callback_add - (*track, EVAS_CALLBACK_RESIZE, _track_resize_cb, obj); - elm_layout_content_set(obj, "elm.track.slider", *track); - } - else - { - evas_object_event_callback_add - (*track, EVAS_CALLBACK_MOVE, _track2_move_cb, obj); - evas_object_event_callback_add - (*track, EVAS_CALLBACK_RESIZE, _track2_resize_cb, obj); - elm_layout_content_set(obj, "elm.track2.slider", *track); - } -} - -void -_elm_slider_val_fetch(Evas_Object *obj, Elm_Slider_Data *pd, Eina_Bool user_event) -{ - double posx = 0.0, posy = 0.0, pos = 0.0, val; - double posx2 = 0.0, posy2 = 0.0, pos2 = 0.0, val2 = 0.0; - Eina_Bool inverted = EINA_FALSE; - Eina_Bool evented = EINA_FALSE; - - EFL_UI_SLIDER_DATA_GET(obj, sd); - EFL_UI_SLIDER_INTERVAL_DATA_GET(obj, id); - ELM_WIDGET_DATA_GET_OR_RETURN(obj, wd); - - efl_ui_drag_value_get(efl_part(wd->resize_obj, "elm.dragable.slider"), - &posx, &posy); - if (efl_ui_layout_orientation_is_horizontal(sd->dir, EINA_TRUE)) pos = posx; - else pos = posy; - - if (pd->intvl_enable) - { - efl_ui_drag_value_get(efl_part(wd->resize_obj, "elm.dragable2.slider"), - &posx2, &posy2); - if (efl_ui_layout_orientation_is_horizontal(sd->dir, EINA_TRUE)) pos2 = posx2; - else pos2 = posy2; - } - - if (efl_ui_mirrored_get(obj) ^ efl_ui_layout_orientation_is_inverted(sd->dir)) - { - pos = 1.0 - pos; - pos2 = 1.0 - pos2; - inverted = EINA_TRUE; - } - - val = (pos * (sd->val_max - sd->val_min)) + sd->val_min; - - if (pd->intvl_enable) - { - val2 = (pos2 * (sd->val_max - sd->val_min)) + sd->val_min; - if (!inverted) - { - if (val > id->intvl_to) - { - val = id->intvl_to; - efl_ui_slider_val_set(obj); - } - else if (val2 < id->intvl_from) - { - val2 = id->intvl_from; - efl_ui_slider_val_set(obj); - } - } - else - { - if (val < id->intvl_to) - { - val = id->intvl_to; - efl_ui_slider_val_set(obj); - } - else if (val2 > id->intvl_from) - { - val2 = id->intvl_from; - efl_ui_slider_val_set(obj); - } - } - } - if (fabs(val - sd->val) > DBL_EPSILON) - { - sd->val = val; - id->intvl_from = val; - if (user_event) - { - efl_event_callback_legacy_call(obj, EFL_UI_RANGE_EVENT_CHANGED, NULL); - ecore_timer_del(pd->delay); - pd->delay = ecore_timer_add(SLIDER_DELAY_CHANGED_INTERVAL, _delay_change, obj); - evented = EINA_TRUE; - } - } - - if (pd->intvl_enable && fabs(val2 - id->intvl_to) > DBL_EPSILON) - { - id->intvl_to = val2; - /* avoid emitting two events and setting a timer twice */ - if (user_event && (!evented)) - { - efl_event_callback_legacy_call(obj, EFL_UI_RANGE_EVENT_CHANGED, NULL); - ecore_timer_del(pd->delay); - pd->delay = ecore_timer_add(SLIDER_DELAY_CHANGED_INTERVAL, _delay_change, obj); - } - } -} - -void -_elm_slider_val_set(Evas_Object *obj, Elm_Slider_Data *pd) -{ - double pos, pos2; - - EFL_UI_SLIDER_DATA_GET(obj, sd); - EFL_UI_SLIDER_INTERVAL_DATA_GET(obj, id); - ELM_WIDGET_DATA_GET_OR_RETURN(obj, wd); - - if (sd->val_max > sd->val_min) - { - pos = (sd->val - sd->val_min) / (sd->val_max - sd->val_min); - pos2 = (id->intvl_to - sd->val_min) / (sd->val_max - sd->val_min); - } - else - { - pos = 0.0; - pos2 = 0.0; - } - - if (pos < 0.0) pos = 0.0; - else if (pos > 1.0) - pos = 1.0; - - if (pos2 < 0.0) pos2 = 0.0; - else if (pos2 > 1.0) - pos2 = 1.0; - - if (efl_ui_mirrored_get(obj) ^ efl_ui_layout_orientation_is_inverted(sd->dir)) - { - pos = 1.0 - pos; - pos2 = 1.0 - pos2; - } - - efl_ui_drag_value_set(efl_part(wd->resize_obj, "elm.dragable.slider"), - pos, pos); - if (pd->intvl_enable) - efl_ui_drag_value_set(efl_part(wd->resize_obj, "elm.dragable2.slider"), - pos2, pos2); - - // emit accessibility event also if value was changed by API - if (_elm_config->atspi_mode) - efl_access_value_changed_signal_emit(obj); - - evas_object_smart_changed(obj); -} -void -_elm_slider_down_knob(Evas_Object *obj, Elm_Slider_Data *pd, double button_x, double button_y) -{ - EFL_UI_SLIDER_DATA_GET(obj, sd); - EFL_UI_SLIDER_INTERVAL_DATA_GET(obj, id); - ELM_WIDGET_DATA_GET_OR_RETURN(obj, wd); - - if (!pd->intvl_enable) - { - efl_ui_drag_value_set(efl_part(wd->resize_obj, "elm.dragable.slider"), - button_x, button_y); - } - else - { - double posx = 0.0, posy = 0.0, posx2 = 0.0, posy2 = 0.0, diff1, diff2, diff3; - - efl_ui_drag_value_get(efl_part(wd->resize_obj, "elm.dragable.slider"), - &posx, &posy); - efl_ui_drag_value_get(efl_part(wd->resize_obj, "elm.dragable2.slider"), - &posx2, &posy2); - - if (efl_ui_layout_orientation_is_horizontal(sd->dir, EINA_TRUE)) - { - diff1 = fabs(button_x - posx); - diff2 = fabs(button_x - posx2); - diff3 = button_x - posx; - } - else - { - diff1 = fabs(button_y - posy); - diff2 = fabs(button_y - posy2); - diff3 = button_y - posy; - } - - if (diff1 < diff2) - { - efl_ui_drag_value_set(efl_part(wd->resize_obj, "elm.dragable.slider"), - button_x, button_y); - id->intvl_flag = 1; - } - else if (diff1 > diff2) - { - efl_ui_drag_value_set(efl_part(wd->resize_obj, "elm.dragable2.slider"), - button_x, button_y); - id->intvl_flag = 2; - } - else - { - if (diff3 < 0) - { - efl_ui_drag_value_set(efl_part(wd->resize_obj, "elm.dragable.slider"), - button_x, button_y); - id->intvl_flag = 1; - } - else - { - efl_ui_drag_value_set(efl_part(wd->resize_obj, "elm.dragable2.slider"), - button_x, button_y); - id->intvl_flag = 2; - } - } + if (_is_horizontal(sd->dir)) + elm_widget_theme_object_set(obj, popup, "slider", "horizontal/popup", elm_widget_style_get(obj)); + else + elm_widget_theme_object_set(obj, popup, "slider", "vertical/popup", elm_widget_style_get(obj)); } + else + elm_widget_element_update(obj, popup, PART_NAME_POPUP); + edje_object_scale_set(popup, efl_gfx_entity_scale_get(obj) * + elm_config_scale_get()); + + if (!efl_ui_layout_orientation_is_inverted(sd->dir)) + edje_object_signal_emit(popup, "elm,state,inverted,off", "elm"); + else + edje_object_signal_emit(popup, "elm,state,inverted,on", "elm"); + + if (sd->indicator_show) + edje_object_signal_emit(popup, "elm,state,val,show", "elm"); + else + edje_object_signal_emit(popup, "elm,state,val,hide", "elm"); } -void -_elm_slider_move_knob(Evas_Object *obj, Elm_Slider_Data *pd, double button_x, double button_y) +static void +_popup_add(Elm_Slider_Data *sd, Eo *obj, Evas_Object **popup, + Evas_Object **track, Eina_Bool is_range) { - EFL_UI_SLIDER_INTERVAL_DATA_GET(obj, id); - ELM_WIDGET_DATA_GET_OR_RETURN(obj, wd); + /* if theme has an overlayed slider mode, then lets support it */ + if (!is_range + && !edje_object_part_exists(elm_layout_edje_get(obj), "elm.track.slider")) + return; + else if (is_range + && !edje_object_part_exists(elm_layout_edje_get(obj), "elm.track2.slider")) + return; + + // XXX popup needs to adapt to theme etc. + *popup = edje_object_add(evas_object_evas_get(obj)); + evas_object_smart_member_add(*popup, obj); + edje_object_signal_callback_add(*popup, "popup,hide,done", "elm", // XXX: for compat + _popup_hide_done, obj); + edje_object_signal_callback_add(*popup, "elm,popup,hide,done", "elm", + _popup_hide_done, obj); + + _popup_update(obj, sd, *popup); - if (!pd->intvl_enable) + /* create a rectangle to track position+size of the dragable */ + *track = evas_object_rectangle_add(evas_object_evas_get(obj)); + evas_object_color_set(*track, 0, 0, 0, 0); + evas_object_pass_events_set(*track, EINA_TRUE); + if (!is_range) { - efl_ui_drag_value_set(efl_part(wd->resize_obj, "elm.dragable.slider"), - button_x, button_y); + evas_object_event_callback_add + (*track, EVAS_CALLBACK_MOVE, _track_move_cb, obj); + evas_object_event_callback_add + (*track, EVAS_CALLBACK_RESIZE, _track_resize_cb, obj); + elm_layout_content_set(obj, "elm.track.slider", *track); } else { - if (id->intvl_flag == 1) - { - efl_ui_drag_value_set(efl_part(wd->resize_obj, "elm.dragable.slider"), - button_x, button_y); - } - else if (id->intvl_flag == 2) - { - efl_ui_drag_value_set(efl_part(wd->resize_obj, "elm.dragable2.slider"), - button_x, button_y); - } - + evas_object_event_callback_add + (*track, EVAS_CALLBACK_MOVE, _track2_move_cb, obj); + evas_object_event_callback_add + (*track, EVAS_CALLBACK_RESIZE, _track2_resize_cb, obj); + elm_layout_content_set(obj, "elm.track2.slider", *track); } } static char * -_elm_slider_theme_group_get(Evas_Object *obj, Elm_Slider_Data *sd) +_elm_slider_theme_group_get(Evas_Object *obj EINA_UNUSED, Elm_Slider_Data *sd) { - EFL_UI_SLIDER_DATA_GET(obj, sd2); Eina_Strbuf *new_group = eina_strbuf_new(); if (sd->intvl_enable) eina_strbuf_append(new_group, "range/"); - if (_is_horizontal(sd2->dir)) + if (_is_horizontal(sd->dir)) eina_strbuf_append(new_group, "horizontal"); else eina_strbuf_append(new_group, "vertical"); @@ -782,7 +733,6 @@ _elm_slider_efl_ui_widget_theme_apply(Eo *obj, Elm_Slider_Data *sd) { Eina_Error int_ret = EFL_UI_THEME_APPLY_ERROR_GENERIC; ELM_WIDGET_DATA_GET_OR_RETURN(obj, wd, EFL_UI_THEME_APPLY_ERROR_GENERIC); - EFL_UI_SLIDER_DATA_GET_OR_RETURN(obj, sd2, EFL_UI_THEME_APPLY_ERROR_GENERIC); char *group; group = _elm_slider_theme_group_get(obj, sd); @@ -795,13 +745,13 @@ _elm_slider_efl_ui_widget_theme_apply(Eo *obj, Elm_Slider_Data *sd) int_ret = efl_ui_widget_theme_apply(efl_super(obj, MY_CLASS)); if (int_ret == EFL_UI_THEME_APPLY_ERROR_GENERIC) return int_ret; - if (_is_horizontal(sd2->dir)) + if (_is_horizontal(sd->dir)) evas_object_size_hint_min_set - (sd2->spacer, (double)sd->size * efl_gfx_entity_scale_get(obj) * + (sd->spacer, (double)sd->size * efl_gfx_entity_scale_get(obj) * elm_config_scale_get(), 1); else evas_object_size_hint_min_set - (sd2->spacer, 1, (double)sd->size * efl_gfx_entity_scale_get(obj) * + (sd->spacer, 1, (double)sd->size * efl_gfx_entity_scale_get(obj) * elm_config_scale_get()); if (sd->intvl_enable) @@ -809,7 +759,7 @@ _elm_slider_efl_ui_widget_theme_apply(Eo *obj, Elm_Slider_Data *sd) else elm_layout_signal_emit(obj, "elm,slider,range,disable", "elm"); - if (efl_ui_layout_orientation_is_inverted(sd2->dir)) + if (efl_ui_layout_orientation_is_inverted(sd->dir)) elm_layout_signal_emit(obj, "elm,state,inverted,on", "elm"); else elm_layout_signal_emit(obj, "elm,state,inverted,off", "elm"); @@ -834,6 +784,7 @@ _elm_slider_efl_ui_widget_theme_apply(Eo *obj, Elm_Slider_Data *sd) _min_max_set(obj); _units_set(obj); _indicator_set(obj); + _val_set(obj); edje_object_message_signal_process(wd->resize_obj); if (sd->popup) @@ -850,12 +801,96 @@ static void _spacer_down_cb(void *data, Evas *e EINA_UNUSED, Evas_Object *obj EINA_UNUSED, - void *event_info EINA_UNUSED) + void *event_info) { - ELM_SLIDER_DATA_GET(data, sd); + ELM_SLIDER_DATA_GET_OR_RETURN(data, sd); + ELM_WIDGET_DATA_GET_OR_RETURN(data, wd); + + Evas_Event_Mouse_Down *ev = event_info; + Eina_Rect sr; + double button_x = 0.0, button_y = 0.0; sd->spacer_down = EINA_TRUE; + sr = efl_gfx_entity_geometry_get(sd->spacer); + sd->downx = ev->canvas.x - sr.x; + sd->downy = ev->canvas.y - sr.y; + if (_is_horizontal(sd->dir)) + { + button_x = ((double)ev->canvas.x - (double)sr.x) / (double)sr.w; + if (button_x > 1) button_x = 1; + if (button_x < 0) button_x = 0; + } + else + { + button_y = ((double)ev->canvas.y - (double)sr.y) / (double)sr.h; + if (button_y > 1) button_y = 1; + if (button_y < 0) button_y = 0; + } + + if (!sd->intvl_enable) + { + efl_ui_drag_value_set(efl_part(wd->resize_obj, "elm.dragable.slider"), + button_x, button_y); + } + else + { + double posx = 0.0, posy = 0.0, posx2 = 0.0, posy2 = 0.0, diff1, diff2, diff3; + + efl_ui_drag_value_get(efl_part(wd->resize_obj, "elm.dragable.slider"), + &posx, &posy); + efl_ui_drag_value_get(efl_part(wd->resize_obj, "elm.dragable2.slider"), + &posx2, &posy2); + + if (efl_ui_layout_orientation_is_horizontal(sd->dir, EINA_TRUE)) + { + diff1 = fabs(button_x - posx); + diff2 = fabs(button_x - posx2); + diff3 = button_x - posx; + } + else + { + diff1 = fabs(button_y - posy); + diff2 = fabs(button_y - posy2); + diff3 = button_y - posy; + } + + if (diff1 < diff2) + { + efl_ui_drag_value_set(efl_part(wd->resize_obj, "elm.dragable.slider"), + button_x, button_y); + sd->intvl_flag = 1; + } + else if (diff1 > diff2) + { + efl_ui_drag_value_set(efl_part(wd->resize_obj, "elm.dragable2.slider"), + button_x, button_y); + sd->intvl_flag = 2; + } + else + { + if (diff3 < 0) + { + efl_ui_drag_value_set(efl_part(wd->resize_obj, "elm.dragable.slider"), + button_x, button_y); + sd->intvl_flag = 1; + } + else + { + efl_ui_drag_value_set(efl_part(wd->resize_obj, "elm.dragable2.slider"), + button_x, button_y); + sd->intvl_flag = 2; + } + } + } + + if (!efl_ui_focus_object_focus_get(data)) + elm_object_focus_set(data, EINA_TRUE); + + _slider_update(data, EINA_TRUE); + elm_layout_signal_emit(data, "elm,state,indicator,show", "elm"); + + evas_object_smart_callback_call(data, SIG_DRAG_START, NULL); } static void @@ -864,17 +899,80 @@ _spacer_move_cb(void *data, Evas_Object *obj EINA_UNUSED, void *event_info) { - ELM_SLIDER_DATA_GET(data, sd); + ELM_SLIDER_DATA_GET_OR_RETURN(data, sd); + ELM_WIDGET_DATA_GET_OR_RETURN(data, wd); + Evas_Event_Mouse_Move *ev = event_info; + Eina_Rect sr; + double button_x = 0.0, button_y = 0.0; if (sd->spacer_down) { + Evas_Coord d = 0; + + sr = efl_gfx_entity_geometry_get(sd->spacer); + if (_is_horizontal(sd->dir)) + d = abs(ev->cur.canvas.x - sr.x - sd->downx); + else d = abs(ev->cur.canvas.y - sr.y - sd->downy); + if (d > (_elm_config->thumbscroll_threshold - 1)) + { + if (!sd->frozen) + { + elm_widget_scroll_freeze_push(data); + sd->frozen = EINA_TRUE; + } + ev->event_flags &= ~EVAS_EVENT_FLAG_ON_HOLD; + } + if (ev->event_flags & EVAS_EVENT_FLAG_ON_HOLD) { if (sd->spacer_down) sd->spacer_down = EINA_FALSE; + _slider_update(data, EINA_TRUE); + + evas_object_smart_callback_call(data, SIG_DRAG_STOP, NULL); + + if (sd->frozen) + { + elm_widget_scroll_freeze_pop(data); + sd->frozen = EINA_FALSE; + } elm_layout_signal_emit(data, "elm,state,indicator,hide", "elm"); return; } + if (_is_horizontal(sd->dir)) + { + button_x = ((double)ev->cur.canvas.x - (double)sr.x) / (double)sr.w; + if (button_x > 1) button_x = 1; + if (button_x < 0) button_x = 0; + } + else + { + button_y = ((double)ev->cur.canvas.y - (double)sr.y) / (double)sr.h; + if (button_y > 1) button_y = 1; + if (button_y < 0) button_y = 0; + } + + if (!sd->intvl_enable) + { + efl_ui_drag_value_set(efl_part(wd->resize_obj, "elm.dragable.slider"), + button_x, button_y); + } + else + { + if (sd->intvl_flag == 1) + { + efl_ui_drag_value_set(efl_part(wd->resize_obj, "elm.dragable.slider"), + button_x, button_y); + } + else if (sd->intvl_flag == 2) + { + efl_ui_drag_value_set(efl_part(wd->resize_obj, "elm.dragable2.slider"), + button_x, button_y); + } + + } + + _slider_update(data, EINA_TRUE); } } @@ -889,25 +987,52 @@ _spacer_up_cb(void *data, if (!sd->spacer_down) return; if (sd->spacer_down) sd->spacer_down = EINA_FALSE; + _slider_update(data, EINA_TRUE); + + evas_object_smart_callback_call(data, SIG_DRAG_STOP, NULL); + + if (sd->frozen) + { + elm_widget_scroll_freeze_pop(data); + sd->frozen = EINA_FALSE; + } elm_layout_signal_emit(data, "elm,state,indicator,hide", "elm"); } +static void +_mouse_in_cb(void *data EINA_UNUSED, + Evas *e EINA_UNUSED, + Evas_Object *obj, + void *event_info EINA_UNUSED) +{ + efl_ui_widget_scroll_hold_push(obj); +} + +static void +_mouse_out_cb(void *data EINA_UNUSED, + Evas *e EINA_UNUSED, + Evas_Object *obj, + void *event_info EINA_UNUSED) +{ + efl_ui_widget_scroll_hold_pop(obj); +} + EOLIAN static void _elm_slider_efl_canvas_group_group_calculate(Eo *obj, Elm_Slider_Data *sd) { efl_canvas_group_need_recalculate_set(obj, EINA_FALSE); edje_object_freeze(obj); - EFL_UI_SLIDER_DATA_GET(obj, sd2); - if (_is_horizontal(sd2->dir)) + if (_is_horizontal(sd->dir)) evas_object_size_hint_min_set - (sd2->spacer, (double)sd->size * efl_gfx_entity_scale_get(obj) * + (sd->spacer, (double)sd->size * efl_gfx_entity_scale_get(obj) * elm_config_scale_get(), 1); else evas_object_size_hint_min_set - (sd2->spacer, 1, (double)sd->size * efl_gfx_entity_scale_get(obj) * + (sd->spacer, 1, (double)sd->size * efl_gfx_entity_scale_get(obj) * elm_config_scale_get()); + _val_fetch(obj, EINA_FALSE); // need to check whether this should be called here _min_max_set(obj); _units_set(obj); _indicator_set(obj); @@ -925,46 +1050,117 @@ _on_show(void *data EINA_UNUSED, Evas *e EINA_UNUSED, Evas_Object *obj, _popup_show(obj, NULL, NULL, NULL); } +static char * +_access_info_cb(void *data EINA_UNUSED, Evas_Object *obj) +{ + const char *txt = elm_widget_access_info_get(obj); + + if (!txt) txt = elm_layout_text_get(obj, NULL); + if (txt) return strdup(txt); + + return NULL; +} + +static char * +_access_state_cb(void *data EINA_UNUSED, Evas_Object *obj) +{ + char *ret; + Eina_Strbuf *buf = eina_strbuf_new(); + + if (elm_widget_disabled_get(obj)) + eina_strbuf_append(buf, " state: disabled"); + + if (eina_strbuf_length_get(buf)) + { + ret = eina_strbuf_string_steal(buf); + eina_strbuf_free(buf); + return ret; + } + + eina_strbuf_free(buf); + return NULL; +} + EOLIAN static Eo * _elm_slider_efl_object_constructor(Eo *obj, Elm_Slider_Data *priv) { ELM_WIDGET_DATA_GET_OR_RETURN(obj, wd, NULL); - EFL_UI_SLIDER_DATA_GET_OR_RETURN(obj, sd, NULL) + char *group; if (!elm_widget_theme_klass_get(obj)) elm_widget_theme_klass_set(obj, "slider"); obj = efl_constructor(efl_super(obj, MY_CLASS)); + + efl_access_object_role_set(obj, EFL_ACCESS_ROLE_SLIDER); efl_canvas_object_type_set(obj, MY_CLASS_NAME_LEGACY); evas_object_smart_callbacks_descriptions_set(obj, _smart_callbacks); + group = _elm_slider_theme_group_get(obj, priv); + if (elm_widget_theme_object_set(obj, wd->resize_obj, + elm_widget_theme_klass_get(obj), + group, + elm_widget_theme_style_get(obj)) == EFL_UI_THEME_APPLY_ERROR_GENERIC) + CRI("Failed to set layout!"); + + free(group); + + priv->dir = EFL_UI_LAYOUT_ORIENTATION_HORIZONTAL; + priv->val_max = 1.0; + priv->step = SLIDER_STEP; priv->indicator_show = EINA_TRUE; priv->indicator_visible_mode = elm_config_slider_indicator_visible_mode_get(); //TODO: customize this time duration from api or theme data. priv->wheel_indicator_duration = 0.25; - elm_layout_signal_callback_add(obj, "popup,show", "elm", _popup_show, obj); // XXX: for compat - elm_layout_signal_callback_add(obj, "popup,hide", "elm", _popup_hide, obj); // XXX: for compat - elm_layout_signal_callback_add(obj, "elm,popup,show", "elm", _popup_show, obj); - elm_layout_signal_callback_add(obj, "elm,popup,hide", "elm", _popup_hide, obj); - elm_layout_signal_callback_add(obj, "*", "popup,emit", _popup_emit, obj); + priv->spacer = efl_add(EFL_CANVAS_RECTANGLE_CLASS, obj, + efl_gfx_color_set(efl_added, 0, 0, 0, 0)); + efl_content_set(efl_part(obj, "elm.swallow.bar"), priv->spacer); if (!priv->intvl_enable) _popup_add(priv, obj, &priv->popup, &priv->track, priv->intvl_enable); else _popup_add(priv, obj, &priv->popup2, &priv->track2, priv->intvl_enable); - evas_object_event_callback_add(obj, EVAS_CALLBACK_SHOW, _on_show, NULL); + efl_ui_format_string_set(efl_part(obj, "indicator"), "%0.2f", EFL_UI_FORMAT_STRING_TYPE_SIMPLE); elm_widget_can_focus_set(obj, EINA_TRUE); - efl_ui_format_string_set(efl_part(obj, "indicator"), "%0.2f", EFL_UI_FORMAT_STRING_TYPE_SIMPLE); + // accessiblity + _elm_access_object_register(obj, wd->resize_obj); + _elm_access_text_set + (_elm_access_info_get(obj), ELM_ACCESS_TYPE, E_("slider")); + _elm_access_callback_set + (_elm_access_info_get(obj), ELM_ACCESS_INFO, _access_info_cb, NULL); + _elm_access_callback_set + (_elm_access_info_get(obj), ELM_ACCESS_STATE, _access_state_cb, NULL); + + // add callbacks + evas_object_event_callback_add(obj, EVAS_CALLBACK_SHOW, _on_show, NULL); + + elm_layout_signal_callback_add(obj, "popup,show", "elm", _popup_show, obj); // XXX: for compat + elm_layout_signal_callback_add(obj, "popup,hide", "elm", _popup_hide, obj); // XXX: for compat + elm_layout_signal_callback_add(obj, "elm,popup,show", "elm", _popup_show, obj); + elm_layout_signal_callback_add(obj, "elm,popup,hide", "elm", _popup_hide, obj); + elm_layout_signal_callback_add(obj, "*", "popup,emit", _popup_emit, obj); + + efl_layout_signal_callback_add(obj, "drag", "*", obj, _drag, NULL); + efl_layout_signal_callback_add(obj, "drag,start", "*", obj, _drag_start, NULL); + efl_layout_signal_callback_add(obj, "drag,stop", "*", obj, _drag_stop, NULL); + efl_layout_signal_callback_add(obj, "drag,step", "*", obj, _drag_step, NULL); + efl_layout_signal_callback_add(obj, "drag,page", "*", obj, _drag_stop, NULL); evas_object_event_callback_add - (sd->spacer, EVAS_CALLBACK_MOUSE_DOWN, _spacer_down_cb, obj); + (priv->spacer, EVAS_CALLBACK_MOUSE_DOWN, _spacer_down_cb, obj); + evas_object_event_callback_add + (priv->spacer, EVAS_CALLBACK_MOUSE_MOVE, _spacer_move_cb, obj); + evas_object_event_callback_add + (priv->spacer, EVAS_CALLBACK_MOUSE_UP, _spacer_up_cb, obj); evas_object_event_callback_add - (sd->spacer, EVAS_CALLBACK_MOUSE_MOVE, _spacer_move_cb, obj); + (obj, EVAS_CALLBACK_MOUSE_IN, _mouse_in_cb, obj); evas_object_event_callback_add - (sd->spacer, EVAS_CALLBACK_MOUSE_UP, _spacer_up_cb, obj); + (obj, EVAS_CALLBACK_MOUSE_OUT, _mouse_out_cb, obj); + + evas_object_smart_changed(obj); return obj; } @@ -1220,68 +1416,88 @@ EAPI void elm_slider_horizontal_set(Evas_Object *obj, Eina_Bool horizontal) { Efl_Ui_Layout_Orientation dir; - EFL_UI_SLIDER_DATA_GET_OR_RETURN(obj, sd2); + ELM_SLIDER_DATA_GET_OR_RETURN(obj, sd); dir = horizontal ? EFL_UI_LAYOUT_ORIENTATION_HORIZONTAL : EFL_UI_LAYOUT_ORIENTATION_VERTICAL; - dir |= (sd2->dir & EFL_UI_LAYOUT_ORIENTATION_INVERTED); + dir |= (sd->dir & EFL_UI_LAYOUT_ORIENTATION_INVERTED); + + sd->dir = dir; - efl_ui_layout_orientation_set(obj, dir); + efl_ui_widget_theme_apply(obj); } EAPI Eina_Bool elm_slider_horizontal_get(const Evas_Object *obj) { EINA_SAFETY_ON_NULL_RETURN_VAL(obj, EINA_FALSE); + ELM_SLIDER_DATA_GET_OR_RETURN(obj, sd, EINA_FALSE); - Efl_Ui_Layout_Orientation dir; - dir = efl_ui_layout_orientation_get(obj); - - return _is_horizontal(dir); + return _is_horizontal(sd->dir); } EAPI void elm_slider_step_set(Evas_Object *obj, double step) { - efl_ui_range_step_set(obj, step); + ELM_SLIDER_DATA_GET_OR_RETURN(obj, sd); + + if (step <= 0) + { + ERR("Wrong param. The step(%lf) should be greater than 0.0", step); + return; + } + if (sd->step == step) return; + + sd->step = step; } EAPI double elm_slider_step_get(const Evas_Object *obj) { - return efl_ui_range_step_get(obj); + ELM_SLIDER_DATA_GET_OR_RETURN(obj, sd, 0.0); + return sd->step; } EAPI void elm_slider_value_set(Evas_Object *obj, double val) { - efl_ui_range_value_set(obj, val); + ELM_SLIDER_DATA_GET_OR_RETURN(obj, sd); + if (EINA_DBL_EQ(val, sd->val)) return; + + sd->val = val; + + if (sd->val < sd->val_min) sd->val = sd->val_min; + if (sd->val > sd->val_max) sd->val = sd->val_max; + + _val_set(obj); } EAPI double elm_slider_value_get(const Evas_Object *obj) { - return efl_ui_range_value_get(obj); + ELM_SLIDER_DATA_GET_OR_RETURN(obj, sd, 0.0); + return sd->val; } EAPI void elm_slider_inverted_set(Evas_Object *obj, Eina_Bool inverted) { Efl_Ui_Layout_Orientation dir; - EFL_UI_SLIDER_DATA_GET_OR_RETURN(obj, sd2); + ELM_SLIDER_DATA_GET_OR_RETURN(obj, sd); - dir = sd2->dir & EFL_UI_LAYOUT_ORIENTATION_AXIS_BITMASK; + dir = sd->dir & EFL_UI_LAYOUT_ORIENTATION_AXIS_BITMASK; if (inverted) dir |= EFL_UI_LAYOUT_ORIENTATION_INVERTED; - efl_ui_layout_orientation_set(obj, dir); + sd->dir = dir; + + efl_ui_widget_theme_apply(obj); } EAPI Eina_Bool elm_slider_inverted_get(const Evas_Object *obj) { - Efl_Ui_Layout_Orientation dir; - dir = efl_ui_layout_orientation_get(obj); + ELM_SLIDER_DATA_GET_OR_RETURN(obj, sd, EINA_FALSE); - return efl_ui_layout_orientation_is_inverted(dir); + return efl_ui_layout_orientation_is_inverted(sd->dir); } typedef struct @@ -1360,25 +1576,60 @@ elm_slider_range_enabled_get(const Evas_Object *obj) EAPI void elm_slider_range_set(Evas_Object *obj, double from, double to) { - efl_ui_slider_interval_value_set(obj, from, to); + ELM_SLIDER_DATA_GET_OR_RETURN(obj, sd); + sd->intvl_from = from; + sd->val = from; + sd->intvl_to = to; + + if (sd->intvl_from < sd->val_min) { + sd->intvl_from = sd->val_min; + sd->val = sd->val_min; + } + if (sd->intvl_to > sd->val_max) sd->intvl_to = sd->val_max; + + _val_set(obj); } EAPI void elm_slider_range_get(const Evas_Object *obj, double *from, double *to) { - efl_ui_slider_interval_value_get(obj, from, to); + ELM_SLIDER_DATA_GET_OR_RETURN(obj, sd); + + if (from) *from = fmin(sd->intvl_from, sd->intvl_to); + if (to) *to = fmax(sd->intvl_from, sd->intvl_to); } EAPI void elm_slider_min_max_set(Evas_Object *obj, double min, double max) { - efl_ui_range_limits_set(obj, min, max); + ELM_SLIDER_DATA_GET_OR_RETURN(obj, sd); + + if (max < min) + { + ERR("Wrong params. min(%lf) is greater than max(%lf).", min, max); + return; + } + if (EINA_DBL_EQ(max, min)) + { + ERR("min and max must have a different value"); + return; + } + if ((EINA_DBL_EQ(sd->val_min, min)) && (EINA_DBL_EQ(sd->val_max, max))) return; + sd->val_min = min; + sd->val_max = max; + if (sd->val < sd->val_min) sd->val = sd->val_min; + if (sd->val > sd->val_max) sd->val = sd->val_max; + + _val_set(obj); } EAPI void elm_slider_min_max_get(const Evas_Object *obj, double *min, double *max) { - efl_ui_range_limits_get(obj, min, max); + ELM_SLIDER_DATA_GET_OR_RETURN(obj, sd); + + if (min) *min = sd->val_min; + if (max) *max = sd->val_max; } EAPI void @@ -1478,10 +1729,6 @@ void _elm_slider_efl_ui_format_apply_formatted_value(Eo *obj EINA_UNUSED, Elm_Sl ELM_LAYOUT_CONTENT_ALIASES_IMPLEMENT(elm_slider) #define ELM_SLIDER_EXTRA_OPS \ - ELM_LAYOUT_CONTENT_ALIASES_OPS(elm_slider), \ - EFL_UI_SLIDER_VAL_FETCH_OPS(elm_slider), \ - EFL_UI_SLIDER_VAL_SET_OPS(elm_slider), \ - EFL_UI_SLIDER_DOWN_KNOB_OPS(elm_slider), \ - EFL_UI_SLIDER_MOVE_KNOB_OPS(elm_slider) + ELM_LAYOUT_CONTENT_ALIASES_OPS(elm_slider) #include "elm_slider_eo.c" diff --git a/src/lib/elementary/elm_slider_eo.c b/src/lib/elementary/elm_slider_eo.c index 524235b8a1..220f1ace74 100644 --- a/src/lib/elementary/elm_slider_eo.c +++ b/src/lib/elementary/elm_slider_eo.c @@ -86,4 +86,4 @@ static const Efl_Class_Description _elm_slider_class_desc = { NULL }; -EFL_DEFINE_CLASS(elm_slider_class_get, &_elm_slider_class_desc, EFL_UI_SLIDER_INTERVAL_CLASS, ELM_LAYOUT_MIXIN, EFL_UI_LEGACY_INTERFACE, EFL_TEXT_INTERFACE, EFL_TEXT_MARKUP_INTERFACE, EFL_UI_FORMAT_MIXIN, NULL); +EFL_DEFINE_CLASS(elm_slider_class_get, &_elm_slider_class_desc, EFL_UI_LAYOUT_BASE_CLASS, ELM_LAYOUT_MIXIN, EFL_UI_LEGACY_INTERFACE, EFL_TEXT_INTERFACE, EFL_TEXT_MARKUP_INTERFACE, EFL_UI_FORMAT_MIXIN, NULL); diff --git a/src/lib/elementary/elm_widget_slider.h b/src/lib/elementary/elm_widget_slider.h index c12ed7c011..8290045f8d 100644 --- a/src/lib/elementary/elm_widget_slider.h +++ b/src/lib/elementary/elm_widget_slider.h @@ -26,10 +26,18 @@ typedef struct _Elm_Slider_Data Elm_Slider_Data; struct _Elm_Slider_Data { - Evas_Object *popup, *popup2, *track, *track2; + Evas_Object *popup, *popup2, *track, *track2, *spacer; - Ecore_Timer *wheel_indicator_timer, *delay; + double val, val_min, val_max, step; + double intvl_from, intvl_to; double wheel_indicator_duration; + int intvl_flag; + + Evas_Coord downx, downy; + Efl_Ui_Layout_Orientation dir; + + Ecore_Timer *wheel_indicator_timer, *delay; + Elm_Slider_Indicator_Visible_Mode indicator_visible_mode; /**< indicator_visible_mode of the slider. This indicates when to show an indicator */ @@ -52,6 +60,7 @@ struct _Elm_Slider_Data Eina_Bool popup_visible : 1; Eina_Bool intvl_enable : 1; Eina_Bool spacer_down : 1; + Eina_Bool frozen : 1; }; /** diff --git a/src/tests/elementary/elm_test_slider.c b/src/tests/elementary/elm_test_slider.c index 76201fa305..337b75444c 100644 --- a/src/tests/elementary/elm_test_slider.c +++ b/src/tests/elementary/elm_test_slider.c @@ -98,6 +98,10 @@ slider_changed(void *data EINA_UNUSED, Evas_Object *obj, void *event_info EINA_U if (event_counter == 1) evas_object_smart_callback_del(obj, "changed", slider_changed); else if (event_counter == 2) + evas_object_smart_callback_del(obj, "slider,drag,start", slider_changed); + else if (event_counter == 3) + evas_object_smart_callback_del(obj, "slider,drag,stop", slider_changed); + else if (event_counter == 4) ecore_main_loop_quit(); } @@ -112,6 +116,8 @@ EFL_START_TEST(elm_slider_events) slider = elm_slider_add(win); evas_object_smart_callback_add(slider, "changed", slider_changed, NULL); evas_object_smart_callback_add(slider, "delay,changed", slider_changed, NULL); + evas_object_smart_callback_add(slider, "slider,drag,start", slider_changed, NULL); + evas_object_smart_callback_add(slider, "slider,drag,stop", slider_changed, NULL); evas_object_show(slider); evas_object_show(win); evas_object_resize(slider, 400, 100); @@ -131,7 +137,7 @@ EFL_START_TEST(elm_slider_events) evas_event_feed_mouse_move(e, sx + (sw / 2), sy + (sh / 2), 0, NULL); evas_event_feed_mouse_up(e, 1, 0, 0, NULL); ecore_main_loop_begin(); - ck_assert_int_eq(event_counter, 2); + ck_assert_int_eq(event_counter, 4); } EFL_END_TEST --