Tizen Native API  8.0
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);
   elm_win_resize_object_add(win, layout);
   snprintf(buf, sizeof(buf), "%s/examples/layout_example.edj", elm_app_data_dir_get());
   elm_layout_file_set(layout, buf, "example/mylayout3");
   evas_object_show(layout);

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;

   elm_layout_sizing_eval(layout);
   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.