forked from enlightenment/efl
edje: support legacy Textblock calculation logic for 1.18 edje file
Summary: From EFL 1.19, Edje Textblock calculation logic was fixed according to Edje documents. But, it broke old edje files which ignored text.min option for minimum width. Even if the old edje files were wrong, we need to support them as discussed from T5548. Also, this patch will change default efl_version to 1.18 from 1.19. So, without efl_version property, edje file will run on the legacy logic. Fixes T5548 Test Plan: Turn on/off presentation mode in Enlightenment. Reviewers: herdsman, cedric, jpeg, zmike, raster Subscribers: stefan_schmidt Maniphest Tasks: T5548 Differential Revision: https://phab.enlightenment.org/D4967 Adjusted by @jpeg
This commit is contained in:
parent
a4b79fdbe1
commit
0735f6aa61
|
@ -402,11 +402,11 @@ main(int argc, char **argv)
|
|||
* which was used for developing a edje file.
|
||||
* It is useful if Edje(or other EFL libs) need to keep
|
||||
* backward compatibility.
|
||||
* efl_version was added just after EFL 1.19.
|
||||
* Thus, 1.19 will be default.
|
||||
* efl_version was added to fix backward compatibility issue caused from EFL 1.19.
|
||||
* Thus, 1.18 will be default.
|
||||
*/
|
||||
edje_file->efl_version.major = 1;
|
||||
edje_file->efl_version.minor = 19;
|
||||
edje_file->efl_version.minor = 18;
|
||||
edje_file->base_scale = FROM_INT(1);
|
||||
|
||||
source_edd();
|
||||
|
|
|
@ -11134,6 +11134,9 @@ st_collections_group_parts_part_description_text_min(void)
|
|||
|
||||
ed->text.min_x = parse_bool(0);
|
||||
ed->text.min_y = parse_bool(1);
|
||||
|
||||
if (current_part->type == EDJE_PART_TYPE_TEXTBLOCK)
|
||||
edje_file->has_textblock_min_max = EINA_TRUE;
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -11168,6 +11171,9 @@ st_collections_group_parts_part_description_text_max(void)
|
|||
|
||||
ed->text.max_x = parse_bool(0);
|
||||
ed->text.max_y = parse_bool(1);
|
||||
|
||||
if (current_part->type == EDJE_PART_TYPE_TEXTBLOCK)
|
||||
edje_file->has_textblock_min_max = EINA_TRUE;
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
|
@ -2672,6 +2672,18 @@ data_write(void)
|
|||
exit(-1);
|
||||
}
|
||||
|
||||
if ((edje_file->efl_version.major <= 1) && (edje_file->efl_version.minor <= 18)
|
||||
&& edje_file->has_textblock_min_max)
|
||||
{
|
||||
WRN("This EDC file was designed for EFL 1.18. Until 1.19, EFL used an "
|
||||
"invalid calculation mechanism for textblock parts, where the value "
|
||||
"of text min/max was not properly taken into account. You might "
|
||||
"want to consider adding \"efl_version: %d %d;\" in your EDC "
|
||||
"\"collections\" block, and then check the sizing for all textblock "
|
||||
"parts that specify text min/max values.",
|
||||
EFL_VERSION_MAJOR, EFL_VERSION_MINOR);
|
||||
}
|
||||
|
||||
check_groups(ef);
|
||||
|
||||
ecore_thread_max_set(ecore_thread_max_get() * 2);
|
||||
|
|
|
@ -358,7 +358,7 @@ _edje_file_open(const Eina_File *f, int *error_ret, time_t mtime, Eina_Bool coll
|
|||
if ((edf->efl_version.major == 0) && (edf->efl_version.minor == 0))
|
||||
{
|
||||
edf->efl_version.major = 1;
|
||||
edf->efl_version.minor = 19;
|
||||
edf->efl_version.minor = 18;
|
||||
}
|
||||
|
||||
edf->path = eina_stringshare_add(eina_file_filename_get(f));
|
||||
|
|
|
@ -1467,6 +1467,369 @@ _edje_part_recalc_single_textblock_scale_range_adjust(Edje_Part_Description_Text
|
|||
return scale;
|
||||
}
|
||||
|
||||
/*
|
||||
* Legacy function for min/max calculation of textblock part.
|
||||
* It can't calculate min/max properly in many cases.
|
||||
*
|
||||
* To keep backward compatibility, it will be used for old version of EDJ files.
|
||||
* You can't see proper min/max result accroding to documents with this function.
|
||||
*/
|
||||
static void
|
||||
_edje_part_recalc_single_textblock_min_max_calc_legacy(Edje_Real_Part *ep,
|
||||
Edje_Part_Description_Text *chosen_desc,
|
||||
Edje_Calc_Params *params,
|
||||
int *minw, int *minh,
|
||||
int *maxw, int *maxh)
|
||||
{
|
||||
Evas_Coord tw, th, ins_l, ins_r, ins_t, ins_b;
|
||||
|
||||
/* Legacy code for Textblock min/max calculation */
|
||||
if ((chosen_desc->text.min_x) || (chosen_desc->text.min_y))
|
||||
{
|
||||
int mw = 0, mh = 0;
|
||||
|
||||
tw = th = 0;
|
||||
if (!chosen_desc->text.min_x)
|
||||
{
|
||||
efl_gfx_size_set(ep->object, TO_INT(params->eval.w), TO_INT(params->eval.h));
|
||||
efl_canvas_text_size_formatted_get(ep->object, &tw, &th);
|
||||
}
|
||||
else
|
||||
evas_object_textblock_size_native_get(ep->object, &tw, &th);
|
||||
evas_object_textblock_style_insets_get(ep->object, &ins_l,
|
||||
&ins_r, &ins_t, &ins_b);
|
||||
mw = ins_l + tw + ins_r;
|
||||
mh = ins_t + th + ins_b;
|
||||
if (minw && chosen_desc->text.min_x)
|
||||
{
|
||||
if (mw > *minw) *minw = mw;
|
||||
}
|
||||
if (minh && chosen_desc->text.min_y)
|
||||
{
|
||||
if (mh > *minh) *minh = mh;
|
||||
}
|
||||
}
|
||||
|
||||
if ((chosen_desc->text.max_x) || (chosen_desc->text.max_y))
|
||||
{
|
||||
int mw = 0, mh = 0;
|
||||
|
||||
tw = th = 0;
|
||||
if (!chosen_desc->text.max_x)
|
||||
{
|
||||
efl_gfx_size_set(ep->object, TO_INT(params->eval.w), TO_INT(params->eval.h));
|
||||
efl_canvas_text_size_formatted_get(ep->object, &tw, &th);
|
||||
}
|
||||
else
|
||||
evas_object_textblock_size_native_get(ep->object, &tw, &th);
|
||||
evas_object_textblock_style_insets_get(ep->object, &ins_l, &ins_r,
|
||||
&ins_t, &ins_b);
|
||||
mw = ins_l + tw + ins_r;
|
||||
mh = ins_t + th + ins_b;
|
||||
if (maxw && chosen_desc->text.max_x)
|
||||
{
|
||||
if (mw > *maxw) *maxw = mw;
|
||||
if (minw && (*maxw < *minw)) *maxw = *minw;
|
||||
}
|
||||
if (maxh && chosen_desc->text.max_y)
|
||||
{
|
||||
if (mh > *maxh) *maxh = mh;
|
||||
if (minh && (*maxh < *minh)) *maxh = *minh;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
_edje_part_recalc_single_textblock_min_max_calc(Edje_Real_Part *ep,
|
||||
Edje_Part_Description_Text *chosen_desc,
|
||||
Edje_Calc_Params *params,
|
||||
int *minw, int *minh,
|
||||
int *maxw, int *maxh)
|
||||
{
|
||||
Evas_Coord tw, th, ins_l, ins_r, ins_t, ins_b;
|
||||
Evas_Coord min_calc_w = 0, min_calc_h = 0;
|
||||
|
||||
/* min_calc_* values need to save calculated minumum size
|
||||
* for maximum size calculation */
|
||||
if (minw) min_calc_w = *minw;
|
||||
if (minh) min_calc_h = *minh;
|
||||
|
||||
if ((chosen_desc->text.min_x) || (chosen_desc->text.min_y))
|
||||
{
|
||||
evas_object_textblock_style_insets_get(ep->object, &ins_l,
|
||||
&ins_r, &ins_t, &ins_b);
|
||||
|
||||
tw = th = 0;
|
||||
if (!chosen_desc->text.min_x)
|
||||
{
|
||||
/* text.min: 0 1
|
||||
* text.max: X X */
|
||||
int temp_h = TO_INT(params->eval.h);
|
||||
int temp_w = TO_INT(params->eval.w);
|
||||
|
||||
if (min_calc_w > temp_w)
|
||||
temp_w = min_calc_w;
|
||||
if ((!chosen_desc->text.max_x) &&
|
||||
maxw && (*maxw > -1) && (*maxw < temp_w))
|
||||
temp_w = *maxw;
|
||||
|
||||
if (chosen_desc->text.max_y)
|
||||
{
|
||||
/* text.min: 0 1
|
||||
* text.max: X 1 */
|
||||
temp_h = INT_MAX / 10000;
|
||||
}
|
||||
else if (maxh && (*maxh > TO_INT(params->eval.h)))
|
||||
{
|
||||
/* text.min: 0 1
|
||||
* text.max: X 0
|
||||
* And there is a limit for height. */
|
||||
temp_h = *maxh;
|
||||
}
|
||||
|
||||
/* If base width for calculation is 0,
|
||||
* don't get meaningless height for multiline */
|
||||
if (temp_w > 0)
|
||||
{
|
||||
efl_gfx_size_set(ep->object, temp_w, temp_h);
|
||||
efl_canvas_text_size_formatted_get(ep->object, &tw, &th);
|
||||
|
||||
tw += ins_l + ins_r;
|
||||
th += ins_t + ins_b;
|
||||
}
|
||||
else
|
||||
{
|
||||
efl_canvas_text_size_native_get(ep->object, NULL, &th);
|
||||
|
||||
th += ins_t + ins_b;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
/* text.min: 1 X
|
||||
* text.max: X X */
|
||||
if (chosen_desc->text.min_y && (!chosen_desc->text.max_x) &&
|
||||
maxw && (*maxw > -1))
|
||||
{
|
||||
/* text.min: 1 1
|
||||
* text.max: 0 X */
|
||||
int temp_w, temp_h;
|
||||
|
||||
temp_w = *maxw;
|
||||
temp_h = INT_MAX / 10000;
|
||||
|
||||
if (min_calc_w > temp_w)
|
||||
temp_w = min_calc_w;
|
||||
|
||||
if ((!chosen_desc->text.max_y) && maxh && (*maxh > -1))
|
||||
{
|
||||
/* text.min: 1 1
|
||||
* text.max: 0 0
|
||||
* There is limit for height. */
|
||||
temp_h = *maxh;
|
||||
}
|
||||
|
||||
efl_gfx_size_set(ep->object, temp_w, temp_h);
|
||||
efl_canvas_text_size_formatted_get(ep->object, &tw, &th);
|
||||
|
||||
tw += ins_l + ins_r;
|
||||
th += ins_t + ins_b;
|
||||
|
||||
/* If base width for calculation is 0,
|
||||
* don't get meaningless height for multiline */
|
||||
if (temp_w <= 0)
|
||||
{
|
||||
efl_canvas_text_size_native_get(ep->object, NULL, &th);
|
||||
|
||||
th += ins_t + ins_b;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
/* text.min: 1 X
|
||||
* text.max: 1 X
|
||||
* Or,
|
||||
* text.min: 1 X
|
||||
* text.max: 0 X without max width.
|
||||
* It is a singleline Textblock. */
|
||||
efl_canvas_text_size_native_get(ep->object, &tw, &th);
|
||||
|
||||
tw += ins_l + ins_r;
|
||||
th += ins_t + ins_b;
|
||||
|
||||
if (!chosen_desc->text.max_x &&
|
||||
(maxw && (*maxw > -1) && (*maxw < tw)))
|
||||
{
|
||||
/* text.min: 1 0
|
||||
* text.max: 0 X */
|
||||
tw = *maxw;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (tw > min_calc_w) min_calc_w = tw;
|
||||
if (th > min_calc_h) min_calc_h = th;
|
||||
if (chosen_desc->text.min_x && minw) *minw = min_calc_w;
|
||||
if (chosen_desc->text.min_y && minh) *minh = min_calc_h;
|
||||
}
|
||||
|
||||
if ((chosen_desc->text.max_x) || (chosen_desc->text.max_y))
|
||||
{
|
||||
evas_object_textblock_style_insets_get(ep->object, &ins_l, &ins_r,
|
||||
&ins_t, &ins_b);
|
||||
|
||||
tw = th = 0;
|
||||
if (!chosen_desc->text.max_x)
|
||||
{
|
||||
/* text.min: X X
|
||||
* text.max: 0 1 */
|
||||
int temp_w, temp_h;
|
||||
|
||||
if (chosen_desc->text.min_y)
|
||||
{
|
||||
/* text.min: X 1
|
||||
* text.max: 0 1
|
||||
* Already calculated in text for height. */
|
||||
tw = TO_INT(params->eval.w);
|
||||
if (min_calc_w > tw)
|
||||
tw = min_calc_w;
|
||||
|
||||
th = min_calc_h;
|
||||
}
|
||||
else
|
||||
{
|
||||
/* text.min: X 0
|
||||
* text.max: 0 1 */
|
||||
temp_w = TO_INT(params->eval.w);
|
||||
temp_h = TO_INT(params->eval.h);
|
||||
|
||||
if (min_calc_w > temp_w)
|
||||
temp_w = min_calc_w;
|
||||
if (maxw && (*maxw > -1) && (*maxw < temp_w))
|
||||
temp_w = *maxw;
|
||||
if (min_calc_h > temp_h)
|
||||
temp_h = min_calc_h;
|
||||
|
||||
/* If base width for calculation is 0,
|
||||
* don't get meaningless height for multiline */
|
||||
if (temp_w > 0)
|
||||
{
|
||||
efl_gfx_size_set(ep->object, temp_w, temp_h);
|
||||
efl_canvas_text_size_formatted_get(ep->object, &tw, &th);
|
||||
|
||||
tw += ins_l + ins_r;
|
||||
th += ins_t + ins_b;
|
||||
}
|
||||
else
|
||||
{
|
||||
efl_canvas_text_size_native_get(ep->object, NULL, &th);
|
||||
|
||||
th += ins_t + ins_b;
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
/* text.max: 1 X */
|
||||
if (chosen_desc->text.min_x)
|
||||
{
|
||||
/* text.min: 1 X
|
||||
* text.max: 1 X
|
||||
* Singleline. */
|
||||
efl_canvas_text_size_native_get(ep->object, &tw, &th);
|
||||
|
||||
tw += ins_l + ins_r;
|
||||
th += ins_t + ins_b;
|
||||
}
|
||||
else
|
||||
{
|
||||
/* text.min: 0 X
|
||||
* text.max: 1 X */
|
||||
if (chosen_desc->text.max_y)
|
||||
{
|
||||
/* text.min: 0 X
|
||||
* text.max: 1 1 */
|
||||
int temp_w, temp_h;
|
||||
|
||||
temp_w = TO_INT(params->eval.w);
|
||||
temp_h = TO_INT(params->eval.h);
|
||||
|
||||
if (min_calc_w > temp_w)
|
||||
temp_w = min_calc_w;
|
||||
if (min_calc_h > temp_h)
|
||||
temp_h = min_calc_h;
|
||||
|
||||
if (chosen_desc->text.min_y)
|
||||
{
|
||||
/* text.min: 0 1
|
||||
* text.max: 1 1
|
||||
* There is no need to calculate it again. */
|
||||
tw = min_calc_w;
|
||||
th = min_calc_h;
|
||||
}
|
||||
else
|
||||
{
|
||||
/* text.min: 0 0
|
||||
* text.max: 1 1 */
|
||||
|
||||
efl_gfx_size_set(ep->object, temp_w, temp_h);
|
||||
efl_canvas_text_size_formatted_get(ep->object, &tw, &th);
|
||||
|
||||
tw += ins_l + ins_r;
|
||||
th += ins_t + ins_b;
|
||||
|
||||
/* If base width for calculation is 0,
|
||||
* don't get meaningless height for multiline */
|
||||
if (temp_w <= 0)
|
||||
{
|
||||
efl_canvas_text_size_native_get(ep->object, NULL, &th);
|
||||
|
||||
th += ins_t + ins_b;
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
/* text.min: 0 X
|
||||
* text.max: 1 0 */
|
||||
int temp_w, temp_h;
|
||||
|
||||
temp_w = TO_INT(params->eval.w);
|
||||
if (min_calc_w > temp_w)
|
||||
temp_w = min_calc_w;
|
||||
|
||||
efl_gfx_size_get(ep->object, NULL, &temp_h);
|
||||
efl_gfx_size_set(ep->object, temp_w, temp_h);
|
||||
efl_canvas_text_size_formatted_get(ep->object, &tw, &th);
|
||||
|
||||
tw += ins_l + ins_r;
|
||||
th += ins_t + ins_b;
|
||||
|
||||
/* If base width for calculation is 0,
|
||||
* don't get meaningless height for multiline */
|
||||
if (temp_w <= 0)
|
||||
{
|
||||
efl_canvas_text_size_native_get(ep->object, NULL, &th);
|
||||
|
||||
th += ins_t + ins_b;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (maxw && chosen_desc->text.max_x)
|
||||
{
|
||||
if (tw > *maxw) *maxw = tw;
|
||||
if (minw && (*maxw < *minw)) *maxw = *minw;
|
||||
}
|
||||
if (maxh && chosen_desc->text.max_y)
|
||||
{
|
||||
if (th > *maxh) *maxh = th;
|
||||
if (minh && (*maxh < *minh)) *maxh = *minh;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
_edje_part_recalc_single_textblock(FLOAT_T sc,
|
||||
Edje *ed,
|
||||
|
@ -1476,20 +1839,13 @@ _edje_part_recalc_single_textblock(FLOAT_T sc,
|
|||
int *minw, int *minh,
|
||||
int *maxw, int *maxh)
|
||||
{
|
||||
int min_calc_w = 0, min_calc_h = 0;
|
||||
|
||||
if ((ep->type != EDJE_RP_TYPE_TEXT) ||
|
||||
(!ep->typedata.text))
|
||||
return;
|
||||
|
||||
/* min_calc_* values need to save calculated minumum size
|
||||
* for maximum size calculation */
|
||||
if (minw) min_calc_w = *minw;
|
||||
if (minh) min_calc_h = *minh;
|
||||
|
||||
if (chosen_desc)
|
||||
{
|
||||
Evas_Coord tw, th, ins_l, ins_r, ins_t, ins_b;
|
||||
Evas_Coord tw, th;
|
||||
const char *text = "";
|
||||
const char *style = "";
|
||||
Edje_Style *stl = NULL;
|
||||
|
@ -1629,279 +1985,22 @@ _edje_part_recalc_single_textblock(FLOAT_T sc,
|
|||
{
|
||||
evas_object_textblock_text_markup_set(ep->object, text);
|
||||
}
|
||||
if ((chosen_desc->text.min_x) || (chosen_desc->text.min_y))
|
||||
|
||||
if ((ed->file->efl_version.major >= 1) && (ed->file->efl_version.minor >= 19))
|
||||
{
|
||||
evas_object_textblock_style_insets_get(ep->object, &ins_l,
|
||||
&ins_r, &ins_t, &ins_b);
|
||||
|
||||
tw = th = 0;
|
||||
if (!chosen_desc->text.min_x)
|
||||
{
|
||||
/* text.min: 0 1
|
||||
* text.max: X X */
|
||||
int temp_h = TO_INT(params->eval.h);
|
||||
int temp_w = TO_INT(params->eval.w);
|
||||
|
||||
if (min_calc_w > temp_w)
|
||||
temp_w = min_calc_w;
|
||||
if ((!chosen_desc->text.max_x) &&
|
||||
maxw && (*maxw > -1) && (*maxw < temp_w))
|
||||
temp_w = *maxw;
|
||||
|
||||
if (chosen_desc->text.max_y)
|
||||
{
|
||||
/* text.min: 0 1
|
||||
* text.max: X 1 */
|
||||
temp_h = INT_MAX / 10000;
|
||||
}
|
||||
else if (maxh && (*maxh > TO_INT(params->eval.h)))
|
||||
{
|
||||
/* text.min: 0 1
|
||||
* text.max: X 0
|
||||
* And there is a limit for height. */
|
||||
temp_h = *maxh;
|
||||
}
|
||||
|
||||
/* If base width for calculation is 0,
|
||||
* don't get meaningless height for multiline */
|
||||
if (temp_w > 0)
|
||||
{
|
||||
efl_gfx_size_set(ep->object, temp_w, temp_h);
|
||||
efl_canvas_text_size_formatted_get(ep->object, &tw, &th);
|
||||
|
||||
tw += ins_l + ins_r;
|
||||
th += ins_t + ins_b;
|
||||
}
|
||||
else
|
||||
{
|
||||
efl_canvas_text_size_native_get(ep->object, NULL, &th);
|
||||
|
||||
th += ins_t + ins_b;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
/* text.min: 1 X
|
||||
* text.max: X X */
|
||||
if (chosen_desc->text.min_y && (!chosen_desc->text.max_x) &&
|
||||
maxw && (*maxw > -1))
|
||||
{
|
||||
/* text.min: 1 1
|
||||
* text.max: 0 X */
|
||||
int temp_w, temp_h;
|
||||
|
||||
temp_w = *maxw;
|
||||
temp_h = INT_MAX / 10000;
|
||||
|
||||
if (min_calc_w > temp_w)
|
||||
temp_w = min_calc_w;
|
||||
|
||||
if ((!chosen_desc->text.max_y) && maxh && (*maxh > -1))
|
||||
{
|
||||
/* text.min: 1 1
|
||||
* text.max: 0 0
|
||||
* There is limit for height. */
|
||||
temp_h = *maxh;
|
||||
}
|
||||
|
||||
efl_gfx_size_set(ep->object, temp_w, temp_h);
|
||||
efl_canvas_text_size_formatted_get(ep->object, &tw, &th);
|
||||
|
||||
tw += ins_l + ins_r;
|
||||
th += ins_t + ins_b;
|
||||
|
||||
/* If base width for calculation is 0,
|
||||
* don't get meaningless height for multiline */
|
||||
if (temp_w <= 0)
|
||||
{
|
||||
efl_canvas_text_size_native_get(ep->object, NULL, &th);
|
||||
|
||||
th += ins_t + ins_b;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
/* text.min: 1 X
|
||||
* text.max: 1 X
|
||||
* Or,
|
||||
* text.min: 1 X
|
||||
* text.max: 0 X without max width.
|
||||
* It is a singleline Textblock. */
|
||||
efl_canvas_text_size_native_get(ep->object, &tw, &th);
|
||||
|
||||
tw += ins_l + ins_r;
|
||||
th += ins_t + ins_b;
|
||||
|
||||
if (!chosen_desc->text.max_x &&
|
||||
(maxw && (*maxw > -1) && (*maxw < tw)))
|
||||
{
|
||||
/* text.min: 1 0
|
||||
* text.max: 0 X */
|
||||
tw = *maxw;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (tw > min_calc_w) min_calc_w = tw;
|
||||
if (th > min_calc_h) min_calc_h = th;
|
||||
if (chosen_desc->text.min_x && minw) *minw = min_calc_w;
|
||||
if (chosen_desc->text.min_y && minh) *minh = min_calc_h;
|
||||
_edje_part_recalc_single_textblock_min_max_calc(ep,
|
||||
chosen_desc,
|
||||
params,
|
||||
minw, minh,
|
||||
maxw, maxh);
|
||||
}
|
||||
|
||||
if ((chosen_desc->text.max_x) || (chosen_desc->text.max_y))
|
||||
else
|
||||
{
|
||||
evas_object_textblock_style_insets_get(ep->object, &ins_l, &ins_r,
|
||||
&ins_t, &ins_b);
|
||||
|
||||
tw = th = 0;
|
||||
if (!chosen_desc->text.max_x)
|
||||
{
|
||||
/* text.min: X X
|
||||
* text.max: 0 1 */
|
||||
int temp_w, temp_h;
|
||||
|
||||
if (chosen_desc->text.min_y)
|
||||
{
|
||||
/* text.min: X 1
|
||||
* text.max: 0 1
|
||||
* Already calculated in text for height. */
|
||||
tw = TO_INT(params->eval.w);
|
||||
if (min_calc_w > tw)
|
||||
tw = min_calc_w;
|
||||
|
||||
th = min_calc_h;
|
||||
}
|
||||
else
|
||||
{
|
||||
/* text.min: X 0
|
||||
* text.max: 0 1 */
|
||||
temp_w = TO_INT(params->eval.w);
|
||||
temp_h = TO_INT(params->eval.h);
|
||||
|
||||
if (min_calc_w > temp_w)
|
||||
temp_w = min_calc_w;
|
||||
if (maxw && (*maxw > -1) && (*maxw < temp_w))
|
||||
temp_w = *maxw;
|
||||
if (min_calc_h > temp_h)
|
||||
temp_h = min_calc_h;
|
||||
|
||||
/* If base width for calculation is 0,
|
||||
* don't get meaningless height for multiline */
|
||||
if (temp_w > 0)
|
||||
{
|
||||
efl_gfx_size_set(ep->object, temp_w, temp_h);
|
||||
efl_canvas_text_size_formatted_get(ep->object, &tw, &th);
|
||||
|
||||
tw += ins_l + ins_r;
|
||||
th += ins_t + ins_b;
|
||||
}
|
||||
else
|
||||
{
|
||||
efl_canvas_text_size_native_get(ep->object, NULL, &th);
|
||||
|
||||
th += ins_t + ins_b;
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
/* text.max: 1 X */
|
||||
if (chosen_desc->text.min_x)
|
||||
{
|
||||
/* text.min: 1 X
|
||||
* text.max: 1 X
|
||||
* Singleline. */
|
||||
efl_canvas_text_size_native_get(ep->object, &tw, &th);
|
||||
|
||||
tw += ins_l + ins_r;
|
||||
th += ins_t + ins_b;
|
||||
}
|
||||
else
|
||||
{
|
||||
/* text.min: 0 X
|
||||
* text.max: 1 X */
|
||||
if (chosen_desc->text.max_y)
|
||||
{
|
||||
/* text.min: 0 X
|
||||
* text.max: 1 1 */
|
||||
int temp_w, temp_h;
|
||||
|
||||
temp_w = TO_INT(params->eval.w);
|
||||
temp_h = TO_INT(params->eval.h);
|
||||
|
||||
if (min_calc_w > temp_w)
|
||||
temp_w = min_calc_w;
|
||||
if (min_calc_h > temp_h)
|
||||
temp_h = min_calc_h;
|
||||
|
||||
if (chosen_desc->text.min_y)
|
||||
{
|
||||
/* text.min: 0 1
|
||||
* text.max: 1 1
|
||||
* There is no need to calculate it again. */
|
||||
tw = min_calc_w;
|
||||
th = min_calc_h;
|
||||
}
|
||||
else
|
||||
{
|
||||
/* text.min: 0 0
|
||||
* text.max: 1 1 */
|
||||
|
||||
efl_gfx_size_set(ep->object, temp_w, temp_h);
|
||||
efl_canvas_text_size_formatted_get(ep->object, &tw, &th);
|
||||
|
||||
tw += ins_l + ins_r;
|
||||
th += ins_t + ins_b;
|
||||
|
||||
/* If base width for calculation is 0,
|
||||
* don't get meaningless height for multiline */
|
||||
if (temp_w <= 0)
|
||||
{
|
||||
efl_canvas_text_size_native_get(ep->object, NULL, &th);
|
||||
|
||||
th += ins_t + ins_b;
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
/* text.min: 0 X
|
||||
* text.max: 1 0 */
|
||||
int temp_w, temp_h;
|
||||
|
||||
temp_w = TO_INT(params->eval.w);
|
||||
if (min_calc_w > temp_w)
|
||||
temp_w = min_calc_w;
|
||||
|
||||
efl_gfx_size_get(ep->object, NULL, &temp_h);
|
||||
efl_gfx_size_set(ep->object, temp_w, temp_h);
|
||||
efl_canvas_text_size_formatted_get(ep->object, &tw, &th);
|
||||
|
||||
tw += ins_l + ins_r;
|
||||
th += ins_t + ins_b;
|
||||
|
||||
/* If base width for calculation is 0,
|
||||
* don't get meaningless height for multiline */
|
||||
if (temp_w <= 0)
|
||||
{
|
||||
efl_canvas_text_size_native_get(ep->object, NULL, &th);
|
||||
|
||||
th += ins_t + ins_b;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (maxw && chosen_desc->text.max_x)
|
||||
{
|
||||
if (tw > *maxw) *maxw = tw;
|
||||
if (minw && (*maxw < *minw)) *maxw = *minw;
|
||||
}
|
||||
if (maxh && chosen_desc->text.max_y)
|
||||
{
|
||||
if (th > *maxh) *maxh = th;
|
||||
if (minh && (*maxh < *minh)) *maxh = *minh;
|
||||
}
|
||||
_edje_part_recalc_single_textblock_min_max_calc_legacy(ep,
|
||||
chosen_desc,
|
||||
params,
|
||||
minw, minh,
|
||||
maxw, maxh);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -605,6 +605,7 @@ struct _Edje_File
|
|||
unsigned char allocated_strings : 1;
|
||||
unsigned char dangling : 1;
|
||||
unsigned char warning : 1;
|
||||
unsigned char has_textblock_min_max : 1;
|
||||
};
|
||||
|
||||
struct _Edje_Style
|
||||
|
|
|
@ -3233,6 +3233,10 @@ _edje_object_size_min_restricted_calc(Eo *obj EINA_UNUSED, Edje *ed, Evas_Coord
|
|||
Eina_Bool repeat_w, repeat_h;
|
||||
Eina_Bool reset_max = EINA_TRUE;
|
||||
Edje_Real_Part *pep = NULL;
|
||||
/* Only for legacy calculation logic */
|
||||
Evas_Coord ins_l, ins_r;
|
||||
Eina_Bool has_fixed_tb;
|
||||
Eina_Bool legacy_calc;
|
||||
|
||||
if ((!ed) || (!ed->collection))
|
||||
{
|
||||
|
@ -3241,6 +3245,20 @@ _edje_object_size_min_restricted_calc(Eo *obj EINA_UNUSED, Edje *ed, Evas_Coord
|
|||
return;
|
||||
}
|
||||
|
||||
/*
|
||||
* It decides a calculation logic according to efl_version of Edje file.
|
||||
* There was wrong/special consideration for Textblock parts.
|
||||
* Becasue of that, Textblock parts can have minimum size according to its text contents
|
||||
* even if there is [text.min: 0 0]. It made people confused.
|
||||
*
|
||||
* To keep backward compatibility, legacy_calc will be used for old version of EDJ files.
|
||||
* With enabling legacy_calc, You can't see proper min/max result accroding to documents.
|
||||
*/
|
||||
if (!ed->file || ((ed->file->efl_version.major >= 1) && (ed->file->efl_version.minor >= 19)))
|
||||
legacy_calc = EINA_FALSE;
|
||||
else
|
||||
legacy_calc = EINA_TRUE;
|
||||
|
||||
//Simulate object minimum size.
|
||||
ed->calc_only = EINA_TRUE;
|
||||
|
||||
|
@ -3276,6 +3294,8 @@ again:
|
|||
}
|
||||
|
||||
pep = NULL;
|
||||
/* Only for legacy calculation logic */
|
||||
has_fixed_tb = EINA_TRUE;
|
||||
|
||||
//for parts
|
||||
for (i = 0; i < ed->table_parts_size; i++)
|
||||
|
@ -3288,21 +3308,61 @@ again:
|
|||
int over_w = (ep->w - ep->req.w);
|
||||
int over_h = (ep->h - ep->req.h);
|
||||
|
||||
/* Only for legacy calculation logic */
|
||||
Eina_Bool skip_h = EINA_FALSE;
|
||||
|
||||
//width
|
||||
if ((!ep->chosen_description->fixed.w) &&
|
||||
(over_w > max_over_w))
|
||||
if (!ep->chosen_description->fixed.w)
|
||||
{
|
||||
max_over_w = over_w;
|
||||
repeat_w = EINA_TRUE;
|
||||
pep = ep;
|
||||
if ((legacy_calc) && (ep->part->type == EDJE_PART_TYPE_TEXTBLOCK))
|
||||
{
|
||||
//We care textblock width size specially.
|
||||
Evas_Coord tb_mw;
|
||||
evas_object_textblock_size_formatted_get(ep->object,
|
||||
&tb_mw, NULL);
|
||||
evas_object_textblock_style_insets_get(ep->object, &ins_l, &ins_r, NULL, NULL);
|
||||
tb_mw = ins_l + tb_mw + ins_r;
|
||||
tb_mw -= ep->req.w;
|
||||
if (tb_mw > over_w) over_w = tb_mw;
|
||||
has_fixed_tb = EINA_FALSE;
|
||||
}
|
||||
|
||||
if (over_w > max_over_w)
|
||||
{
|
||||
max_over_w = over_w;
|
||||
repeat_w = EINA_TRUE;
|
||||
pep = ep;
|
||||
|
||||
/* Only for legacy calculation logic */
|
||||
skip_h = EINA_TRUE;
|
||||
}
|
||||
}
|
||||
//height
|
||||
if ((!ep->chosen_description->fixed.h) &&
|
||||
(over_h > max_over_h))
|
||||
if (!ep->chosen_description->fixed.h)
|
||||
{
|
||||
max_over_h = over_h;
|
||||
repeat_h = EINA_TRUE;
|
||||
pep = ep;
|
||||
if (legacy_calc)
|
||||
{
|
||||
if ((ep->part->type != EDJE_PART_TYPE_TEXTBLOCK) ||
|
||||
((Edje_Part_Description_Text *)ep->chosen_description)->text.min_x ||
|
||||
!skip_h)
|
||||
{
|
||||
if (over_h > max_over_h)
|
||||
{
|
||||
max_over_h = over_h;
|
||||
repeat_h = EINA_TRUE;
|
||||
pep = ep;
|
||||
}
|
||||
}
|
||||
|
||||
if (ep->part->type == EDJE_PART_TYPE_TEXTBLOCK)
|
||||
has_fixed_tb = EINA_FALSE;
|
||||
}
|
||||
else if (over_h > max_over_h)
|
||||
{
|
||||
max_over_h = over_h;
|
||||
repeat_h = EINA_TRUE;
|
||||
pep = ep;
|
||||
}
|
||||
}
|
||||
}
|
||||
if (repeat_w)
|
||||
|
@ -3322,14 +3382,32 @@ again:
|
|||
|
||||
if (reset_max && (calc_count > CALC_COUNT_LIMIT))
|
||||
{
|
||||
/* We should possibly avoid all of this if in this case, but in
|
||||
* the meanwhile, just doing this. */
|
||||
if (pep)
|
||||
ERR("file %s, group %s has a non-fixed part '%s'. Adding 'fixed: 1 1;' to source EDC may help. Continuing discarding faulty part.",
|
||||
ed->path, ed->group, pep->part->name);
|
||||
if (legacy_calc)
|
||||
{
|
||||
/* Only print it if we have a non-fixed textblock.
|
||||
* We should possibly avoid all of this if in this case, but in
|
||||
* the meanwhile, just doing this. */
|
||||
if (!has_fixed_tb)
|
||||
{
|
||||
if (pep)
|
||||
ERR("file %s, group %s has a non-fixed part '%s'. Adding 'fixed: 1 1;' to source EDC may help. Continuing discarding faulty part.",
|
||||
ed->path, ed->group, pep->part->name);
|
||||
else
|
||||
ERR("file %s, group %s runs infinite minimum calculation loops.Continuing discarding faulty parts.",
|
||||
ed->path, ed->group);
|
||||
}
|
||||
}
|
||||
else
|
||||
ERR("file %s, group %s runs infinite minimum calculation loops.Continuing discarding faulty parts.",
|
||||
ed->path, ed->group);
|
||||
{
|
||||
/* We should possibly avoid all of this if in this case, but in
|
||||
* the meanwhile, just doing this. */
|
||||
if (pep)
|
||||
ERR("file %s, group %s has a non-fixed part '%s'. Adding 'fixed: 1 1;' to source EDC may help. Continuing discarding faulty part.",
|
||||
ed->path, ed->group, pep->part->name);
|
||||
else
|
||||
ERR("file %s, group %s runs infinite minimum calculation loops.Continuing discarding faulty parts.",
|
||||
ed->path, ed->group);
|
||||
}
|
||||
|
||||
reset_max = EINA_FALSE;
|
||||
goto again;
|
||||
|
@ -3345,6 +3423,7 @@ again:
|
|||
|
||||
ed->w = orig_w;
|
||||
ed->h = orig_h;
|
||||
|
||||
ed->dirty = EINA_TRUE;
|
||||
#ifdef EDJE_CALC_CACHE
|
||||
ed->all_part_change = EINA_TRUE;
|
||||
|
|
Loading…
Reference in New Issue