Canvas Text: continue porting api and fixup bugs

Also: This merges style user and normal style into a list with precedence. This
allows for more flexibility while keeping the API clean.

@feature
This commit is contained in:
Daniel Hirt 2016-06-07 17:16:34 +00:00 committed by Tom Hacohen
parent c297ff4115
commit ed512ea49e
6 changed files with 301 additions and 189 deletions

View File

@ -101,12 +101,12 @@ lib/evas/Evas.h \
lib/evas/Evas_Common.h \ lib/evas/Evas_Common.h \
lib/evas/Evas_Eo.h \ lib/evas/Evas_Eo.h \
lib/evas/Evas_Legacy.h \ lib/evas/Evas_Legacy.h \
lib/evas/Evas_Textblock_Legacy.h \
lib/evas/Evas_GL.h \ lib/evas/Evas_GL.h \
lib/evas/Evas_Loader.h lib/evas/Evas_Loader.h
installed_evascanvasheadersdir = $(includedir)/evas-@VMAJ@/canvas installed_evascanvasheadersdir = $(includedir)/evas-@VMAJ@/canvas
nodist_installed_evascanvasheaders_DATA = $(evas_eolian_pub_h) $(evas_eolian_legacy_h) nodist_installed_evascanvasheaders_DATA = $(evas_eolian_pub_h) $(evas_eolian_legacy_h)
dist_installed_evascanvasheaders_DATA = lib/evas/canvas/evas_textblock_legacy.h
noinst_DATA += $(evas_eolian_priv_h) noinst_DATA += $(evas_eolian_priv_h)
noinst_HEADERS += \ noinst_HEADERS += \

View File

@ -4496,7 +4496,7 @@ EAPI void evas_object_text_font_get(const Eo *obj, const char **font, Evas_Font_
* @} * @}
*/ */
#include "Evas_Textblock_Legacy.h" #include "canvas/evas_textblock_legacy.h"
/** /**
* @ingroup Evas_Object_Grid * @ingroup Evas_Object_Grid

View File

@ -4,21 +4,6 @@ class Efl.Canvas.Text (Evas.Object, Efl.Text)
{ {
legacy_prefix: evas_object_textblock; legacy_prefix: evas_object_textblock;
methods { methods {
@property valign {
[[The vertical alignment of text within the textblock object as a whole.
Normally alignment is 0.0 (top of object). Values given should
be between 0.0 and 1.0 (1.0 bottom of object, 0.5 being
vertically centered etc.).
@since 1.1
]]
set {}
get {}
values {
align: double; [[The alignment set for the object.]]
}
}
@property bidi_delimiters { @property bidi_delimiters {
[[BiDi delimiters are used for in-paragraph separation of bidi [[BiDi delimiters are used for in-paragraph separation of bidi
segments. This is useful for example in recipients fields of segments. This is useful for example in recipients fields of
@ -33,14 +18,6 @@ class Efl.Canvas.Text (Evas.Object, Efl.Text)
delim: string; [[A null terminated string of delimiters, e.g ",|" or $null if empty.]] delim: string; [[A null terminated string of delimiters, e.g ",|" or $null if empty.]]
} }
} }
@property replace_char {
[[The "replacement character" to use for the given textblock object.]]
set {}
get {}
values {
ch: string; [[The charset name.]]
}
}
@property legacy_newline { @property legacy_newline {
[[When true, newline character will behave as a paragraph separator. [[When true, newline character will behave as a paragraph separator.
@ -53,15 +30,27 @@ class Efl.Canvas.Text (Evas.Object, Efl.Text)
} }
} }
@property style { @property style {
[[The text style of the object]] [[The text style of the object.
$key is how you reference the style (for deletion or fetching). $NULL
as key indicates the style has the highest priority (default style).
The style priority is the order of creation, styles created first
are applied first with the exception of $NULL which is implicitly
first.
Set $style to $NULL to delete it.
]]
set { set {
legacy: null; legacy: null;
} }
get { get {
legacy: null; legacy: null;
} }
keys {
key: string; [[The name to the style. $NULL is the default style]]
}
values { values {
ts: string; [[The style.]] style: string; [[The style.]]
} }
} }
@property size_formatted { @property size_formatted {
@ -127,42 +116,13 @@ class Efl.Canvas.Text (Evas.Object, Efl.Text)
b: Evas.Coord; b: Evas.Coord;
} }
} }
style_user_pop { @property is_empty {
[[Del the from the top of the user style stack. [[Whether the object is empty (no text) or not]]
get {
See also @.style.get. legacy: null;
}
@since 1.2 values {
]] is_empty: bool; [[$true if empty]]
legacy: null;
}
style_user_peek @const {
[[Get (don't remove) the style at the top of the user style stack.
See also @.style.get.
@since 1.2
]]
legacy: null;
return: string; [[The style of the object.]]
}
style_user_push {
[[Push ts to the top of the user style stack.
FIXME: API is solid but currently only supports 1 style in the
stack.
The user style overrides the corresponding elements of the
regular style. This is the proper way to do theme overrides
in code.
See also @.style.set.
@since 1.2
]]
legacy: null;
params {
@in style: string; [[The style to set.]]
} }
} }
obstacle_add { obstacle_add {
@ -229,7 +189,7 @@ class Efl.Canvas.Text (Evas.Object, Efl.Text)
format: string; format: string;
} }
} }
annotation_in_range_get { range_annotations_get {
[[Returns an iterator of all the handles in a range. [[Returns an iterator of all the handles in a range.
@since 1.18 @since 1.18
@ -309,6 +269,30 @@ class Efl.Canvas.Text (Evas.Object, Efl.Text)
@in end: Efl.Canvas.Text.Cursor; [[Range end position.]] @in end: Efl.Canvas.Text.Cursor; [[Range end position.]]
} }
} }
range_text_get {
[[Returns the text in the range between $cur1 and $cur2.]]
legacy: null;
return: own(char*); [[The text in the given range.]]
params {
@in cur1: const(Efl.Canvas.Text.Cursor); [[Range start position.]]
@in cur2: const(Efl.Canvas.Text.Cursor); [[Range end position.]]
}
}
object_item_geometry_get {
[[Queries a given object item for its geometry
Note that the provided annotation should be an object item type.
]]
legacy: null;
params {
@in an: const(Efl.Canvas.Text.Annotation)*; [[Given annotation to query]]
@out x: Evas.Coord;
@out y: Evas.Coord;
@out w: Evas.Coord;
@out h: Evas.Coord;
}
return: bool; [[$true if given annotation is an object item, $false otherwise]]
}
} }
implements { implements {
Eo.Base.constructor; Eo.Base.constructor;

View File

@ -475,6 +475,7 @@ struct _Efl_Canvas_Text_Style
{ {
const char *style_text; const char *style_text;
char *default_tag; char *default_tag;
Eina_Stringshare *key; /* FIXME: Very hacky. */
Evas_Object_Style_Tag *tags; Evas_Object_Style_Tag *tags;
Eina_List *objects; Eina_List *objects;
Eina_Bool delete_me : 1; Eina_Bool delete_me : 1;
@ -503,9 +504,7 @@ struct _Efl_Canvas_Text_Annotation
struct _Evas_Object_Textblock struct _Evas_Object_Textblock
{ {
Evas_Textblock_Style *style; Evas_Textblock_Style *style;
Evas_Textblock_Style *style_user; Eina_List *styles;
Evas_Textblock_Style *current_style;
Evas_Textblock_Style *current_user_style;
Eo *cursor; Eo *cursor;
Eina_List *cursors; Eina_List *cursors;
Evas_Object_Textblock_Node_Text *text_nodes; Evas_Object_Textblock_Node_Text *text_nodes;
@ -1178,6 +1177,7 @@ static const char *backing_colorstr = NULL;
static const char *strikethrough_colorstr = NULL; static const char *strikethrough_colorstr = NULL;
static const char *alignstr = NULL; static const char *alignstr = NULL;
static const char *valignstr = NULL; static const char *valignstr = NULL;
static const char *text_valignstr = NULL;
static const char *wrapstr = NULL; static const char *wrapstr = NULL;
static const char *left_marginstr = NULL; static const char *left_marginstr = NULL;
static const char *right_marginstr = NULL; static const char *right_marginstr = NULL;
@ -1194,6 +1194,7 @@ static const char *itemstr = NULL;
static const char *linefillstr = NULL; static const char *linefillstr = NULL;
static const char *ellipsisstr = NULL; static const char *ellipsisstr = NULL;
static const char *passwordstr = NULL; static const char *passwordstr = NULL;
static const char *replacement_charstr = NULL;
static const char *underline_dash_widthstr = NULL; static const char *underline_dash_widthstr = NULL;
static const char *underline_dash_gapstr = NULL; static const char *underline_dash_gapstr = NULL;
static const char *underline_heightstr = NULL; static const char *underline_heightstr = NULL;
@ -1281,6 +1282,7 @@ _format_command_init(void)
strikethrough_colorstr = eina_stringshare_add("strikethrough_color"); strikethrough_colorstr = eina_stringshare_add("strikethrough_color");
alignstr = eina_stringshare_add("align"); alignstr = eina_stringshare_add("align");
valignstr = eina_stringshare_add("valign"); valignstr = eina_stringshare_add("valign");
text_valignstr = eina_stringshare_add("text_valign");
wrapstr = eina_stringshare_add("wrap"); wrapstr = eina_stringshare_add("wrap");
left_marginstr = eina_stringshare_add("left_margin"); left_marginstr = eina_stringshare_add("left_margin");
right_marginstr = eina_stringshare_add("right_margin"); right_marginstr = eina_stringshare_add("right_margin");
@ -1297,6 +1299,7 @@ _format_command_init(void)
linefillstr = eina_stringshare_add("linefill"); linefillstr = eina_stringshare_add("linefill");
ellipsisstr = eina_stringshare_add("ellipsis"); ellipsisstr = eina_stringshare_add("ellipsis");
passwordstr = eina_stringshare_add("password"); passwordstr = eina_stringshare_add("password");
replacement_charstr = eina_stringshare_add("replacement_char");
underline_dash_widthstr = eina_stringshare_add("underline_dash_width"); underline_dash_widthstr = eina_stringshare_add("underline_dash_width");
underline_dash_gapstr = eina_stringshare_add("underline_dash_gap"); underline_dash_gapstr = eina_stringshare_add("underline_dash_gap");
underline_heightstr = eina_stringshare_add("underline_height"); underline_heightstr = eina_stringshare_add("underline_height");
@ -1333,6 +1336,7 @@ _format_command_shutdown(void)
eina_stringshare_del(strikethrough_colorstr); eina_stringshare_del(strikethrough_colorstr);
eina_stringshare_del(alignstr); eina_stringshare_del(alignstr);
eina_stringshare_del(valignstr); eina_stringshare_del(valignstr);
eina_stringshare_del(text_valignstr);
eina_stringshare_del(wrapstr); eina_stringshare_del(wrapstr);
eina_stringshare_del(left_marginstr); eina_stringshare_del(left_marginstr);
eina_stringshare_del(right_marginstr); eina_stringshare_del(right_marginstr);
@ -1349,6 +1353,7 @@ _format_command_shutdown(void)
eina_stringshare_del(linefillstr); eina_stringshare_del(linefillstr);
eina_stringshare_del(ellipsisstr); eina_stringshare_del(ellipsisstr);
eina_stringshare_del(passwordstr); eina_stringshare_del(passwordstr);
eina_stringshare_del(replacement_charstr);
eina_stringshare_del(underline_dash_widthstr); eina_stringshare_del(underline_dash_widthstr);
eina_stringshare_del(underline_dash_gapstr); eina_stringshare_del(underline_dash_gapstr);
eina_stringshare_del(underline_heightstr); eina_stringshare_del(underline_heightstr);
@ -1894,6 +1899,15 @@ _format_command(Evas_Object *eo_obj, Evas_Object_Textblock_Format *fmt, const ch
else if (fmt->valign > 1.0) fmt->valign = 1.0; else if (fmt->valign > 1.0) fmt->valign = 1.0;
} }
} }
else if (cmd == text_valignstr)
{
Efl_Canvas_Text_Data *o = eo_data_scope_get(eo_obj, MY_CLASS);
char *endptr = NULL;
double val = strtod(param, &endptr);
o->valign = val;
if (o->valign < 0.0) o->valign = 0.0;
else if (o->valign > 1.0) o->valign = 1.0;
}
else if (cmd == wrapstr) else if (cmd == wrapstr)
{ {
/** /**
@ -2382,6 +2396,11 @@ _format_command(Evas_Object *eo_obj, Evas_Object_Textblock_Format *fmt, const ch
else if (len == 2 && !strcmp(param, "on")) else if (len == 2 && !strcmp(param, "on"))
fmt->password = 1; fmt->password = 1;
} }
else if (cmd == replacement_charstr)
{
Efl_Canvas_Text_Data *o = eo_data_scope_get(eo_obj, MY_CLASS);
eina_stringshare_replace(&o->repch, param);
}
else if (cmd == underline_dash_widthstr) else if (cmd == underline_dash_widthstr)
{ {
/** /**
@ -6007,6 +6026,8 @@ _layout(const Evas_Object *eo_obj, int w, int h, int *w_ret, int *h_ret)
/* Start of logical layout creation */ /* Start of logical layout creation */
/* setup default base style */ /* setup default base style */
{ {
Eina_List *itr;
Evas_Textblock_Style *style;
Eina_Bool finalize = EINA_FALSE; Eina_Bool finalize = EINA_FALSE;
if ((c->o->style) && (c->o->style->default_tag)) if ((c->o->style) && (c->o->style->default_tag))
{ {
@ -6015,14 +6036,17 @@ _layout(const Evas_Object *eo_obj, int w, int h, int *w_ret, int *h_ret)
finalize = EINA_TRUE; finalize = EINA_TRUE;
} }
if ((c->o->style_user) && (c->o->style_user->default_tag)) EINA_LIST_FOREACH(c->o->styles, itr, style)
{ {
if (!c->fmt) if ((style) && (style->default_tag))
{ {
c->fmt = _layout_format_push(c, NULL, NULL); if (!c->fmt)
{
c->fmt = _layout_format_push(c, NULL, NULL);
}
_format_fill(c->obj, c->fmt, style->default_tag);
finalize = EINA_TRUE;
} }
_format_fill(c->obj, c->fmt, c->o->style_user->default_tag);
finalize = EINA_TRUE;
} }
if (finalize) if (finalize)
@ -6346,6 +6370,7 @@ evas_textblock_style_free(Evas_Textblock_Style *ts)
return; return;
} }
_style_clear(ts); _style_clear(ts);
eina_stringshare_del(ts->key);
free(ts); free(ts);
} }
@ -6502,10 +6527,18 @@ evas_textblock_style_get(const Evas_Textblock_Style *ts)
static const char * static const char *
_textblock_format_node_from_style_tag(Efl_Canvas_Text_Data *o, Evas_Object_Textblock_Node_Format *fnode, const char *format, size_t format_len) _textblock_format_node_from_style_tag(Efl_Canvas_Text_Data *o, Evas_Object_Textblock_Node_Format *fnode, const char *format, size_t format_len)
{ {
const char *match; Eina_List *itr;
Evas_Textblock_Style *style;
const char *match = NULL;
size_t replace_len; size_t replace_len;
if (!o->style_user || !(match = _style_match_tag(o->style_user, format, EINA_LIST_REVERSE_FOREACH(o->styles, itr, style)
format_len, &replace_len))) {
match = _style_match_tag(style, format, format_len, &replace_len);
if (match)
break;
}
if (!match)
{ {
match = _style_match_tag(o->style, format, format_len, match = _style_match_tag(o->style, format, format_len,
&replace_len); &replace_len);
@ -6597,23 +6630,74 @@ evas_object_textblock_style_set(Eo *eo_obj, const Evas_Textblock_Style *ts)
_textblock_style_generic_set(eo_obj, (Evas_Textblock_Style *) ts, &(o->style)); _textblock_style_generic_set(eo_obj, (Evas_Textblock_Style *) ts, &(o->style));
} }
EOLIAN static void static Evas_Textblock_Style *
_efl_canvas_text_style_set(Eo *eo_obj, Efl_Canvas_Text_Data *o, const char *style) _style_by_key_find(Efl_Canvas_Text_Data *o, const char *key)
{ {
Eina_List *itr;
Evas_Textblock_Style *style;
if (!key)
return o->style;
EINA_LIST_FOREACH(o->styles, itr, style)
{
if (!strcmp(style->key, key))
return style;
}
return NULL;
}
EOLIAN static void
_efl_canvas_text_style_set(Eo *eo_obj, Efl_Canvas_Text_Data *o, const char *key, const char *style)
{
// FIXME: Make key value behaviour.
Evas_Object_Protected_Data *obj = eo_data_scope_get(eo_obj, EVAS_OBJECT_CLASS); Evas_Object_Protected_Data *obj = eo_data_scope_get(eo_obj, EVAS_OBJECT_CLASS);
evas_object_async_block(obj); evas_object_async_block(obj);
if (!o->current_style) Evas_Textblock_Style *ts;
ts = _style_by_key_find(o, key);
if (!ts && !style)
return;
if (ts && !style)
{ {
Evas_Textblock_Style *ts = evas_textblock_style_new(); if (!key)
evas_textblock_style_set(ts, style); {
_textblock_style_generic_set(eo_obj, (Evas_Textblock_Style *) ts, &(o->style)); evas_textblock_style_set(ts, "");
o->current_style = ts; }
else
{
o->styles = eina_list_remove(o->styles, ts);
evas_textblock_style_free(ts);
}
goto end;
}
else if (!ts)
{
Evas_Textblock_Style *tmp = NULL;
ts = evas_textblock_style_new();
_textblock_style_generic_set(eo_obj, ts, &tmp);
}
evas_textblock_style_set(ts, style);
if (!key)
{
o->style = ts;
} }
else else
{ {
evas_textblock_style_set(o->current_style, style); ts->key = eina_stringshare_add(key);
o->styles = eina_list_append(o->styles, ts);
} }
end:
o->format_changed = EINA_TRUE;
_evas_textblock_invalidate_all(o);
_evas_textblock_changed(o, eo_obj);
} }
EAPI Evas_Textblock_Style * EAPI Evas_Textblock_Style *
@ -6626,37 +6710,31 @@ evas_object_textblock_style_get(const Eo *eo_obj EINA_UNUSED)
} }
EOLIAN static const char * EOLIAN static const char *
_efl_canvas_text_style_get(Eo *eo_obj EINA_UNUSED, Efl_Canvas_Text_Data *o) _efl_canvas_text_style_get(Eo *eo_obj EINA_UNUSED, Efl_Canvas_Text_Data *o, const char *key)
{ {
return o->style->style_text; Evas_Textblock_Style *ts = _style_by_key_find(o, key);
return ts->style_text;
} }
#define _STYLE_USER "_style_user"
EAPI void EAPI void
evas_object_textblock_style_user_push(Eo *eo_obj, Evas_Textblock_Style *ts) evas_object_textblock_style_user_push(Eo *eo_obj, Evas_Textblock_Style *ts)
{ {
Evas_Object_Protected_Data *obj = eo_data_scope_get(eo_obj, EVAS_OBJECT_CLASS);
evas_object_async_block(obj);
Efl_Canvas_Text_Data *o = eo_data_scope_get(eo_obj, MY_CLASS); Efl_Canvas_Text_Data *o = eo_data_scope_get(eo_obj, MY_CLASS);
_textblock_style_generic_set(eo_obj, ts, &(o->style_user));
}
EOLIAN static void
_efl_canvas_text_style_user_push(Eo *eo_obj, Efl_Canvas_Text_Data *o, const char *style)
{
Evas_Object_Protected_Data *obj = eo_data_scope_get(eo_obj, EVAS_OBJECT_CLASS); Evas_Object_Protected_Data *obj = eo_data_scope_get(eo_obj, EVAS_OBJECT_CLASS);
evas_object_async_block(obj); evas_object_async_block(obj);
if (!o->current_user_style) Evas_Textblock_Style *old_ts = _style_by_key_find(o, _STYLE_USER);
if (old_ts)
{ {
Evas_Textblock_Style *ts = evas_textblock_style_new(); efl_canvas_text_style_set(eo_obj, _STYLE_USER, NULL);
evas_textblock_style_set(ts, style);
_textblock_style_generic_set(eo_obj, (Evas_Textblock_Style *) ts, &(o->style_user));
o->current_user_style = ts;
}
else
{
evas_textblock_style_set(o->current_user_style, style);
} }
Evas_Textblock_Style *tmp = NULL;
_textblock_style_generic_set(eo_obj, ts, &tmp);
ts->key = eina_stringshare_add(_STYLE_USER);
o->styles = eina_list_append(o->styles, ts);
} }
EAPI const Evas_Textblock_Style* EAPI const Evas_Textblock_Style*
@ -6665,13 +6743,8 @@ evas_object_textblock_style_user_peek(const Eo *eo_obj)
Evas_Object_Protected_Data *obj = eo_data_scope_get(eo_obj, EVAS_OBJECT_CLASS); Evas_Object_Protected_Data *obj = eo_data_scope_get(eo_obj, EVAS_OBJECT_CLASS);
evas_object_async_block(obj); evas_object_async_block(obj);
Efl_Canvas_Text_Data *o = eo_data_scope_get(eo_obj, MY_CLASS); Efl_Canvas_Text_Data *o = eo_data_scope_get(eo_obj, MY_CLASS);
return o->style_user; Evas_Textblock_Style *ts = _style_by_key_find(o, _STYLE_USER);
} return ts;
EOLIAN static const char *
_efl_canvas_text_style_user_peek(const Eo *eo_obj EINA_UNUSED, Efl_Canvas_Text_Data *o)
{
return o->style_user ? o->style_user->style_text : NULL;
} }
EAPI void EAPI void
@ -6679,30 +6752,14 @@ evas_object_textblock_style_user_pop(Eo *eo_obj)
{ {
Evas_Object_Protected_Data *obj = eo_data_scope_get(eo_obj, EVAS_OBJECT_CLASS); Evas_Object_Protected_Data *obj = eo_data_scope_get(eo_obj, EVAS_OBJECT_CLASS);
evas_object_async_block(obj); evas_object_async_block(obj);
efl_canvas_text_style_set(eo_obj, _STYLE_USER, NULL);
}
EAPI void
evas_object_textblock_replace_char_set(Efl_Canvas_Text *eo_obj, const char *ch)
{
Efl_Canvas_Text_Data *o = eo_data_scope_get(eo_obj, MY_CLASS); Efl_Canvas_Text_Data *o = eo_data_scope_get(eo_obj, MY_CLASS);
_textblock_style_generic_set(eo_obj, NULL, &(o->style_user));
}
EOLIAN static void
_efl_canvas_text_style_user_pop(Eo *eo_obj, Efl_Canvas_Text_Data *o)
{
Evas_Object_Protected_Data *obj = eo_data_scope_get(eo_obj, EVAS_OBJECT_CLASS);
evas_object_async_block(obj);
_textblock_style_generic_set(eo_obj, NULL, &(o->style_user));
if (o->current_user_style)
{
// XXX: remember that the current implementation of user style is still
// lacking as we don't really manage a stack.
// Until that's fixed, we are treating it as there can be only one
// user style.
evas_textblock_style_free(o->current_user_style);
o->current_user_style = NULL;
}
}
EOLIAN static void
_efl_canvas_text_replace_char_set(Eo *eo_obj, Efl_Canvas_Text_Data *o, const char *ch)
{
Evas_Object_Protected_Data *obj = eo_data_scope_get(eo_obj, EVAS_OBJECT_CLASS); Evas_Object_Protected_Data *obj = eo_data_scope_get(eo_obj, EVAS_OBJECT_CLASS);
evas_object_async_block(obj); evas_object_async_block(obj);
if (o->repch) eina_stringshare_del(o->repch); if (o->repch) eina_stringshare_del(o->repch);
@ -6712,6 +6769,7 @@ _efl_canvas_text_replace_char_set(Eo *eo_obj, Efl_Canvas_Text_Data *o, const cha
_evas_textblock_changed(o, eo_obj); _evas_textblock_changed(o, eo_obj);
} }
EOLIAN static void EOLIAN static void
_efl_canvas_text_legacy_newline_set(Eo *eo_obj EINA_UNUSED, Efl_Canvas_Text_Data *o, Eina_Bool mode) _efl_canvas_text_legacy_newline_set(Eo *eo_obj EINA_UNUSED, Efl_Canvas_Text_Data *o, Eina_Bool mode)
{ {
@ -6731,9 +6789,16 @@ _efl_canvas_text_legacy_newline_get(Eo *eo_obj EINA_UNUSED, Efl_Canvas_Text_Data
return o->legacy_newline; return o->legacy_newline;
} }
EOLIAN static void EOLIAN static Eina_Bool
_efl_canvas_text_valign_set(Eo *eo_obj, Efl_Canvas_Text_Data *o, double align) _efl_canvas_text_is_empty_get(Eo *eo_obj EINA_UNUSED, Efl_Canvas_Text_Data *o)
{ {
return !o->text_nodes || (eina_ustrbuf_length_get(o->text_nodes->unicode) == 0);
}
EAPI void
evas_object_textblock_valign_set(Efl_Canvas_Text *eo_obj, double align)
{
Efl_Canvas_Text_Data *o = eo_data_scope_get(eo_obj, MY_CLASS);
Evas_Object_Protected_Data *obj = eo_data_scope_get(eo_obj, EVAS_OBJECT_CLASS); Evas_Object_Protected_Data *obj = eo_data_scope_get(eo_obj, EVAS_OBJECT_CLASS);
evas_object_async_block(obj); evas_object_async_block(obj);
if (align < 0.0) align = 0.0; if (align < 0.0) align = 0.0;
@ -6743,9 +6808,10 @@ _efl_canvas_text_valign_set(Eo *eo_obj, Efl_Canvas_Text_Data *o, double align)
_evas_textblock_changed(o, eo_obj); _evas_textblock_changed(o, eo_obj);
} }
EOLIAN static double EAPI double
_efl_canvas_text_valign_get(Eo *eo_obj EINA_UNUSED, Efl_Canvas_Text_Data *o) evas_object_textblock_valign_get(const Efl_Canvas_Text *obj)
{ {
Efl_Canvas_Text_Data *o = eo_data_scope_get(obj, MY_CLASS);
return o->valign; return o->valign;
} }
@ -6763,9 +6829,10 @@ _efl_canvas_text_bidi_delimiters_get(Eo *eo_obj EINA_UNUSED, Efl_Canvas_Text_Dat
return o->bidi_delimiters; return o->bidi_delimiters;
} }
EOLIAN static const char* EAPI const char *
_efl_canvas_text_replace_char_get(Eo *eo_obj EINA_UNUSED, Efl_Canvas_Text_Data *o) evas_object_textblock_replace_char_get(const Efl_Canvas_Text *obj)
{ {
Efl_Canvas_Text_Data *o = eo_data_scope_get(obj, MY_CLASS);
return o->repch; return o->repch;
} }
@ -10126,26 +10193,32 @@ evas_textblock_cursor_format_append(Evas_Textblock_Cursor *cur_obj, const char *
return _evas_textblock_cursor_format_append(cur, format, NULL, EINA_FALSE); return _evas_textblock_cursor_format_append(cur, format, NULL, EINA_FALSE);
} }
EAPI Eina_Bool static Eina_Bool
evas_textblock_cursor_format_prepend(Evas_Textblock_Cursor *cur_obj, const char *format) _evas_textblock_cursor_format_prepend(Efl_Canvas_Text_Cursor_Data *cur, const char *format)
{ {
Eina_Bool is_visible; Eina_Bool is_visible;
Efl_Canvas_Text_Cursor_Data *cur = eo_data_scope_get(cur_obj, EFL_CANVAS_TEXT_CURSOR_CLASS);
if (!cur) return EINA_FALSE; if (!cur) return EINA_FALSE;
Evas_Object_Protected_Data *obj = eo_data_scope_get(cur->obj, EVAS_OBJECT_CLASS); Evas_Object_Protected_Data *obj = eo_data_scope_get(cur->obj, EVAS_OBJECT_CLASS);
evas_object_async_block(obj); evas_object_async_block(obj);
/* append is essentially prepend without advancing */ /* append is essentially prepend without advancing */
is_visible = evas_textblock_cursor_format_append(cur_obj, format); is_visible = _evas_textblock_cursor_format_append(cur, format, NULL, EINA_FALSE);
if (is_visible) if (is_visible)
{ {
/* Advance after the replacement char */ /* Advance after the replacement char */
evas_textblock_cursor_char_next(cur_obj); _evas_textblock_cursor_char_next(cur);
} }
return is_visible; return is_visible;
} }
EAPI Eina_Bool
evas_textblock_cursor_format_prepend(Evas_Textblock_Cursor *cur_obj, const char *format)
{
Efl_Canvas_Text_Cursor_Data *cur = eo_data_scope_get(cur_obj, EFL_CANVAS_TEXT_CURSOR_CLASS);
return _evas_textblock_cursor_format_prepend(cur, format);
}
static void static void
_evas_textblock_cursor_char_delete(Efl_Canvas_Text_Cursor_Data *cur) _evas_textblock_cursor_char_delete(Efl_Canvas_Text_Cursor_Data *cur)
{ {
@ -10647,6 +10720,7 @@ _evas_textblock_cursor_range_text_get(const Efl_Canvas_Text_Cursor_Data *cur1, c
return NULL; /* Not yet supported */ return NULL; /* Not yet supported */
} }
EAPI char * EAPI char *
evas_textblock_cursor_range_text_get(const Efl_Canvas_Text_Cursor *cur1_obj, const Evas_Textblock_Cursor *cur2_obj, Evas_Textblock_Text_Type format) evas_textblock_cursor_range_text_get(const Efl_Canvas_Text_Cursor *cur1_obj, const Evas_Textblock_Cursor *cur2_obj, Evas_Textblock_Text_Type format)
{ {
@ -10655,6 +10729,17 @@ evas_textblock_cursor_range_text_get(const Efl_Canvas_Text_Cursor *cur1_obj, con
return _evas_textblock_cursor_range_text_get(cur1, cur2, format); return _evas_textblock_cursor_range_text_get(cur1, cur2, format);
} }
static EOLIAN char *
_efl_canvas_text_range_text_get(Eo *eo_obj EINA_UNUSED,
Efl_Canvas_Text_Data *pd EINA_UNUSED,
const Efl_Canvas_Text_Cursor *cur1_obj,
const Evas_Textblock_Cursor *cur2_obj)
{
const Efl_Canvas_Text_Cursor_Data *cur1 = eo_data_scope_get(cur1_obj, EFL_CANVAS_TEXT_CURSOR_CLASS);
const Efl_Canvas_Text_Cursor_Data *cur2 = eo_data_scope_get(cur2_obj, EFL_CANVAS_TEXT_CURSOR_CLASS);
return _evas_textblock_cursor_range_text_get(cur1, cur2, EVAS_TEXTBLOCK_TEXT_PLAIN);
}
EAPI const char * EAPI const char *
evas_textblock_cursor_paragraph_text_get(const Evas_Textblock_Cursor *cur_obj) evas_textblock_cursor_paragraph_text_get(const Evas_Textblock_Cursor *cur_obj)
{ {
@ -12048,15 +12133,14 @@ evas_textblock_cursor_range_geometry_get(const Efl_Canvas_Text_Cursor *cur1_obj,
return rects; return rects;
} }
EAPI Eina_Bool static Eina_Bool
evas_textblock_cursor_format_item_geometry_get(const Evas_Textblock_Cursor *cur_obj, Evas_Coord *cx, Evas_Coord *cy, Evas_Coord *cw, Evas_Coord *ch) _evas_textblock_cursor_format_item_geometry_get(const Efl_Canvas_Text_Cursor_Data *cur, Evas_Coord *cx, Evas_Coord *cy, Evas_Coord *cw, Evas_Coord *ch)
{ {
Evas_Object_Textblock_Line *ln = NULL; Evas_Object_Textblock_Line *ln = NULL;
Evas_Object_Textblock_Format_Item *fi; Evas_Object_Textblock_Format_Item *fi;
Evas_Object_Textblock_Item *it = NULL; Evas_Object_Textblock_Item *it = NULL;
Evas_Coord x, y, w, h; Evas_Coord x, y, w, h;
Efl_Canvas_Text_Cursor_Data *cur = eo_data_scope_get(cur_obj, EFL_CANVAS_TEXT_CURSOR_CLASS);
if (!cur || !_evas_textblock_cursor_format_is_visible_get(cur)) return EINA_FALSE; if (!cur || !_evas_textblock_cursor_format_is_visible_get(cur)) return EINA_FALSE;
Evas_Object_Protected_Data *obj = eo_data_scope_get(cur->obj, EVAS_OBJECT_CLASS); Evas_Object_Protected_Data *obj = eo_data_scope_get(cur->obj, EVAS_OBJECT_CLASS);
evas_object_async_block(obj); evas_object_async_block(obj);
@ -12080,6 +12164,13 @@ evas_textblock_cursor_format_item_geometry_get(const Evas_Textblock_Cursor *cur_
return EINA_TRUE; return EINA_TRUE;
} }
EAPI Eina_Bool
evas_textblock_cursor_format_item_geometry_get(const Evas_Textblock_Cursor *cur_obj, Evas_Coord *cx, Evas_Coord *cy, Evas_Coord *cw, Evas_Coord *ch)
{
Efl_Canvas_Text_Cursor_Data *cur = eo_data_scope_get(cur_obj, EFL_CANVAS_TEXT_CURSOR_CLASS);
return _evas_textblock_cursor_format_item_geometry_get(cur, cx, cy, cw, ch);
}
EAPI Eina_Bool EAPI Eina_Bool
evas_textblock_cursor_eol_get(const Evas_Textblock_Cursor *cur_obj) evas_textblock_cursor_eol_get(const Evas_Textblock_Cursor *cur_obj)
{ {
@ -12558,12 +12649,6 @@ evas_object_textblock_free(Evas_Object *eo_obj)
_dicts_hyphen_detach(eo_obj); _dicts_hyphen_detach(eo_obj);
} }
#endif #endif
/* free the style if exists */
if (o->current_style)
{
evas_textblock_style_free(o->current_style);
}
} }
static void static void
@ -13447,9 +13532,9 @@ _efl_canvas_text_cursor_text_append(Efl_Canvas_Text_Cursor_Data *cur,
/* We make use of prepending the cursor, but this needs to return the current /* We make use of prepending the cursor, but this needs to return the current
* position's cursor, so we use a temporary one. */ * position's cursor, so we use a temporary one. */
Evas_Textblock_Cursor *cur2_obj = evas_object_textblock_cursor_new (cur->obj); Efl_Canvas_Text_Cursor_Data cur2;
Efl_Canvas_Text_Cursor_Data *cur2 = eo_data_scope_get(cur2_obj, EFL_CANVAS_TEXT_CURSOR_CLASS); _evas_textblock_cursor_init(&cur2, cur->obj);
_evas_textblock_cursor_copy(cur2, cur); _evas_textblock_cursor_copy(&cur2, cur);
Evas_Object_Protected_Data *obj = eo_data_scope_get(cur->obj, EVAS_OBJECT_CLASS); Evas_Object_Protected_Data *obj = eo_data_scope_get(cur->obj, EVAS_OBJECT_CLASS);
evas_object_async_block(obj); evas_object_async_block(obj);
@ -13472,8 +13557,8 @@ _efl_canvas_text_cursor_text_append(Efl_Canvas_Text_Cursor_Data *cur,
if (format) if (format)
{ {
len += _prepend_text_run2(cur2, text, off); len += _prepend_text_run2(&cur2, text, off);
if (evas_textblock_cursor_format_prepend(cur2_obj, format)) if (_evas_textblock_cursor_format_prepend(&cur2, format))
{ {
len++; len++;
} }
@ -13481,8 +13566,7 @@ _efl_canvas_text_cursor_text_append(Efl_Canvas_Text_Cursor_Data *cur,
} }
off += n; off += n;
} }
len += _prepend_text_run2(cur2, text, off); len += _prepend_text_run2(&cur2, text, off);
eo_del(cur2_obj);
return len; return len;
} }
@ -13490,13 +13574,11 @@ EOLIAN static void
_efl_canvas_text_efl_text_text_set(Eo *eo_obj, Efl_Canvas_Text_Data *o EINA_UNUSED, _efl_canvas_text_efl_text_text_set(Eo *eo_obj, Efl_Canvas_Text_Data *o EINA_UNUSED,
const char *text) const char *text)
{ {
Evas_Textblock_Cursor *cur_obj; Efl_Canvas_Text_Cursor_Data cur;
evas_object_textblock_text_markup_set(eo_obj, ""); evas_object_textblock_text_markup_set(eo_obj, "");
cur_obj = evas_object_textblock_cursor_new(eo_obj); _evas_textblock_cursor_init(&cur, eo_obj);
Efl_Canvas_Text_Cursor_Data *cur = eo_data_scope_get(cur_obj, EFL_CANVAS_TEXT_CURSOR_CLASS); _efl_canvas_text_cursor_text_append(&cur, text);
_efl_canvas_text_cursor_text_append(cur, text);
eo_del(cur_obj);
} }
EOLIAN static const char * EOLIAN static const char *
@ -13861,7 +13943,7 @@ _efl_canvas_text_annotation_insert(Eo *eo_obj, Efl_Canvas_Text_Data *o,
} }
EOLIAN static Eina_Iterator * EOLIAN static Eina_Iterator *
_efl_canvas_text_annotation_in_range_get(Eo *eo_obj EINA_UNUSED, Efl_Canvas_Text_Data *o EINA_UNUSED, _efl_canvas_text_range_annotations_get(Eo *eo_obj EINA_UNUSED, Efl_Canvas_Text_Data *o EINA_UNUSED,
const Evas_Textblock_Cursor *start_obj, const Evas_Textblock_Cursor *end_obj) const Evas_Textblock_Cursor *start_obj, const Evas_Textblock_Cursor *end_obj)
{ {
Eina_List *lst = NULL; Eina_List *lst = NULL;
@ -13906,7 +13988,7 @@ _efl_canvas_text_cursor_object_item_annotation_get(Eo *cur_obj EINA_UNUSED,
Eina_Iterator *it; Eina_Iterator *it;
Efl_Canvas_Text_Annotation *data, *ret = NULL; Efl_Canvas_Text_Annotation *data, *ret = NULL;
it = efl_canvas_text_annotation_in_range_get(cur->obj, it = efl_canvas_text_range_annotations_get(cur->obj,
cur_obj, cur_obj); cur_obj, cur_obj);
EINA_ITERATOR_FOREACH(it, data) EINA_ITERATOR_FOREACH(it, data)
{ {
@ -13920,6 +14002,21 @@ _efl_canvas_text_cursor_object_item_annotation_get(Eo *cur_obj EINA_UNUSED,
return ret; return ret;
} }
EOLIAN static Eina_Bool
_efl_canvas_text_object_item_geometry_get(Eo *eo_obj, Efl_Canvas_Text_Data *o EINA_UNUSED,
const Efl_Canvas_Text_Annotation *an, Evas_Coord *cx, Evas_Coord *cy, Evas_Coord *cw, Evas_Coord *ch)
{
Efl_Canvas_Text_Cursor_Data cur;
Evas_Object_Protected_Data *obj = eo_data_scope_get(eo_obj, EVAS_OBJECT_CLASS);
evas_object_async_block(obj);
_relayout_if_needed(eo_obj, o);
_evas_textblock_cursor_init(&cur, eo_obj);
_textblock_cursor_pos_at_fnode_set(eo_obj, &cur, an->start_node);
return _evas_textblock_cursor_format_item_geometry_get(&cur, cx, cy, cw, ch);
}
/** /**
* @} * @}
*/ */

View File

@ -860,6 +860,54 @@ EAPI void evas_textblock_cursor_free(Evas_Textblock_Cursor *cur);
EAPI int evas_textblock_cursor_text_append(Evas_Textblock_Cursor *cur, const char *_text); EAPI int evas_textblock_cursor_text_append(Evas_Textblock_Cursor *cur, const char *_text);
/**
* @brief The "replacement character" to use for the given textblock object.
*
* @param[in] ch The charset name.
*
* @ingroup Efl_Canvas_Text
*/
EAPI void evas_object_textblock_replace_char_set(Evas_Object *obj, const char *ch);
/**
* @brief The "replacement character" to use for the given textblock object.
*
* @return The charset name.
*
* @ingroup Efl_Canvas_Text
*/
EAPI const char *evas_object_textblock_replace_char_get(const Evas_Object *obj);
/**
* @brief The vertical alignment of text within the textblock object as a
* whole.
*
* Normally alignment is 0.0 (top of object). Values given should be between
* 0.0 and 1.0 (1.0 bottom of object, 0.5 being vertically centered etc.).
*
* @param[in] align The alignment set for the object.
*
* @since 1.1
*
* @ingroup Efl_Canvas_Text
*/
EAPI void evas_object_textblock_valign_set(Evas_Object *obj, double align);
/**
* @brief The vertical alignment of text within the textblock object as a
* whole.
*
* Normally alignment is 0.0 (top of object). Values given should be between
* 0.0 and 1.0 (1.0 bottom of object, 0.5 being vertically centered etc.).
*
* @return The alignment set for the object.
*
* @since 1.1
*
* @ingroup Efl_Canvas_Text
*/
EAPI double evas_object_textblock_valign_get(const Evas_Object *obj);
#include "canvas/efl_canvas_text_cursor.eo.legacy.h" #include "canvas/efl_canvas_text_cursor.eo.legacy.h"
#include "canvas/efl_canvas_text.eo.legacy.h" #include "canvas/efl_canvas_text.eo.legacy.h"
/** /**

View File

@ -4058,7 +4058,7 @@ _test_check_annotation(Evas_Object *tb,
evas_textblock_cursor_pos_set(end, end_pos); evas_textblock_cursor_pos_set(end, end_pos);
Eina_Iterator *it = Eina_Iterator *it =
efl_canvas_text_annotation_in_range_get(tb, start, end); efl_canvas_text_range_annotations_get(tb, start, end);
evas_textblock_cursor_free(start); evas_textblock_cursor_free(start);
evas_textblock_cursor_free(end); evas_textblock_cursor_free(end);
@ -4277,51 +4277,34 @@ START_TEST(efl_canvas_text_style)
{ {
START_TB_TEST(); START_TB_TEST();
Eo *start, *end;
Evas_Coord w; Evas_Coord w;
Evas_Coord bw; Evas_Coord bw;
const char *buf; const char *buf;
buf = buf = "DEFAULT='font=Sans font_size=12 color=#fff wrap=word'";
"DEFAULT='font=Sans font_size=12 color=#fff wrap=word text_class=entry'"
"br='\n'"
"ps='ps'"
"tab='\t'";
efl_canvas_text_style_set(tb, buf); efl_canvas_text_style_set(tb, buf);
ck_assert_str_eq(efl_canvas_text_style_get(tb), buf); ck_assert_str_eq(efl_canvas_text_style_get(tb), buf);
buf = buf = "font=Sans font_size=12 color=#fff";
"DEFAULT='font=Sans font_size=12 color=#fff'"
"c='color=#000'"
"ps='br'"
"tab='\t'";
efl_canvas_text_style_set(tb, buf); efl_canvas_text_style_set(tb, buf);
ck_assert_str_eq(efl_canvas_text_style_get(tb), buf); ck_assert_str_eq(efl_canvas_text_style_get(tb), buf);
efl_text_set(tb, "hello world"); efl_text_set(tb, "hello world");
start = evas_object_textblock_cursor_new(tb);
end = evas_object_textblock_cursor_new(tb);
evas_textblock_cursor_pos_set(start, 0);
evas_textblock_cursor_pos_set(end, 4);
efl_canvas_text_annotation_insert(tb, start, end, "sz"); buf = "font=Sans font_size=12 color=#fff";
buf =
"DEFAULT='font=Sans font_size=12 color=#fff'";
efl_canvas_text_style_set(tb, buf); efl_canvas_text_style_set(tb, buf);
evas_object_textblock_size_native_get(tb, &bw, NULL); evas_object_textblock_size_native_get(tb, &bw, NULL);
buf = buf = "font=Sans font_size=16 color=#fff";
"DEFAULT='font=Sans font_size=16 color=#fff'";
efl_canvas_text_style_set(tb, buf); efl_canvas_text_style_set(tb, buf);
evas_object_textblock_size_native_get(tb, &w, NULL); evas_object_textblock_size_native_get(tb, &w, NULL);
ck_assert_int_gt(w, bw); ck_assert_int_gt(w, bw);
bw = w; bw = w;
buf = "DEFAULT='left_margin=4 right_margin=4'"; buf = "left_margin=4 right_margin=4";
efl_canvas_text_style_user_push(tb, buf); efl_canvas_text_style_user_push(tb, buf);
ck_assert_str_eq(efl_canvas_text_style_user_peek(tb), buf); ck_assert_str_eq(efl_canvas_text_style_user_peek(tb), buf);
evas_object_textblock_size_native_get(tb, &w, NULL); evas_object_textblock_size_native_get(tb, &w, NULL);