jpeg pushed a commit to branch master.

http://git.enlightenment.org/core/efl.git/commit/?id=548efd7fa4865140a2c32bb51debfb8a1353ae09

commit 548efd7fa4865140a2c32bb51debfb8a1353ae09
Author: Jean-Philippe Andre <jp.an...@samsung.com>
Date:   Tue Apr 12 18:16:20 2016 +0900

    Efl.Ui.Box: Implement flow layouts
    
    This reuses the Evas.Box code, since we are still using the
    box internally. The flow layout function is far from perfect
    (it works well only with items of same height).
    
    This shows how to use specific layouts provided by EFL.
---
 src/Makefile_Elementary.am                |   1 +
 src/bin/elementary/test_ui_box.c          | 113 +++++++++++++++++++++++++++++-
 src/lib/efl/interfaces/efl_pack.eo        |   5 +-
 src/lib/efl/interfaces/efl_pack_engine.eo |   2 +-
 src/lib/elementary/Elementary.h.in        |   1 +
 src/lib/elementary/efl_ui_box.c           |  11 ++-
 src/lib/elementary/efl_ui_box_flow.eo     |  17 +++++
 src/lib/elementary/efl_ui_box_layout.c    |  56 +++++++++++++++
 src/lib/elementary/efl_ui_box_private.h   |   7 +-
 9 files changed, 199 insertions(+), 14 deletions(-)

diff --git a/src/Makefile_Elementary.am b/src/Makefile_Elementary.am
index 0cc250a..1708579 100644
--- a/src/Makefile_Elementary.am
+++ b/src/Makefile_Elementary.am
@@ -120,6 +120,7 @@ elm_eolian_files = \
        lib/elementary/elm_diskselector_item.eo \
        lib/elementary/elm_popup_item.eo \
        lib/elementary/efl_ui_box.eo \
+       lib/elementary/efl_ui_box_flow.eo \
        lib/elementary/efl_ui_grid.eo \
        $(NULL)
 
diff --git a/src/bin/elementary/test_ui_box.c b/src/bin/elementary/test_ui_box.c
index 45c1de4..3600a96 100644
--- a/src/bin/elementary/test_ui_box.c
+++ b/src/bin/elementary/test_ui_box.c
@@ -91,6 +91,61 @@ margin_slider_cb(void *data, const Eo_Event *event)
    return EO_CALLBACK_CONTINUE;
 }
 
+static Efl_Ui_Box_Flow_Params s_flow_params = { 0.5, 0.5, 0, 0 };
+static Eina_Bool flow = EINA_FALSE;
+
+static Eina_Bool
+flow_check_cb(void *data, const Eo_Event *event)
+{
+   flow = elm_check_selected_get(event->obj);
+   efl_pack_layout_engine_set(data, flow ? EFL_UI_BOX_FLOW_CLASS : NULL, 
&s_flow_params);
+   return EO_CALLBACK_CONTINUE;
+}
+
+static Eina_Bool
+horiz_check_cb(void *data, const Eo_Event *event)
+{
+   Eina_Bool chk = elm_check_selected_get(event->obj);
+   efl_pack_direction_set(data, chk ? EFL_ORIENT_HORIZONTAL : 
EFL_ORIENT_VERTICAL);
+   return EO_CALLBACK_CONTINUE;
+}
+
+static Eina_Bool
+homo_check_cb(void *data, const Eo_Event *event)
+{
+   Eina_Bool chk = elm_check_selected_get(event->obj);
+   s_flow_params.homogenous = chk;
+   efl_pack_layout_engine_set(data, flow ? EFL_UI_BOX_FLOW_CLASS : NULL, 
&s_flow_params);
+   return EO_CALLBACK_CONTINUE;
+}
+
+static Eina_Bool
+max_size_check_cb(void *data, const Eo_Event *event)
+{
+   Eina_Bool chk = elm_check_selected_get(event->obj);
+   s_flow_params.max_size = chk;
+   efl_pack_layout_engine_set(data, flow ? EFL_UI_BOX_FLOW_CLASS : NULL, 
&s_flow_params);
+   return EO_CALLBACK_CONTINUE;
+}
+
+static Eina_Bool
+left_check_cb(void *data, const Eo_Event *event)
+{
+   Eina_Bool chk = elm_check_selected_get(event->obj);
+   if (chk)
+     {
+        s_flow_params.align_x = 0;
+        s_flow_params.align_y = 0;
+     }
+   else
+     {
+        s_flow_params.align_x = 0.5;
+        s_flow_params.align_y = 0.5;
+     }
+   efl_pack_layout_engine_set(data, flow ? EFL_UI_BOX_FLOW_CLASS : NULL, 
&s_flow_params);
+   return EO_CALLBACK_CONTINUE;
+}
+
 void
 test_ui_box(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void 
*event_info EINA_UNUSED)
 {
@@ -182,6 +237,61 @@ test_ui_box(void *data EINA_UNUSED, Evas_Object *obj 
EINA_UNUSED, void *event_in
    elm_radio_value_set(chk, NONE);
 
 
+   /* misc */
+   bx = eo_add(EFL_UI_BOX_CLASS, win,
+               efl_pack_direction_set(eo_self, EFL_ORIENT_DOWN));
+   evas_object_size_hint_align_set(bx, 0, -1);
+   evas_object_size_hint_weight_set(bx, 1, 1);
+   efl_pack(hbox, bx);
+   efl_gfx_visible_set(bx, 1);
+
+   o = elm_label_add(win);
+   elm_object_text_set(o, "Misc");
+   efl_pack(bx, o);
+   efl_gfx_visible_set(o, 1);
+
+   o = elm_check_add(win);
+   elm_check_selected_set(o, 0);
+   elm_object_text_set(o, "Flow");
+   eo_event_callback_add(o, ELM_CHECK_EVENT_CHANGED, flow_check_cb, bottombox);
+   evas_object_size_hint_align_set(o, 0, 0);
+   efl_pack(bx, o);
+   efl_gfx_visible_set(o, 1);
+
+   o = elm_check_add(win);
+   elm_check_selected_set(o, 1);
+   elm_object_text_set(o, "Horizontal");
+   eo_event_callback_add(o, ELM_CHECK_EVENT_CHANGED, horiz_check_cb, 
bottombox);
+   evas_object_size_hint_align_set(o, 0, 0);
+   efl_pack(bx, o);
+   efl_gfx_visible_set(o, 1);
+
+   o = elm_check_add(win);
+   elm_check_selected_set(o, 0);
+   elm_object_text_set(o, "Homogenous");
+   eo_event_callback_add(o, ELM_CHECK_EVENT_CHANGED, homo_check_cb, bottombox);
+   evas_object_size_hint_align_set(o, 0, 0);
+   efl_pack(bx, o);
+   efl_gfx_visible_set(o, 1);
+
+   o = elm_check_add(win);
+   elm_check_selected_set(o, 0);
+   elm_object_text_set(o, "Homogenous + Max");
+   eo_event_callback_add(o, ELM_CHECK_EVENT_CHANGED, max_size_check_cb, 
bottombox);
+   evas_object_size_hint_align_set(o, 0, 0);
+   efl_pack(bx, o);
+   efl_gfx_visible_set(o, 1);
+
+   o = elm_check_add(win);
+   elm_check_selected_set(o, 0);
+   elm_object_text_set(o, "Align left");
+   eo_event_callback_add(o, ELM_CHECK_EVENT_CHANGED, left_check_cb, bottombox);
+   evas_object_size_hint_align_set(o, 0, 0);
+   evas_object_size_hint_weight_set(o, 0, 1);
+   efl_pack(bx, o);
+   efl_gfx_visible_set(o, 1);
+
+
    /* min size setter */
    bx = eo_add(EFL_UI_BOX_CLASS, win,
                efl_pack_direction_set(eo_self, EFL_ORIENT_DOWN));
@@ -202,7 +312,7 @@ test_ui_box(void *data EINA_UNUSED, Evas_Object *obj 
EINA_UNUSED, void *event_in
    evas_object_size_hint_align_set(o, 0.5, -1);
    evas_object_size_hint_weight_set(o, 1, 1);
    eo_event_callback_add(o, ELM_SLIDER_EVENT_CHANGED, min_slider_cb, NULL);
-   elm_slider_min_max_set(o, 1, 50);
+   elm_slider_min_max_set(o, 1, 150);
    elm_slider_inverted_set(o, 1);
    elm_slider_value_set(o, 50);
    efl_pack(bx, o);
@@ -290,7 +400,6 @@ test_ui_box(void *data EINA_UNUSED, Evas_Object *obj 
EINA_UNUSED, void *event_in
    efl_gfx_visible_set(o, 1);
 
 
-
    /* contents */
    f = elm_frame_add(win);
    elm_object_text_set(f, "Contents");
diff --git a/src/lib/efl/interfaces/efl_pack.eo 
b/src/lib/efl/interfaces/efl_pack.eo
index 44b8988..3ca7fa3 100644
--- a/src/lib/efl/interfaces/efl_pack.eo
+++ b/src/lib/efl/interfaces/efl_pack.eo
@@ -64,8 +64,9 @@ interface Efl.Pack (Efl.Pack_Item)
          set { return: bool; }
          get {}
          values {
-            engine: const(Eo.Class)*; [[A class implementing a class function 
layout_do]]
-            data: void*; [[Any data to pass along to layout_do]]
+            engine: const(Eo.Class)*; [[A class implementing a class function 
layout_do.]]
+            data: const(void)*; [[Any data to pass along to layout_do.
+                                  Owned by the caller. Depends on the layout 
engine.]]
          }
       }
       layout_update @protected {
diff --git a/src/lib/efl/interfaces/efl_pack_engine.eo 
b/src/lib/efl/interfaces/efl_pack_engine.eo
index 1e2dc57..f12bc11 100644
--- a/src/lib/efl/interfaces/efl_pack_engine.eo
+++ b/src/lib/efl/interfaces/efl_pack_engine.eo
@@ -5,7 +5,7 @@ interface Efl.Pack_Engine
       layout_do @class {
          params {
             pack: Efl.Pack*;
-            data: void*;
+            data: const(void)*;
          }
       }
    }
diff --git a/src/lib/elementary/Elementary.h.in 
b/src/lib/elementary/Elementary.h.in
index 686502b..30c6dd3 100644
--- a/src/lib/elementary/Elementary.h.in
+++ b/src/lib/elementary/Elementary.h.in
@@ -270,6 +270,7 @@ EAPI extern Elm_Version *elm_version;
 
 #ifdef EFL_EO_API_SUPPORT
 # include <efl_ui_box.eo.h>
+# include <efl_ui_box_flow.eo.h>
 #endif
 
 /* include deprecated calls last of all */
diff --git a/src/lib/elementary/efl_ui_box.c b/src/lib/elementary/efl_ui_box.c
index 7f57d2f..d4bedf6 100644
--- a/src/lib/elementary/efl_ui_box.c
+++ b/src/lib/elementary/efl_ui_box.c
@@ -1,8 +1,5 @@
 #include "efl_ui_box_private.h"
 
-// FIXME: stop using Evas.Box
-#include <../evas/canvas/evas_box.eo.h>
-
 /* COPIED FROM ELM_BOX
  * - removed transition stuff (TODO: add back - needs clean API first)
  */
@@ -168,7 +165,7 @@ _efl_ui_box_efl_pack_layout_update(Eo *obj, Efl_Ui_Box_Data 
*pd)
 EOLIAN static void
 _efl_ui_box_efl_pack_engine_layout_do(Eo *klass EINA_UNUSED,
                                       void *_pd EINA_UNUSED,
-                                      Eo *obj, void *data EINA_UNUSED)
+                                      Eo *obj, const void *data EINA_UNUSED)
 {
    _layout_do(obj);
 }
@@ -177,10 +174,10 @@ EOLIAN static Eina_Bool
 _efl_ui_box_efl_pack_layout_engine_set(Eo *obj EINA_UNUSED, Efl_Ui_Box_Data 
*pd,
                                        const Eo_Class *klass, const void *data)
 {
-   EINA_SAFETY_ON_FALSE_RETURN_VAL(eo_isa(klass, EFL_PACK_INTERFACE), 
EINA_FALSE);
-   pd->layout_engine = klass;
+   pd->layout_engine = klass ? klass : MY_CLASS;
    pd->layout_data = data;
-
+   efl_pack_layout_request(obj);
+   _sizing_eval(obj, pd);
    return EINA_TRUE;
 }
 
diff --git a/src/lib/elementary/efl_ui_box_flow.eo 
b/src/lib/elementary/efl_ui_box_flow.eo
new file mode 100644
index 0000000..8cb78dc
--- /dev/null
+++ b/src/lib/elementary/efl_ui_box_flow.eo
@@ -0,0 +1,17 @@
+struct Efl.Ui.Box_Flow_Params {
+   [[Extra parameters for Box_Flow layout. Can be omitted.]]
+   align_x: double;
+   align_y: double;
+   homogenous: bool;
+   max_size: bool;
+}
+
+class Efl.Ui.Box_Flow (Efl.Ui.Box, Efl.Pack_Engine)
+{
+   [[A custom layout engine for @Efl.Ui.Box.]]
+   legacy_prefix: null;
+   data: null;
+   implements {
+      Efl.Pack_Engine.layout_do;
+   }
+}
diff --git a/src/lib/elementary/efl_ui_box_layout.c 
b/src/lib/elementary/efl_ui_box_layout.c
index f5b457f..72cdb9f 100644
--- a/src/lib/elementary/efl_ui_box_layout.c
+++ b/src/lib/elementary/efl_ui_box_layout.c
@@ -250,3 +250,59 @@ _efl_ui_box_custom_layout(Efl_Ui_Box *ui_box, 
Evas_Object_Box_Data *bd)
         evas_object_geometry_set(item->obj, x, y, w, h);
      }
 }
+
+EOLIAN static void
+_efl_ui_box_flow_efl_pack_engine_layout_do(Eo_Class *klass EINA_UNUSED,
+                                           void *_pd EINA_UNUSED,
+                                           Eo *obj, const void *data)
+{
+   void (*func)(Evas_Box *obj, Evas_Object_Box_Data *priv, void *data);
+   const Efl_Ui_Box_Flow_Params *params = data;
+   double ax = 0.5, ay = 0.5;
+   Evas_Object_Box_Data *bd;
+   Efl_Ui_Box_Data *pd;
+   Eina_Bool homo = EINA_FALSE, maxsize = EINA_FALSE;
+
+   EINA_SAFETY_ON_FALSE_RETURN(eo_isa(obj, EFL_UI_BOX_CLASS));
+   ELM_WIDGET_DATA_GET_OR_RETURN(obj, wd);
+   bd = eo_data_scope_get(wd->resize_obj, EVAS_BOX_CLASS);
+   pd = eo_data_scope_get(obj, EFL_UI_BOX_CLASS);
+
+   // FIXME: I wonder how this data will work with bindings? (lifetime, etc...)
+   if (params)
+     {
+        ax = params->align_x;
+        ay = params->align_y;
+        homo = params->homogenous;
+        maxsize = params->max_size;
+     }
+
+   if (_horiz(pd->orient))
+     {
+        if (homo)
+          {
+             if (maxsize)
+               func = evas_object_box_layout_homogeneous_max_size_horizontal;
+             else
+               func = evas_object_box_layout_homogeneous_horizontal;
+          }
+        else
+          func = evas_object_box_layout_flow_horizontal;
+     }
+   else
+     {
+        if (homo)
+          {
+             if (maxsize)
+               func = evas_object_box_layout_homogeneous_max_size_vertical;
+             else
+               func = evas_object_box_layout_homogeneous_vertical;
+          }
+        else
+          func = evas_object_box_layout_flow_vertical;
+     }
+
+   func(wd->resize_obj, bd, NULL);
+}
+
+#include "efl_ui_box_flow.eo.c"
diff --git a/src/lib/elementary/efl_ui_box_private.h 
b/src/lib/elementary/efl_ui_box_private.h
index b9fc0dd..64b009e 100644
--- a/src/lib/elementary/efl_ui_box_private.h
+++ b/src/lib/elementary/efl_ui_box_private.h
@@ -10,6 +10,9 @@
 #include <Elementary.h>
 #include "elm_priv.h"
 
+// FIXME: stop using Evas.Box
+#include <../evas/canvas/evas_box.eo.h>
+
 #define MY_CLASS EFL_UI_BOX_CLASS
 #define MY_CLASS_NAME "Efl.Ui.Box"
 
@@ -22,7 +25,7 @@ typedef struct _Box_Item_Iterator Box_Item_Iterator;
 struct _Efl_Ui_Box_Data
 {
    const Eo_Class *layout_engine;
-   void *layout_data;
+   const void *layout_data;
 
    Efl_Orient orient;
    Eina_Bool homogeneous : 1;
@@ -37,8 +40,8 @@ struct _Efl_Ui_Box_Data
 
 struct _Box_Item_Iterator
 {
-   Eina_List     *list;
    Eina_Iterator  iterator;
+   Eina_List     *list;
    Eina_Iterator *real_iterator;
    Efl_Ui_Box    *object;
 };

-- 


Reply via email to