diff --git a/command.c b/command.c index 93cb11bf6d..95300916da 100644 --- a/command.c +++ b/command.c @@ -1850,7 +1850,7 @@ void command_event_save_current_config(enum override_type type) case OVERRIDE_CORE: case OVERRIDE_CONTENT_DIR: { - int8_t ret = config_save_overrides(type, &runloop_st->system, false); + int8_t ret = config_save_overrides(type, &runloop_st->system, false, NULL); char msg[256]; msg[0] = '\0'; @@ -1904,7 +1904,7 @@ void command_event_remove_current_config(enum override_type type) msg[0] = '\0'; - if (config_save_overrides(type, &runloop_st->system, true)) + if (config_save_overrides(type, &runloop_st->system, true, NULL)) strlcpy(msg, msg_hash_to_str(MSG_OVERRIDES_REMOVED_SUCCESSFULLY), sizeof(msg)); else strlcpy(msg, msg_hash_to_str(MSG_OVERRIDES_ERROR_REMOVING), sizeof(msg)); diff --git a/configuration.c b/configuration.c index 2086977eae..8dc414483e 100644 --- a/configuration.c +++ b/configuration.c @@ -5222,7 +5222,8 @@ bool config_save_file(const char *path) * * Returns: true (1) on success, (-1) if nothing to write, otherwise returns false (0). **/ -int8_t config_save_overrides(enum override_type type, void *data, bool remove) +int8_t config_save_overrides(enum override_type type, + void *data, bool remove, const char *path) { int tmp_i = 0; unsigned i = 0; @@ -5507,6 +5508,13 @@ int8_t config_save_overrides(enum override_type type, void *data, bool remove) FILE_PATH_CONFIG_EXTENSION, sizeof(override_path)); break; + case OVERRIDE_AS: + fill_pathname_join_special_ext(override_path, + config_directory, core_name, + path, + FILE_PATH_CONFIG_EXTENSION, + sizeof(override_path)); + break; case OVERRIDE_NONE: default: break; @@ -5758,11 +5766,15 @@ bool input_remapping_save_file(const char *path) bool ret; unsigned i, j; char remap_file_dir[PATH_MAX_LENGTH]; - char key_strings[RARCH_FIRST_CUSTOM_BIND + 8][8] = { - "b", "y", "select", "start", - "up", "down", "left", "right", - "a", "x", "l", "r", "l2", "r2", - "l3", "r3", "l_x+", "l_x-", "l_y+", "l_y-", "r_x+", "r_x-", "r_y+", "r_y-" }; + char key_strings[RARCH_FIRST_CUSTOM_BIND + 8][8] = + { + "b", "y", "select", "start", + "up", "down", "left", "right", + "a", "x", "l", "r", + "l2", "r2", "l3", "r3", + "l_x+", "l_x-", "l_y+", "l_y-", + "r_x+", "r_x-", "r_y+", "r_y-" + }; config_file_t *conf = NULL; runloop_state_t *runloop_st = runloop_state_get_ptr(); settings_t *settings = config_st; diff --git a/configuration.h b/configuration.h index 374c9766e5..e4bffb2af5 100644 --- a/configuration.h +++ b/configuration.h @@ -82,6 +82,7 @@ enum crt_switch_type enum override_type { OVERRIDE_NONE = 0, + OVERRIDE_AS, OVERRIDE_CORE, OVERRIDE_CONTENT_DIR, OVERRIDE_GAME @@ -1202,7 +1203,8 @@ bool config_save_file(const char *path); * * Returns: true (1) on success, (-1) if nothing to write, otherwise returns false (0). **/ -int8_t config_save_overrides(enum override_type type, void *data, bool remove); +int8_t config_save_overrides(enum override_type type, + void *data, bool remove, const char *path); /* Replaces currently loaded configuration file with * another one. Will load a dummy core to flush state diff --git a/intl/msg_hash_lbl.h b/intl/msg_hash_lbl.h index 6234986c9a..5a32b99925 100644 --- a/intl/msg_hash_lbl.h +++ b/intl/msg_hash_lbl.h @@ -3237,6 +3237,10 @@ MSG_HASH( MENU_ENUM_LABEL_REMAP_FILE_LOAD, "remap_file_load" ) +MSG_HASH( + MENU_ENUM_LABEL_REMAP_FILE_SAVE_AS, + "remap_file_save_as" + ) MSG_HASH( MENU_ENUM_LABEL_REMAP_FILE_SAVE_CORE, "remap_file_save_core" @@ -3427,6 +3431,10 @@ MSG_HASH( MENU_ENUM_LABEL_OVERRIDE_FILE_LOAD, "override_file_load" ) +MSG_HASH( + MENU_ENUM_LABEL_OVERRIDE_FILE_SAVE_AS, + "override_file_save_as" + ) MSG_HASH( MENU_ENUM_LABEL_OVERRIDE_UNLOAD, "override_unload" diff --git a/intl/msg_hash_us.h b/intl/msg_hash_us.h index d450dc358e..d471fcb752 100644 --- a/intl/msg_hash_us.h +++ b/intl/msg_hash_us.h @@ -8742,29 +8742,65 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_REMAP_FILE_LOAD, "Load Remap File" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_REMAP_FILE_LOAD, + "Load and replace current input mappings." + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_REMAP_FILE_SAVE_AS, + "Save Remap File As" + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_REMAP_FILE_SAVE_AS, + "Save current input mappings as a new remap file." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_REMAP_FILE_SAVE_CORE, "Save Core Remap File" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_REMAP_FILE_SAVE_CORE, + "Save a remap file which will apply for all content loaded with this core." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_REMAP_FILE_REMOVE_CORE, - "Delete Core Remap File" + "Remove Core Remap File" + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_REMAP_FILE_REMOVE_CORE, + "Delete the remap file which will apply for all content loaded with this core." ) MSG_HASH( MENU_ENUM_LABEL_VALUE_REMAP_FILE_SAVE_CONTENT_DIR, "Save Content Directory Remap File" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_REMAP_FILE_SAVE_CONTENT_DIR, + "Save a remap file which will apply for all content loaded from the same directory as the current file." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_REMAP_FILE_REMOVE_CONTENT_DIR, - "Delete Game Content Directory Remap File" + "Remove Game Content Directory Remap File" + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_REMAP_FILE_REMOVE_CONTENT_DIR, + "Delete the remap file which will apply for all content loaded from the same directory as the current file." ) MSG_HASH( MENU_ENUM_LABEL_VALUE_REMAP_FILE_SAVE_GAME, "Save Game Remap File" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_REMAP_FILE_SAVE_GAME, + "Save a remap file which will apply for the current content only." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_REMAP_FILE_REMOVE_GAME, - "Delete Game Remap File" + "Remove Game Remap File" + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_REMAP_FILE_REMOVE_GAME, + "Delete the remap file which will apply for the current content only." ) MSG_HASH( MENU_ENUM_LABEL_VALUE_REMAP_FILE_RESET, @@ -9468,6 +9504,14 @@ MSG_HASH( MENU_ENUM_SUBLABEL_OVERRIDE_FILE_LOAD, "Load and replace current configuration." ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_OVERRIDE_FILE_SAVE_AS, + "Save Overrides As" + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_OVERRIDE_FILE_SAVE_AS, + "Save the current configuration as a new override file." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_SAVE_CURRENT_CONFIG_OVERRIDE_CORE, "Save Core Overrides" @@ -14004,6 +14048,14 @@ MSG_HASH( MSG_INPUT_PRESET_FILENAME, "Input Preset Filename" ) +MSG_HASH( + MSG_INPUT_OVERRIDE_FILENAME, + "Input Override Filename" + ) +MSG_HASH( + MSG_INPUT_REMAP_FILENAME, + "Input Remap Filename" + ) MSG_HASH( MSG_INPUT_RENAME_ENTRY, "Rename Title" diff --git a/menu/cbs/menu_cbs_ok.c b/menu/cbs/menu_cbs_ok.c index 95fe74680d..e8f21daa4f 100644 --- a/menu/cbs/menu_cbs_ok.c +++ b/menu/cbs/menu_cbs_ok.c @@ -134,7 +134,8 @@ enum enum { - ACTION_OK_REMAP_FILE_SAVE_CORE = 0, + ACTION_OK_REMAP_FILE_SAVE_AS = 0, + ACTION_OK_REMAP_FILE_SAVE_CORE, ACTION_OK_REMAP_FILE_SAVE_CONTENT_DIR, ACTION_OK_REMAP_FILE_SAVE_GAME, ACTION_OK_REMAP_FILE_REMOVE_CORE, @@ -2386,7 +2387,7 @@ static int generic_action_ok(const char *path, static int default_action_ok_load_content_with_core_from_menu(const char *_path, unsigned _type) { content_ctx_info_t content_info; - struct menu_state *menu_st = menu_state_get_ptr(); + struct menu_state *menu_st = menu_state_get_ptr(); content_info.argc = 0; content_info.argv = NULL; content_info.args = NULL; @@ -3606,6 +3607,13 @@ static int generic_action_ok_remap_file_operation(const char *path, switch (action_type) { + case ACTION_OK_REMAP_FILE_SAVE_AS: + fill_pathname_join_special_ext(remap_file_path, + directory_input_remapping, core_name, + path, + FILE_PATH_REMAP_EXTENSION, + sizeof(remap_file_path)); + break; case ACTION_OK_REMAP_FILE_SAVE_CORE: case ACTION_OK_REMAP_FILE_REMOVE_CORE: fill_pathname_join_special_ext(remap_file_path, @@ -3714,6 +3722,44 @@ static int generic_action_ok_remap_file_operation(const char *path, return 0; } +static void menu_input_st_string_cb_remap_file_save_as( + void *userdata, const char *str) +{ +#ifdef HAVE_CONFIGFILE + if (str && *str) + { + rarch_setting_t *setting = NULL; + settings_t *settings = config_get_ptr(); + struct menu_state *menu_st = menu_state_get_ptr(); + const char *label = menu_st->input_dialog_kb_label; + const char *msg_str = NULL; + int ret = false; + + if (!string_is_empty(label)) + setting = menu_setting_find(label); + + if (setting) + { + if (setting->value.target.string) + strlcpy(setting->value.target.string, str, setting->size); + if (setting->change_handler) + setting->change_handler(setting); + menu_setting_generic(setting, 0, false); + } + else if (!string_is_empty(label)) + generic_action_ok_remap_file_operation(str, label, 0, + 0, 0, ACTION_OK_REMAP_FILE_SAVE_AS); + } + + menu_input_dialog_end(); +#endif +} + +DEFAULT_ACTION_DIALOG_START(action_ok_remap_file_save_as, + msg_hash_to_str(MSG_INPUT_REMAP_FILENAME), + (unsigned)idx, + menu_input_st_string_cb_remap_file_save_as) + static int action_ok_remap_file_save_core(const char *path, const char *label, unsigned type, size_t idx, size_t entry_idx) { @@ -3819,6 +3865,65 @@ static int action_ok_remap_file_flush(const char *path, return 0; } +static void menu_input_st_string_cb_override_file_save_as( + void *userdata, const char *str) +{ +#ifdef HAVE_CONFIGFILE + if (str && *str) + { + rarch_setting_t *setting = NULL; + settings_t *settings = config_get_ptr(); + struct menu_state *menu_st = menu_state_get_ptr(); + const char *label = menu_st->input_dialog_kb_label; + const char *msg_str = NULL; + int ret = false; + + if (!string_is_empty(label)) + setting = menu_setting_find(label); + + if (setting) + { + if (setting->value.target.string) + strlcpy(setting->value.target.string, str, setting->size); + if (setting->change_handler) + setting->change_handler(setting); + menu_setting_generic(setting, 0, false); + } + else if (!string_is_empty(label)) + { + runloop_state_t *runloop_st = runloop_state_get_ptr(); + ret = config_save_overrides(OVERRIDE_AS, &runloop_st->system, false, str); + } + + switch (ret) + { + case 1: + msg_str = msg_hash_to_str(MSG_OVERRIDES_SAVED_SUCCESSFULLY); + break; + case -1: + msg_str = msg_hash_to_str(MSG_OVERRIDES_NOT_SAVED); + break; + default: + case 0: + msg_str = msg_hash_to_str(MSG_OVERRIDES_ERROR_SAVING); + break; + } + + runloop_msg_queue_push( + msg_str, + 1, 100, true, + NULL, MESSAGE_QUEUE_ICON_DEFAULT, MESSAGE_QUEUE_CATEGORY_INFO); + } + + menu_input_dialog_end(); +#endif +} + +DEFAULT_ACTION_DIALOG_START(action_ok_override_file_save_as, + msg_hash_to_str(MSG_INPUT_OVERRIDE_FILENAME), + (unsigned)idx, + menu_input_st_string_cb_override_file_save_as) + static int action_ok_override_unload(const char *path, const char *label, unsigned type, size_t idx, size_t entry_idx) { @@ -4054,7 +4159,7 @@ static int action_ok_file_load_ffmpeg(const char *path, menu_path = menu_stack->list[menu_stack->size - 1].path; if (string_is_empty(menu_path)) - return -1; + return -1; fill_pathname_join_special(new_path, menu_path, path, sizeof(new_path)); @@ -8325,7 +8430,7 @@ static int menu_cbs_init_bind_ok_compare_label(menu_file_list_cbs_t *cbs, #if defined(HAVE_CG) || defined(HAVE_GLSL) || defined(HAVE_SLANG) || defined(HAVE_HLSL) {MENU_ENUM_LABEL_VIDEO_SHADER_PASS, action_ok_shader_pass}, {MENU_ENUM_LABEL_VIDEO_SHADER_PRESET, action_ok_shader_preset}, - {MENU_ENUM_LABEL_VIDEO_SHADER_PRESET_PREPEND, action_ok_shader_preset_prepend}, + {MENU_ENUM_LABEL_VIDEO_SHADER_PRESET_PREPEND, action_ok_shader_preset_prepend}, {MENU_ENUM_LABEL_VIDEO_SHADER_PRESET_APPEND, action_ok_shader_preset_append}, {MENU_ENUM_LABEL_VIDEO_SHADER_PARAMETERS, action_ok_shader_parameters}, {MENU_ENUM_LABEL_VIDEO_SHADER_PRESET_PARAMETERS, action_ok_shader_parameters}, @@ -8384,7 +8489,7 @@ static int menu_cbs_init_bind_ok_compare_label(menu_file_list_cbs_t *cbs, {MENU_ENUM_LABEL_GOTO_CONTENTLESS_CORES, action_ok_goto_contentless_cores}, {MENU_ENUM_LABEL_BROWSE_START, action_ok_browse_url_start}, {MENU_ENUM_LABEL_FILE_BROWSER_CORE, action_ok_load_core}, - {MENU_ENUM_LABEL_FILE_BROWSER_CORE_SELECT_FROM_COLLECTION, action_ok_core_deferred_set}, + {MENU_ENUM_LABEL_FILE_BROWSER_CORE_SELECT_FROM_COLLECTION,action_ok_core_deferred_set}, {MENU_ENUM_LABEL_FILE_BROWSER_CORE_SELECT_FROM_COLLECTION_CURRENT_CORE,action_ok_core_deferred_set}, {MENU_ENUM_LABEL_START_CORE, action_ok_start_core}, {MENU_ENUM_LABEL_START_NET_RETROPAD, action_ok_start_net_retropad_core}, @@ -8398,9 +8503,9 @@ static int menu_cbs_init_bind_ok_compare_label(menu_file_list_cbs_t *cbs, {MENU_ENUM_LABEL_LOAD_STATE, action_ok_load_state}, {MENU_ENUM_LABEL_UNDO_LOAD_STATE, action_ok_undo_load_state}, {MENU_ENUM_LABEL_UNDO_SAVE_STATE, action_ok_undo_save_state}, - {MENU_ENUM_LABEL_RECORD_REPLAY, action_ok_record_replay}, - {MENU_ENUM_LABEL_PLAY_REPLAY, action_ok_play_replay}, - {MENU_ENUM_LABEL_HALT_REPLAY, action_ok_halt_replay}, + {MENU_ENUM_LABEL_RECORD_REPLAY, action_ok_record_replay}, + {MENU_ENUM_LABEL_PLAY_REPLAY, action_ok_play_replay}, + {MENU_ENUM_LABEL_HALT_REPLAY, action_ok_halt_replay}, {MENU_ENUM_LABEL_RESUME_CONTENT, action_ok_resume_content}, {MENU_ENUM_LABEL_ADD_TO_FAVORITES_PLAYLIST, action_ok_add_to_favorites_playlist}, {MENU_ENUM_LABEL_SET_CORE_ASSOCIATION, action_ok_set_core_association}, @@ -8508,7 +8613,7 @@ static int menu_cbs_init_bind_ok_compare_label(menu_file_list_cbs_t *cbs, {MENU_ENUM_LABEL_PLAYLIST_MANAGER_CLEAN_PLAYLIST, action_ok_playlist_clean}, {MENU_ENUM_LABEL_PLAYLIST_MANAGER_REFRESH_PLAYLIST, action_ok_playlist_refresh}, {MENU_ENUM_LABEL_RECORDING_SETTINGS, action_ok_push_recording_settings_list}, - {MENU_ENUM_LABEL_INPUT_RETROPAD_BINDS, action_ok_push_input_retropad_binds_list}, + {MENU_ENUM_LABEL_INPUT_RETROPAD_BINDS, action_ok_push_input_retropad_binds_list}, {MENU_ENUM_LABEL_INPUT_HOTKEY_BINDS, action_ok_push_input_hotkey_binds_list}, {MENU_ENUM_LABEL_ACCOUNTS_RETRO_ACHIEVEMENTS, action_ok_push_accounts_cheevos_list}, {MENU_ENUM_LABEL_ACCOUNTS_YOUTUBE, action_ok_push_accounts_youtube_list}, @@ -8560,6 +8665,7 @@ static int menu_cbs_init_bind_ok_compare_label(menu_file_list_cbs_t *cbs, {MENU_ENUM_LABEL_CHEAT_FILE_SAVE_AS, action_ok_cheat_file_save_as}, #endif {MENU_ENUM_LABEL_REMAP_FILE_LOAD, action_ok_remap_file}, + {MENU_ENUM_LABEL_REMAP_FILE_SAVE_AS, action_ok_remap_file_save_as}, {MENU_ENUM_LABEL_REMAP_FILE_SAVE_CORE, action_ok_remap_file_save_core}, {MENU_ENUM_LABEL_REMAP_FILE_SAVE_CONTENT_DIR, action_ok_remap_file_save_content_dir}, {MENU_ENUM_LABEL_REMAP_FILE_SAVE_GAME, action_ok_remap_file_save_game}, @@ -8569,6 +8675,7 @@ static int menu_cbs_init_bind_ok_compare_label(menu_file_list_cbs_t *cbs, {MENU_ENUM_LABEL_REMAP_FILE_RESET, action_ok_remap_file_reset}, {MENU_ENUM_LABEL_REMAP_FILE_FLUSH, action_ok_remap_file_flush}, {MENU_ENUM_LABEL_OVERRIDE_FILE_LOAD, action_ok_override_file}, + {MENU_ENUM_LABEL_OVERRIDE_FILE_SAVE_AS, action_ok_override_file_save_as}, {MENU_ENUM_LABEL_OVERRIDE_UNLOAD, action_ok_override_unload}, {MENU_ENUM_LABEL_PLAYLISTS_TAB, action_ok_content_collection_list}, {MENU_ENUM_LABEL_BROWSE_URL_LIST, action_ok_browse_url_list}, @@ -8586,7 +8693,7 @@ static int menu_cbs_init_bind_ok_compare_label(menu_file_list_cbs_t *cbs, {MENU_ENUM_LABEL_REWIND_SETTINGS, action_ok_rewind_list}, {MENU_ENUM_LABEL_ONSCREEN_DISPLAY_SETTINGS, action_ok_onscreen_display_list}, {MENU_ENUM_LABEL_ONSCREEN_NOTIFICATIONS_SETTINGS, action_ok_onscreen_notifications_list}, - {MENU_ENUM_LABEL_ONSCREEN_NOTIFICATIONS_VIEWS_SETTINGS, action_ok_onscreen_notifications_views_list}, + {MENU_ENUM_LABEL_ONSCREEN_NOTIFICATIONS_VIEWS_SETTINGS,action_ok_onscreen_notifications_views_list}, {MENU_ENUM_LABEL_ONSCREEN_OVERLAY_SETTINGS, action_ok_onscreen_overlay_list}, {MENU_ENUM_LABEL_OSK_OVERLAY_SETTINGS, action_ok_osk_overlay_list}, {MENU_ENUM_LABEL_MENU_SETTINGS, action_ok_menu_list}, @@ -8696,12 +8803,12 @@ static int menu_cbs_init_bind_ok_compare_label(menu_file_list_cbs_t *cbs, {MENU_ENUM_LABEL_SCREEN_RESOLUTION, action_ok_video_resolution}, {MENU_ENUM_LABEL_PLAYLIST_MANAGER_DEFAULT_CORE, action_ok_playlist_default_core}, {MENU_ENUM_LABEL_PLAYLIST_MANAGER_LABEL_DISPLAY_MODE, action_ok_playlist_label_display_mode}, - {MENU_ENUM_LABEL_PLAYLIST_MANAGER_RIGHT_THUMBNAIL_MODE, action_ok_playlist_right_thumbnail_mode}, - {MENU_ENUM_LABEL_PLAYLIST_MANAGER_LEFT_THUMBNAIL_MODE, action_ok_playlist_left_thumbnail_mode}, + {MENU_ENUM_LABEL_PLAYLIST_MANAGER_RIGHT_THUMBNAIL_MODE,action_ok_playlist_right_thumbnail_mode}, + {MENU_ENUM_LABEL_PLAYLIST_MANAGER_LEFT_THUMBNAIL_MODE,action_ok_playlist_left_thumbnail_mode}, {MENU_ENUM_LABEL_PLAYLIST_MANAGER_SORT_MODE, action_ok_playlist_sort_mode}, - {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_MANUAL_CONTENT_SCAN_DAT_FILE, action_ok_manual_content_scan_dat_file}, + {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_MANUAL_CONTENT_SCAN_DAT_FILE, action_ok_manual_content_scan_dat_file}, }; for (i = 0; i < ARRAY_SIZE(ok_list); i++) diff --git a/menu/cbs/menu_cbs_sublabel.c b/menu/cbs/menu_cbs_sublabel.c index 2f81b15c5f..124c9a5508 100644 --- a/menu/cbs/menu_cbs_sublabel.c +++ b/menu/cbs/menu_cbs_sublabel.c @@ -943,6 +943,10 @@ DEFAULT_SUBLABEL_MACRO(action_bind_sublabel_accounts_retro_achievements, DEFAULT_SUBLABEL_MACRO(action_bind_sublabel_accounts_list, MENU_ENUM_SUBLABEL_ACCOUNTS_LIST) DEFAULT_SUBLABEL_MACRO(action_bind_sublabel_input_meta_rewind, MENU_ENUM_SUBLABEL_INPUT_META_REWIND) DEFAULT_SUBLABEL_MACRO(action_bind_sublabel_restart_content, MENU_ENUM_SUBLABEL_RESTART_CONTENT) +DEFAULT_SUBLABEL_MACRO(action_bind_sublabel_override_file_info, MENU_ENUM_SUBLABEL_OVERRIDE_FILE_INFO) +DEFAULT_SUBLABEL_MACRO(action_bind_sublabel_override_file_load, MENU_ENUM_SUBLABEL_OVERRIDE_FILE_LOAD) +DEFAULT_SUBLABEL_MACRO(action_bind_sublabel_override_file_save_as, MENU_ENUM_SUBLABEL_OVERRIDE_FILE_SAVE_AS) +DEFAULT_SUBLABEL_MACRO(action_bind_sublabel_override_unload, MENU_ENUM_SUBLABEL_OVERRIDE_UNLOAD) DEFAULT_SUBLABEL_MACRO(action_bind_sublabel_save_current_config_override_core, MENU_ENUM_SUBLABEL_SAVE_CURRENT_CONFIG_OVERRIDE_CORE) DEFAULT_SUBLABEL_MACRO(action_bind_sublabel_save_current_config_override_content_dir, MENU_ENUM_SUBLABEL_SAVE_CURRENT_CONFIG_OVERRIDE_CONTENT_DIR) @@ -951,15 +955,19 @@ DEFAULT_SUBLABEL_MACRO(action_bind_sublabel_remove_current_config_override_core, DEFAULT_SUBLABEL_MACRO(action_bind_sublabel_remove_current_config_override_content_dir, MENU_ENUM_SUBLABEL_REMOVE_CURRENT_CONFIG_OVERRIDE_CONTENT_DIR) DEFAULT_SUBLABEL_MACRO(action_bind_sublabel_remove_current_config_override_game, MENU_ENUM_SUBLABEL_REMOVE_CURRENT_CONFIG_OVERRIDE_GAME) -DEFAULT_SUBLABEL_MACRO(action_bind_sublabel_shader_options, MENU_ENUM_SUBLABEL_SHADER_OPTIONS) DEFAULT_SUBLABEL_MACRO(action_bind_sublabel_core_input_remapping_options, MENU_ENUM_SUBLABEL_CORE_INPUT_REMAPPING_OPTIONS) DEFAULT_SUBLABEL_MACRO(action_bind_sublabel_remap_file_manager_list, MENU_ENUM_SUBLABEL_REMAP_FILE_MANAGER_LIST) DEFAULT_SUBLABEL_MACRO(action_bind_sublabel_remap_file_info, MENU_ENUM_SUBLABEL_REMAP_FILE_INFO) +DEFAULT_SUBLABEL_MACRO(action_bind_sublabel_remap_file_load, MENU_ENUM_SUBLABEL_REMAP_FILE_LOAD) +DEFAULT_SUBLABEL_MACRO(action_bind_sublabel_remap_file_save_as, MENU_ENUM_SUBLABEL_REMAP_FILE_SAVE_AS) +DEFAULT_SUBLABEL_MACRO(action_bind_sublabel_remap_file_save_core, MENU_ENUM_SUBLABEL_REMAP_FILE_SAVE_CORE) +DEFAULT_SUBLABEL_MACRO(action_bind_sublabel_remap_file_save_content_dir, MENU_ENUM_SUBLABEL_REMAP_FILE_SAVE_CONTENT_DIR) +DEFAULT_SUBLABEL_MACRO(action_bind_sublabel_remap_file_save_game, MENU_ENUM_SUBLABEL_REMAP_FILE_SAVE_GAME) +DEFAULT_SUBLABEL_MACRO(action_bind_sublabel_remap_file_remove_core, MENU_ENUM_SUBLABEL_REMAP_FILE_REMOVE_CORE) +DEFAULT_SUBLABEL_MACRO(action_bind_sublabel_remap_file_remove_content_dir, MENU_ENUM_SUBLABEL_REMAP_FILE_REMOVE_CONTENT_DIR) +DEFAULT_SUBLABEL_MACRO(action_bind_sublabel_remap_file_remove_game, MENU_ENUM_SUBLABEL_REMAP_FILE_REMOVE_GAME) DEFAULT_SUBLABEL_MACRO(action_bind_sublabel_remap_file_reset, MENU_ENUM_SUBLABEL_REMAP_FILE_RESET) DEFAULT_SUBLABEL_MACRO(action_bind_sublabel_remap_file_flush, MENU_ENUM_SUBLABEL_REMAP_FILE_FLUSH) -DEFAULT_SUBLABEL_MACRO(action_bind_sublabel_override_file_info, MENU_ENUM_SUBLABEL_OVERRIDE_FILE_INFO) -DEFAULT_SUBLABEL_MACRO(action_bind_sublabel_override_file_load, MENU_ENUM_SUBLABEL_OVERRIDE_FILE_LOAD) -DEFAULT_SUBLABEL_MACRO(action_bind_sublabel_override_unload, MENU_ENUM_SUBLABEL_OVERRIDE_UNLOAD) DEFAULT_SUBLABEL_MACRO(action_bind_sublabel_core_option_override_list, MENU_ENUM_SUBLABEL_CORE_OPTION_OVERRIDE_LIST) DEFAULT_SUBLABEL_MACRO(action_bind_sublabel_core_option_override_info, MENU_ENUM_SUBLABEL_CORE_OPTION_OVERRIDE_INFO) DEFAULT_SUBLABEL_MACRO(action_bind_sublabel_core_options_reset, MENU_ENUM_SUBLABEL_CORE_OPTIONS_RESET) @@ -1129,6 +1137,7 @@ DEFAULT_SUBLABEL_MACRO(action_bind_sublabel_recording_output_directory, DEFAULT_SUBLABEL_MACRO(action_bind_sublabel_recording_config_directory, MENU_ENUM_SUBLABEL_RECORDING_CONFIG_DIRECTORY) DEFAULT_SUBLABEL_MACRO(action_bind_sublabel_video_font_path, MENU_ENUM_SUBLABEL_VIDEO_FONT_PATH) DEFAULT_SUBLABEL_MACRO(action_bind_sublabel_video_shaders_enable, MENU_ENUM_SUBLABEL_VIDEO_SHADERS_ENABLE) +DEFAULT_SUBLABEL_MACRO(action_bind_sublabel_shader_options, MENU_ENUM_SUBLABEL_SHADER_OPTIONS) DEFAULT_SUBLABEL_MACRO(action_bind_sublabel_shader_apply_changes, MENU_ENUM_SUBLABEL_SHADER_APPLY_CHANGES) DEFAULT_SUBLABEL_MACRO(action_bind_sublabel_shader_watch_for_changes, MENU_ENUM_SUBLABEL_SHADER_WATCH_FOR_CHANGES) DEFAULT_SUBLABEL_MACRO(action_bind_sublabel_video_shader_remember_last_dir, MENU_ENUM_SUBLABEL_VIDEO_SHADER_REMEMBER_LAST_DIR) @@ -3210,6 +3219,30 @@ int menu_cbs_init_bind_sublabel(menu_file_list_cbs_t *cbs, case MENU_ENUM_LABEL_REMAP_FILE_INFO: BIND_ACTION_SUBLABEL(cbs, action_bind_sublabel_remap_file_info); break; + case MENU_ENUM_LABEL_REMAP_FILE_LOAD: + BIND_ACTION_SUBLABEL(cbs, action_bind_sublabel_remap_file_load); + break; + case MENU_ENUM_LABEL_REMAP_FILE_SAVE_AS: + BIND_ACTION_SUBLABEL(cbs, action_bind_sublabel_remap_file_save_as); + break; + case MENU_ENUM_LABEL_REMAP_FILE_SAVE_GAME: + BIND_ACTION_SUBLABEL(cbs, action_bind_sublabel_remap_file_save_game); + break; + case MENU_ENUM_LABEL_REMAP_FILE_SAVE_CONTENT_DIR: + BIND_ACTION_SUBLABEL(cbs, action_bind_sublabel_remap_file_save_content_dir); + break; + case MENU_ENUM_LABEL_REMAP_FILE_SAVE_CORE: + BIND_ACTION_SUBLABEL(cbs, action_bind_sublabel_remap_file_save_core); + break; + case MENU_ENUM_LABEL_REMAP_FILE_REMOVE_GAME: + BIND_ACTION_SUBLABEL(cbs, action_bind_sublabel_remap_file_remove_game); + break; + case MENU_ENUM_LABEL_REMAP_FILE_REMOVE_CONTENT_DIR: + BIND_ACTION_SUBLABEL(cbs, action_bind_sublabel_remap_file_remove_content_dir); + break; + case MENU_ENUM_LABEL_REMAP_FILE_REMOVE_CORE: + BIND_ACTION_SUBLABEL(cbs, action_bind_sublabel_remap_file_remove_core); + break; case MENU_ENUM_LABEL_REMAP_FILE_RESET: BIND_ACTION_SUBLABEL(cbs, action_bind_sublabel_remap_file_reset); break; @@ -3222,6 +3255,9 @@ int menu_cbs_init_bind_sublabel(menu_file_list_cbs_t *cbs, case MENU_ENUM_LABEL_OVERRIDE_FILE_LOAD: BIND_ACTION_SUBLABEL(cbs, action_bind_sublabel_override_file_load); break; + case MENU_ENUM_LABEL_OVERRIDE_FILE_SAVE_AS: + BIND_ACTION_SUBLABEL(cbs, action_bind_sublabel_override_file_save_as); + break; case MENU_ENUM_LABEL_OVERRIDE_UNLOAD: BIND_ACTION_SUBLABEL(cbs, action_bind_sublabel_override_unload); break; @@ -3248,21 +3284,21 @@ int menu_cbs_init_bind_sublabel(menu_file_list_cbs_t *cbs, case MENU_ENUM_LABEL_SAVE_CURRENT_CONFIG_OVERRIDE_GAME: BIND_ACTION_SUBLABEL(cbs, action_bind_sublabel_save_current_config_override_game); break; - case MENU_ENUM_LABEL_SAVE_CURRENT_CONFIG_OVERRIDE_CORE: - BIND_ACTION_SUBLABEL(cbs, action_bind_sublabel_save_current_config_override_core); - break; case MENU_ENUM_LABEL_SAVE_CURRENT_CONFIG_OVERRIDE_CONTENT_DIR: BIND_ACTION_SUBLABEL(cbs, action_bind_sublabel_save_current_config_override_content_dir); break; + case MENU_ENUM_LABEL_SAVE_CURRENT_CONFIG_OVERRIDE_CORE: + BIND_ACTION_SUBLABEL(cbs, action_bind_sublabel_save_current_config_override_core); + break; case MENU_ENUM_LABEL_REMOVE_CURRENT_CONFIG_OVERRIDE_GAME: BIND_ACTION_SUBLABEL(cbs, action_bind_sublabel_remove_current_config_override_game); break; - case MENU_ENUM_LABEL_REMOVE_CURRENT_CONFIG_OVERRIDE_CORE: - BIND_ACTION_SUBLABEL(cbs, action_bind_sublabel_remove_current_config_override_core); - break; case MENU_ENUM_LABEL_REMOVE_CURRENT_CONFIG_OVERRIDE_CONTENT_DIR: BIND_ACTION_SUBLABEL(cbs, action_bind_sublabel_remove_current_config_override_content_dir); break; + case MENU_ENUM_LABEL_REMOVE_CURRENT_CONFIG_OVERRIDE_CORE: + BIND_ACTION_SUBLABEL(cbs, action_bind_sublabel_remove_current_config_override_core); + break; case MENU_ENUM_LABEL_RESTART_CONTENT: BIND_ACTION_SUBLABEL(cbs, action_bind_sublabel_restart_content); break; diff --git a/menu/drivers/materialui.c b/menu/drivers/materialui.c index 00b54e73de..f877fa6875 100644 --- a/menu/drivers/materialui.c +++ b/menu/drivers/materialui.c @@ -10364,7 +10364,6 @@ static void materialui_list_insert( break; case MENU_SETTING_ACTION_CORE_OPTION_OVERRIDE_LIST: case MENU_SETTING_ACTION_REMAP_FILE_MANAGER_LIST: - case MENU_SETTING_ACTION_REMAP_FILE_LOAD: node->icon_texture_index = MUI_TEXTURE_SETTINGS; node->icon_type = MUI_ICON_TYPE_INTERNAL; break; @@ -10455,6 +10454,7 @@ static void materialui_list_insert( case MENU_SETTING_ACTION_CORE_CREATE_BACKUP: case MENU_SETTING_ACTION_GAME_SPECIFIC_CORE_OPTIONS_CREATE: case MENU_SETTING_ACTION_FOLDER_SPECIFIC_CORE_OPTIONS_CREATE: + case MENU_SETTING_ACTION_REMAP_FILE_SAVE_AS: case MENU_SETTING_ACTION_REMAP_FILE_SAVE_CORE: case MENU_SETTING_ACTION_REMAP_FILE_SAVE_CONTENT_DIR: case MENU_SETTING_ACTION_REMAP_FILE_SAVE_GAME: @@ -10462,6 +10462,7 @@ static void materialui_list_insert( node->icon_type = MUI_ICON_TYPE_INTERNAL; break; case MENU_SETTING_ACTION_CORE_RESTORE_BACKUP: + case MENU_SETTING_ACTION_REMAP_FILE_LOAD: node->icon_texture_index = MUI_TEXTURE_LOAD_STATE; node->icon_type = MUI_ICON_TYPE_INTERNAL; break; @@ -10665,6 +10666,7 @@ static void materialui_list_insert( node->icon_type = MUI_ICON_TYPE_INTERNAL; } else if ( string_is_equal(label, msg_hash_to_str(MENU_ENUM_LABEL_LOAD_STATE)) + || string_is_equal(label, msg_hash_to_str(MENU_ENUM_LABEL_OVERRIDE_FILE_LOAD)) || string_is_equal(label, msg_hash_to_str(MENU_ENUM_LABEL_SWITCH_INSTALLED_CORES_PFD))) { node->icon_texture_index = MUI_TEXTURE_LOAD_STATE; @@ -10711,6 +10713,7 @@ static void materialui_list_insert( else if ( string_is_equal(label, msg_hash_to_str(MENU_ENUM_LABEL_SAVESTATE_LIST)) || string_is_equal(label, msg_hash_to_str(MENU_ENUM_LABEL_SAVE_STATE)) + || string_is_equal(label, msg_hash_to_str(MENU_ENUM_LABEL_OVERRIDE_FILE_SAVE_AS)) || string_is_equal(label, msg_hash_to_str(MENU_ENUM_LABEL_SAVE_CURRENT_CONFIG_OVERRIDE_CORE)) || string_is_equal(label, msg_hash_to_str(MENU_ENUM_LABEL_SAVE_CURRENT_CONFIG_OVERRIDE_CONTENT_DIR)) || string_is_equal(label, msg_hash_to_str(MENU_ENUM_LABEL_SAVE_CURRENT_CONFIG_OVERRIDE_GAME)) @@ -10919,11 +10922,6 @@ static void materialui_list_insert( || string_is_equal(label, msg_hash_to_str(MENU_ENUM_LABEL_NETPLAY_ENABLE_HOST)) || string_is_equal(label, msg_hash_to_str(MENU_ENUM_LABEL_NETPLAY_KICK)) || string_is_equal(label, msg_hash_to_str(MENU_ENUM_LABEL_NETPLAY_BAN)) - || string_is_equal(label, msg_hash_to_str(MENU_ENUM_LABEL_REMAP_FILE_LOAD)) - || string_is_equal(label, msg_hash_to_str(MENU_ENUM_LABEL_REMAP_FILE_SAVE_CORE)) - || string_is_equal(label, msg_hash_to_str(MENU_ENUM_LABEL_REMAP_FILE_SAVE_CONTENT_DIR)) - || string_is_equal(label, msg_hash_to_str(MENU_ENUM_LABEL_REMAP_FILE_SAVE_GAME)) - || string_is_equal(label, msg_hash_to_str(MENU_ENUM_LABEL_OVERRIDE_FILE_LOAD)) || string_is_equal(label, msg_hash_to_str(MENU_ENUM_LABEL_INPUT_META_CHEAT_SEARCH)) || string_is_equal(label, msg_hash_to_str(MENU_ENUM_LABEL_CHEAT_SEARCH_SETTINGS)) || string_is_equal(label, msg_hash_to_str(MENU_ENUM_LABEL_CHEAT_START_OR_CONT)) diff --git a/menu/drivers/ozone.c b/menu/drivers/ozone.c index c4a23bfc95..800b418ff2 100644 --- a/menu/drivers/ozone.c +++ b/menu/drivers/ozone.c @@ -1990,6 +1990,8 @@ static uintptr_t ozone_entries_icon_get_texture( case MENU_ENUM_LABEL_VIDEO_SHADER_PRESET_SAVE: case MENU_ENUM_LABEL_VIDEO_SHADER_PRESET_SAVE_AS: case MENU_ENUM_LABEL_CHEAT_FILE_SAVE_AS: + case MENU_ENUM_LABEL_OVERRIDE_FILE_SAVE_AS: + case MENU_ENUM_LABEL_REMAP_FILE_SAVE_AS: case MENU_ENUM_LABEL_QUICK_MENU_SHOW_SAVESTATE_SUBMENU: case MENU_ENUM_LABEL_QUICK_MENU_SHOW_SAVE_LOAD_STATE: case MENU_ENUM_LABEL_QUICK_MENU_SHOW_REPLAY: diff --git a/menu/drivers/xmb.c b/menu/drivers/xmb.c index e5ed0d0fe0..a2eaac6f53 100644 --- a/menu/drivers/xmb.c +++ b/menu/drivers/xmb.c @@ -3140,6 +3140,8 @@ static uintptr_t xmb_icon_get_id(xmb_handle_t *xmb, case MENU_ENUM_LABEL_VIDEO_SHADER_PRESET_SAVE: case MENU_ENUM_LABEL_VIDEO_SHADER_PRESET_SAVE_AS: case MENU_ENUM_LABEL_CHEAT_FILE_SAVE_AS: + case MENU_ENUM_LABEL_OVERRIDE_FILE_SAVE_AS: + case MENU_ENUM_LABEL_REMAP_FILE_SAVE_AS: case MENU_ENUM_LABEL_QUICK_MENU_SHOW_SAVESTATE_SUBMENU: case MENU_ENUM_LABEL_QUICK_MENU_SHOW_SAVE_LOAD_STATE: case MENU_ENUM_LABEL_QUICK_MENU_SHOW_REPLAY: diff --git a/menu/menu_displaylist.c b/menu/menu_displaylist.c index 5d46b6e96a..2fc439a78d 100644 --- a/menu/menu_displaylist.c +++ b/menu/menu_displaylist.c @@ -1368,6 +1368,14 @@ static unsigned menu_displaylist_parse_remap_file_manager_list(file_list_t *list MENU_SETTING_ACTION_REMAP_FILE_LOAD, 0, 0, NULL)) count++; + /* Save as */ + if (menu_entries_append(list, + msg_hash_to_str(MENU_ENUM_LABEL_VALUE_REMAP_FILE_SAVE_AS), + msg_hash_to_str(MENU_ENUM_LABEL_REMAP_FILE_SAVE_AS), + MENU_ENUM_LABEL_REMAP_FILE_SAVE_AS, + MENU_SETTING_ACTION_REMAP_FILE_SAVE_AS, 0, 0, NULL)) + count++; + if (!game_remap_active) { /* Save remap files */ @@ -6543,6 +6551,15 @@ unsigned menu_displaylist_build_list( if (!settings->bools.kiosk_mode_enable) { + /* Save as */ + if (menu_entries_append(list, + msg_hash_to_str(MENU_ENUM_LABEL_VALUE_OVERRIDE_FILE_SAVE_AS), + msg_hash_to_str(MENU_ENUM_LABEL_OVERRIDE_FILE_SAVE_AS), + MENU_ENUM_LABEL_OVERRIDE_FILE_SAVE_AS, + MENU_SETTING_ACTION, 0, 0, NULL)) + count++; + + /* Save/Remove game/content_dir/core */ if (has_content) { if (settings->bools.quick_menu_show_save_game_overrides) diff --git a/menu/menu_driver.h b/menu/menu_driver.h index 19bf4aa4d5..51d8848fdb 100644 --- a/menu/menu_driver.h +++ b/menu/menu_driver.h @@ -294,6 +294,7 @@ enum menu_settings_type MENU_SETTING_ACTION_CORE_OPTIONS_FLUSH, MENU_SETTING_ACTION_REMAP_FILE_LOAD, + MENU_SETTING_ACTION_REMAP_FILE_SAVE_AS, MENU_SETTING_ACTION_REMAP_FILE_SAVE_CORE, MENU_SETTING_ACTION_REMAP_FILE_SAVE_CONTENT_DIR, MENU_SETTING_ACTION_REMAP_FILE_SAVE_GAME, diff --git a/msg_hash.h b/msg_hash.h index fce4a14f2d..df9f9ab137 100644 --- a/msg_hash.h +++ b/msg_hash.h @@ -379,8 +379,10 @@ enum msg_hash_enums MSG_APPLYING_CHEAT, MSG_APPLYING_PATCH, MSG_INPUT_CHEAT, - MSG_INPUT_PRESET_FILENAME, MSG_INPUT_CHEAT_FILENAME, + MSG_INPUT_PRESET_FILENAME, + MSG_INPUT_OVERRIDE_FILENAME, + MSG_INPUT_REMAP_FILENAME, MSG_INPUT_RENAME_ENTRY, MSG_INPUT_ENABLE_SETTINGS_PASSWORD, MSG_INPUT_ENABLE_SETTINGS_PASSWORD_OK, @@ -634,10 +636,9 @@ enum msg_hash_enums MENU_ENUM_LABEL_DISCORD_STATUS_PAUSED, MENU_ENUM_LABEL_VALUE_DISCORD_STATUS_PAUSED, - - MENU_ENUM_LABEL_VALUE_REMAP_FILE, MENU_ENUM_LABEL_VALUE_CHEAT_FILE, MENU_ENUM_LABEL_VALUE_CHEAT_FILE_APPEND, + MENU_ENUM_LABEL_HELP_INPUT_RETROPAD_BINDS, MENU_ENUM_LABEL_INPUT_HOTKEY_BIND_BEGIN, MENU_ENUM_LABEL_INPUT_HOTKEY_BIND_END = MENU_ENUM_LABEL_INPUT_HOTKEY_BIND_BEGIN + RARCH_BIND_LIST_END, @@ -2996,6 +2997,7 @@ enum msg_hash_enums MENU_LABEL(VIDEO_SHADER_PRESET_APPEND), MENU_LABEL(CHEAT_FILE_LOAD), MENU_LABEL(CHEAT_FILE_LOAD_APPEND), + MENU_LABEL(CHEAT_FILE_SAVE_AS), MENU_ENUM_LABEL_MESSAGE, MENU_ENUM_LABEL_INFO_SCREEN, @@ -3171,9 +3173,11 @@ enum msg_hash_enums MENU_ENUM_LABEL_EXIT_EMULATOR, MENU_ENUM_LABEL_OSK_ENABLE, + MENU_ENUM_LABEL_VALUE_REMAP_FILE, MENU_LABEL(REMAP_FILE_MANAGER_LIST), MENU_LABEL(REMAP_FILE_INFO), MENU_LABEL(REMAP_FILE_LOAD), + MENU_LABEL(REMAP_FILE_SAVE_AS), MENU_LABEL(REMAP_FILE_SAVE_CORE), MENU_LABEL(REMAP_FILE_SAVE_CONTENT_DIR), MENU_LABEL(REMAP_FILE_SAVE_GAME), @@ -3185,13 +3189,13 @@ enum msg_hash_enums MENU_LABEL(OVERRIDE_FILE_INFO), MENU_LABEL(OVERRIDE_FILE_LOAD), + MENU_LABEL(OVERRIDE_FILE_SAVE_AS), MENU_LABEL(OVERRIDE_UNLOAD), MENU_LABEL(RESTART_CONTENT), MENU_LABEL(RESUME), MENU_LABEL(RESUME_CONTENT), - MENU_LABEL(CHEAT_FILE_SAVE_AS), MENU_LABEL(DELETE_ENTRY), MENU_LABEL(RENAME_ENTRY),