forked from enlightenment/efl
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:
parent
1e35d4bab0
commit
29069fe9c5
|
@ -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);
|
||||
}
|
||||
|
|
|
@ -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 = {
|
||||
|
|
|
@ -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)
|
||||
|
||||
/**
|
||||
* @}
|
||||
*/
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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) \
|
||||
|
|
Loading…
Reference in New Issue