summaryrefslogtreecommitdiff
path: root/src/lib/edje/edje_containers.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/lib/edje/edje_containers.c')
-rw-r--r--src/lib/edje/edje_containers.c335
1 files changed, 311 insertions, 24 deletions
diff --git a/src/lib/edje/edje_containers.c b/src/lib/edje/edje_containers.c
index e25509d2d2..89bf2f708b 100644
--- a/src/lib/edje/edje_containers.c
+++ b/src/lib/edje/edje_containers.c
@@ -1,25 +1,29 @@
#include "edje_private.h"
#define EFL_CANVAS_LAYOUT_INTERNAL_BOX_PROTECTED
+#define EFL_CANVAS_LAYOUT_INTERNAL_TABLE_PROTECTED
#include "efl_canvas_layout_internal_box.eo.h"
+#include "efl_canvas_layout_internal_table.eo.h"
+
#include "../evas/canvas/evas_box.eo.h"
-#include "../evas/canvas/evas_line.eo.h"
-#include "../evas/canvas/evas_text.eo.h"
+#include "../evas/canvas/evas_table.eo.h"
-#define BOX_CLASS EFL_CANVAS_LAYOUT_INTERNAL_BOX_CLASS
+#define BOX_CLASS EFL_CANVAS_LAYOUT_INTERNAL_BOX_CLASS
+#define TABLE_CLASS EFL_CANVAS_LAYOUT_INTERNAL_TABLE_CLASS
-typedef struct _Edje_Box_Data Edje_Box_Data;
-typedef struct _Box_Item_Iterator Box_Item_Iterator;
+typedef struct _Edje_Part_Data Edje_Box_Data;
+typedef struct _Edje_Part_Data Edje_Table_Data;
+typedef struct _Part_Item_Iterator Part_Item_Iterator;
-struct _Edje_Box_Data
+struct _Edje_Part_Data
{
Edje *ed;
Edje_Real_Part *rp;
const char *part;
};
-struct _Box_Item_Iterator
+struct _Part_Item_Iterator
{
Eina_Iterator iterator;
Eina_List *list;
@@ -169,10 +173,11 @@ _efl_canvas_layout_internal_box_efl_pack_linear_content_index_get(Eo *obj EINA_U
/* this iterator is the same as efl_ui_box */
static Eina_Bool
-_box_item_iterator_next(Box_Item_Iterator *it, void **data)
+_part_item_iterator_next(Part_Item_Iterator *it, void **data)
{
Efl_Gfx_Base *sub;
+ if (!it->object) return EINA_FALSE;
if (!eina_iterator_next(it->real_iterator, (void **) &sub))
return EINA_FALSE;
@@ -181,52 +186,270 @@ _box_item_iterator_next(Box_Item_Iterator *it, void **data)
}
static Eo *
-_box_item_iterator_get_container(Box_Item_Iterator *it)
+_part_item_iterator_get_container(Part_Item_Iterator *it)
{
return it->object;
}
static void
-_box_item_iterator_free(Box_Item_Iterator *it)
+_part_item_iterator_free(Part_Item_Iterator *it)
{
eina_iterator_free(it->real_iterator);
- eina_list_free(it->list);
- eo_unref(it->object);
+ eo_wref_del(it->object, &it->object);
free(it);
}
-EOLIAN static Eina_Iterator *
-_efl_canvas_layout_internal_box_efl_container_content_iterate(Eo *obj, Edje_Box_Data *pd)
+static Eina_Iterator *
+_part_item_iterator_create(Eo *obj, Eina_Iterator *real_iterator)
{
- Box_Item_Iterator *it;
-
- if (!pd->rp->typedata.container) return NULL;
+ Part_Item_Iterator *it;
it = calloc(1, sizeof(*it));
if (!it) return NULL;
EINA_MAGIC_SET(&it->iterator, EINA_MAGIC_ITERATOR);
- it->list = evas_object_box_children_get(pd->rp->object);
- it->real_iterator = eina_list_iterator_new(it->list);
+ it->real_iterator = real_iterator;
it->iterator.version = EINA_ITERATOR_VERSION;
- it->iterator.next = FUNC_ITERATOR_NEXT(_box_item_iterator_next);
- it->iterator.get_container = FUNC_ITERATOR_GET_CONTAINER(_box_item_iterator_get_container);
- it->iterator.free = FUNC_ITERATOR_FREE(_box_item_iterator_free);
- it->object = eo_ref(obj);
+ it->iterator.next = FUNC_ITERATOR_NEXT(_part_item_iterator_next);
+ it->iterator.get_container = FUNC_ITERATOR_GET_CONTAINER(_part_item_iterator_get_container);
+ it->iterator.free = FUNC_ITERATOR_FREE(_part_item_iterator_free);
+ eo_wref_add(obj, &it->object);
return &it->iterator;
}
+EOLIAN static Eina_Iterator *
+_efl_canvas_layout_internal_box_efl_container_content_iterate(Eo *obj, Edje_Box_Data *pd)
+{
+ Eina_Iterator *it;
+
+ if (!pd->rp->typedata.container) return NULL;
+ it = evas_object_box_iterator_new(pd->rp->object);
+
+ return _part_item_iterator_create(obj, it);
+}
+
EOLIAN static int
_efl_canvas_layout_internal_box_efl_container_content_count(Eo *obj EINA_UNUSED, Edje_Box_Data *pd)
{
- if (!pd->rp->typedata.container) return 0;
return evas_obj_box_count(pd->rp->object);
}
+EOLIAN static Efl_Orient
+_efl_canvas_layout_internal_box_efl_pack_linear_direction_get(Eo *obj EINA_UNUSED, Edje_Box_Data *pd)
+{
+ const Edje_Part_Description_Box *desc =
+ (Edje_Part_Description_Box *) pd->rp->chosen_description;
+
+ if (!desc || !desc->box.layout)
+ return EFL_ORIENT_NONE;
+
+ if (!strncmp(desc->box.layout, "vertical", 8))
+ return EFL_ORIENT_VERTICAL;
+ else if (!strncmp(desc->box.layout, "horizontal", 10))
+ return EFL_ORIENT_HORIZONTAL;
+
+ WRN("unknown orientation '%s'", desc->box.layout);
+ return EFL_ORIENT_NONE;
+}
+
+/* Table */
+
+Eo *
+_edje_table_internal_proxy_get(Edje_Object *obj, Edje *ed, Edje_Real_Part *rp)
+{
+ Efl_Canvas_Layout_Internal_Box *eo = rp->typedata.container->eo_proxy;
+
+ if (eo) return eo;
+
+ eo = eo_add(TABLE_CLASS, obj, efl_canvas_layout_internal_table_real_part_set(eo_self, ed, rp, rp->part->name));
+ eo_event_callback_add(eo, EO_BASE_EVENT_DEL, _del_cb, rp);
+
+ rp->typedata.container->eo_proxy = eo;
+ return eo;
+}
+
+EOLIAN static void
+_efl_canvas_layout_internal_table_real_part_set(Eo *obj EINA_UNUSED, Edje_Table_Data *pd, void *ed, void *rp, const char *part)
+{
+ pd->ed = ed;
+ pd->rp = rp;
+ pd->part = part;
+}
+
+EOLIAN static Eo_Base *
+_efl_canvas_layout_internal_table_eo_base_finalize(Eo *obj, Edje_Table_Data *pd)
+{
+ EINA_SAFETY_ON_FALSE_RETURN_VAL(pd->rp && pd->ed && pd->part, NULL);
+ return eo_finalize(eo_super(obj, TABLE_CLASS));
+}
+
+EOLIAN static Eina_Iterator *
+_efl_canvas_layout_internal_table_efl_container_content_iterate(Eo *obj, Edje_Table_Data *pd)
+{
+ Eina_Iterator *it;
+
+ if (!pd->rp->typedata.container) return NULL;
+ it = evas_object_table_iterator_new(pd->rp->object);
+
+ return _part_item_iterator_create(obj, it);
+}
+
+EOLIAN static int
+_efl_canvas_layout_internal_table_efl_container_content_count(Eo *obj EINA_UNUSED, Edje_Table_Data *pd)
+{
+ return evas_obj_table_count(pd->rp->object);
+}
+
+EOLIAN static Eina_Bool
+_efl_canvas_layout_internal_table_efl_container_content_remove(Eo *obj, Edje_Table_Data *pd EINA_UNUSED, Efl_Gfx_Base *content)
+{
+ return efl_pack_unpack(obj, content);
+}
+
+EOLIAN static void
+_efl_canvas_layout_internal_table_efl_pack_pack_clear(Eo *obj EINA_UNUSED, Edje_Table_Data *pd)
+{
+ _edje_part_table_clear(pd->ed, pd->part, EINA_TRUE);
+}
+
+EOLIAN static void
+_efl_canvas_layout_internal_table_efl_pack_unpack_all(Eo *obj EINA_UNUSED, Edje_Table_Data *pd)
+{
+ _edje_part_table_clear(pd->ed, pd->part, EINA_FALSE);
+}
+
+EOLIAN static Eina_Bool
+_efl_canvas_layout_internal_table_efl_pack_unpack(Eo *obj EINA_UNUSED EINA_UNUSED, Edje_Table_Data *pd, Efl_Gfx_Base *subobj)
+{
+ return _edje_part_table_unpack(pd->ed, pd->part, subobj);
+}
+
+EOLIAN static void
+_efl_canvas_layout_internal_table_efl_pack_grid_pack_grid(Eo *obj EINA_UNUSED, Edje_Table_Data *pd, Efl_Gfx_Base *subobj, int col, int row, int colspan, int rowspan)
+{
+ _edje_part_table_pack(pd->ed, pd->part, subobj, col, row, colspan, rowspan);
+}
+
+EOLIAN static Efl_Gfx_Base *
+_efl_canvas_layout_internal_table_efl_pack_grid_grid_content_at(Eo *obj EINA_UNUSED, Edje_Table_Data *pd, int col, int row)
+{
+ return _edje_part_table_child_get(pd->ed, pd->part, col, row);
+}
+
+EOLIAN static void
+_efl_canvas_layout_internal_table_efl_pack_grid_grid_size_get(Eo *obj EINA_UNUSED, Edje_Table_Data *pd, int *cols, int *rows)
+{
+ _edje_part_table_col_row_size_get(pd->ed, pd->part, cols, rows);
+}
+
+EOLIAN static int
+_efl_canvas_layout_internal_table_efl_pack_grid_grid_columns_get(Eo *obj EINA_UNUSED, Edje_Table_Data *pd)
+{
+ int cols = 0, rows = 0;
+ _edje_part_table_col_row_size_get(pd->ed, pd->part, &cols, &rows);
+ return cols;
+}
+
+EOLIAN static int
+_efl_canvas_layout_internal_table_efl_pack_grid_grid_rows_get(Eo *obj EINA_UNUSED, Edje_Table_Data *pd)
+{
+ int cols = 0, rows = 0;
+ _edje_part_table_col_row_size_get(pd->ed, pd->part, &cols, &rows);
+ return rows;
+}
+
+/* New table apis with eo */
+
+static Eina_Bool
+_table_item_iterator_next(Part_Item_Iterator *it, void **data)
+{
+ Efl_Gfx_Base *sub;
+
+ if (!it->object) return EINA_FALSE;
+ if (!eina_iterator_next(it->real_iterator, (void **) &sub))
+ return EINA_FALSE;
+
+ if (data) *data = sub;
+ return EINA_TRUE;
+}
+
+static Eo *
+_table_item_iterator_get_container(Part_Item_Iterator *it)
+{
+ return it->object;
+}
+
+static void
+_table_item_iterator_free(Part_Item_Iterator *it)
+{
+ eina_iterator_free(it->real_iterator);
+ eina_list_free(it->list);
+ eo_wref_del(it->object, &it->object);
+ free(it);
+}
+
+EOLIAN static Eina_Iterator *
+_efl_canvas_layout_internal_table_efl_pack_grid_grid_content_iterate(Eo *obj EINA_UNUSED, Edje_Table_Data *pd, int col, int row, Eina_Bool below)
+{
+ Evas_Object *sobj;
+ Eina_Iterator *it;
+ Part_Item_Iterator *pit;
+ Eina_List *list = NULL;
+ unsigned short c, r, cs, rs;
+
+ /* FIXME: terrible performance because there is no proper evas table api */
+
+ it = evas_object_table_iterator_new(pd->rp->object);
+ EINA_ITERATOR_FOREACH(it, sobj)
+ {
+ evas_object_table_pack_get(pd->rp->object, sobj, &c, &r, &cs, &rs);
+ if (((int) c == col) && ((int) r == row))
+ list = eina_list_append(list, sobj);
+ else if (below)
+ {
+ if (((int) c <= col) && ((int) (c + cs) >= col) &&
+ ((int) r <= row) && ((int) (r + rs) >= row))
+ list = eina_list_append(list, sobj);
+ }
+ }
+ eina_iterator_free(it);
+
+ pit = calloc(1, sizeof(*pit));
+ if (!pit) return NULL;
+
+ EINA_MAGIC_SET(&pit->iterator, EINA_MAGIC_ITERATOR);
+
+ pit->list = list;
+ pit->real_iterator = eina_list_iterator_new(pit->list);
+ pit->iterator.version = EINA_ITERATOR_VERSION;
+ pit->iterator.next = FUNC_ITERATOR_NEXT(_table_item_iterator_next);
+ pit->iterator.get_container = FUNC_ITERATOR_GET_CONTAINER(_table_item_iterator_get_container);
+ pit->iterator.free = FUNC_ITERATOR_FREE(_table_item_iterator_free);
+ eo_wref_add(obj, &pit->object);
+
+ return &pit->iterator;
+}
+
+EOLIAN static Eina_Bool
+_efl_canvas_layout_internal_table_efl_pack_grid_grid_content_position_get(Eo *obj EINA_UNUSED, Edje_Table_Data *pd, Efl_Gfx_Base * subobj, int *col, int *row, int *colspan, int *rowspan)
+{
+ unsigned short c, r, cs, rs;
+ Eina_Bool ret;
+
+ ret = evas_object_table_pack_get(pd->rp->object, subobj, &c, &r, &cs, &rs);
+ if (col) *col = c;
+ if (row) *row = r;
+ if (colspan) *colspan = cs;
+ if (rowspan) *rowspan = rs;
+
+ return ret;
+}
+
/* Legacy API implementation */
+#ifdef DEGUG
#define PART_BOX_GET(obj, part, ...) ({ \
Eo *__box = efl_content_get(obj, part); \
if (!__box || !eo_isa(__box, EFL_CANVAS_LAYOUT_INTERNAL_BOX_CLASS)) \
@@ -235,6 +458,12 @@ _efl_canvas_layout_internal_box_efl_container_content_count(Eo *obj EINA_UNUSED,
return __VA_ARGS__; \
} \
__box; })
+#else
+#define PART_BOX_GET(obj, part, ...) ({ \
+ Eo *__box = efl_content_get(obj, part); \
+ if (!__box) return __VA_ARGS__; \
+ __box; })
+#endif
EAPI Eina_Bool
edje_object_part_box_append(Edje_Object *obj, const char *part, Evas_Object *child)
@@ -301,4 +530,62 @@ edje_object_part_box_remove_all(Edje_Object *obj, const char *part, Eina_Bool cl
return EINA_TRUE;
}
+#ifdef DEBUG
+#define PART_TABLE_GET(obj, part, ...) ({ \
+ Eo *__table = efl_content_get(obj, part); \
+ if (!__table || !eo_isa(__table, EFL_CANVAS_LAYOUT_INTERNAL_TABLE_CLASS)) \
+ { \
+ ERR("No such table part '%s' in layout %p", part, obj); \
+ return __VA_ARGS__; \
+ } \
+ __table; })
+#else
+#define PART_TABLE_GET(obj, part, ...) ({ \
+ Eo *__table = efl_content_get(obj, part); \
+ if (!__table) return __VA_ARGS__; \
+ __table; })
+#endif
+
+EAPI Eina_Bool
+edje_object_part_table_pack(Edje_Object *obj, const char *part, Evas_Object *child_obj, unsigned short col, unsigned short row, unsigned short colspan, unsigned short rowspan)
+{
+ Eo *table = PART_TABLE_GET(obj, part, EINA_FALSE);
+ efl_pack_grid(table, child_obj, col, row, colspan, rowspan);
+ return EINA_TRUE;
+}
+
+EAPI Eina_Bool
+edje_object_part_table_col_row_size_get(const Edje_Object *obj, const char *part, int *cols, int *rows)
+{
+ Eo *table = PART_TABLE_GET(obj, part, EINA_FALSE);
+ efl_pack_grid_size_get(table, cols, rows);
+ return EINA_TRUE;
+}
+
+EAPI Evas_Object *
+edje_object_part_table_child_get(const Edje_Object *obj, const char *part, unsigned int col, unsigned int row)
+{
+ Eo *table = PART_TABLE_GET(obj, part, NULL);
+ return efl_pack_grid_content_at(table, col, row);
+}
+
+EAPI Eina_Bool
+edje_object_part_table_unpack(Edje_Object *obj, const char *part, Evas_Object *child_obj)
+{
+ Eo *table = PART_TABLE_GET(obj, part, EINA_FALSE);
+ return efl_pack_unpack(table, child_obj);
+}
+
+EAPI Eina_Bool
+edje_object_part_table_clear(Edje_Object *obj, const char *part, Eina_Bool clear)
+{
+ Eo *table = PART_TABLE_GET(obj, part, EINA_FALSE);
+ if (clear)
+ efl_pack_clear(table);
+ else
+ efl_pack_unpack_all(table);
+ return EINA_TRUE;
+}
+
#include "efl_canvas_layout_internal_box.eo.c"
+#include "efl_canvas_layout_internal_table.eo.c"