Evas text: relayout the items when needed.
authortasn <tasn@7cbeb6ba-43b4-40fd-8cce-4c39aea84d33>
Sun, 30 Jan 2011 10:44:23 +0000 (10:44 +0000)
committertasn <tasn@7cbeb6ba-43b4-40fd-8cce-4c39aea84d33>
Sun, 30 Jan 2011 10:44:23 +0000 (10:44 +0000)
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

index 873a3ae..e5d1361 100644 (file)
@@ -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);
 }
+