summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorOlliver Schinagl <o.schinagl@ultimaker.com>2015-04-22 11:28:26 (GMT)
committerOlliver Schinagl <o.schinagl@ultimaker.com>2015-04-28 05:07:15 (GMT)
commit5e7491cf7ec9ae1eaca7160b44c07d8a9a70da37 (patch)
tree81175e9bbaec4ba84ab3cc14fb8455181ba6ba2e /src
parent5b3a86c1d8eebb56e9d376dc402ba3a3f2a45a4a (diff)
downloadeulogium-5e7491cf7ec9ae1eaca7160b44c07d8a9a70da37.zip
eulogium-5e7491cf7ec9ae1eaca7160b44c07d8a9a70da37.tar.gz
eulogium-5e7491cf7ec9ae1eaca7160b44c07d8a9a70da37.tar.bz2
Create own 'elm_button_list'
Elm has a list, but those buttons aren't really intended to be interacted/focused with. To compensate for this, we create our own elm_button_list. Since this likely not going upstream, it's prefixed as eulogium_button_list rather then elm_button_list. Signed-off-by: Olliver Schinagl <o.schinagl@ultimaker.com>
Diffstat (limited to 'src')
-rw-r--r--src/eulogium.c156
1 files changed, 104 insertions, 52 deletions
diff --git a/src/eulogium.c b/src/eulogium.c
index 19e0e5d..ed5524f 100644
--- a/src/eulogium.c
+++ b/src/eulogium.c
@@ -17,6 +17,88 @@
#define COPYRIGHT "Copyright © 2015 Olliver Schinagl <o.schinagl@ultimaker.com> and various contributors (see AUTHORS)."
+Evas_Object *eulogium_button_list_add(Evas_Object *parent)
+{
+ Evas_Object *list, *box;
+ Eina_List *l = NULL;
+
+ /* Wrap scroller widget around the box when we can disable mousewheel/use Z-axis directly */
+ list = elm_scroller_add(parent);
+ box = elm_box_add(list);
+ evas_object_data_set(box, "eulogium_list", l);
+ elm_object_content_set(list, box);
+ evas_object_show(box);
+
+ return box;
+}
+
+Evas_Object *eulogium_button_list_prepend(Evas_Object *list, const char *label, Evas_Object *icon,
+ Evas_Smart_Cb func, const void *data)
+{
+ Eina_List *l = evas_object_data_get(list, "eulogium_list");
+ Evas_Object *button;
+
+ if (!list)
+ return NULL;
+
+ button = elm_button_add(list);
+ if (label)
+ elm_object_text_set(button, label);
+ if (icon)
+ elm_object_part_content_set(button, "icon", icon);
+ if (func)
+ evas_object_smart_callback_add(button, "clicked", func, data);
+ evas_object_show(button);
+
+ if (l)
+ l = eina_list_prepend(l, button);
+ else
+ l = eina_list_prepend(NULL, button);
+ evas_object_data_set(list, "eulogium_list", l);
+
+ evas_object_size_hint_weight_set(button, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(button, 0, 0);
+
+ return button;
+}
+
+Evas_Object *eulogium_button_list_sorted_insert(Evas_Object *list, const char *label, Evas_Object *icon,
+ Evas_Smart_Cb func, const void *data, Eina_Compare_Cb cmp_func)
+{
+ Eina_List *l = evas_object_data_get(list, "eulogium_list");
+ Evas_Object *button;
+
+ if (!list)
+ return NULL;
+
+ button = elm_button_add(list);
+ if (label)
+ elm_object_text_set(button, label);
+ if (icon)
+ evas_object_smart_callback_add(button, "clicked", func, data);
+ evas_object_show(button);
+
+ if (l)
+ l = eina_list_sorted_insert(l, cmp_func, button);
+ else
+ l = eina_list_sorted_insert(NULL, cmp_func, button);
+ evas_object_data_set(list, "eulogium_list", l);
+
+ evas_object_size_hint_weight_set(button, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(button, 0, 0);
+
+ return button;
+}
+
+void eulogium_button_list_go(Evas_Object *list)
+{
+ Eina_List *l, *item_list = evas_object_data_get(list, "eulogium_list");
+ Evas_Object *button;
+
+ EINA_LIST_FOREACH(item_list, l, button)
+ elm_box_pack_end(list, button);
+}
+
void eulogium_button_cb_set(struct button_def *button, struct button_cb *cb)
{
if (cb && button)
@@ -48,15 +130,9 @@ static void _cb_eulogium_input_wheel(void *data, Evas *e EINA_UNUSED, Evas_Objec
Evas_Event_Mouse_Wheel *ev = event_info;
if (ev->z > 0)
- elm_object_focus_next((Evas_Object *)data, ELM_FOCUS_NEXT);
- else
elm_object_focus_next((Evas_Object *)data, ELM_FOCUS_PREVIOUS);
-}
-
-/* Generic button handler */
-static void _cb_eulogium_button(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
-{
- printf("Button clicked\n");
+ else
+ elm_object_focus_next((Evas_Object *)data, ELM_FOCUS_NEXT);
}
static void _cb_eulogium_exit(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
@@ -204,21 +280,23 @@ Evas_Object *eulogium_start_print(struct eulogium_data *eulogium, char *filepath
struct _filelist_data {
void (*func)(void *data, Evas_Object *obj, void *event_info);
+ struct eulogium_data *eulogium;
char *filepath;
};
-static void _cb_select_file(void *data, Evas_Object *obj EINA_UNUSED, void *event_info)
+static void _cb_select_file(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
{
- struct eulogium_data *eulogium = data;
- struct _filelist_data *filelist = elm_object_item_data_get(event_info);
+ struct eulogium_data *eulogium = ((struct _filelist_data *)data)->eulogium;
+ char *filepath = ((struct _filelist_data *)data)->filepath;
Evas_Object *content;
- if (filelist) {
- if (ecore_file_is_dir(filelist->filepath)) {
- content = eulogium_print_menu(eulogium, filelist->filepath);
+ if (filepath) {
+ printf("fp: %s\n", filepath);
+ if (ecore_file_is_dir(filepath)) {
+ content = eulogium_print_menu(eulogium, filepath);
} else {
eulogium->print.material = 100.23; /* TODO */
- content = eulogium_start_print(eulogium, filelist->filepath);
+ content = eulogium_start_print(eulogium, filepath);
}
elm_naviframe_item_simple_push(eulogium->navi, content);
}
@@ -226,8 +304,8 @@ static void _cb_select_file(void *data, Evas_Object *obj EINA_UNUSED, void *even
static int _cb_dirfile_sort(const void *data1, const void *data2)
{
- const char *filepath1 = ((struct _filelist_data *)elm_object_item_data_get(data1))->filepath;
- const char *filepath2 = ((struct _filelist_data *)elm_object_item_data_get(data2))->filepath;
+ const char *filepath1 = elm_object_text_get((Evas_Object *)data1);
+ const char *filepath2 = elm_object_text_get((Evas_Object *)data2);
if (!filepath1)
return 1;
@@ -301,10 +379,10 @@ static void _cb_populate_filelist(const char *name, const char *path, void *data
elm_image_resizable_set(icon, EINA_FALSE, EINA_FALSE);
filelist = malloc(sizeof(struct _filelist_data)); /* never freed, memleak! XXX check cb */
+ filelist->eulogium = eulogium;
filelist->filepath = filepath;
- filelist->func = &_cb_select_file;
- elm_list_item_sorted_insert(list, name, icon, NULL, NULL, filelist, _cb_dirfile_sort);
+ eulogium_button_list_sorted_insert(list, name, icon, _cb_select_file, filelist, _cb_dirfile_sort);
// free(filepath); /* TODO is this required?, yes! /
}
@@ -330,46 +408,24 @@ static struct button_def but_return = {
.data = NULL,
};
-static void _filelist_cb(void *data, Evas_Object *obj EINA_UNUSED, void *event_info)
-{
- struct eulogium_data *eulogium = data;
- Elm_Object_Item *item = event_info;
- struct _filelist_data *fl;
-
- if (!item) {
- printf("ohnoes, no item\n");
- return;
- }
-
- fl = elm_object_item_data_get(item);
-
- if (fl) {
- fl->func(eulogium, NULL, item);
- }
- //free(fl); /* Item data that has been set needs to be freed 'somewhere', check item_del callback */
-}
-
Evas_Object *eulogium_print_menu(struct eulogium_data *eulogium, char *filepath)
{
Evas_Object *box;
Evas_Object *list;
Evas_Object *icon;
- Elm_Object_Item *item;
- struct _filelist_data *filelist;
box = elm_box_add(eulogium->navi);
-
list = elm_label_add(box);
elm_object_text_set(list, "SD Card"); /* TODO This may be more then just the SD card */
evas_object_size_hint_align_set(list, EVAS_HINT_FILL, EVAS_HINT_FILL);
evas_object_show(list);
elm_box_pack_start(box, list);
- list = elm_list_add(box);
+
+ list = eulogium_button_list_add(box);
evas_object_size_hint_weight_set(list, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
- evas_object_size_hint_align_set(list, EVAS_HINT_FILL, EVAS_HINT_FILL);
- elm_list_multi_select_set(list, EINA_FALSE);
- elm_scroller_bounce_set(list, EINA_FALSE, EINA_FALSE);
- elm_list_mode_set(list, ELM_LIST_COMPRESS);
+ evas_object_size_hint_align_set(list, 0, 0);
+ //elm_scroller_bounce_set(list, EINA_FALSE, EINA_FALSE);
+ //elm_list_mode_set(list, ELM_LIST_COMPRESS);
elm_box_pack_end(box, list);
eulogium->data = (void *)list;
@@ -378,14 +434,10 @@ Evas_Object *eulogium_print_menu(struct eulogium_data *eulogium, char *filepath)
icon = elm_icon_add(list);
elm_icon_standard_set(icon, "home");
- item = elm_list_item_prepend(list, "< RETURN", NULL, NULL, NULL, NULL);
+ eulogium_button_list_prepend(list, "< RETURN", icon, _cb_content_prev_set, eulogium);
/* XXX TODO: when we pop the filelist from the stack, who calls elm_list_free();? */
- filelist = malloc(sizeof(struct _filelist_data));
- filelist->func = &_cb_content_prev_set;
- elm_object_item_data_set(item, filelist);
- evas_object_smart_callback_add(list, "activated", _filelist_cb, eulogium);
- elm_list_go(list);
+ eulogium_button_list_go(list);
// evas_object_smart_callback_add(list, "longpressed", _cb_filelist_filedetails, NULL); /* TODO, use inwin */
evas_object_show(list);