evas textblock: fixed ellipsis character cut off issue with complex markup text.

Summary:
Evas Textblock ellipsis is handled in a item.
When the ellipsis item is added in the text, some characters are cut off
considering width of ellipsis character.
But, it is handled in only one text item.
If there are many short text item, the ellipsis item can be cut off visually.
And there was a bug in the patch when text is displayed in two lines or more.
The bug is also fixed.

Fixes Phab ticket T1213

@fix

Test Plan: This commit includes test case.

Reviewers: woohyun, seoz, sohyun, tasn, raster

Subscribers: cedric, herdsman

Differential Revision: https://phab.enlightenment.org/D1360
This commit is contained in:
Youngbok Shin 2014-09-02 11:42:32 +01:00 committed by Tom Hacohen
parent 5e063b37a2
commit 15281561e5
2 changed files with 80 additions and 14 deletions

View File

@ -4375,7 +4375,7 @@ _layout_ellipsis_item_new(Ctxt *c, const Evas_Object_Textblock_Item *cur_it)
static inline void
_layout_handle_ellipsis(Ctxt *c, Evas_Object_Textblock_Item *it, Eina_List *i)
{
Evas_Object_Textblock_Text_Item *ellip_ti;
Evas_Object_Textblock_Text_Item *ti, *ellip_ti;
Evas_Object_Textblock_Item *last_it;
Evas_Coord save_cx;
int wrap;
@ -4385,26 +4385,72 @@ _layout_handle_ellipsis(Ctxt *c, Evas_Object_Textblock_Item *it, Eina_List *i)
save_cx = c->x;
c->w -= ellip_ti->parent.w;
if (it->type == EVAS_TEXTBLOCK_ITEM_TEXT)
/* If there is no enough space for ellipsis item, remove all of items */
if (c->w <= 0)
{
Evas_Object_Textblock_Text_Item *ti = _ITEM_TEXT(it);
wrap = _layout_text_cutoff_get(c, last_it->format, ti);
if ((wrap > 0) && !IS_AT_END(ti, (size_t) wrap))
{
_layout_item_text_split_strip_white(c, ti, i, wrap);
}
else if ((wrap == 0) && (c->ln->items))
while (c->ln->items)
{
last_it = _ITEM(EINA_INLIST_GET(c->ln->items)->last);
c->ln->items = _ITEM(eina_inlist_remove(
EINA_INLIST_GET(c->ln->items),
EINA_INLIST_GET(last_it)));
}
}
else if (it->type == EVAS_TEXTBLOCK_ITEM_FORMAT)
{
/* We don't want to add this format item. */
last_it = NULL;
}
while (last_it)
{
if (last_it->type == EVAS_TEXTBLOCK_ITEM_TEXT)
{
ti = _ITEM_TEXT(last_it);
wrap = _layout_text_cutoff_get(c, last_it->format, ti);
if ((wrap > 0) && !IS_AT_END(ti, (size_t) wrap))
{
_layout_item_text_split_strip_white(c, ti, i, wrap);
break;
}
else if (wrap < 0)
{
break;
}
}
else
{
/* We will ignore format items. ex) tab
* But, if there is <item> tag and size is acceptable, we have to insert it to line. */
if (!strncmp(_ITEM_FORMAT(last_it)->item, "item", 4) &&
((c->w - c->o->style_pad.l - c->o->style_pad.r - c->marginl - c->marginr) >= (c->x + last_it->adv)))
{
break;
}
}
if (c->ln->items && last_it != it)
{
c->ln->items = _ITEM(eina_inlist_remove(
EINA_INLIST_GET(c->ln->items),
EINA_INLIST_GET(last_it)));
}
last_it = (c->ln->items) ? _ITEM(EINA_INLIST_GET(c->ln->items)->last) : NULL;
if (last_it)
{
/* We need to renew ellipsis item.
* Because, base format is changed to last_it.
* We can't reuse it. */
c->w += ellip_ti->parent.w;
ellip_ti = _layout_ellipsis_item_new(c, last_it);
c->w -= ellip_ti->parent.w;
c->x -= last_it->adv;
if (c->x < 0)
c->x = 0;
save_cx = c->x;
}
}
c->x = save_cx;
c->w += ellip_ti->parent.w;
/* If we should add this item, do it */

View File

@ -1763,6 +1763,26 @@ START_TEST(evas_textblock_wrapping)
evas_object_textblock_size_formatted_get(tb, &w, &h);
ck_assert_int_le(w, (nw / 2));
evas_object_textblock_text_markup_set(tb, "a<b>b</b>a<b>b</b>a<b>b</b>");
evas_textblock_cursor_format_prepend(cur, "+ font_size=50 ellipsis=1.0");
evas_object_textblock_size_native_get(tb, &nw, &nh);
evas_object_resize(tb, nw / 2, nh * 2);
evas_object_textblock_size_formatted_get(tb, &w, &h);
ck_assert_int_le(w, (nw / 2));
evas_object_textblock_text_markup_set(tb, "<item absize=100x100 href=item1></item><item absize=100x100 href=item2></item>");
evas_textblock_cursor_format_prepend(cur, "+ ellipsis=1.0");
evas_object_resize(tb, 101, 100);
evas_object_textblock_size_formatted_get(tb, &w, &h);
ck_assert_int_le(w, 100);
evas_object_textblock_text_markup_set(tb, "ab");
evas_textblock_cursor_format_prepend(cur, "+ ellipsis=1.0");
evas_object_textblock_size_native_get(tb, &nw, &nh);
evas_object_resize(tb, nw / 2, nh * 2);
evas_object_textblock_size_formatted_get(tb, &w, &h);
ck_assert_int_le(w, ellip_w);
{
double ellip;
for(ellip = 0.0; ellip <= 1.0; ellip = ellip + 0.1)