Evas textblock: Added user style support.

This should make it easier to override the style set in textblock.

SVN revision: 67473
This commit is contained in:
Tom Hacohen 2012-01-23 16:08:36 +00:00
parent a5b728d53d
commit 98c61bfe6c
3 changed files with 87 additions and 12 deletions

View File

@ -660,3 +660,10 @@
rotation on the image object 3) Corresponding image
object has alpha disabled.
2012-01-23 Tom Hacohen (TAsn)
* Textblock: Added evas_object_textblock_style_user_set/get.
This is used to override the default style set for an evas object.
For example, this can be used to nicely change the font and size
in a text editor.

View File

@ -8285,6 +8285,28 @@ EAPI void evas_object_textblock_style_set(Evas_Object *o
*/
EAPI const Evas_Textblock_Style *evas_object_textblock_style_get(const Evas_Object *obj) EINA_WARN_UNUSED_RESULT EINA_ARG_NONNULL(1);
/**
* Set the objects user style to ts.
*
* The user style overrides the corresponding elements of the regular style.
* This is the proper way to do theme overrides in code.
* @param obj the Evas object to set the style to.
* @param ts the style to set.
* @return Returns no value.
* @see evas_object_textblock_style_set
* @since 1.2.0
*/
EAPI void evas_object_textblock_style_user_set(Evas_Object *obj, Evas_Textblock_Style *ts) EINA_ARG_NONNULL(1);
/**
* Return the user style of an object.
* @param obj the object to get the style from.
* @return the style of the object.
* @see evas_object_textblock_style_get
* @since 1.2.0
*/
EAPI const Evas_Textblock_Style *evas_object_textblock_style_user_get(const Evas_Object *obj) EINA_WARN_UNUSED_RESULT EINA_ARG_NONNULL(1);
/**
* @brief Set the "replacement character" to use for the given textblock object.
*

View File

@ -430,6 +430,7 @@ struct _Evas_Object_Textblock
{
DATA32 magic;
Evas_Textblock_Style *style;
Evas_Textblock_Style *style_user;
Evas_Textblock_Cursor *cursor;
Eina_List *cursors;
Evas_Object_Textblock_Node_Text *text_nodes;
@ -4185,11 +4186,27 @@ _layout(const Evas_Object *obj, int w, int h, int *w_ret, int *h_ret)
/* Start of logical layout creation */
/* setup default base style */
if ((c->o->style) && (c->o->style->default_tag))
{
c->fmt = _layout_format_push(c, NULL, NULL);
_format_fill(c->obj, c->fmt, c->o->style->default_tag);
_format_finalize(c->obj, c->fmt);
Eina_Bool finalize = EINA_FALSE;
if ((c->o->style) && (c->o->style->default_tag))
{
c->fmt = _layout_format_push(c, NULL, NULL);
_format_fill(c->obj, c->fmt, c->o->style->default_tag);
finalize = EINA_TRUE;
}
if ((c->o->style_user) && (c->o->style_user->default_tag))
{
if (!c->fmt)
{
c->fmt = _layout_format_push(c, NULL, NULL);
}
_format_fill(c->obj, c->fmt, c->o->style_user->default_tag);
finalize = EINA_TRUE;
}
if (finalize)
_format_finalize(c->obj, c->fmt);
}
if (!c->fmt)
{
@ -4576,13 +4593,15 @@ evas_textblock_style_get(const Evas_Textblock_Style *ts)
}
/* textblock styles */
EAPI void
evas_object_textblock_style_set(Evas_Object *obj, Evas_Textblock_Style *ts)
static void
_textblock_style_generic_set(Evas_Object *obj, Evas_Textblock_Style *ts,
Evas_Textblock_Style **obj_ts)
{
TB_HEAD();
if (ts == o->style) return;
if (ts == *obj_ts) return;
if ((ts) && (ts->delete_me)) return;
if (o->style)
if (*obj_ts)
{
Evas_Textblock_Style *old_ts;
if (o->markup_text)
@ -4591,7 +4610,7 @@ evas_object_textblock_style_set(Evas_Object *obj, Evas_Textblock_Style *ts)
o->markup_text = NULL;
}
old_ts = o->style;
old_ts = *obj_ts;
old_ts->objects = eina_list_remove(old_ts->objects, obj);
if ((old_ts->delete_me) && (!old_ts->objects))
evas_textblock_style_free(old_ts);
@ -4600,12 +4619,19 @@ evas_object_textblock_style_set(Evas_Object *obj, Evas_Textblock_Style *ts)
{
ts->objects = eina_list_append(ts->objects, obj);
}
o->style = ts;
*obj_ts = ts;
_evas_textblock_invalidate_all(o);
_evas_textblock_changed(o, obj);
}
EAPI void
evas_object_textblock_style_set(Evas_Object *obj, Evas_Textblock_Style *ts)
{
TB_HEAD();
_textblock_style_generic_set(obj, ts, &(o->style));
}
EAPI const Evas_Textblock_Style *
evas_object_textblock_style_get(const Evas_Object *obj)
{
@ -4613,6 +4639,20 @@ evas_object_textblock_style_get(const Evas_Object *obj)
return o->style;
}
EAPI void
evas_object_textblock_style_user_set(Evas_Object *obj, Evas_Textblock_Style *ts)
{
TB_HEAD();
_textblock_style_generic_set(obj, ts, &(o->style_user));
}
EAPI const Evas_Textblock_Style *
evas_object_textblock_style_user_get(const Evas_Object *obj)
{
TB_HEAD_RETURN(NULL);
return o->style_user;
}
EAPI void
evas_object_textblock_replace_char_set(Evas_Object *obj, const char *ch)
{
@ -4902,7 +4942,7 @@ evas_object_textblock_text_markup_set(Evas_Object *obj, const char *text)
o->markup_text = NULL;
}
_nodes_clear(obj);
if (!o->style)
if (!o->style && !o->style_user)
{
if (text != o->markup_text)
{
@ -7241,7 +7281,13 @@ _evas_textblock_node_format_new(Evas_Object_Textblock *o, const char *_format)
}
}
match = _style_match_tag(o->style, format, format_len, &replace_len);
if (!o->style_user || !(match = _style_match_tag(o->style_user, format,
format_len, &replace_len)))
{
match = _style_match_tag(o->style, format, format_len,
&replace_len);
}
if (match)
{
if (match[0] != '-')