remove eina_pure and eina_nonnull because really.. they screw up
[framework/uifw/elementary.git] / src / lib / elm_layout.h
1 /**
2  * @defgroup Layout Layout
3  *
4  * @image html img/widget/layout/preview-00.png
5  * @image latex img/widget/layout/preview-00.eps width=\textwidth
6  *
7  * @image html img/layout-predefined.png
8  * @image latex img/layout-predefined.eps width=\textwidth
9  *
10  * This is a container widget that takes a standard Edje design file and
11  * wraps it very thinly in a widget.
12  *
13  * An Edje design (theme) file has a very wide range of possibilities to
14  * describe the behavior of elements added to the Layout. Check out the Edje
15  * documentation and the EDC reference to get more information about what can
16  * be done with Edje.
17  *
18  * Just like @ref List, @ref Box, and other container widgets, any
19  * object added to the Layout will become its child, meaning that it will be
20  * deleted if the Layout is deleted, move if the Layout is moved, and so on.
21  *
22  * The Layout widget can contain as many Contents, Boxes or Tables as
23  * described in its theme file. For instance, objects can be added to
24  * different Tables by specifying the respective Table part names. The same
25  * is valid for Content and Box.
26  *
27  * The objects added as child of the Layout will behave as described in the
28  * part description where they were added. There are 3 possible types of
29  * parts where a child can be added:
30  *
31  * @section secContent Content (SWALLOW part)
32  *
33  * Only one object can be added to the @c SWALLOW part (but you still can
34  * have many @c SWALLOW parts and one object on each of them). Use the @c
35  * elm_object_content_set/get/unset functions to set, retrieve and unset
36  * objects as content of the @c SWALLOW. After being set to this part, the
37  * object size, position, visibility, clipping and other description
38  * properties will be totally controlled by the description of the given part
39  * (inside the Edje theme file).
40  *
41  * One can use @c evas_object_size_hint_* functions on the child to have some
42  * kind of control over its behavior, but the resulting behavior will still
43  * depend heavily on the @c SWALLOW part description.
44  *
45  * The Edje theme also can change the part description, based on signals or
46  * scripts running inside the theme. This change can also be animated. All of
47  * this will affect the child object set as content accordingly. The object
48  * size will be changed if the part size is changed, it will animate move if
49  * the part is moving, and so on.
50  *
51  * The following picture demonstrates a Layout widget with a child object
52  * added to its @c SWALLOW:
53  *
54  * @image html layout_swallow.png
55  * @image latex layout_swallow.eps width=\textwidth
56  *
57  * @section secBox Box (BOX part)
58  *
59  * An Edje @c BOX part is very similar to the Elementary @ref Box widget. It
60  * allows one to add objects to the box and have them distributed along its
61  * area, accordingly to the specified @a layout property (now by @a layout we
62  * mean the chosen layouting design of the Box, not the Layout widget
63  * itself).
64  *
65  * A similar effect for having a box with its position, size and other things
66  * controlled by the Layout theme would be to create an Elementary @ref Box
67  * widget and add it as a Content in the @c SWALLOW part.
68  *
69  * The main difference of using the Layout Box is that its behavior, the box
70  * properties like layouting format, padding, align, etc. will be all
71  * controlled by the theme. This means, for example, that a signal could be
72  * sent to the Layout theme (with elm_object_signal_emit()) and the theme
73  * handled the signal by changing the box padding, or align, or both. Using
74  * the Elementary @ref Box widget is not necessarily harder or easier, it
75  * just depends on the circunstances and requirements.
76  *
77  * The Layout Box can be used through the @c elm_layout_box_* set of
78  * functions.
79  *
80  * The following picture demonstrates a Layout widget with many child objects
81  * added to its @c BOX part:
82  *
83  * @image html layout_box.png
84  * @image latex layout_box.eps width=\textwidth
85  *
86  * @section secTable Table (TABLE part)
87  *
88  * Just like the @ref secBox, the Layout Table is very similar to the
89  * Elementary @ref Table widget. It allows one to add objects to the Table
90  * specifying the row and column where the object should be added, and any
91  * column or row span if necessary.
92  *
93  * Again, we could have this design by adding a @ref Table widget to the @c
94  * SWALLOW part using elm_object_part_content_set(). The same difference happens
95  * here when choosing to use the Layout Table (a @c TABLE part) instead of
96  * the @ref Table plus @c SWALLOW part. It's just a matter of convenience.
97  *
98  * The Layout Table can be used through the @c elm_layout_table_* set of
99  * functions.
100  *
101  * The following picture demonstrates a Layout widget with many child objects
102  * added to its @c TABLE part:
103  *
104  * @image html layout_table.png
105  * @image latex layout_table.eps width=\textwidth
106  *
107  * @section secPredef Predefined Layouts
108  *
109  * Another interesting thing about the Layout widget is that it offers some
110  * predefined themes that come with the default Elementary theme. These
111  * themes can be set by the call elm_layout_theme_set(), and provide some
112  * basic functionality depending on the theme used.
113  *
114  * Most of them already send some signals, some already provide a toolbar or
115  * back and next buttons.
116  *
117  * These are available predefined theme layouts. All of them have class = @c
118  * layout, group = @c application, and style = one of the following options:
119  *
120  * @li @c toolbar-content - application with toolbar and main content area
121  * @li @c toolbar-content-back - application with toolbar and main content
122  * area with a back button and title area
123  * @li @c toolbar-content-back-next - application with toolbar and main
124  * content area with a back and next buttons and title area
125  * @li @c content-back - application with a main content area with a back
126  * button and title area
127  * @li @c content-back-next - application with a main content area with a
128  * back and next buttons and title area
129  * @li @c toolbar-vbox - application with toolbar and main content area as a
130  * vertical box
131  * @li @c toolbar-table - application with toolbar and main content area as a
132  * table
133  *
134  * @section secExamples Examples
135  *
136  * Some examples of the Layout widget can be found here:
137  * @li @ref layout_example_01
138  * @li @ref layout_example_02
139  * @li @ref layout_example_03
140  * @li @ref layout_example_edc
141  *
142  */
143
144 /**
145  * Add a new layout to the parent
146  *
147  * @param parent The parent object
148  * @return The new object or NULL if it cannot be created
149  *
150  * @see elm_layout_file_set()
151  * @see elm_layout_theme_set()
152  *
153  * @ingroup Layout
154  */
155 EAPI Evas_Object                 *elm_layout_add(Evas_Object *parent);
156
157 /**
158  * Set the file that will be used as layout
159  *
160  * @param obj The layout object
161  * @param file The path to file (edj) that will be used as layout
162  * @param group The group that the layout belongs in edje file
163  *
164  * @return (1 = success, 0 = error)
165  *
166  * @ingroup Layout
167  */
168 EAPI Eina_Bool                    elm_layout_file_set(Evas_Object *obj, const char *file, const char *group);
169
170 /**
171  * Set the edje group from the elementary theme that will be used as layout
172  *
173  * @param obj The layout object
174  * @param clas the clas of the group
175  * @param group the group
176  * @param style the style to used
177  *
178  * @return (1 = success, 0 = error)
179  *
180  * @ingroup Layout
181  */
182 EAPI Eina_Bool                    elm_layout_theme_set(Evas_Object *obj, const char *clas, const char *group, const char *style);
183
184 /**
185  * Append child to layout box part.
186  *
187  * @param obj the layout object
188  * @param part the box part to which the object will be appended.
189  * @param child the child object to append to box.
190  *
191  * Once the object is appended, it will become child of the layout. Its
192  * lifetime will be bound to the layout, whenever the layout dies the child
193  * will be deleted automatically. One should use elm_layout_box_remove() to
194  * make this layout forget about the object.
195  *
196  * @see elm_layout_box_prepend()
197  * @see elm_layout_box_insert_before()
198  * @see elm_layout_box_insert_at()
199  * @see elm_layout_box_remove()
200  *
201  * @ingroup Layout
202  */
203 EAPI void                         elm_layout_box_append(Evas_Object *obj, const char *part, Evas_Object *child);
204
205 /**
206  * Prepend child to layout box part.
207  *
208  * @param obj the layout object
209  * @param part the box part to prepend.
210  * @param child the child object to prepend to box.
211  *
212  * Once the object is prepended, it will become child of the layout. Its
213  * lifetime will be bound to the layout, whenever the layout dies the child
214  * will be deleted automatically. One should use elm_layout_box_remove() to
215  * make this layout forget about the object.
216  *
217  * @see elm_layout_box_append()
218  * @see elm_layout_box_insert_before()
219  * @see elm_layout_box_insert_at()
220  * @see elm_layout_box_remove()
221  *
222  * @ingroup Layout
223  */
224 EAPI void                         elm_layout_box_prepend(Evas_Object *obj, const char *part, Evas_Object *child);
225
226 /**
227  * Insert child to layout box part before a reference object.
228  *
229  * @param obj the layout object
230  * @param part the box part to insert.
231  * @param child the child object to insert into box.
232  * @param reference another reference object to insert before in box.
233  *
234  * Once the object is inserted, it will become child of the layout. Its
235  * lifetime will be bound to the layout, whenever the layout dies the child
236  * will be deleted automatically. One should use elm_layout_box_remove() to
237  * make this layout forget about the object.
238  *
239  * @see elm_layout_box_append()
240  * @see elm_layout_box_prepend()
241  * @see elm_layout_box_insert_before()
242  * @see elm_layout_box_remove()
243  *
244  * @ingroup Layout
245  */
246 EAPI void                         elm_layout_box_insert_before(Evas_Object *obj, const char *part, Evas_Object *child, const Evas_Object *reference);
247
248 /**
249  * Insert child to layout box part at a given position.
250  *
251  * @param obj the layout object
252  * @param part the box part to insert.
253  * @param child the child object to insert into box.
254  * @param pos the numeric position >=0 to insert the child.
255  *
256  * Once the object is inserted, it will become child of the layout. Its
257  * lifetime will be bound to the layout, whenever the layout dies the child
258  * will be deleted automatically. One should use elm_layout_box_remove() to
259  * make this layout forget about the object.
260  *
261  * @see elm_layout_box_append()
262  * @see elm_layout_box_prepend()
263  * @see elm_layout_box_insert_before()
264  * @see elm_layout_box_remove()
265  *
266  * @ingroup Layout
267  */
268 EAPI void                         elm_layout_box_insert_at(Evas_Object *obj, const char *part, Evas_Object *child, unsigned int pos);
269
270 /**
271  * Remove a child of the given part box.
272  *
273  * @param obj The layout object
274  * @param part The box part name to remove child.
275  * @param child The object to remove from box.
276  * @return The object that was being used, or NULL if not found.
277  *
278  * The object will be removed from the box part and its lifetime will
279  * not be handled by the layout anymore. This is equivalent to
280  * elm_object_part_content_unset() for box.
281  *
282  * @see elm_layout_box_append()
283  * @see elm_layout_box_remove_all()
284  *
285  * @ingroup Layout
286  */
287 EAPI Evas_Object                 *elm_layout_box_remove(Evas_Object *obj, const char *part, Evas_Object *child);
288
289 /**
290  * Remove all children of the given part box.
291  *
292  * @param obj The layout object
293  * @param part The box part name to remove child.
294  * @param clear If EINA_TRUE, then all objects will be deleted as
295  *        well, otherwise they will just be removed and will be
296  *        dangling on the canvas.
297  *
298  * The objects will be removed from the box part and their lifetime will
299  * not be handled by the layout anymore. This is equivalent to
300  * elm_layout_box_remove() for all box children.
301  *
302  * @see elm_layout_box_append()
303  * @see elm_layout_box_remove()
304  *
305  * @ingroup Layout
306  */
307 EAPI void                         elm_layout_box_remove_all(Evas_Object *obj, const char *part, Eina_Bool clear);
308
309 /**
310  * Insert child to layout table part.
311  *
312  * @param obj the layout object
313  * @param part the box part to pack child.
314  * @param child_obj the child object to pack into table.
315  * @param col the column to which the child should be added. (>= 0)
316  * @param row the row to which the child should be added. (>= 0)
317  * @param colspan how many columns should be used to store this object. (>=
318  *        1)
319  * @param rowspan how many rows should be used to store this object. (>= 1)
320  *
321  * Once the object is inserted, it will become child of the table. Its
322  * lifetime will be bound to the layout, and whenever the layout dies the
323  * child will be deleted automatically. One should use
324  * elm_layout_table_remove() to make this layout forget about the object.
325  *
326  * If @p colspan or @p rowspan are bigger than 1, that object will occupy
327  * more space than a single cell. For instance, the following code:
328  * @code
329  * elm_layout_table_pack(layout, "table_part", child, 0, 1, 3, 1);
330  * @endcode
331  *
332  * Would result in an object being added like the following picture:
333  *
334  * @image html layout_colspan.png
335  * @image latex layout_colspan.eps width=\textwidth
336  *
337  * @see elm_layout_table_unpack()
338  * @see elm_layout_table_clear()
339  *
340  * @ingroup Layout
341  */
342 EAPI void                         elm_layout_table_pack(Evas_Object *obj, const char *part, Evas_Object *child_obj, unsigned short col, unsigned short row, unsigned short colspan, unsigned short rowspan);
343
344 /**
345  * Unpack (remove) a child of the given part table.
346  *
347  * @param obj The layout object
348  * @param part The table part name to remove child.
349  * @param child_obj The object to remove from table.
350  * @return The object that was being used, or NULL if not found.
351  *
352  * The object will be unpacked from the table part and its lifetime
353  * will not be handled by the layout anymore. This is equivalent to
354  * elm_object_part_content_unset() for table.
355  *
356  * @see elm_layout_table_pack()
357  * @see elm_layout_table_clear()
358  *
359  * @ingroup Layout
360  */
361 EAPI Evas_Object                 *elm_layout_table_unpack(Evas_Object *obj, const char *part, Evas_Object *child_obj);
362
363 /**
364  * Remove all the child objects of the given part table.
365  *
366  * @param obj The layout object
367  * @param part The table part name to remove child.
368  * @param clear If EINA_TRUE, then all objects will be deleted as
369  *        well, otherwise they will just be removed and will be
370  *        dangling on the canvas.
371  *
372  * The objects will be removed from the table part and their lifetime will
373  * not be handled by the layout anymore. This is equivalent to
374  * elm_layout_table_unpack() for all table children.
375  *
376  * @see elm_layout_table_pack()
377  * @see elm_layout_table_unpack()
378  *
379  * @ingroup Layout
380  */
381 EAPI void                         elm_layout_table_clear(Evas_Object *obj, const char *part, Eina_Bool clear);
382
383 /**
384  * Get the edje layout
385  *
386  * @param obj The layout object
387  *
388  * @return A Evas_Object with the edje layout settings loaded
389  * with function elm_layout_file_set
390  *
391  * This returns the edje object. It is not expected to be used to then
392  * swallow objects via edje_object_part_swallow() for example. Use
393  * elm_object_part_content_set() instead so child object handling and sizing is
394  * done properly.
395  *
396  * @note This function should only be used if you really need to call some
397  * low level Edje function on this edje object. All the common stuff (setting
398  * text, emitting signals, hooking callbacks to signals, etc.) can be done
399  * with proper elementary functions.
400  *
401  * @see elm_object_signal_callback_add()
402  * @see elm_object_signal_emit()
403  * @see elm_object_part_text_set()
404  * @see elm_object_part_content_set()
405  * @see elm_layout_box_append()
406  * @see elm_layout_table_pack()
407  * @see elm_layout_data_get()
408  *
409  * @ingroup Layout
410  */
411 EAPI Evas_Object                 *elm_layout_edje_get(const Evas_Object *obj);
412
413 /**
414  * Get the edje data from the given layout
415  *
416  * @param obj The layout object
417  * @param key The data key
418  *
419  * @return The edje data string
420  *
421  * This function fetches data specified inside the edje theme of this layout.
422  * This function return NULL if data is not found.
423  *
424  * In EDC this comes from a data block within the group block that @p
425  * obj was loaded from. E.g.
426  *
427  * @code
428  * collections {
429  *   group {
430  *     name: "a_group";
431  *     data {
432  *       item: "key1" "value1";
433  *       item: "key2" "value2";
434  *     }
435  *   }
436  * }
437  * @endcode
438  *
439  * @ingroup Layout
440  */
441 EAPI const char                  *elm_layout_data_get(const Evas_Object *obj, const char *key);
442
443 /**
444  * Eval sizing
445  *
446  * @param obj The layout object
447  *
448  * Manually forces a sizing re-evaluation. This is useful when the minimum
449  * size required by the edje theme of this layout has changed. The change on
450  * the minimum size required by the edje theme is not immediately reported to
451  * the elementary layout, so one needs to call this function in order to tell
452  * the widget (layout) that it needs to reevaluate its own size.
453  *
454  * The minimum size of the theme is calculated based on minimum size of
455  * parts, the size of elements inside containers like box and table, etc. All
456  * of this can change due to state changes, and that's when this function
457  * should be called.
458  *
459  * Also note that a standard signal of "size,eval" "elm" emitted from the
460  * edje object will cause this to happen too.
461  *
462  * @ingroup Layout
463  */
464 EAPI void                         elm_layout_sizing_eval(Evas_Object *obj);
465
466 /**
467  * Sets a specific cursor for an edje part.
468  *
469  * @param obj The layout object.
470  * @param part_name a part from loaded edje group.
471  * @param cursor cursor name to use, see Elementary_Cursor.h
472  *
473  * @return EINA_TRUE on success or EINA_FALSE on failure, that may be
474  *         part not exists or it has "mouse_events: 0".
475  *
476  * @ingroup Layout
477  */
478 EAPI Eina_Bool                    elm_layout_part_cursor_set(Evas_Object *obj, const char *part_name, const char *cursor);
479
480 /**
481  * Get the cursor to be shown when mouse is over an edje part
482  *
483  * @param obj The layout object.
484  * @param part_name a part from loaded edje group.
485  * @return the cursor name.
486  *
487  * @ingroup Layout
488  */
489 EAPI const char                  *elm_layout_part_cursor_get(const Evas_Object *obj, const char *part_name);
490
491 /**
492  * Unsets a cursor previously set with elm_layout_part_cursor_set().
493  *
494  * @param obj The layout object.
495  * @param part_name a part from loaded edje group, that had a cursor set
496  *        with elm_layout_part_cursor_set().
497  *
498  * @ingroup Layout
499  */
500 EAPI void                         elm_layout_part_cursor_unset(Evas_Object *obj, const char *part_name);
501
502 /**
503  * Sets a specific cursor style for an edje part.
504  *
505  * @param obj The layout object.
506  * @param part_name a part from loaded edje group.
507  * @param style the theme style to use (default, transparent, ...)
508  *
509  * @return EINA_TRUE on success or EINA_FALSE on failure, that may be
510  *         part not exists or it did not had a cursor set.
511  *
512  * @ingroup Layout
513  */
514 EAPI Eina_Bool                    elm_layout_part_cursor_style_set(Evas_Object *obj, const char *part_name, const char *style);
515
516 /**
517  * Gets a specific cursor style for an edje part.
518  *
519  * @param obj The layout object.
520  * @param part_name a part from loaded edje group.
521  *
522  * @return the theme style in use, defaults to "default". If the
523  *         object does not have a cursor set, then NULL is returned.
524  *
525  * @ingroup Layout
526  */
527 EAPI const char                  *elm_layout_part_cursor_style_get(const Evas_Object *obj, const char *part_name);
528
529 /**
530  * Sets if the cursor set should be searched on the theme or should use
531  * the provided by the engine, only.
532  *
533  * @note before you set if should look on theme you should define a
534  * cursor with elm_layout_part_cursor_set(). By default it will only
535  * look for cursors provided by the engine.
536  *
537  * @param obj The layout object.
538  * @param part_name a part from loaded edje group.
539  * @param engine_only if cursors should be just provided by the engine (EINA_TRUE)
540  *        or should also search on widget's theme as well (EINA_FALSE)
541  *
542  * @return EINA_TRUE on success or EINA_FALSE on failure, that may be
543  *         part not exists or it did not had a cursor set.
544  *
545  * @ingroup Layout
546  */
547 EAPI Eina_Bool                    elm_layout_part_cursor_engine_only_set(Evas_Object *obj, const char *part_name, Eina_Bool engine_only);
548
549 /**
550  * Gets a specific cursor engine_only for an edje part.
551  *
552  * @param obj The layout object.
553  * @param part_name a part from loaded edje group.
554  *
555  * @return whenever the cursor is just provided by engine or also from theme.
556  *
557  * @ingroup Layout
558  */
559 EAPI Eina_Bool                    elm_layout_part_cursor_engine_only_get(const Evas_Object *obj, const char *part_name);
560
561 /**
562  * @def elm_layout_icon_set
563  * Convenience macro to set the icon object in a layout that follows the
564  * Elementary naming convention for its parts.
565  *
566  * @ingroup Layout
567  */
568 #define elm_layout_icon_set(_ly, _obj)                                 \
569   do {                                                                 \
570        const char *sig;                                                \
571        elm_object_part_content_set((_ly), "elm.swallow.icon", (_obj)); \
572        if ((_obj)) sig = "elm,state,icon,visible";                     \
573        else sig = "elm,state,icon,hidden";                             \
574        elm_object_signal_emit((_ly), sig, "elm");                      \
575     } while (0)
576
577 /**
578  * @def elm_layout_icon_get
579  * Convienience macro to get the icon object from a layout that follows the
580  * Elementary naming convention for its parts.
581  *
582  * @ingroup Layout
583  */
584 #define elm_layout_icon_get(_ly) \
585   elm_object_part_content_get((_ly), "elm.swallow.icon")
586
587 /**
588  * @def elm_layout_end_set
589  * Convienience macro to set the end object in a layout that follows the
590  * Elementary naming convention for its parts.
591  *
592  * @ingroup Layout
593  */
594 #define elm_layout_end_set(_ly, _obj)                                 \
595   do {                                                                \
596        const char *sig;                                               \
597        elm_object_part_content_set((_ly), "elm.swallow.end", (_obj)); \
598        if ((_obj)) sig = "elm,state,end,visible";                     \
599        else sig = "elm,state,end,hidden";                             \
600        elm_object_signal_emit((_ly), sig, "elm");                     \
601     } while (0)
602
603 /**
604  * @def elm_layout_end_get
605  * Convienience macro to get the end object in a layout that follows the
606  * Elementary naming convention for its parts.
607  *
608  * @ingroup Layout
609  */
610 #define elm_layout_end_get(_ly) \
611   elm_object_part_content_get((_ly), "elm.swallow.end")
612
613 /* smart callbacks called:
614  * "theme,changed" - when elm theme is changed.
615  */
616
617 /**
618  * @}
619  */