From 6bcaa8a0b92f8b50961685231cd6492afcd99fe1 Mon Sep 17 00:00:00 2001 From: Jean-Philippe Andre Date: Mon, 21 Nov 2016 19:01:16 +0900 Subject: [PATCH] elm: Add Efl.Ui.Box.Stack for stack boxes (EO only) This is a very simple implementation for EO of the stack mode of boxes, as implemented in evas_object_box_layout_stack. @feature --- src/Makefile_Elementary.am | 2 + src/bin/elementary/test.c | 2 + src/bin/elementary/test_box.c | 53 ++++++++++++++++++++++++++ src/lib/elementary/Elementary.h | 1 + src/lib/elementary/efl_ui_box_stack.c | 46 ++++++++++++++++++++++ src/lib/elementary/efl_ui_box_stack.eo | 12 ++++++ 6 files changed, 116 insertions(+) create mode 100644 src/lib/elementary/efl_ui_box_stack.c create mode 100644 src/lib/elementary/efl_ui_box_stack.eo diff --git a/src/Makefile_Elementary.am b/src/Makefile_Elementary.am index 5488b031a9..667840e9d5 100644 --- a/src/Makefile_Elementary.am +++ b/src/Makefile_Elementary.am @@ -90,6 +90,7 @@ elm_public_eolian_files = \ lib/elementary/elm_popup_item.eo \ lib/elementary/efl_ui_box.eo \ lib/elementary/efl_ui_box_flow.eo \ + lib/elementary/efl_ui_box_stack.eo \ lib/elementary/efl_ui_grid.eo \ lib/elementary/efl_ui_grid_static.eo \ lib/elementary/efl_ui_layout_internal_box.eo \ @@ -653,6 +654,7 @@ lib_elementary_libelementary_la_SOURCES = \ lib/elementary/elu_ews_wm.c \ lib/elementary/efl_ui_box.c \ lib/elementary/efl_ui_box_flow.c \ + lib/elementary/efl_ui_box_stack.c \ lib/elementary/efl_ui_box_layout.c \ lib/elementary/efl_ui_box_private.h \ lib/elementary/efl_ui_grid.c \ diff --git a/src/bin/elementary/test.c b/src/bin/elementary/test.c index 0a7f042f51..a250762a82 100644 --- a/src/bin/elementary/test.c +++ b/src/bin/elementary/test.c @@ -27,6 +27,7 @@ void test_box_horiz(void *data, Evas_Object *obj, void *event_info); void test_box_homo(void *data, Evas_Object *obj, void *event_info); void test_box_transition(void *data, Evas_Object *obj, void *event_info); void test_box_align(void *data, Evas_Object *obj, void *event_info); +void test_box_stack(void *data, Evas_Object *obj, void *event_info); void test_ui_box(void *data, Evas_Object *obj, void *event_info); void test_button(void *data, Evas_Object *obj, void *event_info); void test_cnp(void *data, Evas_Object *obj, void *event_info); @@ -666,6 +667,7 @@ add_tests: ADD_TEST(NULL, "Containers", "Box Homogeneous", test_box_homo); ADD_TEST(NULL, "Containers", "Box Transition", test_box_transition); ADD_TEST(NULL, "Containers", "Box Align", test_box_align); + ADD_TEST(NULL, "Containers", "Box Stack", test_box_stack); ADD_TEST(NULL, "Containers", "Table", test_table); ADD_TEST(NULL, "Containers", "Table Homogeneous", test_table2); ADD_TEST(NULL, "Containers", "Table 3", test_table3); diff --git a/src/bin/elementary/test_box.c b/src/bin/elementary/test_box.c index 6da21d63c4..395c82486c 100644 --- a/src/bin/elementary/test_box.c +++ b/src/bin/elementary/test_box.c @@ -857,6 +857,7 @@ _align_box_add(Evas_Object *bx_out, Box_Align_Data *bdata) elm_box_pack_end(bx, bt); evas_object_show(bt); } + void test_box_align(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) @@ -880,3 +881,55 @@ test_box_align(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, evas_object_resize(win, 300, 400); evas_object_show(win); } + +void +test_box_stack(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, + void *event_info EINA_UNUSED) +{ + Evas_Object *win, *bx, *o; + char buf[PATH_MAX]; + + win = efl_add(EFL_UI_WIN_CLASS, NULL, + efl_text_set(efl_added, "Efl.Ui.Box.Stack"), + efl_ui_win_autodel_set(efl_added, EINA_TRUE)); + + efl_gfx_color_set(efl_part(win, "background"), 24, 24, 64, 255); + + /* stacked box, with items in the center-bottom */ + bx = efl_add(EFL_UI_BOX_STACK_CLASS, win, + efl_pack_align_set(efl_added, 0.5, 1.0)); + efl_content_set(win, bx); + + /* stretched rectangle */ + o = efl_add(EFL_CANVAS_RECTANGLE_CLASS, win, + efl_gfx_color_set(efl_added, 0, 64, 128, 255), + efl_gfx_size_hint_align_set(efl_added, EFL_GFX_SIZE_HINT_FILL, EFL_GFX_SIZE_HINT_FILL), + efl_gfx_size_hint_weight_set(efl_added, EFL_GFX_SIZE_HINT_EXPAND, EFL_GFX_SIZE_HINT_EXPAND), + efl_gfx_visible_set(efl_added, EINA_TRUE)); + efl_pack(bx, o); + + /* rectangle with a max size */ + o = efl_add(EFL_CANVAS_RECTANGLE_CLASS, win, + efl_gfx_color_set(efl_added, 64, 128, 64, 255), + efl_gfx_size_hint_align_set(efl_added, EFL_GFX_SIZE_HINT_FILL, EFL_GFX_SIZE_HINT_FILL), + efl_gfx_size_hint_weight_set(efl_added, EFL_GFX_SIZE_HINT_EXPAND, EFL_GFX_SIZE_HINT_EXPAND), + efl_gfx_size_hint_max_set(efl_added, 128, 20), + efl_gfx_visible_set(efl_added, EINA_TRUE)); + efl_pack(bx, o); + + /* image with a forced min size */ + snprintf(buf, sizeof(buf), "%s/images/logo.png", elm_app_data_dir_get()); + o = efl_add(EFL_UI_IMAGE_CLASS, win, + efl_gfx_size_hint_align_set(efl_added, EFL_GFX_SIZE_HINT_FILL, EFL_GFX_SIZE_HINT_FILL), + efl_gfx_size_hint_weight_set(efl_added, EFL_GFX_SIZE_HINT_EXPAND, EFL_GFX_SIZE_HINT_EXPAND), + efl_gfx_size_hint_min_set(efl_added, 64, 64), + efl_file_set(efl_added, buf, NULL), + efl_gfx_visible_set(efl_added, EINA_TRUE)); + efl_pack(bx, o); + + /* make window resizable: add a weight to its content */ + efl_gfx_size_hint_weight_set(bx, EFL_GFX_SIZE_HINT_EXPAND, EFL_GFX_SIZE_HINT_EXPAND); + + efl_gfx_size_set(win, 300, 300); + efl_gfx_visible_set(win, EINA_TRUE); +} diff --git a/src/lib/elementary/Elementary.h b/src/lib/elementary/Elementary.h index 5b956a341c..8d6bb34b91 100644 --- a/src/lib/elementary/Elementary.h +++ b/src/lib/elementary/Elementary.h @@ -255,6 +255,7 @@ EAPI extern Elm_Version *elm_version; # include # include # include +# include # include # include # include diff --git a/src/lib/elementary/efl_ui_box_stack.c b/src/lib/elementary/efl_ui_box_stack.c new file mode 100644 index 0000000000..590de3a963 --- /dev/null +++ b/src/lib/elementary/efl_ui_box_stack.c @@ -0,0 +1,46 @@ +#define EFL_GFX_SIZE_HINT_PROTECTED + +#include "efl_ui_box_private.h" + +#define MY_CLASS EFL_UI_BOX_STACK_CLASS + +EOLIAN static Eo * +_efl_ui_box_stack_efl_object_constructor(Eo *obj, void *_pd EINA_UNUSED) +{ + efl_constructor(efl_super(obj, MY_CLASS)); + efl_pack_layout_engine_set(obj, MY_CLASS, NULL); + return obj; +} + +EOLIAN static void +_efl_ui_box_stack_efl_pack_layout_layout_do(Efl_Class *klass EINA_UNUSED, + void *_pd EINA_UNUSED, Eo *obj, + const void *data EINA_UNUSED) +{ + Evas_Object_Box_Option *opt; + Evas_Object_Box_Data *bd; + int minw = 0, minh = 0; + Eina_List *l; + + EINA_SAFETY_ON_FALSE_RETURN(efl_isa(obj, EFL_UI_BOX_CLASS)); + ELM_WIDGET_DATA_GET_OR_RETURN(obj, wd); + bd = efl_data_scope_get(wd->resize_obj, EVAS_BOX_CLASS); + + evas_object_box_layout_stack(wd->resize_obj, bd, NULL); + + /* Note: legacy evas_object_box_layout_stack sets the box min size to be + * the MAX() of the children's sizes, rather than their min sizes. By fixing + * that, we can implement elm_win_resize_object_add() with a Efl.Ui.Box. */ + EINA_LIST_FOREACH(bd->children, l, opt) + { + Evas_Object *child = opt->obj; + int mw = 0, mh = 0; + + efl_gfx_size_hint_combined_min_get(child, &mw, &mh); + if (mw > minw) minw = mw; + if (mh > minh) minh = mh; + } + efl_gfx_size_hint_restricted_min_set(obj, minw, minh); +} + +#include "efl_ui_box_stack.eo.c" diff --git a/src/lib/elementary/efl_ui_box_stack.eo b/src/lib/elementary/efl_ui_box_stack.eo new file mode 100644 index 0000000000..269b319127 --- /dev/null +++ b/src/lib/elementary/efl_ui_box_stack.eo @@ -0,0 +1,12 @@ +class Efl.Ui.Box.Stack (Efl.Ui.Box, Efl.Pack.Layout) +{ + [[A custom layout engine for @Efl.Ui.Box that stacks items. + + Items will be stacked on top of each other (in the Z direction). + ]] + data: null; + implements { + Efl.Object.constructor; + Efl.Pack.Layout.layout_do; + } +}