forked from enlightenment/efl
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:
parent
d6d4c3c25b
commit
acb9ae70fe
|
@ -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);
|
||||
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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.]]
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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)
|
||||
{
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue