tasn pushed a commit to branch master. http://git.enlightenment.org/core/efl.git/commit/?id=d408408283dd4ece9023d792753fd63422b80cb1
commit d408408283dd4ece9023d792753fd63422b80cb1 Author: Youngbok Shin <[email protected]> Date: Tue Aug 19 15:08:46 2014 +0100 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. Fixes Phab ticket T1213 @fix Test Plan: This commit includes test case. Reviewers: woohyun, seoz, sohyun, tasn Subscribers: herdsman, cedric Differential Revision: https://phab.enlightenment.org/D1311 --- src/lib/evas/canvas/evas_object_textblock.c | 71 +++++++++++++++++++++++------ src/tests/evas/evas_test_textblock.c | 23 ++++++++++ 2 files changed, 81 insertions(+), 13 deletions(-) diff --git a/src/lib/evas/canvas/evas_object_textblock.c b/src/lib/evas/canvas/evas_object_textblock.c index fb59cee..9f14cb5 100644 --- a/src/lib/evas/canvas/evas_object_textblock.c +++ b/src/lib/evas/canvas/evas_object_textblock.c @@ -4373,7 +4373,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; @@ -4383,24 +4383,69 @@ _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))); } + last_it = NULL; } - else if (it->type == EVAS_TEXTBLOCK_ITEM_FORMAT) + + while (last_it) { - /* We don't want to add this format item. */ - last_it = NULL; + 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); + } + 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; diff --git a/src/tests/evas/evas_test_textblock.c b/src/tests/evas/evas_test_textblock.c index 78d83ef..13462e3 100644 --- a/src/tests/evas/evas_test_textblock.c +++ b/src/tests/evas/evas_test_textblock.c @@ -1574,6 +1574,7 @@ END_TEST START_TEST(evas_textblock_wrapping) { Evas_Coord bw, bh, w, h, nw, nh; + Evas_Coord ellip_w, ellip_h; int i; START_TB_TEST(); evas_object_textblock_text_markup_set(tb, "a"); @@ -1759,6 +1760,28 @@ 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, "…"); + evas_object_textblock_size_native_get(tb, &ellip_w, &ellip_h); + 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) --
