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

Использование предпочтений (Preference)

< Лекция 32 || Лекция 33 || Лекция 34 >

Сохранение строковых данных в предпочтении

Очень удобно иметь возможность сохранения настроек приложения в реестре. Предпочтения (Preference) — это хранилище, в котором можно хранить данные локально. При удалении приложения предпочтения также удаляются.

Создайте новый проект 'PreferenceEx.' Далее, внесите следующие изменения в файл исходного кода.

#include "preferenceex.h"
#include <app_preference.h>
#include <stdlib.h>

typedef struct appdata {
Evas_Object *win;
Evas_Object *conform;
Evas_Object *entry1;
Evas_Object *spinner1;
} appdata_s;

const char *string_key = "string_key";
const char *integer_key = "integer_key";

app_preference.h — это заголовочный файл библиотеки, использующей предпочтения.

stdlib.h — это заголовочный файл библиотеки, предназначенной для изменения типов строк и чисел.

Мы собираемся вводить строковые данные в поле ввода entry1, а числовые данные — в spinner1. Теперь нам потребуется добавить некоторые элементы управления. Добавьте две функции выше create_base_gui().

static void
my_table_pack(Evas_Object *table, Evas_Object *child, int x, int y, int w, int h)
{
evas_object_size_hint_align_set(child, EVAS_HINT_FILL, EVAS_HINT_FILL);
evas_object_size_hint_weight_set(child, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
elm_table_pack(table, child, x, y, w, h);
evas_object_show(child);
}
static Evas_Object *
my_button_add(Evas_Object *parent, const char *text, Evas_Smart_Cb cb, void *cb_data)
{
Evas_Object *btn;
btn = elm_button_add(parent);
elm_object_text_set(btn, text);
evas_object_smart_callback_add(btn, "clicked", cb, cb_data);
return btn;
}

my_table_pack() - это функция, добавляющая контрол Table.

my_button_add() - это функция, добавляющая кнопку. Добавьте код в функцию 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);
{
/* Box to put the table in so we can bottom-align the table
* window will stretch all resize object content to win size */
Evas_Object *box = elm_box_add(ad->conform);
evas_object_size_hint_weight_set(box, EVAS_HINT_EXPAND, 0.0);
elm_object_content_set(ad->conform, box);
evas_object_show(box);
/* Table */
Evas_Object *table = elm_table_add(ad->conform);
/* Make table homogenous - every cell will be the same size */
elm_table_homogeneous_set(table, EINA_TRUE);
/* Set padding of 10 pixels multiplied by scale factor of UI */
elm_table_padding_set(table, 10 * elm_config_scale_get(), 30 * elm_config_scale_get());
/* Let the table child allocation area expand within in the box */
evas_object_size_hint_weight_set(table, EVAS_HINT_EXPAND, 0.0);
/* Set table to fiill width but align to bottom of box */
evas_object_size_hint_align_set(table, EVAS_HINT_FILL, 0.0);
elm_box_pack_end(box, table);
evas_object_show(table);
{
/* Label-1 */
Evas_Object *label = elm_label_add(ad->conform);
elm_object_text_set(label, "Pet name:");
my_table_pack(table, label, 0, 0, 1, 1);
/* Bg-1 */
Evas_Object *bg = elm_bg_add(ad->conform);
elm_bg_color_set(bg, 210, 210, 210);
my_table_pack(table, bg, 1, 0, 1, 1);
/* Entry-1 */
ad->entry1 = elm_entry_add(ad->conform);
my_table_pack(table, ad->entry1, 1, 0, 1, 1);
/* Label-2 */
label = elm_label_add(ad->conform);
elm_object_text_set(label, "Percentage:");
my_table_pack(table, label, 0, 1, 1, 1);
/* Spinner-1 */
ad->spinner1 = elm_spinner_add(ad->conform);
elm_spinner_editable_set(ad->spinner1, EINA_TRUE);
elm_spinner_interval_set(ad->spinner1, 1);
elm_spinner_min_max_set(ad->spinner1, 0, 100);
elm_spinner_label_format_set(ad->spinner1, "%.0f");
my_table_pack(table, ad->spinner1, 1, 1, 1, 1);
Evas_Object *btn;
/* Button-Save */
btn = my_button_add(ad->conform, "Save", btn_save_cb, ad);
my_table_pack(table, btn, 0, 3, 2, 1);
}
}
/* Show window after base gui is set up */
evas_object_show(ad->win);
}

Мы добавили один элемент управления Box, один Table, два Label, один Bg, один Entry, один Spinner, и один Button. Добавьте обработчик нажатия кнопки выше функции create_base_gui().

static void
btn_save_cb(void *data, Evas_Object *obj, void *event_info)
{
appdata_s *ad = data;
const char *string_value;
int integer_value;
string_value = elm_object_text_get(ad->entry1);
preference_set_string(string_key, string_value);
}

preference_set_string(char *, char *) - это API, который сохраняет строковые данные в предпочтениях. Передайте ключ первому параметру, а строковые данные второму параметру. Ключ должен быть таким же, что и при выполнения чтения и записи. Запустите пример. Введите строку в первый элемент управления Entry, и нажмите на кнопку Save. Строка будет сохранена. К сожалению, мы пока не реализовали возможность считывания.


Чтение строковых предпочтений

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

Evas_Object *btn;

/* Button-Load */
btn = my_button_add(ad->conform, "Load", btn_read_cb, ad);
my_table_pack(table, btn, 0, 2, 2, 1);

/* Button-Save */
btn = my_button_add(ad->conform, "Save", btn_save_cb, ad);
my_table_pack(table, btn, 0, 3, 2, 1);
}
}

Добавим обработчик нажатия кнопки. Добавьте код выше функции create_base_gui().

static void
btn_read_cb(void *data, Evas_Object *obj, void *event_info)
{
appdata_s *ad = data;
char *string_value = "";
bool existing = false;
if ((preference_is_existing(string_key, &existing) == 0) && existing)
{
preference_get_string(string_key, &string_value);
elm_object_text_set(ad->entry1, string_value);
free(string_value);
}
}

При чтении данных из предпочтений в начале нам необходимо убедиться в том, что данные там существуют.

preference_is_existing(const char *, bool *) - это API, который определяет есть ли определенные данные в предпочтения. Передавая ключ первому параметру, мы заставляем второй параметр возвращать информацию о том, присутствуют ли данные.

preference_get_string(char *, char **) - это API, который считывает строковые данные из предпочтений. Передавая ключ первому параметру, мы заставляем второй параметр возвращать строковые данные.

Запустите пример снова. Введите строку в Entry и нажмите кнопку Save. Затем удалите символы, введенные в Entry, и нажмите кнопку Read. Только что введенная строка будет отображаться в Entry.


Чтение и запись чисел в предпочтениях

Теперь мы будем сохранять и считывать числа в предпочтения. Добавьте код для функции сохранения.

static void
btn_save_cb(void *data, Evas_Object *obj, void *event_info)
{
appdata_s *ad = data;
const char *string_value;

int integer_value;

string_value = elm_object_text_get(ad->entry1);
preference_set_string(string_key, string_value);

integer_value = (int) elm_spinner_value_get(ad->spinner1);
preference_set_int(integer_key, integer_value);
}

atoi(char *), являющийся акронимом выражения Array to Int, является API, который преобразует строки в числа.

preference_set_int(char *, int) - это API, который сохраняет целочисленные данные в предпочтениях Добавим код функции, предназначенной для чтения данных.

static void
btn_read_cb(void *data, Evas_Object *obj, void *event_info)
{
appdata_s *ad = data;
char *string_value = "";

int integer_value;

bool existing = false;
if ((preference_is_existing(string_key, &existing) == 0) && existing)
{
preference_get_string(string_key, &string_value);
elm_object_text_set(ad->entry1, string_value);
free(string_value);
}
if ((preference_is_existing(integer_key, &existing) == 0) && existing)
{
preference_get_int(integer_key, &integer_value);
elm_spinner_value_set(ad->spinner1, (double) integer_value);
}

}

preference_get_int(char *, int *) - это API, который считывает целочисленные данные из предпочтений.

eina_convert_itoa(int, char *) - это API, который превращает числа в строки.

Запустите пример снова. Введите строку в первый Entry и введите число во второй. Затем нажмите кнопку Save. Если вы изменили введенные данные, запустите его снова и нажмите кнопку Read. Данные, сохраненные в предпочтениях будут отображаться снова.


< Лекция 32 || Лекция 33 || Лекция 34 >
Тимур Имашев
Тимур Имашев
Россия, Кемерово, КемГИК
Александр Бураков
Александр Бураков
Россия, г.Тюмень, Тюменская область