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);
evas_object_size_hint_weight_set(layout, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
snprintf(buf, sizeof(buf), "%s/examples/layout_example.edj", elm_app_data_dir_get());
elm_layout_file_set(layout, buf, "example/mylayout3");

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);

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!");
evas_object_size_hint_weight_set(btn, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
evas_object_size_hint_align_set(btn, EVAS_HINT_FILL, EVAS_HINT_FILL);
elm_object_part_content_set(layout, SWALLOW, btn);
evas_object_smart_callback_add(btn, "clicked", _swallow_btn_cb, layout);

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!");
}
}

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);
edje_object_size_min_calc(edje, &w, &h);
printf("Minimum size for this theme: %dx%d\n", w, h);
}

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:

elm_object_part_text_set
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:1512
elm_win_title_set
void elm_win_title_set(Evas_Object *obj, const char *title)
Set the title of the window.
Definition: efl_ui_win.c:8549
elm_app_data_dir_get
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
EINA_UNUSED
#define EINA_UNUSED
Definition: eina_types.h:321
EINA_FALSE
#define EINA_FALSE
Definition: eina_types.h:502
elm_button_add
EAPI Evas_Object * elm_button_add(Evas_Object *parent)
Add a new button to the parent's canvas.
Definition: efl_ui_button.c:477
EVAS_HINT_EXPAND
#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:292
evas_object_smart_callback_add
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:980
Evas_Object
Efl_Canvas_Object Evas_Object
Definition: Evas_Common.h:180
elm_object_part_content_set
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:1589
elm_layout_file_set
EAPI 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:2996
evas_object_show
void evas_object_show(Evas_Object *eo_obj)
Makes the given Evas object visible.
Definition: evas_object_main.c:1853
EVAS_HINT_FILL
#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:293
EINA_TRUE
#define EINA_TRUE
Definition: eina_types.h:508
elm_object_signal_callback_add
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:1890
elm_layout_edje_get
EAPI Evas_Object * elm_layout_edje_get(const Eo *obj)
Get the edje layout.
Definition: efl_ui_layout.c:1866
Eina_Bool
unsigned char Eina_Bool
Definition: eina_types.h:496
elm_layout_add
EAPI Evas_Object * elm_layout_add(Evas_Object *parent)
Add a new layout to the parent.
Definition: efl_ui_layout.c:2989
elm_layout_sizing_eval
void elm_layout_sizing_eval(Evas_Object *obj)
Eval sizing.
elm_win_resize_object_add
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:8900
Evas_Coord
int Evas_Coord
Type used for coordinates (in pixels, int).
Definition: Evas_Common.h:111
elm_object_signal_emit
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:1881
elm_layout_data_get
const EAPI 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:3296