diff options
author | Carsten Haitzler (Rasterman) <raster@rasterman.com> | 2017-09-11 21:36:47 +0900 |
---|---|---|
committer | Carsten Haitzler (Rasterman) <raster@rasterman.com> | 2017-09-15 07:35:34 +0900 |
commit | 0f08ee686ecf91d7815f35ddc8481fd7d2936988 (patch) | |
tree | b382424dbf5c18dbc1d52401ebb92ca89a6864a1 | |
parent | a10a1fa641260adbb9571d3899404b4474629b19 (diff) | |
download | efl-0f08ee686ecf91d7815f35ddc8481fd7d2936988.tar.gz |
evas box - fix longstanding bug where min size is miscalculated
this has affected edje for... like... ever. min size of boxes just
doesnt work. because evas box just doesnt do it right. this has led to
nasty things where edje box is just not usable if you use weight of 0.
btw weight 0 means "stay at min size no matter what even if we expand
the box to be bigger" in edje... which is totally broken and i can't
fix that without potentially breaking even more stuff... but let's
see. i've been using this for several days now and ... i can't find
breakage... so this should fix up SOME issues in edje.
@fix
-rw-r--r-- | src/lib/evas/canvas/evas_object_box.c | 36 |
1 files changed, 20 insertions, 16 deletions
diff --git a/src/lib/evas/canvas/evas_object_box.c b/src/lib/evas/canvas/evas_object_box.c index 5c486285f2..4673a7cd94 100644 --- a/src/lib/evas/canvas/evas_object_box.c +++ b/src/lib/evas/canvas/evas_object_box.c @@ -678,7 +678,7 @@ EOLIAN static void _evas_box_layout_horizontal(Eo *o, Evas_Object_Box_Data *priv, Evas_Object_Box_Data *boxdata EINA_UNUSED, void *data EINA_UNUSED) { int pad_inc = 0, sub_pixel = 0; - int req_w, global_pad, remaining, top_h = 0; + int req_w, global_pad, remaining, top_h = 0, totalminw = 0; double weight_total = 0.0; int weight_use = 0; int x, y, w, h; @@ -704,11 +704,13 @@ _evas_box_layout_horizontal(Eo *o, Evas_Object_Box_Data *priv, Evas_Object_Box_D evas_object_geometry_get(o, &x, &y, &w, &h); global_pad = priv->pad.h; req_w = global_pad * (n_children - 1); + totalminw = req_w; EINA_LIST_FOREACH(priv->children, l, opt) { int padding_l, padding_r; double weight_x; + int minw; _sizing_eval(opt->obj); evas_object_size_hint_weight_get(opt->obj, &weight_x, NULL); @@ -716,12 +718,11 @@ _evas_box_layout_horizontal(Eo *o, Evas_Object_Box_Data *priv, Evas_Object_Box_D (opt->obj, &padding_l, &padding_r, NULL, NULL); req_w += padding_l + padding_r; + efl_gfx_size_hint_combined_min_get(opt->obj, &minw, NULL); + if (minw > 0) totalminw += minw + padding_l + padding_r; if (EINA_DBL_EQ(weight_x, 0.0)) { - int child_w; - - evas_object_geometry_get(opt->obj, NULL, NULL, &child_w, NULL); - req_w += child_w; + if (minw > 0) req_w += minw; } else { @@ -750,7 +751,7 @@ _evas_box_layout_horizontal(Eo *o, Evas_Object_Box_Data *priv, Evas_Object_Box_D EINA_LIST_FOREACH(priv->children, l, opt) { - int child_w, child_h, max_h, new_h, off_x, off_y; + int child_w, child_h, max_h, new_h, off_x, off_y, minw, minh; int padding_l, padding_r, padding_t, padding_b; double align_y; @@ -759,10 +760,11 @@ _evas_box_layout_horizontal(Eo *o, Evas_Object_Box_Data *priv, Evas_Object_Box_D (opt->obj, &padding_l, &padding_r, &padding_t, &padding_b); evas_object_size_hint_max_get(opt->obj, NULL, &max_h); + efl_gfx_size_hint_combined_min_get(opt->obj, &minw, &minh); evas_object_geometry_get(opt->obj, NULL, NULL, &child_w, &child_h); off_x = padding_l; - new_h = child_h; + new_h = minh; if (new_h > top_h) top_h = new_h; _layout_set_offset_and_expand_dimension_space_max_bounded @@ -781,7 +783,7 @@ _evas_box_layout_horizontal(Eo *o, Evas_Object_Box_Data *priv, Evas_Object_Box_D } } - evas_object_size_hint_min_set(o, req_w, top_h); + evas_object_size_hint_min_set(o, totalminw, top_h); } static int @@ -842,7 +844,7 @@ EOLIAN static void _evas_box_layout_vertical(Eo *o, Evas_Object_Box_Data *priv, Evas_Object_Box_Data *boxdata EINA_UNUSED, void *data EINA_UNUSED) { int pad_inc = 0, sub_pixel = 0; - int req_h, global_pad, remaining, top_w = 0; + int req_h, global_pad, remaining, top_w = 0, totalminh = 0; double weight_total = 0.0; int weight_use = 0; int x, y, w, h; @@ -868,11 +870,13 @@ _evas_box_layout_vertical(Eo *o, Evas_Object_Box_Data *priv, Evas_Object_Box_Dat evas_object_geometry_get(o, &x, &y, &w, &h); global_pad = priv->pad.v; req_h = global_pad * (n_children - 1); + totalminh = req_h; EINA_LIST_FOREACH(priv->children, l, opt) { int padding_t, padding_b; double weight_y; + int minh; _sizing_eval(opt->obj); evas_object_size_hint_weight_get(opt->obj, NULL, &weight_y); @@ -880,12 +884,11 @@ _evas_box_layout_vertical(Eo *o, Evas_Object_Box_Data *priv, Evas_Object_Box_Dat (opt->obj, NULL, NULL, &padding_t, &padding_b); req_h += padding_t + padding_b; + efl_gfx_size_hint_combined_min_get(opt->obj, NULL, &minh); + if (minh > 0) totalminh += minh + padding_t + padding_b; if (EINA_DBL_EQ(weight_y, 0.0)) { - int child_h; - - evas_object_geometry_get(opt->obj, NULL, NULL, NULL, &child_h); - req_h += child_h; + if (minh > 0) req_h += minh; } else { @@ -914,7 +917,7 @@ _evas_box_layout_vertical(Eo *o, Evas_Object_Box_Data *priv, Evas_Object_Box_Dat EINA_LIST_FOREACH(priv->children, l, opt) { - int child_w, child_h, max_w, new_w, off_x, off_y; + int child_w, child_h, max_w, new_w, off_x, off_y, minw, minh; int padding_l, padding_r, padding_t, padding_b; double align_x; @@ -923,10 +926,11 @@ _evas_box_layout_vertical(Eo *o, Evas_Object_Box_Data *priv, Evas_Object_Box_Dat (opt->obj, &padding_l, &padding_r, &padding_t, &padding_b); evas_object_size_hint_max_get(opt->obj, &max_w, NULL); + efl_gfx_size_hint_combined_min_get(opt->obj, &minw, &minh); evas_object_geometry_get(opt->obj, NULL, NULL, &child_w, &child_h); off_y = padding_t; - new_w = child_w; + new_w = minw; _layout_set_offset_and_expand_dimension_space_max_bounded (child_w, &new_w, w, max_w, &off_x, align_x, padding_l, padding_r); @@ -946,7 +950,7 @@ _evas_box_layout_vertical(Eo *o, Evas_Object_Box_Data *priv, Evas_Object_Box_Dat } } - evas_object_size_hint_min_set(o, top_w, req_h); + evas_object_size_hint_min_set(o, top_w, totalminh); } EOLIAN static void |