Опубликован: 22.12.2015 | Уровень: для всех | Доступ: платный
Лекция 43:

Использование чекбоксов

< Лекция 42 || Лекция 43 || Лекция 44 >

Создание чекбокса

Эти элементы управления позволяют нам включать или выключать некие опции. Далее мы поговорим о том, как их использовать в наших приложениях.

Создадим проект CheckSample. Откройте файл исходного кода и внесите изменения и внесите следующие изменения в структуру appdata.

typedef struct appdata {
Evas_Object *win;
Evas_Object *conform;
Evas_Object *label;
Evas_Object *check1;
Evas_Object *check2;
Evas_Object *check3;
Evas_Object *check4;
} appdata_s;

Мы добавили четыре чекбокса. Далее, нам потребуется создать функцию my_box_pack выше create_base_gui() и добавить элементы управления в контейнер Box .

static void
my_box_pack(Evas_Object *box, Evas_Object *child,
double h_weight, double v_weight, double h_align, double v_align)
{
/* create a frame we shall use as padding around the child widget */
Evas_Object *frame = elm_frame_add(box);
/* use the medium padding style. there is "pad_small", "pad_medium",
* "pad_large" and "pad_huge" available as styles in addition to the
* "default" frame style */
elm_object_style_set(frame, "pad_medium");
/* set the input weight/aling on the frame insted of the child */
evas_object_size_hint_weight_set(frame, h_weight, v_weight);
evas_object_size_hint_align_set(frame, h_align, v_align);
{
/* tell the child that is packed into the frame to be able to expand */
evas_object_size_hint_weight_set(child, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
/* fill the expanded area (above) as opposaed to center in it */
evas_object_size_hint_align_set(child, EVAS_HINT_FILL, EVAS_HINT_FILL);
/* actually put the child in the frame and show it */
evas_object_show(child);
elm_object_content_set(frame, child);
}
/* put the frame into the box instead of the child directly */
elm_box_pack_end(box, frame);
/* show the frame */
evas_object_show(frame);
}

Переходим в функцию create_base_gui() и добавляем новый код.

/* Conformant */
ad->conform = elm_conformant_add(ad->win);
elm_win_indicator_mode_set(ad->win, ELM_WIN_INDICATOR_SHOW);
elm_win_indicator_opacity_set(ad->win, ELM_WIN_INDICATOR_OPAQUE);
evas_object_size_hint_weight_set(ad->conform, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
elm_win_resize_object_add(ad->win, ad->conform);
evas_object_show(ad->conform);
{
/* child object - indent to how relationship */
/* A box to put things in verticallly - default mode for box */
Evas_Object *box = elm_box_add(ad->win);
evas_object_size_hint_weight_set(box, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
elm_object_content_set(ad->conform, box);
evas_object_show(box);
{
/* Label*/
ad->label = elm_label_add(ad->conform);
elm_object_text_set(ad->label, "<align=center>Using a checkbox</align>");
my_box_pack(box, ad->label, 1.0, 0.0, -1.0, 0.5);
/* check 1 */
ad->check1 = elm_check_add(ad->conform);
elm_object_style_set(ad->check1,"popup");
elm_object_text_set(ad->check1, "Editable");
my_box_pack(box, ad->check1, 1.0, 1.0, -1.0, -1.0);
}
}
/* Show window after base gui is set up */
evas_object_show(ad->win);

Мы создали контейнер Box и контрол Check, также мы добавили к контейнеру Box метку

elm_check_add(Evas_Object *parent) - это API, который создает контрол Check.

elm_object_text_set(obj, text) - это API, который добавляет текст в контрол.

Запустите пример.


Изменение символов в контроле Check

Для изменения символов нам потребуется поработать со стилями. Добавьте новый код в функцию create_base_gui().

/* check 1 */
ad->check1 = elm_check_add(ad->conform);
elm_object_style_set(ad->check1,"popup");
elm_object_text_set(ad->check1, "Editable");
my_box_pack(box, ad->check1, 1.0, 1.0, -1.0, -1.0);

/* check 2 */
ad->check2 = elm_check_add(ad->conform);
elm_object_style_set(ad->check2, "favorite");
elm_object_text_set(ad->check2, "Favorite");
elm_check_state_set(ad->check2, EINA_TRUE);
my_box_pack(box, ad->check2, 1.0, 1.0, -1.0, -1.0);

/* check 3 */
ad->check3 = elm_check_add(ad->conform);
elm_object_style_set(ad->check3, "on&off");
elm_object_text_set(ad->check3, "On / Off");
elm_check_state_set(ad->check3, EINA_FALSE);
my_box_pack(box, ad->check3, 1.0, 1.0, -1.0, -1.0);
}

Мы добавили второй и третий чекбоксы.

elm_object_style_set(Evas_Object *obj, const char *style) - это API, который определяет стили этого контрола. Запустите пример.


Запрос события On/Off в элементе управления Check

Для вызова событий нам потребуется добавить несколько строк в функцию create_base_gui().

/* check 1 */
ad->check1 = elm_check_add(ad->conform);
elm_object_style_set(ad->check1,"popup");
elm_object_text_set(ad->check1, "Editable");
evas_object_smart_callback_add(ad->check1, "changed", check_changed_cb, ad);
my_box_pack(box, ad->check1, 1.0, 1.0, -1.0, -1.0);
/* check 2 */
ad->check2 = elm_check_add(ad->conform);
elm_object_style_set(ad->check2, "favorite");
elm_object_text_set(ad->check2, "Favorite");
elm_check_state_set(ad->check2, EINA_TRUE);
evas_object_smart_callback_add(ad->check2, "changed", check_changed_cb, ad);
my_box_pack(box, ad->check2, 1.0, 1.0, -1.0, -1.0);
/* check 3 */
ad->check3 = elm_check_add(ad->conform);
elm_object_style_set(ad->check3, "on&off");
elm_object_text_set(ad->check3, "On / Off");
elm_check_state_set(ad->check3, EINA_FALSE);
evas_object_smart_callback_add(ad->check3, "changed", check_changed_cb, ad);
my_box_pack(box, ad->check3, 1.0, 1.0, -1.0, -1.0);

evas_object_smart_callback_add(Evas_Object *obj, char *event, Evas_Smart_Cb func, void *data) - это API, который определяет функцию вызова для смарт-объектов. Указание 'changed' в качестве второго параметра позволяет функции быть вызванной при изменении состояния в элементе управления.

Добавьте новую функцию перед функцией create_base_gui().

static void
check_changed_cb(void *data, Evas_Object *obj, void *event_info)
{
appdata_s *ad = data;
int check_num = 0;
if( obj == ad->check1 )
check_num = 1;
else if( obj == ad->check2 )
check_num = 2;
else if( obj == ad->check3 )
check_num = 3;
else
return;
Eina_Bool state = elm_check_state_get(obj);
char buf[64];
sprintf(buf, "Check-%d is %s", check_num, state ? "checked" : "unchecked");
elm_object_text_set(ad->label, buf);
}

elm_check_state_get(const Elm_Check *obj) это API, возвращающий состояние On/Off контрола Check. Эта функция играет противоположную роль функции elm_check_state_set().

Запустите пример.


< Лекция 42 || Лекция 43 || Лекция 44 >