eo/elm: Simplify box/grid EO API

After talking with @eunue I realised that the way I'd first
implemented the box/grid "pack" API was simply too complicated.
I had tried to make it possible to change the layout function
at runtime, like good old evas box, but since there are no function
pointers in EO the final design was really convoluted.

If someone really needs to change the layout of a box at runtime,
just create your own subclass, or unpack all items and repack them
in a new box.

Note: there are still some issues with the layout params & flow
This commit is contained in:
Jean-Philippe Andre 2017-04-17 13:41:29 +09:00
parent d6d4c3c25b
commit acb9ae70fe
16 changed files with 111 additions and 251 deletions

View File

@ -110,19 +110,9 @@ test_grid_static(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *eve
efl_ui_win_autodel_set(efl_added, EINA_TRUE),
efl_event_callback_add(efl_added, EFL_EVENT_DEL, _win_del, api));
static int run_count = 0;
if (((run_count++) % 2) == 0)
{
gd = efl_add(EFL_UI_GRID_STATIC_CLASS, win,
efl_gfx_size_hint_weight_set(efl_added, 1, 1));
}
else
{
gd = efl_add(EFL_UI_GRID_CLASS, win,
efl_gfx_size_hint_weight_set(efl_added, 1, 1),
efl_pack_layout_engine_set(efl_added, EFL_UI_GRID_STATIC_CLASS, NULL));
}
efl_pack(win, gd);
gd = efl_add(EFL_UI_GRID_STATIC_CLASS, win,
efl_gfx_size_hint_weight_set(efl_added, 1, 1));
efl_content_set(win, gd);
api->data.grid = gd;
efl_gfx_visible_set(gd, 1);

View File

@ -64,6 +64,9 @@ static void
user_min_slider_cb(void *data EINA_UNUSED, const Efl_Event *event)
{
int val = elm_slider_value_get(event->object);
Eo *win = data, *box;
box = efl_key_wref_get(win, "box");
efl_gfx_size_hint_min_set(objects[3], val, val);
}
@ -71,79 +74,96 @@ static void
padding_slider_cb(void *data, const Efl_Event *event)
{
int val = elm_slider_value_get(event->object);
efl_pack_padding_set(data, val, val, EINA_TRUE);
Eo *win = data, *box;
box = efl_key_wref_get(win, "box");
efl_pack_padding_set(box, val, val, EINA_TRUE);
}
static void
margin_slider_cb(void *data, const Efl_Event *event)
{
int val = elm_slider_value_get(event->object);
efl_gfx_size_hint_margin_set(data, val, val, val, val);
Eo *win = data, *box;
box = efl_key_wref_get(win, "box");
efl_gfx_size_hint_margin_set(box, val, val, val, val);
}
static void
alignh_slider_cb(void *data, const Efl_Event *event)
{
double av, val;
Eo *win = data, *box;
box = efl_key_wref_get(win, "box");
val = elm_slider_value_get(event->object);
efl_pack_align_get(data, NULL, &av);
efl_pack_align_set(data, val, av);
efl_pack_align_get(box, NULL, &av);
efl_pack_align_set(box, val, av);
}
static void
alignv_slider_cb(void *data, const Efl_Event *event)
{
double ah, val;
val = elm_slider_value_get(event->object);
efl_pack_align_get(data, &ah, NULL);
efl_pack_align_set(data, ah, val);
}
Eo *win = data, *box;
static Efl_Ui_Box_Flow_Params s_flow_params = { 0, 0 };
static Eina_Bool flow = EINA_FALSE;
box = efl_key_wref_get(win, "box");
val = elm_slider_value_get(event->object);
efl_pack_align_get(box, &ah, NULL);
efl_pack_align_set(box, ah, val);
}
static void
flow_check_cb(void *data, const Efl_Event *event)
{
flow = elm_check_selected_get(event->object);
efl_pack_layout_engine_set(data, flow ? EFL_UI_BOX_FLOW_CLASS : NULL, &s_flow_params);
Eina_Bool chk = elm_check_selected_get(event->object);
Eina_List *list = NULL;
Eina_Iterator *it;
Eo *box, *win, *sobj, *parent;
// Unpack all children from the box, delete it and repack into the new box
win = data;
box = efl_key_wref_get(win, "box");
parent = efl_parent_get(box);
it = efl_content_iterate(box);
EINA_ITERATOR_FOREACH(it, sobj)
list = eina_list_append(list, sobj);
eina_iterator_free(it);
efl_pack_unpack_all(box);
efl_del(box);
box = efl_add(chk ? EFL_UI_BOX_FLOW_CLASS : EFL_UI_BOX_CLASS, win);
efl_content_set(parent, box);
efl_key_wref_set(win, "box", box);
EINA_LIST_FREE(list, sobj)
efl_pack(box, sobj);
}
static void
horiz_check_cb(void *data, const Efl_Event *event)
{
Eina_Bool chk = elm_check_selected_get(event->object);
efl_orientation_set(data, chk ? EFL_ORIENT_HORIZONTAL : EFL_ORIENT_VERTICAL);
Eo *box = efl_key_wref_get(data, "box");
efl_orientation_set(box, chk ? EFL_ORIENT_HORIZONTAL : EFL_ORIENT_VERTICAL);
}
static void
homo_check_cb(void *data, const Efl_Event *event)
{
Eina_Bool chk = elm_check_selected_get(event->object);
s_flow_params.homogenous = chk;
efl_pack_layout_engine_set(data, flow ? EFL_UI_BOX_FLOW_CLASS : NULL, &s_flow_params);
Eo *box = efl_key_wref_get(data, "box");
efl_ui_box_flow_homogenous_set(box, chk);
}
static void
max_size_check_cb(void *data, const Efl_Event *event)
{
Eina_Bool chk = elm_check_selected_get(event->object);
s_flow_params.max_size = chk;
efl_pack_layout_engine_set(data, flow ? EFL_UI_BOX_FLOW_CLASS : NULL, &s_flow_params);
}
static void
left_check_cb(void *data, const Efl_Event *event)
{
Eina_Bool chk = elm_check_selected_get(event->object);
if (chk)
{
efl_pack_align_set(data, 0, 0.5);
}
else
{
efl_pack_align_set(data, 0.5, 0.5);
}
Eo *box = efl_key_wref_get(data, "box");
efl_ui_box_flow_max_size_set(box, chk);
}
static void
@ -178,26 +198,25 @@ static void
custom_check_cb(void *data, const Efl_Event *event)
{
EFL_OPS_DEFINE(custom_layout_ops,
EFL_OBJECT_OP_FUNC(efl_pack_layout_update, _custom_layout_update));
EFL_OBJECT_OP_FUNC(efl_pack_layout_update, _custom_layout_update));
Eina_Bool chk = elm_check_selected_get(event->object);
Eo *obj = data;
Eo *box, *win = data;
box = efl_key_wref_get(win, "box");
// Overriding just the one function we need
efl_object_override(obj, chk ? &custom_layout_ops : NULL);
efl_object_override(box, chk ? &custom_layout_ops : NULL);
// Layout request is required as the pack object doesn't know the layout
// function was just overridden.
efl_pack_layout_request(obj);
// See also test_ui_grid.c for another method for custom layouts (create
// a custom layout engine).
efl_pack_layout_request(box);
}
void
test_ui_box(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
{
Evas_Object *win, *bx, *o, *vbox, *f, *hbox, *chk, *bottombox;
Evas_Object *win, *bx, *o, *vbox, *f, *hbox, *chk;
int i = 0;
win = elm_win_util_standard_add("ui-box", "Efl.Ui.Box");
@ -213,10 +232,6 @@ test_ui_box(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_in
efl_gfx_visible_set(vbox, 1);
// create here to pass in cb
bottombox = efl_add(EFL_UI_BOX_CLASS, win);
/* controls */
f = elm_frame_add(win);
elm_object_text_set(f, "Controls");
@ -240,7 +255,7 @@ test_ui_box(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_in
chk = o = elm_radio_add(win);
elm_object_text_set(o, "No weight");
efl_event_callback_add(o, ELM_RADIO_EVENT_CHANGED, weights_cb, bottombox);
efl_event_callback_add(o, ELM_RADIO_EVENT_CHANGED, weights_cb, win);
efl_gfx_size_hint_align_set(o, 0, 0.5);
elm_radio_state_value_set(o, NONE);
efl_pack(bx, o);
@ -248,7 +263,7 @@ test_ui_box(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_in
o = elm_radio_add(win);
elm_object_text_set(o, "No weight + box fill");
efl_event_callback_add(o, ELM_RADIO_EVENT_CHANGED, weights_cb, bottombox);
efl_event_callback_add(o, ELM_RADIO_EVENT_CHANGED, weights_cb, win);
efl_gfx_size_hint_align_set(o, 0, 0.5);
elm_radio_state_value_set(o, NONE_BUT_FILL);
elm_radio_group_add(o, chk);
@ -257,7 +272,7 @@ test_ui_box(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_in
o = elm_radio_add(win);
elm_object_text_set(o, "Equal weights");
efl_event_callback_add(o, ELM_RADIO_EVENT_CHANGED, weights_cb, bottombox);
efl_event_callback_add(o, ELM_RADIO_EVENT_CHANGED, weights_cb, win);
efl_gfx_size_hint_align_set(o, 0, 0.5);
elm_radio_state_value_set(o, EQUAL);
elm_radio_group_add(o, chk);
@ -266,7 +281,7 @@ test_ui_box(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_in
o = elm_radio_add(win);
elm_object_text_set(o, "One weight only");
efl_event_callback_add(o, ELM_RADIO_EVENT_CHANGED, weights_cb, bottombox);
efl_event_callback_add(o, ELM_RADIO_EVENT_CHANGED, weights_cb, win);
efl_gfx_size_hint_align_set(o, 0, 0.5);
elm_radio_state_value_set(o, ONE);
elm_radio_group_add(o, chk);
@ -275,7 +290,7 @@ test_ui_box(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_in
o = elm_radio_add(win);
elm_object_text_set(o, "Two weights");
efl_event_callback_add(o, ELM_RADIO_EVENT_CHANGED, weights_cb, bottombox);
efl_event_callback_add(o, ELM_RADIO_EVENT_CHANGED, weights_cb, win);
efl_gfx_size_hint_align_set(o, 0, 0.5);
elm_radio_state_value_set(o, TWO);
elm_radio_group_add(o, chk);
@ -301,7 +316,7 @@ test_ui_box(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_in
o = elm_check_add(win);
elm_check_selected_set(o, 0);
elm_object_text_set(o, "Flow");
efl_event_callback_add(o, EFL_UI_CHECK_EVENT_CHANGED, flow_check_cb, bottombox);
efl_event_callback_add(o, EFL_UI_CHECK_EVENT_CHANGED, flow_check_cb, win);
efl_gfx_size_hint_align_set(o, 0, 0);
efl_pack(bx, o);
efl_gfx_visible_set(o, 1);
@ -309,7 +324,7 @@ test_ui_box(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_in
o = elm_check_add(win);
elm_check_selected_set(o, 1);
elm_object_text_set(o, "Horizontal");
efl_event_callback_add(o, EFL_UI_CHECK_EVENT_CHANGED, horiz_check_cb, bottombox);
efl_event_callback_add(o, EFL_UI_CHECK_EVENT_CHANGED, horiz_check_cb, win);
efl_gfx_size_hint_align_set(o, 0, 0);
efl_pack(bx, o);
efl_gfx_visible_set(o, 1);
@ -317,7 +332,7 @@ test_ui_box(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_in
o = elm_check_add(win);
elm_check_selected_set(o, 0);
elm_object_text_set(o, "Homogenous");
efl_event_callback_add(o, EFL_UI_CHECK_EVENT_CHANGED, homo_check_cb, bottombox);
efl_event_callback_add(o, EFL_UI_CHECK_EVENT_CHANGED, homo_check_cb, win);
efl_gfx_size_hint_align_set(o, 0, 0);
efl_pack(bx, o);
efl_gfx_visible_set(o, 1);
@ -325,15 +340,7 @@ test_ui_box(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_in
o = elm_check_add(win);
elm_check_selected_set(o, 0);
elm_object_text_set(o, "Homogenous + Max");
efl_event_callback_add(o, EFL_UI_CHECK_EVENT_CHANGED, max_size_check_cb, bottombox);
efl_gfx_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");
efl_event_callback_add(o, EFL_UI_CHECK_EVENT_CHANGED, left_check_cb, bottombox);
efl_event_callback_add(o, EFL_UI_CHECK_EVENT_CHANGED, max_size_check_cb, win);
efl_gfx_size_hint_align_set(o, 0, 0);
efl_pack(bx, o);
efl_gfx_visible_set(o, 1);
@ -341,7 +348,7 @@ test_ui_box(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_in
o = elm_check_add(win);
elm_check_selected_set(o, 0);
elm_object_text_set(o, "Custom layout");
efl_event_callback_add(o, EFL_UI_CHECK_EVENT_CHANGED, custom_check_cb, bottombox);
efl_event_callback_add(o, EFL_UI_CHECK_EVENT_CHANGED, custom_check_cb, win);
efl_gfx_size_hint_align_set(o, 0, 0);
efl_gfx_size_hint_weight_set(o, 0, 1);
efl_pack(bx, o);
@ -394,7 +401,7 @@ test_ui_box(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_in
elm_slider_horizontal_set(o, 0);
efl_gfx_size_hint_align_set(o, 0.5, -1);
efl_gfx_size_hint_weight_set(o, 1, 1);
efl_event_callback_add(o, ELM_SLIDER_EVENT_CHANGED, padding_slider_cb, bottombox);
efl_event_callback_add(o, ELM_SLIDER_EVENT_CHANGED, padding_slider_cb, win);
elm_slider_min_max_set(o, 0, 40);
elm_slider_inverted_set(o, 1);
elm_slider_value_set(o, 10);
@ -421,7 +428,7 @@ test_ui_box(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_in
elm_slider_horizontal_set(o, 0);
efl_gfx_size_hint_align_set(o, 0.5, -1);
efl_gfx_size_hint_weight_set(o, 1, 1);
efl_event_callback_add(o, ELM_SLIDER_EVENT_CHANGED, margin_slider_cb, bottombox);
efl_event_callback_add(o, ELM_SLIDER_EVENT_CHANGED, margin_slider_cb, win);
elm_slider_min_max_set(o, 0, 40);
elm_slider_inverted_set(o, 1);
elm_slider_value_set(o, 10);
@ -448,7 +455,7 @@ test_ui_box(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_in
elm_slider_horizontal_set(o, 0);
efl_gfx_size_hint_align_set(o, 0.5, -1);
efl_gfx_size_hint_weight_set(o, 1, 1);
efl_event_callback_add(o, ELM_SLIDER_EVENT_CHANGED, alignv_slider_cb, bottombox);
efl_event_callback_add(o, ELM_SLIDER_EVENT_CHANGED, alignv_slider_cb, win);
elm_slider_min_max_set(o, -0.1, 1.0);
elm_slider_step_set(o, 0.1);
elm_slider_value_set(o, 0.5);
@ -462,7 +469,7 @@ test_ui_box(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_in
efl_gfx_size_hint_align_set(o, 0.5, -1);
efl_gfx_size_hint_weight_set(o, 1, 0);
efl_gfx_size_hint_min_set(o, 100, 0);
efl_event_callback_add(o, ELM_SLIDER_EVENT_CHANGED, alignh_slider_cb, bottombox);
efl_event_callback_add(o, ELM_SLIDER_EVENT_CHANGED, alignh_slider_cb, win);
elm_slider_min_max_set(o, -0.1, 1.0);
elm_slider_step_set(o, 0.1);
elm_slider_value_set(o, 0.5);
@ -478,7 +485,8 @@ test_ui_box(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_in
efl_pack(vbox, f);
efl_gfx_visible_set(f, 1);
bx = bottombox;
bx = efl_add(EFL_UI_BOX_CLASS, win);
efl_key_wref_set(win, "box", bx);
efl_pack_padding_set(bx, 10, 10, EINA_TRUE);
efl_gfx_size_hint_align_set(bx, 0.5, 0.5);
efl_gfx_size_hint_weight_set(bx, 1, 1);

View File

@ -5,6 +5,8 @@
#define EFL_PACK_LAYOUT_PROTECTED
#include <Elementary.h>
static void _custom_layout_update(Eo *pack, void *_pd EINA_UNUSED);
static Evas_Object *objects[7] = {};
typedef enum {
@ -16,36 +18,17 @@ typedef enum {
CUSTOM
} Weight_Mode;
static void _custom_engine_layout_do(Eo *obj, void *pd, Efl_Pack *pack, const void *data);
/* Common Efl Class boilerplate. */
static Eina_Bool
_custom_engine_class_initializer(Efl_Class *klass)
{
EFL_OPS_DEFINE(class_ops,
EFL_OBJECT_OP_FUNC(efl_pack_layout_do, _custom_engine_layout_do),
);
return efl_class_functions_set(klass, NULL, &class_ops);
}
static const Efl_Class_Description custom_engine_class_desc = {
EO_VERSION, "Custom Layout Engine", EFL_CLASS_TYPE_INTERFACE,
0, _custom_engine_class_initializer, NULL, NULL
};
EFL_DEFINE_CLASS(_test_ui_grid_custom_engine_class_get, &custom_engine_class_desc, EFL_PACK_LAYOUT_INTERFACE, NULL)
#define CUSTOM_ENGINE_CLASS _test_ui_grid_custom_engine_class_get()
static void
weights_cb(void *data, const Efl_Event *event)
{
EFL_OPS_DEFINE(custom_layout_ops,
EFL_OBJECT_OP_FUNC(efl_pack_layout_update, _custom_layout_update));
Weight_Mode mode = elm_radio_state_value_get(event->object);
Eo *grid = data;
if (mode != CUSTOM)
efl_pack_layout_engine_set(grid, NULL, NULL);
efl_object_override(grid, NULL);
switch (mode)
{
@ -78,9 +61,7 @@ weights_cb(void *data, const Efl_Event *event)
efl_gfx_size_hint_weight_set(objects[6], 1, 1);
break;
case CUSTOM:
// See also test_ui_box.c for another solution for custom layouts
// using efl_object_override.
efl_pack_layout_engine_set(grid, CUSTOM_ENGINE_CLASS, NULL);
efl_object_override(grid, &custom_layout_ops);
break;
}
}
@ -145,8 +126,7 @@ child_evt_cb(void *data, const Efl_Event *event)
}
static void
_custom_engine_layout_do(Eo *obj EINA_UNUSED, void *pd EINA_UNUSED,
Efl_Pack *pack, const void *data EINA_UNUSED)
_custom_layout_update(Eo *pack, void *_pd EINA_UNUSED)
{
/* Example custom layout for grid:
* divide space into regions of same size, place objects in center of their

View File

@ -6,22 +6,12 @@ interface Efl.Pack.Layout ()
]]
eo_prefix: efl_pack;
methods {
@property layout_engine {
[[Implementation of this container's layout algorithm.
The default value is the same as the widget class.
]]
set {}
get {}
values {
/* FIXME: engine is an Efl.Class */
engine: const(Efl.Object); [[Must be an $Efl.Pack.Layout subclass.]]
data: const(void_ptr); [[Any data to pass along to $Efl.Pack.Layout.layout_do.
Owned by the caller. Depends on the layout engine.]]
}
}
// Note: Do we need a layout_force or a sync flag in layout_request?
layout_request {
[[Requests EFL to call the @.layout_update method on this object.]]
[[Requests EFL to call the @.layout_update method on this object.
This @.layout_update may be called asynchronously.
]]
}
layout_update @protected {
[[Implementation of this container's layout algorithm.
@ -29,16 +19,8 @@ interface Efl.Pack.Layout ()
EFL will call this function whenever the contents of this
container need to be re-layed out on the canvas.
This can be overriden to implement highly specific layout
behaviours.
This can be overriden to implement custom layout behaviours.
]]
}
layout_do @class @protected {
[[Lay out (resize and move) children objects of $pack.]]
params {
pack: Efl.Gfx; [[The container to lay out.]]
data: const(void_ptr) @optional; [[Extra data passed by the caller.]]
}
}
}
}

View File

@ -148,40 +148,14 @@ _evas_box_custom_layout(Evas_Object *evas_box EINA_UNUSED,
}
EOLIAN static void
_efl_ui_box_efl_pack_layout_layout_update(Eo *obj, Efl_Ui_Box_Data *pd)
{
efl_pack_layout_do(pd->layout_engine, obj, pd->layout_data);
efl_event_callback_legacy_call(obj, EFL_PACK_EVENT_LAYOUT_UPDATED, NULL);
}
EOLIAN static void
_efl_ui_box_efl_pack_layout_layout_do(Eo *klass EINA_UNUSED,
void *_pd EINA_UNUSED,
Eo *obj, const void *data EINA_UNUSED)
_efl_ui_box_efl_pack_layout_layout_update(Eo *obj, Efl_Ui_Box_Data *pd EINA_UNUSED)
{
ELM_WIDGET_DATA_GET_OR_RETURN(obj, wd);
Evas_Object_Box_Data *bd;
bd = evas_object_smart_data_get(wd->resize_obj);
_efl_ui_box_custom_layout(obj, bd);
}
EOLIAN static void
_efl_ui_box_efl_pack_layout_layout_engine_set(Eo *obj, Efl_Ui_Box_Data *pd,
const Efl_Class *klass, const void *data)
{
pd->layout_engine = klass ? klass : efl_class_get(obj);
pd->layout_data = data;
efl_pack_layout_request(obj);
_sizing_eval(obj, pd);
}
EOLIAN static void
_efl_ui_box_efl_pack_layout_layout_engine_get(Eo *obj EINA_UNUSED, Efl_Ui_Box_Data *pd,
const Efl_Class **klass, const void **data)
{
if (klass) *klass = pd->layout_engine;
if (data) *data = pd->layout_data;
efl_event_callback_legacy_call(obj, EFL_PACK_EVENT_LAYOUT_UPDATED, NULL);
}
EOLIAN static void
@ -259,7 +233,6 @@ _efl_ui_box_efl_object_constructor(Eo *obj, Efl_Ui_Box_Data *pd)
elm_interface_atspi_accessible_role_set(obj, ELM_ATSPI_ROLE_FILLER);
pd->orient = EFL_ORIENT_RIGHT;
pd->layout_engine = efl_class_get(obj);
pd->align.h = 0.5;
pd->align.v = 0.5;

View File

@ -30,7 +30,5 @@ class Efl.Ui.Box (Elm.Widget, Efl.Pack.Linear, Efl.Pack.Layout,
Efl.Pack.Linear.pack_index_get;
Efl.Pack.Layout.layout_update;
Efl.Pack.Layout.layout_request;
Efl.Pack.Layout.layout_engine { get; set; }
Efl.Pack.Layout.layout_do;
}
}

View File

@ -6,64 +6,49 @@ typedef struct _Efl_Ui_Box_Flow_Data Efl_Ui_Box_Flow_Data;
struct _Efl_Ui_Box_Flow_Data
{
Efl_Ui_Box_Flow_Params params;
Eina_Bool homogenous;
Eina_Bool max_size;
};
EOLIAN static Eo *
_efl_ui_box_flow_efl_object_constructor(Eo *obj, Efl_Ui_Box_Flow_Data *pd)
{
efl_constructor(efl_super(obj, MY_CLASS));
efl_pack_layout_engine_set(obj, MY_CLASS, &pd->params);
return obj;
}
EOLIAN static void
_efl_ui_box_flow_box_flow_homogenous_set(Eo *obj EINA_UNUSED, Efl_Ui_Box_Flow_Data *pd, Eina_Bool val)
{
pd->params.homogenous = val;
pd->homogenous = val;
}
EOLIAN static Eina_Bool
_efl_ui_box_flow_box_flow_homogenous_get(Eo *obj EINA_UNUSED, Efl_Ui_Box_Flow_Data *pd)
{
return pd->params.homogenous;
return pd->homogenous;
}
EOLIAN static void
_efl_ui_box_flow_box_flow_max_size_set(Eo *obj EINA_UNUSED, Efl_Ui_Box_Flow_Data *pd, Eina_Bool val)
{
pd->params.max_size = val;
pd->max_size = val;
}
EOLIAN static Eina_Bool
_efl_ui_box_flow_box_flow_max_size_get(Eo *obj EINA_UNUSED, Efl_Ui_Box_Flow_Data *pd)
{
return pd->params.max_size;
return pd->max_size;
}
EOLIAN static void
_efl_ui_box_flow_efl_pack_layout_layout_do(Efl_Class *klass EINA_UNUSED,
void *_pd EINA_UNUSED,
Eo *obj, const void *data)
_efl_ui_box_flow_efl_pack_layout_layout_update(Eo *obj, Efl_Ui_Box_Flow_Data *pd)
{
void (*func)(Evas_Box *obj, Evas_Object_Box_Data *priv, void *data);
const Efl_Ui_Box_Flow_Params *params = data;
Evas_Object_Box_Data *bd;
Efl_Ui_Box_Data *pd;
Eina_Bool homo = EINA_FALSE, maxsize = EINA_FALSE;
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);
pd = efl_data_scope_get(obj, EFL_UI_BOX_CLASS);
if (params)
{
homo = params->homogenous;
maxsize = params->max_size;
}
homo = pd->homogenous;
maxsize = pd->max_size;
if (_horiz(pd->orient))
if (_horiz(efl_orientation_get(obj)))
{
if (homo)
{

View File

@ -1,9 +1,3 @@
struct Efl.Ui.Box.Flow_Params {
[[Extra parameters for Box_Flow layout. Can be omitted.]]
homogenous: bool; [[$true if the box flow layout is homogenous, $false otherwise]]
max_size: bool; [[$true if the box flow layout has the maximal size, $false otherwise]]
}
class Efl.Ui.Box.Flow (Efl.Ui.Box, Efl.Pack.Layout)
{
[[A custom layout engine for @Efl.Ui.Box.]]
@ -26,7 +20,6 @@ class Efl.Ui.Box.Flow (Efl.Ui.Box, Efl.Pack.Layout)
}
}
implements {
Efl.Object.constructor;
Efl.Pack.Layout.layout_do;
Efl.Pack.Layout.layout_update;
}
}

View File

@ -21,9 +21,6 @@ typedef struct _Box_Item_Iterator Box_Item_Iterator;
struct _Efl_Ui_Box_Data
{
const Efl_Class *layout_engine;
const void *layout_data;
Efl_Orient orient;
Eina_Bool homogeneous : 1;
Eina_Bool delete_me : 1;

View File

@ -4,18 +4,8 @@
#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)
_efl_ui_box_stack_efl_pack_layout_layout_update(Eo *obj, void *_pd EINA_UNUSED)
{
Evas_Object_Box_Option *opt;
Evas_Object_Box_Data *bd;

View File

@ -6,7 +6,6 @@ class Efl.Ui.Box.Stack (Efl.Ui.Box, Efl.Pack.Layout)
]]
data: null;
implements {
Efl.Object.constructor;
Efl.Pack.Layout.layout_do;
Efl.Pack.Layout.layout_update;
}
}

View File

@ -138,10 +138,8 @@ _sizing_eval(Evas_Object *obj, Efl_Ui_Grid_Data *pd EINA_UNUSED)
ELM_WIDGET_DATA_GET_OR_RETURN(obj, wd);
efl_gfx_size_hint_combined_min_get
(wd->resize_obj, &minw, &minh);
evas_object_size_hint_max_get
(wd->resize_obj, &maxw, &maxh);
efl_gfx_size_hint_combined_min_get(wd->resize_obj, &minw, &minh);
evas_object_size_hint_max_get(wd->resize_obj, &maxw, &maxh);
evas_object_size_hint_min_set(obj, minw, minh);
evas_object_size_hint_max_set(obj, maxw, maxh);
evas_object_geometry_get(obj, NULL, NULL, &w, &h);
@ -198,35 +196,12 @@ _custom_table_calc(Eo *obj, Custom_Table_Data *pd)
}
/* End of custom table class */
EOLIAN static void
_efl_ui_grid_efl_pack_layout_layout_engine_set(Eo *obj, Efl_Ui_Grid_Data *pd, const Efl_Class *engine, const void *data)
{
pd->layout_engine = engine ? engine : efl_class_get(obj);
pd->layout_data = data;
efl_pack_layout_request(obj);
}
EOLIAN static void
_efl_ui_grid_efl_pack_layout_layout_engine_get(Eo *obj EINA_UNUSED, Efl_Ui_Grid_Data *pd, const Efl_Class **engine, const void **data)
{
if (engine) *engine = pd->layout_engine;
if (data) *data = pd->layout_data;
}
EOLIAN static void
_efl_ui_grid_efl_pack_layout_layout_update(Eo *obj, Efl_Ui_Grid_Data *pd)
{
_sizing_eval(obj, pd);
efl_pack_layout_do(pd->layout_engine, obj, pd->layout_data);
}
EOLIAN static void
_efl_ui_grid_efl_pack_layout_layout_do(Eo *klass EINA_UNUSED,
void *_pd EINA_UNUSED,
Eo *obj, const void *data EINA_UNUSED)
{
ELM_WIDGET_DATA_GET_OR_RETURN(obj, wd);
_sizing_eval(obj, pd);
efl_canvas_group_calculate(efl_super(wd->resize_obj, CUSTOM_TABLE_CLASS));
}
@ -244,8 +219,6 @@ _efl_ui_grid_efl_canvas_group_group_add(Eo *obj, Efl_Ui_Grid_Data *pd)
Custom_Table_Data *custom;
Evas_Object *table;
pd->layout_engine = MY_CLASS;
elm_widget_sub_object_parent_add(obj);
table = efl_add(CUSTOM_TABLE_CLASS, obj);

View File

@ -31,7 +31,5 @@ class Efl.Ui.Grid (Elm.Widget, Efl.Pack.Grid, Efl.Pack.Layout,
Efl.Pack.Linear.pack_end;
Efl.Pack.Layout.layout_update;
Efl.Pack.Layout.layout_request;
Efl.Pack.Layout.layout_engine { get; set; }
Efl.Pack.Layout.layout_do;
}
}

View File

@ -29,9 +29,6 @@ struct _Grid_Item
struct _Efl_Ui_Grid_Data
{
const Efl_Class *layout_engine;
const void *layout_data;
Grid_Item *items;
int count;

View File

@ -14,7 +14,6 @@ _efl_ui_grid_static_efl_object_constructor(Eo *obj, void *pd EINA_UNUSED)
elm_interface_atspi_accessible_role_set(obj, ELM_ATSPI_ROLE_FILLER);
gd = efl_data_scope_get(obj, EFL_UI_GRID_CLASS);
gd->layout_engine = MY_CLASS;
gd->req_cols = 100;
gd->req_rows = 100;
@ -22,9 +21,7 @@ _efl_ui_grid_static_efl_object_constructor(Eo *obj, void *pd EINA_UNUSED)
}
EOLIAN static void
_efl_ui_grid_static_efl_pack_layout_layout_do(Efl_Class *klass EINA_UNUSED,
void *_pd EINA_UNUSED,
Eo *obj, const void *data EINA_UNUSED)
_efl_ui_grid_static_efl_pack_layout_layout_update(Eo *obj, void *_pd EINA_UNUSED)
{
Efl_Ui_Grid_Data *gd;
Grid_Item *gi;

View File

@ -4,6 +4,6 @@ class Efl.Ui.Grid.Static (Efl.Ui.Grid)
data: null;
implements {
Efl.Object.constructor;
Efl.Pack.Layout.layout_do;
Efl.Pack.Layout.layout_update;
}
}