summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorYoungbok Shin <youngb.shin@samsung.com>2014-08-19 15:08:46 +0100
committerTom Hacohen <tom@stosb.com>2014-08-19 15:20:35 +0100
commitd408408283dd4ece9023d792753fd63422b80cb1 (patch)
tree121d34dc37d72bb78c7b4ecaf0a89fa22a17cf58
parent66966c8df126503c2b59864ffe20f016315a3eec (diff)
downloadefl-d408408283dd4ece9023d792753fd63422b80cb1.tar.gz
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
-rw-r--r--src/lib/evas/canvas/evas_object_textblock.c71
-rw-r--r--src/tests/evas/evas_test_textblock.c23
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 fb59cee003..9f14cb5a5f 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 78d83ef25f..13462e32a1 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)