summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDaniel Juyung Seo <seojuyung2@gmail.com>2013-10-30 18:56:29 +0900
committerDaniel Juyung Seo <seojuyung2@gmail.com>2013-10-30 18:56:29 +0900
commitc7c245da67038ae70d66b8091346a0b8503659ce (patch)
treea2df4df2cc4ffa479cf4e10e6ce908fb2ef253c2
parentcbd7446f0bf413ad821ac40703d2a2ca728758ef (diff)
downloadelementary-c7c245da67038ae70d66b8091346a0b8503659ce.tar.gz
elm_slider: Step set/get API additions.
Issue: As step size was hard coded in the widget, when slider indicator is dragged using a key event or during accessibility the value was not exactly incremented/decremented instead same value was shown more than1 time/values were skipped. Solution: Two APIs added which will set/get step size. Reviewer: SeoZ Reviewer Comment: This is a manual merge of D293 due to arc issue on Shilpa. I modified some codes from her original code. She'll use arc next time. fixed documentation fixed typos. fixed indentation used macro added some guide codes. removed unnecessary empty line. updated NEWS and ChangeLog.
-rw-r--r--ChangeLog4
-rw-r--r--NEWS1
-rw-r--r--src/bin/test_slider.c25
-rwxr-xr-xsrc/lib/elm_slider.c47
-rw-r--r--src/lib/elm_slider_eo.h37
-rw-r--r--src/lib/elm_slider_legacy.h29
-rw-r--r--src/lib/elm_widget_slider.h2
7 files changed, 142 insertions, 3 deletions
diff --git a/ChangeLog b/ChangeLog
index e99d3fd09..0060f0ae2 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1731,3 +1731,7 @@
2013-10-30 Daniel Juyung Seo (SeoZ)
* conform: Added "virtualkeypad,size,changed" callback on virtualkeypad min size change.
+
+2013-10-30 Shilpa Onkar Singh
+
+ * slider: Added elm_slider_step_get(), elm_slider_step_set().
diff --git a/NEWS b/NEWS
index 6876073e5..3d59bc787 100644
--- a/NEWS
+++ b/NEWS
@@ -102,6 +102,7 @@ Additions:
* Add signals "spinner,drag,start" and "spinner,drag,stop" to the spinner widget.
* Add support for "clicked" callback on Return/space/KP_Enter key press for image.
* Add "virtualkeypad,size,changed" callback on virtualkeypad min size change for conformant.
+ * Add elm_slider_step_get(), elm_slider_step_set() for slider.
Improvements:
diff --git a/src/bin/test_slider.c b/src/bin/test_slider.c
index 8d85ce713..a4b13986d 100644
--- a/src/bin/test_slider.c
+++ b/src/bin/test_slider.c
@@ -48,10 +48,22 @@ _bt_m1(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
elm_slider_value_set(data, elm_slider_value_get(data) - 0.1);
}
+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;
+}
+
void
test_slider(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
{
Evas_Object *win, *fr, *bx, *sl, *ic, *sl1, *bx2, *bt;
+ double step;
char buf[PATH_MAX];
win = elm_win_util_standard_add("slider", "Slider");
@@ -88,6 +100,19 @@ test_slider(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_in
elm_box_pack_end(bx, sl);
evas_object_show(sl);
+ sl = elm_slider_add(bx);
+ elm_slider_unit_format_set(sl, "%1.0f units");
+ elm_slider_indicator_format_set(sl, "%1.0f");
+ elm_slider_span_size_set(sl, 120);
+ elm_slider_min_max_set(sl, 0, 9);
+ elm_object_text_set(sl, "Manual step");
+ step = _step_size_calculate(0, 9);
+ elm_slider_step_set(sl, step);
+ evas_object_size_hint_align_set(sl, EVAS_HINT_FILL, 0.5);
+ evas_object_size_hint_weight_set(sl, EVAS_HINT_EXPAND, 0.0);
+ elm_box_pack_end(bx, sl);
+ evas_object_show(sl);
+
// normal horizontal 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/elm_slider.c b/src/lib/elm_slider.c
index 22a81af0d..0e3fb531a 100755
--- a/src/lib/elm_slider.c
+++ b/src/lib/elm_slider.c
@@ -14,6 +14,7 @@ EAPI Eo_Op ELM_OBJ_SLIDER_BASE_ID = EO_NOOP;
#define MY_CLASS_NAME "elm_slider"
#define SLIDER_DELAY_CHANGED_INTERVAL 0.2
+#define SLIDER_STEP 0.05
static const Elm_Layout_Part_Alias_Description _content_aliases[] =
{
@@ -260,7 +261,7 @@ _drag_up(void *data,
double step;
ELM_SLIDER_DATA_GET(data, sd);
- step = 0.05;
+ step = sd->step;
if (sd->inverted) step *= -1.0;
@@ -278,7 +279,7 @@ _drag_down(void *data,
double step;
ELM_SLIDER_DATA_GET(data, sd);
- step = -0.05;
+ step = -sd->step;
if (sd->inverted) step *= -1.0;
@@ -821,6 +822,7 @@ _elm_slider_smart_add(Eo *obj, void *_pd, va_list *list EINA_UNUSED)
priv->horizontal = EINA_TRUE;
priv->indicator_show = EINA_TRUE;
priv->val_max = 1.0;
+ priv->step = SLIDER_STEP;
if (!elm_layout_theme_set
(obj, "slider", "horizontal", elm_widget_style_get(obj)))
@@ -1343,6 +1345,43 @@ _elm_slider_indicator_show_get(Eo *obj EINA_UNUSED, void *_pd, va_list *list)
*ret = sd->indicator_show;
}
+EAPI void
+elm_slider_step_set(Evas_Object *obj, double step)
+{
+ ELM_SLIDER_CHECK(obj);
+ eo_do(obj, elm_obj_slider_step_set(step));
+}
+
+static void
+_elm_slider_step_set(Eo *obj EINA_UNUSED, void *_pd, va_list *list)
+{
+ double step = va_arg(*list, double);
+ Elm_Slider_Smart_Data *sd = _pd;
+ if (sd->step == step) return;
+
+ if (step < 0.0) step = 0.0;
+ else if (step > 1.0) step = 1.0;
+
+ sd->step = step;
+}
+
+EAPI double
+elm_slider_step_get(const Evas_Object *obj)
+{
+ ELM_SLIDER_CHECK(obj) 0.0;
+ double ret;
+ eo_do((Eo *) obj, elm_obj_slider_step_get(&ret));
+ return ret;
+}
+
+static void
+_elm_slider_step_get(Eo *obj EINA_UNUSED, void *_pd, va_list *list)
+{
+ double *ret = va_arg(*list, double *);
+ Elm_Slider_Smart_Data *sd = _pd;
+ *ret = sd->step;
+}
+
static void
_elm_slider_smart_focus_next_manager_is(Eo *obj EINA_UNUSED, void *_pd EINA_UNUSED, va_list *list)
{
@@ -1395,6 +1434,8 @@ _class_constructor(Eo_Class *klass)
EO_OP_FUNC(ELM_OBJ_SLIDER_ID(ELM_OBJ_SLIDER_SUB_ID_UNITS_FORMAT_FUNCTION_SET), _elm_slider_units_format_function_set),
EO_OP_FUNC(ELM_OBJ_SLIDER_ID(ELM_OBJ_SLIDER_SUB_ID_INDICATOR_SHOW_SET), _elm_slider_indicator_show_set),
EO_OP_FUNC(ELM_OBJ_SLIDER_ID(ELM_OBJ_SLIDER_SUB_ID_INDICATOR_SHOW_GET), _elm_slider_indicator_show_get),
+ EO_OP_FUNC(ELM_OBJ_SLIDER_ID(ELM_OBJ_SLIDER_SUB_ID_STEP_SET), _elm_slider_step_set),
+ EO_OP_FUNC(ELM_OBJ_SLIDER_ID(ELM_OBJ_SLIDER_SUB_ID_STEP_GET), _elm_slider_step_get),
EO_OP_FUNC_SENTINEL
};
eo_class_funcs_set(klass, func_desc);
@@ -1421,6 +1462,8 @@ static const Eo_Op_Description op_desc[] = {
EO_OP_DESCRIPTION(ELM_OBJ_SLIDER_SUB_ID_UNITS_FORMAT_FUNCTION_SET, "Set the format function pointer for the units label."),
EO_OP_DESCRIPTION(ELM_OBJ_SLIDER_SUB_ID_INDICATOR_SHOW_SET, "Set whether to enlarge slider indicator (augmented knob) or not."),
EO_OP_DESCRIPTION(ELM_OBJ_SLIDER_SUB_ID_INDICATOR_SHOW_GET, "Get whether a given slider widget's enlarging indicator or not."),
+ EO_OP_DESCRIPTION(ELM_OBJ_SLIDER_SUB_ID_STEP_SET, "Set the draggable's step size."),
+ EO_OP_DESCRIPTION(ELM_OBJ_SLIDER_SUB_ID_STEP_GET, "Get the draggable's step size."),
EO_OP_DESCRIPTION_SENTINEL
};
static const Eo_Class_Description class_desc = {
diff --git a/src/lib/elm_slider_eo.h b/src/lib/elm_slider_eo.h
index 35872d65a..f3373d7c5 100644
--- a/src/lib/elm_slider_eo.h
+++ b/src/lib/elm_slider_eo.h
@@ -27,6 +27,8 @@ enum
ELM_OBJ_SLIDER_SUB_ID_UNITS_FORMAT_FUNCTION_SET,
ELM_OBJ_SLIDER_SUB_ID_INDICATOR_SHOW_SET,
ELM_OBJ_SLIDER_SUB_ID_INDICATOR_SHOW_GET,
+ ELM_OBJ_SLIDER_SUB_ID_STEP_SET,
+ ELM_OBJ_SLIDER_SUB_ID_STEP_GET,
ELM_OBJ_SLIDER_SUB_ID_LAST
};
@@ -289,3 +291,38 @@ enum
* @ingroup Slider
*/
#define elm_obj_slider_indicator_show_get(ret) ELM_OBJ_SLIDER_ID(ELM_OBJ_SLIDER_SUB_ID_INDICATOR_SHOW_GET), EO_TYPECHECK(Eina_Bool *, ret)
+
+/**
+ * @def elm_obj_slider_step_set
+ * @since 1.8
+ *
+ * Set the step by which slider indicator will move.
+ *
+ * This value is used when draggable object is moved automatically i.e., in case
+ * of key event when up/down/left/right key is pressed or in case when
+ * accessibility is set and flick event is used to inc/dec slider values.
+ * By default step value is equal to 0.05.
+ *
+ * @param[in] step
+ *
+ * @see elm_slider_step_set
+ *
+ * @ingroup Slider
+ */
+
+#define elm_obj_slider_step_set(step) ELM_OBJ_SLIDER_ID(ELM_OBJ_SLIDER_SUB_ID_STEP_SET), EO_TYPECHECK(double, step)
+
+
+/**
+ * @def elm_obj_slider_step_get
+ * @since 1.8
+ *
+ * Get the step by which slider indicator moves.
+ *
+ * @param[out] ret
+ *
+ * @see elm_slider_step_get
+ *
+ * @ingroup Slider
+ */
+#define elm_obj_slider_step_get(ret) ELM_OBJ_SLIDER_ID(ELM_OBJ_SLIDER_SUB_ID_STEP_GET), EO_TYPECHECK(double *, ret)
diff --git a/src/lib/elm_slider_legacy.h b/src/lib/elm_slider_legacy.h
index a547b5550..81e55a81f 100644
--- a/src/lib/elm_slider_legacy.h
+++ b/src/lib/elm_slider_legacy.h
@@ -328,3 +328,32 @@ EAPI void elm_slider_indicator_show_set(Evas_Object *obj
* @ingroup Slider
*/
EAPI Eina_Bool elm_slider_indicator_show_get(const Evas_Object *obj);
+
+/**
+ * Set the step by which slider indicator will move.
+ *
+ * @param obj The slider object.
+ * @param step The step value.
+ *
+ * This value is used when draggable object is moved automatically i.e., in case
+ * of key event when up/down/left/right key is pressed or in case when
+ * accessibility is set and flick event is used to inc/dec slider values.
+ * By default step value is equal to 0.05.
+ *
+ * @see elm_slider_step_get() for more details.
+ *
+ * @ingroup Slider
+ */
+EAPI void elm_slider_step_set(Evas_Object *obj, double step);
+
+/**
+ * Get the step by which slider indicator moves.
+ *
+ * @param obj The slider object.
+ * @return The step value.
+ *
+ * @see elm_slider_step_set() for more details.
+ *
+ * @ingroup Slider
+ */
+EAPI double elm_slider_step_get(const Evas_Object *obj);
diff --git a/src/lib/elm_widget_slider.h b/src/lib/elm_widget_slider.h
index c8ff66cad..27c3bfc48 100644
--- a/src/lib/elm_widget_slider.h
+++ b/src/lib/elm_widget_slider.h
@@ -32,7 +32,7 @@ struct _Elm_Slider_Smart_Data
char *(*units_format_func)(double val);
void (*units_format_free)(char *str);
- double val, val_min, val_max, val2;
+ double val, val_min, val_max, val2, step;
Evas_Coord size;
Evas_Coord downx, downy;