From 17a66067b0c83e3f633628ff517eaed94071c3ca Mon Sep 17 00:00:00 2001 From: twinaphex Date: Fri, 16 Dec 2016 08:59:05 +0100 Subject: [PATCH] Add menu_filebrowser.c --- Makefile.common | 1 + griffin/griffin.c | 1 + menu/menu_displaylist.c | 249 +--------------------------- menu/widgets/menu_filebrowser.c | 282 ++++++++++++++++++++++++++++++++ menu/widgets/menu_filebrowser.h | 37 +++++ 5 files changed, 323 insertions(+), 247 deletions(-) create mode 100644 menu/widgets/menu_filebrowser.c create mode 100644 menu/widgets/menu_filebrowser.h diff --git a/Makefile.common b/Makefile.common index 8559622b43..bbcc702598 100644 --- a/Makefile.common +++ b/Makefile.common @@ -520,6 +520,7 @@ ifeq ($(HAVE_MENU_COMMON), 1) menu/menu_navigation.o \ menu/menu_setting.o \ menu/menu_shader.o \ + menu/widgets/menu_filebrowser.o \ menu/widgets/menu_dialog.o \ menu/widgets/menu_input_dialog.o \ menu/widgets/menu_input_bind_dialog.o \ diff --git a/griffin/griffin.c b/griffin/griffin.c index eda08df7da..ad093012d1 100644 --- a/griffin/griffin.c +++ b/griffin/griffin.c @@ -935,6 +935,7 @@ MENU #include "../menu/menu_cbs.c" #include "../menu/menu_content.c" #include "../menu/widgets/menu_entry.c" +#include "../menu/widgets/menu_filebrowser.c" #include "../menu/widgets/menu_dialog.c" #include "../menu/widgets/menu_input_dialog.c" #include "../menu/widgets/menu_input_bind_dialog.c" diff --git a/menu/menu_displaylist.c b/menu/menu_displaylist.c index 1384a49f7c..d97d1581b9 100644 --- a/menu/menu_displaylist.c +++ b/menu/menu_displaylist.c @@ -53,6 +53,7 @@ #include "menu_navigation.h" #include "widgets/menu_dialog.h" #include "widgets/menu_list.h" +#include "widgets/menu_filebrowser.h" #include "menu_cbs.h" #include "../configuration.h" @@ -3516,252 +3517,6 @@ static int menu_displaylist_parse_cores( return 0; } -static int menu_displaylist_parse_generic( - menu_handle_t *menu, - menu_displaylist_info_t *info, - enum menu_displaylist_ctl_state type, - bool extensions_honored) -{ - size_t i, list_size; - unsigned files_count = 0; - unsigned dirs_count = 0; - bool path_is_compressed = false; - bool filter_ext = false; - struct string_list *str_list = NULL; - unsigned items_found = 0; - settings_t *settings = config_get_ptr(); - - if (string_is_empty(info->path)) - { - if (frontend_driver_parse_drive_list(info->list) != 0) - menu_entries_append_enum(info->list, "/", "", - MSG_UNKNOWN, FILE_TYPE_DIRECTORY, 0, 0); - return 0; - } - - path_is_compressed = path_is_compressed_file(info->path); - filter_ext = - settings->menu.navigation.browser.filter.supported_extensions_enable; - - if (string_is_equal(info->label, msg_hash_to_str(MENU_ENUM_LABEL_SCAN_FILE))) - filter_ext = false; - - if (extensions_honored) - filter_ext = true; - - if (path_is_compressed) - str_list = file_archive_get_file_list(info->path, info->exts); - else - str_list = dir_list_new(info->path, - filter_ext ? info->exts : NULL, - true, settings->show_hidden_files, true, false); - -#ifdef HAVE_LIBRETRODB - if (filebrowser_types == FILEBROWSER_SCAN_DIR) - menu_entries_prepend(info->list, - msg_hash_to_str(MENU_ENUM_LABEL_VALUE_SCAN_THIS_DIRECTORY), - msg_hash_to_str(MENU_ENUM_LABEL_SCAN_THIS_DIRECTORY), - MENU_ENUM_LABEL_SCAN_THIS_DIRECTORY, - FILE_TYPE_SCAN_DIRECTORY, 0 ,0); -#endif - - if (filebrowser_types == FILEBROWSER_SELECT_DIR) - menu_entries_prepend(info->list, - msg_hash_to_str(MENU_ENUM_LABEL_VALUE_USE_THIS_DIRECTORY), - msg_hash_to_str(MENU_ENUM_LABEL_USE_THIS_DIRECTORY), - MENU_ENUM_LABEL_USE_THIS_DIRECTORY, - FILE_TYPE_USE_DIRECTORY, 0 ,0); - - if (!str_list) - { - const char *str = path_is_compressed - ? msg_hash_to_str(MENU_ENUM_LABEL_VALUE_UNABLE_TO_READ_COMPRESSED_FILE) - : msg_hash_to_str(MENU_ENUM_LABEL_VALUE_DIRECTORY_NOT_FOUND); - - menu_entries_append_enum(info->list, str, "", - MENU_ENUM_LABEL_VALUE_DIRECTORY_NOT_FOUND, 0, 0, 0); - goto end; - } - - dir_list_sort(str_list, true); - - list_size = str_list->size; - - if (list_size == 0) - { - string_list_free(str_list); - str_list = NULL; - } - else - { - for (i = 0; i < list_size; i++) - { - bool is_dir; - char label[PATH_MAX_LENGTH]; - const char *path = NULL; - enum msg_hash_enums enum_idx = MSG_UNKNOWN; - enum msg_file_type file_type = FILE_TYPE_NONE; - - label[0] = '\0'; - - switch (str_list->elems[i].attr.i) - { - case RARCH_DIRECTORY: - file_type = FILE_TYPE_DIRECTORY; - break; - case RARCH_COMPRESSED_ARCHIVE: - file_type = FILE_TYPE_CARCHIVE; - break; - case RARCH_COMPRESSED_FILE_IN_ARCHIVE: - file_type = FILE_TYPE_IN_CARCHIVE; - break; - case RARCH_PLAIN_FILE: - default: - file_type = (enum msg_file_type)info->type_default; - switch (type) - { - case DISPLAYLIST_CORES_DETECTED: - /* in case of deferred_core_list we have to interpret - * every archive as an archive to disallow instant loading - */ - if (path_is_compressed_file(str_list->elems[i].data)) - file_type = FILE_TYPE_CARCHIVE; - break; - default: - break; - } - break; - } - - is_dir = (file_type == FILE_TYPE_DIRECTORY); - - if (!is_dir) - { - if (filebrowser_types == FILEBROWSER_SELECT_DIR) - continue; - if (filebrowser_types == FILEBROWSER_SCAN_DIR) - continue; - } - - /* Need to preserve slash first time. */ - path = str_list->elems[i].data; - - if (!string_is_empty(info->path) && !path_is_compressed) - path = path_basename(path); - - if (filebrowser_types == FILEBROWSER_SELECT_COLLECTION) - { - if (is_dir) - file_type = FILE_TYPE_DIRECTORY; - else - file_type = FILE_TYPE_PLAYLIST_COLLECTION; - } - - if (!is_dir && (settings->multimedia.builtin_mediaplayer_enable || - settings->multimedia.builtin_imageviewer_enable)) - { - switch (path_is_media_type(path)) - { - case RARCH_CONTENT_MOVIE: - #ifdef HAVE_FFMPEG - if (settings->multimedia.builtin_mediaplayer_enable) - file_type = FILE_TYPE_MOVIE; - #endif - break; - case RARCH_CONTENT_MUSIC: - #ifdef HAVE_FFMPEG - if (settings->multimedia.builtin_mediaplayer_enable) - file_type = FILE_TYPE_MUSIC; - #endif - break; - case RARCH_CONTENT_IMAGE: - #ifdef HAVE_IMAGEVIEWER - if (settings->multimedia.builtin_imageviewer_enable - && type != DISPLAYLIST_IMAGES) - file_type = FILE_TYPE_IMAGEVIEWER; - else - file_type = FILE_TYPE_IMAGE; - #endif - break; - default: - break; - } - } - - switch (file_type) - { - case FILE_TYPE_PLAIN: -#if 0 - enum_idx = MENU_ENUM_LABEL_FILE_BROWSER_PLAIN_FILE; -#endif - files_count++; - break; - case FILE_TYPE_MOVIE: - enum_idx = MENU_ENUM_LABEL_FILE_BROWSER_MOVIE_OPEN; - files_count++; - break; - case FILE_TYPE_MUSIC: - enum_idx = MENU_ENUM_LABEL_FILE_BROWSER_MUSIC_OPEN; - files_count++; - break; - case FILE_TYPE_IMAGE: - enum_idx = MENU_ENUM_LABEL_FILE_BROWSER_IMAGE; - files_count++; - break; - case FILE_TYPE_IMAGEVIEWER: - enum_idx = MENU_ENUM_LABEL_FILE_BROWSER_IMAGE_OPEN_WITH_VIEWER; - files_count++; - break; - case FILE_TYPE_DIRECTORY: - enum_idx = MENU_ENUM_LABEL_FILE_BROWSER_DIRECTORY; - dirs_count++; - break; - default: - break; - } - - items_found++; - menu_entries_append_enum(info->list, path, label, - enum_idx, - file_type, 0, 0); - } - } - - if (str_list && str_list->size > 0) - string_list_free(str_list); - - if (items_found == 0) - { - menu_entries_append_enum(info->list, - msg_hash_to_str(MENU_ENUM_LABEL_VALUE_NO_ITEMS), - msg_hash_to_str(MENU_ENUM_LABEL_NO_ITEMS), - MENU_ENUM_LABEL_NO_ITEMS, - MENU_SETTING_NO_ITEM, 0, 0); - } - - /* We don't want to show 'filter by extension' for this. */ - if (filebrowser_types == FILEBROWSER_SELECT_DIR) - goto end; - if (filebrowser_types == FILEBROWSER_SCAN_DIR) - goto end; - - if (!extensions_honored && files_count > 0) - menu_entries_prepend(info->list, - msg_hash_to_str(MENU_ENUM_LABEL_VALUE_NAVIGATION_BROWSER_FILTER_SUPPORTED_EXTENSIONS_ENABLE), - msg_hash_to_str(MENU_ENUM_LABEL_NAVIGATION_BROWSER_FILTER_SUPPORTED_EXTENSIONS_ENABLE), - MENU_ENUM_LABEL_NAVIGATION_BROWSER_FILTER_SUPPORTED_EXTENSIONS_ENABLE, - 0, 0 ,0); - -end: - menu_entries_prepend(info->list, - msg_hash_to_str(MENU_ENUM_LABEL_VALUE_PARENT_DIRECTORY), - info->path, - MENU_ENUM_LABEL_PARENT_DIRECTORY, - FILE_TYPE_PARENT_DIRECTORY, 0, 0); - - return 0; -} - static void menu_displaylist_parse_playlist_associations( menu_displaylist_info_t *info) { @@ -6276,7 +6031,7 @@ bool menu_displaylist_ctl(enum menu_displaylist_ctl_state type, void *data) case DISPLAYLIST_DEFAULT: case DISPLAYLIST_CORES_DETECTED: case DISPLAYLIST_CONTENT_HISTORY: - if (menu_displaylist_parse_generic(menu, info, type, extensions_honored) == 0) + if (filebrowser_parse(menu, info, type, extensions_honored) == 0) { info->need_refresh = true; info->need_push = true; diff --git a/menu/widgets/menu_filebrowser.c b/menu/widgets/menu_filebrowser.c new file mode 100644 index 0000000000..3b53984b03 --- /dev/null +++ b/menu/widgets/menu_filebrowser.c @@ -0,0 +1,282 @@ +/* RetroArch - A frontend for libretro. + * Copyright (C) 2011-2016 - Daniel De Matteis + * + * RetroArch is free software: you can redistribute it and/or modify it under the terms + * of the GNU General Public License as published by the Free Software Found- + * ation, either version 3 of the License, or (at your option) any later version. + * + * RetroArch is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; + * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR + * PURPOSE. See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along with RetroArch. + * If not, see . + */ + +#include +#include +#include +#include +#include + +#include + +#include + +#ifdef HAVE_CONFIG_H +#include "../../config.h" +#endif + +#include "menu_input_dialog.h" + +#include "../../configuration.h" +#include "../../frontend/frontend_driver.h" +#include "../../paths.h" +#include "../menu_driver.h" +#include "../menu_navigation.h" + +int filebrowser_parse(void *data, void *data2, + enum menu_displaylist_ctl_state type, + bool extensions_honored) +{ + size_t i, list_size; + unsigned files_count = 0; + unsigned dirs_count = 0; + bool path_is_compressed = false; + bool filter_ext = false; + struct string_list *str_list = NULL; + unsigned items_found = 0; + settings_t *settings = config_get_ptr(); + menu_handle_t *menu = (menu_handle_t*)data; + menu_displaylist_info_t *info= (menu_displaylist_info_t*)data2; + + if (string_is_empty(info->path)) + { + if (frontend_driver_parse_drive_list(info->list) != 0) + menu_entries_append_enum(info->list, "/", "", + MSG_UNKNOWN, FILE_TYPE_DIRECTORY, 0, 0); + return 0; + } + + path_is_compressed = path_is_compressed_file(info->path); + filter_ext = + settings->menu.navigation.browser.filter.supported_extensions_enable; + + if (string_is_equal(info->label, msg_hash_to_str(MENU_ENUM_LABEL_SCAN_FILE))) + filter_ext = false; + + if (extensions_honored) + filter_ext = true; + + if (path_is_compressed) + str_list = file_archive_get_file_list(info->path, info->exts); + else + str_list = dir_list_new(info->path, + filter_ext ? info->exts : NULL, + true, settings->show_hidden_files, true, false); + +#ifdef HAVE_LIBRETRODB + if (filebrowser_types == FILEBROWSER_SCAN_DIR) + menu_entries_prepend(info->list, + msg_hash_to_str(MENU_ENUM_LABEL_VALUE_SCAN_THIS_DIRECTORY), + msg_hash_to_str(MENU_ENUM_LABEL_SCAN_THIS_DIRECTORY), + MENU_ENUM_LABEL_SCAN_THIS_DIRECTORY, + FILE_TYPE_SCAN_DIRECTORY, 0 ,0); +#endif + + if (filebrowser_types == FILEBROWSER_SELECT_DIR) + menu_entries_prepend(info->list, + msg_hash_to_str(MENU_ENUM_LABEL_VALUE_USE_THIS_DIRECTORY), + msg_hash_to_str(MENU_ENUM_LABEL_USE_THIS_DIRECTORY), + MENU_ENUM_LABEL_USE_THIS_DIRECTORY, + FILE_TYPE_USE_DIRECTORY, 0 ,0); + + if (!str_list) + { + const char *str = path_is_compressed + ? msg_hash_to_str(MENU_ENUM_LABEL_VALUE_UNABLE_TO_READ_COMPRESSED_FILE) + : msg_hash_to_str(MENU_ENUM_LABEL_VALUE_DIRECTORY_NOT_FOUND); + + menu_entries_append_enum(info->list, str, "", + MENU_ENUM_LABEL_VALUE_DIRECTORY_NOT_FOUND, 0, 0, 0); + goto end; + } + + dir_list_sort(str_list, true); + + list_size = str_list->size; + + if (list_size == 0) + { + string_list_free(str_list); + str_list = NULL; + } + else + { + for (i = 0; i < list_size; i++) + { + bool is_dir; + char label[PATH_MAX_LENGTH]; + const char *path = NULL; + enum msg_hash_enums enum_idx = MSG_UNKNOWN; + enum msg_file_type file_type = FILE_TYPE_NONE; + + label[0] = '\0'; + + switch (str_list->elems[i].attr.i) + { + case RARCH_DIRECTORY: + file_type = FILE_TYPE_DIRECTORY; + break; + case RARCH_COMPRESSED_ARCHIVE: + file_type = FILE_TYPE_CARCHIVE; + break; + case RARCH_COMPRESSED_FILE_IN_ARCHIVE: + file_type = FILE_TYPE_IN_CARCHIVE; + break; + case RARCH_PLAIN_FILE: + default: + file_type = (enum msg_file_type)info->type_default; + switch (type) + { + case DISPLAYLIST_CORES_DETECTED: + /* in case of deferred_core_list we have to interpret + * every archive as an archive to disallow instant loading + */ + if (path_is_compressed_file(str_list->elems[i].data)) + file_type = FILE_TYPE_CARCHIVE; + break; + default: + break; + } + break; + } + + is_dir = (file_type == FILE_TYPE_DIRECTORY); + + if (!is_dir) + { + if (filebrowser_types == FILEBROWSER_SELECT_DIR) + continue; + if (filebrowser_types == FILEBROWSER_SCAN_DIR) + continue; + } + + /* Need to preserve slash first time. */ + path = str_list->elems[i].data; + + if (!string_is_empty(info->path) && !path_is_compressed) + path = path_basename(path); + + if (filebrowser_types == FILEBROWSER_SELECT_COLLECTION) + { + if (is_dir) + file_type = FILE_TYPE_DIRECTORY; + else + file_type = FILE_TYPE_PLAYLIST_COLLECTION; + } + + if (!is_dir && (settings->multimedia.builtin_mediaplayer_enable || + settings->multimedia.builtin_imageviewer_enable)) + { + switch (path_is_media_type(path)) + { + case RARCH_CONTENT_MOVIE: +#ifdef HAVE_FFMPEG + if (settings->multimedia.builtin_mediaplayer_enable) + file_type = FILE_TYPE_MOVIE; +#endif + break; + case RARCH_CONTENT_MUSIC: +#ifdef HAVE_FFMPEG + if (settings->multimedia.builtin_mediaplayer_enable) + file_type = FILE_TYPE_MUSIC; +#endif + break; + case RARCH_CONTENT_IMAGE: +#ifdef HAVE_IMAGEVIEWER + if (settings->multimedia.builtin_imageviewer_enable + && type != DISPLAYLIST_IMAGES) + file_type = FILE_TYPE_IMAGEVIEWER; + else + file_type = FILE_TYPE_IMAGE; +#endif + break; + default: + break; + } + } + + switch (file_type) + { + case FILE_TYPE_PLAIN: +#if 0 + enum_idx = MENU_ENUM_LABEL_FILE_BROWSER_PLAIN_FILE; +#endif + files_count++; + break; + case FILE_TYPE_MOVIE: + enum_idx = MENU_ENUM_LABEL_FILE_BROWSER_MOVIE_OPEN; + files_count++; + break; + case FILE_TYPE_MUSIC: + enum_idx = MENU_ENUM_LABEL_FILE_BROWSER_MUSIC_OPEN; + files_count++; + break; + case FILE_TYPE_IMAGE: + enum_idx = MENU_ENUM_LABEL_FILE_BROWSER_IMAGE; + files_count++; + break; + case FILE_TYPE_IMAGEVIEWER: + enum_idx = MENU_ENUM_LABEL_FILE_BROWSER_IMAGE_OPEN_WITH_VIEWER; + files_count++; + break; + case FILE_TYPE_DIRECTORY: + enum_idx = MENU_ENUM_LABEL_FILE_BROWSER_DIRECTORY; + dirs_count++; + break; + default: + break; + } + + items_found++; + menu_entries_append_enum(info->list, path, label, + enum_idx, + file_type, 0, 0); + } + } + + if (str_list && str_list->size > 0) + string_list_free(str_list); + + if (items_found == 0) + { + menu_entries_append_enum(info->list, + msg_hash_to_str(MENU_ENUM_LABEL_VALUE_NO_ITEMS), + msg_hash_to_str(MENU_ENUM_LABEL_NO_ITEMS), + MENU_ENUM_LABEL_NO_ITEMS, + MENU_SETTING_NO_ITEM, 0, 0); + } + + /* We don't want to show 'filter by extension' for this. */ + if (filebrowser_types == FILEBROWSER_SELECT_DIR) + goto end; + if (filebrowser_types == FILEBROWSER_SCAN_DIR) + goto end; + + if (!extensions_honored && files_count > 0) + menu_entries_prepend(info->list, + msg_hash_to_str(MENU_ENUM_LABEL_VALUE_NAVIGATION_BROWSER_FILTER_SUPPORTED_EXTENSIONS_ENABLE), + msg_hash_to_str(MENU_ENUM_LABEL_NAVIGATION_BROWSER_FILTER_SUPPORTED_EXTENSIONS_ENABLE), + MENU_ENUM_LABEL_NAVIGATION_BROWSER_FILTER_SUPPORTED_EXTENSIONS_ENABLE, + 0, 0 ,0); + +end: + menu_entries_prepend(info->list, + msg_hash_to_str(MENU_ENUM_LABEL_VALUE_PARENT_DIRECTORY), + info->path, + MENU_ENUM_LABEL_PARENT_DIRECTORY, + FILE_TYPE_PARENT_DIRECTORY, 0, 0); + + return 0; +} diff --git a/menu/widgets/menu_filebrowser.h b/menu/widgets/menu_filebrowser.h new file mode 100644 index 0000000000..afa3e11db8 --- /dev/null +++ b/menu/widgets/menu_filebrowser.h @@ -0,0 +1,37 @@ +/* RetroArch - A frontend for libretro. + * Copyright (C) 2010-2014 - Hans-Kristian Arntzen + * Copyright (C) 2011-2016 - Daniel De Matteis + * + * RetroArch is free software: you can redistribute it and/or modify it under the terms + * of the GNU General Public License as published by the Free Software Found- + * ation, either version 3 of the License, or (at your option) any later version. + * + * RetroArch is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; + * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR + * PURPOSE. See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along with RetroArch. + * If not, see . + */ + +#ifndef _MENU_FILEBROWSER_H +#define _MENU_FILEBROWSER_H + +#include +#include + +#include + +#include + +#include "../menu_displaylist.h" + +RETRO_BEGIN_DECLS + +int filebrowser_parse(void *data, void *data2, + enum menu_displaylist_ctl_state type, + bool extensions_honored); + +RETRO_END_DECLS + +#endif