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.
This commit is contained in:
Daniel Juyung Seo 2013-10-30 18:56:29 +09:00
parent 256a4c4524
commit 76f7c29631
7 changed files with 142 additions and 3 deletions

View File

@ -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().

View File

@ -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:

View File

@ -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());

View File

@ -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 = {

View File

@ -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)

View File

@ -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);

View File

@ -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;