summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJean-Philippe Andre <jp.andre@samsung.com>2016-04-12 18:16:20 +0900
committerJean-Philippe Andre <jp.andre@samsung.com>2016-04-20 10:47:40 +0900
commit548efd7fa4865140a2c32bb51debfb8a1353ae09 (patch)
treed1753a121fd8856e1173bed9280f644e1f19071a
parent24eccb6d62dc8de443bbd3db8f0d61248a170cf2 (diff)
downloadefl-548efd7fa4865140a2c32bb51debfb8a1353ae09.tar.gz
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.
-rw-r--r--src/Makefile_Elementary.am1
-rw-r--r--src/bin/elementary/test_ui_box.c113
-rw-r--r--src/lib/efl/interfaces/efl_pack.eo5
-rw-r--r--src/lib/efl/interfaces/efl_pack_engine.eo2
-rw-r--r--src/lib/elementary/Elementary.h.in1
-rw-r--r--src/lib/elementary/efl_ui_box.c11
-rw-r--r--src/lib/elementary/efl_ui_box_flow.eo17
-rw-r--r--src/lib/elementary/efl_ui_box_layout.c56
-rw-r--r--src/lib/elementary/efl_ui_box_private.h7
9 files changed, 199 insertions, 14 deletions
diff --git a/src/Makefile_Elementary.am b/src/Makefile_Elementary.am
index 0cc250a9c3..1708579eaf 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 45c1de43eb..3600a96a32 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 44b89888fc..3ca7fa390b 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 1e2dc57ae1..f12bc11911 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 686502b69a..30c6dd3b77 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 7f57d2ff2b..d4bedf6e6f 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 0000000000..8cb78dc2d5
--- /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 f5b457f7f0..72cdb9f6fd 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 b9fc0ddca2..64b009e15d 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;
};