From 0eabd0473e91976665a56b724c66d9931f022055 Mon Sep 17 00:00:00 2001 From: raster Date: Wed, 15 Feb 2012 12:32:02 +0000 Subject: [PATCH] add rouding+base to spinner - otherwise u can never slow it down and u cant round to specific values. fixed month test to do this too. git-svn-id: svn+ssh://svn.enlightenment.org/var/svn/e/trunk/elementary@67982 7cbeb6ba-43b4-40fd-8cce-4c39aea84d33 --- src/bin/test_spinner.c | 6 ++++- src/lib/elm_spinner.c | 61 ++++++++++++++++++++++++++++++++++------- src/lib/elm_spinner.h | 73 ++++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 129 insertions(+), 11 deletions(-) diff --git a/src/bin/test_spinner.c b/src/bin/test_spinner.c index 093c01f..5d53e99 100644 --- a/src/bin/test_spinner.c +++ b/src/bin/test_spinner.c @@ -63,9 +63,13 @@ test_spinner(void *data __UNUSED__, Evas_Object *obj __UNUSED__, void *event_inf evas_object_show(sp); sp = elm_spinner_add(win); + elm_spinner_wrap_set(sp, EINA_TRUE); elm_spinner_min_max_set(sp, 1, 12); + elm_spinner_value_set(sp, 1); + elm_spinner_step_set(sp, 0.05); + elm_spinner_base_set(sp, 1); + elm_spinner_round_set(sp, 1); elm_spinner_label_format_set(sp, "%.0f"); - elm_spinner_step_set(sp, 1.0); elm_spinner_editable_set(sp, EINA_FALSE); elm_spinner_special_value_add(sp, 1, "January"); elm_spinner_special_value_add(sp, 2, "February"); diff --git a/src/lib/elm_spinner.c b/src/lib/elm_spinner.c index fb6a310..6ea83f6 100644 --- a/src/lib/elm_spinner.c +++ b/src/lib/elm_spinner.c @@ -9,8 +9,9 @@ struct _Widget_Data { Evas_Object *spinner, *ent; const char *label; - double val, val_min, val_max, orig_val, step; + double val, val_min, val_max, orig_val, step, base; double drag_start_pos, spin_speed, interval, first_interval; + int round; Ecore_Timer *delay, *spin; Eina_List *special_values; Eina_Bool wrap : 1; @@ -210,6 +211,7 @@ _write_label(Evas_Object *obj) Elm_Spinner_Special_Value *sv; Widget_Data *wd = elm_widget_data_get(obj); char buf[1024]; + if (!wd) return; EINA_LIST_FOREACH(wd->special_values, l, sv) { @@ -230,12 +232,16 @@ apply: } static Eina_Bool -_value_set(Evas_Object *obj, double delta) +_value_set(Evas_Object *obj, double new_val) { Widget_Data *wd = elm_widget_data_get(obj); - double new_val; + if (!wd) return EINA_FALSE; - new_val = wd->val + delta; + + if (wd->round > 0) + new_val = wd->base + + (double)((((int)(new_val - wd->base)) / wd->round) * wd->round); + if (wd->wrap) { while (new_val < wd->val_min) @@ -306,13 +312,12 @@ _drag(void *data, Evas_Object *_obj __UNUSED__, const char *emission __UNUSED__, if (wd->entry_visible) return; edje_object_part_drag_value_get(wd->spinner, "elm.dragable.slider", &pos, NULL); - offset = wd->step; + + offset = wd->step * _elm_config->scale; delta = (pos - wd->drag_start_pos) * offset; /* If we are on rtl mode, change the delta to be negative on such changes */ - if (elm_widget_mirrored_get(obj)) - delta *= -1; - if (_value_set(data, delta)) _write_label(data); - wd->drag_start_pos = pos; + if (elm_widget_mirrored_get(obj)) delta *= -1; + if (_value_set(data, wd->drag_start_pos + delta)) _write_label(data); wd->dragging = 1; } @@ -400,7 +405,7 @@ _spin_value(void *data) { Widget_Data *wd = elm_widget_data_get(data); if (!wd) return ECORE_CALLBACK_CANCEL; - if (_value_set(data, wd->spin_speed)) _write_label(data); + if (_value_set(data, wd->val + wd->spin_speed)) _write_label(data); wd->interval = wd->interval / 1.05; ecore_timer_interval_set(wd->spin, wd->interval); return ECORE_CALLBACK_RENEW; @@ -779,3 +784,39 @@ elm_spinner_interval_get(const Evas_Object *obj) if (!wd) return 0.0; return wd->first_interval; } + +EAPI void +elm_spinner_base_set(Evas_Object *obj, double base) +{ + ELM_CHECK_WIDTYPE(obj, widtype); + Widget_Data *wd = elm_widget_data_get(obj); + if (!wd) return; + wd->base = base; +} + +EAPI double +elm_spinner_base_get(const Evas_Object *obj) +{ + ELM_CHECK_WIDTYPE(obj, widtype) 0.0; + Widget_Data *wd = elm_widget_data_get(obj); + if (!wd) return 0.0; + return wd->base; +} + +EAPI void +elm_spinner_round_set(Evas_Object *obj, int round) +{ + ELM_CHECK_WIDTYPE(obj, widtype); + Widget_Data *wd = elm_widget_data_get(obj); + if (!wd) return; + wd->round = round; +} + +EAPI int +elm_spinner_round_get(const Evas_Object *obj) +{ + ELM_CHECK_WIDTYPE(obj, widtype) 0; + Widget_Data *wd = elm_widget_data_get(obj); + if (!wd) return 0; + return wd->round; +} diff --git a/src/lib/elm_spinner.h b/src/lib/elm_spinner.h index 9e10966..d7281ff 100644 --- a/src/lib/elm_spinner.h +++ b/src/lib/elm_spinner.h @@ -349,5 +349,78 @@ EAPI void elm_spinner_interval_set(Evas_Object *obj, double interval); EAPI double elm_spinner_interval_get(const Evas_Object *obj); /** + * Set the base for rounding + * + * @param obj The spinner object + * @param base The base value + * + * Rounding works as follows: + * + * rounded_val = base + (double)(((value - base) / round) * round) + * + * Where rounded_val, value and base are doubles, and round is an integer. + * + * This means that things will be rounded to increments (or decrements) of + * "round" starting from value @p base. The default base for rounding is 0. + * + * Example: round = 3, base = 2 + * Values: 3, 6, 9, 12, 15, ... + * + * Example: round = 2, base = 5.5 + * Values: 5.5, 7.5, 9.5, 11.5, ... + * + * @see elm_spinner_round_get() + * @see elm_spinner_base_get() too. + * + * @ingroup Spinner + */ +EAPI void elm_spinner_base_set(Evas_Object *obj, double base); + +/** + * Get the base for rounding + * + * @param obj The spinner object + * @return The base rounding value + * + * This returns the base for rounding. + * + * @see elm_spinner_round_set() too. + * @see elm_spinner_base_set() too. + * + * @ingroup Spinner + */ +EAPI double elm_spinner_base_get(const Evas_Object *obj); + +/** + * Set the round value for rounding + * + * @param obj The spinner object + * @param round The rounding value + * + * Sets the rounding value used for value rounding in the spinner. + * + * @see elm_spinner_round_get() + * @see elm_spinner_base_set() + * + * @ingroup Spinner + */ +EAPI void elm_spinner_round_set(Evas_Object *obj, int round); + +/** + * Get the round value for rounding + * + * @param obj The spinner object + * @return The rounding value + * + * This returns the round value for rounding. + * + * @see elm_spinner_round_set() too. + * @see elm_spinner_base_set() too. + * + * @ingroup Spinner + */ +EAPI int elm_spinner_round_get(const Evas_Object *obj); + +/** * @} */ -- 2.7.4