Использование предпочтений (Preference)
Сохранение строковых данных в предпочтении
Очень удобно иметь возможность сохранения настроек приложения в реестре. Предпочтения (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. Данные, сохраненные в предпочтениях будут отображаться снова.