From 99a1f2f809979feb121dcf966816335e8af0d5ff Mon Sep 17 00:00:00 2001 From: tasn Date: Sun, 30 Jan 2011 10:44:23 +0000 Subject: [PATCH] Evas text: relayout the items when needed. git-svn-id: svn+ssh://svn.enlightenment.org/var/svn/e/trunk/evas@56528 7cbeb6ba-43b4-40fd-8cce-4c39aea84d33 --- src/lib/canvas/evas_object_text.c | 122 +++++++++++++++++--------------------- 1 file changed, 53 insertions(+), 69 deletions(-) diff --git a/src/lib/canvas/evas_object_text.c b/src/lib/canvas/evas_object_text.c index 873a3ae..e5d1361 100644 --- a/src/lib/canvas/evas_object_text.c +++ b/src/lib/canvas/evas_object_text.c @@ -65,6 +65,7 @@ static int evas_object_text_is_opaque(Evas_Object *obj); static int evas_object_text_was_opaque(Evas_Object *obj); static void evas_object_text_scale_update(Evas_Object *obj); +static void _evas_object_text_recalc(Evas_Object *obj); static const Evas_Object_Func object_func = { @@ -101,6 +102,7 @@ static const Evas_Object_Func object_func = */ EVAS_MEMPOOL(_mp_obj); + /* FIXME: doc */ static int _evas_object_text_char_coords_get(const Evas_Object *obj, @@ -376,7 +378,6 @@ EAPI void evas_object_text_font_set(Evas_Object *obj, const char *font, Evas_Font_Size size) { Evas_Object_Text *o; - int l = 0, r = 0, t = 0, b = 0; int is, was = 0, pass = 0; int same_font = 0; @@ -427,40 +428,21 @@ evas_object_text_font_set(Evas_Object *obj, const char *font, Evas_Font_Size siz o->cur.size = size; o->engine_data = evas_font_load(obj->layer->evas, o->cur.font, o->cur.source, (int)(((double)o->cur.size) * obj->cur.scale)); - evas_text_style_pad_get(o->cur.style, &l, &r, &t, &b); - if ((o->engine_data) && (o->items)) + if (o->engine_data) { - int w, h; - - _evas_object_text_string_size_get(obj, o, &w, &h); - o->ascent = ENFN->font_ascent_get(ENDT, o->engine_data); - o->descent = ENFN->font_descent_get(ENDT, o->engine_data); - o->max_ascent = ENFN->font_max_ascent_get(ENDT, o->engine_data); - o->max_descent = ENFN->font_max_descent_get(ENDT, o->engine_data); - obj->cur.geometry.w = w + l + r; - obj->cur.geometry.h = o->max_ascent + o->max_descent + t + b; -//// obj->cur.cache.geometry.validity = 0; + o->ascent = ENFN->font_ascent_get(ENDT, o->engine_data); + o->descent = ENFN->font_descent_get(ENDT, o->engine_data); + o->max_ascent = ENFN->font_max_ascent_get(ENDT, o->engine_data); + o->max_descent = ENFN->font_max_descent_get(ENDT, o->engine_data); } else { - if (o->engine_data) - { - o->ascent = ENFN->font_ascent_get(ENDT, o->engine_data); - o->descent = ENFN->font_descent_get(ENDT, o->engine_data); - o->max_ascent = ENFN->font_max_ascent_get(ENDT, o->engine_data); - o->max_descent = ENFN->font_max_descent_get(ENDT, o->engine_data); - } - else - { - o->ascent = 0; - o->descent = 0; - o->max_ascent = 0; - o->max_descent = 0; - } - obj->cur.geometry.w = 0; - obj->cur.geometry.h = o->max_ascent + o->max_descent + t + b; -//// obj->cur.cache.geometry.validity = 0; + o->ascent = 0; + o->descent = 0; + o->max_ascent = 0; + o->max_descent = 0; } + _evas_object_text_recalc(obj); o->changed = 1; evas_object_change(obj); evas_object_clip_dirty(obj); @@ -711,27 +693,7 @@ evas_object_text_text_set(Evas_Object *obj, const char *_text) free(text); text = NULL; } - - if ((o->engine_data) && (o->items)) - { - int w, h; - int l = 0, r = 0, t = 0, b = 0; - - _evas_object_text_string_size_get(obj, o, &w, &h); - evas_text_style_pad_get(o->cur.style, &l, &r, &t, &b); - obj->cur.geometry.w = w + l + r; - obj->cur.geometry.h = h + t + b; -//// obj->cur.cache.geometry.validity = 0; - } - else - { - int t = 0, b = 0; - - evas_text_style_pad_get(o->cur.style, NULL, NULL, &t, &b); - obj->cur.geometry.w = 0; - obj->cur.geometry.h = o->max_ascent + o->max_descent + t + b; -//// obj->cur.cache.geometry.validity = 0; - } + _evas_object_text_recalc(obj); o->changed = 1; evas_object_change(obj); evas_object_clip_dirty(obj); @@ -2277,6 +2239,41 @@ _evas_object_text_rehint(Evas_Object *obj) obj->layer->evas->pointer.x, obj->layer->evas->pointer.y, 1, 1); /* DO II */ + _evas_object_text_recalc(obj); + o->changed = 1; + evas_object_change(obj); + evas_object_clip_dirty(obj); + evas_object_coords_recalc(obj); + is = evas_object_is_in_output_rect(obj, + obj->layer->evas->pointer.x, + obj->layer->evas->pointer.y, 1, 1); + if ((is || was) && obj->cur.visible) + evas_event_feed_mouse_move(obj->layer->evas, + obj->layer->evas->pointer.x, + obj->layer->evas->pointer.y, + obj->layer->evas->last_timestamp, + NULL); + evas_object_inform_call_resize(obj); +} + +static void +_evas_object_text_recalc(Evas_Object *obj) +{ + Evas_Object_Text *o; + Eina_Unicode *text = NULL; + o = (Evas_Object_Text *)(obj->object_data); + + if (o->items) _evas_object_text_items_clear(o); + if (o->cur.utf8_text) + text = evas_common_encoding_utf8_to_unicode(o->cur.utf8_text, + NULL); + + if (!text) text = eina_unicode_strdup(EINA_UNICODE_EMPTY_STRING); + + _evas_object_text_layout(obj, o, text); + + if (text) free(text); + if ((o->engine_data) && (o->items)) { int w, h; @@ -2285,8 +2282,8 @@ _evas_object_text_rehint(Evas_Object *obj) _evas_object_text_string_size_get(obj, o, &w, &h); evas_text_style_pad_get(o->cur.style, &l, &r, &t, &b); obj->cur.geometry.w = w + l + r; - obj->cur.geometry.h = h + t + b; -//// obj->cur.cache.geometry.validity = 0; + obj->cur.geometry.h = h + t + b; +//// obj->cur.cache.geometry.validity = 0; } else { @@ -2294,21 +2291,8 @@ _evas_object_text_rehint(Evas_Object *obj) evas_text_style_pad_get(o->cur.style, NULL, NULL, &t, &b); obj->cur.geometry.w = 0; - obj->cur.geometry.h = o->max_ascent + o->max_descent + t + b; -//// obj->cur.cache.geometry.validity = 0; + obj->cur.geometry.h = o->max_ascent + o->max_descent + t + b; +//// obj->cur.cache.geometry.validity = 0; } - o->changed = 1; - evas_object_change(obj); - evas_object_clip_dirty(obj); - evas_object_coords_recalc(obj); - is = evas_object_is_in_output_rect(obj, - obj->layer->evas->pointer.x, - obj->layer->evas->pointer.y, 1, 1); - if ((is || was) && obj->cur.visible) - evas_event_feed_mouse_move(obj->layer->evas, - obj->layer->evas->pointer.x, - obj->layer->evas->pointer.y, - obj->layer->evas->last_timestamp, - NULL); - evas_object_inform_call_resize(obj); } + -- 2.7.4