summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/eulogium.c215
-rw-r--r--src/eulogium.h12
2 files changed, 133 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);
diff --git a/src/eulogium.h b/src/eulogium.h
index d6d59d3..cd760e5 100644
--- a/src/eulogium.h
+++ b/src/eulogium.h
@@ -121,9 +121,21 @@ struct menu_entry_def {
void *data;
};
+struct dir_entry_def {
+ void *data;
+ char *path;
+};
+
+enum list_type {
+ LIST_MENU,
+ LIST_FILE,
+};
+
struct menu_def {
const char *title;
+ enum list_type type;
void *data;
+ struct dir_entry_def dir;
struct menu_entry_def entry[];
};