efl_ui_table: refactor layout_update
Summary:
There are three reasons to refactor layout_update of Efl.Ui.Table.
=== 1. Inconsistency of hint behavior. ===
Some hint property is often not respected. for example, hint_min is ignored in
Table when it is used with hint_max even if hint_weight is 0. hint_aspect is
always ignored in Table.
The ambiguous behavior make it hard to layout widgets in container. of course,
we documented 'it's just a hint that should be used whenever appropriate.' but i
don't think it means that 'hint API is sometimes respected and we also don't
know when that API is respected.'. at least there is rule for consistent
behavior and we should be able to explain why a widget is located here and
why some hint property is ignored.
So, i'll suggest priority of hint property. this refactoring support following
priority.
1) HintMin
2) HintMin + HintAspect
3) HintMargin
4) HintMax
5) HintAspect
6) HintWeight, HintFill
7) HintAlign
ref T5487
Please check with unit test D7840
=== 2. To Enhance usability. ===
Efl.Ui.Table is using homogeneous mode of evas_table which have same columns,
rows size. but i think a table can generally change columns, rows size and
we can provide homogeneous mode option.(D7892)
In this patch
- table columns(rows) min size is decided by maximum size among its cells
width(height) min size.
- table columns(rows) weight is decided by maximum weight among its cells
horizontal(vertical) weight.
Also, pack_align is implemented. it is used if no item has a weight.
=== 3. To remove internal evas_table. ===
This is low priority work. however, i guess is is necessary for lightweight
container widget. there are two size_hint callback to adjust table size and
efl_canvas_group_calculate is called twice when it is resized.
This patch is first step to remove internal evas_table.
Test Plan:
make check
elementary_test -to 'efl.ui.table'
Reviewers: jpeg, Jaehyun_Cho, zmike
Reviewed By: zmike
Subscribers: zmike, cedric, #reviewers, #committers
Tags: #efl
Maniphest Tasks: T5487
Differential Revision: https://phab.enlightenment.org/D7841
2019-02-27 11:45:27 -08:00
|
|
|
#include "efl_ui_container_layout.h"
|
|
|
|
|
|
|
|
void
|
|
|
|
_efl_ui_container_layout_min_max_calc(Efl_Ui_Container_Item_Hints *item, int *cw, int *ch, Eina_Bool aspect_check)
|
|
|
|
{
|
|
|
|
int w = *cw, h = *ch;
|
|
|
|
Eina_Size2D aspect = { item[0].aspect, item[1].aspect };
|
|
|
|
|
|
|
|
if (aspect_check)
|
|
|
|
{
|
|
|
|
w = h * aspect.w / aspect.h;
|
|
|
|
if (w > *cw)
|
|
|
|
{
|
|
|
|
w = *cw;
|
|
|
|
h = w * aspect.h / aspect.w;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
if (w > item[0].max)
|
|
|
|
{
|
|
|
|
w = item[0].max;
|
|
|
|
if (aspect_check) h = w * aspect.h / aspect.w;
|
|
|
|
}
|
|
|
|
if (h > item[1].max)
|
|
|
|
{
|
|
|
|
h = item[1].max;
|
|
|
|
if (aspect_check) w = h * aspect.w / aspect.h;
|
|
|
|
}
|
|
|
|
if (w < item[0].min)
|
|
|
|
{
|
|
|
|
w = item[0].min;
|
|
|
|
if (aspect_check) h = w * aspect.h / aspect.w;
|
|
|
|
}
|
|
|
|
if (h < item[1].min)
|
|
|
|
{
|
|
|
|
h = item[1].min;
|
|
|
|
if (aspect_check) w = h * aspect.w / aspect.h;
|
|
|
|
}
|
|
|
|
*cw = w;
|
|
|
|
*ch = h;
|
|
|
|
}
|
|
|
|
|
|
|
|
void
|
|
|
|
_efl_ui_container_layout_item_init(Eo* o, Efl_Ui_Container_Item_Hints *item)
|
|
|
|
{
|
|
|
|
Eina_Size2D max;
|
|
|
|
Eina_Size2D min;
|
|
|
|
Eina_Size2D aspect;
|
|
|
|
Efl_Gfx_Hint_Aspect aspect_type;
|
|
|
|
|
|
|
|
efl_gfx_hint_weight_get(o, &item[0].weight, &item[1].weight);
|
|
|
|
efl_gfx_hint_align_get(o, &item[0].align, &item[1].align);
|
|
|
|
efl_gfx_hint_margin_get(o, &item[0].margin[0], &item[0].margin[1],
|
|
|
|
&item[1].margin[0], &item[1].margin[1]);
|
|
|
|
efl_gfx_hint_fill_get(o, &item[0].fill, &item[1].fill);
|
|
|
|
max = efl_gfx_hint_size_max_get(o);
|
|
|
|
min = efl_gfx_hint_size_combined_min_get(o);
|
|
|
|
efl_gfx_hint_aspect_get(o, &aspect_type, &aspect);
|
|
|
|
item[0].aspect = aspect.w;
|
|
|
|
item[1].aspect = aspect.h;
|
|
|
|
item[0].aspect_type = aspect_type;
|
|
|
|
item[1].aspect_type = aspect_type;
|
|
|
|
|
|
|
|
if (EINA_DBL_EQ(item[0].align, -1))
|
|
|
|
{
|
|
|
|
item[0].align = 0.5;
|
|
|
|
item[0].fill = EINA_TRUE;
|
|
|
|
}
|
|
|
|
else if (item[0].align < 0) item[0].align = 0;
|
|
|
|
else if (item[0].align > 1) item[0].align = 1;
|
|
|
|
if (EINA_DBL_EQ(item[1].align, -1))
|
|
|
|
{
|
|
|
|
item[1].align = 0.5;
|
|
|
|
item[1].fill = EINA_TRUE;
|
|
|
|
}
|
|
|
|
else if (item[1].align < 0) item[1].align = 0;
|
|
|
|
else if (item[1].align > 1) item[1].align = 1;
|
|
|
|
|
|
|
|
if (min.w < 0) min.w = 0;
|
|
|
|
if (min.h < 0) min.h = 0;
|
|
|
|
|
|
|
|
if (max.w < 0) max.w = INT_MAX;
|
|
|
|
if (max.h < 0) max.h = INT_MAX;
|
|
|
|
|
|
|
|
item[0].max = max.w;
|
|
|
|
item[1].max = max.h;
|
|
|
|
item[0].min = min.w;
|
|
|
|
item[1].min = min.h;
|
|
|
|
|
2019-03-25 02:56:41 -07:00
|
|
|
if ((item[0].aspect <= 0) || (item[1].aspect <= 0))
|
efl_ui_table: refactor layout_update
Summary:
There are three reasons to refactor layout_update of Efl.Ui.Table.
=== 1. Inconsistency of hint behavior. ===
Some hint property is often not respected. for example, hint_min is ignored in
Table when it is used with hint_max even if hint_weight is 0. hint_aspect is
always ignored in Table.
The ambiguous behavior make it hard to layout widgets in container. of course,
we documented 'it's just a hint that should be used whenever appropriate.' but i
don't think it means that 'hint API is sometimes respected and we also don't
know when that API is respected.'. at least there is rule for consistent
behavior and we should be able to explain why a widget is located here and
why some hint property is ignored.
So, i'll suggest priority of hint property. this refactoring support following
priority.
1) HintMin
2) HintMin + HintAspect
3) HintMargin
4) HintMax
5) HintAspect
6) HintWeight, HintFill
7) HintAlign
ref T5487
Please check with unit test D7840
=== 2. To Enhance usability. ===
Efl.Ui.Table is using homogeneous mode of evas_table which have same columns,
rows size. but i think a table can generally change columns, rows size and
we can provide homogeneous mode option.(D7892)
In this patch
- table columns(rows) min size is decided by maximum size among its cells
width(height) min size.
- table columns(rows) weight is decided by maximum weight among its cells
horizontal(vertical) weight.
Also, pack_align is implemented. it is used if no item has a weight.
=== 3. To remove internal evas_table. ===
This is low priority work. however, i guess is is necessary for lightweight
container widget. there are two size_hint callback to adjust table size and
efl_canvas_group_calculate is called twice when it is resized.
This patch is first step to remove internal evas_table.
Test Plan:
make check
elementary_test -to 'efl.ui.table'
Reviewers: jpeg, Jaehyun_Cho, zmike
Reviewed By: zmike
Subscribers: zmike, cedric, #reviewers, #committers
Tags: #efl
Maniphest Tasks: T5487
Differential Revision: https://phab.enlightenment.org/D7841
2019-02-27 11:45:27 -08:00
|
|
|
{
|
2019-03-25 02:56:41 -07:00
|
|
|
if ((item[0].aspect <= 0) ^ (item[1].aspect <= 0))
|
efl_ui_table: refactor layout_update
Summary:
There are three reasons to refactor layout_update of Efl.Ui.Table.
=== 1. Inconsistency of hint behavior. ===
Some hint property is often not respected. for example, hint_min is ignored in
Table when it is used with hint_max even if hint_weight is 0. hint_aspect is
always ignored in Table.
The ambiguous behavior make it hard to layout widgets in container. of course,
we documented 'it's just a hint that should be used whenever appropriate.' but i
don't think it means that 'hint API is sometimes respected and we also don't
know when that API is respected.'. at least there is rule for consistent
behavior and we should be able to explain why a widget is located here and
why some hint property is ignored.
So, i'll suggest priority of hint property. this refactoring support following
priority.
1) HintMin
2) HintMin + HintAspect
3) HintMargin
4) HintMax
5) HintAspect
6) HintWeight, HintFill
7) HintAlign
ref T5487
Please check with unit test D7840
=== 2. To Enhance usability. ===
Efl.Ui.Table is using homogeneous mode of evas_table which have same columns,
rows size. but i think a table can generally change columns, rows size and
we can provide homogeneous mode option.(D7892)
In this patch
- table columns(rows) min size is decided by maximum size among its cells
width(height) min size.
- table columns(rows) weight is decided by maximum weight among its cells
horizontal(vertical) weight.
Also, pack_align is implemented. it is used if no item has a weight.
=== 3. To remove internal evas_table. ===
This is low priority work. however, i guess is is necessary for lightweight
container widget. there are two size_hint callback to adjust table size and
efl_canvas_group_calculate is called twice when it is resized.
This patch is first step to remove internal evas_table.
Test Plan:
make check
elementary_test -to 'efl.ui.table'
Reviewers: jpeg, Jaehyun_Cho, zmike
Reviewed By: zmike
Subscribers: zmike, cedric, #reviewers, #committers
Tags: #efl
Maniphest Tasks: T5487
Differential Revision: https://phab.enlightenment.org/D7841
2019-02-27 11:45:27 -08:00
|
|
|
{
|
|
|
|
ERR("Invalid aspect parameter for obj(%p)", o);
|
2019-03-25 02:56:41 -07:00
|
|
|
item[0].aspect = item[1].aspect = 0;
|
efl_ui_table: refactor layout_update
Summary:
There are three reasons to refactor layout_update of Efl.Ui.Table.
=== 1. Inconsistency of hint behavior. ===
Some hint property is often not respected. for example, hint_min is ignored in
Table when it is used with hint_max even if hint_weight is 0. hint_aspect is
always ignored in Table.
The ambiguous behavior make it hard to layout widgets in container. of course,
we documented 'it's just a hint that should be used whenever appropriate.' but i
don't think it means that 'hint API is sometimes respected and we also don't
know when that API is respected.'. at least there is rule for consistent
behavior and we should be able to explain why a widget is located here and
why some hint property is ignored.
So, i'll suggest priority of hint property. this refactoring support following
priority.
1) HintMin
2) HintMin + HintAspect
3) HintMargin
4) HintMax
5) HintAspect
6) HintWeight, HintFill
7) HintAlign
ref T5487
Please check with unit test D7840
=== 2. To Enhance usability. ===
Efl.Ui.Table is using homogeneous mode of evas_table which have same columns,
rows size. but i think a table can generally change columns, rows size and
we can provide homogeneous mode option.(D7892)
In this patch
- table columns(rows) min size is decided by maximum size among its cells
width(height) min size.
- table columns(rows) weight is decided by maximum weight among its cells
horizontal(vertical) weight.
Also, pack_align is implemented. it is used if no item has a weight.
=== 3. To remove internal evas_table. ===
This is low priority work. however, i guess is is necessary for lightweight
container widget. there are two size_hint callback to adjust table size and
efl_canvas_group_calculate is called twice when it is resized.
This patch is first step to remove internal evas_table.
Test Plan:
make check
elementary_test -to 'efl.ui.table'
Reviewers: jpeg, Jaehyun_Cho, zmike
Reviewed By: zmike
Subscribers: zmike, cedric, #reviewers, #committers
Tags: #efl
Maniphest Tasks: T5487
Differential Revision: https://phab.enlightenment.org/D7841
2019-02-27 11:45:27 -08:00
|
|
|
item[0].aspect_type = item[1].aspect_type = EFL_GFX_HINT_ASPECT_NONE;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
_efl_ui_container_layout_min_max_calc(item, &item[0].min, &item[1].min,
|
|
|
|
EINA_TRUE);
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
item[0].space = item[0].min + item[0].margin[0] + item[0].margin[1];
|
|
|
|
item[1].space = item[1].min + item[1].margin[0] + item[1].margin[1];
|
|
|
|
}
|
|
|
|
|
|
|
|
void
|
|
|
|
_efl_ui_container_layout_init(Eo* obj, Efl_Ui_Container_Layout_Calc *calc)
|
|
|
|
{
|
|
|
|
Eina_Rect geom;
|
|
|
|
Eina_Bool pad_scalable;
|
|
|
|
|
|
|
|
geom = efl_gfx_entity_geometry_get(obj);
|
|
|
|
efl_gfx_hint_margin_get(obj, &calc[0].margin[0], &calc[0].margin[1],
|
|
|
|
&calc[1].margin[0], &calc[1].margin[1]);
|
|
|
|
calc[0].scale = calc[1].scale = efl_gfx_entity_scale_get(obj);
|
|
|
|
|
2019-04-24 06:41:39 -07:00
|
|
|
efl_gfx_arrangement_content_padding_get(obj, &calc[0].pad, &calc[1].pad, &pad_scalable);
|
efl_ui_table: refactor layout_update
Summary:
There are three reasons to refactor layout_update of Efl.Ui.Table.
=== 1. Inconsistency of hint behavior. ===
Some hint property is often not respected. for example, hint_min is ignored in
Table when it is used with hint_max even if hint_weight is 0. hint_aspect is
always ignored in Table.
The ambiguous behavior make it hard to layout widgets in container. of course,
we documented 'it's just a hint that should be used whenever appropriate.' but i
don't think it means that 'hint API is sometimes respected and we also don't
know when that API is respected.'. at least there is rule for consistent
behavior and we should be able to explain why a widget is located here and
why some hint property is ignored.
So, i'll suggest priority of hint property. this refactoring support following
priority.
1) HintMin
2) HintMin + HintAspect
3) HintMargin
4) HintMax
5) HintAspect
6) HintWeight, HintFill
7) HintAlign
ref T5487
Please check with unit test D7840
=== 2. To Enhance usability. ===
Efl.Ui.Table is using homogeneous mode of evas_table which have same columns,
rows size. but i think a table can generally change columns, rows size and
we can provide homogeneous mode option.(D7892)
In this patch
- table columns(rows) min size is decided by maximum size among its cells
width(height) min size.
- table columns(rows) weight is decided by maximum weight among its cells
horizontal(vertical) weight.
Also, pack_align is implemented. it is used if no item has a weight.
=== 3. To remove internal evas_table. ===
This is low priority work. however, i guess is is necessary for lightweight
container widget. there are two size_hint callback to adjust table size and
efl_canvas_group_calculate is called twice when it is resized.
This patch is first step to remove internal evas_table.
Test Plan:
make check
elementary_test -to 'efl.ui.table'
Reviewers: jpeg, Jaehyun_Cho, zmike
Reviewed By: zmike
Subscribers: zmike, cedric, #reviewers, #committers
Tags: #efl
Maniphest Tasks: T5487
Differential Revision: https://phab.enlightenment.org/D7841
2019-02-27 11:45:27 -08:00
|
|
|
calc[0].pad = pad_scalable ? (calc[0].pad * calc[0].scale) : calc[0].pad;
|
|
|
|
calc[1].pad = pad_scalable ? (calc[1].pad * calc[1].scale) : calc[1].pad;
|
|
|
|
|
|
|
|
// pack align is used if "no item has a weight"
|
2019-04-24 06:41:39 -07:00
|
|
|
efl_gfx_arrangement_content_align_get(obj, &calc[0].align, &calc[1].align);
|
efl_ui_table: refactor layout_update
Summary:
There are three reasons to refactor layout_update of Efl.Ui.Table.
=== 1. Inconsistency of hint behavior. ===
Some hint property is often not respected. for example, hint_min is ignored in
Table when it is used with hint_max even if hint_weight is 0. hint_aspect is
always ignored in Table.
The ambiguous behavior make it hard to layout widgets in container. of course,
we documented 'it's just a hint that should be used whenever appropriate.' but i
don't think it means that 'hint API is sometimes respected and we also don't
know when that API is respected.'. at least there is rule for consistent
behavior and we should be able to explain why a widget is located here and
why some hint property is ignored.
So, i'll suggest priority of hint property. this refactoring support following
priority.
1) HintMin
2) HintMin + HintAspect
3) HintMargin
4) HintMax
5) HintAspect
6) HintWeight, HintFill
7) HintAlign
ref T5487
Please check with unit test D7840
=== 2. To Enhance usability. ===
Efl.Ui.Table is using homogeneous mode of evas_table which have same columns,
rows size. but i think a table can generally change columns, rows size and
we can provide homogeneous mode option.(D7892)
In this patch
- table columns(rows) min size is decided by maximum size among its cells
width(height) min size.
- table columns(rows) weight is decided by maximum weight among its cells
horizontal(vertical) weight.
Also, pack_align is implemented. it is used if no item has a weight.
=== 3. To remove internal evas_table. ===
This is low priority work. however, i guess is is necessary for lightweight
container widget. there are two size_hint callback to adjust table size and
efl_canvas_group_calculate is called twice when it is resized.
This patch is first step to remove internal evas_table.
Test Plan:
make check
elementary_test -to 'efl.ui.table'
Reviewers: jpeg, Jaehyun_Cho, zmike
Reviewed By: zmike
Subscribers: zmike, cedric, #reviewers, #committers
Tags: #efl
Maniphest Tasks: T5487
Differential Revision: https://phab.enlightenment.org/D7841
2019-02-27 11:45:27 -08:00
|
|
|
if (calc[0].align < 0)
|
|
|
|
{
|
|
|
|
calc[0].fill = EINA_TRUE;
|
|
|
|
calc[0].align = 0.5;
|
|
|
|
}
|
|
|
|
else if (calc[0].align > 1)
|
|
|
|
{
|
|
|
|
calc[0].align = 1;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
calc[0].fill = EINA_FALSE;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (calc[1].align < 0)
|
|
|
|
{
|
|
|
|
calc[1].fill = EINA_TRUE;
|
|
|
|
calc[1].align = 0.5;
|
|
|
|
}
|
|
|
|
else if (calc[1].align > 1)
|
|
|
|
{
|
|
|
|
calc[1].align = 1;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
calc[1].fill = EINA_FALSE;
|
|
|
|
}
|
|
|
|
calc[0].pos = geom.x + calc[0].margin[0];
|
|
|
|
calc[1].pos = geom.y + calc[1].margin[0];
|
|
|
|
calc[0].size = geom.w - calc[0].margin[0] - calc[0].margin[1];
|
|
|
|
calc[1].size = geom.h - calc[1].margin[0] - calc[1].margin[1];
|
|
|
|
}
|