Ui.Box: Fix flow layout

Set align, fix usage with eo_add(EFL_UI_BOX_FLOW_CLASS).
This commit is contained in:
Jean-Philippe Andre 2016-04-18 13:54:46 +09:00
parent f2eff88640
commit e4889ca367
7 changed files with 124 additions and 71 deletions

View File

@ -626,6 +626,7 @@ lib_elementary_libelementary_la_SOURCES = \
lib/elementary/els_tooltip.c \
lib/elementary/elu_ews_wm.c \
lib/elementary/efl_ui_box.c \
lib/elementary/efl_ui_box_flow.c \
lib/elementary/efl_ui_box_layout.c \
lib/elementary/efl_ui_grid.c \
$(NULL)

View File

@ -111,7 +111,7 @@ alignv_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 Efl_Ui_Box_Flow_Params s_flow_params = { 0, 0 };
static Eina_Bool flow = EINA_FALSE;
static Eina_Bool
@ -154,15 +154,12 @@ 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;
efl_pack_align_set(data, 0, 0.5);
}
else
{
s_flow_params.align_x = 0.5;
s_flow_params.align_y = 0.5;
efl_pack_align_set(data, 0.5, 0.5);
}
efl_pack_layout_engine_set(data, flow ? EFL_UI_BOX_FLOW_CLASS : NULL, &s_flow_params);
return EO_CALLBACK_CONTINUE;
}

View File

@ -1,5 +1,8 @@
#include "efl_ui_box_private.h"
#define MY_CLASS EFL_UI_BOX_CLASS
#define MY_CLASS_NAME "Efl.Ui.Box"
/* COPIED FROM ELM_BOX
* - removed transition stuff (TODO: add back - needs clean API first)
*/
@ -171,10 +174,10 @@ _efl_ui_box_efl_pack_engine_layout_do(Eo *klass EINA_UNUSED,
}
EOLIAN static Eina_Bool
_efl_ui_box_efl_pack_layout_engine_set(Eo *obj EINA_UNUSED, Efl_Ui_Box_Data *pd,
_efl_ui_box_efl_pack_layout_engine_set(Eo *obj, Efl_Ui_Box_Data *pd,
const Eo_Class *klass, const void *data)
{
pd->layout_engine = klass ? klass : MY_CLASS;
pd->layout_engine = klass ? klass : eo_class_get(obj);
pd->layout_data = data;
efl_pack_layout_request(obj);
_sizing_eval(obj, pd);
@ -272,7 +275,7 @@ _efl_ui_box_eo_base_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 = MY_CLASS;
pd->layout_engine = eo_class_get(obj);
pd->align.h = 0.5;
pd->align.v = 0.5;
@ -561,6 +564,8 @@ _efl_ui_box_efl_pack_padding_get(Eo *obj, Efl_Ui_Box_Data *pd, double *h, double
EOLIAN static void
_efl_ui_box_efl_pack_pack_align_set(Eo *obj, Efl_Ui_Box_Data *pd, double h, double v)
{
ELM_WIDGET_DATA_GET_OR_RETURN(obj, wd);
if (h < 0) h = -1;
if (v < 0) v = -1;
if (h > 1) h = 1;
@ -568,6 +573,7 @@ _efl_ui_box_efl_pack_pack_align_set(Eo *obj, Efl_Ui_Box_Data *pd, double h, doub
pd->align.h = h;
pd->align.v = v;
evas_object_box_align_set(wd->resize_obj, h, v);
efl_pack_layout_request(obj);
}

View File

@ -0,0 +1,94 @@
#include "efl_ui_box_private.h"
#define MY_CLASS EFL_UI_BOX_FLOW_CLASS
typedef struct _Efl_Ui_Box_Flow_Data Efl_Ui_Box_Flow_Data;
struct _Efl_Ui_Box_Flow_Data
{
Efl_Ui_Box_Flow_Params params;
};
EOLIAN static Eo *
_efl_ui_box_flow_eo_base_constructor(Eo *obj, Efl_Ui_Box_Flow_Data *pd)
{
eo_constructor(eo_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;
}
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;
}
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;
}
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;
}
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;
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);
if (params)
{
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"

View File

@ -1,7 +1,5 @@
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;
}
@ -10,8 +8,24 @@ class Efl.Ui.Box_Flow (Efl.Ui.Box, Efl.Pack_Engine)
{
[[A custom layout engine for @Efl.Ui.Box.]]
legacy_prefix: null;
data: null;
methods {
@property box_flow_homogenous {
set {}
get {}
values {
val: bool;
}
}
@property box_flow_max_size {
set {}
get {}
values {
val: bool;
}
}
}
implements {
Eo.Base.constructor;
Efl.Pack_Engine.layout_do;
}
}

View File

@ -258,59 +258,3 @@ _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"

View File

@ -13,9 +13,6 @@
// 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"
// FIXME: stop using evas box
void _efl_ui_box_custom_layout(Efl_Ui_Box *box, Evas_Object_Box_Data *priv);