Prefs Example 02

This example shows how to create a simple prefs widget with Elementary, where some items properties are changed on each timer tick.

We'll create items on the .EPC file and after handle it on the .C file.

Creating items on EPC file

First we'll create prefs items on .EPC file that we'll use later on the .C file. Note that the code is similar to .EDC (edje) files.

collection
{
page
{
name: "main";
version: 1;
title: "Preferences Widget";
subtitle: "Example 02";
widget: "elm/vertical_frame";

In this part, we create a TEXTAREA item and, by default, it will become a multi-line text entry in the UI. Note that we use a regular expression to accept only characters and whitespaces in it.

items {
item {
name: "text";
type: TEXTAREA;
editable: 1;
textarea {
placeholder: "This is a editable text entry";
default: "This is DEFAULT!";
accept: "^[a-zA-Z ]*$";
}
}

Now we create a FLOAT type item, by default will become a spinner in UI, and default, min and max parameters are optional as well as in INT type.

item {
name: "floatsp";
type: FLOAT;
editable: 1;
label: "Floating...";
float {
default: 0.7;
min: 0;
max: 1;
}
}

Here we create a BOOL type item, by default will become a checkbox in UI.

item {
name: "checkb";
type: BOOL;
label: "Checkbox";
bool {
default: true;
}
}

Here we create two items, separator and save types, that we've already covered in Prefs Example 01

item {
name: "sep";
type: SEPARATOR;
}
item {
name: "save";
type: SAVE;
label: "Save";
}

In this part, we create a ACTION type item. when clicked, the action item will emit a signal to .C file and call a smart callback.

item {
name: "action";
type: ACTION;
label: "Action!";
}
}
}
}

Handling items on C File

Now we're handling the .C file and first we'll create a prefs widget.

prefs = elm_prefs_add(win);
evas_object_size_hint_weight_set(prefs, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
evas_object_show(prefs);

In this part we add the action smart callback, that will be called when the action item be clicked.

evas_object_smart_callback_add(prefs, "action", _action_cb, notify);

Here we add a simple action item callback that sets a text to another item.

_action_cb(void *data, Evas_Object *obj, void *event_info)
{
Evas_Object *notify = data;
Elm_Prefs_Data *prefs_data;
Eina_Value value;
prefs_data = evas_object_data_get(notify, "prefs_data");
if (elm_prefs_data_value_get(prefs_data, "main:text", &type, &value))
{
eina_value_set(&value, "Action!");
elm_prefs_data_value_set(prefs_data, "main:text", type, &value);
}

Now we set the prefs to save its values back (on the user data file) automatically on every UI element changes.

elm_prefs_autosave_set(prefs, EINA_TRUE);

In this part we create the prefs data handle and set the .EPB file (.EPC compiled).

Elm_Prefs_Data *prefs_data;

prefs_data = elm_prefs_data_new("./prefs_example_02.cfg", NULL,
EET_FILE_MODE_READ_WRITE);
elm_prefs_file_set(prefs, "prefs_example_02.epb", NULL);
elm_prefs_data_set(prefs, prefs_data);

Here we just create a notify widget to appear when the items properties are changed.

label = elm_label_add(win);
elm_object_text_set(label, "Editable, Visible and Disable! Just Saying...");
evas_object_size_hint_weight_set(label, 0.0, 0.0);
evas_object_size_hint_align_set(label, 0.5, 0.5);
notify = elm_notify_add(win);
elm_notify_align_set(notify, 0.5, 1);
elm_object_content_set(notify, label);
evas_object_size_hint_weight_set(notify, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
evas_object_show(notify);

Now we add a timer to change text editable, spinners visibility and checkbox enable/disable properties on each 5.0 seconds and show the notify.

evas_object_data_set(notify, "prefs", prefs);
evas_object_data_set(notify, "prefs_data", prefs_data);
evas_object_smart_callback_add(prefs, "action", _action_cb, notify);
evas_object_resize(win, 320, 320);
evas_object_show(win);
ecore_timer_add(5.0, _elm_prefs_items_change, notify);

_elm_prefs_items_change(void *data)
{
Evas_Object *prefs, *notify = data;
Elm_Prefs_Data *prefs_data;
Eina_Value value;
prefs = evas_object_data_get(notify, "prefs");
prefs_data = evas_object_data_get(notify, "prefs_data");
visible = !visible;
elm_prefs_item_visible_set(prefs, "main:floatsp", visible);
disabled = !disabled;
elm_prefs_item_disabled_set(prefs, "main:checkb", disabled);
editable = !editable;
elm_prefs_item_editable_set(prefs, "main:text", editable);
if (elm_prefs_data_value_get(prefs_data, "main:text", &type, &value))
{
eina_value_set(&value, editable ? "This is a editable text entry" :
"This is a non-editable text entry");
elm_prefs_data_value_set(prefs_data, "main:text", type, &value);
}
evas_object_show(notify);
return ECORE_CALLBACK_RENEW;
}

Here we finish the example. The full source code can be found on prefs_example_02.c and prefs_example_02.epc