Diskselector - Items management

This code places an Elementary diskselector widgets on a window, along with some buttons trigerring actions on it (though its API).

It covers most of diskselector item functions.

On our main function, we are adding a default diskselector with 3 items. We are only setting their labels (second parameter of function elm_diskselector_item_append):

evas_object_size_hint_weight_set(ds, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
evas_object_size_hint_align_set(ds, EVAS_HINT_FILL, EVAS_HINT_FILL);
evas_object_smart_callback_add(ds, "selected", _ds_selected_cb, NULL);
elm_box_pack_end(bx, ds);
evas_object_show(ds);
elm_diskselector_item_append(ds, "Item 0", NULL, NULL, NULL);
elm_diskselector_item_append(ds, "Item 1", NULL, NULL, NULL);
elm_diskselector_item_append(ds, "Item 2", NULL, NULL, NULL);

Next we are adding lots of buttons, each one for a callback function that will realize a task covering part of diskselector items API. Lets check the first one:

bt = elm_button_add(win);
elm_object_text_set(bt, "Append item");
evas_object_smart_callback_add(bt, "clicked", _add_cb, ds);
elm_box_pack_end(hbx, bt);
evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL);
evas_object_show(bt);

We are labeling the button with a task description with elm_object_text_set() and setting a callback function evas_object_smart_callback_add(). Each callback function will have the signature: static void _task_cb(void *data, Evas_Object *obj, void *event_info) with the function name varying for each task.

Now let's cover all of them.

Appending an item:

_add_cb(void *data, Evas_Object *obj, void *event_info)
{
Evas_Object *ds = data;
char label[32];
snprintf(label, sizeof(label), "Item %i", counter++);
ds_it = elm_diskselector_item_append(ds, label, NULL, NULL, NULL);
if (!ds_it) printf("Error adding item\n");
}

All items are included on diskselector after last one. You can't prepend items.

The first parameter of elm_diskselector_item_append() is the diskselector object, that we are receiving as data on our callback function. The second one is a label, the string that will be placed in the center of our item. As we don't wan't icons or callback functions, we can send NULL as third, fourth and fifth parameters.

Appending an item with icon:

_add_ic_cb(void *data, Evas_Object *obj, void *event_info)
{
Evas_Object *ic, *ds = data;
char label[32];
snprintf(label, sizeof(label), "Item %i", counter++);
ic = elm_icon_add(ds);
elm_icon_standard_set(ic, "home");
ds_it = elm_diskselector_item_append(ds, label, ic, NULL, NULL);
if (!ds_it) printf("Error adding item with icon\n");
}

If an icon is required, you can pass it as third parameter on our elm_diskselector_item_append() function. It will be place on the left side of item's label, that will be shifted to right a bit.

For more details about how to create icons, look for elm_icon examples.

Appending an item with callback function for selected:

_sel_cb(void *data, Evas_Object *obj, void *event_info)
{
Elm_Object_Item *ds_it = event_info;
printf("Selected label: %s\n", elm_object_item_text_get(ds_it));
}
static void
_add_func_cb(void *data, Evas_Object *obj, void *event_info)
{
Evas_Object *ds = data;
char label[32];
snprintf(label, sizeof(label), "Item %i", counter++);
ds_it = elm_diskselector_item_append(ds, label, NULL, _sel_cb, NULL);
if (!ds_it) printf("Error adding item\n");
}

To set a callback function that will be called every time an item is selected, i.e., everytime the diskselector stops with this item in center position, just pass the function as fourth parameter.

Appending an item with callback function for selected with data:

_sel_data_cb(void *data, Evas_Object *obj, void *event_info)
{
char *content = data;
Elm_Object_Item *ds_it = event_info;
printf("Selected label: %s with data: %s\n",
elm_object_item_text_get(ds_it), content);
}
static void
_free_data(void *data, Evas_Object *obj, void *event_info)
{
free(data);
}
static void
_add_data_cb(void *data, Evas_Object *obj, void *event_info)
{
Evas_Object *ds = data;
char label[32];
char *content = malloc(sizeof(char) * 32);
snprintf(content, 32, "Item content %i", counter);
snprintf(label, sizeof(label), "Item %i", counter++);
ds_it = elm_diskselector_item_append(ds, label, NULL, _sel_data_cb, content);
if (!ds_it)
{
printf("Error adding item\n");
return;
}
elm_object_item_del_cb_set(ds_it, _free_data);
}

If the callback function request an extra data, it can be attached to our item passing a pointer for data as fifth parameter. Our function _sel_data_cb will receive it as void *data .

If you want to free this data, or handle that the way you need when the item is deleted, set a callback function for that, with elm_object_item_del_cb_set().

As you can see we check if it is not NULL after appending it. If an error happens, we won't try to set a function for it.

Deleting an item:

_del_cb(void *data, Evas_Object *obj, void *event_info)
{
Elm_Object_Item *selected_ds_it;
Evas_Object *ds = data;
selected_ds_it = elm_diskselector_selected_item_get(ds);
elm_object_item_del(selected_ds_it);
}

To delete an item we simple need to call elm_object_item_del() with a pointer for such item.

If you need, you can get selected item with elm_diskselector_selected_item_get(), that will return a pointer for it.

Unselecting an item:

_unselect_cb(void *data, Evas_Object *obj, void *event_info)
{
Elm_Object_Item *selected_ds_it;
Evas_Object *ds = data;
selected_ds_it = elm_diskselector_selected_item_get(ds);
elm_diskselector_item_selected_set(selected_ds_it, EINA_FALSE);
}

To select an item, you should call elm_diskselector_item_selected_set() passing EINA_TRUE, and to unselect it, EINA_FALSE.

If you unselect the selected item, diskselector will automatically select the first item.

Printing all items:

_print_cb(void *data, Evas_Object *obj, void *event_info)
{
const Eina_List *l, *items;
Evas_Object *ds = data;
items = elm_diskselector_items_get(ds);
EINA_LIST_FOREACH(items, l, ds_it)
printf("%s\n", elm_object_item_text_get(ds_it));
}

Clearing the diskselector:

_clear_cb(void *data, Evas_Object *obj, void *event_info)
{
Evas_Object *ds = data;
elm_diskselector_clear(ds);
}

Selecting the first item:

_select_first_cb(void *data, Evas_Object *obj, void *event_info)
{
Elm_Object_Item *first_ds_it;
Evas_Object *ds = data;
first_ds_it = elm_diskselector_first_item_get(ds);
if (first_ds_it)
elm_diskselector_item_selected_set(first_ds_it, EINA_TRUE);
}

Selecting the last item:

_select_last_cb(void *data, Evas_Object *obj, void *event_info)
{
Elm_Object_Item *last_ds_it;
Evas_Object *ds = data;
last_ds_it = elm_diskselector_last_item_get(ds);
if (last_ds_it)
elm_diskselector_item_selected_set(last_ds_it, EINA_TRUE);
}

Selecting the next item:

_select_next_cb(void *data, Evas_Object *obj, void *event_info)
{
Elm_Object_Item *selected_ds_it, *next_ds_it;
Evas_Object *ds = data;
selected_ds_it = elm_diskselector_selected_item_get(ds);
if (!selected_ds_it) return;
next_ds_it = elm_diskselector_item_next_get(selected_ds_it);
if (next_ds_it)
elm_diskselector_item_selected_set(next_ds_it, EINA_TRUE);
}

Selecting the previous item:

_select_prev_cb(void *data, Evas_Object *obj, void *event_info)
{
Elm_Object_Item *selected_ds_it, *prev_ds_it;
Evas_Object *ds = data;
selected_ds_it = elm_diskselector_selected_item_get(ds);
if (!selected_ds_it) return;
prev_ds_it = elm_diskselector_item_prev_get(selected_ds_it);
if (prev_ds_it)
elm_diskselector_item_selected_set(prev_ds_it, EINA_TRUE);
}

See the full diskselector_example_02.c code, whose window should look like this picture:

diskselector_example_02.png