Evas textblock: Fixed bug with relative sized items not showing.

SVN revision: 56513
This commit is contained in:
Tom Hacohen 2011-01-30 10:42:41 +00:00
parent 09b0ae1f42
commit fb07723f3d
1 changed files with 31 additions and 22 deletions

View File

@ -349,7 +349,6 @@ struct _Evas_Object_Textblock_Format_Item
unsigned char vsize : 2; unsigned char vsize : 2;
unsigned char size : 2; unsigned char size : 2;
unsigned char formatme : 1; unsigned char formatme : 1;
unsigned char ___padding___ : 3;
}; };
struct _Evas_Object_Textblock_Format struct _Evas_Object_Textblock_Format
@ -2201,6 +2200,33 @@ _layout_line_finalize(Ctxt *c, Evas_Object_Textblock_Format *fmt)
{ {
Evas_Object_Textblock_Format_Item *fi = _ITEM_FORMAT(it); Evas_Object_Textblock_Format_Item *fi = _ITEM_FORMAT(it);
if (!fi->formatme) continue; if (!fi->formatme) continue;
fi->ascent = c->maxascent;
fi->descent = c->maxdescent;
/* Adjust relsize */
if (fi->size == SIZE_REL)
{
Evas_Coord w = 1, h = 1;
const char *p, *s;
s = eina_strbuf_string_get(fi->source_node->format);
p = strstr((char *) s, " relsize=");
p += 9;
if (sscanf(p, "%ix%i", &w, &h) == 2)
{
int sz = 1;
if (fi->vsize == VSIZE_FULL)
{
sz = c->maxdescent + c->maxascent;
}
else if (fi->vsize == VSIZE_ASCENT)
{
sz = c->maxascent;
}
w = (w * sz) / h;
h = sz;
}
fi->parent.w = fi->parent.adv = w;
fi->parent.h = h;
}
switch (fi->size) switch (fi->size)
{ {
case SIZE: case SIZE:
@ -2821,7 +2847,7 @@ _layout_do_format(const Evas_Object *obj, Ctxt *c,
// href == name of item - to be found and matched later and used for // href == name of item - to be found and matched later and used for
// positioning // positioning
Evas_Object_Textblock_Format_Item *fi; Evas_Object_Textblock_Format_Item *fi;
int x2, w = 1, h = 1; int w = 1, h = 1;
int vsize = 0, size = 0; int vsize = 0, size = 0;
char *p; char *p;
@ -2861,28 +2887,13 @@ _layout_do_format(const Evas_Object *obj, Ctxt *c,
p = strstr(s, " relsize="); p = strstr(s, " relsize=");
if (p) if (p)
{ {
p += 9; /* relsize in handled somewhere else, pretty hacky, but
if (sscanf(p, "%ix%i", &w, &h) == 2) * couldn't think of another solution atm. */
{ size = SIZE_REL;
int sz = 1;
size = SIZE_REL;
if (vsize == VSIZE_FULL)
{
sz = c->maxdescent + c->maxascent;
}
else if (vsize == VSIZE_ASCENT)
{
sz = c->maxascent;
}
w = (w * sz) / h;
h = sz;
}
} }
} }
} }
x2 = c->x + w;
fi = _layout_format_item_add(c, n, NULL, fmt); fi = _layout_format_item_add(c, n, NULL, fmt);
fi->vsize = vsize; fi->vsize = vsize;
fi->size = size; fi->size = size;
@ -2891,8 +2902,6 @@ _layout_do_format(const Evas_Object *obj, Ctxt *c,
the same, we don't handle the the same, we don't handle the
special cases yet. */ special cases yet. */
fi->parent.h = h; fi->parent.h = h;
fi->ascent = c->maxascent;
fi->descent = c->maxdescent;
handled = 1; handled = 1;
} }
if (!handled) if (!handled)