From 0b7cd8d88ec2192b60c830a5d0d2bd89fd859c84 Mon Sep 17 00:00:00 2001 From: Yeongjong Lee Date: Thu, 7 Mar 2019 01:40:23 +0000 Subject: [PATCH] ui.box, ui.table: respect user min Use restricted_min_set instead of min_set in layout_update. min_set is set by public API(user side). if it is changed by internal function, user will get unexpected value later. please check added test case. Note that this reverts commit e013480e7a0ae11a9363f9a207cf63e3bb7f5423. instead, this patch provides better solution of the issue refered in e013480e7. Reviewed-by: Xavi Artigas Differential Revision: https://phab.enlightenment.org/D8214 --- src/lib/elementary/efl_ui_box_layout.c | 7 +-- src/lib/elementary/efl_ui_container_layout.c | 4 -- src/lib/elementary/efl_ui_container_layout.h | 1 - src/lib/elementary/efl_ui_table_layout.c | 12 ++-- src/tests/elementary/efl_ui_test_box.c | 65 +++++++++++++++++++- src/tests/elementary/efl_ui_test_table.c | 65 +++++++++++++++++++- 6 files changed, 134 insertions(+), 20 deletions(-) diff --git a/src/lib/elementary/efl_ui_box_layout.c b/src/lib/elementary/efl_ui_box_layout.c index c66a1a8c2e..4cc00e0c48 100644 --- a/src/lib/elementary/efl_ui_box_layout.c +++ b/src/lib/elementary/efl_ui_box_layout.c @@ -47,7 +47,7 @@ _efl_ui_box_custom_layout(Efl_Ui_Box *ui_box, Evas_Object_Box_Data *bd) count = eina_list_count(bd->children); if (!count) { - efl_gfx_hint_size_min_set(ui_box, EINA_SIZE2D(0, 0)); + efl_gfx_hint_size_restricted_min_set(ui_box, EINA_SIZE2D(0, 0)); return; } @@ -199,8 +199,5 @@ _efl_ui_box_custom_layout(Efl_Ui_Box *ui_box, Evas_Object_Box_Data *bd) want[1] += (box_calc[1].margin[0] + box_calc[1].margin[1]) + (box_calc[1].pad * (count - 1)); - if (want[0] < box_calc[0].min) want[0] = box_calc[0].min; - if (want[1] < box_calc[1].min) want[1] = box_calc[1].min; - - efl_gfx_hint_size_min_set(ui_box, EINA_SIZE2D(want[0], want[1])); + efl_gfx_hint_size_restricted_min_set(ui_box, EINA_SIZE2D(want[0], want[1])); } diff --git a/src/lib/elementary/efl_ui_container_layout.c b/src/lib/elementary/efl_ui_container_layout.c index 4fbdc07b91..e8c5979dd0 100644 --- a/src/lib/elementary/efl_ui_container_layout.c +++ b/src/lib/elementary/efl_ui_container_layout.c @@ -112,14 +112,10 @@ _efl_ui_container_layout_init(Eo* obj, Efl_Ui_Container_Layout_Calc *calc) { Eina_Rect geom; Eina_Bool pad_scalable; - Eina_Size2D min; 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]); - min = efl_gfx_hint_size_combined_min_get(obj); - calc[0].min = min.w; - calc[1].min = min.h; calc[0].scale = calc[1].scale = efl_gfx_entity_scale_get(obj); efl_pack_padding_get(obj, &calc[0].pad, &calc[1].pad, &pad_scalable); diff --git a/src/lib/elementary/efl_ui_container_layout.h b/src/lib/elementary/efl_ui_container_layout.h index 85d3695e9d..097abee13b 100644 --- a/src/lib/elementary/efl_ui_container_layout.h +++ b/src/lib/elementary/efl_ui_container_layout.h @@ -28,7 +28,6 @@ struct _Efl_Ui_Container_Layout_Calc { int pos; int size; - int min; int margin[2]; double align; double scale; diff --git a/src/lib/elementary/efl_ui_table_layout.c b/src/lib/elementary/efl_ui_table_layout.c index 26c288f022..8821fc15dd 100644 --- a/src/lib/elementary/efl_ui_table_layout.c +++ b/src/lib/elementary/efl_ui_table_layout.c @@ -232,7 +232,7 @@ _efl_ui_table_custom_layout(Efl_Ui_Table *ui_table, Efl_Ui_Table_Data *pd) if (!pd->count) { - efl_gfx_hint_size_min_set(ui_table, EINA_SIZE2D(0, 0)); + efl_gfx_hint_size_restricted_min_set(ui_table, EINA_SIZE2D(0, 0)); return; } @@ -369,11 +369,7 @@ _efl_ui_table_custom_layout(Efl_Ui_Table *ui_table, Efl_Ui_Table_Data *pd) + (table_calc.layout_calc[1].pad * table_calc.cell_calc[1][rows - 1].index); - if (table_calc.want[0] < table_calc.layout_calc[0].min) - table_calc.want[0] = table_calc.layout_calc[0].min; - if (table_calc.want[1] < table_calc.layout_calc[1].min) - table_calc.want[1] = table_calc.layout_calc[1].min; - - efl_gfx_hint_size_min_set(ui_table, EINA_SIZE2D(table_calc.want[0], - table_calc.want[1])); + efl_gfx_hint_size_restricted_min_set(ui_table, + EINA_SIZE2D(table_calc.want[0], + table_calc.want[1])); } diff --git a/src/tests/elementary/efl_ui_test_box.c b/src/tests/elementary/efl_ui_test_box.c index ee6532226c..d29c666eb1 100644 --- a/src/tests/elementary/efl_ui_test_box.c +++ b/src/tests/elementary/efl_ui_test_box.c @@ -203,7 +203,7 @@ btn_geom_assert(Hint *hint, Eina_Rect btn_geom) Eina_Size2D layout_size, layout_min; layout_size = efl_gfx_entity_size_get(layout); - layout_min = efl_gfx_hint_size_min_get(layout); + layout_min = efl_gfx_hint_size_combined_min_get(layout); layout_size.w = layout_size.w > layout_min.w ? layout_size.w : layout_min.w; layout_size.h = layout_size.h > layout_min.h ? layout_size.h : layout_min.h; @@ -344,10 +344,73 @@ EFL_START_TEST (efl_ui_box_layout_update_pack) } EFL_END_TEST +EFL_START_TEST (efl_ui_box_size) +{ +#define USERMIN_CHECK(a, b) \ + efl_canvas_group_calculate(layout); \ + user_min = efl_gfx_hint_size_min_get(layout); \ + ck_assert_msg(COORD_EQ(user_min.w, (a)) && COORD_EQ(user_min.h, (b)), \ + "Case box_size failed... user_min: (%d, %d) expected user_min: (%d, %d)", \ + user_min.w, user_min.h, (a), (b)); + +#define MIN_CHECK(a, b) \ + efl_canvas_group_calculate(layout); \ + min = efl_gfx_hint_size_combined_min_get(layout); \ + ck_assert_msg(COORD_EQ(min.w, (a)) && COORD_EQ(min.h, (b)), \ + "Case box_size failed... min: (%d, %d) expected min: (%d, %d)", \ + min.w, min.h, (a), (b)); + + Eo *btn, *btn2, *btn3; + Eina_Size2D min, user_min; + + btn = efl_add(EFL_UI_BUTTON_CLASS, layout, + efl_gfx_hint_size_min_set(efl_added, EINA_SIZE2D(100, 100)), + efl_pack_end(layout, efl_added)); + + USERMIN_CHECK(0, 0); + MIN_CHECK(100, 100); + + btn2 = efl_add(EFL_UI_BUTTON_CLASS, layout, + efl_gfx_hint_size_min_set(efl_added, EINA_SIZE2D(100, 100)), + efl_pack_end(layout, efl_added)); + btn3 = efl_add(EFL_UI_BUTTON_CLASS, layout, + efl_gfx_hint_size_min_set(efl_added, EINA_SIZE2D(100, 100)), + efl_pack_end(layout, efl_added)); + USERMIN_CHECK(0, 0); + MIN_CHECK(100, 300); + + efl_pack_unpack(layout, btn2); + USERMIN_CHECK(0, 0); + MIN_CHECK(100, 200); + + efl_pack_unpack(layout, btn3); + USERMIN_CHECK(0, 0); + MIN_CHECK(100, 100); + + efl_pack_unpack(layout, btn); + USERMIN_CHECK(0, 0); + MIN_CHECK(0, 0); + + efl_pack_end(layout, btn); + efl_gfx_hint_size_min_set(layout, EINA_SIZE2D(200, 200)); + USERMIN_CHECK(200, 200); + MIN_CHECK(200, 200); + + efl_pack_end(layout, btn2); + efl_pack_end(layout, btn3); + USERMIN_CHECK(200, 200); + MIN_CHECK(200, 300); + +#undef USERMIN_ASSERT +#undef MIN_ASSERT +} +EFL_END_TEST + void efl_ui_test_box(TCase *tc) { tcase_add_checked_fixture(tc, layout_setup, layout_teardown); tcase_add_test(tc, efl_ui_box_class_check); tcase_add_test(tc, efl_ui_box_layout_update); tcase_add_test(tc, efl_ui_box_layout_update_pack); + tcase_add_test(tc, efl_ui_box_size); } diff --git a/src/tests/elementary/efl_ui_test_table.c b/src/tests/elementary/efl_ui_test_table.c index 66443efa6b..c4fec94650 100644 --- a/src/tests/elementary/efl_ui_test_table.c +++ b/src/tests/elementary/efl_ui_test_table.c @@ -230,7 +230,7 @@ btn_geom_assert(Hint *hint, Eina_Rect btn_geom) Eina_Size2D layout_size, layout_min; layout_size = efl_gfx_entity_size_get(layout); - layout_min = efl_gfx_hint_size_min_get(layout); + layout_min = efl_gfx_hint_size_combined_min_get(layout); layout_size.w = layout_size.w > layout_min.w ? layout_size.w : layout_min.w; layout_size.h = layout_size.h > layout_min.h ? layout_size.h : layout_min.h; @@ -355,10 +355,73 @@ EFL_START_TEST (efl_ui_table_layout_update_matrix) } EFL_END_TEST +EFL_START_TEST (efl_ui_table_size) +{ +#define USERMIN_CHECK(a, b) \ + efl_canvas_group_calculate(layout); \ + user_min = efl_gfx_hint_size_min_get(layout); \ + ck_assert_msg(COORD_EQ(user_min.w, (a)) && COORD_EQ(user_min.h, (b)), \ + "Case table_size failed... user_min: (%d, %d) expected user_min: (%d, %d)", \ + user_min.w, user_min.h, (a), (b)); + +#define MIN_CHECK(a, b) \ + efl_canvas_group_calculate(layout); \ + min = efl_gfx_hint_size_combined_min_get(layout); \ + ck_assert_msg(COORD_EQ(min.w, (a)) && COORD_EQ(min.h, (b)), \ + "Case table_size failed... min: (%d, %d) expected min: (%d, %d)", \ + min.w, min.h, (a), (b)); + + Eo *btn, *btn2, *btn3; + Eina_Size2D min, user_min; + + btn = efl_add(EFL_UI_BUTTON_CLASS, layout, + efl_gfx_hint_size_min_set(efl_added, EINA_SIZE2D(100, 100)), + efl_pack_table(layout, efl_added, 0, 0, 1, 1)); + + USERMIN_CHECK(0, 0); + MIN_CHECK(100, 100); + + btn2 = efl_add(EFL_UI_BUTTON_CLASS, layout, + efl_gfx_hint_size_min_set(efl_added, EINA_SIZE2D(100, 100)), + efl_pack_table(layout, efl_added, 0, 1, 1, 1)); + btn3 = efl_add(EFL_UI_BUTTON_CLASS, layout, + efl_gfx_hint_size_min_set(efl_added, EINA_SIZE2D(100, 100)), + efl_pack_table(layout, efl_added, 0, 2, 1, 1)); + USERMIN_CHECK(0, 0); + MIN_CHECK(100, 300); + + efl_pack_unpack(layout, btn); + USERMIN_CHECK(0, 0); + MIN_CHECK(100, 200); + + efl_pack_unpack(layout, btn2); + USERMIN_CHECK(0, 0); + MIN_CHECK(100, 100); + + efl_pack_unpack(layout, btn3); + USERMIN_CHECK(0, 0); + MIN_CHECK(0, 0); + + efl_pack_table(layout, btn, 0, 0, 1, 1); + efl_gfx_hint_size_min_set(layout, EINA_SIZE2D(200, 200)); + USERMIN_CHECK(200, 200); + MIN_CHECK(200, 200); + + efl_pack_table(layout, btn2, 0, 1, 1, 1); + efl_pack_table(layout, btn3, 0, 2, 1, 1); + USERMIN_CHECK(200, 200); + MIN_CHECK(200, 300); + +#undef USERMIN_ASSERT +#undef MIN_ASSERT +} +EFL_END_TEST + void efl_ui_test_table(TCase *tc) { tcase_add_checked_fixture(tc, layout_setup, layout_teardown); tcase_add_test(tc, efl_ui_table_class_check); + tcase_add_test(tc, efl_ui_table_size); tcase_add_test(tc, efl_ui_table_layout_update); tcase_add_test(tc, efl_ui_table_layout_update_pack); tcase_add_test(tc, efl_ui_table_layout_update_matrix);