diff options
Diffstat (limited to 'src/eulogium.c')
-rw-r--r-- | src/eulogium.c | 215 |
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); |