davemds pushed a commit to branch master. http://git.enlightenment.org/core/elementary.git/commit/?id=cc07e231e9c2b2c59e36f4c0d13f36d4e59bd5f3
commit cc07e231e9c2b2c59e36f4c0d13f36d4e59bd5f3 Author: davemds <d...@gurumeditation.it> Date: Mon Feb 10 00:13:03 2014 +0100 Label: add 2 new api for setting the slide animation speed. Added API: void elm_label_slide_speed_set(Evas_Object *obj, double speed); double elm_label_slide_speed_get(const Evas_Object *obj); This work is based on the previous reverted commit by nirajkr, thanks! I hope this will fullfill his requirement, please let me know of any problems. --- src/bin/test_label.c | 100 +++++++++++++++++++++++++++++++++++---------- src/lib/elm_label.c | 92 +++++++++++++++++++++++++++++++---------- src/lib/elm_label_eo.h | 34 ++++++++++++++- src/lib/elm_label_legacy.h | 27 +++++++++++- src/lib/elm_widget_label.h | 2 + 5 files changed, 208 insertions(+), 47 deletions(-) diff --git a/src/bin/test_label.c b/src/bin/test_label.c index 7e6a73d..abaf837 100644 --- a/src/bin/test_label.c +++ b/src/bin/test_label.c @@ -100,19 +100,35 @@ _cb_size_radio_changed(void *data, Evas_Object *obj, void *event EINA_UNUSED) } static void -_change_cb(void *data, Evas_Object *obj, void *event_info EINA_UNUSED) +_duration_change_cb(void *data, Evas_Object *obj, void *event_info EINA_UNUSED) { Evas_Object *lb = (Evas_Object *)data; double val = elm_slider_value_get(obj); + elm_label_slide_duration_set(lb, val); - elm_label_slide_mode_set(lb, ELM_LABEL_SLIDE_MODE_ALWAYS); elm_label_slide_go(lb); + + Evas_Object *sl = evas_object_data_get(lb, "speed_slider"); + elm_slider_value_set(sl, elm_label_slide_speed_get(lb)); +} + +static void +_speed_change_cb(void *data, Evas_Object *obj, void *event_info EINA_UNUSED) +{ + Evas_Object *lb = (Evas_Object *)data; + double val = elm_slider_value_get(obj); + + elm_label_slide_speed_set(lb, val); + elm_label_slide_go(lb); + + Evas_Object *sl = evas_object_data_get(lb, "duration_slider"); + elm_slider_value_set(sl, elm_label_slide_duration_get(lb)); } void test_label2(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) { - Evas_Object *win, *gd, *rect, *lb, *rd, *rdg, *sl; + Evas_Object *win, *gd, *rect, *lb, *lb1, *lb2, *rd, *rdg, *sl; win = elm_win_util_standard_add("label2", "Label 2"); elm_win_autodel_set(win, EINA_TRUE); @@ -126,13 +142,11 @@ test_label2(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_in /* Test Label Ellipsis */ lb = elm_label_add(win); elm_object_text_set(lb, "Test Label Ellipsis:"); - elm_label_slide_mode_set(lb, ELM_LABEL_SLIDE_MODE_ALWAYS); - elm_label_slide_go(lb); - elm_grid_pack(gd, lb, 5, 5, 90, 10); + elm_grid_pack(gd, lb, 5, 0, 90, 10); evas_object_show(lb); rect = evas_object_rectangle_add(evas_object_evas_get(win)); - elm_grid_pack(gd, rect, 5, 15, 90, 10); + elm_grid_pack(gd, rect, 5, 10, 90, 10); evas_object_color_set(rect, 255, 125, 125, 255); evas_object_show(rect); @@ -144,19 +158,17 @@ test_label2(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_in "at the end of the widget." ); elm_label_ellipsis_set(lb, EINA_TRUE); - elm_grid_pack(gd, lb, 5, 15, 90, 10); + elm_grid_pack(gd, lb, 5, 10, 90, 10); evas_object_show(lb); /* Test Label Slide */ lb = elm_label_add(win); elm_object_text_set(lb, "Test Label Slide:"); - elm_label_slide_mode_set(lb, ELM_LABEL_SLIDE_MODE_ALWAYS); - elm_label_slide_go(lb); - elm_grid_pack(gd, lb, 5, 30, 90, 10); + elm_grid_pack(gd, lb, 5, 20, 90, 10); evas_object_show(lb); rect = evas_object_rectangle_add(evas_object_evas_get(win)); - elm_grid_pack(gd, rect, 5, 40, 90, 10); + elm_grid_pack(gd, rect, 5, 30, 90, 10); evas_object_color_set(rect, 255, 125, 125, 255); evas_object_show(rect); @@ -169,9 +181,10 @@ test_label2(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_in "This only works with the themes \"slide_short\", " "\"slide_long\" and \"slide_bounce\"." ); - elm_label_slide_mode_set(lb, ELM_LABEL_SLIDE_MODE_ALWAYS); + elm_label_slide_mode_set(lb, ELM_LABEL_SLIDE_MODE_AUTO); + elm_label_slide_speed_set(lb, 40.0); elm_label_slide_go(lb); - elm_grid_pack(gd, lb, 5, 40, 90, 10); + elm_grid_pack(gd, lb, 5, 30, 90, 10); evas_object_show(lb); rd = elm_radio_add(win); @@ -179,7 +192,7 @@ test_label2(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_in elm_object_text_set(rd, "slide_short"); evas_object_size_hint_weight_set(rd, EVAS_HINT_EXPAND, EVAS_HINT_FILL); evas_object_smart_callback_add(rd, "changed", _cb_size_radio_changed, lb); - elm_grid_pack(gd, rd, 5, 50, 30, 10); + elm_grid_pack(gd, rd, 5, 40, 30, 10); evas_object_show(rd); rdg = rd; @@ -189,7 +202,7 @@ test_label2(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_in elm_object_text_set(rd, "slide_long"); evas_object_size_hint_weight_set(rd, EVAS_HINT_EXPAND, EVAS_HINT_FILL); evas_object_smart_callback_add(rd, "changed", _cb_size_radio_changed, lb); - elm_grid_pack(gd, rd, 35, 50, 30, 10); + elm_grid_pack(gd, rd, 35, 40, 30, 10); evas_object_show(rd); rd = elm_radio_add(win); @@ -198,20 +211,65 @@ test_label2(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_in elm_object_text_set(rd, "slide_bounce"); evas_object_size_hint_weight_set(rd, EVAS_HINT_EXPAND, EVAS_HINT_FILL); evas_object_smart_callback_add(rd, "changed", _cb_size_radio_changed, lb); - elm_grid_pack(gd, rd, 65, 50, 30, 10); + elm_grid_pack(gd, rd, 65, 40, 30, 10); evas_object_show(rd); sl = elm_slider_add(win); elm_object_text_set(sl, "Slide Duration"); - elm_slider_unit_format_set(sl, "%1.1f units"); - elm_slider_min_max_set(sl, 1, 20); - elm_slider_value_set(sl, 10); + elm_slider_unit_format_set(sl, "%1.1f sec"); + elm_slider_min_max_set(sl, 3, 30); + elm_slider_value_set(sl, elm_label_slide_duration_get(lb)); evas_object_size_hint_align_set(sl, EVAS_HINT_FILL, 0.5); evas_object_size_hint_weight_set(sl, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); - evas_object_smart_callback_add(sl, "changed", _change_cb, lb); + evas_object_smart_callback_add(sl, "changed", _duration_change_cb, lb); + evas_object_data_set(lb, "duration_slider", sl); + elm_grid_pack(gd, sl, 5, 50, 90, 10); + evas_object_show(sl); + + sl = elm_slider_add(win); + elm_object_text_set(sl, "Slide Speed"); + elm_slider_unit_format_set(sl, "%1.1f px/sec"); + elm_slider_min_max_set(sl, 40, 300); + elm_slider_value_set(sl, elm_label_slide_speed_get(lb)); + evas_object_size_hint_align_set(sl, EVAS_HINT_FILL, 0.5); + evas_object_size_hint_weight_set(sl, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_smart_callback_add(sl, "changed", _speed_change_cb, lb); + evas_object_data_set(lb, "speed_slider", sl); elm_grid_pack(gd, sl, 5, 60, 90, 10); evas_object_show(sl); + /* Test 2 label at the same speed */ + lb = elm_label_add(win); + elm_object_text_set(lb, "Test 2 label with the same speed:"); + elm_grid_pack(gd, lb, 5, 70, 90, 10); + evas_object_show(lb); + + rect = evas_object_rectangle_add(evas_object_evas_get(win)); + elm_grid_pack(gd, rect, 5, 80, 90, 20); + evas_object_color_set(rect, 255, 125, 125, 255); + evas_object_show(rect); + + lb1 = elm_label_add(win); + elm_object_style_set(lb1, "slide_long"); + elm_object_text_set(lb1, "This is a label set to slide with a fixed speed," + " should match the speed with the below label." + " This label has few extra char for testing."); + elm_label_slide_mode_set(lb1, ELM_LABEL_SLIDE_MODE_ALWAYS); + elm_label_slide_speed_set(lb1, 40.0); + elm_label_slide_go(lb1); + elm_grid_pack(gd, lb1, 5, 80, 90, 10); + evas_object_show(lb1); + + lb2 = elm_label_add(win); + elm_object_style_set(lb2, "slide_long"); + elm_object_text_set(lb2, "This is a label set to slide and will" + " match the speed of the upper label."); + elm_label_slide_mode_set(lb2, ELM_LABEL_SLIDE_MODE_ALWAYS); + elm_label_slide_speed_set(lb2, 40.0); + elm_label_slide_go(lb2); + elm_grid_pack(gd, lb2, 5, 90, 90, 10); + evas_object_show(lb2); + evas_object_resize(win, 320, 320); evas_object_show(win); } diff --git a/src/lib/elm_label.c b/src/lib/elm_label.c index 976b186..10d4c6a 100644 --- a/src/lib/elm_label.c +++ b/src/lib/elm_label.c @@ -77,7 +77,7 @@ _label_format_set(Evas_Object *obj, static void _label_slide_change(Evas_Object *obj) { - Evas_Object *tb; + const Evas_Object *tb; char *plaintxt; int plainlen = 0; @@ -106,6 +106,12 @@ _label_slide_change(Evas_Object *obj) //has slide effect. if (sd->slide_mode != ELM_LABEL_SLIDE_MODE_NONE) { + Evas_Coord w, tb_w; + + tb = edje_object_part_object_get(wd->resize_obj, "elm.text"); + evas_object_textblock_size_native_get(tb, &tb_w, NULL); + evas_object_geometry_get(wd->resize_obj, NULL, NULL, &w, NULL); + if (sd->ellipsis) { sd->slide_ellipsis = EINA_TRUE; @@ -115,26 +121,29 @@ _label_slide_change(Evas_Object *obj) //slide only if the slide area is smaller than text width size. if (sd->slide_mode == ELM_LABEL_SLIDE_MODE_AUTO) { - tb = (Evas_Object *) edje_object_part_object_get(wd->resize_obj, - "elm.text"); - if (tb) - { - Evas_Coord w, tb_w; - - evas_object_textblock_size_formatted_get(tb, &tb_w, NULL); - evas_object_geometry_get(wd->resize_obj, - NULL, NULL, &w, NULL); - if ((tb_w > 0) && (tb_w < w)) - { - if (sd->slide_ellipsis) - { - sd->slide_ellipsis = EINA_FALSE; - elm_label_ellipsis_set(obj, EINA_TRUE); - } - return; - } - } + if ((tb_w > 0) && (tb_w < w)) + { + if (sd->slide_ellipsis) + { + sd->slide_ellipsis = EINA_FALSE; + elm_label_ellipsis_set(obj, EINA_TRUE); + } + return; + } + } + + // calculate speed or duration + if (sd->use_slide_speed) + { + if (sd->slide_speed <= 0) sd->slide_speed = 1; + sd->slide_duration = (tb_w + w) / sd->slide_speed; + } + else + { + if (sd->slide_duration <= 0) sd->slide_duration = 1; + sd->slide_speed = (tb_w + w) / sd->slide_duration; } + Edje_Message_Float_Set *msg = alloca(sizeof(Edje_Message_Float_Set) + (sizeof(double))); @@ -216,6 +225,7 @@ _on_label_resize(void *data, { ELM_LABEL_DATA_GET(data, sd); + if (sd->slide_mode != ELM_LABEL_SLIDE_MODE_NONE) _label_slide_change(data); if (sd->linewrap) elm_layout_sizing_eval(data); } @@ -662,6 +672,7 @@ _slide_duration_set(Eo *obj EINA_UNUSED, void *_pd, va_list *list) double duration = va_arg(*list, double); Elm_Label_Smart_Data *sd = _pd; sd->slide_duration = duration; + sd->use_slide_speed = EINA_FALSE; } EAPI double @@ -674,6 +685,39 @@ elm_label_slide_duration_get(const Evas_Object *obj) } EAPI void +elm_label_slide_speed_set(Evas_Object *obj, double speed) +{ + ELM_LABEL_CHECK(obj); + eo_do(obj, elm_obj_label_slide_speed_set(speed)); +} + +static void +_slide_speed_set(Eo *obj EINA_UNUSED, void *_pd, va_list *list) +{ + double speed = va_arg(*list, double); + Elm_Label_Smart_Data *sd = _pd; + sd->slide_speed = speed; + sd->use_slide_speed = EINA_TRUE; +} + +EAPI double +elm_label_slide_speed_get(const Evas_Object *obj) +{ + ELM_LABEL_CHECK(obj) 0.0; + double ret = 0.0; + eo_do((Eo *) obj, elm_obj_label_slide_speed_get(&ret)); + return ret; +} + +static void +_slide_speed_get(Eo *obj EINA_UNUSED, void *_pd, va_list *list) +{ + double *ret = va_arg(*list, double *); + Elm_Label_Smart_Data *sd = _pd; + *ret = sd->slide_speed; +} + +EAPI void elm_label_slide_go(Evas_Object *obj) { ELM_LABEL_CHECK(obj); @@ -743,6 +787,8 @@ _class_constructor(Eo_Class *klass) EO_OP_FUNC(ELM_OBJ_LABEL_ID(ELM_OBJ_LABEL_SUB_ID_SLIDE_DURATION_SET), _slide_duration_set), EO_OP_FUNC(ELM_OBJ_LABEL_ID(ELM_OBJ_LABEL_SUB_ID_SLIDE_DURATION_GET), _slide_duration_get), EO_OP_FUNC(ELM_OBJ_LABEL_ID(ELM_OBJ_LABEL_SUB_ID_SLIDE_GO), _slide_go), + EO_OP_FUNC(ELM_OBJ_LABEL_ID(ELM_OBJ_LABEL_SUB_ID_SLIDE_SPEED_SET), _slide_speed_set), + EO_OP_FUNC(ELM_OBJ_LABEL_ID(ELM_OBJ_LABEL_SUB_ID_SLIDE_SPEED_GET), _slide_speed_get), EO_OP_FUNC_SENTINEL }; eo_class_funcs_set(klass, func_desc); @@ -758,9 +804,11 @@ static const Eo_Op_Description op_desc[] = { EO_OP_DESCRIPTION(ELM_OBJ_LABEL_SUB_ID_ELLIPSIS_GET, "Get the ellipsis behavior of the label."), EO_OP_DESCRIPTION(ELM_OBJ_LABEL_SUB_ID_SLIDE_MODE_SET, "Set slide effect mode of label widget."), EO_OP_DESCRIPTION(ELM_OBJ_LABEL_SUB_ID_SLIDE_MODE_GET, "Get current slide effect mode."), - EO_OP_DESCRIPTION(ELM_OBJ_LABEL_SUB_ID_SLIDE_DURATION_SET, "Set the slide duration (speed) of the label."), - EO_OP_DESCRIPTION(ELM_OBJ_LABEL_SUB_ID_SLIDE_DURATION_GET, "Get the slide duration(speed) of the label."), + EO_OP_DESCRIPTION(ELM_OBJ_LABEL_SUB_ID_SLIDE_DURATION_SET, "Set the slide duration of the label."), + EO_OP_DESCRIPTION(ELM_OBJ_LABEL_SUB_ID_SLIDE_DURATION_GET, "Get the slide duration of the label."), EO_OP_DESCRIPTION(ELM_OBJ_LABEL_SUB_ID_SLIDE_GO, "Start slide effect."), + EO_OP_DESCRIPTION(ELM_OBJ_LABEL_SUB_ID_SLIDE_SPEED_SET, "Set the slide speed of the label."), + EO_OP_DESCRIPTION(ELM_OBJ_LABEL_SUB_ID_SLIDE_SPEED_GET, "Get the slide speed of the label."), EO_OP_DESCRIPTION_SENTINEL }; static const Eo_Class_Description class_desc = { diff --git a/src/lib/elm_label_eo.h b/src/lib/elm_label_eo.h index f79cb95..fa87c10 100644 --- a/src/lib/elm_label_eo.h +++ b/src/lib/elm_label_eo.h @@ -22,6 +22,8 @@ enum ELM_OBJ_LABEL_SUB_ID_SLIDE_DURATION_SET, ELM_OBJ_LABEL_SUB_ID_SLIDE_DURATION_GET, ELM_OBJ_LABEL_SUB_ID_SLIDE_GO, + ELM_OBJ_LABEL_SUB_ID_SLIDE_SPEED_SET, + ELM_OBJ_LABEL_SUB_ID_SLIDE_SPEED_GET, ELM_OBJ_LABEL_SUB_ID_LAST }; @@ -144,7 +146,7 @@ enum * @def elm_obj_label_slide_duration_set * @since 1.8 * - * @brief Set the slide duration (speed) of the label + * @brief Set the slide duration of the label * * @param[in] duration * @@ -158,7 +160,7 @@ enum * @def elm_obj_label_slide_duration_get * @since 1.8 * - * @brief Get the slide duration(speed) of the label + * @brief Get the slide duration of the label * * @param[out] ret * @@ -169,6 +171,34 @@ enum #define elm_obj_label_slide_duration_get(ret) ELM_OBJ_LABEL_ID(ELM_OBJ_LABEL_SUB_ID_SLIDE_DURATION_GET), EO_TYPECHECK(double *, ret) /** + * @def elm_obj_label_slide_speed_set + * @since 1.9 + * + * @brief Set the slide speed of the label + * + * @param[in] speed + * + * @see elm_label_slide_speed_set + * + * @ingroup Label + */ +#define elm_obj_label_slide_speed_set(speed) ELM_OBJ_LABEL_ID(ELM_OBJ_LABEL_SUB_ID_SLIDE_SPEED_SET), EO_TYPECHECK(double, speed) + +/** + * @def elm_obj_label_slide_speed_get + * @since 1.9 + * + * @brief Get the slide speed of the label + * + * @param[out] ret + * + * @see elm_label_slide_speed_get + * + * @ingroup Label + */ +#define elm_obj_label_slide_speed_get(ret) ELM_OBJ_LABEL_ID(ELM_OBJ_LABEL_SUB_ID_SLIDE_SPEED_GET), EO_TYPECHECK(double *, ret) + +/** * @def elm_obj_label_slide_go * @since 1.8 * diff --git a/src/lib/elm_label_legacy.h b/src/lib/elm_label_legacy.h index b3222b8..f4e7ba2 100644 --- a/src/lib/elm_label_legacy.h +++ b/src/lib/elm_label_legacy.h @@ -128,8 +128,9 @@ EAPI void elm_label_slide_mode_set(Evas_Object *obj, Elm_ * @ingroup Label */ EAPI Elm_Label_Slide_Mode elm_label_slide_mode_get(const Evas_Object *obj); + /** - * @brief Set the slide duration (speed) of the label + * @brief Set the slide duration of the label * * @param obj The label object * @param duration The duration in seconds in moving text from slide begin position @@ -140,7 +141,7 @@ EAPI Elm_Label_Slide_Mode elm_label_slide_mode_get(const Evas_Object *obj EAPI void elm_label_slide_duration_set(Evas_Object *obj, double duration); /** - * @brief Get the slide duration(speed) of the label + * @brief Get the slide duration of the label * * @param obj The label object * @return The duration time in moving text from slide begin position to slide end position @@ -152,6 +153,28 @@ EAPI void elm_label_slide_duration_set(Evas_Object *obj, EAPI double elm_label_slide_duration_get(const Evas_Object *obj); /** + * @brief Set the slide speed of the label + * + * @param obj The label object + * @param speed The speed of the slide animation in px per seconds + * + * @ingroup Label + */ +EAPI void elm_label_slide_speed_set(Evas_Object *obj, double speed); + +/** + * @brief Get the slide speed of the label + * + * @param obj The label object + * @return The slide animation speed in px per seconds + * + * @see elm_label_slide_speed_set() + * + * @ingroup Label + */ +EAPI double elm_label_slide_speed_get(const Evas_Object *obj); + +/** * @brief Start slide effect. * * @param obj The label object diff --git a/src/lib/elm_widget_label.h b/src/lib/elm_widget_label.h index 4e2ac72..399e774 100644 --- a/src/lib/elm_widget_label.h +++ b/src/lib/elm_widget_label.h @@ -13,6 +13,7 @@ struct _Elm_Label_Smart_Data { const char *format; double slide_duration; + double slide_speed; Evas_Coord lastw; Evas_Coord wrap_w; Elm_Wrap_Type linewrap; @@ -20,6 +21,7 @@ struct _Elm_Label_Smart_Data Eina_Bool ellipsis : 1; Eina_Bool slide_ellipsis : 1; + Eina_Bool use_slide_speed : 1; }; #define ELM_LABEL_DATA_GET(o, sd) \ --