ui.box: implement homogeneous mode

Summary:
On homogeneous mode, children are of the same weight and of the same min size
which is determined by maximum min size of children.

Depends on D7750

Reviewers: Jaehyun_Cho, zmike, jpeg

Reviewed By: zmike

Subscribers: segfaultxavi, cedric, #reviewers, #committers

Tags: #efl

Differential Revision: https://phab.enlightenment.org/D7889
This commit is contained in:
Yeongjong Lee 2019-02-13 08:39:20 -05:00 committed by Mike Blumenkrantz
parent b1f280f0c2
commit 27e101da4b
3 changed files with 59 additions and 8 deletions

View File

@ -80,6 +80,18 @@ _evas_box_custom_layout(Evas_Object *evas_box EINA_UNUSED,
efl_pack_layout_update(obj);
}
EOLIAN static void
_efl_ui_box_homogeneous_set(Eo *obj EINA_UNUSED, Efl_Ui_Box_Data *pd, Eina_Bool homogeneous)
{
pd->homogeneous = !!homogeneous;
}
EOLIAN static Eina_Bool
_efl_ui_box_homogeneous_get(const Eo *obj EINA_UNUSED, Efl_Ui_Box_Data *pd)
{
return pd->homogeneous;
}
EOLIAN static void
_efl_ui_box_efl_pack_layout_layout_update(Eo *obj, Efl_Ui_Box_Data *pd EINA_UNUSED)
{

View File

@ -15,6 +15,18 @@ class Efl.Ui.Box extends Efl.Ui.Widget implements Efl.Pack_Linear, Efl.Pack_Layo
THIS CLASS NEEDS GOOD UP TO DATE DOCUMENTATION. LEGACY BOX AND UI BOX
BEHAVE SLIGHTLY DIFFERENTLY AND USE VASTLY DIFFERENT APIS.
]]
methods {
@property homogeneous {
[[Control homogeneous mode.
This will enable the homogeneous mode where children are of the same
weight and of the same min size which is determined by maximum min
size of children.]]
values {
homogeneous: bool; [[$true if the box is homogeneous, $false otherwise]]
}
}
}
implements {
Efl.Object.constructor;
Efl.Canvas.Group.group_calculate;

View File

@ -86,7 +86,7 @@ _efl_ui_box_custom_layout(Efl_Ui_Box *ui_box, Evas_Object_Box_Data *bd)
Eina_Bool horiz = efl_ui_dir_is_horizontal(pd->dir, EINA_FALSE);
int id = 0, count, boxl = 0, boxr = 0, boxt = 0, boxb = 0;
int length, want, pad;
double cur_pos, weight[2] = { 0, 0 }, scale;
double cur_pos, weight[2] = { 0, 0 }, scale, mmin = 0;
double box_align[2];
Eina_Bool box_fill[2] = { EINA_FALSE, EINA_FALSE };
@ -141,9 +141,9 @@ _efl_ui_box_custom_layout(Efl_Ui_Box *ui_box, Evas_Object_Box_Data *bd)
item->min = efl_gfx_size_hint_combined_min_get(o);
efl_gfx_size_hint_aspect_get(o, &item->aspect_type, &item->aspect);
if (horiz && box_fill[0]) item->weight[0] = 1;
if (horiz && (box_fill[0] || pd->homogeneous)) item->weight[0] = 1;
else if (item->weight[0] < 0) item->weight[0] = 0;
if (!horiz && box_fill[1]) item->weight[1] = 1;
if (!horiz && (box_fill[1] || pd->homogeneous)) item->weight[1] = 1;
else if (item->weight[1] < 0) item->weight[1] = 0;
if (EINA_DBL_EQ(item->align[0], -1))
@ -191,13 +191,29 @@ _efl_ui_box_custom_layout(Efl_Ui_Box *ui_box, Evas_Object_Box_Data *bd)
{
if (item->space[1] > wanth)
wanth = item->space[1];
wantw += item->space[0];
if (pd->homogeneous)
{
if (item->space[0] > mmin)
mmin = item->space[0];
}
else
{
wantw += item->space[0];
}
}
else
{
if (item->space[0] > wantw)
wantw = item->space[0];
wanth += item->space[1];
if (pd->homogeneous)
{
if (item->space[1] > mmin)
mmin = item->space[1];
}
else
{
wanth += item->space[1];
}
}
item->id = id++;
@ -206,6 +222,8 @@ _efl_ui_box_custom_layout(Efl_Ui_Box *ui_box, Evas_Object_Box_Data *bd)
// total space & available space
if (horiz)
{
if (pd->homogeneous)
wantw = mmin * count;
want = wantw;
length = boxs.w;
pad = pd->pad.scalable ? (pd->pad.h * scale) : pd->pad.h;
@ -214,6 +232,8 @@ _efl_ui_box_custom_layout(Efl_Ui_Box *ui_box, Evas_Object_Box_Data *bd)
}
else
{
if (pd->homogeneous)
wanth = mmin * count;
want = wanth;
length = boxs.h;
pad = pd->pad.scalable ? (pd->pad.v * scale) : pd->pad.v;
@ -226,7 +246,7 @@ _efl_ui_box_custom_layout(Efl_Ui_Box *ui_box, Evas_Object_Box_Data *bd)
cur_pos = horiz ? boxs.x : boxs.y;
// calculate weight length
if ((length > want) && (weight[!horiz] > 0))
if (!pd->homogeneous && (length > want) && (weight[!horiz] > 0))
{
int orig_length = length;
double orig_weight = weight[!horiz];
@ -272,12 +292,19 @@ _efl_ui_box_custom_layout(Efl_Ui_Box *ui_box, Evas_Object_Box_Data *bd)
{
int x, y, w, h, sw, sh;
if ((length > want) && EINA_DBL_EQ(weight[!horiz], 0))
cur_pos += (length - want) * box_align[!horiz];
if (length > want)
{
if (pd->homogeneous)
mmin = (double)length / count;
else if (EINA_DBL_EQ(weight[!horiz], 0))
cur_pos += (length - want) * box_align[!horiz];
}
for (id = 0; id < count; id++)
{
item = &items[id];
if (pd->homogeneous)
item->space[!horiz] = mmin;
item->space[horiz] = horiz ? boxs.h : boxs.w;
sw = item->space[0] - item->pad[0] - item->pad[1];
sh = item->space[1] - item->pad[2] - item->pad[3];