2016-06-09 21:29:33 -07:00
|
|
|
#include "efl_ui_grid_private.h"
|
2016-04-11 22:10:47 -07:00
|
|
|
|
2016-04-18 04:17:24 -07:00
|
|
|
#include "../evas/canvas/evas_table.eo.h"
|
2016-04-11 22:10:47 -07:00
|
|
|
|
|
|
|
#define MY_CLASS EFL_UI_GRID_CLASS
|
|
|
|
#define MY_CLASS_NAME "Efl.Ui.Grid"
|
|
|
|
|
2016-04-18 04:17:24 -07:00
|
|
|
typedef struct _Custom_Table_Data Custom_Table_Data;
|
2016-04-11 22:10:47 -07:00
|
|
|
|
2016-04-14 00:41:57 -07:00
|
|
|
static Eina_Bool _subobj_del_cb(void *data, const Eo_Event *event);
|
2016-05-10 04:25:44 -07:00
|
|
|
static void _item_remove(Efl_Ui_Grid *obj, Efl_Ui_Grid_Data *pd, Efl_Gfx *subobj);
|
2016-04-14 00:41:57 -07:00
|
|
|
|
2016-04-18 04:17:24 -07:00
|
|
|
struct _Custom_Table_Data
|
|
|
|
{
|
|
|
|
Efl_Ui_Grid *parent;
|
|
|
|
Efl_Ui_Grid_Data *gd;
|
|
|
|
};
|
|
|
|
|
2016-04-22 14:15:04 -07:00
|
|
|
EO_CALLBACKS_ARRAY_DEFINE(subobj_callbacks,
|
2016-05-17 09:14:47 -07:00
|
|
|
{ EO_EVENT_DEL, _subobj_del_cb });
|
2016-04-14 00:41:57 -07:00
|
|
|
|
2016-04-11 22:10:47 -07:00
|
|
|
EOLIAN static Eina_Bool
|
|
|
|
_efl_ui_grid_elm_widget_focus_next_manager_is(Eo *obj EINA_UNUSED, Efl_Ui_Grid_Data *pd EINA_UNUSED)
|
|
|
|
{
|
|
|
|
return EINA_TRUE;
|
|
|
|
}
|
|
|
|
|
|
|
|
EOLIAN static Eina_Bool
|
|
|
|
_efl_ui_grid_elm_widget_focus_next(Eo *obj, Efl_Ui_Grid_Data *pd EINA_UNUSED, Elm_Focus_Direction dir, Evas_Object **next, Elm_Object_Item **next_item)
|
|
|
|
{
|
|
|
|
Eina_Bool int_ret;
|
|
|
|
|
|
|
|
const Eina_List *items;
|
|
|
|
Eina_List *(*list_free)(Eina_List *list);
|
|
|
|
void *(*list_data_get)(const Eina_List *list);
|
|
|
|
|
|
|
|
ELM_WIDGET_DATA_GET_OR_RETURN(obj, wd, EINA_FALSE);
|
|
|
|
|
|
|
|
/* Focus chain */
|
|
|
|
/* TODO: Change this to use other chain */
|
|
|
|
if ((items = elm_widget_focus_custom_chain_get(obj)))
|
|
|
|
{
|
|
|
|
list_data_get = eina_list_data_get;
|
|
|
|
list_free = NULL;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
items = evas_object_table_children_get
|
2016-04-19 01:43:28 -07:00
|
|
|
(wd->resize_obj);
|
2016-04-11 22:10:47 -07:00
|
|
|
list_data_get = eina_list_data_get;
|
|
|
|
list_free = eina_list_free;
|
|
|
|
|
|
|
|
if (!items) return EINA_FALSE;
|
|
|
|
}
|
|
|
|
|
|
|
|
int_ret = elm_widget_focus_list_next_get(obj, items, list_data_get, dir, next, next_item);
|
|
|
|
|
|
|
|
if (list_free) list_free((Eina_List *)items);
|
|
|
|
|
|
|
|
return int_ret;
|
|
|
|
}
|
|
|
|
|
|
|
|
EOLIAN static Eina_Bool
|
|
|
|
_efl_ui_grid_elm_widget_focus_direction_manager_is(Eo *obj EINA_UNUSED, Efl_Ui_Grid_Data *pd EINA_UNUSED)
|
|
|
|
{
|
|
|
|
return EINA_TRUE;
|
|
|
|
}
|
|
|
|
|
|
|
|
EOLIAN static Eina_Bool
|
|
|
|
_efl_ui_grid_elm_widget_focus_direction(Eo *obj, Efl_Ui_Grid_Data *pd EINA_UNUSED, const Evas_Object *base, double degree, Evas_Object **direction, Elm_Object_Item **direction_item, double *weight)
|
|
|
|
{
|
|
|
|
Eina_Bool int_ret;
|
|
|
|
|
|
|
|
const Eina_List *items;
|
|
|
|
Eina_List *(*list_free)(Eina_List *list);
|
|
|
|
void *(*list_data_get)(const Eina_List *list);
|
|
|
|
|
|
|
|
ELM_WIDGET_DATA_GET_OR_RETURN(obj, wd, EINA_FALSE);
|
|
|
|
|
|
|
|
/* Focus chain */
|
|
|
|
/* TODO: Change this to use other chain */
|
|
|
|
if ((items = elm_widget_focus_custom_chain_get(obj)))
|
|
|
|
{
|
|
|
|
list_data_get = eina_list_data_get;
|
|
|
|
list_free = NULL;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
items = evas_object_table_children_get
|
2016-04-19 01:43:28 -07:00
|
|
|
(wd->resize_obj);
|
2016-04-11 22:10:47 -07:00
|
|
|
list_data_get = eina_list_data_get;
|
|
|
|
list_free = eina_list_free;
|
|
|
|
|
|
|
|
if (!items) return EINA_FALSE;
|
|
|
|
}
|
|
|
|
|
|
|
|
int_ret = elm_widget_focus_list_direction_get
|
2016-04-19 01:43:28 -07:00
|
|
|
(obj, base, items, list_data_get, degree, direction, direction_item, weight);
|
2016-04-11 22:10:47 -07:00
|
|
|
|
|
|
|
if (list_free)
|
|
|
|
list_free((Eina_List *)items);
|
|
|
|
|
|
|
|
return int_ret;
|
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
|
|
|
_mirrored_set(Evas_Object *obj, Eina_Bool rtl)
|
|
|
|
{
|
|
|
|
ELM_WIDGET_DATA_GET_OR_RETURN(obj, wd);
|
|
|
|
|
|
|
|
evas_object_table_mirrored_set(wd->resize_obj, rtl);
|
|
|
|
}
|
|
|
|
|
|
|
|
EOLIAN static Eina_Bool
|
|
|
|
_efl_ui_grid_elm_widget_theme_apply(Eo *obj, Efl_Ui_Grid_Data *pd EINA_UNUSED)
|
|
|
|
{
|
|
|
|
Eina_Bool int_ret = EINA_FALSE;
|
|
|
|
int_ret = elm_obj_widget_theme_apply(eo_super(obj, MY_CLASS));
|
|
|
|
if (!int_ret) return EINA_FALSE;
|
|
|
|
|
|
|
|
_mirrored_set(obj, elm_widget_mirrored_get(obj));
|
|
|
|
|
|
|
|
return EINA_TRUE;
|
|
|
|
}
|
|
|
|
|
2016-04-14 00:41:57 -07:00
|
|
|
static void
|
|
|
|
_layout_updated_emit(Efl_Ui_Grid *obj)
|
|
|
|
{
|
|
|
|
eo_event_callback_call(obj, EFL_PACK_EVENT_LAYOUT_UPDATED, NULL);
|
|
|
|
}
|
|
|
|
|
2016-04-11 22:10:47 -07:00
|
|
|
static void
|
|
|
|
_sizing_eval(Evas_Object *obj, Efl_Ui_Grid_Data *pd EINA_UNUSED)
|
|
|
|
{
|
|
|
|
Evas_Coord minw = 0, minh = 0, maxw = -1, maxh = -1;
|
|
|
|
Evas_Coord w, h;
|
|
|
|
|
|
|
|
ELM_WIDGET_DATA_GET_OR_RETURN(obj, wd);
|
|
|
|
|
2016-06-09 00:29:40 -07:00
|
|
|
efl_gfx_size_hint_combined_min_get
|
2016-04-19 01:43:28 -07:00
|
|
|
(wd->resize_obj, &minw, &minh);
|
2016-04-11 22:10:47 -07:00
|
|
|
evas_object_size_hint_max_get
|
2016-04-19 01:43:28 -07:00
|
|
|
(wd->resize_obj, &maxw, &maxh);
|
2016-04-11 22:10:47 -07:00
|
|
|
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);
|
|
|
|
if (w < minw) w = minw;
|
|
|
|
if (h < minh) h = minh;
|
|
|
|
if ((maxw >= 0) && (w > maxw)) w = maxw;
|
|
|
|
if ((maxh >= 0) && (h > maxh)) h = maxh;
|
|
|
|
evas_object_resize(obj, w, h);
|
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
2016-04-14 00:41:57 -07:00
|
|
|
_table_size_hints_changed(void *data, Evas *e EINA_UNUSED,
|
|
|
|
Evas_Object *table EINA_UNUSED,
|
|
|
|
void *event_info EINA_UNUSED)
|
2016-04-11 22:10:47 -07:00
|
|
|
{
|
|
|
|
Efl_Ui_Grid_Data *pd = eo_data_scope_get(data, MY_CLASS);
|
|
|
|
|
|
|
|
_sizing_eval(data, pd);
|
|
|
|
}
|
|
|
|
|
2016-04-18 04:17:24 -07:00
|
|
|
/* Custom table class: overrides smart_calculate. */
|
|
|
|
static void _custom_table_calc(Eo *obj, Custom_Table_Data *pd);
|
|
|
|
|
|
|
|
static const Eo_Op_Description custom_table_op_desc[] = {
|
|
|
|
EO_OP_CLASS_FUNC_OVERRIDE(evas_obj_smart_calculate, _custom_table_calc),
|
|
|
|
};
|
|
|
|
|
|
|
|
static const Eo_Class_Description custom_table_class_desc = {
|
|
|
|
EO_VERSION, "Efl.Ui.Grid.Internal", EO_CLASS_TYPE_REGULAR,
|
|
|
|
EO_CLASS_DESCRIPTION_OPS(custom_table_op_desc), NULL,
|
|
|
|
sizeof(Custom_Table_Data), NULL, NULL
|
|
|
|
};
|
|
|
|
|
|
|
|
EO_DEFINE_CLASS(_efl_ui_grid_custom_table_class_get, &custom_table_class_desc,
|
|
|
|
EVAS_TABLE_CLASS, NULL)
|
|
|
|
|
|
|
|
#define CUSTOM_TABLE_CLASS _efl_ui_grid_custom_table_class_get()
|
|
|
|
|
|
|
|
static void
|
|
|
|
_custom_table_calc(Eo *obj, Custom_Table_Data *pd)
|
|
|
|
{
|
|
|
|
int cols, rows;
|
|
|
|
|
|
|
|
evas_object_table_col_row_size_get(obj, &cols, &rows);
|
|
|
|
if ((cols < 1) || (rows < 1)) return;
|
|
|
|
|
|
|
|
efl_pack_layout_update(pd->parent);
|
|
|
|
_layout_updated_emit(pd->parent);
|
|
|
|
}
|
|
|
|
/* End of custom table class */
|
|
|
|
|
2016-04-19 01:43:28 -07:00
|
|
|
EOLIAN static void
|
|
|
|
_efl_ui_grid_efl_pack_layout_layout_engine_set(Eo *obj, Efl_Ui_Grid_Data *pd, const Eo_Class *engine, const void *data)
|
2016-04-18 04:17:24 -07:00
|
|
|
{
|
|
|
|
pd->layout_engine = engine ? engine : eo_class_get(obj);
|
|
|
|
pd->layout_data = data;
|
|
|
|
efl_pack_layout_request(obj);
|
|
|
|
}
|
|
|
|
|
2016-04-19 01:43:28 -07:00
|
|
|
EOLIAN static void
|
|
|
|
_efl_ui_grid_efl_pack_layout_layout_engine_get(Eo *obj EINA_UNUSED, Efl_Ui_Grid_Data *pd, const Eo_Class **engine, const void **data)
|
2016-04-18 04:17:24 -07:00
|
|
|
{
|
|
|
|
if (engine) *engine = pd->layout_engine;
|
|
|
|
if (data) *data = pd->layout_data;
|
|
|
|
}
|
|
|
|
|
|
|
|
EOLIAN static void
|
2016-04-19 01:43:28 -07:00
|
|
|
_efl_ui_grid_efl_pack_layout_layout_update(Eo *obj, Efl_Ui_Grid_Data *pd)
|
2016-04-18 04:17:24 -07:00
|
|
|
{
|
|
|
|
_sizing_eval(obj, pd);
|
2016-04-19 01:43:28 -07:00
|
|
|
efl_pack_layout_do(pd->layout_engine, obj, pd->layout_data);
|
2016-04-18 04:17:24 -07:00
|
|
|
}
|
|
|
|
|
2016-04-11 22:10:47 -07:00
|
|
|
EOLIAN static void
|
2016-04-19 01:43:28 -07:00
|
|
|
_efl_ui_grid_efl_pack_layout_layout_do(Eo *klass EINA_UNUSED,
|
|
|
|
void *_pd EINA_UNUSED,
|
|
|
|
Eo *obj, const void *data EINA_UNUSED)
|
2016-04-11 22:10:47 -07:00
|
|
|
{
|
2016-04-18 04:17:24 -07:00
|
|
|
ELM_WIDGET_DATA_GET_OR_RETURN(obj, wd);
|
|
|
|
|
|
|
|
evas_obj_smart_calculate(eo_super(wd->resize_obj, CUSTOM_TABLE_CLASS));
|
|
|
|
}
|
|
|
|
|
|
|
|
EOLIAN void
|
|
|
|
_efl_ui_grid_evas_object_smart_calculate(Eo *obj, Efl_Ui_Grid_Data *pd EINA_UNUSED)
|
|
|
|
{
|
|
|
|
ELM_WIDGET_DATA_GET_OR_RETURN(obj, wd);
|
|
|
|
|
|
|
|
efl_pack_layout_update(obj);
|
|
|
|
}
|
|
|
|
|
|
|
|
EOLIAN static void
|
|
|
|
_efl_ui_grid_evas_object_smart_add(Eo *obj, Efl_Ui_Grid_Data *pd)
|
|
|
|
{
|
|
|
|
Custom_Table_Data *custom;
|
2016-04-11 22:10:47 -07:00
|
|
|
Evas_Object *table;
|
|
|
|
|
2016-04-18 04:17:24 -07:00
|
|
|
pd->layout_engine = MY_CLASS;
|
|
|
|
|
2016-04-11 22:10:47 -07:00
|
|
|
elm_widget_sub_object_parent_add(obj);
|
|
|
|
|
2016-04-18 04:17:24 -07:00
|
|
|
table = eo_add(CUSTOM_TABLE_CLASS, obj);
|
|
|
|
custom = eo_data_scope_get(table, CUSTOM_TABLE_CLASS);
|
|
|
|
custom->gd = pd;
|
|
|
|
custom->parent = obj;
|
|
|
|
|
2016-04-14 00:41:57 -07:00
|
|
|
evas_object_table_homogeneous_set(table, EVAS_OBJECT_TABLE_HOMOGENEOUS_TABLE);
|
2016-04-11 22:10:47 -07:00
|
|
|
elm_widget_resize_object_set(obj, table, EINA_TRUE);
|
|
|
|
|
|
|
|
evas_object_event_callback_add
|
2016-04-19 01:43:28 -07:00
|
|
|
(table, EVAS_CALLBACK_CHANGED_SIZE_HINTS, _table_size_hints_changed, obj);
|
2016-04-11 22:10:47 -07:00
|
|
|
|
|
|
|
evas_obj_smart_add(eo_super(obj, MY_CLASS));
|
|
|
|
|
|
|
|
elm_widget_can_focus_set(obj, EINA_FALSE);
|
|
|
|
elm_widget_highlight_ignore_set(obj, EINA_FALSE);
|
|
|
|
|
|
|
|
elm_obj_widget_theme_apply(obj);
|
|
|
|
}
|
|
|
|
|
|
|
|
EOLIAN static void
|
|
|
|
_efl_ui_grid_evas_object_smart_del(Eo *obj, Efl_Ui_Grid_Data *pd EINA_UNUSED)
|
|
|
|
{
|
|
|
|
Eina_List *l;
|
|
|
|
Evas_Object *child;
|
|
|
|
|
|
|
|
ELM_WIDGET_DATA_GET_OR_RETURN(obj, wd);
|
|
|
|
|
|
|
|
evas_object_event_callback_del_full
|
2016-04-19 01:43:28 -07:00
|
|
|
(wd->resize_obj, EVAS_CALLBACK_CHANGED_SIZE_HINTS,
|
|
|
|
_table_size_hints_changed, obj);
|
2016-04-11 22:10:47 -07:00
|
|
|
|
|
|
|
/* let's make our table object the *last* to be processed, since it
|
|
|
|
* may (smart) parent other sub objects here */
|
|
|
|
EINA_LIST_FOREACH(wd->subobjs, l, child)
|
|
|
|
{
|
|
|
|
if (child == wd->resize_obj)
|
|
|
|
{
|
|
|
|
wd->subobjs =
|
2016-04-19 01:43:28 -07:00
|
|
|
eina_list_demote_list(wd->subobjs, l);
|
2016-04-11 22:10:47 -07:00
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
evas_obj_smart_del(eo_super(obj, MY_CLASS));
|
|
|
|
}
|
|
|
|
|
|
|
|
EOLIAN static Eo *
|
|
|
|
_efl_ui_grid_eo_base_constructor(Eo *obj, Efl_Ui_Grid_Data *pd)
|
|
|
|
{
|
|
|
|
obj = eo_constructor(eo_super(obj, MY_CLASS));
|
|
|
|
evas_obj_type_set(obj, MY_CLASS_NAME);
|
|
|
|
elm_interface_atspi_accessible_role_set(obj, ELM_ATSPI_ROLE_FILLER);
|
|
|
|
|
|
|
|
pd->dir1 = EFL_ORIENT_RIGHT;
|
|
|
|
pd->dir2 = EFL_ORIENT_DOWN;
|
2016-04-14 00:41:57 -07:00
|
|
|
pd->last_col = -1;
|
|
|
|
pd->last_row = -1;
|
|
|
|
pd->req_cols = 0;
|
|
|
|
pd->req_rows = 0;
|
2016-04-11 22:10:47 -07:00
|
|
|
|
|
|
|
return obj;
|
|
|
|
}
|
|
|
|
|
2016-04-18 04:17:24 -07:00
|
|
|
|
|
|
|
|
2016-04-11 22:10:47 -07:00
|
|
|
EOLIAN static void
|
2016-04-19 01:43:28 -07:00
|
|
|
_efl_ui_grid_efl_pack_pack_padding_set(Eo *obj, Efl_Ui_Grid_Data *pd EINA_UNUSED, double h, double v, Eina_Bool scalable)
|
2016-04-11 22:10:47 -07:00
|
|
|
{
|
|
|
|
ELM_WIDGET_DATA_GET_OR_RETURN(obj, wd);
|
|
|
|
|
|
|
|
if (h < 0) h = 0;
|
|
|
|
if (v < 0) v = 0;
|
|
|
|
pd->pad.h = h;
|
|
|
|
pd->pad.v = v;
|
|
|
|
pd->pad.scalable = !!scalable;
|
|
|
|
if (pd->pad.scalable)
|
|
|
|
{
|
|
|
|
double scale = elm_object_scale_get(obj);
|
|
|
|
evas_object_table_padding_set(wd->resize_obj, h * scale, v * scale);
|
|
|
|
}
|
|
|
|
else
|
2016-04-19 01:43:28 -07:00
|
|
|
evas_object_table_padding_set(wd->resize_obj, h, v);
|
2016-04-11 22:10:47 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
EOLIAN static void
|
2016-04-19 01:43:28 -07:00
|
|
|
_efl_ui_grid_efl_pack_pack_padding_get(Eo *obj, Efl_Ui_Grid_Data *pd EINA_UNUSED, double *h, double *v, Eina_Bool *scalable)
|
2016-04-11 22:10:47 -07:00
|
|
|
{
|
|
|
|
ELM_WIDGET_DATA_GET_OR_RETURN(obj, wd);
|
|
|
|
|
|
|
|
if (scalable) *scalable = pd->pad.scalable;
|
|
|
|
if (h) *h = pd->pad.h;
|
|
|
|
if (v) *v = pd->pad.v;
|
|
|
|
}
|
|
|
|
|
2016-04-14 00:41:57 -07:00
|
|
|
static Eina_Bool
|
|
|
|
_subobj_del_cb(void *data, const Eo_Event *event)
|
|
|
|
{
|
|
|
|
Efl_Ui_Grid *obj = data;
|
|
|
|
Efl_Ui_Grid_Data *pd = eo_data_scope_get(obj, EFL_UI_GRID_CLASS);
|
|
|
|
|
2016-05-18 08:17:36 -07:00
|
|
|
eo_event_callback_array_del(event->object, subobj_callbacks(), data);
|
|
|
|
_item_remove(obj, pd, event->object);
|
2016-04-14 00:41:57 -07:00
|
|
|
|
2016-05-18 08:17:36 -07:00
|
|
|
if (!elm_widget_sub_object_del(obj, event->object))
|
2016-04-14 00:41:57 -07:00
|
|
|
WRN("failed to remove child from its parent");
|
|
|
|
|
|
|
|
return EO_CALLBACK_CONTINUE;
|
|
|
|
}
|
|
|
|
|
2016-04-25 23:21:21 -07:00
|
|
|
static Eina_Bool
|
2016-05-10 04:25:44 -07:00
|
|
|
_pack_at(Eo *obj, Efl_Ui_Grid_Data *pd, Efl_Gfx *subobj,
|
2016-04-14 00:41:57 -07:00
|
|
|
int col, int row, int colspan, int rowspan, Eina_Bool linear)
|
2016-04-11 22:10:47 -07:00
|
|
|
{
|
2016-04-14 00:41:57 -07:00
|
|
|
Grid_Item *gi = NULL;
|
2016-04-11 22:10:47 -07:00
|
|
|
|
2016-04-25 23:21:21 -07:00
|
|
|
ELM_WIDGET_DATA_GET_OR_RETURN(obj, wd, EINA_FALSE);
|
|
|
|
|
2016-04-11 22:10:47 -07:00
|
|
|
if (col < 0) col = 0;
|
|
|
|
if (row < 0) row = 0;
|
2016-04-14 00:41:57 -07:00
|
|
|
|
|
|
|
// note: we could have colspan = -1 mean "full width" if req_cols is set?
|
2016-04-11 22:10:47 -07:00
|
|
|
if (colspan < 1) colspan = 1;
|
|
|
|
if (rowspan < 1) rowspan = 1;
|
|
|
|
|
2016-04-14 00:41:57 -07:00
|
|
|
if (((int64_t) col + (int64_t) colspan) > (int64_t) INT_MAX)
|
|
|
|
colspan = INT_MAX - col;
|
|
|
|
|
|
|
|
if (((int64_t) row + (int64_t) rowspan) > (int64_t) INT_MAX)
|
|
|
|
rowspan = INT_MAX - row;
|
|
|
|
|
|
|
|
if ((pd->req_cols && ((col + colspan) > pd->req_cols)) ||
|
|
|
|
(pd->req_rows && ((row + rowspan) > pd->req_rows)))
|
2016-04-11 22:10:47 -07:00
|
|
|
{
|
2016-04-14 00:41:57 -07:00
|
|
|
ERR("grid requested size exceeded! packing in extra cell at "
|
|
|
|
"%d,%d %dx%d (grid: %dx%d)",
|
|
|
|
col, row, colspan, rowspan, pd->req_cols, pd->req_rows);
|
2016-04-11 22:10:47 -07:00
|
|
|
}
|
2016-04-14 00:41:57 -07:00
|
|
|
|
|
|
|
if (obj == elm_widget_parent_widget_get(subobj))
|
2016-04-11 22:10:47 -07:00
|
|
|
{
|
2016-04-14 00:41:57 -07:00
|
|
|
gi = eo_key_data_get(subobj, GRID_ITEM_KEY);
|
|
|
|
if (gi)
|
|
|
|
{
|
|
|
|
gi->col = col;
|
|
|
|
gi->row = row;
|
|
|
|
gi->col_span = colspan;
|
|
|
|
gi->row_span = rowspan;
|
|
|
|
gi->linear = EINA_FALSE;
|
|
|
|
}
|
|
|
|
else ERR("object is a child but internal data was not found!");
|
2016-04-11 22:10:47 -07:00
|
|
|
}
|
|
|
|
|
2016-04-14 00:41:57 -07:00
|
|
|
if (!gi)
|
2016-04-13 22:12:16 -07:00
|
|
|
{
|
2016-04-14 00:41:57 -07:00
|
|
|
gi = calloc(1, sizeof(*gi));
|
|
|
|
gi->col = col;
|
|
|
|
gi->row = row;
|
|
|
|
gi->col_span = colspan;
|
|
|
|
gi->row_span = rowspan;
|
|
|
|
gi->linear = !!linear;
|
|
|
|
gi->object = subobj; // xref(, obj);
|
|
|
|
pd->count++;
|
|
|
|
pd->items = (Grid_Item *)
|
|
|
|
eina_inlist_append(EINA_INLIST_GET(pd->items), EINA_INLIST_GET(gi));
|
|
|
|
|
|
|
|
eo_key_data_set(subobj, GRID_ITEM_KEY, gi);
|
|
|
|
elm_widget_sub_object_add(obj, subobj);
|
2016-04-19 22:55:26 -07:00
|
|
|
eo_event_callback_call(obj, EFL_CONTAINER_EVENT_CONTENT_ADDED, subobj);
|
2016-04-22 14:15:04 -07:00
|
|
|
eo_event_callback_array_add(subobj, subobj_callbacks(), obj);
|
2016-04-13 22:12:16 -07:00
|
|
|
}
|
2016-04-11 22:10:47 -07:00
|
|
|
|
2016-04-25 23:21:21 -07:00
|
|
|
return evas_object_table_pack(wd->resize_obj, subobj, col, row, colspan, rowspan);
|
2016-04-11 22:10:47 -07:00
|
|
|
}
|
|
|
|
|
2016-04-25 23:21:21 -07:00
|
|
|
EOLIAN static Eina_Bool
|
2016-04-14 00:41:57 -07:00
|
|
|
_efl_ui_grid_efl_pack_grid_pack_grid(Eo *obj, Efl_Ui_Grid_Data *pd,
|
2016-05-10 04:25:44 -07:00
|
|
|
Efl_Gfx *subobj,
|
2016-04-14 00:41:57 -07:00
|
|
|
int col, int row, int colspan, int rowspan)
|
2016-04-11 22:10:47 -07:00
|
|
|
{
|
2016-04-25 23:21:21 -07:00
|
|
|
EINA_SAFETY_ON_NULL_RETURN_VAL(subobj, EINA_FALSE);
|
2016-04-14 00:41:57 -07:00
|
|
|
|
2016-04-25 23:21:21 -07:00
|
|
|
return _pack_at(obj, pd, subobj, col, row, colspan, rowspan, EINA_FALSE);
|
2016-04-14 00:41:57 -07:00
|
|
|
}
|
2016-04-11 22:10:47 -07:00
|
|
|
|
2016-04-18 04:17:24 -07:00
|
|
|
EOLIAN static Eina_Bool
|
2016-04-25 23:21:21 -07:00
|
|
|
_efl_ui_grid_efl_pack_grid_grid_position_get(Eo *obj, Efl_Ui_Grid_Data *pd EINA_UNUSED, Evas_Object *subobj, int *col, int *row, int *colspan, int *rowspan)
|
2016-04-14 00:41:57 -07:00
|
|
|
{
|
|
|
|
int c = -1, r = -1, cs = 0, rs = 0;
|
|
|
|
Grid_Item *gi;
|
2016-04-18 04:17:24 -07:00
|
|
|
Eina_Bool ret = EINA_FALSE;
|
2016-04-14 00:41:57 -07:00
|
|
|
|
|
|
|
if (obj != elm_widget_parent_widget_get(subobj))
|
|
|
|
{
|
|
|
|
ERR("%p is not a child of %p", subobj, obj);
|
|
|
|
goto end;
|
|
|
|
}
|
|
|
|
|
|
|
|
gi = eo_key_data_get(subobj, GRID_ITEM_KEY);
|
|
|
|
if (gi)
|
|
|
|
{
|
|
|
|
c = gi->col;
|
|
|
|
r = gi->row;
|
|
|
|
cs = gi->col_span;
|
|
|
|
rs = gi->row_span;
|
|
|
|
}
|
|
|
|
|
2016-04-18 04:17:24 -07:00
|
|
|
ret = EINA_TRUE;
|
|
|
|
|
2016-04-14 00:41:57 -07:00
|
|
|
end:
|
|
|
|
if (col) *col = c;
|
|
|
|
if (row) *row = r;
|
|
|
|
if (colspan) *colspan = cs;
|
|
|
|
if (rowspan) *rowspan = rs;
|
2016-04-18 04:17:24 -07:00
|
|
|
return ret;
|
2016-04-11 22:10:47 -07:00
|
|
|
}
|
|
|
|
|
2016-05-10 04:25:44 -07:00
|
|
|
EOLIAN static Efl_Gfx *
|
2016-04-25 23:21:21 -07:00
|
|
|
_efl_ui_grid_efl_pack_grid_grid_content_get(Eo *obj, Efl_Ui_Grid_Data *pd EINA_UNUSED, int col, int row)
|
2016-04-13 22:12:16 -07:00
|
|
|
{
|
|
|
|
ELM_WIDGET_DATA_GET_OR_RETURN(obj, wd, NULL);
|
|
|
|
|
|
|
|
return evas_object_table_child_get(wd->resize_obj, col, row);
|
|
|
|
}
|
|
|
|
|
2016-04-14 00:41:57 -07:00
|
|
|
static void
|
2016-05-10 04:25:44 -07:00
|
|
|
_item_remove(Efl_Ui_Grid *obj, Efl_Ui_Grid_Data *pd, Efl_Gfx *subobj)
|
2016-04-14 00:41:57 -07:00
|
|
|
{
|
|
|
|
Grid_Item *gi = eo_key_data_get(subobj, GRID_ITEM_KEY);
|
|
|
|
Grid_Item *gi2, *last = NULL;
|
|
|
|
|
|
|
|
if (!gi)
|
|
|
|
{
|
|
|
|
WRN("item %p has no grid internal data", subobj);
|
|
|
|
EINA_INLIST_FOREACH(EINA_INLIST_GET(pd->items), gi)
|
|
|
|
if (gi->object == subobj)
|
|
|
|
break;
|
|
|
|
if (!gi)
|
|
|
|
{
|
|
|
|
ERR("item %p was not found in this grid", subobj);
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
if (!gi->linear)
|
|
|
|
goto end;
|
|
|
|
|
|
|
|
EINA_INLIST_REVERSE_FOREACH(EINA_INLIST_GET(pd->items), gi2)
|
|
|
|
{
|
|
|
|
if (gi2 == gi) continue;
|
|
|
|
if (!gi2->linear) continue;
|
|
|
|
last = gi2;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
if (last)
|
|
|
|
{
|
|
|
|
if (_horiz(pd->dir1))
|
|
|
|
{
|
|
|
|
pd->last_col = last->col + last->col_span - 1;
|
|
|
|
pd->last_row = last->row;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
pd->last_row = last->row + last->row_span - 1;
|
|
|
|
pd->last_col = last->col;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
pd->last_col = -1;
|
|
|
|
pd->last_row = -1;
|
|
|
|
}
|
|
|
|
|
|
|
|
end:
|
2016-04-19 22:55:26 -07:00
|
|
|
eo_event_callback_call(obj, EFL_CONTAINER_EVENT_CONTENT_REMOVED, subobj);
|
2016-04-14 00:41:57 -07:00
|
|
|
pd->items = (Grid_Item *)
|
|
|
|
eina_inlist_remove(EINA_INLIST_GET(pd->items), EINA_INLIST_GET(gi));
|
|
|
|
pd->count--;
|
2016-05-17 09:02:37 -07:00
|
|
|
eo_key_data_set(subobj, GRID_ITEM_KEY, NULL);
|
2016-04-14 00:41:57 -07:00
|
|
|
free(gi);
|
|
|
|
}
|
|
|
|
|
2016-04-11 22:10:47 -07:00
|
|
|
EOLIAN static Eina_Bool
|
2016-05-10 04:25:44 -07:00
|
|
|
_efl_ui_grid_efl_pack_unpack(Eo *obj, Efl_Ui_Grid_Data *pd, Efl_Gfx *subobj)
|
2016-04-11 22:10:47 -07:00
|
|
|
{
|
|
|
|
ELM_WIDGET_DATA_GET_OR_RETURN(obj, wd, EINA_FALSE);
|
|
|
|
|
2016-04-14 00:41:57 -07:00
|
|
|
_item_remove(obj, pd, subobj);
|
2016-04-13 22:12:16 -07:00
|
|
|
if (evas_object_table_unpack(wd->resize_obj, subobj))
|
2016-04-11 22:10:47 -07:00
|
|
|
{
|
2016-04-13 22:12:16 -07:00
|
|
|
if (elm_widget_sub_object_del(obj, subobj))
|
|
|
|
return EINA_TRUE;
|
2016-04-14 00:41:57 -07:00
|
|
|
return EINA_FALSE; // oops - unlikely
|
2016-04-11 22:10:47 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
return EINA_FALSE;
|
|
|
|
}
|
|
|
|
|
2016-04-25 23:21:21 -07:00
|
|
|
EOLIAN static Eina_Bool
|
2016-04-19 01:43:28 -07:00
|
|
|
_efl_ui_grid_efl_pack_pack_clear(Eo *obj, Efl_Ui_Grid_Data *pd EINA_UNUSED)
|
2016-04-11 22:10:47 -07:00
|
|
|
{
|
2016-04-25 23:21:21 -07:00
|
|
|
ELM_WIDGET_DATA_GET_OR_RETURN(obj, wd, EINA_FALSE);
|
2016-04-11 22:10:47 -07:00
|
|
|
|
|
|
|
evas_object_table_clear(wd->resize_obj, EINA_TRUE);
|
2016-04-25 23:21:21 -07:00
|
|
|
return EINA_TRUE;
|
2016-04-11 22:10:47 -07:00
|
|
|
}
|
|
|
|
|
2016-04-25 23:21:21 -07:00
|
|
|
EOLIAN static Eina_Bool
|
2016-04-11 22:10:47 -07:00
|
|
|
_efl_ui_grid_efl_pack_unpack_all(Eo *obj, Efl_Ui_Grid_Data *pd EINA_UNUSED)
|
|
|
|
{
|
2016-04-25 23:21:21 -07:00
|
|
|
ELM_WIDGET_DATA_GET_OR_RETURN(obj, wd, EINA_FALSE);
|
2016-04-11 22:10:47 -07:00
|
|
|
|
|
|
|
evas_object_table_clear(wd->resize_obj, EINA_FALSE);
|
2016-04-25 23:21:21 -07:00
|
|
|
return EINA_TRUE;
|
2016-04-11 22:10:47 -07:00
|
|
|
}
|
|
|
|
|
2016-04-19 01:43:28 -07:00
|
|
|
EOLIAN static void
|
|
|
|
_efl_ui_grid_efl_pack_layout_layout_request(Eo *obj, Efl_Ui_Grid_Data *pd EINA_UNUSED)
|
2016-04-11 22:10:47 -07:00
|
|
|
{
|
|
|
|
evas_object_smart_need_recalculate_set(obj, EINA_TRUE);
|
|
|
|
}
|
|
|
|
|
|
|
|
static Eina_Bool
|
|
|
|
_grid_item_iterator_next(Grid_Item_Iterator *it, void **data)
|
|
|
|
{
|
2016-05-10 04:25:44 -07:00
|
|
|
Efl_Gfx *sub;
|
2016-04-11 22:10:47 -07:00
|
|
|
|
|
|
|
if (!eina_iterator_next(it->real_iterator, (void **) &sub))
|
|
|
|
return EINA_FALSE;
|
|
|
|
|
|
|
|
if (data) *data = sub;
|
|
|
|
return EINA_TRUE;
|
|
|
|
}
|
|
|
|
|
|
|
|
static Elm_Layout *
|
|
|
|
_grid_item_iterator_get_container(Grid_Item_Iterator *it)
|
|
|
|
{
|
|
|
|
return it->object;
|
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
|
|
|
_grid_item_iterator_free(Grid_Item_Iterator *it)
|
|
|
|
{
|
|
|
|
eina_iterator_free(it->real_iterator);
|
|
|
|
eina_list_free(it->list);
|
|
|
|
free(it);
|
|
|
|
}
|
|
|
|
|
2016-04-19 01:43:28 -07:00
|
|
|
static inline Eina_Iterator *
|
|
|
|
_grid_item_iterator_create(Eo *obj, Eina_List *list)
|
2016-04-11 22:10:47 -07:00
|
|
|
{
|
|
|
|
Grid_Item_Iterator *it;
|
2016-04-19 01:43:28 -07:00
|
|
|
if (!list) return NULL;
|
2016-04-11 22:10:47 -07:00
|
|
|
|
|
|
|
it = calloc(1, sizeof(*it));
|
|
|
|
if (!it) return NULL;
|
|
|
|
|
|
|
|
EINA_MAGIC_SET(&it->iterator, EINA_MAGIC_ITERATOR);
|
|
|
|
|
2016-04-19 01:43:28 -07:00
|
|
|
it->list = list;
|
2016-04-11 22:10:47 -07:00
|
|
|
it->real_iterator = eina_list_iterator_new(it->list);
|
|
|
|
it->iterator.version = EINA_ITERATOR_VERSION;
|
|
|
|
it->iterator.next = FUNC_ITERATOR_NEXT(_grid_item_iterator_next);
|
|
|
|
it->iterator.get_container = FUNC_ITERATOR_GET_CONTAINER(_grid_item_iterator_get_container);
|
|
|
|
it->iterator.free = FUNC_ITERATOR_FREE(_grid_item_iterator_free);
|
|
|
|
it->object = obj;
|
|
|
|
|
|
|
|
return &it->iterator;
|
|
|
|
}
|
|
|
|
|
2016-04-19 01:43:28 -07:00
|
|
|
EOLIAN static Eina_Iterator *
|
2016-04-19 22:55:26 -07:00
|
|
|
_efl_ui_grid_efl_container_content_iterate(Eo *obj, Efl_Ui_Grid_Data *pd EINA_UNUSED)
|
2016-04-19 01:43:28 -07:00
|
|
|
{
|
|
|
|
Eina_List *list;
|
|
|
|
|
|
|
|
ELM_WIDGET_DATA_GET_OR_RETURN(obj, wd, NULL);
|
|
|
|
|
|
|
|
list = evas_object_table_children_get(wd->resize_obj);
|
|
|
|
return _grid_item_iterator_create(obj, list);
|
|
|
|
}
|
|
|
|
|
2016-04-11 22:10:47 -07:00
|
|
|
EOLIAN static int
|
2016-04-19 22:55:26 -07:00
|
|
|
_efl_ui_grid_efl_container_content_count(Eo *obj EINA_UNUSED, Efl_Ui_Grid_Data *pd)
|
2016-04-11 22:10:47 -07:00
|
|
|
{
|
2016-04-14 00:41:57 -07:00
|
|
|
return pd->count;
|
2016-04-11 22:10:47 -07:00
|
|
|
}
|
|
|
|
|
2016-04-19 01:43:28 -07:00
|
|
|
EOLIAN static Eina_Iterator *
|
2016-04-25 23:21:21 -07:00
|
|
|
_efl_ui_grid_efl_pack_grid_grid_contents_get(Eo *obj, Efl_Ui_Grid_Data *pd EINA_UNUSED,
|
2016-04-19 22:55:26 -07:00
|
|
|
int col, int row, Eina_Bool below)
|
2016-04-11 22:10:47 -07:00
|
|
|
{
|
2016-04-19 01:43:28 -07:00
|
|
|
Eina_List *list, *atlist = NULL;
|
|
|
|
Evas_Object *sobj;
|
2016-04-11 22:10:47 -07:00
|
|
|
|
|
|
|
ELM_WIDGET_DATA_GET_OR_RETURN(obj, wd, NULL);
|
|
|
|
|
2016-04-19 01:43:28 -07:00
|
|
|
list = evas_object_table_children_get(wd->resize_obj);
|
|
|
|
EINA_LIST_FREE(list, sobj)
|
|
|
|
{
|
|
|
|
Grid_Item *gi = eo_key_data_get(sobj, GRID_ITEM_KEY);
|
|
|
|
if (!gi) continue;
|
|
|
|
|
|
|
|
if ((gi->col == col) && (gi->row == row))
|
|
|
|
atlist = eina_list_append(atlist, sobj);
|
|
|
|
else if (below)
|
|
|
|
{
|
|
|
|
if ((gi->col <= col) && (gi->col + gi->col_span >= col) &&
|
|
|
|
(gi->row <= row) && (gi->row + gi->row_span >= row))
|
|
|
|
atlist = eina_list_append(atlist, sobj);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
return _grid_item_iterator_create(obj, atlist);
|
2016-04-11 22:10:47 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
EOLIAN static void
|
2016-06-02 23:55:29 -07:00
|
|
|
_efl_ui_grid_efl_orientation_orientation_set(Eo *obj, Efl_Ui_Grid_Data *pd, Efl_Orient orient)
|
2016-04-11 22:10:47 -07:00
|
|
|
{
|
|
|
|
EINA_SAFETY_ON_FALSE_RETURN((orient % 90) == 0);
|
|
|
|
|
|
|
|
pd->dir1 = orient;
|
|
|
|
|
|
|
|
/* if both orientations are either horizontal or vertical, need to adjust
|
|
|
|
* secondary orientation (dir2) */
|
|
|
|
if (_horiz(pd->dir1) == _horiz(pd->dir2))
|
|
|
|
{
|
|
|
|
if (!_horiz(pd->dir1))
|
|
|
|
pd->dir2 = EFL_ORIENT_RIGHT;
|
|
|
|
else
|
2016-06-02 23:55:29 -07:00
|
|
|
pd->dir2 = EFL_ORIENT_DOWN;
|
2016-04-11 22:10:47 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
efl_pack_layout_request(obj);
|
|
|
|
}
|
|
|
|
|
|
|
|
EOLIAN static Efl_Orient
|
2016-06-02 23:55:29 -07:00
|
|
|
_efl_ui_grid_efl_orientation_orientation_get(Eo *obj EINA_UNUSED, Efl_Ui_Grid_Data *pd)
|
2016-04-11 22:10:47 -07:00
|
|
|
{
|
|
|
|
return pd->dir1;
|
|
|
|
}
|
|
|
|
|
|
|
|
EOLIAN static void
|
2016-06-02 23:55:29 -07:00
|
|
|
_efl_ui_grid_efl_pack_grid_grid_orientation_set(Eo *obj, Efl_Ui_Grid_Data *pd, Efl_Orient primary, Efl_Orient secondary)
|
2016-04-11 22:10:47 -07:00
|
|
|
{
|
|
|
|
EINA_SAFETY_ON_FALSE_RETURN((primary % 90) == 0);
|
|
|
|
EINA_SAFETY_ON_FALSE_RETURN((secondary % 90) == 0);
|
|
|
|
|
|
|
|
pd->dir1 = primary;
|
|
|
|
pd->dir2 = secondary;
|
|
|
|
|
|
|
|
if (_horiz(pd->dir1) == _horiz(pd->dir2))
|
|
|
|
{
|
|
|
|
ERR("specified two orientations in the same axis, secondary orientation "
|
|
|
|
" is reset to a valid default");
|
|
|
|
switch (pd->dir1)
|
|
|
|
{
|
|
|
|
case EFL_ORIENT_DOWN:
|
|
|
|
case EFL_ORIENT_UP:
|
|
|
|
pd->dir2 = EFL_ORIENT_RIGHT;
|
|
|
|
break;
|
|
|
|
default:
|
|
|
|
pd->dir2 = EFL_ORIENT_DOWN;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
efl_pack_layout_request(obj);
|
|
|
|
}
|
|
|
|
|
|
|
|
EOLIAN static void
|
2016-06-02 23:55:29 -07:00
|
|
|
_efl_ui_grid_efl_pack_grid_grid_orientation_get(Eo *obj EINA_UNUSED, Efl_Ui_Grid_Data *pd, Efl_Orient *primary, Efl_Orient *secondary)
|
2016-04-11 22:10:47 -07:00
|
|
|
{
|
|
|
|
if (primary) *primary = pd->dir1;
|
|
|
|
if (secondary) *secondary = pd->dir2;
|
|
|
|
}
|
|
|
|
|
|
|
|
EOLIAN static void
|
|
|
|
_efl_ui_grid_efl_pack_grid_grid_size_set(Eo *obj, Efl_Ui_Grid_Data *pd EINA_UNUSED, int cols, int rows)
|
|
|
|
{
|
|
|
|
if (cols < 0) cols = 0;
|
|
|
|
if (rows < 0) rows = 0;
|
|
|
|
|
2016-04-14 00:41:57 -07:00
|
|
|
pd->req_cols = cols;
|
|
|
|
pd->req_rows = rows;
|
|
|
|
|
|
|
|
efl_pack_layout_request(obj);
|
2016-04-11 22:10:47 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
EOLIAN static void
|
|
|
|
_efl_ui_grid_efl_pack_grid_grid_size_get(Eo *obj EINA_UNUSED, Efl_Ui_Grid_Data *pd EINA_UNUSED, int *cols, int *rows)
|
|
|
|
{
|
2016-04-19 01:43:28 -07:00
|
|
|
if (cols) *cols = efl_pack_grid_columns_get(obj);
|
|
|
|
if (rows) *rows = efl_pack_grid_rows_get(obj);
|
2016-04-11 22:10:47 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
EOLIAN static void
|
2016-04-19 01:43:28 -07:00
|
|
|
_efl_ui_grid_efl_pack_grid_grid_columns_set(Eo *obj, Efl_Ui_Grid_Data *pd, int columns)
|
2016-04-11 22:10:47 -07:00
|
|
|
{
|
2016-04-14 00:41:57 -07:00
|
|
|
pd->req_cols = columns;
|
2016-04-11 22:10:47 -07:00
|
|
|
|
|
|
|
efl_pack_layout_request(obj);
|
|
|
|
}
|
|
|
|
|
|
|
|
EOLIAN static int
|
2016-04-19 01:43:28 -07:00
|
|
|
_efl_ui_grid_efl_pack_grid_grid_columns_get(Eo *obj EINA_UNUSED, Efl_Ui_Grid_Data *pd)
|
2016-04-11 22:10:47 -07:00
|
|
|
{
|
2016-04-14 00:41:57 -07:00
|
|
|
if (!pd->req_cols)
|
|
|
|
{
|
|
|
|
ELM_WIDGET_DATA_GET_OR_RETURN(obj, wd, 0);
|
|
|
|
int cols;
|
|
|
|
evas_object_table_col_row_size_get(wd->resize_obj, &cols, NULL);
|
|
|
|
return cols;
|
|
|
|
}
|
|
|
|
return pd->req_cols;
|
2016-04-11 22:10:47 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
EOLIAN static void
|
2016-04-19 01:43:28 -07:00
|
|
|
_efl_ui_grid_efl_pack_grid_grid_rows_set(Eo *obj, Efl_Ui_Grid_Data *pd, int rows)
|
2016-04-11 22:10:47 -07:00
|
|
|
{
|
2016-04-14 00:41:57 -07:00
|
|
|
pd->req_rows = rows;
|
2016-04-11 22:10:47 -07:00
|
|
|
|
|
|
|
efl_pack_layout_request(obj);
|
|
|
|
}
|
|
|
|
|
|
|
|
EOLIAN static int
|
2016-04-19 01:43:28 -07:00
|
|
|
_efl_ui_grid_efl_pack_grid_grid_rows_get(Eo *obj EINA_UNUSED, Efl_Ui_Grid_Data *pd)
|
2016-04-11 22:10:47 -07:00
|
|
|
{
|
2016-04-14 00:41:57 -07:00
|
|
|
if (!pd->req_rows)
|
|
|
|
{
|
|
|
|
ELM_WIDGET_DATA_GET_OR_RETURN(obj, wd, 0);
|
|
|
|
int rows;
|
|
|
|
evas_object_table_col_row_size_get(wd->resize_obj, &rows, NULL);
|
|
|
|
return rows;
|
|
|
|
}
|
|
|
|
return pd->req_rows;
|
2016-04-11 22:10:47 -07:00
|
|
|
}
|
|
|
|
|
2016-04-25 23:21:21 -07:00
|
|
|
EOLIAN static Eina_Bool
|
2016-05-10 04:25:44 -07:00
|
|
|
_efl_ui_grid_efl_pack_pack(Eo *obj, Efl_Ui_Grid_Data *pd EINA_UNUSED, Efl_Gfx *subobj)
|
2016-04-11 22:10:47 -07:00
|
|
|
{
|
|
|
|
/* this is just an alias */
|
2016-04-25 23:21:21 -07:00
|
|
|
return efl_pack_end(obj, subobj);
|
2016-04-11 22:10:47 -07:00
|
|
|
}
|
|
|
|
|
2016-04-25 23:21:21 -07:00
|
|
|
EOLIAN static Eina_Bool
|
2016-05-10 04:25:44 -07:00
|
|
|
_efl_ui_grid_efl_pack_linear_pack_end(Eo *obj, Efl_Ui_Grid_Data *pd, Efl_Gfx *subobj)
|
2016-04-11 22:10:47 -07:00
|
|
|
{
|
2016-04-25 23:21:21 -07:00
|
|
|
EINA_SAFETY_ON_NULL_RETURN_VAL(subobj, EINA_FALSE);
|
2016-04-11 22:10:47 -07:00
|
|
|
|
2016-04-14 00:41:57 -07:00
|
|
|
int col = pd->last_col;
|
|
|
|
int row = pd->last_row;
|
2016-04-11 22:10:47 -07:00
|
|
|
|
|
|
|
if (_horiz(pd->dir1))
|
|
|
|
{
|
|
|
|
col++;
|
2016-04-14 00:41:57 -07:00
|
|
|
if (pd->req_cols && (col >= pd->req_cols))
|
2016-04-11 22:10:47 -07:00
|
|
|
{
|
|
|
|
col = 0;
|
|
|
|
row++;
|
|
|
|
}
|
2016-04-13 22:12:16 -07:00
|
|
|
if (row < 0) row = 0;
|
2016-04-11 22:10:47 -07:00
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
row++;
|
2016-04-14 00:41:57 -07:00
|
|
|
if (pd->req_rows && (row >= pd->req_rows))
|
2016-04-11 22:10:47 -07:00
|
|
|
{
|
|
|
|
row = 0;
|
|
|
|
col++;
|
|
|
|
}
|
2016-04-13 22:12:16 -07:00
|
|
|
if (col < 0) col = 0;
|
2016-04-11 22:10:47 -07:00
|
|
|
}
|
|
|
|
|
2016-04-14 00:41:57 -07:00
|
|
|
pd->last_col = col;
|
|
|
|
pd->last_row = row;
|
|
|
|
|
2016-04-11 22:10:47 -07:00
|
|
|
DBG("packing new obj at %d,%d", col, row);
|
2016-04-25 23:21:21 -07:00
|
|
|
return _pack_at(obj, pd, subobj, col, row, 1, 1, EINA_TRUE);
|
2016-04-11 22:10:47 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
#include "efl_ui_grid.eo.c"
|