diff --git a/intl/msg_hash_lbl.h b/intl/msg_hash_lbl.h index 77b1768ee57f..c4a74797ab4f 100644 --- a/intl/msg_hash_lbl.h +++ b/intl/msg_hash_lbl.h @@ -3758,6 +3758,18 @@ MSG_HASH( MENU_ENUM_LABEL_SCAN_FILE, "scan_file" ) +MSG_HASH( + MENU_ENUM_LABEL_SCAN_TARGET_PLAYLIST, + "scan_target_playlist" + ) +MSG_HASH( + MENU_ENUM_LABEL_SCAN_SINGLE_FILE, + "scan_single_file" + ) +MSG_HASH( + MENU_ENUM_LABEL_SCAN_OMIT_DB_REF, + "scan_omit_db_ref" + ) MSG_HASH( MENU_ENUM_LABEL_NETPLAY_SHOW_ONLY_CONNECTABLE, "netplay_show_only_connectable" @@ -6562,6 +6574,30 @@ MSG_HASH( MENU_ENUM_LABEL_MANUAL_CONTENT_SCAN_DIR, "manual_content_scan_dir" ) +MSG_HASH( + MENU_ENUM_LABEL_SCAN_METHOD, + "scan_method" + ) +MSG_HASH( + MENU_ENUM_LABEL_DEFERRED_DROPDOWN_BOX_LIST_SCAN_METHOD, + "deferred_dropdown_box_list_scan_method" + ) +MSG_HASH( + MENU_ENUM_LABEL_SCAN_USE_DB, + "scan_use_db" + ) +MSG_HASH( + MENU_ENUM_LABEL_DEFERRED_DROPDOWN_BOX_LIST_SCAN_USE_DB, + "deferred_dropdown_box_list_scan_use_db" + ) +MSG_HASH( + MENU_ENUM_LABEL_SCAN_DB_SELECT, + "scan_db_select" + ) +MSG_HASH( + MENU_ENUM_LABEL_DEFERRED_DROPDOWN_BOX_LIST_SCAN_DB_SELECT, + "deferred_dropdown_box_list_scan_db_select" + ) MSG_HASH( MENU_ENUM_LABEL_MANUAL_CONTENT_SCAN_SYSTEM_NAME, "manual_content_scan_system_name" diff --git a/intl/msg_hash_us.h b/intl/msg_hash_us.h index b2faab942e33..89c28506c3ab 100644 --- a/intl/msg_hash_us.h +++ b/intl/msg_hash_us.h @@ -8886,6 +8886,54 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_SCAN_ENTRY, "Scan" ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_SCAN_METHOD, + "Scan Method" + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_SCAN_METHOD, + "Automatic or custom with detailed options." + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_SCAN_USE_DB, + "Database Check" + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_SCAN_USE_DB, + "Strict will only add items that match a database entry, Loose will add also files with correct extension but no CRC/serial match, Custom DAT checks against a user provided XML file instead of databases, None ignores databases and only uses file extensions." + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_SCAN_DB_SELECT, + "Database To Match" + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_SCAN_DB_SELECT, + "Matching can be restricted to one specific database, or to the very first database that matches, to speed up scanning." + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_SCAN_TARGET_PLAYLIST, + "Playlist To Update" + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_SCAN_TARGET_PLAYLIST, + "Results are added to this playlist. In case of Auto - Any, multiple system playlists may be updated. Custom without database reference will not link the entries to any database in the playlist." + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_SCAN_SINGLE_FILE, + "Scan Single File" + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_SCAN_SINGLE_FILE, + "Scans only one file instead of a directory. Re-select content location after changing this entry." + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_SCAN_OMIT_DB_REF, + "Skip Database References From Playlist" + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_SCAN_OMIT_DB_REF, + "In case of custom playlist name, always use the playlist name for thumbnail search, even if there was a database match." + ) /* Import Content > Scan File */ @@ -11528,6 +11576,10 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_MANUAL_CONTENT_SCAN_SYSTEM_NAME_USE_CONTENT_DIR, "" ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_MANUAL_CONTENT_SCAN_SYSTEM_NAME_USE_AUTO, + "" + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_MANUAL_CONTENT_SCAN_SYSTEM_NAME_USE_CUSTOM, "" @@ -11536,6 +11588,50 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_MANUAL_CONTENT_SCAN_CORE_NAME_DETECT, "" ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_SCAN_METHOD_AUTO, + "Fully Automatic" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_SCAN_METHOD_CUSTOM, + "Custom" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_SCAN_USE_DB_STRICT, + "Strict" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_SCAN_USE_DB_LOOSE, + "Loose" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_SCAN_USE_DB_CUSTOM_DAT, + "Custom DAT (Strict)" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_SCAN_USE_DB_CUSTOM_DAT_LOOSE, + "Custom DAT (Loose)" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_SCAN_USE_DB_NONE, + "None" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_SCAN_DB_SELECT_AUTO_ANY, + "" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_SCAN_DB_SELECT_AUTO_FIRST, + "" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_SCAN_TARGET_PLAYLIST_AUTO_ANY, + "" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_SCAN_TARGET_PLAYLIST_CUSTOM, + "" + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_LEFT_ANALOG, "Left Analog" diff --git a/manual_content_scan.c b/manual_content_scan.c index 86081f40994f..7c65d38c71c1 100644 --- a/manual_content_scan.c +++ b/manual_content_scan.c @@ -101,6 +101,16 @@ char *manual_content_scan_get_content_dir_ptr(void) return scan_settings.content_dir; } +unsigned manual_content_scan_get_scan_method_enum(void) +{ + return 0; +} + +unsigned manual_content_scan_get_scan_use_db_enum(void) +{ + return 0; +} + /* Returns a pointer to the internal * 'system_name_custom' string */ char *manual_content_scan_get_system_name_custom_ptr(void) @@ -157,6 +167,16 @@ bool *manual_content_scan_get_search_archives_ptr(void) return &scan_settings.search_archives; } +bool *manual_content_scan_get_scan_single_file_ptr(void) +{ + return NULL; +} + +bool *manual_content_scan_get_omit_db_ref_ptr(void) +{ + return NULL; +} + /* Returns a pointer to the internal * 'filter_dat_content' bool */ bool *manual_content_scan_get_filter_dat_content_ptr(void) @@ -334,6 +354,25 @@ bool manual_content_scan_set_menu_content_dir(const char *content_dir) return false; } +bool manual_content_scan_set_menu_scan_method( + enum manual_content_scan_method method) +{ + return true; +} + +bool manual_content_scan_set_menu_scan_use_db( + enum manual_content_scan_db_usage usage) +{ + return true; +} + +bool manual_content_scan_set_menu_scan_db_select( + enum manual_content_scan_db_selection select, + const char *db_name) +{ + return false; +} + /* Sets system name for the next manual scan * operation. * Returns true if system name is valid. @@ -696,6 +735,26 @@ bool manual_content_scan_get_menu_content_dir(const char **content_dir) return true; } +bool manual_content_scan_get_menu_scan_method(const char **scan_method) +{ + return false; +} + +bool manual_content_scan_get_menu_scan_use_db(const char **scan_use_db) +{ + return false; +} + +unsigned manual_content_scan_get_scan_db_select_enum(void) +{ + return 0; +} + +bool manual_content_scan_get_menu_scan_db_select(const char **scan_db_select) +{ + return false; +} + /* Fetches system name for the next manual scan operation. * Returns true if system name is valid. * NOTE: This corresponds to the 'System Name' value @@ -730,6 +789,10 @@ bool manual_content_scan_get_menu_system_name(const char **system_name) return false; } +unsigned manual_content_scan_get_menu_system_name_type(void) +{ + return 0; +} /* Fetches core name for the next manual scan operation. * Returns true if core name is valid. */ bool manual_content_scan_get_menu_core_name(const char **core_name) @@ -759,6 +822,128 @@ bool manual_content_scan_get_menu_core_name(const char **core_name) /* Menu utility functions */ + +struct string_list *manual_content_scan_get_menu_scan_method_list(void) +{ + return NULL; + +} + +struct string_list *manual_content_scan_get_menu_scan_use_db_list(void) +{ + union string_list_elem_attr attr; + struct string_list *name_list = string_list_new(); + + /* Sanity check */ + if (!name_list) + return NULL; + + attr.i = 0; + + if (!string_list_append(name_list, msg_hash_to_str( + MENU_ENUM_LABEL_VALUE_SCAN_USE_DB_STRICT), attr)) + goto error; + + if (!string_list_append(name_list, msg_hash_to_str( + MENU_ENUM_LABEL_VALUE_SCAN_USE_DB_LOOSE), attr)) + goto error; + + if (!string_list_append(name_list, msg_hash_to_str( + MENU_ENUM_LABEL_VALUE_SCAN_USE_DB_CUSTOM_DAT), attr)) + goto error; + + if (!string_list_append(name_list, msg_hash_to_str( + MENU_ENUM_LABEL_VALUE_SCAN_USE_DB_CUSTOM_DAT_LOOSE), attr)) + goto error; + + if (!string_list_append(name_list, msg_hash_to_str( + MENU_ENUM_LABEL_VALUE_SCAN_USE_DB_NONE), attr)) + goto error; + + return name_list; + +error: + if (name_list) + string_list_free(name_list); + return NULL; + +} + + +struct string_list *manual_content_scan_get_menu_scan_db_select_list( + const char *path_content_database, bool show_hidden_files) +{ + union string_list_elem_attr attr; + struct string_list *name_list = string_list_new(); + + /* Sanity check */ + if (!name_list) + return NULL; + + attr.i = 0; + + /* Add 'use content directory' entry */ + if (!string_list_append(name_list, msg_hash_to_str( + MENU_ENUM_LABEL_VALUE_SCAN_DB_SELECT_AUTO_ANY), attr)) + goto error; + + /* Add 'use custom' entry */ + if (!string_list_append(name_list, msg_hash_to_str( + MENU_ENUM_LABEL_VALUE_SCAN_DB_SELECT_AUTO_FIRST), attr)) + goto error; + +#ifdef HAVE_LIBRETRODB + /* If platform has database support, get names + * of all installed database files */ + { + /* Note: dir_list_new_special() is well behaved - the + * returned string list will only include database + * files (i.e. don't have to check for directories, + * or verify file extensions) */ + struct string_list *rdb_list = dir_list_new_special( + path_content_database, + DIR_LIST_DATABASES, NULL, show_hidden_files); + + if (rdb_list && rdb_list->size) + { + unsigned i; + + /* Ensure database list is in alphabetical order */ + dir_list_sort(rdb_list, true); + + /* Loop over database files */ + for (i = 0; i < rdb_list->size; i++) + { + char rdb_name[NAME_MAX_LENGTH]; + const char *rdb_path = rdb_list->elems[i].data; + /* Sanity check */ + if (string_is_empty(rdb_path)) + continue; + fill_pathname(rdb_name, path_basename(rdb_path), "", + sizeof(rdb_name)); + if (string_is_empty(rdb_name)) + continue; + /* Add database name to list */ + if (!string_list_append(name_list, rdb_name, attr)) + goto error; + } + } + + /* Clean up */ + string_list_free(rdb_list); + } + +#endif + + return name_list; + +error: + if (name_list) + string_list_free(name_list); + return NULL; +} + + /* Creates a list of all possible 'system name' menu * strings, for use in 'menu_displaylist' drop-down * lists and 'menu_cbs_left/right' diff --git a/manual_content_scan.h b/manual_content_scan.h index 99fdf2909093..486cb9f23d90 100644 --- a/manual_content_scan.h +++ b/manual_content_scan.h @@ -35,6 +35,12 @@ RETRO_BEGIN_DECLS +enum manual_content_scan_method +{ + MANUAL_CONTENT_SCAN_METHOD_AUTOMATIC = 0, + MANUAL_CONTENT_SCAN_METHOD_CUSTOM +}; + /* Defines all possible system name types * > Use content directory name * > Use custom name @@ -46,6 +52,24 @@ enum manual_content_scan_system_name_type MANUAL_CONTENT_SCAN_SYSTEM_NAME_DATABASE }; +/* Defines types of matching content to databases */ +enum manual_content_scan_db_usage +{ + MANUAL_CONTENT_SCAN_USE_DB_STRICT = 0, + MANUAL_CONTENT_SCAN_USE_DB_LOOSE, + MANUAL_CONTENT_SCAN_USE_DB_DAT_STRICT, + MANUAL_CONTENT_SCAN_USE_DB_DAT_LOOSE, + MANUAL_CONTENT_SCAN_USE_DB_NONE +}; + +/* Defines database selection types */ +enum manual_content_scan_db_selection +{ + MANUAL_CONTENT_SCAN_SELECT_DB_AUTO = 0, + MANUAL_CONTENT_SCAN_SELECT_DB_AUTO_FIRST_MATCH, + MANUAL_CONTENT_SCAN_SELECT_DB_SPECIFIC +}; + /* Defines all possible core name types * > Autodetect core (DETECT) * > Use manually set core */ @@ -113,6 +137,13 @@ typedef struct * 'content_dir' string */ char *manual_content_scan_get_content_dir_ptr(void); +unsigned manual_content_scan_get_scan_method_enum(void); +unsigned manual_content_scan_get_scan_use_db_enum(void); +unsigned manual_content_scan_get_scan_db_select_enum(void); + +char *manual_content_scan_get_scan_db_select_custom_ptr(void); +size_t *manual_content_scan_get_scan_db_select_custom_size(void); + /* Returns a pointer to the internal * 'system_name_custom' string */ char *manual_content_scan_get_system_name_custom_ptr(void); @@ -141,6 +172,8 @@ size_t manual_content_scan_get_dat_file_path_size(void); * 'search_recursively' bool */ bool *manual_content_scan_get_search_recursively_ptr(void); +bool *manual_content_scan_get_scan_single_file_ptr(void); +bool *manual_content_scan_get_omit_db_ref_ptr(void); /* Returns a pointer to the internal * 'search_archives' bool */ bool *manual_content_scan_get_search_archives_ptr(void); @@ -180,6 +213,16 @@ enum manual_content_scan_dat_file_path_status * Returns true if content directory is valid. */ bool manual_content_scan_set_menu_content_dir(const char *content_dir); +bool manual_content_scan_set_menu_scan_method( + enum manual_content_scan_method method); + +bool manual_content_scan_set_menu_scan_use_db( + enum manual_content_scan_db_usage usage); + +bool manual_content_scan_set_menu_scan_db_select( + enum manual_content_scan_db_selection select, + const char *db_name); + /* Sets system name for the next manual scan * operation. * Returns true if system name is valid. @@ -218,12 +261,17 @@ enum manual_content_scan_playlist_refresh_status * Returns true if content directory is valid. */ bool manual_content_scan_get_menu_content_dir(const char **content_dir); +bool manual_content_scan_get_menu_scan_method(const char **scan_method); +bool manual_content_scan_get_menu_scan_use_db(const char **scan_use_db); +bool manual_content_scan_get_menu_scan_db_select(const char **scan_db_select); + /* Fetches system name for the next manual scan operation. * Returns true if system name is valid. * NOTE: This corresponds to the 'System Name' value * displayed in menus - this is not identical to the * actual system name used when generating the playlist */ bool manual_content_scan_get_menu_system_name(const char **system_name); +unsigned manual_content_scan_get_menu_system_name_type(void); /* Fetches core name for the next manual scan operation. * Returns true if core name is valid. */ @@ -231,6 +279,11 @@ bool manual_content_scan_get_menu_core_name(const char **core_name); /* Menu utility functions */ +struct string_list *manual_content_scan_get_menu_scan_method_list(void); +struct string_list *manual_content_scan_get_menu_scan_use_db_list(void); +struct string_list *manual_content_scan_get_menu_scan_db_select_list( + const char *path_content_database, bool show_hidden_files); + /* Creates a list of all possible 'system name' menu * strings, for use in 'menu_displaylist' drop-down * lists and 'menu_cbs_left/right' diff --git a/menu/cbs/menu_cbs_deferred_push.c b/menu/cbs/menu_cbs_deferred_push.c index 2ae343e8799c..af1780cbf92c 100644 --- a/menu/cbs/menu_cbs_deferred_push.c +++ b/menu/cbs/menu_cbs_deferred_push.c @@ -646,6 +646,9 @@ GENERIC_DEFERRED_PUSH_GENERAL(deferred_push_dropdown_box_list_playlist_label_dis GENERIC_DEFERRED_PUSH_GENERAL(deferred_push_dropdown_box_list_playlist_right_thumbnail_mode, PUSH_DEFAULT, DISPLAYLIST_DROPDOWN_LIST_PLAYLIST_RIGHT_THUMBNAIL_MODE) GENERIC_DEFERRED_PUSH_GENERAL(deferred_push_dropdown_box_list_playlist_left_thumbnail_mode, PUSH_DEFAULT, DISPLAYLIST_DROPDOWN_LIST_PLAYLIST_LEFT_THUMBNAIL_MODE) GENERIC_DEFERRED_PUSH_GENERAL(deferred_push_dropdown_box_list_playlist_sort_mode, PUSH_DEFAULT, DISPLAYLIST_DROPDOWN_LIST_PLAYLIST_SORT_MODE) +GENERIC_DEFERRED_PUSH_GENERAL(deferred_push_dropdown_box_list_scan_method, PUSH_DEFAULT, DISPLAYLIST_DROPDOWN_LIST_SCAN_METHOD) +GENERIC_DEFERRED_PUSH_GENERAL(deferred_push_dropdown_box_list_scan_use_db, PUSH_DEFAULT, DISPLAYLIST_DROPDOWN_LIST_SCAN_USE_DB) +GENERIC_DEFERRED_PUSH_GENERAL(deferred_push_dropdown_box_list_scan_db_select, PUSH_DEFAULT, DISPLAYLIST_DROPDOWN_LIST_SCAN_DB_SELECT) GENERIC_DEFERRED_PUSH_GENERAL(deferred_push_dropdown_box_list_manual_content_scan_system_name, PUSH_DEFAULT, DISPLAYLIST_DROPDOWN_LIST_MANUAL_CONTENT_SCAN_SYSTEM_NAME) GENERIC_DEFERRED_PUSH_GENERAL(deferred_push_dropdown_box_list_manual_content_scan_core_name, PUSH_DEFAULT, DISPLAYLIST_DROPDOWN_LIST_MANUAL_CONTENT_SCAN_CORE_NAME) GENERIC_DEFERRED_PUSH_GENERAL(deferred_push_dropdown_box_list_disk_index, PUSH_DEFAULT, DISPLAYLIST_DROPDOWN_LIST_DISK_INDEX) @@ -832,6 +835,9 @@ static int menu_cbs_init_bind_deferred_push_compare_label( {MENU_ENUM_LABEL_DEFERRED_ACCOUNTS_TWITCH_LIST, deferred_push_accounts_twitch_list}, {MENU_ENUM_LABEL_DEFERRED_ACCOUNTS_FACEBOOK_LIST, deferred_push_accounts_facebook_list}, {MENU_ENUM_LABEL_DEFERRED_VIDEO_SHADER_PRESET_MANAGER_LIST, deferred_push_video_shader_preset_manager}, + {MENU_ENUM_LABEL_DEFERRED_DROPDOWN_BOX_LIST_SCAN_METHOD, deferred_push_dropdown_box_list_scan_method}, + {MENU_ENUM_LABEL_DEFERRED_DROPDOWN_BOX_LIST_SCAN_USE_DB, deferred_push_dropdown_box_list_scan_use_db}, + {MENU_ENUM_LABEL_DEFERRED_DROPDOWN_BOX_LIST_SCAN_DB_SELECT, deferred_push_dropdown_box_list_scan_db_select}, {MENU_ENUM_LABEL_DEFERRED_DROPDOWN_BOX_LIST_MANUAL_CONTENT_SCAN_SYSTEM_NAME, deferred_push_dropdown_box_list_manual_content_scan_system_name}, {MENU_ENUM_LABEL_DEFERRED_DROPDOWN_BOX_LIST_MANUAL_CONTENT_SCAN_CORE_NAME, deferred_push_dropdown_box_list_manual_content_scan_core_name}, {MENU_ENUM_LABEL_DEFERRED_RECORDING_SETTINGS_LIST, deferred_push_recording_settings_list}, diff --git a/menu/cbs/menu_cbs_get_value.c b/menu/cbs/menu_cbs_get_value.c index f8218150d6b0..8ad00a03a547 100644 --- a/menu/cbs/menu_cbs_get_value.c +++ b/menu/cbs/menu_cbs_get_value.c @@ -1721,6 +1721,69 @@ static size_t menu_action_setting_disp_set_label_manual_content_scan_dir( return 0; } +static size_t menu_action_setting_disp_set_label_scan_method( + file_list_t* list, + unsigned *w, unsigned type, unsigned i, + const char *label, + char *s, size_t len, + const char *path, + char *s2, size_t len2) +{ + const char *tmp = NULL; + + *w = 19; + + if (!string_is_empty(path)) + strlcpy(s2, path, len2); + + if (manual_content_scan_get_menu_scan_method(&tmp)) + return strlcpy(s, tmp, len); + *s = '\0'; + return 0; +} + +static size_t menu_action_setting_disp_set_label_scan_use_db( + file_list_t* list, + unsigned *w, unsigned type, unsigned i, + const char *label, + char *s, size_t len, + const char *path, + char *s2, size_t len2) +{ + const char *tmp = NULL; + + *w = 19; + + if (!string_is_empty(path)) + strlcpy(s2, path, len2); + + if (manual_content_scan_get_menu_scan_use_db(&tmp)) + return strlcpy(s, tmp, len); + *s = '\0'; + return 0; +} + +static size_t menu_action_setting_disp_set_label_scan_db_select( + file_list_t* list, + unsigned *w, unsigned type, unsigned i, + const char *label, + char *s, size_t len, + const char *path, + char *s2, size_t len2) +{ + const char *tmp = NULL; + + *w = 19; + + if (!string_is_empty(path)) + strlcpy(s2, path, len2); + + if (manual_content_scan_get_menu_scan_db_select(&tmp)) + return strlcpy(s, tmp, len); + *s = '\0'; + return 0; +} + static size_t menu_action_setting_disp_set_label_manual_content_scan_system_name( file_list_t* list, unsigned *w, unsigned type, unsigned i, @@ -2065,6 +2128,18 @@ static int menu_cbs_init_bind_get_string_representation_compare_label( BIND_ACTION_GET_VALUE(cbs, menu_action_setting_disp_set_label_manual_content_scan_dir); break; + case MENU_ENUM_LABEL_SCAN_METHOD: + BIND_ACTION_GET_VALUE(cbs, + menu_action_setting_disp_set_label_scan_method); + break; + case MENU_ENUM_LABEL_SCAN_USE_DB: + BIND_ACTION_GET_VALUE(cbs, + menu_action_setting_disp_set_label_scan_use_db); + break; + case MENU_ENUM_LABEL_SCAN_DB_SELECT: + BIND_ACTION_GET_VALUE(cbs, + menu_action_setting_disp_set_label_scan_db_select); + break; case MENU_ENUM_LABEL_MANUAL_CONTENT_SCAN_SYSTEM_NAME: BIND_ACTION_GET_VALUE(cbs, menu_action_setting_disp_set_label_manual_content_scan_system_name); diff --git a/menu/cbs/menu_cbs_left.c b/menu/cbs/menu_cbs_left.c index afd6de0edf51..815033b657cf 100644 --- a/menu/cbs/menu_cbs_left.c +++ b/menu/cbs/menu_cbs_left.c @@ -549,6 +549,172 @@ static int playlist_sort_mode_left(unsigned type, const char *label, return 0; } +static int scan_method_left( + unsigned type, const char *label, + bool wraparound) +{ + struct string_list *scan_method_list = + manual_content_scan_get_menu_scan_method_list(); + + const char *current_scan_method = NULL; + const char *next_scan_method = NULL; + unsigned current_index = 0; + unsigned next_index = 0; + unsigned i; + struct menu_state *menu_st = menu_state_get_ptr(); + + if (!scan_method_list) + return -1; + + if (manual_content_scan_get_menu_scan_method(¤t_scan_method)) + { + /* Get index of currently selected system name */ + for (i = 0; i < scan_method_list->size; i++) + { + const char *scan_method = scan_method_list->elems[i].data; + + if (string_is_equal(current_scan_method, scan_method)) + { + current_index = i; + break; + } + } + + /* Decrement index */ + if (current_index > 0) + next_index = current_index - 1; + else if (wraparound && (scan_method_list->size > 1)) + next_index = (unsigned)(scan_method_list->size - 1); + } + + /* Set system name */ + manual_content_scan_set_menu_scan_method(next_index); + menu_st->flags |= MENU_ST_FLAG_ENTRIES_NEED_REFRESH; + /* Clean up */ + string_list_free(scan_method_list); + + return 0; +} + +static int scan_use_db_left( + unsigned type, const char *label, + bool wraparound) +{ + struct string_list *scan_use_db_list = + manual_content_scan_get_menu_scan_use_db_list(); + + const char *current_scan_use_db = NULL; + const char *next_scan_use_db = NULL; + unsigned current_index = 0; + unsigned next_index = 0; + unsigned i; + struct menu_state *menu_st = menu_state_get_ptr(); + + if (!scan_use_db_list) + return -1; + + if (manual_content_scan_get_menu_scan_use_db(¤t_scan_use_db)) + { + /* Get index of currently selected system name */ + for (i = 0; i < scan_use_db_list->size; i++) + { + const char *scan_use_db = scan_use_db_list->elems[i].data; + + if (string_is_equal(current_scan_use_db, scan_use_db)) + { + current_index = i; + break; + } + } + + /* Decrement index */ + if (current_index > 0) + next_index = current_index - 1; + else if (wraparound && (scan_use_db_list->size > 1)) + next_index = (unsigned)(scan_use_db_list->size - 1); + } + + /* Set system name */ + manual_content_scan_set_menu_scan_use_db(next_index); + menu_st->flags |= MENU_ST_FLAG_ENTRIES_NEED_REFRESH; + /* Clean up */ + string_list_free(scan_use_db_list); + + return 0; +} + +static int manual_content_scan_db_select_left(unsigned type, const char *label, + bool wraparound) +{ + settings_t *settings = config_get_ptr(); + bool show_hidden_files = settings->bools.show_hidden_files; +#ifdef HAVE_LIBRETRODB + const char *path_content_database = settings->paths.path_content_database; + struct string_list *system_name_list = + manual_content_scan_get_menu_scan_db_select_list( + path_content_database, + show_hidden_files); +#else + struct string_list *system_name_list = + manual_content_scan_get_menu_scan_db_select_list(NULL, + show_hidden_files); +#endif + const char *current_system_name = NULL; + enum manual_content_scan_db_selection next_db_select = + MANUAL_CONTENT_SCAN_SELECT_DB_AUTO; + const char *next_system_name = NULL; + unsigned current_index = 0; + unsigned next_index = 0; + unsigned i; + struct menu_state *menu_st = menu_state_get_ptr(); + + if (!system_name_list) + return -1; + + /* Get currently selected system name */ + if (manual_content_scan_get_menu_scan_db_select(¤t_system_name)) + { + /* Get index of currently selected system name */ + for (i = 0; i < system_name_list->size; i++) + { + const char *system_name = system_name_list->elems[i].data; + + if (string_is_equal(current_system_name, system_name)) + { + current_index = i; + break; + } + } + + /* Decrement index */ + if (current_index > 0) + next_index = current_index - 1; + else if (wraparound && (system_name_list->size > 1)) + next_index = (unsigned)(system_name_list->size - 1); + + } + + /* Get new system name parameters */ + if (next_index == (unsigned)MANUAL_CONTENT_SCAN_SELECT_DB_AUTO) + next_db_select = MANUAL_CONTENT_SCAN_SELECT_DB_AUTO; + else if (next_index == (unsigned)MANUAL_CONTENT_SCAN_SELECT_DB_AUTO_FIRST_MATCH) + next_db_select = MANUAL_CONTENT_SCAN_SELECT_DB_AUTO_FIRST_MATCH; + else + next_db_select = MANUAL_CONTENT_SCAN_SELECT_DB_SPECIFIC; + + next_system_name = system_name_list->elems[next_index].data; + + /* Set system name */ + manual_content_scan_set_menu_scan_db_select( + next_db_select, next_system_name); + menu_st->flags |= MENU_ST_FLAG_ENTRIES_NEED_REFRESH; + + /* Clean up */ + string_list_free(system_name_list); + + return 0; +} + static int manual_content_scan_system_name_left( unsigned type, const char *label, bool wraparound) @@ -1077,6 +1243,15 @@ static int menu_cbs_init_bind_left_compare_label(menu_file_list_cbs_t *cbs, case MENU_ENUM_LABEL_PLAYLIST_MANAGER_SORT_MODE: BIND_ACTION_LEFT(cbs, playlist_sort_mode_left); break; + case MENU_ENUM_LABEL_SCAN_METHOD: + BIND_ACTION_LEFT(cbs, scan_method_left); + break; + case MENU_ENUM_LABEL_SCAN_USE_DB: + BIND_ACTION_LEFT(cbs, scan_use_db_left); + break; + case MENU_ENUM_LABEL_SCAN_DB_SELECT: + BIND_ACTION_LEFT(cbs, manual_content_scan_db_select_left); + break; case MENU_ENUM_LABEL_MANUAL_CONTENT_SCAN_SYSTEM_NAME: BIND_ACTION_LEFT(cbs, manual_content_scan_system_name_left); break; diff --git a/menu/cbs/menu_cbs_ok.c b/menu/cbs/menu_cbs_ok.c index 05b8bd8d24e4..b422606c328a 100644 --- a/menu/cbs/menu_cbs_ok.c +++ b/menu/cbs/menu_cbs_ok.c @@ -286,6 +286,12 @@ static enum msg_hash_enums action_ok_dl_to_enum(unsigned lbl) return MENU_ENUM_LABEL_DEFERRED_DROPDOWN_BOX_LIST_PLAYLIST_LEFT_THUMBNAIL_MODE; case ACTION_OK_DL_DROPDOWN_BOX_LIST_PLAYLIST_SORT_MODE: return MENU_ENUM_LABEL_DEFERRED_DROPDOWN_BOX_LIST_PLAYLIST_SORT_MODE; + case ACTION_OK_DL_DROPDOWN_BOX_LIST_SCAN_METHOD: + return MENU_ENUM_LABEL_DEFERRED_DROPDOWN_BOX_LIST_SCAN_METHOD; + case ACTION_OK_DL_DROPDOWN_BOX_LIST_SCAN_USE_DB: + return MENU_ENUM_LABEL_DEFERRED_DROPDOWN_BOX_LIST_SCAN_USE_DB; + case ACTION_OK_DL_DROPDOWN_BOX_LIST_SCAN_DB_SELECT: + return MENU_ENUM_LABEL_DEFERRED_DROPDOWN_BOX_LIST_SCAN_DB_SELECT; case ACTION_OK_DL_DROPDOWN_BOX_LIST_MANUAL_CONTENT_SCAN_SYSTEM_NAME: return MENU_ENUM_LABEL_DEFERRED_DROPDOWN_BOX_LIST_MANUAL_CONTENT_SCAN_SYSTEM_NAME; case ACTION_OK_DL_DROPDOWN_BOX_LIST_MANUAL_CONTENT_SCAN_CORE_NAME: @@ -873,6 +879,33 @@ int generic_action_ok_displaylist_push( info.enum_idx = MENU_ENUM_LABEL_DEFERRED_DROPDOWN_BOX_LIST_PLAYLIST_SORT_MODE; dl_type = DISPLAYLIST_GENERIC; break; + case ACTION_OK_DL_DROPDOWN_BOX_LIST_SCAN_METHOD: + info.type = type; + info.directory_ptr = idx; + info_path = path; + info_label = msg_hash_to_str( + MENU_ENUM_LABEL_DEFERRED_DROPDOWN_BOX_LIST_SCAN_METHOD); + info.enum_idx = MENU_ENUM_LABEL_DEFERRED_DROPDOWN_BOX_LIST_SCAN_METHOD; + dl_type = DISPLAYLIST_GENERIC; + break; + case ACTION_OK_DL_DROPDOWN_BOX_LIST_SCAN_USE_DB: + info.type = type; + info.directory_ptr = idx; + info_path = path; + info_label = msg_hash_to_str( + MENU_ENUM_LABEL_DEFERRED_DROPDOWN_BOX_LIST_SCAN_USE_DB); + info.enum_idx = MENU_ENUM_LABEL_DEFERRED_DROPDOWN_BOX_LIST_SCAN_USE_DB; + dl_type = DISPLAYLIST_GENERIC; + break; + case ACTION_OK_DL_DROPDOWN_BOX_LIST_SCAN_DB_SELECT: + info.type = type; + info.directory_ptr = idx; + info_path = path; + info_label = msg_hash_to_str( + MENU_ENUM_LABEL_DEFERRED_DROPDOWN_BOX_LIST_SCAN_DB_SELECT); + info.enum_idx = MENU_ENUM_LABEL_DEFERRED_DROPDOWN_BOX_LIST_SCAN_DB_SELECT; + dl_type = DISPLAYLIST_GENERIC; + break; case ACTION_OK_DL_DROPDOWN_BOX_LIST_MANUAL_CONTENT_SCAN_SYSTEM_NAME: info.type = type; info.directory_ptr = idx; @@ -7468,6 +7501,33 @@ static int action_ok_push_dropdown_item_playlist_sort_mode( return action_cancel_pop_default(NULL, NULL, 0, 0); } +static int action_ok_push_dropdown_item_scan_method( + const char *path, + const char *label, unsigned type, size_t idx, size_t entry_idx) +{ + manual_content_scan_set_menu_scan_method(idx); + + return action_cancel_pop_default(NULL, NULL, 0, 0); +} + +static int action_ok_push_dropdown_item_scan_use_db( + const char *path, + const char *label, unsigned type, size_t idx, size_t entry_idx) +{ + manual_content_scan_set_menu_scan_use_db(idx); + + return action_cancel_pop_default(NULL, NULL, 0, 0); +} + +static int action_ok_push_dropdown_item_scan_db_select( + const char *path, + const char *label, unsigned type, size_t idx, size_t entry_idx) +{ + manual_content_scan_set_menu_scan_db_select(idx, path); + + return action_cancel_pop_default(NULL, NULL, 0, 0); +} + static int action_ok_push_dropdown_item_manual_content_scan_system_name( const char *path, const char *label, unsigned type, size_t idx, size_t entry_idx) @@ -8172,6 +8232,27 @@ static int action_ok_shader_preset_parameter_dropdown_box_list( ACTION_OK_DL_DROPDOWN_BOX_LIST_SHADER_PRESET_PARAMETER); } +static int action_ok_scan_method(const char *path, + const char *label, unsigned type, size_t idx, size_t entry_idx) +{ + return generic_dropdown_box_list(idx, + ACTION_OK_DL_DROPDOWN_BOX_LIST_SCAN_METHOD); +} + +static int action_ok_scan_use_db(const char *path, + const char *label, unsigned type, size_t idx, size_t entry_idx) +{ + return generic_dropdown_box_list(idx, + ACTION_OK_DL_DROPDOWN_BOX_LIST_SCAN_USE_DB); +} + +static int action_ok_scan_db_select(const char *path, + const char *label, unsigned type, size_t idx, size_t entry_idx) +{ + return generic_dropdown_box_list(idx, + ACTION_OK_DL_DROPDOWN_BOX_LIST_SCAN_DB_SELECT); +} + static int action_ok_manual_content_scan_system_name(const char *path, const char *label, unsigned type, size_t idx, size_t entry_idx) { @@ -9244,6 +9325,9 @@ static int menu_cbs_init_bind_ok_compare_label(menu_file_list_cbs_t *cbs, {MENU_ENUM_LABEL_AUDIO_SETTINGS, action_ok_push_audio_settings_list}, {MENU_ENUM_LABEL_AUDIO_SYNCHRONIZATION_SETTINGS, action_ok_push_audio_synchronization_settings_list}, {MENU_ENUM_LABEL_MANUAL_CONTENT_SCAN_DIR, action_ok_push_manual_content_scan_dir_select}, + {MENU_ENUM_LABEL_SCAN_METHOD, action_ok_scan_method}, + {MENU_ENUM_LABEL_SCAN_USE_DB, action_ok_scan_use_db}, + {MENU_ENUM_LABEL_SCAN_DB_SELECT, action_ok_scan_db_select}, {MENU_ENUM_LABEL_MANUAL_CONTENT_SCAN_SYSTEM_NAME, action_ok_manual_content_scan_system_name}, {MENU_ENUM_LABEL_MANUAL_CONTENT_SCAN_CORE_NAME, action_ok_manual_content_scan_core_name}, {MENU_ENUM_LABEL_VIDEO_SHADER_NUM_PASSES, action_ok_video_shader_num_passes_dropdown_box_list}, @@ -9659,6 +9743,15 @@ static int menu_cbs_init_bind_ok_compare_type(menu_file_list_cbs_t *cbs, case MENU_SETTING_DROPDOWN_ITEM_PLAYLIST_SORT_MODE: BIND_ACTION_OK(cbs, action_ok_push_dropdown_item_playlist_sort_mode); break; + case MENU_SETTING_DROPDOWN_ITEM_SCAN_METHOD: + BIND_ACTION_OK(cbs, action_ok_push_dropdown_item_scan_method); + break; + case MENU_SETTING_DROPDOWN_ITEM_SCAN_USE_DB: + BIND_ACTION_OK(cbs, action_ok_push_dropdown_item_scan_use_db); + break; + case MENU_SETTING_DROPDOWN_ITEM_SCAN_DB_SELECT: + BIND_ACTION_OK(cbs, action_ok_push_dropdown_item_scan_db_select); + break; case MENU_SETTING_DROPDOWN_ITEM_MANUAL_CONTENT_SCAN_SYSTEM_NAME: BIND_ACTION_OK(cbs, action_ok_push_dropdown_item_manual_content_scan_system_name); break; diff --git a/menu/cbs/menu_cbs_right.c b/menu/cbs/menu_cbs_right.c index 775a295d51b9..2cdf74e33fb3 100644 --- a/menu/cbs/menu_cbs_right.c +++ b/menu/cbs/menu_cbs_right.c @@ -664,6 +664,182 @@ static int playlist_sort_mode_right(unsigned type, const char *label, return 0; } +static int scan_method_right( + unsigned type, const char *label, + bool wraparound) +{ + struct string_list *scan_method_list = + manual_content_scan_get_menu_scan_method_list(); + + const char *current_scan_method = NULL; + enum manual_content_scan_system_name_type next_system_name_type = + MANUAL_CONTENT_SCAN_SYSTEM_NAME_DATABASE; + const char *next_scan_method = NULL; + unsigned current_index = 0; + unsigned next_index = 0; + unsigned i; + struct menu_state *menu_st = menu_state_get_ptr(); + + if (!scan_method_list) + return -1; + + if (manual_content_scan_get_menu_scan_method(¤t_scan_method)) + { + /* Get index of currently selected system name */ + for (i = 0; i < scan_method_list->size; i++) + { + const char *scan_method = scan_method_list->elems[i].data; + + if (string_is_equal(current_scan_method, scan_method)) + { + current_index = i; + break; + } + } + + /* Increment index */ + next_index = current_index + 1; + if (next_index >= scan_method_list->size) + { + next_index = 0; + if (!wraparound && scan_method_list->size > 0) + next_index = (unsigned)(scan_method_list->size - 1); + } + + } + + /* Set system name */ + manual_content_scan_set_menu_scan_method(next_index); + menu_st->flags |= MENU_ST_FLAG_ENTRIES_NEED_REFRESH; + /* Clean up */ + string_list_free(scan_method_list); + + return 0; +} + +static int scan_use_db_right( + unsigned type, const char *label, + bool wraparound) +{ + struct string_list *scan_use_db_list = + manual_content_scan_get_menu_scan_use_db_list(); + + const char *current_scan_use_db = NULL; + const char *next_scan_use_db = NULL; + unsigned current_index = 0; + unsigned next_index = 0; + unsigned i; + struct menu_state *menu_st = menu_state_get_ptr(); + + if (!scan_use_db_list) + return -1; + + if (manual_content_scan_get_menu_scan_use_db(¤t_scan_use_db)) + { + /* Get index of currently selected system name */ + for (i = 0; i < scan_use_db_list->size; i++) + { + const char *scan_use_db = scan_use_db_list->elems[i].data; + + if (string_is_equal(current_scan_use_db, scan_use_db)) + { + current_index = i; + break; + } + } + + next_index = current_index + 1; + if (next_index >= scan_use_db_list->size) + { + next_index = 0; + if (!wraparound && scan_use_db_list->size > 0) + next_index = (unsigned)(scan_use_db_list->size - 1); + } + } + + /* Set system name */ + manual_content_scan_set_menu_scan_use_db(next_index); + menu_st->flags |= MENU_ST_FLAG_ENTRIES_NEED_REFRESH; + /* Clean up */ + string_list_free(scan_use_db_list); + + return 0; +} + +static int manual_content_scan_db_select_right(unsigned type, const char *label, + bool wraparound) +{ + settings_t *settings = config_get_ptr(); + bool show_hidden_files = settings->bools.show_hidden_files; +#ifdef HAVE_LIBRETRODB + const char *path_content_database = settings->paths.path_content_database; + struct string_list *system_name_list = + manual_content_scan_get_menu_scan_db_select_list( + path_content_database, + show_hidden_files); +#else + struct string_list *system_name_list = + manual_content_scan_get_menu_scan_db_select_list(NULL, + show_hidden_files); +#endif + const char *current_system_name = NULL; + enum manual_content_scan_db_selection next_db_select = + MANUAL_CONTENT_SCAN_SELECT_DB_AUTO; + const char *next_system_name = NULL; + unsigned current_index = 0; + unsigned next_index = 0; + unsigned i; + struct menu_state *menu_st = menu_state_get_ptr(); + + if (!system_name_list) + return -1; + + /* Get currently selected system name */ + if (manual_content_scan_get_menu_scan_db_select(¤t_system_name)) + { + /* Get index of currently selected system name */ + for (i = 0; i < system_name_list->size; i++) + { + const char *system_name = system_name_list->elems[i].data; + + if (string_is_equal(current_system_name, system_name)) + { + current_index = i; + break; + } + } + + /* Increment index */ + next_index = current_index + 1; + if (next_index >= system_name_list->size) + { + next_index = 0; + if (!wraparound && system_name_list->size > 0) + next_index = (unsigned)(system_name_list->size - 1); + } + } + + /* Get new system name parameters */ + if (next_index == (unsigned)MANUAL_CONTENT_SCAN_SELECT_DB_AUTO) + next_db_select = MANUAL_CONTENT_SCAN_SELECT_DB_AUTO; + else if (next_index == (unsigned)MANUAL_CONTENT_SCAN_SELECT_DB_AUTO_FIRST_MATCH) + next_db_select = MANUAL_CONTENT_SCAN_SELECT_DB_AUTO_FIRST_MATCH; + else + next_db_select = MANUAL_CONTENT_SCAN_SELECT_DB_SPECIFIC; + + next_system_name = system_name_list->elems[next_index].data; + + /* Set system name */ + manual_content_scan_set_menu_scan_db_select( + next_db_select, next_system_name); + menu_st->flags |= MENU_ST_FLAG_ENTRIES_NEED_REFRESH; + + /* Clean up */ + string_list_free(system_name_list); + + return 0; +} + static int manual_content_scan_system_name_right(unsigned type, const char *label, bool wraparound) { @@ -1219,6 +1395,15 @@ static int menu_cbs_init_bind_right_compare_label(menu_file_list_cbs_t *cbs, case MENU_ENUM_LABEL_PLAYLIST_MANAGER_SORT_MODE: BIND_ACTION_RIGHT(cbs, playlist_sort_mode_right); break; + case MENU_ENUM_LABEL_SCAN_METHOD: + BIND_ACTION_RIGHT(cbs, scan_method_right); + break; + case MENU_ENUM_LABEL_SCAN_USE_DB: + BIND_ACTION_RIGHT(cbs, scan_use_db_right); + break; + case MENU_ENUM_LABEL_SCAN_DB_SELECT: + BIND_ACTION_RIGHT(cbs, manual_content_scan_db_select_right); + break; case MENU_ENUM_LABEL_MANUAL_CONTENT_SCAN_SYSTEM_NAME: BIND_ACTION_RIGHT(cbs, manual_content_scan_system_name_right); break; diff --git a/menu/cbs/menu_cbs_start.c b/menu/cbs/menu_cbs_start.c index c5b0b5f54acf..a335277ef743 100644 --- a/menu/cbs/menu_cbs_start.c +++ b/menu/cbs/menu_cbs_start.c @@ -549,6 +549,36 @@ static int action_start_manual_content_scan_dir( return 0; } +static int action_start_scan_method( + const char *path, const char *label, + unsigned type, size_t idx, size_t entry_idx) +{ + struct menu_state *menu_st = menu_state_get_ptr(); + manual_content_scan_set_menu_scan_method(0); + menu_st->flags |= MENU_ST_FLAG_ENTRIES_NEED_REFRESH; + return 0; +} + +static int action_start_scan_use_db( + const char *path, const char *label, + unsigned type, size_t idx, size_t entry_idx) +{ + struct menu_state *menu_st = menu_state_get_ptr(); + manual_content_scan_set_menu_scan_use_db(0); + menu_st->flags |= MENU_ST_FLAG_ENTRIES_NEED_REFRESH; + return 0; +} + +static int action_start_scan_db_select( + const char *path, const char *label, + unsigned type, size_t idx, size_t entry_idx) +{ + struct menu_state *menu_st = menu_state_get_ptr(); + manual_content_scan_set_menu_scan_db_select(0,""); + menu_st->flags |= MENU_ST_FLAG_ENTRIES_NEED_REFRESH; + return 0; +} + static int action_start_manual_content_scan_system_name( const char *path, const char *label, unsigned type, size_t idx, size_t entry_idx) @@ -901,6 +931,15 @@ static int menu_cbs_init_bind_start_compare_label(menu_file_list_cbs_t *cbs) case MENU_ENUM_LABEL_MANUAL_CONTENT_SCAN_DIR: BIND_ACTION_START(cbs, action_start_manual_content_scan_dir); break; + case MENU_ENUM_LABEL_SCAN_METHOD: + BIND_ACTION_START(cbs, action_start_scan_method); + break; + case MENU_ENUM_LABEL_SCAN_USE_DB: + BIND_ACTION_START(cbs, action_start_scan_use_db); + break; + case MENU_ENUM_LABEL_SCAN_DB_SELECT: + BIND_ACTION_START(cbs, action_start_scan_db_select); + break; case MENU_ENUM_LABEL_MANUAL_CONTENT_SCAN_SYSTEM_NAME: BIND_ACTION_START(cbs, action_start_manual_content_scan_system_name); break; diff --git a/menu/cbs/menu_cbs_sublabel.c b/menu/cbs/menu_cbs_sublabel.c index a8e81986ab81..93a9bb69656d 100644 --- a/menu/cbs/menu_cbs_sublabel.c +++ b/menu/cbs/menu_cbs_sublabel.c @@ -996,6 +996,12 @@ DEFAULT_SUBLABEL_MACRO(action_bind_sublabel_netplay_kick, DEFAULT_SUBLABEL_MACRO(action_bind_sublabel_netplay_ban, MENU_ENUM_SUBLABEL_NETPLAY_BAN) DEFAULT_SUBLABEL_MACRO(action_bind_sublabel_scan_file, MENU_ENUM_SUBLABEL_SCAN_FILE) DEFAULT_SUBLABEL_MACRO(action_bind_sublabel_scan_directory, MENU_ENUM_SUBLABEL_SCAN_DIRECTORY) +DEFAULT_SUBLABEL_MACRO(action_bind_sublabel_scan_method, MENU_ENUM_SUBLABEL_SCAN_METHOD) +DEFAULT_SUBLABEL_MACRO(action_bind_sublabel_scan_use_db, MENU_ENUM_SUBLABEL_SCAN_USE_DB) +DEFAULT_SUBLABEL_MACRO(action_bind_sublabel_scan_db_select, MENU_ENUM_SUBLABEL_SCAN_DB_SELECT) +DEFAULT_SUBLABEL_MACRO(action_bind_sublabel_scan_target_playlist, MENU_ENUM_SUBLABEL_SCAN_TARGET_PLAYLIST) +DEFAULT_SUBLABEL_MACRO(action_bind_sublabel_scan_single_file, MENU_ENUM_SUBLABEL_SCAN_SINGLE_FILE) +DEFAULT_SUBLABEL_MACRO(action_bind_sublabel_scan_omit_db_ref, MENU_ENUM_SUBLABEL_SCAN_OMIT_DB_REF) DEFAULT_SUBLABEL_MACRO(action_bind_sublabel_video_swap_interval, MENU_ENUM_SUBLABEL_VIDEO_SWAP_INTERVAL) DEFAULT_SUBLABEL_MACRO(action_bind_sublabel_sort_savefiles_enable, MENU_ENUM_SUBLABEL_SORT_SAVEFILES_ENABLE) DEFAULT_SUBLABEL_MACRO(action_bind_sublabel_sort_savestates_enable, MENU_ENUM_SUBLABEL_SORT_SAVESTATES_ENABLE) @@ -3750,6 +3756,24 @@ int menu_cbs_init_bind_sublabel(menu_file_list_cbs_t *cbs, case MENU_ENUM_LABEL_SCAN_DIRECTORY: BIND_ACTION_SUBLABEL(cbs, action_bind_sublabel_scan_directory); break; + case MENU_ENUM_LABEL_SCAN_METHOD: + BIND_ACTION_SUBLABEL(cbs, action_bind_sublabel_scan_method); + break; + case MENU_ENUM_LABEL_SCAN_USE_DB: + BIND_ACTION_SUBLABEL(cbs, action_bind_sublabel_scan_use_db); + break; + case MENU_ENUM_LABEL_SCAN_DB_SELECT: + BIND_ACTION_SUBLABEL(cbs, action_bind_sublabel_scan_db_select); + break; + case MENU_ENUM_LABEL_SCAN_TARGET_PLAYLIST: + BIND_ACTION_SUBLABEL(cbs, action_bind_sublabel_scan_target_playlist); + break; + case MENU_ENUM_LABEL_SCAN_SINGLE_FILE: + BIND_ACTION_SUBLABEL(cbs, action_bind_sublabel_scan_single_file); + break; + case MENU_ENUM_LABEL_SCAN_OMIT_DB_REF: + BIND_ACTION_SUBLABEL(cbs, action_bind_sublabel_scan_omit_db_ref); + break; case MENU_ENUM_LABEL_NETPLAY_KICK: BIND_ACTION_SUBLABEL(cbs, action_bind_sublabel_netplay_kick); break; diff --git a/menu/cbs/menu_cbs_title.c b/menu/cbs/menu_cbs_title.c index 85caddec337b..bcbf6123e312 100644 --- a/menu/cbs/menu_cbs_title.c +++ b/menu/cbs/menu_cbs_title.c @@ -726,6 +726,9 @@ DEFAULT_TITLE_MACRO(action_get_title_dropdown_playlist_default_core_item, MENU_E DEFAULT_TITLE_MACRO(action_get_title_dropdown_playlist_label_display_mode_item, MENU_ENUM_LABEL_VALUE_PLAYLIST_MANAGER_LABEL_DISPLAY_MODE) DEFAULT_TITLE_MACRO(action_get_title_dropdown_playlist_sort_mode_item, MENU_ENUM_LABEL_VALUE_PLAYLIST_MANAGER_SORT_MODE) DEFAULT_TITLE_MACRO(action_get_title_manual_content_scan_list, MENU_ENUM_LABEL_VALUE_MANUAL_CONTENT_SCAN_LIST) +DEFAULT_TITLE_MACRO(action_get_title_dropdown_scan_method_item, MENU_ENUM_LABEL_VALUE_SCAN_METHOD) +DEFAULT_TITLE_MACRO(action_get_title_dropdown_scan_use_db_item, MENU_ENUM_LABEL_VALUE_SCAN_USE_DB) +DEFAULT_TITLE_MACRO(action_get_title_dropdown_scan_db_select_item, MENU_ENUM_LABEL_VALUE_SCAN_DB_SELECT) DEFAULT_TITLE_MACRO(action_get_title_dropdown_manual_content_scan_system_name_item, MENU_ENUM_LABEL_VALUE_MANUAL_CONTENT_SCAN_SYSTEM_NAME) DEFAULT_TITLE_MACRO(action_get_title_dropdown_manual_content_scan_core_name_item, MENU_ENUM_LABEL_VALUE_MANUAL_CONTENT_SCAN_CORE_NAME) DEFAULT_TITLE_MACRO(action_get_title_dropdown_disk_index, MENU_ENUM_LABEL_VALUE_DISK_INDEX) @@ -775,6 +778,9 @@ DEFAULT_FILL_TITLE_MACRO(action_get_title_xmb_font, MENU_ENUM_LABE DEFAULT_FILL_TITLE_MACRO(action_get_title_ozone_font, MENU_ENUM_LABEL_VALUE_OZONE_FONT) DEFAULT_FILL_TITLE_MACRO(action_get_title_log_dir, MENU_ENUM_LABEL_VALUE_LOG_DIR) DEFAULT_FILL_TITLE_MACRO(action_get_title_manual_content_scan_dir, MENU_ENUM_LABEL_VALUE_MANUAL_CONTENT_SCAN_DIR) +DEFAULT_FILL_TITLE_MACRO(action_get_title_scan_method, MENU_ENUM_LABEL_VALUE_SCAN_METHOD) +DEFAULT_FILL_TITLE_MACRO(action_get_title_scan_use_db, MENU_ENUM_LABEL_VALUE_SCAN_USE_DB) +DEFAULT_FILL_TITLE_MACRO(action_get_title_scan_db_select, MENU_ENUM_LABEL_VALUE_SCAN_DB_SELECT) DEFAULT_TITLE_COPY_MACRO(action_get_title_help, MENU_ENUM_LABEL_VALUE_HELP_LIST) DEFAULT_TITLE_COPY_MACRO(action_get_title_input_settings, MENU_ENUM_LABEL_VALUE_INPUT_SETTINGS) @@ -1320,6 +1326,12 @@ static int menu_cbs_init_bind_title_compare_label(menu_file_list_cbs_t *cbs, #endif {MENU_ENUM_LABEL_DEFERRED_MANUAL_CONTENT_SCAN_LIST, action_get_title_manual_content_scan_list}, + {MENU_ENUM_LABEL_SCAN_METHOD, + action_get_title_scan_method}, + {MENU_ENUM_LABEL_SCAN_USE_DB, + action_get_title_scan_use_db}, + {MENU_ENUM_LABEL_SCAN_DB_SELECT, + action_get_title_scan_db_select}, {MENU_ENUM_LABEL_MANUAL_CONTENT_SCAN_DIR, action_get_title_manual_content_scan_dir}, {MENU_ENUM_LABEL_DEFERRED_CURSOR_MANAGER_LIST_RDB_ENTRY_ELSPA_RATING, @@ -1775,6 +1787,15 @@ static int menu_cbs_init_bind_title_compare_label(menu_file_list_cbs_t *cbs, case MENU_ENUM_LABEL_MANUAL_CONTENT_SCAN_LIST: BIND_ACTION_GET_TITLE(cbs, action_get_title_manual_content_scan_list); break; + case MENU_ENUM_LABEL_SCAN_METHOD: + BIND_ACTION_GET_TITLE(cbs, action_get_title_scan_method); + break; + case MENU_ENUM_LABEL_SCAN_USE_DB: + BIND_ACTION_GET_TITLE(cbs, action_get_title_scan_use_db); + break; + case MENU_ENUM_LABEL_SCAN_DB_SELECT: + BIND_ACTION_GET_TITLE(cbs, action_get_title_scan_db_select); + break; case MENU_ENUM_LABEL_MANUAL_CONTENT_SCAN_DIR: BIND_ACTION_GET_TITLE(cbs, action_get_title_manual_content_scan_dir); break; @@ -1854,6 +1875,9 @@ int menu_cbs_init_bind_title(menu_file_list_cbs_t *cbs, {MENU_ENUM_LABEL_DEFERRED_DROPDOWN_BOX_LIST_PLAYLIST_RIGHT_THUMBNAIL_MODE, action_get_title_thumbnails}, {MENU_ENUM_LABEL_DEFERRED_DROPDOWN_BOX_LIST_PLAYLIST_LEFT_THUMBNAIL_MODE, action_get_title_left_thumbnails}, {MENU_ENUM_LABEL_DEFERRED_DROPDOWN_BOX_LIST_PLAYLIST_ICON_THUMBNAIL_MODE, action_get_title_icon_thumbnails}, + {MENU_ENUM_LABEL_DEFERRED_DROPDOWN_BOX_LIST_SCAN_METHOD, action_get_title_dropdown_scan_method_item}, + {MENU_ENUM_LABEL_DEFERRED_DROPDOWN_BOX_LIST_SCAN_USE_DB, action_get_title_dropdown_scan_use_db_item}, + {MENU_ENUM_LABEL_DEFERRED_DROPDOWN_BOX_LIST_SCAN_DB_SELECT, action_get_title_dropdown_scan_db_select_item}, {MENU_ENUM_LABEL_DEFERRED_DROPDOWN_BOX_LIST_MANUAL_CONTENT_SCAN_SYSTEM_NAME, action_get_title_dropdown_manual_content_scan_system_name_item}, {MENU_ENUM_LABEL_DEFERRED_DROPDOWN_BOX_LIST_MANUAL_CONTENT_SCAN_CORE_NAME, action_get_title_dropdown_manual_content_scan_core_name_item}, {MENU_ENUM_LABEL_DEFERRED_DROPDOWN_BOX_LIST_DISK_INDEX, action_get_title_dropdown_disk_index}, diff --git a/menu/menu_cbs.h b/menu/menu_cbs.h index 598131741a80..187d79c354a2 100644 --- a/menu/menu_cbs.h +++ b/menu/menu_cbs.h @@ -52,6 +52,9 @@ enum ACTION_OK_DL_DROPDOWN_BOX_LIST_PLAYLIST_RIGHT_THUMBNAIL_MODE, ACTION_OK_DL_DROPDOWN_BOX_LIST_PLAYLIST_LEFT_THUMBNAIL_MODE, ACTION_OK_DL_DROPDOWN_BOX_LIST_PLAYLIST_SORT_MODE, + ACTION_OK_DL_DROPDOWN_BOX_LIST_SCAN_METHOD, + ACTION_OK_DL_DROPDOWN_BOX_LIST_SCAN_USE_DB, + ACTION_OK_DL_DROPDOWN_BOX_LIST_SCAN_DB_SELECT, ACTION_OK_DL_DROPDOWN_BOX_LIST_MANUAL_CONTENT_SCAN_SYSTEM_NAME, ACTION_OK_DL_DROPDOWN_BOX_LIST_MANUAL_CONTENT_SCAN_CORE_NAME, ACTION_OK_DL_DROPDOWN_BOX_LIST_DISK_INDEX, diff --git a/menu/menu_displaylist.c b/menu/menu_displaylist.c index ffaf226177e1..da0b8a23b113 100644 --- a/menu/menu_displaylist.c +++ b/menu/menu_displaylist.c @@ -9032,6 +9032,147 @@ unsigned menu_displaylist_build_list( } } break; + case DISPLAYLIST_DROPDOWN_LIST_SCAN_METHOD: + menu_entries_clear(list); + { + struct string_list *scan_method_list = + manual_content_scan_get_menu_scan_method_list(); + + if (scan_method_list) + { + unsigned current = 0; + unsigned i; + + /* Get currently selected system name */ + current = manual_content_scan_get_scan_method_enum(); + + /* Loop through names */ + for (i = 0; i < scan_method_list->size; i++) + { + const char *item = scan_method_list->elems[i].data; + + /* Add menu entry */ + if (menu_entries_append(list, + item, + "", + MENU_ENUM_LABEL_NO_ITEMS, + MENU_SETTING_DROPDOWN_ITEM_SCAN_METHOD, + i, 0, NULL)) + count++; + + /* Check whether current entry is checked */ + if (current == i) + { + menu_file_list_cbs_t *cbs = (menu_file_list_cbs_t*)list->list[i].actiondata; + if (cbs) + cbs->checked = true; + menu_st->selection_ptr = i; + } + } + + /* Clean up */ + string_list_free(scan_method_list); + } + } + break; + case DISPLAYLIST_DROPDOWN_LIST_SCAN_USE_DB: + menu_entries_clear(list); + { + struct string_list *scan_use_db_list = + manual_content_scan_get_menu_scan_use_db_list(); + + if (scan_use_db_list) + { + unsigned current = 0; + unsigned i; + + /* Get currently selected system name */ + current = manual_content_scan_get_scan_use_db_enum(); + + /* Loop through names */ + for (i = 0; i < scan_use_db_list->size; i++) + { + const char *item = scan_use_db_list->elems[i].data; + + /* Add menu entry */ + if (menu_entries_append(list, + item, + "", + MENU_ENUM_LABEL_NO_ITEMS, + MENU_SETTING_DROPDOWN_ITEM_SCAN_USE_DB, + i, 0, NULL)) + count++; + + /* Check whether current entry is checked */ + if (current == i) + { + menu_file_list_cbs_t *cbs = (menu_file_list_cbs_t*)list->list[i].actiondata; + if (cbs) + cbs->checked = true; + menu_st->selection_ptr = i; + } + } + + /* Clean up */ + string_list_free(scan_use_db_list); + } + } + break; + case DISPLAYLIST_DROPDOWN_LIST_SCAN_DB_SELECT: + menu_entries_clear(list); + { + bool show_hidden_files = settings->bools.show_hidden_files; +#ifdef HAVE_LIBRETRODB + const char *path_content_database = settings->paths.path_content_database; + struct string_list *scan_db_select_list = + manual_content_scan_get_menu_scan_db_select_list( + path_content_database, + show_hidden_files); +#else + struct string_list *scan_db_select_list = + manual_content_scan_get_menu_scan_db_select_list(NULL, + show_hidden_files); +#endif + + if (scan_db_select_list) + { + const char *current_system_name = NULL; + unsigned i; + + /* Get currently selected system name */ + manual_content_scan_get_menu_scan_db_select(¤t_system_name); + + /* Loop through names */ + for (i = 0; i < scan_db_select_list->size; i++) + { + /* Note: manual_content_scan_get_system_name_list() + * ensures that system_name cannot be empty here */ + const char *system_name = scan_db_select_list->elems[i].data; + + /* Add menu entry */ + if (menu_entries_append(list, + system_name, + "", + MENU_ENUM_LABEL_NO_ITEMS, + MENU_SETTING_DROPDOWN_ITEM_SCAN_DB_SELECT, + i, 0, NULL)) + count++; + + /* Check whether current entry is checked */ + if (string_is_equal(current_system_name, system_name)) + { + menu_file_list_cbs_t *cbs = (menu_file_list_cbs_t*)list->list[i].actiondata; + if (cbs) + cbs->checked = true; + menu_st->selection_ptr = i; + } + } + + /* Clean up */ + string_list_free(scan_db_select_list); + } + } + break; case DISPLAYLIST_DROPDOWN_LIST_MANUAL_CONTENT_SCAN_SYSTEM_NAME: menu_entries_clear(list); /* Get system name list */ @@ -14882,6 +15023,9 @@ bool menu_displaylist_ctl(enum menu_displaylist_ctl_state type, case DISPLAYLIST_DROPDOWN_LIST_PLAYLIST_RIGHT_THUMBNAIL_MODE: case DISPLAYLIST_DROPDOWN_LIST_PLAYLIST_LEFT_THUMBNAIL_MODE: case DISPLAYLIST_DROPDOWN_LIST_PLAYLIST_SORT_MODE: + case DISPLAYLIST_DROPDOWN_LIST_SCAN_METHOD: + case DISPLAYLIST_DROPDOWN_LIST_SCAN_USE_DB: + case DISPLAYLIST_DROPDOWN_LIST_SCAN_DB_SELECT: case DISPLAYLIST_DROPDOWN_LIST_MANUAL_CONTENT_SCAN_SYSTEM_NAME: case DISPLAYLIST_DROPDOWN_LIST_MANUAL_CONTENT_SCAN_CORE_NAME: case DISPLAYLIST_DROPDOWN_LIST_DISK_INDEX: @@ -14965,6 +15109,9 @@ bool menu_displaylist_ctl(enum menu_displaylist_ctl_state type, case DISPLAYLIST_DROPDOWN_LIST_PLAYLIST_RIGHT_THUMBNAIL_MODE: case DISPLAYLIST_DROPDOWN_LIST_PLAYLIST_LEFT_THUMBNAIL_MODE: case DISPLAYLIST_DROPDOWN_LIST_PLAYLIST_SORT_MODE: + case DISPLAYLIST_DROPDOWN_LIST_SCAN_METHOD: + case DISPLAYLIST_DROPDOWN_LIST_SCAN_USE_DB: + case DISPLAYLIST_DROPDOWN_LIST_SCAN_DB_SELECT: case DISPLAYLIST_DROPDOWN_LIST_MANUAL_CONTENT_SCAN_SYSTEM_NAME: case DISPLAYLIST_DROPDOWN_LIST_MANUAL_CONTENT_SCAN_CORE_NAME: case DISPLAYLIST_DROPDOWN_LIST_DISK_INDEX: diff --git a/menu/menu_displaylist.h b/menu/menu_displaylist.h index bb2e6e3b4942..5fd726a2fbb8 100644 --- a/menu/menu_displaylist.h +++ b/menu/menu_displaylist.h @@ -73,6 +73,9 @@ enum menu_displaylist_ctl_state DISPLAYLIST_DROPDOWN_LIST_PLAYLIST_RIGHT_THUMBNAIL_MODE, DISPLAYLIST_DROPDOWN_LIST_PLAYLIST_LEFT_THUMBNAIL_MODE, DISPLAYLIST_DROPDOWN_LIST_PLAYLIST_SORT_MODE, + DISPLAYLIST_DROPDOWN_LIST_SCAN_METHOD, + DISPLAYLIST_DROPDOWN_LIST_SCAN_USE_DB, + DISPLAYLIST_DROPDOWN_LIST_SCAN_DB_SELECT, DISPLAYLIST_DROPDOWN_LIST_MANUAL_CONTENT_SCAN_SYSTEM_NAME, DISPLAYLIST_DROPDOWN_LIST_MANUAL_CONTENT_SCAN_CORE_NAME, DISPLAYLIST_DROPDOWN_LIST_DISK_INDEX, diff --git a/menu/menu_driver.h b/menu/menu_driver.h index 042eb67c66ae..8b27bae90b8b 100644 --- a/menu/menu_driver.h +++ b/menu/menu_driver.h @@ -114,6 +114,9 @@ enum menu_settings_type MENU_SETTING_DROPDOWN_ITEM_PLAYLIST_RIGHT_THUMBNAIL_MODE, MENU_SETTING_DROPDOWN_ITEM_PLAYLIST_LEFT_THUMBNAIL_MODE, MENU_SETTING_DROPDOWN_ITEM_PLAYLIST_SORT_MODE, + MENU_SETTING_DROPDOWN_ITEM_SCAN_METHOD, + MENU_SETTING_DROPDOWN_ITEM_SCAN_USE_DB, + MENU_SETTING_DROPDOWN_ITEM_SCAN_DB_SELECT, MENU_SETTING_DROPDOWN_ITEM_MANUAL_CONTENT_SCAN_SYSTEM_NAME, MENU_SETTING_DROPDOWN_ITEM_MANUAL_CONTENT_SCAN_CORE_NAME, MENU_SETTING_DROPDOWN_ITEM_DISK_INDEX, @@ -281,6 +284,9 @@ enum menu_settings_type MENU_SETTING_ACTION_PLAYLIST_MANAGER_CLEAN_PLAYLIST, MENU_SETTING_ACTION_PLAYLIST_MANAGER_REFRESH_PLAYLIST, + MENU_SETTING_SCAN_METHOD, + MENU_SETTING_SCAN_USE_DB, + MENU_SETTING_SCAN_DB_SELECT, MENU_SETTING_MANUAL_CONTENT_SCAN_DIR, MENU_SETTING_MANUAL_CONTENT_SCAN_SYSTEM_NAME, MENU_SETTING_MANUAL_CONTENT_SCAN_CORE_NAME, diff --git a/msg_hash.h b/msg_hash.h index 8860fb07c6a9..eac3363499d5 100644 --- a/msg_hash.h +++ b/msg_hash.h @@ -2040,6 +2040,9 @@ enum msg_hash_enums MENU_ENUM_LABEL_DEFERRED_DROPDOWN_BOX_LIST_PLAYLIST_LEFT_THUMBNAIL_MODE, MENU_ENUM_LABEL_DEFERRED_DROPDOWN_BOX_LIST_PLAYLIST_ICON_THUMBNAIL_MODE, MENU_ENUM_LABEL_DEFERRED_DROPDOWN_BOX_LIST_PLAYLIST_SORT_MODE, + MENU_ENUM_LABEL_DEFERRED_DROPDOWN_BOX_LIST_SCAN_METHOD, + MENU_ENUM_LABEL_DEFERRED_DROPDOWN_BOX_LIST_SCAN_USE_DB, + MENU_ENUM_LABEL_DEFERRED_DROPDOWN_BOX_LIST_SCAN_DB_SELECT, MENU_ENUM_LABEL_DEFERRED_DROPDOWN_BOX_LIST_MANUAL_CONTENT_SCAN_SYSTEM_NAME, MENU_ENUM_LABEL_DEFERRED_DROPDOWN_BOX_LIST_MANUAL_CONTENT_SCAN_CORE_NAME, MENU_ENUM_LABEL_DEFERRED_DROPDOWN_BOX_LIST_DISK_INDEX, @@ -2218,6 +2221,12 @@ enum msg_hash_enums MENU_LBL_H(SCAN_THIS_DIRECTORY), MENU_LABEL(SCAN_DIRECTORY), MENU_LABEL(SCAN_FILE), + MENU_LABEL(SCAN_METHOD), + MENU_LABEL(SCAN_USE_DB), + MENU_LABEL(SCAN_DB_SELECT), + MENU_LABEL(SCAN_TARGET_PLAYLIST), + MENU_LABEL(SCAN_SINGLE_FILE), + MENU_LABEL(SCAN_OMIT_DB_REF), MENU_LABEL(NETPLAY_SHOW_ONLY_CONNECTABLE), MENU_LABEL(NETPLAY_SHOW_ONLY_INSTALLED_CORES), MENU_LABEL(NETPLAY_SHOW_PASSWORDED), @@ -4302,8 +4311,20 @@ enum msg_hash_enums MENU_ENUM_LABEL_VALUE_MANUAL_CONTENT_SCAN_SYSTEM_NAME_USE_CONTENT_DIR, MENU_ENUM_LABEL_VALUE_MANUAL_CONTENT_SCAN_SYSTEM_NAME_USE_CUSTOM, - + MENU_ENUM_LABEL_VALUE_MANUAL_CONTENT_SCAN_SYSTEM_NAME_USE_AUTO, MENU_ENUM_LABEL_VALUE_MANUAL_CONTENT_SCAN_CORE_NAME_DETECT, + + MENU_ENUM_LABEL_VALUE_SCAN_METHOD_AUTO, + MENU_ENUM_LABEL_VALUE_SCAN_METHOD_CUSTOM, + MENU_ENUM_LABEL_VALUE_SCAN_USE_DB_STRICT, + MENU_ENUM_LABEL_VALUE_SCAN_USE_DB_LOOSE, + MENU_ENUM_LABEL_VALUE_SCAN_USE_DB_CUSTOM_DAT, + MENU_ENUM_LABEL_VALUE_SCAN_USE_DB_CUSTOM_DAT_LOOSE, + MENU_ENUM_LABEL_VALUE_SCAN_USE_DB_NONE, + MENU_ENUM_LABEL_VALUE_SCAN_DB_SELECT_AUTO_ANY, + MENU_ENUM_LABEL_VALUE_SCAN_DB_SELECT_AUTO_FIRST, + MENU_ENUM_LABEL_VALUE_SCAN_TARGET_PLAYLIST_AUTO_ANY, + MENU_ENUM_LABEL_VALUE_SCAN_TARGET_PLAYLIST_CUSTOM, MSG_MANUAL_CONTENT_SCAN_DAT_FILE_INVALID, MSG_MANUAL_CONTENT_SCAN_DAT_FILE_TOO_LARGE,