jpeg pushed a commit to branch master.

http://git.enlightenment.org/core/efl.git/commit/?id=6bcaa8a0b92f8b50961685231cd6492afcd99fe1

commit 6bcaa8a0b92f8b50961685231cd6492afcd99fe1
Author: Jean-Philippe Andre <jp.an...@samsung.com>
Date:   Mon Nov 21 19:01:16 2016 +0900

    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(+)

diff --git a/src/Makefile_Elementary.am b/src/Makefile_Elementary.am
index 5488b03..667840e 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 0a7f042..a250762 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 6da21d6..395c824 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 5b956a3..8d6bb34 100644
--- a/src/lib/elementary/Elementary.h
+++ b/src/lib/elementary/Elementary.h
@@ -255,6 +255,7 @@ EAPI extern Elm_Version *elm_version;
 # include <efl_config_global.eo.h>
 # include <efl_ui_box.eo.h>
 # include <efl_ui_box_flow.eo.h>
+# include <efl_ui_box_stack.eo.h>
 # include <efl_ui_grid.eo.h>
 # include <efl_ui_grid_static.eo.h>
 # include <efl_ui_image.eo.h>
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 0000000..590de3a
--- /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 0000000..269b319
--- /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;
+   }
+}

-- 


Reply via email to