diff --git a/config.def.h b/config.def.h index 9071bdc071..a41e24613f 100644 --- a/config.def.h +++ b/config.def.h @@ -623,6 +623,8 @@ #define DEFAULT_QUICK_MENU_SHOW_TAKE_SCREENSHOT true +#define DEFAULT_QUICK_MENU_SHOW_SAVESTATE_SUBMENU false + #define DEFAULT_QUICK_MENU_SHOW_SAVE_LOAD_STATE true #define DEFAULT_QUICK_MENU_SHOW_UNDO_SAVE_LOAD_STATE true diff --git a/configuration.c b/configuration.c index 8674953ea0..4769176fe7 100644 --- a/configuration.c +++ b/configuration.c @@ -1808,6 +1808,7 @@ static struct config_bool_setting *populate_settings_bool( SETTING_BOOL("quick_menu_show_close_content", &settings->bools.quick_menu_show_close_content, true, DEFAULT_QUICK_MENU_SHOW_CLOSE_CONTENT, false); SETTING_BOOL("quick_menu_show_recording", &settings->bools.quick_menu_show_recording, true, quick_menu_show_recording, false); SETTING_BOOL("quick_menu_show_streaming", &settings->bools.quick_menu_show_streaming, true, quick_menu_show_streaming, false); + SETTING_BOOL("quick_menu_show_savestate_submenu", &settings->bools.quick_menu_show_savestate_submenu, true, DEFAULT_QUICK_MENU_SHOW_SAVESTATE_SUBMENU, false); SETTING_BOOL("quick_menu_show_save_load_state", &settings->bools.quick_menu_show_save_load_state, true, DEFAULT_QUICK_MENU_SHOW_SAVE_LOAD_STATE, false); SETTING_BOOL("quick_menu_show_take_screenshot", &settings->bools.quick_menu_show_take_screenshot, true, DEFAULT_QUICK_MENU_SHOW_TAKE_SCREENSHOT, false); SETTING_BOOL("quick_menu_show_undo_save_load_state", &settings->bools.quick_menu_show_undo_save_load_state, true, DEFAULT_QUICK_MENU_SHOW_UNDO_SAVE_LOAD_STATE, false); diff --git a/configuration.h b/configuration.h index 98c7d40007..2dafacabff 100644 --- a/configuration.h +++ b/configuration.h @@ -751,6 +751,7 @@ typedef struct settings bool quick_menu_show_restart_content; bool quick_menu_show_close_content; bool quick_menu_show_take_screenshot; + bool quick_menu_show_savestate_submenu; bool quick_menu_show_save_load_state; bool quick_menu_show_undo_save_load_state; bool quick_menu_show_add_to_favorites; diff --git a/intl/msg_hash_lbl.h b/intl/msg_hash_lbl.h index dbc3f78da8..51ab8f2aaa 100644 --- a/intl/msg_hash_lbl.h +++ b/intl/msg_hash_lbl.h @@ -580,6 +580,10 @@ MSG_HASH( MENU_ENUM_LABEL_SIDELOAD_CORE_LIST, "sideload_core" ) +MSG_HASH( + MENU_ENUM_LABEL_SAVESTATE_LIST, + "savestate_list" + ) MSG_HASH( MENU_ENUM_LABEL_CORE_OPTIONS, "core_options" @@ -4400,6 +4404,10 @@ MSG_HASH( MENU_ENUM_LABEL_QUICK_MENU_SHOW_RESET_CORE_ASSOCIATION, "quick_menu_show_reset_core_association" ) +MSG_HASH( + MENU_ENUM_LABEL_QUICK_MENU_SHOW_SAVESTATE_SUBMENU, + "quick_menu_show_savestate_submenu" + ) MSG_HASH( MENU_ENUM_LABEL_QUICK_MENU_SHOW_OPTIONS, "quick_menu_show_options" diff --git a/intl/msg_hash_us.h b/intl/msg_hash_us.h index c22e075df1..144af28959 100644 --- a/intl/msg_hash_us.h +++ b/intl/msg_hash_us.h @@ -4934,12 +4934,12 @@ MSG_HASH( "Show the 'Close Content' option." ) MSG_HASH( - MENU_ENUM_LABEL_VALUE_QUICK_MENU_SHOW_TAKE_SCREENSHOT, - "Show 'Take Screenshot'" + MENU_ENUM_LABEL_VALUE_QUICK_MENU_SHOW_SAVESTATE_SUBMENU, + "Show Save State Submenu" ) MSG_HASH( - MENU_ENUM_SUBLABEL_QUICK_MENU_SHOW_TAKE_SCREENSHOT, - "Show the 'Take Screenshot' option." + MENU_ENUM_SUBLABEL_QUICK_MENU_SHOW_SAVESTATE_SUBMENU, + "Show save state options in a submenu." ) MSG_HASH( MENU_ENUM_LABEL_VALUE_QUICK_MENU_SHOW_SAVE_LOAD_STATE, @@ -4957,53 +4957,13 @@ MSG_HASH( MENU_ENUM_SUBLABEL_QUICK_MENU_SHOW_UNDO_SAVE_LOAD_STATE, "Show the options for undoing save/load state." ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_QUICK_MENU_SHOW_ADD_TO_FAVORITES, - "Show 'Add to Favorites'" - ) -MSG_HASH( - MENU_ENUM_SUBLABEL_QUICK_MENU_SHOW_ADD_TO_FAVORITES, - "Show the 'Add to Favorites' option." - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_QUICK_MENU_SHOW_START_RECORDING, - "Show 'Start Recording'" - ) -MSG_HASH( - MENU_ENUM_SUBLABEL_QUICK_MENU_SHOW_START_RECORDING, - "Show the 'Start Recording' option." - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_QUICK_MENU_SHOW_START_STREAMING, - "Show 'Start Streaming'" - ) -MSG_HASH( - MENU_ENUM_SUBLABEL_QUICK_MENU_SHOW_START_STREAMING, - "Show the 'Start Streaming' option." - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_QUICK_MENU_SHOW_SET_CORE_ASSOCIATION, - "Show 'Set Core Association'" - ) -MSG_HASH( - MENU_ENUM_SUBLABEL_QUICK_MENU_SHOW_SET_CORE_ASSOCIATION, - "Show the 'Set Core Association' option." - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_QUICK_MENU_SHOW_RESET_CORE_ASSOCIATION, - "Show 'Reset Core Association'" - ) -MSG_HASH( - MENU_ENUM_SUBLABEL_QUICK_MENU_SHOW_RESET_CORE_ASSOCIATION, - "Show the 'Reset Core Association' option." - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_QUICK_MENU_SHOW_OPTIONS, - "Show 'Options'" + "Show 'Core Options'" ) MSG_HASH( MENU_ENUM_SUBLABEL_QUICK_MENU_SHOW_OPTIONS, - "Show the 'Options' option." + "Show the 'Core Options' option." ) MSG_HASH( MENU_ENUM_LABEL_VALUE_QUICK_MENU_SHOW_CORE_OPTIONS_FLUSH, @@ -5022,36 +4982,28 @@ MSG_HASH( "Show the 'Controls' option." ) MSG_HASH( - MENU_ENUM_LABEL_VALUE_QUICK_MENU_SHOW_CHEATS, - "Show 'Cheats'" + MENU_ENUM_LABEL_VALUE_QUICK_MENU_SHOW_TAKE_SCREENSHOT, + "Show 'Take Screenshot'" ) MSG_HASH( - MENU_ENUM_SUBLABEL_QUICK_MENU_SHOW_CHEATS, - "Show the 'Cheats' option." + MENU_ENUM_SUBLABEL_QUICK_MENU_SHOW_TAKE_SCREENSHOT, + "Show the 'Take Screenshot' option." ) MSG_HASH( - MENU_ENUM_LABEL_VALUE_QUICK_MENU_SHOW_SHADERS, - "Show 'Shaders'" + MENU_ENUM_LABEL_VALUE_QUICK_MENU_SHOW_START_RECORDING, + "Show 'Start Recording'" ) MSG_HASH( - MENU_ENUM_SUBLABEL_QUICK_MENU_SHOW_SHADERS, - "Show the 'Shaders' option." + MENU_ENUM_SUBLABEL_QUICK_MENU_SHOW_START_RECORDING, + "Show the 'Start Recording' option." ) MSG_HASH( - MENU_ENUM_LABEL_VALUE_CONTENT_SHOW_REWIND, - "Show 'Rewind'" + MENU_ENUM_LABEL_VALUE_QUICK_MENU_SHOW_START_STREAMING, + "Show 'Start Streaming'" ) MSG_HASH( - MENU_ENUM_SUBLABEL_CONTENT_SHOW_REWIND, - "Show the 'Rewind' options." - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_CONTENT_SHOW_LATENCY, - "Show 'Latency'" - ) -MSG_HASH( - MENU_ENUM_SUBLABEL_CONTENT_SHOW_LATENCY, - "Show the 'Latency' option." + MENU_ENUM_SUBLABEL_QUICK_MENU_SHOW_START_STREAMING, + "Show the 'Start Streaming' option." ) MSG_HASH( MENU_ENUM_LABEL_VALUE_CONTENT_SHOW_OVERLAYS, @@ -5069,6 +5021,22 @@ MSG_HASH( MENU_ENUM_SUBLABEL_CONTENT_SHOW_VIDEO_LAYOUT, "Show 'Video Layout' option." ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_CONTENT_SHOW_LATENCY, + "Show 'Latency'" + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_CONTENT_SHOW_LATENCY, + "Show the 'Latency' option." + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_CONTENT_SHOW_REWIND, + "Show 'Rewind'" + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_CONTENT_SHOW_REWIND, + "Show the 'Rewind' options." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_QUICK_MENU_SHOW_SAVE_CORE_OVERRIDES, "Show 'Save Core Overrides'" @@ -5086,12 +5054,44 @@ MSG_HASH( "Show the 'Save Game Overrides' option in the 'Overrides' menu." ) MSG_HASH( - MENU_ENUM_LABEL_VALUE_QUICK_MENU_SHOW_INFORMATION, - "Show 'Information'" + MENU_ENUM_LABEL_VALUE_QUICK_MENU_SHOW_CHEATS, + "Show 'Cheats'" ) MSG_HASH( - MENU_ENUM_SUBLABEL_QUICK_MENU_SHOW_INFORMATION, - "Show the 'Information' option." + MENU_ENUM_SUBLABEL_QUICK_MENU_SHOW_CHEATS, + "Show the 'Cheats' option." + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_QUICK_MENU_SHOW_SHADERS, + "Show 'Shaders'" + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_QUICK_MENU_SHOW_SHADERS, + "Show the 'Shaders' option." + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_QUICK_MENU_SHOW_ADD_TO_FAVORITES, + "Show 'Add to Favorites'" + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_QUICK_MENU_SHOW_ADD_TO_FAVORITES, + "Show the 'Add to Favorites' option." + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_QUICK_MENU_SHOW_SET_CORE_ASSOCIATION, + "Show 'Set Core Association'" + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_QUICK_MENU_SHOW_SET_CORE_ASSOCIATION, + "Show the 'Set Core Association' option when content is not running." + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_QUICK_MENU_SHOW_RESET_CORE_ASSOCIATION, + "Show 'Reset Core Association'" + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_QUICK_MENU_SHOW_RESET_CORE_ASSOCIATION, + "Show the 'Reset Core Association' option when content is not running." ) MSG_HASH( MENU_ENUM_LABEL_VALUE_QUICK_MENU_SHOW_DOWNLOAD_THUMBNAILS, @@ -5099,7 +5099,15 @@ MSG_HASH( ) MSG_HASH( MENU_ENUM_SUBLABEL_QUICK_MENU_SHOW_DOWNLOAD_THUMBNAILS, - "Show the 'Download Thumbnails' option." + "Show the 'Download Thumbnails' option when content is not running." + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_QUICK_MENU_SHOW_INFORMATION, + "Show 'Information'" + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_QUICK_MENU_SHOW_INFORMATION, + "Show the 'Information' option." ) /* Settings > User Interface > Views > Settings */ @@ -7060,9 +7068,17 @@ MSG_HASH( MENU_ENUM_SUBLABEL_QUICK_MENU_STOP_STREAMING, "End stream." ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_SAVESTATE_LIST, + "Save States" + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_SAVESTATE_LIST, + "Access save state options." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_CORE_OPTIONS, - "Options" + "Core Options" ) MSG_HASH( MENU_ENUM_SUBLABEL_CORE_OPTIONS, diff --git a/menu/cbs/menu_cbs_deferred_push.c b/menu/cbs/menu_cbs_deferred_push.c index 072c848010..cb0fe66cce 100644 --- a/menu/cbs/menu_cbs_deferred_push.c +++ b/menu/cbs/menu_cbs_deferred_push.c @@ -128,6 +128,7 @@ GENERIC_DEFERRED_PUSH(deferred_push_frontend_counters, DISPLAYLIST_ GENERIC_DEFERRED_PUSH(deferred_push_core_cheat_options, DISPLAYLIST_OPTIONS_CHEATS) GENERIC_DEFERRED_PUSH(deferred_push_core_input_remapping_options, DISPLAYLIST_OPTIONS_REMAPPINGS) GENERIC_DEFERRED_PUSH(deferred_push_remap_file_manager, DISPLAYLIST_REMAP_FILE_MANAGER) +GENERIC_DEFERRED_PUSH(deferred_push_savestate_list, DISPLAYLIST_SAVESTATE_LIST) GENERIC_DEFERRED_PUSH(deferred_push_core_options, DISPLAYLIST_CORE_OPTIONS) GENERIC_DEFERRED_PUSH(deferred_push_core_option_override_list, DISPLAYLIST_CORE_OPTION_OVERRIDE_LIST) GENERIC_DEFERRED_PUSH(deferred_push_disk_options, DISPLAYLIST_OPTIONS_DISK) @@ -806,6 +807,7 @@ static int menu_cbs_init_bind_deferred_push_compare_label( {MENU_ENUM_LABEL_DEFERRED_ACCOUNTS_LIST, deferred_push_accounts_list}, {MENU_ENUM_LABEL_CORE_LIST, deferred_push_core_list}, {MENU_ENUM_LABEL_LOAD_CONTENT_HISTORY, deferred_push_history_list}, + {MENU_ENUM_LABEL_SAVESTATE_LIST, deferred_push_savestate_list}, {MENU_ENUM_LABEL_CORE_OPTIONS, deferred_push_core_options}, {MENU_ENUM_LABEL_DEFERRED_CORE_OPTION_OVERRIDE_LIST, deferred_push_core_option_override_list}, {MENU_ENUM_LABEL_NETWORK_INFORMATION, deferred_push_network_information}, @@ -1171,6 +1173,9 @@ static int menu_cbs_init_bind_deferred_push_compare_label( case MENU_ENUM_LABEL_SETTINGS: BIND_ACTION_DEFERRED_PUSH(cbs, deferred_push_settings); break; + case MENU_ENUM_LABEL_SAVESTATE_LIST: + BIND_ACTION_DEFERRED_PUSH(cbs, deferred_push_savestate_list); + break; case MENU_ENUM_LABEL_CORE_OPTIONS: BIND_ACTION_DEFERRED_PUSH(cbs, deferred_push_core_options); break; diff --git a/menu/cbs/menu_cbs_ok.c b/menu/cbs/menu_cbs_ok.c index ad27d5e364..7c6a31745d 100644 --- a/menu/cbs/menu_cbs_ok.c +++ b/menu/cbs/menu_cbs_ok.c @@ -1234,6 +1234,13 @@ int generic_action_ok_displaylist_push(const char *path, info_label = label; dl_type = DISPLAYLIST_FILE_BROWSER_SELECT_FILE; break; + case ACTION_OK_DL_SAVESTATE_LIST: + info.type = type; + info.directory_ptr = idx; + info_path = path; + info_label = label; + dl_type = DISPLAYLIST_GENERIC; + break; case ACTION_OK_DL_CORE_OPTIONS_LIST: info.type = type; info.directory_ptr = idx; @@ -5903,6 +5910,7 @@ DEFAULT_ACTION_OK_FUNC(action_ok_push_core_manager_steam_list, ACTION_OK_DL_CORE #endif DEFAULT_ACTION_OK_FUNC(action_ok_push_core_option_override_list, ACTION_OK_DL_CORE_OPTION_OVERRIDE_LIST) DEFAULT_ACTION_OK_FUNC(action_ok_push_remap_file_manager_list, ACTION_OK_DL_REMAP_FILE_MANAGER_LIST) +DEFAULT_ACTION_OK_FUNC(action_ok_push_savestate_list, ACTION_OK_DL_SAVESTATE_LIST) DEFAULT_ACTION_OK_FUNC(action_ok_push_core_options_list, ACTION_OK_DL_CORE_OPTIONS_LIST) static int action_ok_open_uwp_permission_settings(const char *path, @@ -8274,6 +8282,7 @@ static int menu_cbs_init_bind_ok_compare_label(menu_file_list_cbs_t *cbs, #endif {MENU_ENUM_LABEL_LOAD_DISC, action_ok_push_load_disc_list}, {MENU_ENUM_LABEL_SHADER_OPTIONS, action_ok_push_default}, + {MENU_ENUM_LABEL_SAVESTATE_LIST, action_ok_push_savestate_list}, {MENU_ENUM_LABEL_CORE_OPTIONS, action_ok_push_core_options_list}, {MENU_ENUM_LABEL_CORE_OPTION_OVERRIDE_LIST, action_ok_push_core_option_override_list}, {MENU_ENUM_LABEL_REMAP_FILE_MANAGER_LIST, action_ok_push_remap_file_manager_list}, diff --git a/menu/cbs/menu_cbs_sublabel.c b/menu/cbs/menu_cbs_sublabel.c index 1d8a56144c..fd1246c281 100644 --- a/menu/cbs/menu_cbs_sublabel.c +++ b/menu/cbs/menu_cbs_sublabel.c @@ -827,11 +827,12 @@ DEFAULT_SUBLABEL_MACRO(action_bind_sublabel_core_enable, DEFAULT_SUBLABEL_MACRO(action_bind_sublabel_database_manager, MENU_ENUM_SUBLABEL_DATABASE_MANAGER) DEFAULT_SUBLABEL_MACRO(action_bind_sublabel_cursor_manager, MENU_ENUM_SUBLABEL_CURSOR_MANAGER) DEFAULT_SUBLABEL_MACRO(action_bind_sublabel_take_screenshot, MENU_ENUM_SUBLABEL_TAKE_SCREENSHOT) +DEFAULT_SUBLABEL_MACRO(action_bind_sublabel_resume_content, MENU_ENUM_SUBLABEL_RESUME_CONTENT) DEFAULT_SUBLABEL_MACRO(action_bind_sublabel_close_content, MENU_ENUM_SUBLABEL_CLOSE_CONTENT) +DEFAULT_SUBLABEL_MACRO(action_bind_sublabel_savestate_list, MENU_ENUM_SUBLABEL_SAVESTATE_LIST) +DEFAULT_SUBLABEL_MACRO(action_bind_sublabel_state_slot, MENU_ENUM_SUBLABEL_STATE_SLOT) DEFAULT_SUBLABEL_MACRO(action_bind_sublabel_load_state, MENU_ENUM_SUBLABEL_LOAD_STATE) DEFAULT_SUBLABEL_MACRO(action_bind_sublabel_save_state, MENU_ENUM_SUBLABEL_SAVE_STATE) -DEFAULT_SUBLABEL_MACRO(action_bind_sublabel_resume_content, MENU_ENUM_SUBLABEL_RESUME_CONTENT) -DEFAULT_SUBLABEL_MACRO(action_bind_sublabel_state_slot, MENU_ENUM_SUBLABEL_STATE_SLOT) DEFAULT_SUBLABEL_MACRO(action_bind_sublabel_undo_load_state, MENU_ENUM_SUBLABEL_UNDO_LOAD_STATE) DEFAULT_SUBLABEL_MACRO(action_bind_sublabel_undo_save_state, MENU_ENUM_SUBLABEL_UNDO_SAVE_STATE) DEFAULT_SUBLABEL_MACRO(action_bind_sublabel_accounts_retro_achievements, MENU_ENUM_SUBLABEL_ACCOUNTS_RETRO_ACHIEVEMENTS) @@ -925,6 +926,7 @@ DEFAULT_SUBLABEL_MACRO(action_bind_sublabel_quick_menu_show_take_screenshot, DEFAULT_SUBLABEL_MACRO(action_bind_sublabel_quick_menu_show_resume_content, MENU_ENUM_SUBLABEL_QUICK_MENU_SHOW_RESUME_CONTENT) DEFAULT_SUBLABEL_MACRO(action_bind_sublabel_quick_menu_show_restart_content, MENU_ENUM_SUBLABEL_QUICK_MENU_SHOW_RESTART_CONTENT) DEFAULT_SUBLABEL_MACRO(action_bind_sublabel_quick_menu_show_close_content, MENU_ENUM_SUBLABEL_QUICK_MENU_SHOW_CLOSE_CONTENT) +DEFAULT_SUBLABEL_MACRO(action_bind_sublabel_quick_menu_show_savestate_submenu, MENU_ENUM_SUBLABEL_QUICK_MENU_SHOW_SAVESTATE_SUBMENU) DEFAULT_SUBLABEL_MACRO(action_bind_sublabel_quick_menu_show_save_load_state, MENU_ENUM_SUBLABEL_QUICK_MENU_SHOW_SAVE_LOAD_STATE) DEFAULT_SUBLABEL_MACRO(action_bind_sublabel_quick_menu_show_undo_save_load_state, MENU_ENUM_SUBLABEL_QUICK_MENU_SHOW_UNDO_SAVE_LOAD_STATE) DEFAULT_SUBLABEL_MACRO(action_bind_sublabel_quick_menu_show_add_to_favorites, MENU_ENUM_SUBLABEL_QUICK_MENU_SHOW_ADD_TO_FAVORITES) @@ -2621,6 +2623,9 @@ int menu_cbs_init_bind_sublabel(menu_file_list_cbs_t *cbs, case MENU_ENUM_LABEL_QUICK_MENU_SHOW_TAKE_SCREENSHOT: BIND_ACTION_SUBLABEL(cbs, action_bind_sublabel_quick_menu_show_take_screenshot); break; + case MENU_ENUM_LABEL_QUICK_MENU_SHOW_SAVESTATE_SUBMENU: + BIND_ACTION_SUBLABEL(cbs, action_bind_sublabel_quick_menu_show_savestate_submenu); + break; case MENU_ENUM_LABEL_QUICK_MENU_SHOW_SAVE_LOAD_STATE: BIND_ACTION_SUBLABEL(cbs, action_bind_sublabel_quick_menu_show_save_load_state); break; @@ -2956,6 +2961,9 @@ int menu_cbs_init_bind_sublabel(menu_file_list_cbs_t *cbs, case MENU_ENUM_LABEL_SHOW_ADVANCED_SETTINGS: BIND_ACTION_SUBLABEL(cbs, action_bind_sublabel_show_advanced_settings); break; + case MENU_ENUM_LABEL_SAVESTATE_LIST: + BIND_ACTION_SUBLABEL(cbs, action_bind_sublabel_savestate_list); + break; case MENU_ENUM_LABEL_CORE_OPTIONS: BIND_ACTION_SUBLABEL(cbs, action_bind_sublabel_core_options); break; diff --git a/menu/cbs/menu_cbs_title.c b/menu/cbs/menu_cbs_title.c index b53739fff9..b4a3f78ee5 100644 --- a/menu/cbs/menu_cbs_title.c +++ b/menu/cbs/menu_cbs_title.c @@ -585,6 +585,7 @@ DEFAULT_TITLE_MACRO(action_get_add_content_list, MENU_ENUM_LABEL_ DEFAULT_TITLE_MACRO(action_get_configurations_list, MENU_ENUM_LABEL_VALUE_CONFIGURATIONS_LIST) DEFAULT_TITLE_MACRO(action_get_core_option_override_list, MENU_ENUM_LABEL_VALUE_CORE_OPTION_OVERRIDE_LIST) DEFAULT_TITLE_MACRO(action_get_quick_menu_list, MENU_ENUM_LABEL_VALUE_CONTENT_SETTINGS) +DEFAULT_TITLE_MACRO(action_get_savestate_list, MENU_ENUM_LABEL_VALUE_SAVESTATE_LIST) DEFAULT_TITLE_MACRO(action_get_input_remapping_options_list, MENU_ENUM_LABEL_VALUE_CORE_INPUT_REMAPPING_OPTIONS) DEFAULT_TITLE_MACRO(action_get_remap_file_manager_list, MENU_ENUM_LABEL_VALUE_REMAP_FILE_MANAGER_LIST) DEFAULT_TITLE_MACRO(action_get_shader_options_list, MENU_ENUM_LABEL_VALUE_SHADER_OPTIONS) @@ -1174,6 +1175,8 @@ static int menu_cbs_init_bind_title_compare_label(menu_file_list_cbs_t *cbs, action_get_configurations_list}, {MENU_ENUM_LABEL_ADD_CONTENT_LIST, action_get_add_content_list}, + {MENU_ENUM_LABEL_SAVESTATE_LIST, + action_get_savestate_list}, {MENU_ENUM_LABEL_CORE_OPTIONS, action_get_title_core_options_list}, {MENU_ENUM_LABEL_DEFERRED_CORE_OPTION_OVERRIDE_LIST, @@ -1507,6 +1510,9 @@ static int menu_cbs_init_bind_title_compare_label(menu_file_list_cbs_t *cbs, case MENU_ENUM_LABEL_CONFIGURATIONS_LIST: BIND_ACTION_GET_TITLE(cbs, action_get_configurations_list); break; + case MENU_ENUM_LABEL_SAVESTATE_LIST: + BIND_ACTION_GET_TITLE(cbs, action_get_savestate_list); + break; case MENU_ENUM_LABEL_CORE_OPTIONS: BIND_ACTION_GET_TITLE(cbs, action_get_title_core_options_list); break; diff --git a/menu/drivers/materialui.c b/menu/drivers/materialui.c index e3b2227e38..0fed890e68 100644 --- a/menu/drivers/materialui.c +++ b/menu/drivers/materialui.c @@ -10521,6 +10521,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_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_SAVE_CURRENT_CONFIG_OVERRIDE_CORE)) || string_is_equal(label, msg_hash_to_str(MENU_ENUM_LABEL_SAVE_CURRENT_CONFIG_OVERRIDE_CONTENT_DIR)) || diff --git a/menu/drivers/ozone.c b/menu/drivers/ozone.c index e85d355711..6b08f6a028 100644 --- a/menu/drivers/ozone.c +++ b/menu/drivers/ozone.c @@ -1744,6 +1744,7 @@ static uintptr_t ozone_entries_icon_get_texture(ozone_handle_t *ozone, return ozone->icons_textures[OZONE_ENTRIES_ICONS_TEXTURE_ACHIEVEMENT_LIST]; case MENU_ENUM_LABEL_STATE_SLOT: return ozone->icons_textures[OZONE_ENTRIES_ICONS_TEXTURE_SETTING]; + case MENU_ENUM_LABEL_SAVESTATE_LIST: case MENU_ENUM_LABEL_SAVE_STATE: case MENU_ENUM_LABEL_CORE_CREATE_BACKUP: case MENU_ENUM_LABEL_GAME_SPECIFIC_CORE_OPTIONS_CREATE: diff --git a/menu/drivers/xmb.c b/menu/drivers/xmb.c index efaa56aa06..926f5fd4a3 100644 --- a/menu/drivers/xmb.c +++ b/menu/drivers/xmb.c @@ -1709,6 +1709,9 @@ static void xmb_list_open_new(xmb_handle_t *xmb, size_t skip = 0; int threshold = xmb->icon_size * 10; size_t end = list ? list->size : 0; + settings_t *settings = config_get_ptr(); + bool savestate_thumbnail_enable + = settings ? settings->bools.savestate_thumbnail_enable : false; video_driver_get_size(NULL, &height); @@ -1801,6 +1804,16 @@ static void xmb_list_open_new(xmb_handle_t *xmb, } } } + + if (savestate_thumbnail_enable && + xmb->is_quick_menu && + (xmb->depth == 3)) + { + /* This shows savestate thumbnail after + * opening savestate submenu */ + xmb_update_savestate_thumbnail_path(xmb, 0); + xmb_update_savestate_thumbnail_image(xmb); + } } static xmb_node_t *xmb_node_allocate_userdata( @@ -2502,7 +2515,8 @@ static void xmb_populate_entries(void *data, /* Determine whether this is the quick menu */ xmb->is_quick_menu = string_is_equal(label, msg_hash_to_str(MENU_ENUM_LABEL_DEFERRED_RPL_ENTRY_ACTIONS)) || - string_is_equal(label, msg_hash_to_str(MENU_ENUM_LABEL_CONTENT_SETTINGS)); + string_is_equal(label, msg_hash_to_str(MENU_ENUM_LABEL_CONTENT_SETTINGS)) || + string_is_equal(label, msg_hash_to_str(MENU_ENUM_LABEL_SAVESTATE_LIST)); xmb_set_title(xmb); xmb_update_dynamic_wallpaper(xmb); @@ -2593,6 +2607,7 @@ static uintptr_t xmb_icon_get_id(xmb_handle_t *xmb, case MENU_ENUM_LABEL_ACHIEVEMENT_LIST: case MENU_ENUM_LABEL_ACHIEVEMENT_LIST_HARDCORE: return xmb->textures.list[XMB_TEXTURE_ACHIEVEMENT_LIST]; + case MENU_ENUM_LABEL_SAVESTATE_LIST: case MENU_ENUM_LABEL_SAVE_STATE: case MENU_ENUM_LABEL_SAVESTATE_AUTO_SAVE: case MENU_ENUM_LABEL_CORE_CREATE_BACKUP: diff --git a/menu/menu_cbs.h b/menu/menu_cbs.h index 27a3e86cc8..1c7bdeaaf4 100644 --- a/menu/menu_cbs.h +++ b/menu/menu_cbs.h @@ -223,6 +223,7 @@ enum ACTION_OK_DL_MANUAL_CONTENT_SCAN_DAT_FILE, ACTION_OK_DL_CORE_RESTORE_BACKUP_LIST, ACTION_OK_DL_CORE_DELETE_BACKUP_LIST, + ACTION_OK_DL_SAVESTATE_LIST, ACTION_OK_DL_CORE_OPTION_OVERRIDE_LIST, ACTION_OK_DL_CORE_OPTIONS_LIST, ACTION_OK_DL_REMAP_FILE_MANAGER_LIST diff --git a/menu/menu_displaylist.c b/menu/menu_displaylist.c index f2ec71d6bb..0f568fa9ad 100644 --- a/menu/menu_displaylist.c +++ b/menu/menu_displaylist.c @@ -3362,6 +3362,96 @@ static int menu_displaylist_parse_load_content_settings( 0, 0)) count++; + if (settings->bools.quick_menu_show_savestate_submenu) + { + if (savestates_enabled) + if (menu_entries_append_enum(list, + msg_hash_to_str(MENU_ENUM_LABEL_VALUE_SAVESTATE_LIST), + msg_hash_to_str(MENU_ENUM_LABEL_SAVESTATE_LIST), + MENU_ENUM_LABEL_SAVESTATE_LIST, + MENU_SETTING_ACTION, 0, 0)) + count++; + } + else + { + if (savestates_enabled && + settings->bools.quick_menu_show_save_load_state) + { + if (MENU_DISPLAYLIST_PARSE_SETTINGS_ENUM(list, + MENU_ENUM_LABEL_STATE_SLOT, PARSE_ONLY_INT, true) == 0) + count++; + + if (menu_entries_append_enum(list, + msg_hash_to_str(MENU_ENUM_LABEL_VALUE_SAVE_STATE), + msg_hash_to_str(MENU_ENUM_LABEL_SAVE_STATE), + MENU_ENUM_LABEL_SAVE_STATE, + MENU_SETTING_ACTION_SAVESTATE, 0, 0)) + count++; + + if (menu_entries_append_enum(list, + msg_hash_to_str(MENU_ENUM_LABEL_VALUE_LOAD_STATE), + msg_hash_to_str(MENU_ENUM_LABEL_LOAD_STATE), + MENU_ENUM_LABEL_LOAD_STATE, + MENU_SETTING_ACTION_LOADSTATE, 0, 0)) + count++; + } + + if (savestates_enabled && + settings->bools.quick_menu_show_save_load_state && + settings->bools.quick_menu_show_undo_save_load_state) + { +#ifdef HAVE_CHEEVOS + if (!rcheevos_hardcore_active()) +#endif + { + if (menu_entries_append_enum(list, + msg_hash_to_str(MENU_ENUM_LABEL_VALUE_UNDO_LOAD_STATE), + msg_hash_to_str(MENU_ENUM_LABEL_UNDO_LOAD_STATE), + MENU_ENUM_LABEL_UNDO_LOAD_STATE, + MENU_SETTING_ACTION_LOADSTATE, 0, 0)) + count++; + } + + if (menu_entries_append_enum(list, + msg_hash_to_str(MENU_ENUM_LABEL_VALUE_UNDO_SAVE_STATE), + msg_hash_to_str(MENU_ENUM_LABEL_UNDO_SAVE_STATE), + MENU_ENUM_LABEL_UNDO_SAVE_STATE, + MENU_SETTING_ACTION_LOADSTATE, 0, 0)) + count++; + } + } + + if (settings->bools.quick_menu_show_options && !settings->bools.kiosk_mode_enable) + { + /* Empty 'path' string signifies top level + * core options menu */ + if (menu_entries_append_enum(list, + "", + msg_hash_to_str(MENU_ENUM_LABEL_CORE_OPTIONS), + MENU_ENUM_LABEL_CORE_OPTIONS, + MENU_SETTING_ACTION_CORE_OPTIONS, 0, 0)) + count++; + } + + if (settings->bools.quick_menu_show_controls && !settings->bools.kiosk_mode_enable) + { + if (menu_entries_append_enum(list, + msg_hash_to_str(MENU_ENUM_LABEL_VALUE_CORE_INPUT_REMAPPING_OPTIONS), + msg_hash_to_str(MENU_ENUM_LABEL_CORE_INPUT_REMAPPING_OPTIONS), + MENU_ENUM_LABEL_CORE_INPUT_REMAPPING_OPTIONS, + MENU_SETTING_ACTION, 0, 0)) + count++; + } + + if ((!retroarch_ctl(RARCH_CTL_IS_DUMMY_CORE, NULL)) + && disk_control_enabled(&system->disk_control)) + if (menu_entries_append_enum(list, + msg_hash_to_str(MENU_ENUM_LABEL_VALUE_DISK_OPTIONS), + msg_hash_to_str(MENU_ENUM_LABEL_DISK_OPTIONS), + MENU_ENUM_LABEL_DISK_OPTIONS, + MENU_SETTING_ACTION_CORE_DISK_OPTIONS, 0, 0)) + count++; + #ifdef HAVE_SCREENSHOTS if (settings->bools.quick_menu_show_take_screenshot) { @@ -3374,83 +3464,6 @@ static int menu_displaylist_parse_load_content_settings( } #endif - if (savestates_enabled && - settings->bools.quick_menu_show_save_load_state) - { - if (MENU_DISPLAYLIST_PARSE_SETTINGS_ENUM(list, - MENU_ENUM_LABEL_STATE_SLOT, PARSE_ONLY_INT, true) == 0) - count++; - - if (menu_entries_append_enum(list, - msg_hash_to_str(MENU_ENUM_LABEL_VALUE_SAVE_STATE), - msg_hash_to_str(MENU_ENUM_LABEL_SAVE_STATE), - MENU_ENUM_LABEL_SAVE_STATE, - MENU_SETTING_ACTION_SAVESTATE, 0, 0)) - count++; - - if (menu_entries_append_enum(list, - msg_hash_to_str(MENU_ENUM_LABEL_VALUE_LOAD_STATE), - msg_hash_to_str(MENU_ENUM_LABEL_LOAD_STATE), - MENU_ENUM_LABEL_LOAD_STATE, - MENU_SETTING_ACTION_LOADSTATE, 0, 0)) - count++; - } - - if (savestates_enabled && - settings->bools.quick_menu_show_save_load_state && - settings->bools.quick_menu_show_undo_save_load_state) - { -#ifdef HAVE_CHEEVOS - if (!rcheevos_hardcore_active()) -#endif - { - if (menu_entries_append_enum(list, - msg_hash_to_str(MENU_ENUM_LABEL_VALUE_UNDO_LOAD_STATE), - msg_hash_to_str(MENU_ENUM_LABEL_UNDO_LOAD_STATE), - MENU_ENUM_LABEL_UNDO_LOAD_STATE, - MENU_SETTING_ACTION_LOADSTATE, 0, 0)) - count++; - } - - if (menu_entries_append_enum(list, - msg_hash_to_str(MENU_ENUM_LABEL_VALUE_UNDO_SAVE_STATE), - msg_hash_to_str(MENU_ENUM_LABEL_UNDO_SAVE_STATE), - MENU_ENUM_LABEL_UNDO_SAVE_STATE, - MENU_SETTING_ACTION_LOADSTATE, 0, 0)) - count++; - } - - if ( - settings->bools.quick_menu_show_add_to_favorites && - settings->bools.menu_content_show_favorites - ) - { - bool add_to_favorites_enabled = true; - - /* Skip 'Add to Favourites' if we are currently - * viewing an entry of the favourites playlist */ - if (horizontal) - { - playlist_t *playlist = playlist_get_cached(); - const char *playlist_path = playlist_get_conf_path(playlist); - const char *playlist_file = NULL; - - if (!string_is_empty(playlist_path)) - playlist_file = path_basename_nocompression(playlist_path); - - if (!string_is_empty(playlist_file) && - string_is_equal(playlist_file, FILE_PATH_CONTENT_FAVORITES)) - add_to_favorites_enabled = false; - } - - if (add_to_favorites_enabled && - menu_entries_append_enum(list, - msg_hash_to_str(MENU_ENUM_LABEL_VALUE_ADD_TO_FAVORITES), - msg_hash_to_str(MENU_ENUM_LABEL_ADD_TO_FAVORITES), - MENU_ENUM_LABEL_ADD_TO_FAVORITES, FILE_TYPE_PLAYLIST_ENTRY, 0, 0)) - count++; - } - if (string_is_not_equal(settings->arrays.record_driver, "null")) { recording_state_t *recording_st = recording_state_get_ptr(); @@ -3496,15 +3509,34 @@ static int menu_displaylist_parse_load_content_settings( } } - if (settings->bools.quick_menu_show_options && !settings->bools.kiosk_mode_enable) + if ( + settings->bools.quick_menu_show_add_to_favorites && + settings->bools.menu_content_show_favorites + ) { - /* Empty 'path' string signifies top level - * core options menu */ - if (menu_entries_append_enum(list, - "", - msg_hash_to_str(MENU_ENUM_LABEL_CORE_OPTIONS), - MENU_ENUM_LABEL_CORE_OPTIONS, - MENU_SETTING_ACTION_CORE_OPTIONS, 0, 0)) + bool add_to_favorites_enabled = true; + + /* Skip 'Add to Favourites' if we are currently + * viewing an entry of the favourites playlist */ + if (horizontal) + { + playlist_t *playlist = playlist_get_cached(); + const char *playlist_path = playlist_get_conf_path(playlist); + const char *playlist_file = NULL; + + if (!string_is_empty(playlist_path)) + playlist_file = path_basename_nocompression(playlist_path); + + if (!string_is_empty(playlist_file) && + string_is_equal(playlist_file, FILE_PATH_CONTENT_FAVORITES)) + add_to_favorites_enabled = false; + } + + if (add_to_favorites_enabled && + menu_entries_append_enum(list, + msg_hash_to_str(MENU_ENUM_LABEL_VALUE_ADD_TO_FAVORITES), + msg_hash_to_str(MENU_ENUM_LABEL_ADD_TO_FAVORITES), + MENU_ENUM_LABEL_ADD_TO_FAVORITES, FILE_TYPE_PLAYLIST_ENTRY, 0, 0)) count++; } @@ -3530,6 +3562,16 @@ static int menu_displaylist_parse_load_content_settings( } #endif + if (settings->bools.menu_show_latency && !settings->bools.kiosk_mode_enable) + { + if (menu_entries_append_enum(list, + msg_hash_to_str(MENU_ENUM_LABEL_VALUE_LATENCY_SETTINGS), + msg_hash_to_str(MENU_ENUM_LABEL_LATENCY_SETTINGS), + MENU_ENUM_LABEL_LATENCY_SETTINGS, + MENU_SETTING_ACTION, 0, 0)) + count++; + } + #ifdef HAVE_REWIND if (settings->bools.menu_show_rewind && !settings->bools.kiosk_mode_enable && @@ -3544,71 +3586,6 @@ static int menu_displaylist_parse_load_content_settings( } #endif - if (settings->bools.menu_show_latency && !settings->bools.kiosk_mode_enable) - { - if (menu_entries_append_enum(list, - msg_hash_to_str(MENU_ENUM_LABEL_VALUE_LATENCY_SETTINGS), - msg_hash_to_str(MENU_ENUM_LABEL_LATENCY_SETTINGS), - MENU_ENUM_LABEL_LATENCY_SETTINGS, - MENU_SETTING_ACTION, 0, 0)) - count++; - } - -#if 0 - if (menu_entries_append_enum(list, - msg_hash_to_str(MENU_ENUM_LABEL_VALUE_NETPLAY_SETTINGS), - msg_hash_to_str(MENU_ENUM_LABEL_NETPLAY_SETTINGS), - MENU_ENUM_LABEL_NETPLAY_SETTINGS, - MENU_SETTING_ACTION, 0, 0)) - count++; -#endif - - if (settings->bools.quick_menu_show_controls && !settings->bools.kiosk_mode_enable) - { - if (menu_entries_append_enum(list, - msg_hash_to_str(MENU_ENUM_LABEL_VALUE_CORE_INPUT_REMAPPING_OPTIONS), - msg_hash_to_str(MENU_ENUM_LABEL_CORE_INPUT_REMAPPING_OPTIONS), - MENU_ENUM_LABEL_CORE_INPUT_REMAPPING_OPTIONS, - MENU_SETTING_ACTION, 0, 0)) - count++; - } - -#ifdef HAVE_CHEATS - if (settings->bools.quick_menu_show_cheats) - { - if (menu_entries_append_enum(list, - msg_hash_to_str(MENU_ENUM_LABEL_VALUE_CORE_CHEAT_OPTIONS), - msg_hash_to_str(MENU_ENUM_LABEL_CORE_CHEAT_OPTIONS), - MENU_ENUM_LABEL_CORE_CHEAT_OPTIONS, - MENU_SETTING_ACTION, 0, 0)) - count++; - } -#endif - - if ((!retroarch_ctl(RARCH_CTL_IS_DUMMY_CORE, NULL)) - && disk_control_enabled(&system->disk_control)) - if (menu_entries_append_enum(list, - msg_hash_to_str(MENU_ENUM_LABEL_VALUE_DISK_OPTIONS), - msg_hash_to_str(MENU_ENUM_LABEL_DISK_OPTIONS), - MENU_ENUM_LABEL_DISK_OPTIONS, - MENU_SETTING_ACTION_CORE_DISK_OPTIONS, 0, 0)) - count++; - -#if defined(HAVE_CG) || defined(HAVE_GLSL) || defined(HAVE_SLANG) || defined(HAVE_HLSL) - if (video_shader_any_supported()) - { - if (settings->bools.quick_menu_show_shaders && !settings->bools.kiosk_mode_enable) - { - if (menu_entries_append_enum(list, - msg_hash_to_str(MENU_ENUM_LABEL_VALUE_SHADER_OPTIONS), - msg_hash_to_str(MENU_ENUM_LABEL_SHADER_OPTIONS), - MENU_ENUM_LABEL_SHADER_OPTIONS, - MENU_SETTING_ACTION, 0, 0)) - count++; - } - } -#endif - if ((settings->bools.quick_menu_show_save_core_overrides || settings->bools.quick_menu_show_save_game_overrides) && !settings->bools.kiosk_mode_enable) @@ -3633,6 +3610,42 @@ static int menu_displaylist_parse_load_content_settings( } #endif +#ifdef HAVE_CHEATS + if (settings->bools.quick_menu_show_cheats) + { + if (menu_entries_append_enum(list, + msg_hash_to_str(MENU_ENUM_LABEL_VALUE_CORE_CHEAT_OPTIONS), + msg_hash_to_str(MENU_ENUM_LABEL_CORE_CHEAT_OPTIONS), + MENU_ENUM_LABEL_CORE_CHEAT_OPTIONS, + MENU_SETTING_ACTION, 0, 0)) + count++; + } +#endif + +#if 0 + if (menu_entries_append_enum(list, + msg_hash_to_str(MENU_ENUM_LABEL_VALUE_NETPLAY_SETTINGS), + msg_hash_to_str(MENU_ENUM_LABEL_NETPLAY_SETTINGS), + MENU_ENUM_LABEL_NETPLAY_SETTINGS, + MENU_SETTING_ACTION, 0, 0)) + count++; +#endif + +#if defined(HAVE_CG) || defined(HAVE_GLSL) || defined(HAVE_SLANG) || defined(HAVE_HLSL) + if (video_shader_any_supported()) + { + if (settings->bools.quick_menu_show_shaders && !settings->bools.kiosk_mode_enable) + { + if (menu_entries_append_enum(list, + msg_hash_to_str(MENU_ENUM_LABEL_VALUE_SHADER_OPTIONS), + msg_hash_to_str(MENU_ENUM_LABEL_SHADER_OPTIONS), + MENU_ENUM_LABEL_SHADER_OPTIONS, + MENU_SETTING_ACTION, 0, 0)) + count++; + } + } +#endif + if (settings->bools.quick_menu_show_information) { if (menu_entries_append_enum(list, @@ -3796,6 +3809,54 @@ static int menu_displaylist_parse_horizontal_content_actions( MENU_ENUM_LABEL_RESET_CORE_ASSOCIATION, FILE_TYPE_PLAYLIST_ENTRY, 0, 0); } +#ifdef HAVE_NETWORKING + if ( + settings->bools.quick_menu_show_download_thumbnails && + !settings->bools.kiosk_mode_enable) + { + bool download_enabled = true; + + /* Disabled because this won't be shown when content is loaded */ +#if 0 + /* If content is currently running, have to make sure + * we have a valid playlist to work with */ + if (content_loaded) + { + const char *core_path = path_get(RARCH_PATH_CORE); + + download_enabled = false; + if (!string_is_empty(fullpath) && !string_is_empty(core_path)) + download_enabled = playlist_index_is_valid( + playlist, idx, fullpath, core_path); + } +#endif + + if (download_enabled) + { + char system[PATH_MAX_LENGTH]; + + system[0] = '\0'; + + /* Only show 'download thumbnails' on supported playlists */ + download_enabled = false; + menu_driver_get_thumbnail_system(system, sizeof(system)); + + if (!string_is_empty(system)) + download_enabled = !string_ends_with_size( + system, "_history", strlen(system), STRLEN_CONST("_history")); + } + + if (settings->bools.network_on_demand_thumbnails) + download_enabled = false; + + if (download_enabled) + menu_entries_append_enum(info->list, + msg_hash_to_str(MENU_ENUM_LABEL_VALUE_DOWNLOAD_PL_ENTRY_THUMBNAILS), + msg_hash_to_str(MENU_ENUM_LABEL_DOWNLOAD_PL_ENTRY_THUMBNAILS), + MENU_ENUM_LABEL_DOWNLOAD_PL_ENTRY_THUMBNAILS, FILE_TYPE_PLAYLIST_ENTRY, 0, 0); + } +#endif + if (settings->bools.quick_menu_show_information) { menu_entries_append_enum(info->list, @@ -3805,51 +3866,6 @@ static int menu_displaylist_parse_horizontal_content_actions( } } -#ifdef HAVE_NETWORKING - if ( - settings->bools.quick_menu_show_download_thumbnails && - !settings->bools.kiosk_mode_enable) - { - bool download_enabled = true; - - /* If content is currently running, have to make sure - * we have a valid playlist to work with */ - if (content_loaded) - { - const char *core_path = path_get(RARCH_PATH_CORE); - - download_enabled = false; - if (!string_is_empty(fullpath) && !string_is_empty(core_path)) - download_enabled = playlist_index_is_valid( - playlist, idx, fullpath, core_path); - } - - if (download_enabled) - { - char system[PATH_MAX_LENGTH]; - - system[0] = '\0'; - - /* Only show 'download thumbnails' on supported playlists */ - download_enabled = false; - menu_driver_get_thumbnail_system(system, sizeof(system)); - - if (!string_is_empty(system)) - download_enabled = !string_ends_with_size( - system, "_history", strlen(system), STRLEN_CONST("_history")); - } - - if (settings->bools.network_on_demand_thumbnails) - download_enabled = false; - - if (download_enabled) - menu_entries_append_enum(info->list, - msg_hash_to_str(MENU_ENUM_LABEL_VALUE_DOWNLOAD_PL_ENTRY_THUMBNAILS), - msg_hash_to_str(MENU_ENUM_LABEL_DOWNLOAD_PL_ENTRY_THUMBNAILS), - MENU_ENUM_LABEL_DOWNLOAD_PL_ENTRY_THUMBNAILS, FILE_TYPE_PLAYLIST_ENTRY, 0, 0); - } -#endif - return 0; } @@ -9725,19 +9741,28 @@ unsigned menu_displaylist_build_list( {MENU_ENUM_LABEL_QUICK_MENU_SHOW_RESUME_CONTENT, PARSE_ONLY_BOOL}, {MENU_ENUM_LABEL_QUICK_MENU_SHOW_RESTART_CONTENT, PARSE_ONLY_BOOL}, {MENU_ENUM_LABEL_QUICK_MENU_SHOW_CLOSE_CONTENT, PARSE_ONLY_BOOL}, -#ifdef HAVE_SCREENSHOTS - {MENU_ENUM_LABEL_QUICK_MENU_SHOW_TAKE_SCREENSHOT, PARSE_ONLY_BOOL}, -#endif + {MENU_ENUM_LABEL_QUICK_MENU_SHOW_SAVESTATE_SUBMENU, PARSE_ONLY_BOOL}, {MENU_ENUM_LABEL_QUICK_MENU_SHOW_SAVE_LOAD_STATE, PARSE_ONLY_BOOL}, {MENU_ENUM_LABEL_QUICK_MENU_SHOW_UNDO_SAVE_LOAD_STATE, PARSE_ONLY_BOOL}, - {MENU_ENUM_LABEL_QUICK_MENU_SHOW_ADD_TO_FAVORITES, PARSE_ONLY_BOOL}, - {MENU_ENUM_LABEL_QUICK_MENU_SHOW_START_RECORDING, PARSE_ONLY_BOOL}, - {MENU_ENUM_LABEL_QUICK_MENU_SHOW_START_STREAMING, PARSE_ONLY_BOOL}, - {MENU_ENUM_LABEL_QUICK_MENU_SHOW_SET_CORE_ASSOCIATION, PARSE_ONLY_BOOL}, - {MENU_ENUM_LABEL_QUICK_MENU_SHOW_RESET_CORE_ASSOCIATION, PARSE_ONLY_BOOL}, {MENU_ENUM_LABEL_QUICK_MENU_SHOW_OPTIONS, PARSE_ONLY_BOOL}, {MENU_ENUM_LABEL_QUICK_MENU_SHOW_CORE_OPTIONS_FLUSH, PARSE_ONLY_BOOL}, {MENU_ENUM_LABEL_QUICK_MENU_SHOW_CONTROLS, PARSE_ONLY_BOOL}, +#ifdef HAVE_SCREENSHOTS + {MENU_ENUM_LABEL_QUICK_MENU_SHOW_TAKE_SCREENSHOT, PARSE_ONLY_BOOL}, +#endif + {MENU_ENUM_LABEL_QUICK_MENU_SHOW_START_RECORDING, PARSE_ONLY_BOOL}, + {MENU_ENUM_LABEL_QUICK_MENU_SHOW_START_STREAMING, PARSE_ONLY_BOOL}, + {MENU_ENUM_LABEL_QUICK_MENU_SHOW_ADD_TO_FAVORITES, PARSE_ONLY_BOOL}, + {MENU_ENUM_LABEL_CONTENT_SHOW_OVERLAYS, PARSE_ONLY_BOOL}, +#ifdef HAVE_VIDEO_LAYOUT + {MENU_ENUM_LABEL_CONTENT_SHOW_VIDEO_LAYOUT, PARSE_ONLY_BOOL}, +#endif + {MENU_ENUM_LABEL_CONTENT_SHOW_LATENCY, PARSE_ONLY_BOOL}, +#ifdef HAVE_REWIND + {MENU_ENUM_LABEL_CONTENT_SHOW_REWIND, PARSE_ONLY_BOOL}, +#endif + {MENU_ENUM_LABEL_QUICK_MENU_SHOW_SAVE_CORE_OVERRIDES, PARSE_ONLY_BOOL}, + {MENU_ENUM_LABEL_QUICK_MENU_SHOW_SAVE_GAME_OVERRIDES, PARSE_ONLY_BOOL}, {MENU_ENUM_LABEL_QUICK_MENU_SHOW_CHEATS, PARSE_ONLY_BOOL}, }; @@ -9762,20 +9787,12 @@ unsigned menu_displaylist_build_list( { menu_displaylist_build_info_t build_list[] = { -#ifdef HAVE_REWIND - {MENU_ENUM_LABEL_CONTENT_SHOW_REWIND, PARSE_ONLY_BOOL}, -#endif - {MENU_ENUM_LABEL_CONTENT_SHOW_LATENCY, PARSE_ONLY_BOOL}, - {MENU_ENUM_LABEL_CONTENT_SHOW_OVERLAYS, PARSE_ONLY_BOOL}, -#ifdef HAVE_VIDEO_LAYOUT - {MENU_ENUM_LABEL_CONTENT_SHOW_VIDEO_LAYOUT, PARSE_ONLY_BOOL}, -#endif - {MENU_ENUM_LABEL_QUICK_MENU_SHOW_SAVE_CORE_OVERRIDES, PARSE_ONLY_BOOL}, - {MENU_ENUM_LABEL_QUICK_MENU_SHOW_SAVE_GAME_OVERRIDES, PARSE_ONLY_BOOL}, - {MENU_ENUM_LABEL_QUICK_MENU_SHOW_INFORMATION, PARSE_ONLY_BOOL}, + {MENU_ENUM_LABEL_QUICK_MENU_SHOW_SET_CORE_ASSOCIATION, PARSE_ONLY_BOOL}, + {MENU_ENUM_LABEL_QUICK_MENU_SHOW_RESET_CORE_ASSOCIATION, PARSE_ONLY_BOOL}, #ifdef HAVE_NETWORKING {MENU_ENUM_LABEL_QUICK_MENU_SHOW_DOWNLOAD_THUMBNAILS, PARSE_ONLY_BOOL}, #endif + {MENU_ENUM_LABEL_QUICK_MENU_SHOW_INFORMATION, PARSE_ONLY_BOOL}, }; for (i = 0; i < ARRAY_SIZE(build_list); i++) @@ -12390,6 +12407,68 @@ bool menu_displaylist_ctl(enum menu_displaylist_ctl_state type, info->need_push = true; } break; + case DISPLAYLIST_SAVESTATE_LIST: + { + bool savestates_enabled = core_info_current_supports_savestate(); + + menu_entries_ctl(MENU_ENTRIES_CTL_CLEAR, info->list); + + if (savestates_enabled && + settings->bools.quick_menu_show_save_load_state) + { + if (MENU_DISPLAYLIST_PARSE_SETTINGS_ENUM(info->list, + MENU_ENUM_LABEL_STATE_SLOT, PARSE_ONLY_INT, true) == 0) + count++; + + if (menu_entries_append_enum(info->list, + msg_hash_to_str(MENU_ENUM_LABEL_VALUE_SAVE_STATE), + msg_hash_to_str(MENU_ENUM_LABEL_SAVE_STATE), + MENU_ENUM_LABEL_SAVE_STATE, + MENU_SETTING_ACTION_SAVESTATE, 0, 0)) + count++; + + if (menu_entries_append_enum(info->list, + msg_hash_to_str(MENU_ENUM_LABEL_VALUE_LOAD_STATE), + msg_hash_to_str(MENU_ENUM_LABEL_LOAD_STATE), + MENU_ENUM_LABEL_LOAD_STATE, + MENU_SETTING_ACTION_LOADSTATE, 0, 0)) + count++; + } + + if (savestates_enabled && + settings->bools.quick_menu_show_save_load_state && + settings->bools.quick_menu_show_undo_save_load_state) + { + #ifdef HAVE_CHEEVOS + if (!rcheevos_hardcore_active()) + #endif + { + if (menu_entries_append_enum(info->list, + msg_hash_to_str(MENU_ENUM_LABEL_VALUE_UNDO_LOAD_STATE), + msg_hash_to_str(MENU_ENUM_LABEL_UNDO_LOAD_STATE), + MENU_ENUM_LABEL_UNDO_LOAD_STATE, + MENU_SETTING_ACTION_LOADSTATE, 0, 0)) + count++; + } + + if (menu_entries_append_enum(info->list, + msg_hash_to_str(MENU_ENUM_LABEL_VALUE_UNDO_SAVE_STATE), + msg_hash_to_str(MENU_ENUM_LABEL_UNDO_SAVE_STATE), + MENU_ENUM_LABEL_UNDO_SAVE_STATE, + MENU_SETTING_ACTION_LOADSTATE, 0, 0)) + count++; + } + + if (count == 0) + menu_entries_append_enum(info->list, + msg_hash_to_str(MENU_ENUM_LABEL_VALUE_NO_ENTRIES_TO_DISPLAY), + msg_hash_to_str(MENU_ENUM_LABEL_NO_ENTRIES_TO_DISPLAY), + MENU_ENUM_LABEL_NO_ENTRIES_TO_DISPLAY, + FILE_TYPE_NONE, 0, 0); + + info->need_push = true; + } + break; case DISPLAYLIST_CORE_OPTIONS: { /* Number of displayed options is dynamic. If user opens diff --git a/menu/menu_displaylist.h b/menu/menu_displaylist.h index 509b9e741a..6a954d1e90 100644 --- a/menu/menu_displaylist.h +++ b/menu/menu_displaylist.h @@ -115,6 +115,7 @@ enum menu_displaylist_ctl_state DISPLAYLIST_PL_THUMBNAILS_UPDATER, DISPLAYLIST_LAKKA, DISPLAYLIST_CORES_DETECTED, + DISPLAYLIST_SAVESTATE_LIST, DISPLAYLIST_CORE_OPTIONS, DISPLAYLIST_CORE_OPTION_OVERRIDE_LIST, DISPLAYLIST_CORE_INFO, diff --git a/menu/menu_setting.c b/menu/menu_setting.c index 6b77466a1a..73d083fe58 100644 --- a/menu/menu_setting.c +++ b/menu/menu_setting.c @@ -18482,6 +18482,21 @@ static bool setting_append_list( general_read_handler, SD_FLAG_NONE); + CONFIG_BOOL( + list, list_info, + &settings->bools.quick_menu_show_savestate_submenu, + MENU_ENUM_LABEL_QUICK_MENU_SHOW_SAVESTATE_SUBMENU, + MENU_ENUM_LABEL_VALUE_QUICK_MENU_SHOW_SAVESTATE_SUBMENU, + DEFAULT_QUICK_MENU_SHOW_SAVESTATE_SUBMENU, + MENU_ENUM_LABEL_VALUE_OFF, + MENU_ENUM_LABEL_VALUE_ON, + &group_info, + &subgroup_info, + parent_group, + general_write_handler, + general_read_handler, + SD_FLAG_NONE); + CONFIG_BOOL( list, list_info, &settings->bools.quick_menu_show_save_load_state, diff --git a/msg_hash.h b/msg_hash.h index 047358fecf..a98a810b5f 100644 --- a/msg_hash.h +++ b/msg_hash.h @@ -1318,6 +1318,7 @@ enum msg_hash_enums MENU_LABEL(QUICK_MENU_SHOW_RESTART_CONTENT), MENU_LABEL(QUICK_MENU_SHOW_CLOSE_CONTENT), MENU_LABEL(QUICK_MENU_SHOW_TAKE_SCREENSHOT), + MENU_LABEL(QUICK_MENU_SHOW_SAVESTATE_SUBMENU), MENU_LABEL(QUICK_MENU_SHOW_SAVE_LOAD_STATE), MENU_LABEL(QUICK_MENU_SHOW_UNDO_SAVE_LOAD_STATE), MENU_LABEL(QUICK_MENU_SHOW_ADD_TO_FAVORITES), @@ -1795,6 +1796,7 @@ enum msg_hash_enums MENU_LABEL(SHADER_OPTIONS), MENU_LABEL(USE_THIS_DIRECTORY), + MENU_LABEL(SAVESTATE_LIST), MENU_LABEL(CORE_OPTIONS), MENU_LABEL(NO_SHADER_PARAMETERS), MENU_LABEL(NO_CORE_INFORMATION_AVAILABLE),