1 #include "edje_private.h"
2 #include "edje_part_helper.h"
3 #include "efl_canvas_layout_part_table.eo.h"
4 #define MY_CLASS EFL_CANVAS_LAYOUT_PART_TABLE_CLASS
5
6 #include "../evas/canvas/evas_table_eo.h"
7
8 PROXY_IMPLEMENTATION(table, MY_CLASS, EINA_FALSE)
9 #undef PROXY_IMPLEMENTATION
10
11 typedef struct _Part_Item_Iterator Part_Item_Iterator;
12
13 EOLIAN static Eina_Iterator *
_efl_canvas_layout_part_table_efl_container_content_iterate(Eo * obj,void * _pd EINA_UNUSED)14 _efl_canvas_layout_part_table_efl_container_content_iterate(Eo *obj, void *_pd EINA_UNUSED)
15 {
16 Eina_Iterator *it;
17
18 PROXY_DATA_GET(obj, pd);
19 if (!pd->rp->typedata.container) return NULL;
20 it = evas_object_table_iterator_new(pd->rp->object);
21
22 return efl_canvas_iterator_create(pd->rp->object, it, NULL);
23 }
24
25 EOLIAN static int
_efl_canvas_layout_part_table_efl_container_content_count(Eo * obj,void * _pd EINA_UNUSED)26 _efl_canvas_layout_part_table_efl_container_content_count(Eo *obj, void *_pd EINA_UNUSED)
27 {
28 PROXY_DATA_GET(obj, pd);
29 return evas_obj_table_count(pd->rp->object);
30 }
31
32 EOLIAN static Eina_Bool
_efl_canvas_layout_part_table_efl_pack_pack_clear(Eo * obj,void * _pd EINA_UNUSED)33 _efl_canvas_layout_part_table_efl_pack_pack_clear(Eo *obj, void *_pd EINA_UNUSED)
34 {
35 PROXY_DATA_GET(obj, pd);
36 return _edje_part_table_clear(pd->ed, pd->part, EINA_TRUE);
37 }
38
39 EOLIAN static Eina_Bool
_efl_canvas_layout_part_table_efl_pack_unpack_all(Eo * obj,void * _pd EINA_UNUSED)40 _efl_canvas_layout_part_table_efl_pack_unpack_all(Eo *obj, void *_pd EINA_UNUSED)
41 {
42 PROXY_DATA_GET(obj, pd);
43 return _edje_part_table_clear(pd->ed, pd->part, EINA_FALSE);
44 }
45
46 EOLIAN static Eina_Bool
_efl_canvas_layout_part_table_efl_pack_unpack(Eo * obj EINA_UNUSED,void * _pd EINA_UNUSED,Efl_Gfx_Entity * subobj)47 _efl_canvas_layout_part_table_efl_pack_unpack(Eo *obj EINA_UNUSED, void *_pd EINA_UNUSED, Efl_Gfx_Entity *subobj)
48 {
49 PROXY_DATA_GET(obj, pd);
50 return _edje_part_table_unpack(pd->ed, pd->part, subobj);
51 }
52
53 EOLIAN static Eina_Bool
_efl_canvas_layout_part_table_efl_pack_table_pack_table(Eo * obj,void * _pd EINA_UNUSED,Efl_Gfx_Entity * subobj,int col,int row,int colspan,int rowspan)54 _efl_canvas_layout_part_table_efl_pack_table_pack_table(Eo *obj, void *_pd EINA_UNUSED, Efl_Gfx_Entity *subobj, int col, int row, int colspan, int rowspan)
55 {
56 PROXY_DATA_GET(obj, pd);
57 return _edje_part_table_pack(pd->ed, pd->part, subobj, col, row, colspan, rowspan);
58 }
59
60 EOLIAN static Efl_Gfx_Entity *
_efl_canvas_layout_part_table_efl_pack_table_table_content_get(Eo * obj,void * _pd EINA_UNUSED,int col,int row)61 _efl_canvas_layout_part_table_efl_pack_table_table_content_get(Eo *obj, void *_pd EINA_UNUSED, int col, int row)
62 {
63 PROXY_DATA_GET(obj, pd);
64 return _edje_part_table_child_get(pd->ed, pd->part, col, row);
65 }
66
67 EOLIAN static void
_efl_canvas_layout_part_table_efl_pack_table_table_size_get(const Eo * obj,void * _pd EINA_UNUSED,int * cols,int * rows)68 _efl_canvas_layout_part_table_efl_pack_table_table_size_get(const Eo *obj, void *_pd EINA_UNUSED, int *cols, int *rows)
69 {
70 PROXY_DATA_GET(obj, pd);
71 _edje_part_table_col_row_size_get(pd->ed, pd->part, cols, rows);
72 }
73
74 EOLIAN static int
_efl_canvas_layout_part_table_efl_pack_table_table_columns_get(const Eo * obj,void * _pd EINA_UNUSED)75 _efl_canvas_layout_part_table_efl_pack_table_table_columns_get(const Eo *obj, void *_pd EINA_UNUSED)
76 {
77 PROXY_DATA_GET(obj, pd);
78 int cols = 0, rows = 0;
79 _edje_part_table_col_row_size_get(pd->ed, pd->part, &cols, &rows);
80 return cols;
81 }
82
83 EOLIAN static int
_efl_canvas_layout_part_table_efl_pack_table_table_rows_get(const Eo * obj,void * _pd EINA_UNUSED)84 _efl_canvas_layout_part_table_efl_pack_table_table_rows_get(const Eo *obj, void *_pd EINA_UNUSED)
85 {
86 PROXY_DATA_GET(obj, pd);
87 int cols = 0, rows = 0;
88 _edje_part_table_col_row_size_get(pd->ed, pd->part, &cols, &rows);
89 return rows;
90 }
91
92 /* New table apis with eo */
93
94 static Eina_Bool
_table_item_iterator_next(Part_Item_Iterator * it,void ** data)95 _table_item_iterator_next(Part_Item_Iterator *it, void **data)
96 {
97 Efl_Gfx_Entity *sub;
98
99 if (!it->object) return EINA_FALSE;
100 if (!eina_iterator_next(it->real_iterator, (void **) &sub))
101 return EINA_FALSE;
102
103 if (data) *data = sub;
104 return EINA_TRUE;
105 }
106
107 static Eo *
_table_item_iterator_get_container(Part_Item_Iterator * it)108 _table_item_iterator_get_container(Part_Item_Iterator *it)
109 {
110 return it->object;
111 }
112
113 static void
_table_item_iterator_free(Part_Item_Iterator * it)114 _table_item_iterator_free(Part_Item_Iterator *it)
115 {
116 eina_iterator_free(it->real_iterator);
117 eina_list_free(it->list);
118 efl_wref_del(it->object, &it->object);
119 free(it);
120 }
121
122 EOLIAN static Eina_Iterator *
_efl_canvas_layout_part_table_efl_pack_table_table_contents_get(Eo * obj,void * _pd EINA_UNUSED,int col,int row,Eina_Bool below)123 _efl_canvas_layout_part_table_efl_pack_table_table_contents_get(Eo *obj, void *_pd EINA_UNUSED, int col, int row, Eina_Bool below)
124 {
125 Evas_Object *sobj;
126 Eina_Iterator *it;
127 Part_Item_Iterator *pit;
128 Eina_List *list = NULL;
129 unsigned short c, r, cs, rs;
130
131 /* FIXME: terrible performance because there is no proper evas table api */
132
133 PROXY_DATA_GET(obj, pd);
134 it = evas_object_table_iterator_new(pd->rp->object);
135 EINA_ITERATOR_FOREACH(it, sobj)
136 {
137 evas_object_table_pack_get(pd->rp->object, sobj, &c, &r, &cs, &rs);
138 if (((int) c == col) && ((int) r == row))
139 list = eina_list_append(list, sobj);
140 else if (below)
141 {
142 if (((int) c <= col) && ((int) (c + cs) >= col) &&
143 ((int) r <= row) && ((int) (r + rs) >= row))
144 list = eina_list_append(list, sobj);
145 }
146 }
147 eina_iterator_free(it);
148
149 pit = calloc(1, sizeof(*pit));
150 if (!pit) return NULL;
151
152 EINA_MAGIC_SET(&pit->iterator, EINA_MAGIC_ITERATOR);
153
154 pit->list = list;
155 pit->real_iterator = eina_list_iterator_new(pit->list);
156 pit->iterator.version = EINA_ITERATOR_VERSION;
157 pit->iterator.next = FUNC_ITERATOR_NEXT(_table_item_iterator_next);
158 pit->iterator.get_container = FUNC_ITERATOR_GET_CONTAINER(_table_item_iterator_get_container);
159 pit->iterator.free = FUNC_ITERATOR_FREE(_table_item_iterator_free);
160 efl_wref_add(obj, &pit->object);
161
162 return &pit->iterator;
163 }
164
165 EOLIAN static Eina_Bool
_efl_canvas_layout_part_table_efl_pack_table_table_cell_column_get(const Eo * obj,void * _pd EINA_UNUSED,Efl_Gfx_Entity * subobj,int * col,int * colspan)166 _efl_canvas_layout_part_table_efl_pack_table_table_cell_column_get(const Eo *obj, void *_pd EINA_UNUSED, Efl_Gfx_Entity * subobj, int *col, int *colspan)
167 {
168 unsigned short c, cs;
169 Eina_Bool ret;
170
171 PROXY_DATA_GET(obj, pd);
172 ret = evas_object_table_pack_get(pd->rp->object, subobj, &c, NULL, &cs, NULL);
173 if (col) *col = c;
174 if (colspan) *colspan = cs;
175
176 return ret;
177 }
178
179 EOLIAN static void
_efl_canvas_layout_part_table_efl_pack_table_table_cell_column_set(Eo * obj,void * _pd EINA_UNUSED,Efl_Gfx_Entity * subobj,int col,int colspan)180 _efl_canvas_layout_part_table_efl_pack_table_table_cell_column_set(Eo *obj, void *_pd EINA_UNUSED, Efl_Gfx_Entity * subobj, int col, int colspan)
181 {
182 unsigned short r, rs;
183
184 PROXY_DATA_GET(obj, pd);
185 evas_object_table_pack_get(pd->rp->object, subobj, NULL, &r, NULL, &rs);
186 evas_object_table_pack(pd->rp->object, subobj, col, r, colspan, rs);
187 }
188
189 EOLIAN static Eina_Bool
_efl_canvas_layout_part_table_efl_pack_table_table_cell_row_get(const Eo * obj,void * _pd EINA_UNUSED,Efl_Gfx_Entity * subobj,int * row,int * rowspan)190 _efl_canvas_layout_part_table_efl_pack_table_table_cell_row_get(const Eo *obj, void *_pd EINA_UNUSED, Efl_Gfx_Entity * subobj, int *row, int *rowspan)
191 {
192 unsigned short r, rs;
193 Eina_Bool ret;
194
195 PROXY_DATA_GET(obj, pd);
196 ret = evas_object_table_pack_get(pd->rp->object, subobj, NULL, &r, NULL, &rs);
197 if (row) *row = r;
198 if (rowspan) *rowspan = rs;
199
200 return ret;
201 }
202
203 EOLIAN static void
_efl_canvas_layout_part_table_efl_pack_table_table_cell_row_set(Eo * obj,void * _pd EINA_UNUSED,Efl_Gfx_Entity * subobj,int row,int rowspan)204 _efl_canvas_layout_part_table_efl_pack_table_table_cell_row_set(Eo *obj, void *_pd EINA_UNUSED, Efl_Gfx_Entity * subobj, int row, int rowspan)
205 {
206 unsigned short c, cs;
207
208 PROXY_DATA_GET(obj, pd);
209 evas_object_table_pack_get(pd->rp->object, subobj, &c, NULL, &cs, NULL);
210 evas_object_table_pack(pd->rp->object, subobj, c, row, cs, rowspan);
211 }
212
213 /* Legacy API implementation */
214
215 #ifdef DEGUG
216 #define PART_BOX_GET(obj, part, ...) ({ \
217 Eo *__box = efl_part(obj, part); \
218 if (!__box || !efl_isa(__box, EFL_CANVAS_LAYOUT_PART_BOX_CLASS)) \
219 { \
220 ERR("No such box part '%s' in layout %p", part, obj); \
221 return __VA_ARGS__; \
222 } \
223 __box; })
224 #else
225 #define PART_BOX_GET(obj, part, ...) ({ \
226 Eo *__box = efl_part(obj, part); \
227 if (!__box) return __VA_ARGS__; \
228 __box; })
229 #endif
230
231 EAPI Eina_Bool
edje_object_part_box_append(Edje_Object * obj,const char * part,Evas_Object * child)232 edje_object_part_box_append(Edje_Object *obj, const char *part, Evas_Object *child)
233 {
234 Eo *box = PART_BOX_GET(obj, part, EINA_FALSE);
235 return efl_pack_end(box, child);
236 }
237
238 EAPI Eina_Bool
edje_object_part_box_prepend(Edje_Object * obj,const char * part,Evas_Object * child)239 edje_object_part_box_prepend(Edje_Object *obj, const char *part, Evas_Object *child)
240 {
241 Eo *box = PART_BOX_GET(obj, part, EINA_FALSE);
242 return efl_pack_begin(box, child);
243 }
244
245 EAPI Eina_Bool
edje_object_part_box_insert_before(Edje_Object * obj,const char * part,Evas_Object * child,const Evas_Object * reference)246 edje_object_part_box_insert_before(Edje_Object *obj, const char *part, Evas_Object *child, const Evas_Object *reference)
247 {
248 Eo *box = PART_BOX_GET(obj, part, EINA_FALSE);
249 return efl_pack_before(box, child, reference);
250 }
251
252 EAPI Eina_Bool
edje_object_part_box_insert_after(Edje_Object * obj,const char * part,Evas_Object * child,const Evas_Object * reference)253 edje_object_part_box_insert_after(Edje_Object *obj, const char *part, Evas_Object *child, const Evas_Object *reference)
254 {
255 Eo *box = PART_BOX_GET(obj, part, EINA_FALSE);
256 return efl_pack_after(box, child, reference);
257 }
258
259 EAPI Eina_Bool
edje_object_part_box_insert_at(Edje_Object * obj,const char * part,Evas_Object * child,unsigned int pos)260 edje_object_part_box_insert_at(Edje_Object *obj, const char *part, Evas_Object *child, unsigned int pos)
261 {
262 Eo *box = PART_BOX_GET(obj, part, EINA_FALSE);
263 return efl_pack_at(box, child, pos);
264 }
265
266 EAPI Evas_Object *
edje_object_part_box_remove_at(Edje_Object * obj,const char * part,unsigned int pos)267 edje_object_part_box_remove_at(Edje_Object *obj, const char *part, unsigned int pos)
268 {
269 Eo *box = PART_BOX_GET(obj, part, NULL);
270 return efl_pack_unpack_at(box, pos);
271 }
272
273 EAPI Evas_Object *
edje_object_part_box_remove(Edje_Object * obj,const char * part,Evas_Object * child)274 edje_object_part_box_remove(Edje_Object *obj, const char *part, Evas_Object *child)
275 {
276 Eo *box = PART_BOX_GET(obj, part, NULL);
277 if (efl_pack_unpack(box, child))
278 return child;
279 return NULL;
280 }
281
282 EAPI Eina_Bool
edje_object_part_box_remove_all(Edje_Object * obj,const char * part,Eina_Bool clear)283 edje_object_part_box_remove_all(Edje_Object *obj, const char *part, Eina_Bool clear)
284 {
285 Eo *box = PART_BOX_GET(obj, part, EINA_FALSE);
286 if (clear)
287 return efl_pack_clear(box);
288 else
289 return efl_pack_unpack_all(box);
290 }
291
292 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)293 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)
294 {
295 Eo *table = PART_TABLE_GET(obj, part, EINA_FALSE);
296 return efl_pack_table(table, child_obj, col, row, colspan, rowspan);
297 }
298
299 EAPI Eina_Bool
edje_object_part_table_col_row_size_get(const Edje_Object * obj,const char * part,int * cols,int * rows)300 edje_object_part_table_col_row_size_get(const Edje_Object *obj, const char *part, int *cols, int *rows)
301 {
302 Eo *table = PART_TABLE_GET(obj, part, EINA_FALSE);
303 efl_pack_table_size_get(table, cols, rows);
304 return EINA_TRUE;
305 }
306
307 EAPI Evas_Object *
edje_object_part_table_child_get(const Edje_Object * obj,const char * part,unsigned int col,unsigned int row)308 edje_object_part_table_child_get(const Edje_Object *obj, const char *part, unsigned int col, unsigned int row)
309 {
310 Eo *table = PART_TABLE_GET(obj, part, NULL);
311 return efl_pack_table_content_get(table, col, row);
312 }
313
314 EAPI Eina_Bool
edje_object_part_table_unpack(Edje_Object * obj,const char * part,Evas_Object * child_obj)315 edje_object_part_table_unpack(Edje_Object *obj, const char *part, Evas_Object *child_obj)
316 {
317 Eo *table = PART_TABLE_GET(obj, part, EINA_FALSE);
318 return efl_pack_unpack(table, child_obj);
319 }
320
321 EAPI Eina_Bool
edje_object_part_table_clear(Edje_Object * obj,const char * part,Eina_Bool clear)322 edje_object_part_table_clear(Edje_Object *obj, const char *part, Eina_Bool clear)
323 {
324 Eo *table = PART_TABLE_GET(obj, part, EINA_FALSE);
325 if (clear)
326 return efl_pack_clear(table);
327 else
328 return efl_pack_unpack_all(table);
329 }
330
331 #include "efl_canvas_layout_part_table.eo.c"
332