From d64230de9fec17331b0765969d05778737916cb0 Mon Sep 17 00:00:00 2001 From: Anil Kumar Nahak Date: Mon, 2 Dec 2013 16:19:53 +0900 Subject: [PATCH] [slider] show/hide slider popup Summary: elementary_test->slider Reviewers: singh.amitesh, seoz, raster Differential Revision: https://phab.enlightenment.org/D347 --- legacy/elementary/src/bin/test_slider.c | 14 ++++ legacy/elementary/src/lib/elm_slider.c | 73 +++++++++++++++++-- legacy/elementary/src/lib/elm_slider_eo.h | 32 +++++++- legacy/elementary/src/lib/elm_slider_legacy.h | 21 ++++++ legacy/elementary/src/lib/elm_widget_slider.h | 3 + 5 files changed, 137 insertions(+), 6 deletions(-) diff --git a/legacy/elementary/src/bin/test_slider.c b/legacy/elementary/src/bin/test_slider.c index f641379a19..e5378254d7 100644 --- a/legacy/elementary/src/bin/test_slider.c +++ b/legacy/elementary/src/bin/test_slider.c @@ -113,6 +113,20 @@ 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, 100); + elm_object_text_set(sl, "Always show : "); + step = _step_size_calculate(0, 9); + elm_slider_step_set(sl, step); + elm_slider_indicator_show_on_focus_set(sl, EINA_TRUE); + 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/legacy/elementary/src/lib/elm_slider.c b/legacy/elementary/src/lib/elm_slider.c index 86617d7f99..19052f2ac0 100644 --- a/legacy/elementary/src/lib/elm_slider.c +++ b/legacy/elementary/src/lib/elm_slider.c @@ -317,9 +317,12 @@ _popup_hide(void *data, { if (!sd->popup_hiding) { - edje_object_signal_emit(sd->popup, "popup,hide", "elm"); // XXX: for compat - edje_object_signal_emit(sd->popup, "elm,popup,hide", "elm"); - sd->popup_hiding = EINA_TRUE; + if (!(elm_widget_focus_get(data) && sd->always_popup_show)) + { + edje_object_signal_emit(sd->popup, "popup,hide", "elm"); // XXX: for compat + edje_object_signal_emit(sd->popup, "elm,popup,hide", "elm"); + sd->popup_hiding = EINA_TRUE; + } } } } @@ -335,8 +338,11 @@ _popup_hide_done(void *data, { if (sd->popup_hiding) { - evas_object_hide(sd->popup); - sd->popup_hiding = EINA_FALSE; + if (!(elm_widget_focus_get(data) && sd->always_popup_show)) + { + evas_object_hide(sd->popup); + sd->popup_hiding = EINA_FALSE; + } } } } @@ -1383,6 +1389,44 @@ _elm_slider_step_get(Eo *obj EINA_UNUSED, void *_pd, va_list *list) *ret = sd->step; } +EAPI void +elm_slider_indicator_show_on_focus_set(Evas_Object *obj, Eina_Bool flag) +{ + ELM_SLIDER_CHECK(obj); + eo_do(obj, elm_obj_slider_indicator_show_on_focus_set(flag)); +} + +static void +_elm_slider_indicator_show_on_focus_set(Eo *obj, void *_pd, va_list *list) +{ + Eina_Bool flag = va_arg(*list, int); + Elm_Slider_Smart_Data *sd = _pd; + + if (flag) + sd->always_popup_show = EINA_TRUE; + else + sd->always_popup_show = EINA_FALSE; +} + +EAPI Eina_Bool +elm_slider_indicator_show_on_focus_get(const Evas_Object *obj) +{ + ELM_SLIDER_CHECK(obj) EINA_FALSE; + Eina_Bool ret; + + eo_do((Eo *) obj, elm_obj_slider_indicator_show_on_focus_get(&ret)); + return ret; +} + +static void +_elm_slider_indicator_show_on_focus_get(Eo *obj EINA_UNUSED, void *_pd, va_list *list) +{ + Eina_Bool *ret = va_arg(*list, Eina_Bool *); + Elm_Slider_Smart_Data *sd = _pd; + *ret = sd->always_popup_show; +} + + static void _elm_slider_smart_focus_next_manager_is(Eo *obj EINA_UNUSED, void *_pd EINA_UNUSED, va_list *list) { @@ -1397,6 +1441,20 @@ _elm_slider_smart_focus_direction_manager_is(Eo *obj EINA_UNUSED, void *_pd EINA *ret = EINA_FALSE; } +static void +_elm_slider_smart_on_focus(Eo *obj, void *_pd EINA_UNUSED, va_list *list) +{ + Eina_Bool int_ret; + Elm_Slider_Smart_Data *sd = _pd; + + eo_do_super(obj, MY_CLASS, elm_wdg_on_focus(&int_ret)); + + if (sd->always_popup_show && elm_widget_focus_get(obj)) + _popup_show(obj, NULL, NULL, NULL); + else + _popup_hide(obj, NULL, NULL, NULL); +} + static void _class_constructor(Eo_Class *klass) { @@ -1412,6 +1470,7 @@ _class_constructor(Eo_Class *klass) EO_OP_FUNC(ELM_WIDGET_ID(ELM_WIDGET_SUB_ID_ACTIVATE), _elm_slider_smart_activate), EO_OP_FUNC(ELM_WIDGET_ID(ELM_WIDGET_SUB_ID_FOCUS_NEXT_MANAGER_IS), _elm_slider_smart_focus_next_manager_is), EO_OP_FUNC(ELM_WIDGET_ID(ELM_WIDGET_SUB_ID_FOCUS_DIRECTION_MANAGER_IS), _elm_slider_smart_focus_direction_manager_is), + EO_OP_FUNC(ELM_WIDGET_ID(ELM_WIDGET_SUB_ID_ON_FOCUS), _elm_slider_smart_on_focus), EO_OP_FUNC(ELM_OBJ_LAYOUT_ID(ELM_OBJ_LAYOUT_SUB_ID_SIZING_EVAL), _elm_slider_smart_sizing_eval), EO_OP_FUNC(ELM_OBJ_LAYOUT_ID(ELM_OBJ_LAYOUT_SUB_ID_TEXT_ALIASES_GET), _elm_slider_smart_text_aliases_get), @@ -1437,6 +1496,8 @@ _class_constructor(Eo_Class *klass) 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(ELM_OBJ_SLIDER_ID(ELM_OBJ_SLIDER_SUB_ID_INDICATOR_SHOW_ON_FOCUS_SET), _elm_slider_indicator_show_on_focus_set), + EO_OP_FUNC(ELM_OBJ_SLIDER_ID(ELM_OBJ_SLIDER_SUB_ID_INDICATOR_SHOW_ON_FOCUS_GET), _elm_slider_indicator_show_on_focus_get), EO_OP_FUNC_SENTINEL }; eo_class_funcs_set(klass, func_desc); @@ -1465,6 +1526,8 @@ static const Eo_Op_Description op_desc[] = { 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(ELM_OBJ_SLIDER_SUB_ID_INDICATOR_SHOW_ON_FOCUS_SET, "Set the visiblity of slider indicator."), + EO_OP_DESCRIPTION(ELM_OBJ_SLIDER_SUB_ID_INDICATOR_SHOW_ON_FOCUS_GET, "Get the visiblity of slider indicator."), EO_OP_DESCRIPTION_SENTINEL }; static const Eo_Class_Description class_desc = { diff --git a/legacy/elementary/src/lib/elm_slider_eo.h b/legacy/elementary/src/lib/elm_slider_eo.h index f3373d7c54..34ecc981e4 100644 --- a/legacy/elementary/src/lib/elm_slider_eo.h +++ b/legacy/elementary/src/lib/elm_slider_eo.h @@ -29,6 +29,8 @@ enum 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_INDICATOR_SHOW_ON_FOCUS_SET, + ELM_OBJ_SLIDER_SUB_ID_INDICATOR_SHOW_ON_FOCUS_GET, ELM_OBJ_SLIDER_SUB_ID_LAST }; @@ -266,7 +268,7 @@ enum /** * @def elm_obj_slider_indicator_show_set - * @since 1.8 + * @since 1.9 * * Set whether to enlarge slider indicator (augmented knob) or not. * @@ -326,3 +328,31 @@ enum * @ingroup Slider */ #define elm_obj_slider_step_get(ret) ELM_OBJ_SLIDER_ID(ELM_OBJ_SLIDER_SUB_ID_STEP_GET), EO_TYPECHECK(double *, ret) + +/** + * @def elm_slider_indicator_show_on_focus_set + * @since 1.9 + * + * show indicator of slider on focus + * + * @param[in] flag + * + * @see elm_slider_indicator_show_on_focus_set + * + * @ingroup Slider + */ +#define elm_obj_slider_indicator_show_on_focus_set(flag) ELM_OBJ_SLIDER_ID(ELM_OBJ_SLIDER_SUB_ID_INDICATOR_SHOW_ON_FOCUS_SET), EO_TYPECHECK(Eina_Bool, flag) + +/** + * @def elm_slider_indicator_show_on_focus_get + * @since 1.9 + * + * Get whether the indicator of the slider is set or not + * + * @param[out] ret + * + * @see elm_slider_indicator_show_on_focus_get + * + * @ingroup Slider + */ +#define elm_obj_slider_indicator_show_on_focus_get(ret) ELM_OBJ_SLIDER_ID(ELM_OBJ_SLIDER_SUB_ID_INDICATOR_SHOW_ON_FOCUS_GET), EO_TYPECHECK(Eina_Bool*, ret) diff --git a/legacy/elementary/src/lib/elm_slider_legacy.h b/legacy/elementary/src/lib/elm_slider_legacy.h index 81e55a81fb..35dc17c6a7 100644 --- a/legacy/elementary/src/lib/elm_slider_legacy.h +++ b/legacy/elementary/src/lib/elm_slider_legacy.h @@ -357,3 +357,24 @@ EAPI void elm_slider_step_set(Evas_Object *obj, double s * @ingroup Slider */ EAPI double elm_slider_step_get(const Evas_Object *obj); + +/** + * Show the indicator of slider on focus + * + * @param obj The slider object. + * @param flag @ EINA_TRUE sets the indicator visible + * + * @ingroup Slider + */ +EAPI void elm_slider_indicator_show_on_focus_set(Evas_Object *obj, Eina_Bool flag); + +/** + * Get whether the indicator of the slider is set or not + * + * @param obj The slider object. + * @return @c EINA_TRUE, if indicator is set + * @c EINA_FALSE otherwise. + * + * @ingroup Slider + */ +EAPI Eina_Bool elm_slider_indicator_show_on_focus_get(const Evas_Object *obj); diff --git a/legacy/elementary/src/lib/elm_widget_slider.h b/legacy/elementary/src/lib/elm_widget_slider.h index 27c3bfc488..74e4b5fbd9 100644 --- a/legacy/elementary/src/lib/elm_widget_slider.h +++ b/legacy/elementary/src/lib/elm_widget_slider.h @@ -43,6 +43,9 @@ struct _Elm_Slider_Smart_Data Eina_Bool frozen : 1; Eina_Bool popup_hiding : 1; Eina_Bool units_show : 1; + Eina_Bool always_popup_show : 1; /*this flag is to set the visiblity of slider indicator + * if this flag is set then the indicator always show + */ }; /**