diff --git a/assets/Locales/Root.json b/assets/Locales/Root.json index c427ea78b..ac9aa09a4 100644 --- a/assets/Locales/Root.json +++ b/assets/Locales/Root.json @@ -575,6 +575,31 @@ "zh_TW": "停止模擬" } }, + { + "ID": "MenuBarOptionsRestartEmulation", + "Translations": { + "ar_SA": "", + "de_DE": "", + "el_GR": "", + "en_US": "Restart Emulation", + "es_ES": "", + "fr_FR": "", + "he_IL": "", + "it_IT": "", + "ja_JP": "", + "ko_KR": "", + "no_NO": "", + "pl_PL": "", + "pt_BR": "", + "ru_RU": "", + "sv_SE": "", + "th_TH": "", + "tr_TR": "", + "uk_UA": "", + "zh_CN": "", + "zh_TW": "" + } + }, { "ID": "MenuBarOptionsSettings", "Translations": { @@ -24876,4 +24901,4 @@ } } ] -} +} \ No newline at end of file diff --git a/src/Ryujinx/UI/ViewModels/MainWindowViewModel.cs b/src/Ryujinx/UI/ViewModels/MainWindowViewModel.cs index 48e18a12e..3c2e79a91 100644 --- a/src/Ryujinx/UI/ViewModels/MainWindowViewModel.cs +++ b/src/Ryujinx/UI/ViewModels/MainWindowViewModel.cs @@ -174,6 +174,7 @@ namespace Ryujinx.Ava.UI.ViewModels private string _screenshotKey = "F8"; private float _volume; private ApplicationData _currentApplicationData; + private bool _pendingRestart; private readonly AutoResetEvent _rendererWaitEvent; private int _customVSyncInterval; private int _customVSyncIntervalPercentageProxy; @@ -1250,6 +1251,14 @@ namespace Ryujinx.Ava.UI.ViewModels await LoadApplication(_currentApplicationData); } + else if (_pendingRestart) + { + _pendingRestart = false; + + Logger.Info?.Print(LogClass.Application, $"Restarting emulation for '{_currentApplicationData.Name}'"); + + await LoadApplication(_currentApplicationData); + } else { // Otherwise, clear state. @@ -1258,6 +1267,21 @@ namespace Ryujinx.Ava.UI.ViewModels } } + public void RestartEmulation() + { + if (AppHost is null || _currentApplicationData is null) + { + Logger.Warning?.Print(LogClass.Application, "RestartEmulation called but no application is running."); + + return; + } + + Logger.Info?.Print(LogClass.Application, $"Restart requested for '{_currentApplicationData.Name}'"); + + _pendingRestart = true; + AppHost.Stop(); + } + private void Update_StatusBar(object sender, StatusUpdatedEventArgs args) { if (ShowMenuAndStatusBar && !ShowLoadProgress) diff --git a/src/Ryujinx/UI/Views/Main/MainMenuBarView.axaml b/src/Ryujinx/UI/Views/Main/MainMenuBarView.axaml index d5a59c181..5e41017d8 100755 --- a/src/Ryujinx/UI/Views/Main/MainMenuBarView.axaml +++ b/src/Ryujinx/UI/Views/Main/MainMenuBarView.axaml @@ -167,6 +167,12 @@ Icon="{ext:Icon fa-solid fa-stop}" InputGesture="Escape" IsEnabled="{Binding IsGameRunning}" /> + ViewModel.AppHost?.Pause()); ResumeEmulationMenuItem.Command = Commands.Create(() => ViewModel.AppHost?.Resume()); StopEmulationMenuItem.Command = Commands.Create(() => ViewModel.AppHost?.ShowExitPrompt().OrCompleted()); + RestartEmulationMenuItem.Command = Commands.Create(() => ViewModel.RestartEmulation()); CheatManagerMenuItem.Command = Commands.CreateSilentFail(OpenCheatManagerForCurrentApp); InstallFileTypesMenuItem.Command = Commands.Create(InstallFileTypes); UninstallFileTypesMenuItem.Command = Commands.Create(UninstallFileTypes); diff --git a/src/Ryujinx/UI/Windows/MainWindow.axaml b/src/Ryujinx/UI/Windows/MainWindow.axaml index b7385c9cb..39a70ba16 100644 --- a/src/Ryujinx/UI/Windows/MainWindow.axaml +++ b/src/Ryujinx/UI/Windows/MainWindow.axaml @@ -41,6 +41,7 @@ +