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
This commit is contained in:
nirajkr 2014-02-09 22:55:38 +09:00 committed by Carsten Haitzler (Rasterman)
parent 1e35d4bab0
commit 29069fe9c5
5 changed files with 180 additions and 4 deletions

View File

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

View File

@ -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;
}
@ -673,6 +694,41 @@ elm_label_slide_duration_get(const Evas_Object *obj)
return ret;
}
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)
{
@ -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 = {

View File

@ -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)
/**
* @}
*/

View File

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

View File

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