diff options
Diffstat (limited to 'src/lib/elementary/efl_ui_slider_interval.c')
-rw-r--r-- | src/lib/elementary/efl_ui_slider_interval.c | 292 |
1 files changed, 239 insertions, 53 deletions
diff --git a/src/lib/elementary/efl_ui_slider_interval.c b/src/lib/elementary/efl_ui_slider_interval.c index 17b86c2409..74131e5834 100644 --- a/src/lib/elementary/efl_ui_slider_interval.c +++ b/src/lib/elementary/efl_ui_slider_interval.c @@ -2,46 +2,113 @@ # include "elementary_config.h" #endif -#define EFL_ACCESS_PROTECTED +#define EFL_ACCESS_OBJECT_PROTECTED #define EFL_ACCESS_WIDGET_ACTION_PROTECTED -#define ELM_INTERFACE_ATSPI_VALUE_PROTECTED #include <Elementary.h> #include "elm_priv.h" #include "efl_ui_slider_private.h" +#include "efl_ui_slider_interval_private.h" #define MY_CLASS EFL_UI_SLIDER_INTERVAL_CLASS +#define MY_CLASS_PFX efl_ui_slider_interval #define MY_CLASS_NAME "Efl.Ui.Slider_Interval" -EOLIAN static void -_efl_ui_slider_interval_interval_value_get(Eo *obj, void *sd EINA_UNUSED, double *from, double *to) +#define SLIDER_DELAY_CHANGED_INTERVAL 1.2 + +static Eina_Bool +_delay_change(void *data) { - Efl_Ui_Slider_Data *pd = efl_data_scope_get(obj, EFL_UI_SLIDER_CLASS); - if (from) *from = fmin(pd->intvl_from, pd->intvl_to); - if (to) *to = fmax(pd->intvl_from, pd->intvl_to); + EFL_UI_SLIDER_INTERVAL_DATA_GET(data, pd); + + pd->delay = NULL; + efl_event_callback_call(data, EFL_UI_SLIDER_EVENT_DELAY_CHANGED, NULL); + + if (_elm_config->atspi_mode) + efl_access_value_changed_signal_emit(data); + + return ECORE_CALLBACK_CANCEL; } -static inline Eina_Bool -_is_inverted(Efl_Ui_Dir dir) +void +_efl_ui_slider_interval_val_fetch(Evas_Object *obj, Efl_Ui_Slider_Interval_Data *pd, Eina_Bool user_event) { - if ((dir == EFL_UI_DIR_LEFT) || (dir == EFL_UI_DIR_UP)) - return EINA_TRUE; + double posx = 0.0, posy = 0.0, pos = 0.0, val; + double posx2 = 0.0, posy2 = 0.0, pos2 = 0.0, val2; + + EFL_UI_SLIDER_DATA_GET(obj, sd); + ELM_WIDGET_DATA_GET_OR_RETURN(obj, wd); + + if (elm_widget_is_legacy(obj)) + efl_ui_drag_value_get(efl_part(wd->resize_obj, "elm.dragable.slider"), + &posx, &posy); + else + efl_ui_drag_value_get(efl_part(wd->resize_obj, "efl.dragable.slider"), + &posx, &posy); + if (efl_ui_dir_is_horizontal(sd->dir, EINA_TRUE)) pos = posx; + else pos = posy; + + if (elm_widget_is_legacy(obj)) + efl_ui_drag_value_get(efl_part(wd->resize_obj, "elm.dragable2.slider"), + &posx2, &posy2); + else + efl_ui_drag_value_get(efl_part(wd->resize_obj, "efl.dragable2.slider"), + &posx2, &posy2); + if (efl_ui_dir_is_horizontal(sd->dir, EINA_TRUE)) pos2 = posx2; + else pos2 = posy2; + + val = (pos * (sd->val_max - sd->val_min)) + sd->val_min; + val2 = (pos2 * (sd->val_max - sd->val_min)) + sd->val_min; + + if (val > pd->intvl_to) + { + val = pd->intvl_to; + efl_ui_slider_val_set(obj); + } + else if (val2 < pd->intvl_from) + { + val2 = pd->intvl_from; + efl_ui_slider_val_set(obj); + } - return EINA_FALSE; + if (fabs(val - pd->intvl_from) > DBL_EPSILON) + { + sd->val = val; + pd->intvl_from = val; + if (user_event) + { + efl_event_callback_call(obj, EFL_UI_SLIDER_EVENT_CHANGED, NULL); + efl_event_callback_legacy_call(obj, EFL_UI_SLIDER_EVENT_CHANGED, NULL); + ecore_timer_del(pd->delay); + pd->delay = ecore_timer_add(SLIDER_DELAY_CHANGED_INTERVAL, _delay_change, obj); + } + } + + if (fabs(val2 - pd->intvl_to) > DBL_EPSILON) + { + pd->intvl_to = val2; + if (user_event) + { + efl_event_callback_call(obj, EFL_UI_SLIDER_EVENT_CHANGED, NULL); + efl_event_callback_legacy_call(obj, EFL_UI_SLIDER_EVENT_CHANGED, NULL); + ecore_timer_del(pd->delay); + pd->delay = ecore_timer_add(SLIDER_DELAY_CHANGED_INTERVAL, _delay_change, obj); + } + } } -static void -_val_set(Evas_Object *obj) +void +_efl_ui_slider_interval_val_set(Evas_Object *obj, Efl_Ui_Slider_Interval_Data *pd) { - Eina_Bool rtl; double pos, pos2; EFL_UI_SLIDER_DATA_GET(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); + pos = (pd->intvl_from - sd->val_min) / (sd->val_max - sd->val_min); + pos2 = (pd->intvl_to - sd->val_min) / (sd->val_max - sd->val_min); } else { @@ -52,71 +119,190 @@ _val_set(Evas_Object *obj) 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; - rtl = efl_ui_mirrored_get(obj); - if ((!rtl && _is_inverted(sd->dir)) || - (rtl && ((sd->dir == EFL_UI_DIR_UP) || - (sd->dir == EFL_UI_DIR_RIGHT)))) + if (elm_widget_is_legacy(obj)) { - pos = 1.0 - pos; - pos2 = 1.0 - pos2; + efl_ui_drag_value_set(efl_part(wd->resize_obj, "elm.dragable.slider"), + pos, pos); + efl_ui_drag_value_set(efl_part(wd->resize_obj, "elm.dragable2.slider"), + pos2, pos2); + } + else + { + efl_ui_drag_value_set(efl_part(wd->resize_obj, "efl.dragable.slider"), + pos, pos); + efl_ui_drag_value_set(efl_part(wd->resize_obj, "efl.dragable2.slider"), + pos2, pos2); } - - ELM_WIDGET_DATA_GET_OR_RETURN(obj, wd); - edje_object_part_drag_value_set - (wd->resize_obj, "elm.dragable.slider", pos, pos); - - if (sd->intvl_enable) - edje_object_part_drag_value_set - (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 -_visuals_refresh(Eo *obj) +void +_efl_ui_slider_interval_down_knob(Evas_Object *obj, Efl_Ui_Slider_Interval_Data *pd, double button_x, double button_y) { - _val_set(obj); - evas_object_smart_changed(obj); + EFL_UI_SLIDER_DATA_GET(obj, sd); + ELM_WIDGET_DATA_GET_OR_RETURN(obj, wd); + + double posx = 0.0, posy = 0.0, posx2 = 0.0, posy2 = 0.0, diff1, diff2, diff3; + + pd->intvl_flag = 0; + + if (elm_widget_is_legacy(obj)) + { + 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); + } + else + { + efl_ui_drag_value_get(efl_part(wd->resize_obj, "efl.dragable.slider"), + &posx, &posy); + efl_ui_drag_value_get(efl_part(wd->resize_obj, "efl.dragable2.slider"), + &posx2, &posy2); + } + + if (efl_ui_dir_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) + { + if (elm_widget_is_legacy(obj)) + efl_ui_drag_value_set(efl_part(wd->resize_obj, "elm.dragable.slider"), + button_x, button_y); + else + efl_ui_drag_value_set(efl_part(wd->resize_obj, "efl.dragable.slider"), + button_x, button_y); + pd->intvl_flag = 1; + } + else if (diff1 > diff2) + { + if (elm_widget_is_legacy(obj)) + efl_ui_drag_value_set(efl_part(wd->resize_obj, "elm.dragable2.slider"), + button_x, button_y); + else + efl_ui_drag_value_set(efl_part(wd->resize_obj, "efl.dragable2.slider"), + button_x, button_y); + pd->intvl_flag = 2; + } + else + { + if (diff3 < 0) + { + if (elm_widget_is_legacy(obj)) + efl_ui_drag_value_set(efl_part(wd->resize_obj, "elm.dragable.slider"), + button_x, button_y); + else + efl_ui_drag_value_set(efl_part(wd->resize_obj, "efl.dragable.slider"), + button_x, button_y); + pd->intvl_flag = 1; + } + else + { + if (elm_widget_is_legacy(obj)) + efl_ui_drag_value_set(efl_part(wd->resize_obj, "elm.dragable2.slider"), + button_x, button_y); + else + efl_ui_drag_value_set(efl_part(wd->resize_obj, "efl.dragable2.slider"), + button_x, button_y); + pd->intvl_flag = 2; + } + } } -EOLIAN static void -_efl_ui_slider_interval_interval_value_set(Eo *obj, void *sd EINA_UNUSED, double from, double to) +void +_efl_ui_slider_interval_move_knob(Evas_Object *obj, Efl_Ui_Slider_Interval_Data *pd, double button_x, double button_y) { - Efl_Ui_Slider_Data *pd = efl_data_scope_get(obj, EFL_UI_SLIDER_CLASS); + ELM_WIDGET_DATA_GET_OR_RETURN(obj, wd); + if (pd->intvl_flag == 1) + { + if (elm_widget_is_legacy(obj)) + efl_ui_drag_value_set(efl_part(wd->resize_obj, "elm.dragable.slider"), + button_x, button_y); + else + efl_ui_drag_value_set(efl_part(wd->resize_obj, "efl.dragable.slider"), + button_x, button_y); + } + else if (pd->intvl_flag == 2) + { + if (elm_widget_is_legacy(obj)) + efl_ui_drag_value_set(efl_part(wd->resize_obj, "elm.dragable2.slider"), + button_x, button_y); + else + efl_ui_drag_value_set(efl_part(wd->resize_obj, "efl.dragable2.slider"), + button_x, button_y); + } +} + +EOLIAN static void +_efl_ui_slider_interval_interval_value_set(Eo *obj, Efl_Ui_Slider_Interval_Data *pd, double from, double to) +{ + EFL_UI_SLIDER_DATA_GET(obj, sd); pd->intvl_from = from; - pd->val = from; + sd->val = from; pd->intvl_to = to; - if (pd->intvl_from < pd->val_min) pd->intvl_from = pd->val_min; - if (pd->intvl_to > pd->val_max) pd->intvl_to = pd->val_max; + if (pd->intvl_from < sd->val_min) { + pd->intvl_from = sd->val_min; + sd->val = sd->val_min; + } + if (pd->intvl_to > sd->val_max) pd->intvl_to = sd->val_max; - _visuals_refresh(obj); + efl_ui_slider_val_set(obj); } -EOLIAN static Efl_Object * -_efl_ui_slider_interval_efl_object_finalize(Eo *obj, void *sd EINA_UNUSED) +EOLIAN static void +_efl_ui_slider_interval_interval_value_get(const Eo *obj EINA_UNUSED, Efl_Ui_Slider_Interval_Data *pd, double *from, double *to) { - Efl_Ui_Slider_Data *pd = efl_data_scope_get(obj, EFL_UI_SLIDER_CLASS); + if (from) *from = fmin(pd->intvl_from, pd->intvl_to); + if (to) *to = fmax(pd->intvl_from, pd->intvl_to); +} - pd->intvl_enable = EINA_TRUE; +EOLIAN static Efl_Object * +_efl_ui_slider_interval_efl_object_constructor(Eo *obj, Efl_Ui_Slider_Interval_Data *pd EINA_UNUSED) +{ + ELM_WIDGET_DATA_GET_OR_RETURN(obj, wd, NULL); - elm_widget_theme_klass_set(obj, "slider_interval"); - efl_ui_widget_theme_apply(obj); + if (!elm_widget_theme_klass_get(obj)) + elm_widget_theme_klass_set(obj, "slider_interval"); + obj = efl_constructor(efl_super(obj, MY_CLASS)); - elm_layout_signal_emit(obj, "elm,slider,range,enable", "elm"); - if (pd->indicator_show) - edje_object_signal_emit(pd->popup2, "elm,state,val,show", "elm"); + return obj; +} - obj = efl_finalize(efl_super(obj, MY_CLASS)); +EOLIAN static void +_efl_ui_slider_interval_efl_object_destructor(Eo *obj, + Efl_Ui_Slider_Interval_Data *pd) +{ + ecore_timer_del(pd->delay); - return obj; + efl_destructor(efl_super(obj, MY_CLASS)); } +#define EFL_UI_SLIDER_INTERVAL_EXTRA_OPS \ + EFL_UI_SLIDER_VAL_FETCH_OPS(efl_ui_slider_interval), \ + EFL_UI_SLIDER_VAL_SET_OPS(efl_ui_slider_interval), \ + EFL_UI_SLIDER_DOWN_KNOB_OPS(efl_ui_slider_interval), \ + EFL_UI_SLIDER_MOVE_KNOB_OPS(efl_ui_slider_interval), \ + #include "efl_ui_slider_interval.eo.c" |