forked from enlightenment/efl
Evas textblock: Fixed native size calculation with relative items.
SVN revision: 61560
This commit is contained in:
parent
6299cbd685
commit
5aba518db0
|
@ -8228,6 +8228,39 @@ evas_object_textblock_size_formatted_get(const Evas_Object *obj, Evas_Coord *w,
|
||||||
if (h) *h = o->formatted.h;
|
if (h) *h = o->formatted.h;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
_size_native_calc_line_finalize(const Evas_Object *obj, Eina_List *items,
|
||||||
|
Evas_Coord *ascent, Evas_Coord *descent, Evas_Coord *w)
|
||||||
|
{
|
||||||
|
Evas_Object_Textblock_Item *it;
|
||||||
|
Eina_List *i;
|
||||||
|
|
||||||
|
it = eina_list_data_get(items);
|
||||||
|
/* If there are no text items yet, calc ascent/descent
|
||||||
|
* according to the current format. */
|
||||||
|
if (it && (*ascent + *descent == 0))
|
||||||
|
_layout_format_ascent_descent_adjust(obj, ascent, descent, it->format);
|
||||||
|
|
||||||
|
*w = 0;
|
||||||
|
/* Adjust all the item sizes according to the final line size,
|
||||||
|
* and update the x positions of all the items of the line. */
|
||||||
|
EINA_LIST_FOREACH(items, i, it)
|
||||||
|
{
|
||||||
|
if (it->type == EVAS_TEXTBLOCK_ITEM_FORMAT)
|
||||||
|
{
|
||||||
|
Evas_Coord fw, fh, fy;
|
||||||
|
|
||||||
|
Evas_Object_Textblock_Format_Item *fi = _ITEM_FORMAT(it);
|
||||||
|
if (!fi->formatme) goto loop_advance;
|
||||||
|
_layout_calculate_format_item_size(obj, fi, ascent,
|
||||||
|
descent, &fy, &fw, &fh);
|
||||||
|
}
|
||||||
|
|
||||||
|
loop_advance:
|
||||||
|
*w += it->adv;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/* FIXME: doc */
|
/* FIXME: doc */
|
||||||
static void
|
static void
|
||||||
_size_native_calc_paragraph_size(const Evas_Object *obj,
|
_size_native_calc_paragraph_size(const Evas_Object *obj,
|
||||||
|
@ -8237,55 +8270,61 @@ _size_native_calc_paragraph_size(const Evas_Object *obj,
|
||||||
{
|
{
|
||||||
Eina_List *i;
|
Eina_List *i;
|
||||||
Evas_Object_Textblock_Item *it;
|
Evas_Object_Textblock_Item *it;
|
||||||
Evas_Coord x = 0, y = 0, wmax = 0, h = 0, ascent = 0, descent = 0;
|
Eina_List *line_items = NULL;
|
||||||
|
Evas_Coord w = 0, y = 0, wmax = 0, h = 0, ascent = 0, descent = 0;
|
||||||
|
|
||||||
EINA_LIST_FOREACH(par->logical_items, i, it)
|
EINA_LIST_FOREACH(par->logical_items, i, it)
|
||||||
{
|
{
|
||||||
|
line_items = eina_list_append(line_items, it);
|
||||||
if (it->type == EVAS_TEXTBLOCK_ITEM_FORMAT)
|
if (it->type == EVAS_TEXTBLOCK_ITEM_FORMAT)
|
||||||
{
|
{
|
||||||
Evas_Object_Textblock_Format_Item *fi = _ITEM_FORMAT(it);
|
Evas_Object_Textblock_Format_Item *fi = _ITEM_FORMAT(it);
|
||||||
if (fi->item && (_IS_LINE_SEPARATOR(fi->item) ||
|
if (fi->item && (_IS_LINE_SEPARATOR(fi->item) ||
|
||||||
_IS_PARAGRAPH_SEPARATOR(o, fi->item)))
|
_IS_PARAGRAPH_SEPARATOR(o, fi->item)))
|
||||||
{
|
{
|
||||||
/* If there are no text items yet, calc ascent/descent
|
_size_native_calc_line_finalize(obj, line_items, &ascent,
|
||||||
* according to the current format. */
|
&descent, &w);
|
||||||
if (ascent + descent == 0)
|
|
||||||
_layout_format_ascent_descent_adjust(obj, &ascent,
|
|
||||||
&descent, it->format);
|
|
||||||
|
|
||||||
if (ascent + descent > h)
|
if (ascent + descent > h)
|
||||||
h = ascent + descent;
|
h = ascent + descent;
|
||||||
if (x + it->adv > wmax)
|
|
||||||
wmax = x + it->adv;
|
|
||||||
y += h;
|
y += h;
|
||||||
x = h = 0;
|
if (w > wmax)
|
||||||
|
wmax = w;
|
||||||
|
h = 0;
|
||||||
ascent = descent = 0;
|
ascent = descent = 0;
|
||||||
|
line_items = eina_list_free(line_items);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
Evas_Coord fw, fh, fy;
|
Evas_Coord fw, fh, fy;
|
||||||
|
/* If there are no text items yet, calc ascent/descent
|
||||||
|
* according to the current format. */
|
||||||
|
if (it && (ascent + descent == 0))
|
||||||
|
_layout_format_ascent_descent_adjust(obj, &ascent,
|
||||||
|
&descent, it->format);
|
||||||
|
|
||||||
_layout_calculate_format_item_size(obj, fi, &ascent,
|
_layout_calculate_format_item_size(obj, fi, &ascent,
|
||||||
&descent, &fy, &fw, &fh);
|
&descent, &fy, &fw, &fh);
|
||||||
|
|
||||||
if (fh > h)
|
|
||||||
h = fh;
|
|
||||||
x += fw;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
_layout_format_ascent_descent_adjust(obj, &ascent,
|
_layout_format_ascent_descent_adjust(obj, &ascent,
|
||||||
&descent, it->format);
|
&descent, it->format);
|
||||||
x += it->adv;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
_size_native_calc_line_finalize(obj, line_items, &ascent, &descent, &w);
|
||||||
|
|
||||||
|
line_items = eina_list_free(line_items);
|
||||||
|
|
||||||
/* Do the last addition */
|
/* Do the last addition */
|
||||||
if (ascent + descent > h)
|
if (ascent + descent > h)
|
||||||
h = ascent + descent;
|
h = ascent + descent;
|
||||||
if (x > wmax)
|
|
||||||
wmax = x;
|
if (w > wmax)
|
||||||
|
wmax = w;
|
||||||
|
|
||||||
*_h = y + h;
|
*_h = y + h;
|
||||||
*_w = wmax;
|
*_w = wmax;
|
||||||
|
|
Loading…
Reference in New Issue