diff --git a/config/default/base.src.in b/config/default/base.src.in index fea935126e..510e5a0f13 100644 --- a/config/default/base.src.in +++ b/config/default/base.src.in @@ -2231,6 +2231,59 @@ group "Elm_Config" struct { value "params" string: "down"; } } + } + group "Elm_Config_Bindings_Widget" struct { + value "name" string: "Efl.Ui.Slider_Interval"; + group "key_bindings" list { + group "Elm_Config_Binding_Key" struct { + value "context" int: 0; + value "key" string: "Left"; + value "action" string: "drag"; + value "params" string: "left"; + } + group "Elm_Config_Binding_Key" struct { + value "context" int: 0; + value "key" string: "KP_Left"; + value "action" string: "drag"; + value "params" string: "left"; + } + group "Elm_Config_Binding_Key" struct { + value "context" int: 0; + value "key" string: "Right"; + value "action" string: "drag"; + value "params" string: "right"; + } + group "Elm_Config_Binding_Key" struct { + value "context" int: 0; + value "key" string: "KP_Right"; + value "action" string: "drag"; + value "params" string: "right"; + } + group "Elm_Config_Binding_Key" struct { + value "context" int: 0; + value "key" string: "Up"; + value "action" string: "drag"; + value "params" string: "up"; + } + group "Elm_Config_Binding_Key" struct { + value "context" int: 0; + value "key" string: "KP_Up"; + value "action" string: "drag"; + value "params" string: "up"; + } + group "Elm_Config_Binding_Key" struct { + value "context" int: 0; + value "key" string: "Down"; + value "action" string: "drag"; + value "params" string: "down"; + } + group "Elm_Config_Binding_Key" struct { + value "context" int: 0; + value "key" string: "KP_Down"; + value "action" string: "drag"; + value "params" string: "down"; + } + } } group "Elm_Config_Bindings_Widget" struct { value "name" string: "Elm_Slideshow"; diff --git a/config/mobile/base.src.in b/config/mobile/base.src.in index e8342d9ec1..abc3a3da0f 100644 --- a/config/mobile/base.src.in +++ b/config/mobile/base.src.in @@ -2236,6 +2236,59 @@ group "Elm_Config" struct { } } } + group "Elm_Config_Bindings_Widget" struct { + value "name" string: "Efl.Ui.Slider_Interval"; + group "key_bindings" list { + group "Elm_Config_Binding_Key" struct { + value "context" int: 0; + value "key" string: "Left"; + value "action" string: "drag"; + value "params" string: "left"; + } + group "Elm_Config_Binding_Key" struct { + value "context" int: 0; + value "key" string: "KP_Left"; + value "action" string: "drag"; + value "params" string: "left"; + } + group "Elm_Config_Binding_Key" struct { + value "context" int: 0; + value "key" string: "Right"; + value "action" string: "drag"; + value "params" string: "right"; + } + group "Elm_Config_Binding_Key" struct { + value "context" int: 0; + value "key" string: "KP_Right"; + value "action" string: "drag"; + value "params" string: "right"; + } + group "Elm_Config_Binding_Key" struct { + value "context" int: 0; + value "key" string: "Up"; + value "action" string: "drag"; + value "params" string: "up"; + } + group "Elm_Config_Binding_Key" struct { + value "context" int: 0; + value "key" string: "KP_Up"; + value "action" string: "drag"; + value "params" string: "up"; + } + group "Elm_Config_Binding_Key" struct { + value "context" int: 0; + value "key" string: "Down"; + value "action" string: "drag"; + value "params" string: "down"; + } + group "Elm_Config_Binding_Key" struct { + value "context" int: 0; + value "key" string: "KP_Down"; + value "action" string: "drag"; + value "params" string: "down"; + } + } + } group "Elm_Config_Bindings_Widget" struct { value "name" string: "Elm_Slideshow"; group "key_bindings" list { diff --git a/config/standard/base.src.in b/config/standard/base.src.in index a1dc0b920c..c3a3b223e4 100644 --- a/config/standard/base.src.in +++ b/config/standard/base.src.in @@ -2233,6 +2233,59 @@ group "Elm_Config" struct { } } } + group "Elm_Config_Bindings_Widget" struct { + value "name" string: "Efl.Ui.Slider_Interval"; + group "key_bindings" list { + group "Elm_Config_Binding_Key" struct { + value "context" int: 0; + value "key" string: "Left"; + value "action" string: "drag"; + value "params" string: "left"; + } + group "Elm_Config_Binding_Key" struct { + value "context" int: 0; + value "key" string: "KP_Left"; + value "action" string: "drag"; + value "params" string: "left"; + } + group "Elm_Config_Binding_Key" struct { + value "context" int: 0; + value "key" string: "Right"; + value "action" string: "drag"; + value "params" string: "right"; + } + group "Elm_Config_Binding_Key" struct { + value "context" int: 0; + value "key" string: "KP_Right"; + value "action" string: "drag"; + value "params" string: "right"; + } + group "Elm_Config_Binding_Key" struct { + value "context" int: 0; + value "key" string: "Up"; + value "action" string: "drag"; + value "params" string: "up"; + } + group "Elm_Config_Binding_Key" struct { + value "context" int: 0; + value "key" string: "KP_Up"; + value "action" string: "drag"; + value "params" string: "up"; + } + group "Elm_Config_Binding_Key" struct { + value "context" int: 0; + value "key" string: "Down"; + value "action" string: "drag"; + value "params" string: "down"; + } + group "Elm_Config_Binding_Key" struct { + value "context" int: 0; + value "key" string: "KP_Down"; + value "action" string: "drag"; + value "params" string: "down"; + } + } + } group "Elm_Config_Bindings_Widget" struct { value "name" string: "Elm_Slideshow"; group "key_bindings" list { diff --git a/po/POTFILES.in b/po/POTFILES.in index 3185320c0f..187aaa3d07 100644 --- a/po/POTFILES.in +++ b/po/POTFILES.in @@ -54,6 +54,7 @@ src/bin/elementary/test_scaling.c src/bin/elementary/test_scroller.c src/bin/elementary/test_separator.c src/bin/elementary/test_slider.c +src/bin/elementary/test_slider_interval.c src/bin/elementary/test_slideshow.c src/bin/elementary/test_spinner.c src/bin/elementary/test_store.c @@ -157,6 +158,7 @@ src/lib/elementary/elm_scroller.c src/lib/elementary/elm_segment_control.c src/lib/elementary/elm_separator.c src/lib/elementary/efl_ui_slider.c +src/lib/elementary/efl_ui_slider_interval.c src/lib/elementary/elm_slideshow.c src/lib/elementary/elm_spinner.c src/lib/elementary/elm_store.c diff --git a/src/Makefile_Elementary.am b/src/Makefile_Elementary.am index f1eb3fd8b7..08596b8ba3 100644 --- a/src/Makefile_Elementary.am +++ b/src/Makefile_Elementary.am @@ -62,6 +62,7 @@ elm_public_eolian_files = \ lib/elementary/elm_route.eo \ lib/elementary/elm_scroller.eo \ lib/elementary/efl_ui_slider.eo \ + lib/elementary/efl_ui_slider_interval.eo \ lib/elementary/elm_spinner.eo \ lib/elementary/elm_sys_notify_interface.eo \ lib/elementary/elm_sys_notify.eo \ @@ -500,6 +501,7 @@ includesub_HEADERS = \ lib/elementary/elm_slider.h \ lib/elementary/elm_slider_common.h \ lib/elementary/efl_ui_slider_eo.h \ + lib/elementary/efl_ui_slider_interval.eo.h \ lib/elementary/elm_slider_legacy.h \ lib/elementary/elm_slideshow.h \ lib/elementary/elm_slideshow_common.h \ @@ -648,6 +650,7 @@ lib_elementary_libelementary_la_SOURCES = \ lib/elementary/elm_segment_control.c \ lib/elementary/elm_separator.c \ lib/elementary/efl_ui_slider.c \ + lib/elementary/efl_ui_slider_interval.c \ lib/elementary/elm_slideshow.c \ lib/elementary/elm_spinner.c \ lib/elementary/elm_store.c \ @@ -849,6 +852,7 @@ bin/elementary/test_scroller.c \ bin/elementary/test_segment_control.c \ bin/elementary/test_separator.c \ bin/elementary/test_slider.c \ +bin/elementary/test_slider_interval.c \ bin/elementary/test_slideshow.c \ bin/elementary/test_spinner.c \ bin/elementary/test_store.c \ diff --git a/src/bin/elementary/Makefile.am b/src/bin/elementary/Makefile.am index 356c0b377a..88d73c8dc4 100644 --- a/src/bin/elementary/Makefile.am +++ b/src/bin/elementary/Makefile.am @@ -113,6 +113,7 @@ test_scroller.c \ test_segment_control.c \ test_separator.c \ test_slider.c \ +test_slider_interval.c \ test_slideshow.c \ test_spinner.c \ test_store.c \ diff --git a/src/bin/elementary/test.c b/src/bin/elementary/test.c index 4e8f76e539..93282b5b02 100644 --- a/src/bin/elementary/test.c +++ b/src/bin/elementary/test.c @@ -108,6 +108,7 @@ void test_inwin3(void *data, Evas_Object *obj, void *event_info); void test_scaling(void *data, Evas_Object *obj, void *event_info); void test_scaling2(void *data, Evas_Object *obj, void *event_info); void test_slider(void *data, Evas_Object *obj, void *event_info); +void test_slider_interval(void *data, Evas_Object *obj, void *event_info); void test_actionslider(void *data, Evas_Object *obj, void *event_info); void test_genlist(void *data, Evas_Object *obj, void *event_info); void test_genlist2(void *data, Evas_Object *obj, void *event_info); @@ -932,6 +933,7 @@ add_tests: //------------------------------// ADD_TEST(NULL, "Range Values", "Spinner", test_spinner); ADD_TEST(NULL, "Range Values", "Slider", test_slider); + ADD_TEST(NULL, "Range Values", "Interval Slider", test_slider_interval); ADD_TEST(NULL, "Range Values", "Progressbar", test_progressbar); ADD_TEST(NULL, "Range Values", "Progressbar 2", test_progressbar2); diff --git a/src/bin/elementary/test_slider_interval.c b/src/bin/elementary/test_slider_interval.c new file mode 100644 index 0000000000..8127c9df8b --- /dev/null +++ b/src/bin/elementary/test_slider_interval.c @@ -0,0 +1,112 @@ +#ifdef HAVE_CONFIG_H +# include "elementary_config.h" +#endif +#include + +static double +_step_size_calculate(double min, double max) +{ + double step = 0.0; + int steps = 0; + + steps = max - min; + if (steps) step = (1.0 / steps); + return step; +} + +static void +_intv_slider_changed_cb(void *data EINA_UNUSED, const Efl_Event *ev) +{ + double from, to; + + efl_ui_slider_interval_value_get(ev->object, &from, &to); + if (from < 100) + efl_ui_slider_interval_value_set(ev->object, 100, to); + if (to > 500) + efl_ui_slider_interval_value_set(ev->object, from, 500); +} + +void +test_slider_interval(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + Eo *win, *bx, *hbx, *sl; + double step; + + win = efl_add(EFL_UI_WIN_CLASS, NULL, + efl_ui_win_type_set(efl_added, EFL_UI_WIN_BASIC), + efl_text_set(efl_added, "Efl.Ui.Slider_Interval"), + efl_ui_win_autodel_set(efl_added, EINA_TRUE)); + + bx = efl_add(EFL_UI_BOX_CLASS, win, + efl_content_set(win, efl_added)); + + sl = efl_add(EFL_UI_SLIDER_INTERVAL_CLASS, bx, + efl_ui_slider_indicator_visible_mode_set(efl_added, EFL_UI_SLIDER_INDICATOR_VISIBLE_MODE_NONE), + efl_ui_range_span_size_set(efl_added, 160), + efl_ui_slider_indicator_format_set(efl_added, "%1.5f"), + efl_ui_slider_interval_value_set(efl_added, 0.4, 0.9), + efl_pack(bx, efl_added)); + elm_object_text_set(sl, "horizontal"); + + step = _step_size_calculate(0, 9); + sl = efl_add(EFL_UI_SLIDER_INTERVAL_CLASS, bx, + efl_ui_range_span_size_set(efl_added, 120), + efl_ui_range_unit_format_set(efl_added, "%1.1f units"), + efl_ui_slider_indicator_format_set(efl_added, "%1.1f"), + efl_ui_slider_interval_value_set(efl_added, 0.4, 0.9), + efl_ui_slider_step_set(efl_added, step), + efl_pack(bx, efl_added)); + elm_object_text_set(sl, "Manual step"); + + sl = efl_add(EFL_UI_SLIDER_INTERVAL_CLASS, bx, + efl_ui_range_span_size_set(efl_added, 120), + efl_ui_range_unit_format_set(efl_added, "%1.0f units"), + efl_ui_slider_indicator_format_set(efl_added, "%1.0f"), + efl_ui_range_min_max_set(efl_added, 10, 145), + efl_ui_slider_interval_value_set(efl_added, 50, 100), + efl_ui_slider_step_set(efl_added, step), + efl_pack(bx, efl_added)); + elm_object_disabled_set(sl, EINA_TRUE); + elm_object_text_set(sl, "Disabled"); + + hbx = efl_add(EFL_UI_BOX_CLASS, bx, + efl_ui_direction_set(efl_added, EFL_UI_DIR_HORIZONTAL), + efl_pack(bx, efl_added)); + + sl = efl_add(EFL_UI_SLIDER_INTERVAL_CLASS, hbx, + efl_ui_range_span_size_set(efl_added, 120), + efl_ui_range_unit_format_set(efl_added, "%1.0f units"), + efl_ui_slider_indicator_format_set(efl_added, "%1.0f"), + efl_ui_range_min_max_set(efl_added, 10, 145), + efl_ui_slider_interval_value_set(efl_added, 50, 100), + efl_ui_slider_step_set(efl_added, step), + efl_ui_direction_set(efl_added, EFL_UI_DIR_VERTICAL), + efl_pack(hbx, efl_added)); + elm_object_text_set(sl, "vertical"); + + sl = efl_add(EFL_UI_SLIDER_INTERVAL_CLASS, hbx, + efl_ui_range_span_size_set(efl_added, 120), + efl_ui_range_unit_format_set(efl_added, "%1.0f units"), + efl_ui_slider_indicator_format_set(efl_added, "%1.0f"), + efl_ui_range_min_max_set(efl_added, 10, 145), + efl_ui_slider_interval_value_set(efl_added, 50, 100), + efl_ui_slider_step_set(efl_added, step), + efl_ui_direction_set(efl_added, EFL_UI_DIR_VERTICAL), + efl_pack(hbx, efl_added)); + elm_object_text_set(sl, "vertical"); + elm_object_disabled_set(sl, EINA_TRUE); + + sl = efl_add(EFL_UI_SLIDER_INTERVAL_CLASS, bx, + efl_ui_slider_indicator_visible_mode_set(efl_added, EFL_UI_SLIDER_INDICATOR_VISIBLE_MODE_ON_FOCUS), + efl_ui_range_span_size_set(efl_added, 120), + efl_ui_range_unit_format_set(efl_added, "%1.0f units"), + efl_ui_slider_indicator_format_set(efl_added, "%1.0f"), + efl_ui_range_min_max_set(efl_added, 0, 600), + efl_ui_slider_interval_value_set(efl_added, 100, 500), + efl_ui_slider_step_set(efl_added, step), + efl_event_callback_add(efl_added, EFL_UI_SLIDER_EVENT_CHANGED, _intv_slider_changed_cb, NULL), + efl_pack(bx, efl_added)); + + elm_object_text_set(sl, "Limited(100-500)"); +} + diff --git a/src/lib/elementary/Elementary.h b/src/lib/elementary/Elementary.h index f73df08558..ed2fd39964 100644 --- a/src/lib/elementary/Elementary.h +++ b/src/lib/elementary/Elementary.h @@ -278,6 +278,7 @@ EAPI extern Elm_Version *elm_version; # include # include # include +#include #endif /* include deprecated calls last of all */ diff --git a/src/lib/elementary/efl_ui_slider_interval.c b/src/lib/elementary/efl_ui_slider_interval.c new file mode 100644 index 0000000000..815cff6956 --- /dev/null +++ b/src/lib/elementary/efl_ui_slider_interval.c @@ -0,0 +1,125 @@ +#ifdef HAVE_CONFIG_H +# include "elementary_config.h" +#endif + +#define ELM_INTERFACE_ATSPI_ACCESSIBLE_PROTECTED +#define ELM_INTERFACE_ATSPI_WIDGET_ACTION_PROTECTED +#define ELM_INTERFACE_ATSPI_VALUE_PROTECTED + +#include +#include "elm_priv.h" +#include "efl_ui_slider_private.h" + +#define MY_CLASS EFL_UI_SLIDER_INTERVAL_CLASS +#define MY_CLASS_NAME "Efl.Ui.Slider_Interval" + +typedef struct +{ +} Efl_Ui_Slider_Interval_Data; + +EOLIAN static void +_efl_ui_slider_interval_interval_value_get(Eo *obj, Efl_Ui_Slider_Interval_Data *sd EINA_UNUSED, double *from, double *to) +{ + Efl_Ui_Slider_Data *pd = efl_data_scope_safe_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); +} + +static inline Eina_Bool +_is_inverted(Efl_Ui_Dir dir) +{ + if ((dir == EFL_UI_DIR_LEFT) || (dir == EFL_UI_DIR_UP)) + return EINA_TRUE; + + return EINA_FALSE; +} + +static void +_val_set(Evas_Object *obj) +{ + Eina_Bool rtl; + double pos, pos2; + + EFL_UI_SLIDER_DATA_GET(obj, sd); + + 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; + + 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)))) + { + pos = 1.0 - pos; + pos2 = 1.0 - 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 accessiblity event also if value was chagend by API + if (_elm_config->atspi_mode) + elm_interface_atspi_accessible_value_changed_signal_emit(obj); +} + +static void +_visuals_refresh(Eo *obj) +{ + _val_set(obj); + evas_object_smart_changed(obj); +} + +EOLIAN static void +_efl_ui_slider_interval_interval_value_set(Eo *obj, Efl_Ui_Slider_Interval_Data *sd EINA_UNUSED, double from, double to) +{ + Efl_Ui_Slider_Data *pd = efl_data_scope_safe_get(obj, EFL_UI_SLIDER_CLASS); + + pd->intvl_from = from; + pd->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; + + _visuals_refresh(obj); +} + +EOLIAN static Efl_Object * +_efl_ui_slider_interval_efl_object_finalize(Eo *obj, Efl_Ui_Slider_Interval_Data *sd EINA_UNUSED) +{ + Efl_Ui_Slider_Data *pd = efl_data_scope_safe_get(obj, EFL_UI_SLIDER_CLASS); + + pd->intvl_enable = EINA_TRUE; + + elm_obj_widget_theme_apply(obj); + + 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"); + + obj = efl_finalize(efl_super(obj, MY_CLASS)); + + return obj; +} + +#include "efl_ui_slider_interval.eo.c" diff --git a/src/lib/elementary/efl_ui_slider_interval.eo b/src/lib/elementary/efl_ui_slider_interval.eo new file mode 100644 index 0000000000..0b2f95477a --- /dev/null +++ b/src/lib/elementary/efl_ui_slider_interval.eo @@ -0,0 +1,29 @@ +class Efl.Ui.Slider_Interval (Efl.Ui.Slider) +{ + [[An interval slider. + + This is a slider with two indicators. + ]] + legacy_prefix: null; + methods { + @property interval_value { + [[Sets up position of two indicators at start and end position. + + @since 1.20 + ]] + get { + legacy: null; + } + set { + legacy: null; + } + values { + from: double;[[interval minimum value]] + to: double; [[interval maximum value]] + } + } + } + implements { + Efl.Object.finalize; + } +}