Layout - Signals and Size Changed

This example shows how one can send and receive signals to/from the layout, and what to do when the layout theme has its size changed.

The full source code for this example can be found at layout_example_03.c.

In this example we will use another group from the same layout theme file used in Layout - Content, Table and Box. Its instantiation and loading happens in the following lines:

layout = elm_layout_add(win);
snprintf(buf, sizeof(buf), "%s/examples/layout_example.edj", elm_app_data_dir_get());
elm_layout_file_set(layout, buf, "example/mylayout3");
#define EVAS_HINT_EXPAND
Use with evas_object_size_hint_weight_set(), evas_object_size_hint_weight_get(), evas_object_size_hin...
Definition: Evas_Common.h:297
const char * elm_app_data_dir_get(void)
Get the application's run time data prefix directory, as set by elm_app_info_set() and the way (envir...
Definition: elm_main.c:586
Evas_Object * elm_layout_add(Evas_Object *parent)
Add a new layout to the parent.
Definition: efl_ui_layout.c:3067
Eina_Bool elm_layout_file_set(Eo *obj, const char *file, const char *group)
Set the file that will be used as layout.
Definition: efl_ui_layout.c:3074
void elm_win_resize_object_add(Eo *obj, Evas_Object *subobj)
Add subobj as a resize object of window obj.
Definition: efl_ui_win.c:8997
EVAS_API void evas_object_show(Evas_Object *eo_obj)
Makes the given Evas object visible.
Definition: evas_object_main.c:1814
EVAS_API void evas_object_size_hint_weight_set(Evas_Object *obj, double x, double y)
Sets the hints for an object's weight.
Definition: evas_object_main.c:2638

This time we register a callback to be called whenever we receive a signal after the end of the animation that happens in this layout:

elm_object_signal_callback_add(layout, "size,changed", "", _size_changed_cb, layout);
void elm_object_signal_callback_add(Evas_Object *obj, const char *emission, const char *source, Edje_Signal_Cb func, void *data)
Add a callback for a signal emitted by widget edje object.
Definition: elm_main.c:1863

We also add a button that will send signals to the layout:

// Setting title
const char *title = elm_layout_data_get(layout, "title");
if (title)
{
elm_win_title_set(win, title);
elm_object_part_text_set(layout, TITLE, title);
}
btn = elm_button_add(win);
elm_object_text_set(btn, "Enlarge me!");
elm_object_part_content_set(layout, SWALLOW, btn);
evas_object_smart_callback_add(btn, "clicked", _swallow_btn_cb, layout);
#define EVAS_HINT_FILL
Use with evas_object_size_hint_align_set(), evas_object_size_hint_align_get(), evas_object_size_hint_...
Definition: Evas_Common.h:298
Evas_Object * elm_button_add(Evas_Object *parent)
Add a new button to the parent's canvas.
Definition: efl_ui_button.c:459
void elm_object_part_content_set(Evas_Object *obj, const char *part, Evas_Object *content)
Set the content on part of a given container widget.
Definition: elm_main.c:1562
void elm_object_part_text_set(Evas_Object *obj, const char *part, const char *label)
Set a text of an object.
Definition: elm_main.c:1485
const char * elm_layout_data_get(const Evas_Object *obj, const char *key)
Get the edje data from the given layout.
Definition: efl_ui_layout.c:3394
void elm_win_title_set(Evas_Object *obj, const char *title)
Set the title of the window.
Definition: efl_ui_win.c:8641
EVAS_API void evas_object_size_hint_align_set(Evas_Object *obj, double x, double y)
Sets the hints for an object's alignment.
Definition: evas_object_main.c:2650
EVAS_API void evas_object_smart_callback_add(Evas_Object *eo_obj, const char *event, Evas_Smart_Cb func, const void *data)
Add (register) a callback function to the smart event specified by event on the smart object obj.
Definition: evas_object_smart.c:1040

The callback for this button will check what type of signal it should send, and then emit it. The code for this callback follows:

static Eina_Bool _btn_large = EINA_FALSE;
static void
_swallow_btn_cb(void *data, Evas_Object *btn, void *event_info EINA_UNUSED)
{
Evas_Object *layout = data;
if (_btn_large == EINA_FALSE)
{
_btn_large = EINA_TRUE;
elm_object_signal_emit(layout, "button,enlarge", "");
elm_object_text_set(btn, "Reduce me!");
}
else
{
_btn_large = EINA_FALSE;
elm_object_signal_emit(layout, "button,reduce", "");
elm_object_text_set(btn, "Enlarge me!");
#define EINA_TRUE
boolean value TRUE (numerical value 1)
Definition: eina_types.h:539
#define EINA_FALSE
boolean value FALSE (numerical value 0)
Definition: eina_types.h:533
unsigned char Eina_Bool
Type to mimic a boolean.
Definition: eina_types.h:527
#define EINA_UNUSED
Used to indicate that a function parameter is purposely unused.
Definition: eina_types.h:339
void elm_object_signal_emit(Evas_Object *obj, const char *emission, const char *source)
Send a signal to the widget edje object.
Definition: elm_main.c:1854
Efl_Canvas_Object Evas_Object
An Evas Object handle.
Definition: Evas_Common.h:185
}
}

As we said before, we are receiving a signal whenever the animation started by the button click ends. This is the callback for that signal:

static void
_size_changed_cb(void *data EINA_UNUSED, Evas_Object *layout, const char *emission EINA_UNUSED, const char *source EINA_UNUSED)
{
Evas_Object *edje;
Evas_Coord w, h;
edje = elm_layout_edje_get(layout);
printf("Minimum size for this theme: %dx%d\n", w, h);
}
int Evas_Coord
Type used for coordinates (in pixels, int).
Definition: Evas_Common.h:116
void edje_object_size_min_calc(Edje_Object *obj, int *minw, int *minh)
Calculates the minimum required size for a given Edje object.
Definition: edje_legacy.c:1059
Evas_Object * elm_layout_edje_get(const Eo *obj)
Get the edje layout.
Definition: efl_ui_layout.c:1883
void elm_layout_sizing_eval(Evas_Object *obj)
Eval sizing.

Notice from this callback that the elm_layout_sizing_eval() function must be called if we want our widget to update its size after the layout theme having changed its minimum size. This happens because the animation specified in the theme increases the size of the content area to a value higher than the widget size, thus requiring more space. But the elementary layout widget has no way to know this, thus needing the elm_layout_sizing_eval() to be called on the layout, informing that this size has changed.

A screenshot of this example can be seen on: