diff options
author | Olliver Schinagl <o.schinagl@ultimaker.com> | 2015-04-22 11:28:26 (GMT) |
---|---|---|
committer | Olliver Schinagl <o.schinagl@ultimaker.com> | 2015-04-28 05:07:15 (GMT) |
commit | 5e7491cf7ec9ae1eaca7160b44c07d8a9a70da37 (patch) | |
tree | 81175e9bbaec4ba84ab3cc14fb8455181ba6ba2e /src | |
parent | 5b3a86c1d8eebb56e9d376dc402ba3a3f2a45a4a (diff) | |
download | eulogium-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.c | 156 |
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); |