elementary/label - support slide effect of the label widget optionally.

now it supports slides the texts if the label area is smaller than the text width length.

deprecated - elm_label_slide_set()/get()
added - elm_label_slide_mode_set()/get()



SVN revision: 82169
This commit is contained in:
ChunEon Park 2013-01-04 10:47:51 +00:00
parent 103d2e27ad
commit 724a0b0f2d
6 changed files with 170 additions and 66 deletions

View File

@ -882,3 +882,7 @@
2012-01-03 Prince Dubey Kumar <prince.dubey@samsung.com>
* Fix gengrid region_show/bring_in and add test
2012-01-04 ChunEon Park <hermet@hermet.pe.kr>
* Deprecate elm_label_slide_set()/get() and added elm_label_slide_mode_set()/get() instead.

View File

@ -26,6 +26,7 @@ Additions:
* Add elm_dbus_menu to support D-Bus external menus.
* Add configuration: ELM_EXTERNAL_MENU, to switch between internal and extenal menus
* Add elm_systray.[ch]: Add support to D-Bus systray icons.
* Add elm_label_slide_mode_set(), elm_label_slide_mode_get()
Improvements:
@ -121,6 +122,7 @@ Removals:
* All internal widget hooks (and related macros) were removed, due
to deprecation. Thus, people using that (unstable) API will have
to adapt themselves.
* Deprecate elm_label_slide_set(), elm_label_slide_get().
Changes since Elementary 1.0.0:
-------------------------

View File

@ -453,3 +453,37 @@ EINA_DEPRECATED EAPI void elm_notify_orient_set(Evas_Obj
* @deprecated Use elm_notify_align_get instead.
*/
EINA_DEPRECATED EAPI Elm_Notify_Orient elm_notify_orient_get(const Evas_Object *obj);
/**
* @brief Set slide effect of label widget.
*
* @param obj The label object
* @param slide If true, slide effect will be shown
*
* If set to true, the text of the label will slide/scroll through the length of
* label.
*
* @warning This only works with the themes "slide_short", "slide_long" and
* "slide_bounce".
* @warning This doesn't work if the line wrap(elm_label_line_wrap_set()) or
* ellipsis(elm_label_ellipsis_set()) is set.
*
* @deprecated see elm_label_slide_mode_set() instead.
*
* @ingroup Label
*/
EINA_DEPRECATED EAPI void elm_label_slide_set(Evas_Object *obj, Eina_Bool slide);
/**
* @brief Get whether slide effect is shown or not.
*
* @param obj The label object
* @return If true, slide effect is shown.
*
* @see elm_label_slide_set()
*
* @deprecated see elm_label_slide_mode_get() instead.
*
* @ingroup Label
*/
EINA_DEPRECATED EAPI Eina_Bool elm_label_slide_get(const Evas_Object *obj);

View File

@ -62,6 +62,7 @@ _label_format_set(Evas_Object *obj,
static void
_label_slide_change(Evas_Object *obj)
{
Evas_Object *tb;
char *plaintxt;
int plainlen = 0;
@ -71,7 +72,7 @@ _label_slide_change(Evas_Object *obj)
// doesn't support multiline slide effect
if (sd->linewrap)
{
sd->slide = EINA_FALSE;
sd->slide_mode = ELM_LABEL_SLIDE_MODE_NONE;
WRN("Doesn't support slide effect for multiline! : label=%p", obj);
return;
}
@ -87,12 +88,31 @@ _label_slide_change(Evas_Object *obj)
// too short to slide label
if (plainlen < 1)
{
sd->slide = EINA_FALSE;
sd->slide_mode = ELM_LABEL_SLIDE_MODE_NONE;
return;
}
if (sd->slide)
if (sd->slide_mode != ELM_LABEL_SLIDE_MODE_NONE)
{
//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))
{
sd->slide_mode = ELM_LABEL_SLIDE_MODE_NONE;
return;
}
}
}
Edje_Message_Float_Set *msg =
alloca(sizeof(Edje_Message_Float_Set) + (sizeof(double)));
@ -561,41 +581,59 @@ _ellipsis_get(Eo *obj EINA_UNUSED, void *_pd, va_list *list)
}
EAPI void
elm_label_slide_set(Evas_Object *obj,
Eina_Bool slide)
elm_label_slide_mode_set(Evas_Object *obj, Elm_Label_Slide_Mode mode)
{
ELM_LABEL_CHECK(obj);
eo_do(obj, elm_obj_label_slide_set(slide));
eo_do(obj, elm_obj_label_slide_mode_set(mode));
}
static void
_slide_set(Eo *obj, void *_pd, va_list *list)
_slide_mode_set(Eo *obj, void *_pd, va_list *list)
{
Eina_Bool slide = va_arg(*list, int);
Elm_Label_Slide_Mode mode = va_arg(*list, Elm_Label_Slide_Mode);
Elm_Label_Smart_Data *sd = _pd;
if (sd->slide == slide) return;
sd->slide = slide;
if (sd->slide_mode == mode) return;
sd->slide_mode = mode;
_label_slide_change(obj);
elm_layout_sizing_eval(obj);
}
EAPI Eina_Bool
elm_label_slide_get(const Evas_Object *obj)
EAPI Elm_Label_Slide_Mode
elm_label_slide_mode_get(const Evas_Object *obj)
{
ELM_LABEL_CHECK(obj) EINA_FALSE;
Eina_Bool ret = EINA_FALSE;
eo_do((Eo *) obj, elm_obj_label_slide_get(&ret));
ELM_LABEL_CHECK(obj) ELM_LABEL_SLIDE_MODE_NONE;
Elm_Label_Slide_Mode ret = ELM_LABEL_SLIDE_MODE_NONE;
eo_do((Eo *) obj, elm_obj_label_slide_mode_get(&ret));
return ret;
}
static void
_slide_get(Eo *obj EINA_UNUSED, void *_pd, va_list *list)
_slide_mode_get(Eo *obj __UNUSED__, void *_pd, va_list *list)
{
Eina_Bool *ret = va_arg(*list, Eina_Bool *);
Elm_Label_Slide_Mode *ret = va_arg(*list, Elm_Label_Slide_Mode *);
Elm_Label_Smart_Data *sd = _pd;
*ret = sd->slide;
*ret = sd->slide_mode;
}
EINA_DEPRECATED EAPI void
elm_label_slide_set(Evas_Object *obj,
Eina_Bool slide)
{
if (slide)
elm_label_slide_mode_set(obj, ELM_LABEL_SLIDE_MODE_ALWAYS);
else
elm_label_slide_mode_set(obj, ELM_LABEL_SLIDE_MODE_NONE);
}
EINA_DEPRECATED EAPI Eina_Bool
elm_label_slide_get(const Evas_Object *obj)
{
ELM_LABEL_CHECK(obj) EINA_FALSE;
Eina_Bool ret = EINA_FALSE;
if (elm_label_slide_mode_get(obj) == ELM_LABEL_SLIDE_MODE_ALWAYS)
ret = EINA_TRUE;
return ret;
}
EAPI void
@ -683,8 +721,8 @@ _class_constructor(Eo_Class *klass)
EO_OP_FUNC(ELM_OBJ_LABEL_ID(ELM_OBJ_LABEL_SUB_ID_WRAP_WIDTH_GET), _wrap_width_get),
EO_OP_FUNC(ELM_OBJ_LABEL_ID(ELM_OBJ_LABEL_SUB_ID_ELLIPSIS_SET), _ellipsis_set),
EO_OP_FUNC(ELM_OBJ_LABEL_ID(ELM_OBJ_LABEL_SUB_ID_ELLIPSIS_GET), _ellipsis_get),
EO_OP_FUNC(ELM_OBJ_LABEL_ID(ELM_OBJ_LABEL_SUB_ID_SLIDE_SET), _slide_set),
EO_OP_FUNC(ELM_OBJ_LABEL_ID(ELM_OBJ_LABEL_SUB_ID_SLIDE_GET), _slide_get),
EO_OP_FUNC(ELM_OBJ_LABEL_ID(ELM_OBJ_LABEL_SUB_ID_SLIDE_MODE_SET), _slide_mode_set),
EO_OP_FUNC(ELM_OBJ_LABEL_ID(ELM_OBJ_LABEL_SUB_ID_SLIDE_MODE_GET), _slide_mode_get),
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_SENTINEL
@ -698,8 +736,8 @@ static const Eo_Op_Description op_desc[] = {
EO_OP_DESCRIPTION(ELM_OBJ_LABEL_SUB_ID_WRAP_WIDTH_GET, "Get wrap width of the label."),
EO_OP_DESCRIPTION(ELM_OBJ_LABEL_SUB_ID_ELLIPSIS_SET, "Set the ellipsis behavior of the label."),
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_SET, "Set slide effect of label widget."),
EO_OP_DESCRIPTION(ELM_OBJ_LABEL_SUB_ID_SLIDE_GET, "Get whether slide effect is shown or not."),
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_SENTINEL

View File

@ -53,8 +53,8 @@ enum
ELM_OBJ_LABEL_SUB_ID_WRAP_WIDTH_GET,
ELM_OBJ_LABEL_SUB_ID_ELLIPSIS_SET,
ELM_OBJ_LABEL_SUB_ID_ELLIPSIS_GET,
ELM_OBJ_LABEL_SUB_ID_SLIDE_SET,
ELM_OBJ_LABEL_SUB_ID_SLIDE_GET,
ELM_OBJ_LABEL_SUB_ID_SLIDE_MODE_SET,
ELM_OBJ_LABEL_SUB_ID_SLIDE_MODE_GET,
ELM_OBJ_LABEL_SUB_ID_SLIDE_DURATION_SET,
ELM_OBJ_LABEL_SUB_ID_SLIDE_DURATION_GET,
ELM_OBJ_LABEL_SUB_ID_LAST
@ -136,28 +136,28 @@ enum
#define elm_obj_label_ellipsis_get(ret) ELM_OBJ_LABEL_ID(ELM_OBJ_LABEL_SUB_ID_ELLIPSIS_GET), EO_TYPECHECK(Eina_Bool *, ret)
/**
* @def elm_obj_label_slide_set
* @def elm_obj_label_slide_mode_set
* @since 1.8
*
* @brief Set slide effect of label widget.
* @brief Set slide effect mode of label widget.
*
* @param[in] slide
* @param[in] mode
*
* @see elm_label_slide_set
* @see elm_label_slide_mode_set
*/
#define elm_obj_label_slide_set(slide) ELM_OBJ_LABEL_ID(ELM_OBJ_LABEL_SUB_ID_SLIDE_SET), EO_TYPECHECK(Eina_Bool, slide)
#define elm_obj_label_slide_mode_set(mode) ELM_OBJ_LABEL_ID(ELM_OBJ_LABEL_SUB_ID_SLIDE_MODE_SET), EO_TYPECHECK(Elm_Label_Slide_Mode, mode)
/**
* @def elm_obj_label_slide_get
* @def elm_obj_label_slide_mode_get
* @since 1.8
*
* @brief Get whether slide effect is shown or not.
* @brief Get current slide effect mode.
*
* @param[out] ret
*
* @see elm_label_slide_get
* @see elm_label_slide_mode_get
*/
#define elm_obj_label_slide_get(ret) ELM_OBJ_LABEL_ID(ELM_OBJ_LABEL_SUB_ID_SLIDE_GET), EO_TYPECHECK(Eina_Bool *, ret)
#define elm_obj_label_slide_mode_get(ret) ELM_OBJ_LABEL_ID(ELM_OBJ_LABEL_SUB_ID_SLIDE_MODE_GET), EO_TYPECHECK(Elm_Label_Slide_Mode *, ret)
/**
* @def elm_obj_label_slide_duration_set
@ -182,6 +182,14 @@ enum
* @see elm_label_slide_duration_get
*/
#define elm_obj_label_slide_duration_get(ret) ELM_OBJ_LABEL_ID(ELM_OBJ_LABEL_SUB_ID_SLIDE_DURATION_GET), EO_TYPECHECK(double *, ret)
typedef enum
{
ELM_LABEL_SLIDE_MODE_NONE = 0, /**< no slide effect */
ELM_LABEL_SLIDE_MODE_AUTO, /**< slide only if the label area is bigger than the text width length */
ELM_LABEL_SLIDE_MODE_ALWAYS /**< slide always */
} Elm_Label_Slide_Mode;
/**
* @brief Add a new label to the parent
*
@ -274,36 +282,6 @@ EAPI void elm_label_ellipsis_set(Evas_Object *obj, Eina_B
*/
EAPI Eina_Bool elm_label_ellipsis_get(const Evas_Object *obj);
/**
* @brief Set slide effect of label widget.
*
* @param obj The label object
* @param slide If true, slide effect will be shown
*
* If set to true, the text of the label will slide/scroll through the length of
* label.
*
* @warning This only works with the themes "slide_short", "slide_long" and
* "slide_bounce".
* @warning This doesn't work if the line wrap(elm_label_line_wrap_set()) or
* ellipsis(elm_label_ellipsis_set()) is set.
*
* @ingroup Label
*/
EAPI void elm_label_slide_set(Evas_Object *obj, Eina_Bool slide);
/**
* @brief Get whether slide effect is shown or not.
*
* @param obj The label object
* @return If true, slide effect is shown.
*
* @see elm_label_slide_set()
*
* @ingroup Label
*/
EAPI Eina_Bool elm_label_slide_get(const Evas_Object *obj);
/**
* @brief Set the slide duration (speed) of the label
*
@ -327,6 +305,54 @@ EAPI void elm_label_slide_duration_set(Evas_Object *obj,
*/
EAPI double elm_label_slide_duration_get(const Evas_Object *obj);
/**
* @brief Slide only if the
*
* @param obj The label object
* @param duration The duration in seconds in moving text from slide begin position
* to slide end position
*
* @ingroup Label
*/
EAPI void elm_label_slide_area_limit_set(Evas_Object *obj, Eina_Bool limit);
/**
* @brief Set the slide mode of the label widget.
*
* @param obj The label object
* @param mode The slide mode
*
* elm_label_slide_mode_set() changes label slide mode.
* By default, slide mode is none. Possible values for @p mode are:
* @li ELM_LABEL_SLIDE_MODE_NONE - no slide effect
* @li ELM_LABEL_SLIDE_MODE_AUTO - slide only if the label area is bigger than
* the text width length
* @li ELM_LABEL_SLIDE_MODE_ALWAYS -slide always
*
* @warning ELM_LABEL_SLIDE_MODE_AUTO, ELM_LABEL_SLIDE_MODE_ALWAYS only work
* with the themes "slide_short", "slide_long" and "slide_bounce".
* @warning ELM_LABEL_SLIDE_MODE_AUTO, ELM_LABEL_SLIDE_MODE_ALWAYS don't work
* if the line wrap(elm_label_line_wrap_set()) or
* ellipsis(elm_label_ellipsis_set()) is set.
*
* @see elm_label_slide_mode_get().
*
* @ingroup Label
*/
EAPI void elm_label_slide_mode_set(Evas_Object *obj, Elm_Label_Slide_Mode mode);
/**
* @brief Get the slide mode of the label widget.
*
* @param obj The label object
* @return The slide mode
*
* @see elm_label_slide_set()
*
* @ingroup Label
*/
EAPI Elm_Label_Slide_Mode elm_label_slide_mode_get(const Evas_Object *obj);
/**
* @}
*/

View File

@ -18,9 +18,9 @@ struct _Elm_Label_Smart_Data
Evas_Coord lastw;
Evas_Coord wrap_w;
Elm_Wrap_Type linewrap;
Elm_Label_Slide_Mode slide_mode;
Eina_Bool ellipsis : 1;
Eina_Bool slide : 1;
Eina_Bool slide_ellipsis : 1;
};