From bd7fa86fb019b76c92df3be62fc90eb8e79456af Mon Sep 17 00:00:00 2001 From: Olliver Schinagl Date: Wed, 10 Jun 2015 09:12:19 +0200 Subject: [griffin.hmi] refactor eulogium_button_list eulogium_button_list has been changed to item_list where we take parameters for either a button OR a checklist, since a check button is very similar to a button. Worst case, if all fails, we can always use the parameters to put all items in a horizontal box. Signed-off-by: Olliver Schinagl --- src/Makefile.am | 2 +- src/eulogium.c | 184 ++--------------------------------------------- src/eulogium_item_list.c | 140 ++++++++++++++++++++++++++++++++++++ src/eulogium_item_list.h | 28 ++++++++ 4 files changed, 175 insertions(+), 179 deletions(-) create mode 100644 src/eulogium_item_list.c create mode 100644 src/eulogium_item_list.h diff --git a/src/Makefile.am b/src/Makefile.am index a0417e7..e60d34d 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -11,7 +11,7 @@ AM_CPPFLAGS = -DPACKAGE_BIN_DIR=\"$(bindir)/\" \ -I$(top_srcdir)/src/ \ @EFL_CFLAGS@ -eulogium_SOURCES = eulogium.c +eulogium_SOURCES = eulogium.c eulogium_item_list.c eulogium_LDADD = @EFL_LIBS@ localedir = $(datadir)/locale diff --git a/src/eulogium.c b/src/eulogium.c index c0bc0ad..30f8d41 100644 --- a/src/eulogium.c +++ b/src/eulogium.c @@ -1566,170 +1566,6 @@ static void _but_change_hotend_2_cb(void *data, Evas_Object *object EINA_UNUSED, elm_naviframe_item_simple_push(eulogium->navi, content); } -Evas_Object *eulogium_button_list_add(Evas_Object *parent) -{ - Evas_Object *list, *box; - Eina_List *l = NULL; - - list = elm_scroller_add(parent); - evas_object_data_set(list, "eulogium_list", l); - box = elm_box_add(list); - evas_object_size_hint_weight_set(box, EVAS_HINT_EXPAND, 0); - evas_object_data_set(list, "content", box); - elm_object_content_set(list, box); - evas_object_show(box); - - return list; -} - -Evas_Object *_eulogium_item_new(Evas_Object *obj, const char *label, Evas_Object *icon, - Evas_Object *end, Evas_Smart_Cb func, const void *data) -{ - return obj; -} - -Evas_Object *eulogium_button_list_prepend(Evas_Object *list, const char *label, Evas_Object *icon, - Evas_Object *end, Evas_Smart_Cb func, const void *data) -{ - Evas_Object *box = evas_object_data_get(list, "content"); - Eina_List *l = evas_object_data_get(list, "eulogium_list"); - Evas_Object *item; - Evas_Object *button; - - if ((!box) && (!list)) - return NULL; - - item = elm_box_add(box); - elm_box_horizontal_set(item, EINA_TRUE); - - button = elm_button_add(item); - elm_box_pack_start(item, button); - if (label) - elm_object_text_set(button, _(label)); - if (icon) - elm_object_part_content_set(button, "icon", icon); - if (end) - elm_box_pack_end(item, end); - // elm_object_part_content_set(button, "end", end); /* TODO fix this via style */ - if (func) - evas_object_smart_callback_add(button, "clicked", func, data); - evas_object_show(button); - - if (l) - l = eina_list_prepend(l, item); - else - l = eina_list_prepend(NULL, item); - evas_object_data_set(list, "eulogium_list", l); - - evas_object_size_hint_weight_set(button, EVAS_HINT_EXPAND, 0); - evas_object_size_hint_align_set(button, EVAS_HINT_FILL, 0); - evas_object_size_hint_weight_set(item, EVAS_HINT_EXPAND, 0); - evas_object_size_hint_align_set(item, EVAS_HINT_FILL, 0); - evas_object_show(item); - - return button; -} - -Evas_Object *eulogium_button_list_append(Evas_Object *list, const char *label, Evas_Object *icon, - Evas_Object *end, Evas_Smart_Cb func, const void *data) -{ - Evas_Object *box = evas_object_data_get(list, "content"); - Eina_List *l = evas_object_data_get(list, "eulogium_list"); - Evas_Object *item; - Evas_Object *button; - - if ((!box) && (!list)) - return NULL; - - item = elm_box_add(box); - elm_box_horizontal_set(item, EINA_TRUE); - - button = elm_button_add(item); - elm_box_pack_start(item, button); - if (label) - elm_object_text_set(button, _(label)); - if (icon) - elm_object_part_content_set(button, "icon", icon); - if (end) - elm_box_pack_end(item, end); - // elm_object_part_content_set(button, "end", end); - if (func) - evas_object_smart_callback_add(button, "clicked", func, data); - evas_object_show(button); - - if (l) - l = eina_list_append(l, item); - else - l = eina_list_append(NULL, item); - evas_object_data_set(list, "eulogium_list", l); - - evas_object_size_hint_weight_set(button, EVAS_HINT_EXPAND, 0); - evas_object_size_hint_align_set(button, EVAS_HINT_FILL, 0); - evas_object_size_hint_weight_set(item, EVAS_HINT_EXPAND, 0); - evas_object_size_hint_align_set(item, EVAS_HINT_FILL, 0); - evas_object_show(item); - - return button; -} - -Evas_Object *eulogium_button_list_sorted_insert(Evas_Object *list, const char *label, Evas_Object *icon, - Evas_Object *end, Evas_Smart_Cb func, const void *data, - Eina_Compare_Cb cmp_func) -{ - Evas_Object *box = evas_object_data_get(list, "content"); - Eina_List *l = evas_object_data_get(list, "eulogium_list"); - Evas_Object *item; - Evas_Object *button; - - if ((!box) && (!list)) - return NULL; - - item = elm_box_add(box); - elm_box_horizontal_set(item, EINA_TRUE); - - button = elm_button_add(item); - elm_box_pack_start(item, button); - if (label) - elm_object_text_set(button, _(label)); - if (icon) - elm_object_part_content_set(button, "icon", icon); - if (end) - elm_box_pack_end(item, end); - // elm_object_part_content_set(button, "end", end); - if (data) - evas_object_data_set(item, "sort_data", data); - if (func) - evas_object_smart_callback_add(button, "clicked", func, data); - evas_object_show(button); - - if (l) - l = eina_list_sorted_insert(l, cmp_func, item); - else - l = eina_list_sorted_insert(NULL, cmp_func, item); - evas_object_data_set(list, "eulogium_list", l); - - evas_object_size_hint_weight_set(button, EVAS_HINT_EXPAND, 0); - evas_object_size_hint_align_set(button, EVAS_HINT_FILL, 0); - evas_object_size_hint_weight_set(item, EVAS_HINT_EXPAND, 0); - evas_object_size_hint_align_set(item, EVAS_HINT_FILL, 0); - evas_object_show(item); - - return button; -} - -void eulogium_button_list_go(Evas_Object *list) -{ - Evas_Object *box = evas_object_data_get(list, "content"); - Eina_List *l, *item_list = evas_object_data_get(list, "eulogium_list"); - Evas_Object *button; - - if ((!box) && (!list)) - return; - - EINA_LIST_FOREACH(item_list, l, button) - elm_box_pack_end(box, button); -} - void eulogium_button_cb_set(struct button_def *button, struct button_cb *cb) { if (cb && button) @@ -2178,7 +2014,7 @@ static void _cb_populate_filelist(const char *name, const char *path, void *data filelist_entry = malloc(sizeof(struct _filelist_entry_data)); filelist_entry->filelist = filelist; filelist_entry->filepath = filepath; - eulogium_button_list_sorted_insert(filelist->list, name, icon, NULL, _cb_select_file, filelist_entry, _cb_dirfile_sort); + eulogium_item_list_sorted_insert(filelist->list, icon, name, NULL, _cb_select_file, filelist_entry, _cb_dirfile_sort); // evas_object_smart_callback_add(item, "focused", _update_footer_focus_cb, &menu->entry[i]); // evas_object_smart_callback_add(item, "unfocused", _update_footer_unfocus_cb, &menu->entry[i]); // evas_object_smart_callback_add(list, "longpressed", _cb_filelist_filedetails, NULL); /* TODO, popup? */ @@ -2243,14 +2079,14 @@ static void _menu_generate_filelist(struct eulogium_data *eulogium, Evas_Object icon = elm_icon_add(list); elm_icon_standard_set(icon, "user-home"); evas_object_show(icon); - eulogium_button_list_prepend(list, "Return", icon, NULL, _cb_content_prev_set, eulogium); + eulogium_item_list_prepend(list, icon, "Return", NULL, _cb_content_prev_set, eulogium); /* XXX TODO: when we pop the filelist from the stack, who calls elm_list_free();? */ } static void _menu_generate_menulist(struct eulogium_data *eulogium, Evas_Object *list, struct menu_entry_def *entry) { int i; - Evas_Object *item, *icon, *end; + Evas_Object *item, *icon; for (i = 0; entry[i].label != NULL; i++) { if (entry[i].icon) { @@ -2260,15 +2096,7 @@ static void _menu_generate_menulist(struct eulogium_data *eulogium, Evas_Object } else { icon = NULL; } - if (entry[i].end) { - end = elm_check_add(list); /* XXX don't add this here, we add this if the backend has this feature. */ - elm_check_state_set(end, EINA_TRUE); - elm_object_focus_allow_set(end, EINA_FALSE); - evas_object_show(end); - } else { - end = NULL; - } - item = eulogium_button_list_append(list, entry[i].label, icon, end, entry[i].func, eulogium); /*XXX TODO pass data from struct */ + item = eulogium_item_list_append(list, icon, entry[i].label, NULL, entry[i].func, eulogium); /*XXX TODO pass data from struct */ entry[i].data = eulogium->footer; /* XXX ugly-ness keeps adding. The footer widget should not be passed like this :( */ evas_object_smart_callback_add(item, "focused", _update_menu_footer_focus_cb, &entry[i]); evas_object_smart_callback_add(item, "unfocused", _update_menu_footer_unfocus_cb, &entry[i]); @@ -2293,7 +2121,7 @@ Evas_Object *menu_widget_list(struct eulogium_data *eulogium, Evas_Object *paren evas_object_show(obj); elm_box_pack_start(box, obj); - list = eulogium_button_list_add(box); + list = eulogium_item_list_add(box); elm_scroller_bounce_set(list, EINA_FALSE, EINA_FALSE); elm_scroller_policy_set(list, ELM_SCROLLER_POLICY_OFF, ELM_SCROLLER_POLICY_AUTO); evas_object_size_hint_weight_set(list, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); @@ -2304,7 +2132,7 @@ Evas_Object *menu_widget_list(struct eulogium_data *eulogium, Evas_Object *paren _menu_generate_menulist(eulogium, list, menu->entry); if (menu->type == LIST_FILE) _menu_generate_filelist(eulogium, list, &menu->dir); - eulogium_button_list_go(list); + eulogium_item_list_go(list); evas_object_show(list); elm_box_pack_end(box, list); diff --git a/src/eulogium_item_list.c b/src/eulogium_item_list.c new file mode 100644 index 0000000..7522634 --- /dev/null +++ b/src/eulogium_item_list.c @@ -0,0 +1,140 @@ +/* + * Eulogium_item_list, inspired elm_list. + * + * Copyright (c) 2015 Ultimaker B.V. + * Author: Olliver Schinagl + * + * SPDX-License-Identifier: AGPL-3.0+ + */ + +#include +#include + +#include "eulogium_private.h" +#include "gettext.h" + +#include "eulogium_item_list.h" + +Evas_Object *eulogium_item_list_add(Evas_Object *parent) +{ + Evas_Object *list, *box; + Eina_List *l = NULL; + + list = elm_scroller_add(parent); + evas_object_data_set(list, "eulogium_item_list", l); + box = elm_box_add(list); + evas_object_size_hint_weight_set(box, EVAS_HINT_EXPAND, 0); + evas_object_data_set(list, "content", box); + elm_object_content_set(list, box); + evas_object_show(box); + + return list; +} + +static Evas_Object *_item_new(Evas_Object *parent, Evas_Object *icon, char const *label, + Eina_Bool *check, Evas_Smart_Cb func, const void *data) +{ + Evas_Object *item; + + if (check) { + item = elm_check_add(parent); + /* elm_check_pointer_set(item, check); */ + /* elm_object_style_set(item, "list"); */ + } else { + item = elm_button_add(parent); + elm_object_style_set(item, "list"); + } + if (label) + elm_object_text_set(item, _(label)); + if (icon) + elm_object_part_content_set(item, "icon", icon); + if (data) + evas_object_data_set(item, "sort_data", data); + if (func) + evas_object_smart_callback_add(item, check ? "changed" : "clicked", func, data); + evas_object_size_hint_weight_set(item, EVAS_HINT_EXPAND, 0); + evas_object_size_hint_align_set(item, EVAS_HINT_FILL, 0); + evas_object_show(item); + + return item; +} + +Evas_Object *eulogium_item_list_prepend(Evas_Object *list, Evas_Object *icon, + char const *label, Eina_Bool *check, + Evas_Smart_Cb func, const void *data) +{ + Evas_Object *box = evas_object_data_get(list, "content"); + Eina_List *l = evas_object_data_get(list, "eulogium_item_list"); + Evas_Object *item; + + if ((!box) && (!list)) + return NULL; + + item = _item_new(box, icon, label, check, func, data); + + if (l) + l = eina_list_prepend(l, item); + else + l = eina_list_prepend(NULL, item); + evas_object_data_set(list, "eulogium_item_list", l); + + return item; +} + +Evas_Object *eulogium_item_list_append(Evas_Object *list, Evas_Object *icon, + char const *label, Eina_Bool *check, + Evas_Smart_Cb func, const void *data) +{ + Evas_Object *box = evas_object_data_get(list, "content"); + Eina_List *l = evas_object_data_get(list, "eulogium_item_list"); + Evas_Object *item; + + if ((!box) && (!list)) + return NULL; + + item = _item_new(box, icon, label, check, func, data); + + if (l) + l = eina_list_append(l, item); + else + l = eina_list_append(NULL, item); + evas_object_data_set(list, "eulogium_item_list", l); + + return item; +} + +Evas_Object *eulogium_item_list_sorted_insert(Evas_Object *list, Evas_Object *icon, + char const *label, Eina_Bool *check, + Evas_Smart_Cb func, const void *data, + Eina_Compare_Cb cmp_func) +{ + Evas_Object *box = evas_object_data_get(list, "content"); + Eina_List *l = evas_object_data_get(list, "eulogium_item_list"); + Evas_Object *item; + + if ((!box) && (!list)) + return NULL; + + item = _item_new(box, icon, label, check, func, data); + + if (l) + l = eina_list_sorted_insert(l, cmp_func, item); + else + l = eina_list_sorted_insert(NULL, cmp_func, item); + evas_object_data_set(list, "eulogium_item_list", l); + + return item; +} + +void eulogium_item_list_go(Evas_Object *list) +{ + Evas_Object *box = evas_object_data_get(list, "content"); + Eina_List *l, *item_list = evas_object_data_get(list, "eulogium_item_list"); + Evas_Object *item; + + if ((!box) && (!list)) + return; + + EINA_LIST_FOREACH(item_list, l, item) + elm_box_pack_end(box, item); +} diff --git a/src/eulogium_item_list.h b/src/eulogium_item_list.h new file mode 100644 index 0000000..182b053 --- /dev/null +++ b/src/eulogium_item_list.h @@ -0,0 +1,28 @@ +/* + * eulogium_item_list, inspired elm_list. + * + * Copyright (c) 2015 Ultimaker B.V. + * Author: Olliver Schinagl + * + * SPDX-License-Identifier: AGPL-3.0+ + */ + +#ifndef _EULOGIUM_ITEM_LIST_H +#define _EULOGIUM_ITEM_LIST_H + +#include + +Evas_Object *eulogium_item_list_add(Evas_Object *parent); +Evas_Object *eulogium_item_list_prepend(Evas_Object *list, Evas_Object *icon, + char const *label, Eina_Bool *check, + Evas_Smart_Cb func, const void *data); +Evas_Object *eulogium_item_list_append(Evas_Object *list, Evas_Object *icon, + char const *label, Eina_Bool *check, + Evas_Smart_Cb func, const void *data); +Evas_Object *eulogium_item_list_sorted_insert(Evas_Object *list, Evas_Object *icon, + char const *label, Eina_Bool *check, + Evas_Smart_Cb func, const void *data, + Eina_Compare_Cb cmp_func); +void eulogium_item_list_go(Evas_Object *list); + +#endif /* _EULOGIUM_ITEM_LIST_H */ -- cgit v0.12