raster pushed a commit to branch master. http://git.enlightenment.org/core/elementary.git/commit/?id=56a2c96ea7a731d6066aa7cb0964a633c5bed35c
commit 56a2c96ea7a731d6066aa7cb0964a633c5bed35c Author: nirajkr <niraj...@samsung.com> Date: Sun Feb 9 22:55:38 2014 +0900 label : Added the API to match the speed of label to different label Summary: Currently we do not set the speed of two label same This patch fetch the information of the previous label to set it to the next label to match the speed of the previous label Reviewers: seoz, raster Reviewed By: raster CC: singh.amitesh Differential Revision: https://phab.enlightenment.org/D531 --- src/bin/test_label.c | 47 ++++++++++++++++++++++++++++++++ src/lib/elm_label.c | 68 +++++++++++++++++++++++++++++++++++++++++++--- src/lib/elm_label_eo.h | 32 ++++++++++++++++++++++ src/lib/elm_label_legacy.h | 32 ++++++++++++++++++++++ src/lib/elm_widget_label.h | 5 ++++ 5 files changed, 180 insertions(+), 4 deletions(-) diff --git a/src/bin/test_label.c b/src/bin/test_label.c index 7e6a73d..d5e7898 100644 --- a/src/bin/test_label.c +++ b/src/bin/test_label.c @@ -113,6 +113,8 @@ 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; + double duration; + Evas_Coord textlen; win = elm_win_util_standard_add("label2", "Label 2"); elm_win_autodel_set(win, EINA_TRUE); @@ -212,6 +214,51 @@ test_label2(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_in elm_grid_pack(gd, sl, 5, 60, 90, 10); evas_object_show(sl); + /*Test label slide speed */ + lb = elm_label_add(win); + elm_object_text_set(lb, "Test Label Slide Speed:"); + elm_label_slide_mode_set(lb, ELM_LABEL_SLIDE_MODE_ALWAYS); + elm_label_slide_go(lb); + 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, 10); + evas_object_color_set(rect, 255, 125, 125, 255); + evas_object_show(rect); + + lb = elm_label_add(win); + elm_object_style_set(lb, "slide_long"); + elm_object_text_set(lb, + "This is a label set to slide and this will" + " test the speed of label with the below label." + " This label has few extra char to test"); + elm_label_slide_duration_set(lb, 8.0); + elm_label_slide_mode_set(lb, ELM_LABEL_SLIDE_MODE_ALWAYS); + elm_label_slide_go(lb); + elm_grid_pack(gd, lb, 5, 80, 90, 10); + evas_object_show(lb); + + //Get the required parameter of the previous label + duration = elm_label_slide_duration_get(lb); + textlen = elm_label_slide_text_length_get(lb); + + rect = evas_object_rectangle_add(evas_object_evas_get(win)); + elm_grid_pack(gd, rect, 5, 90, 90, 10); + evas_object_color_set(rect, 255, 125, 125, 255); + evas_object_show(rect); + + lb = elm_label_add(win); + elm_object_style_set(lb, "slide_long"); + elm_object_text_set(lb, + "This is a label set to slide and this will" + " match the speed of the upper label."); + elm_label_slide_mode_set(lb, ELM_LABEL_SLIDE_MODE_ALWAYS); + elm_label_slide_speed_match(lb, duration, textlen); + elm_label_slide_go(lb); + elm_grid_pack(gd, lb, 5, 90, 90, 10); + evas_object_show(lb); + 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..a46badf 100644 --- a/src/lib/elm_label.c +++ b/src/lib/elm_label.c @@ -78,7 +78,9 @@ static void _label_slide_change(Evas_Object *obj) { Evas_Object *tb; + Evas_Coord lw; char *plaintxt; + double speed; int plainlen = 0; ELM_LABEL_DATA_GET(obj, sd); @@ -138,6 +140,17 @@ _label_slide_change(Evas_Object *obj) Edje_Message_Float_Set *msg = alloca(sizeof(Edje_Message_Float_Set) + (sizeof(double))); + evas_object_geometry_get(wd->resize_obj, + NULL, NULL, &lw, NULL); + if ((sd->slide_duration_recalc) && + (lw > 0) && + (sd->matchslide_duration > 0)) + { + speed = (sd->matchslide_textlen + lw) / (sd->matchslide_duration); + sd->slide_duration = (sd->text_formatted_length + lw) / (speed); + sd->slide_duration_recalc = EINA_FALSE; + } + msg->count = 1; msg->val[0] = sd->slide_duration; @@ -214,9 +227,10 @@ _on_label_resize(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) { - ELM_LABEL_DATA_GET(data, sd); + ELM_LABEL_DATA_GET(data, sd); - if (sd->linewrap) elm_layout_sizing_eval(data); + if (sd->slide_duration_recalc) _label_slide_change(data); + if (sd->linewrap) elm_layout_sizing_eval(data); } static int @@ -324,6 +338,8 @@ _stringshare_key_value_replace(const char **srcstring, static void _elm_label_smart_text_set(Eo *obj, void *_pd, va_list *list) { + Evas_Object *tb; + Elm_Label_Smart_Data *sd = _pd; ELM_WIDGET_DATA_GET_OR_RETURN(obj, wd); const char *part = va_arg(*list, const char *); @@ -341,6 +357,11 @@ _elm_label_smart_text_set(Eo *obj, void *_pd, va_list *list) sd->lastw = 0; eo_do(obj, elm_obj_layout_sizing_eval()); } + + tb = (Evas_Object *)edje_object_part_object_get(wd->resize_obj, + "elm.text"); + evas_object_textblock_size_formatted_get(tb, &sd->text_formatted_length, NULL); + if (ret) *ret = int_ret; } @@ -674,6 +695,41 @@ elm_label_slide_duration_get(const Evas_Object *obj) } EAPI void +elm_label_slide_speed_match(Evas_Object *obj, double duration, Evas_Coord textlen) +{ + ELM_LABEL_CHECK(obj); + eo_do(obj, elm_obj_label_slide_speed_match(duration, textlen)); +} + +static void +_slide_speed_match(Eo *obj EINA_UNUSED, void *_pd, va_list *list) +{ + double duration = va_arg(*list, double); + Evas_Coord textlen = va_arg(*list, Evas_Coord); + Elm_Label_Smart_Data *sd = _pd; + sd->matchslide_duration = duration; + sd->matchslide_textlen = textlen; + sd->slide_duration_recalc = EINA_TRUE; +} + +EAPI Evas_Coord +elm_label_slide_text_length_get(const Evas_Object *obj) +{ + ELM_LABEL_CHECK(obj) 0; + Evas_Coord ret = 0; + eo_do((Eo *) obj, elm_obj_label_slide_text_length_get(&ret)); + return ret; +} + +static void +_slide_textlen_get(Eo *obj EINA_UNUSED, void *_pd, va_list *list) +{ + Evas_Coord *ret = va_arg(*list, Evas_Coord *); + Elm_Label_Smart_Data *sd = _pd; + *ret = sd->text_formatted_length; +} + +EAPI void elm_label_slide_go(Evas_Object *obj) { ELM_LABEL_CHECK(obj); @@ -743,6 +799,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_MATCH), _slide_speed_match), + EO_OP_FUNC(ELM_OBJ_LABEL_ID(ELM_OBJ_LABEL_SUB_ID_TEXT_LENGTH_GET), _slide_textlen_get), EO_OP_FUNC_SENTINEL }; eo_class_funcs_set(klass, func_desc); @@ -758,9 +816,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_MATCH, "Set the required parameter to match slide speed."), + EO_OP_DESCRIPTION(ELM_OBJ_LABEL_SUB_ID_TEXT_LENGTH_GET, "Get the text length 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..efd4013 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_MATCH, + ELM_OBJ_LABEL_SUB_ID_TEXT_LENGTH_GET, ELM_OBJ_LABEL_SUB_ID_LAST }; @@ -179,6 +181,36 @@ enum * @ingroup Label */ #define elm_obj_label_slide_go() ELM_OBJ_LABEL_ID(ELM_OBJ_LABEL_SUB_ID_SLIDE_GO) + +/** + * @def elm_obj_label_slide_speed_match + * @since 1.9 + * + * @brief Set the required parameter to set the same speed of the label + * + * @param[in] duration + * @param[in] textlen + * + * @see elm_label_slide_duration_set + * + * @ingroup Label + */ +#define elm_obj_label_slide_speed_match(duration, textlen) ELM_OBJ_LABEL_ID(ELM_OBJ_LABEL_SUB_ID_SLIDE_SPEED_MATCH), EO_TYPECHECK(double, duration), EO_TYPECHECK(Evas_Coord, textlen) + +/** + * @def elm_obj_label_slide_text_length_get + * @since 1.9 + * + * @brief Get the text label length + * + * @param[out] ret + * + * @see elm_object_text_set + * + * @ingroup Label + */ +#define elm_obj_label_slide_text_length_get(ret) ELM_OBJ_LABEL_ID(ELM_OBJ_LABEL_SUB_ID_TEXT_LENGTH_GET), EO_TYPECHECK(Evas_Coord * , ret) + /** * @} */ diff --git a/src/lib/elm_label_legacy.h b/src/lib/elm_label_legacy.h index b3222b8..04cfc7e 100644 --- a/src/lib/elm_label_legacy.h +++ b/src/lib/elm_label_legacy.h @@ -162,3 +162,35 @@ EAPI double elm_label_slide_duration_get(const Evas_Object * @ingroup Label */ EAPI void elm_label_slide_go(Evas_Object *obj); + +/** + * @brief Set the required parameter to set the same speed of the label + * + * @param obj The label object + * @param duration The duration of the previous slide label + * @param duration The textlen of the previous slide label text + * + * @note If this API is called then it is not required to set the + * duration of the label. Internally it will calcuate the duration + * which will match the speed of the previous label. If the duration + * is explicitly set it will override these parameters. + * + * @see elm_label_slide_duration_set() + * @since 1.9 + * + * @ingroup Label + */ +EAPI void elm_label_slide_speed_match(Evas_Object *obj, double duration, Evas_Coord textlen); + +/** + * @brief Get the text length of the label + * + * @param obj The label object + * @return The text length of the label + * + * @see elm_object_text_set() + * @since 1.9 + * + * @ingroup Label + */ +EAPI Evas_Coord elm_label_slide_text_length_get(const Evas_Object *obj); diff --git a/src/lib/elm_widget_label.h b/src/lib/elm_widget_label.h index 4e2ac72..4464e76 100644 --- a/src/lib/elm_widget_label.h +++ b/src/lib/elm_widget_label.h @@ -13,13 +13,18 @@ struct _Elm_Label_Smart_Data { const char *format; double slide_duration; + double matchslide_duration; + Evas_Coord lastw; Evas_Coord wrap_w; + Evas_Coord text_formatted_length; + Evas_Coord matchslide_textlen; Elm_Wrap_Type linewrap; Elm_Label_Slide_Mode slide_mode; Eina_Bool ellipsis : 1; Eina_Bool slide_ellipsis : 1; + Eina_Bool slide_duration_recalc : 1; }; #define ELM_LABEL_DATA_GET(o, sd) \ --