summaryrefslogtreecommitdiffstats
path: root/src/eulogium.c
diff options
context:
space:
mode:
authorOlliver Schinagl <o.schinagl@ultimaker.com>2015-06-08 08:14:14 (GMT)
committerOlliver Schinagl <o.schinagl@ultimaker.com>2015-06-12 05:30:15 (GMT)
commitbdc5874629ac6987e8f9a91606604a7b4e18005c (patch)
treecf9264c879c5700419cac31fa19cc5c252373053 /src/eulogium.c
parent696fe61020a8a21c812e3355c201c87433761a8c (diff)
downloadeulogium-bdc5874629ac6987e8f9a91606604a7b4e18005c.zip
eulogium-bdc5874629ac6987e8f9a91606604a7b4e18005c.tar.gz
eulogium-bdc5874629ac6987e8f9a91606604a7b4e18005c.tar.bz2
[griffin.display] drop print_menu and replace it with a generic list
To work with selection menu's, we've added a generic menu_widget_list to fill menu list with. This list is generic enough that it can equally work with the file list. This patch refactors the list to accomplish this and in turn removes eulogium_print_menu. Signed-off-by: Olliver Schinagl <o.schinagl@ultimaker.com>
Diffstat (limited to 'src/eulogium.c')
-rw-r--r--src/eulogium.c215
1 files changed, 121 insertions, 94 deletions
diff --git a/src/eulogium.c b/src/eulogium.c
index 78d0ce8..b6d819a 100644
--- a/src/eulogium.c
+++ b/src/eulogium.c
@@ -295,6 +295,7 @@ static struct button_def but_change_hotend_2 = {
static struct menu_def menu_system_settings = {
.title = "SETTINGS",
+ .type = LIST_MENU,
.entry = {
{
.icon = "user-home",
@@ -428,6 +429,7 @@ static struct menu_def menu_system_settings = {
static struct menu_def menu_settings_network = {
.title = "NETWORK",
+ .type = LIST_MENU,
.entry = {
{
.icon = "user-home",
@@ -625,44 +627,73 @@ static void _but_main_system_cb(void *data, Evas_Object *object EINA_UNUSED, voi
elm_naviframe_item_simple_push(eulogium->navi, content);
}
-static void _but_print_local_cb(void *data, Evas_Object *object EINA_UNUSED, void *event_info EINA_UNUSED)
+static void menu_open_dir(struct eulogium_data *eulogium, struct menu_def *file)
{
- struct eulogium_data *eulogium = data;
Evas_Object *content;
- /* Fake entry for local storage, ideally this is a separate partition that is user mounted and trigged via the initial scan */
- content = eulogium_print_menu(eulogium, "/home"); /* TODO: replace later with sane storage location */
+ content = menu_widget_list(eulogium, eulogium->navi, file);
if (!content)
return;
elm_naviframe_item_simple_push(eulogium->navi, content);
}
-static void _but_print_usb_cb(void *data, Evas_Object *object EINA_UNUSED, void *event_info EINA_UNUSED)
+static void menu_internal_storage(struct eulogium_data *eulogium)
{
- struct eulogium_data *eulogium = data;
- Evas_Object *content;
+ struct menu_def *menu_internal_storage;
+
+ menu_internal_storage = malloc(sizeof(struct menu_def)); /* XXX meamleak here. This needs to be free-ed when we pop this screen */
+ menu_internal_storage->title = "Internal storage";
+ menu_internal_storage->type = LIST_FILE;
+ menu_internal_storage->dir.path = "/home"; /* TODO, use variable for internal storage */
+ menu_open_dir(eulogium, menu_internal_storage);
+}
+
+static void menu_usb_storage(struct eulogium_data *eulogium)
+{
+ struct menu_def *menu_usb_storage;
struct mount_data *mount;
+ char *mount_point;
+ uint_fast16_t mount_len;
/* Only care about last entry. Yes this is wrong as we need a UI element to handle this properly first. XXX */
mount = eina_list_data_get(eina_list_last(eulogium->mounts));
if (!mount)
return;
- content = eulogium_print_menu(eulogium, (char *)eeze_disk_mount_point_get(mount->disk));
- if (!content)
+
+ mount_point = (char *)eeze_disk_mount_point_get(mount->disk);
+ if (!mount_point)
return;
- elm_naviframe_item_simple_push(eulogium->navi, content);
+
+ mount_len = strlen(mount_point) + 1;
+ menu_usb_storage = malloc(sizeof(struct menu_def)); /* XXX meamleak here. This needs to be free-ed when we pop this screen */
+ menu_usb_storage->title = "USB storage";
+ menu_usb_storage->type = LIST_FILE;
+ menu_usb_storage->dir.path = malloc(mount_len);
+ strncpy(menu_usb_storage->dir.path, mount_point, mount_len);
+ menu_open_dir(eulogium, menu_usb_storage);
+}
+
+static void _but_print_local_cb(void *data, Evas_Object *object EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ menu_internal_storage((struct eulogium_data *)data);
+}
+
+static void _but_print_usb_cb(void *data, Evas_Object *object EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ menu_usb_storage((struct eulogium_data *)data);
}
static void _cb_button_main_print(void *data, Evas_Object *object EINA_UNUSED, void *event_info EINA_UNUSED)
{
struct eulogium_data *eulogium = data;
- Evas_Object *content = NULL;
- struct mount_data *mount;
/* TODO: Right now we just implement 1 or 2 buttons horizontally, ideally this should be something scrollable where more storage locations are usable */
if (eina_list_count(eulogium->mounts) < 1) {
- content = eulogium_print_menu(eulogium, "/home"); /* TODO: replace later with sane storage location */
+ menu_internal_storage(eulogium);
} else {
+ Evas_Object *content = NULL;
+ struct mount_data *mount;
+
mount = eina_list_data_get(eina_list_last(eulogium->mounts));
if (!mount)
return;
@@ -1313,21 +1344,33 @@ Evas_Object *eulogium_clear_print_bed(struct eulogium_data *eulogium)
}
struct _filelist_data {
- void (*func)(void *data, Evas_Object *obj, void *event_info);
struct eulogium_data *eulogium;
+ struct dir_entry_def *dir;
+ Evas_Object *list;
+};
+
+struct _filelist_entry_data {
+ struct _filelist_data *filelist;
char *filepath;
};
static void _cb_select_file(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
{
- struct eulogium_data *eulogium = ((struct _filelist_data *)data)->eulogium;
- char *filepath = ((struct _filelist_data *)data)->filepath;
- Evas_Object *content;
+ struct eulogium_data *eulogium = ((struct _filelist_entry_data *)data)->filelist->eulogium;
+ char *filepath = ((struct _filelist_entry_data *)data)->filepath;
if (filepath) {
if (ecore_file_is_dir(filepath)) {
- content = eulogium_print_menu(eulogium, filepath);
- elm_naviframe_item_simple_push(eulogium->navi, content);
+ struct menu_def *new_dir;
+ uint_fast16_t new_dir_len;
+
+ new_dir_len = strlen(filepath) + 1;
+ new_dir = malloc(sizeof(struct menu_def)); /* XXX memleak, free on pop */
+ new_dir->title = "asdf";
+ new_dir->type = LIST_FILE;
+ new_dir->dir.path = malloc(new_dir_len); /* XXX memleak, but by copying we can free _filelist_data without worry */
+ strncpy(new_dir->dir.path, filepath, new_dir_len);
+ menu_open_dir(eulogium, new_dir);
} else {
eulogium_print_data_set(eulogium, filepath);
eldbus_proxy_call(eulogium->dbus.proxy[HARMA], "startPrint", _on_start_print_ret, eulogium, -1, "sss",
@@ -1338,8 +1381,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 *)evas_object_data_get(data1, "sort_data"))->filepath;
- const char *filepath2 = ((struct _filelist_data *)evas_object_data_get(data2, "sort_data"))->filepath;
+ const char *filepath1 = ((struct _filelist_entry_data *)evas_object_data_get(data1, "sort_data"))->filepath;
+ const char *filepath2 = ((struct _filelist_entry_data *)evas_object_data_get(data2, "sort_data"))->filepath;
if (!filepath1)
return 1;
@@ -1376,14 +1419,13 @@ char *ecore_file_ext_get(const char *path)
static void _cb_populate_filelist(const char *name, const char *path, void *data)
{
- struct eulogium_data *eulogium = data;
- Evas_Object *list = (Evas_Object *)eulogium->data;
- Evas_Object *icon;
+ struct _filelist_data *filelist = data;
char *filepath;
+ struct _filelist_entry_data *filelist_entry;
+ Evas_Object *icon;
char *ext;
size_t dir_len;
uint_fast8_t hidden_visible = 1;
- struct _filelist_data *filelist;
if (hidden_visible && (name[0] == '.'))
return;
@@ -1398,16 +1440,16 @@ static void _cb_populate_filelist(const char *name, const char *path, void *data
ext = ecore_file_ext_get(name);
if (!ext)
return;
- if (!eulogium->printer.file_handlers)
+ if (!filelist->eulogium->printer.file_handlers)
return;
- for (i = 0; eulogium->printer.file_handlers[i] != NULL; i++)
- if (strncmp(ext, eulogium->printer.file_handlers[i], strlen(ext)) == 0)
+ for (i = 0; filelist->eulogium->printer.file_handlers[i] != NULL; i++)
+ if (strncmp(ext, filelist->eulogium->printer.file_handlers[i], strlen(ext)) == 0)
valid_ext++;
if (!valid_ext)
return;
}
- icon = elm_icon_add(list);
+ icon = elm_icon_add(filelist->list);
if (ecore_file_is_dir(filepath)) {
elm_icon_standard_set(icon, "folder");
} else {
@@ -1415,54 +1457,16 @@ 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;
-
- eulogium_button_list_sorted_insert(list, name, icon, _cb_select_file, filelist, _cb_dirfile_sort);
+ 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, _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? */
// free(filepath); /* TODO is this required?, yes! /
}
-Evas_Object *eulogium_print_menu(struct eulogium_data *eulogium, char *filepath) /* TODO make const out of filepath */
-{
- Evas_Object *box;
- Evas_Object *list;
- Evas_Object *icon;
-
- 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 = eulogium_button_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);
- evas_object_size_hint_align_set(list, EVAS_HINT_FILL, EVAS_HINT_FILL);
- //elm_list_mode_set(list, ELM_LIST_COMPRESS);
- elm_scroller_movement_block_set(list, ELM_SCROLLER_MOVEMENT_BLOCK_HORIZONTAL | ELM_SCROLLER_MOVEMENT_BLOCK_VERTICAL);
- elm_box_pack_end(box, list);
- evas_object_show(list);
-
- eulogium->data = (void *)list;
- eina_file_dir_list(filepath, EINA_FALSE, _cb_populate_filelist, eulogium);
- eulogium->data = NULL;
-
- icon = elm_icon_add(list);
- elm_icon_standard_set(icon, "user-home");
- 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();? */
-
- eulogium_button_list_go(list);
-// evas_object_smart_callback_add(list, "longpressed", _cb_filelist_filedetails, NULL); /* TODO, use inwin */
- evas_object_show(list);
-
- evas_object_show(box);
- return box;
-}
-
static void _update_menu_footer_unfocus_cb(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
{
struct menu_entry_def *entry = data;
@@ -1507,21 +1511,56 @@ static void _update_menu_footer_focus_cb(void *data, Evas_Object *obj EINA_UNUSE
}
-Evas_Object *menu_widget_list(struct eulogium_data *eulogium, Evas_Object *parent, struct menu_def *menu)
+static void _menu_generate_filelist(struct eulogium_data *eulogium, Evas_Object *list, struct dir_entry_def *dir)
+{
+ Evas_Object *icon;
+ struct _filelist_data *filelist_data;
+
+ filelist_data = malloc(sizeof(struct _filelist_data)); /* XXX memleak, free on pop */
+ filelist_data->eulogium = eulogium;
+ filelist_data->list = list;
+ filelist_data->dir = dir;
+ eina_file_dir_list(dir->path, EINA_FALSE, _cb_populate_filelist, filelist_data);
+
+ icon = elm_icon_add(list);
+ elm_icon_standard_set(icon, "user-home");
+ 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();? */
+}
+
+static void _menu_generate_menulist(struct eulogium_data *eulogium, Evas_Object *list, struct menu_entry_def *entry)
{
int i;
+ Evas_Object *icon;
+ Evas_Object *item;
+
+ for (i = 0; entry[i].label != NULL; i++) {
+ if (entry[i].icon) {
+ icon = elm_icon_add(list);
+ elm_icon_standard_set(icon, entry[i].icon);
+ } else {
+ icon = NULL;
+ }
+ item = eulogium_button_list_append(list, entry[i].label, icon, 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]);
+// evas_object_smart_callback_add(list, "longpressed", _cb_filelist_filedetails, NULL); /* TODO, popup? */
+ }
+}
+
+Evas_Object *menu_widget_list(struct eulogium_data *eulogium, Evas_Object *parent, struct menu_def *menu)
+{
Evas_Object *obj;
Evas_Object *box;
Evas_Object *list;
- Evas_Object *icon;
- Evas_Object *item;
box = elm_box_add(parent);
eulogium->footer = elm_label_add(box);
obj = elm_label_add(box);
- elm_object_text_set(obj, menu->title);
+ elm_object_text_set(obj, menu->title); /* XXX THIS IS NOT ALWAYS IN DATA! */
evas_object_size_hint_align_set(obj, EVAS_HINT_FILL, EVAS_HINT_FILL);
evas_object_show(obj);
elm_box_pack_start(box, obj);
@@ -1531,24 +1570,12 @@ Evas_Object *menu_widget_list(struct eulogium_data *eulogium, Evas_Object *paren
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);
evas_object_size_hint_align_set(list, EVAS_HINT_FILL, EVAS_HINT_FILL);
- //elm_list_mode_set(list, ELM_LIST_COMPRESS);
elm_scroller_movement_block_set(list, ELM_SCROLLER_MOVEMENT_BLOCK_HORIZONTAL | ELM_SCROLLER_MOVEMENT_BLOCK_VERTICAL);
evas_object_show(list);
- elm_box_pack_end(box, list);
-
- for (i = 0; menu->entry[i].label != NULL; i++) {
- if (menu->entry[i].icon) {
- icon = elm_icon_add(list);
- elm_icon_standard_set(icon, menu->entry[i].icon);
- } else {
- icon = NULL;
- }
- item = eulogium_button_list_append(list, menu->entry[i].label, icon, menu->entry[i].func, eulogium); /*XXX TODO pass data from struct */
- menu->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_footer_focus_cb, &menu->entry[i]);
- evas_object_smart_callback_add(item, "unfocused", _update_footer_unfocus_cb, &menu->entry[i]);
- }
-
+ if (menu->type == LIST_MENU)
+ _menu_generate_menulist(eulogium, list, menu->entry);
+ if (menu->type == LIST_FILE)
+ _menu_generate_filelist(eulogium, list, &menu->dir);
eulogium_button_list_go(list);
evas_object_show(list);
elm_box_pack_end(box, list);