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