From 2640f083b6d7bd40c80f81e5fc4660b6748103d2 Mon Sep 17 00:00:00 2001 From: Vova Date: Thu, 6 Feb 2025 20:12:56 +1000 Subject: [PATCH 01/27] Added custom setting function for each game --- .github/workflows/release.yml | 6 +- .../Services/SurfaceFlinger/SurfaceFlinger.cs | 1 + src/Ryujinx/AppHost.cs | 4 + src/Ryujinx/Assets/Styles/Styles.xaml | 23 ++- src/Ryujinx/Assets/Styles/Themes.xaml | 8 +- src/Ryujinx/Assets/locales.json | 25 +++ src/Ryujinx/Program.cs | 62 +++++- src/Ryujinx/Ryujinx.csproj | 7 +- .../UI/Controls/ApplicationContextMenu.axaml | 5 + .../Controls/ApplicationContextMenu.axaml.cs | 34 ++- .../UI/Controls/ApplicationGridView.axaml | 38 +++- .../UI/Controls/ApplicationListView.axaml | 7 + .../UI/Controls/ApplicationListView.axaml.cs | 14 ++ .../UI/ViewModels/MainWindowViewModel.cs | 11 +- .../UI/ViewModels/SettingsViewModel.cs | 195 +++++++++++++++--- .../UI/Windows/UserConfigWindows.axaml | 139 +++++++++++++ .../UI/Windows/UserConfigWindows.axaml.cs | 108 ++++++++++ .../Utilities/AppLibrary/ApplicationData.cs | 1 + .../AppLibrary/ApplicationLibrary.cs | 5 +- src/Ryujinx/Utilities/CommandLineState.cs | 57 ++++- .../ConfigurationState.Migration.cs | 99 ++++----- src/Ryujinx/Utilities/ShortcutHelper.cs | 27 ++- 22 files changed, 774 insertions(+), 102 deletions(-) create mode 100644 src/Ryujinx/UI/Windows/UserConfigWindows.axaml create mode 100644 src/Ryujinx/UI/Windows/UserConfigWindows.axaml.cs diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 072c6bf2fa..bd302e6610 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -10,9 +10,9 @@ env: POWERSHELL_TELEMETRY_OPTOUT: 1 DOTNET_CLI_TELEMETRY_OPTOUT: 1 RYUJINX_BASE_VERSION: "1.2" - RYUJINX_TARGET_RELEASE_CHANNEL_NAME: "release" - RYUJINX_TARGET_RELEASE_CHANNEL_OWNER: "Ryubing" - RYUJINX_TARGET_RELEASE_CHANNEL_REPO: "Ryujinx" + RYUJINX_TARGET_RELEASE_CHANNEL_NAME: "master" + RYUJINX_TARGET_RELEASE_CHANNEL_OWNER: "Goodfeat" + RYUJINX_TARGET_RELEASE_CHANNEL_REPO: "Ryujinx_alt" RELEASE: 1 jobs: diff --git a/src/Ryujinx.HLE/HOS/Services/SurfaceFlinger/SurfaceFlinger.cs b/src/Ryujinx.HLE/HOS/Services/SurfaceFlinger/SurfaceFlinger.cs index 935e9895e5..23bf8bcfc4 100644 --- a/src/Ryujinx.HLE/HOS/Services/SurfaceFlinger/SurfaceFlinger.cs +++ b/src/Ryujinx.HLE/HOS/Services/SurfaceFlinger/SurfaceFlinger.cs @@ -10,6 +10,7 @@ using System.Diagnostics; using System.Linq; using System.Threading; +using VSyncMode = Ryujinx.Common.Configuration.VSyncMode; namespace Ryujinx.HLE.HOS.Services.SurfaceFlinger { diff --git a/src/Ryujinx/AppHost.cs b/src/Ryujinx/AppHost.cs index 25f451858b..d49456b9ab 100644 --- a/src/Ryujinx/AppHost.cs +++ b/src/Ryujinx/AppHost.cs @@ -582,6 +582,10 @@ private void Exit() Rainbow.Disable(); Rainbow.Reset(); + //Reload settings when the game is turned off + //(resets custom settings if there were any) + Program.ReloadConfig(); + _isStopped = true; Stop(); } diff --git a/src/Ryujinx/Assets/Styles/Styles.xaml b/src/Ryujinx/Assets/Styles/Styles.xaml index 5523f551aa..c3bc27efde 100644 --- a/src/Ryujinx/Assets/Styles/Styles.xaml +++ b/src/Ryujinx/Assets/Styles/Styles.xaml @@ -1,7 +1,8 @@ - - diff --git a/src/Ryujinx/UI/Windows/UserConfigWindows.axaml b/src/Ryujinx/UI/Windows/GameSpecificSettingsWindow.axaml similarity index 99% rename from src/Ryujinx/UI/Windows/UserConfigWindows.axaml rename to src/Ryujinx/UI/Windows/GameSpecificSettingsWindow.axaml index 3a9f3cff85..c7a5d1fa43 100644 --- a/src/Ryujinx/UI/Windows/UserConfigWindows.axaml +++ b/src/Ryujinx/UI/Windows/GameSpecificSettingsWindow.axaml @@ -1,5 +1,5 @@ ConfigurationFileFormat.CurrentVersion) @@ -50,14 +50,14 @@ in _migrations.OrderBy(x => x.Key)) } - EnableDiscordIntegration.Value = LoadSetting ? cff.EnableDiscordIntegration : EnableDiscordIntegration.Value; // Get from global config only - CheckUpdatesOnStart.Value = LoadSetting ? cff.CheckUpdatesOnStart : CheckUpdatesOnStart.Value; // Get from global config only - UpdateCheckerType.Value = LoadSetting ? cff.UpdateCheckerType : UpdateCheckerType.Value; // Get from global config only - ShowConfirmExit.Value = LoadSetting ? cff.ShowConfirmExit : ShowConfirmExit.Value; // Get from global config only - RememberWindowState.Value = LoadSetting ? cff.RememberWindowState : RememberWindowState.Value; // Get from global config only - ShowTitleBar.Value = LoadSetting ? cff.ShowTitleBar : ShowTitleBar.Value; // Get from global config only - EnableHardwareAcceleration.Value = LoadSetting ? cff.EnableHardwareAcceleration : EnableHardwareAcceleration.Value; // Get from global config only - HideCursor.Value = LoadSetting ? cff.HideCursor : HideCursor.Value; // Get from global config only + EnableDiscordIntegration.Value = shouldLoadFromFile ? cff.EnableDiscordIntegration : EnableDiscordIntegration.Value; // Get from global config only + CheckUpdatesOnStart.Value = shouldLoadFromFile ? cff.CheckUpdatesOnStart : CheckUpdatesOnStart.Value; // Get from global config only + UpdateCheckerType.Value = shouldLoadFromFile ? cff.UpdateCheckerType : UpdateCheckerType.Value; // Get from global config only + ShowConfirmExit.Value = shouldLoadFromFile ? cff.ShowConfirmExit : ShowConfirmExit.Value; // Get from global config only + RememberWindowState.Value = shouldLoadFromFile ? cff.RememberWindowState : RememberWindowState.Value; // Get from global config only + ShowTitleBar.Value = shouldLoadFromFile ? cff.ShowTitleBar : ShowTitleBar.Value; // Get from global config only + EnableHardwareAcceleration.Value = shouldLoadFromFile ? cff.EnableHardwareAcceleration : EnableHardwareAcceleration.Value; // Get from global config only + HideCursor.Value = shouldLoadFromFile ? cff.HideCursor : HideCursor.Value; // Get from global config only Logger.EnableFileLog.Value = cff.EnableFileLog; Logger.EnableDebug.Value = cff.LoggingEnableDebug; @@ -93,7 +93,7 @@ in _migrations.OrderBy(x => x.Key)) System.Language.Value = cff.SystemLanguage; System.Region.Value = cff.SystemRegion; System.TimeZone.Value = cff.SystemTimeZone; - System.SystemTimeOffset.Value = LoadSetting ? cff.SystemTimeOffset : System.SystemTimeOffset.Value; // Get from global config only + System.SystemTimeOffset.Value = shouldLoadFromFile ? cff.SystemTimeOffset : System.SystemTimeOffset.Value; // Get from global config only System.EnableDockedMode.Value = cff.DockedMode; System.EnablePtc.Value = cff.EnablePtc; System.EnableLowPowerPtc.Value = cff.EnableLowPowerPtc; @@ -108,46 +108,46 @@ in _migrations.OrderBy(x => x.Key)) System.IgnoreApplet.Value = cff.IgnoreApplet; System.UseHypervisor.Value = cff.UseHypervisor; - UI.GuiColumns.FavColumn.Value = LoadSetting ? cff.GuiColumns.FavColumn : UI.GuiColumns.FavColumn.Value; - UI.GuiColumns.IconColumn.Value = LoadSetting ? cff.GuiColumns.IconColumn : UI.GuiColumns.IconColumn.Value; - UI.GuiColumns.AppColumn.Value = LoadSetting ? cff.GuiColumns.AppColumn : UI.GuiColumns.AppColumn.Value; - UI.GuiColumns.DevColumn.Value = LoadSetting ? cff.GuiColumns.DevColumn : UI.GuiColumns.DevColumn.Value; - UI.GuiColumns.VersionColumn.Value = LoadSetting ? cff.GuiColumns.VersionColumn : UI.GuiColumns.VersionColumn.Value; - UI.GuiColumns.TimePlayedColumn.Value = LoadSetting ? cff.GuiColumns.TimePlayedColumn : UI.GuiColumns.TimePlayedColumn.Value; - UI.GuiColumns.LastPlayedColumn.Value = LoadSetting ? cff.GuiColumns.LastPlayedColumn : UI.GuiColumns.LastPlayedColumn.Value; - UI.GuiColumns.FileExtColumn.Value = LoadSetting ? cff.GuiColumns.FileExtColumn : UI.GuiColumns.FileExtColumn.Value; - UI.GuiColumns.FileSizeColumn.Value = LoadSetting ? cff.GuiColumns.FileSizeColumn : UI.GuiColumns.FileSizeColumn.Value; - UI.GuiColumns.PathColumn.Value = LoadSetting ? cff.GuiColumns.PathColumn : UI.GuiColumns.PathColumn.Value; - UI.ColumnSort.SortColumnId.Value = LoadSetting ? cff.ColumnSort.SortColumnId : UI.ColumnSort.SortColumnId.Value; - UI.ColumnSort.SortAscending.Value = LoadSetting ? cff.ColumnSort.SortAscending : UI.ColumnSort.SortAscending.Value; - UI.GameDirs.Value = LoadSetting ? cff.GameDirs : UI.GameDirs.Value; - UI.AutoloadDirs.Value = LoadSetting ? (cff.AutoloadDirs ?? []) : UI.AutoloadDirs.Value; - UI.ShownFileTypes.NSP.Value = LoadSetting ? cff.ShownFileTypes.NSP : UI.ShownFileTypes.NSP.Value; - UI.ShownFileTypes.PFS0.Value = LoadSetting ? cff.ShownFileTypes.PFS0 : UI.ShownFileTypes.PFS0.Value; - UI.ShownFileTypes.XCI.Value = LoadSetting ? cff.ShownFileTypes.XCI : UI.ShownFileTypes.XCI.Value; - UI.ShownFileTypes.NCA.Value = LoadSetting ? cff.ShownFileTypes.NCA : UI.ShownFileTypes.NCA.Value; - UI.ShownFileTypes.NRO.Value = LoadSetting ? cff.ShownFileTypes.NRO : UI.ShownFileTypes.NRO.Value; - UI.ShownFileTypes.NSO.Value = LoadSetting ? cff.ShownFileTypes.NSO : UI.ShownFileTypes.NSO.Value; - UI.LanguageCode.Value = LoadSetting ? cff.LanguageCode : UI.LanguageCode.Value; - UI.BaseStyle.Value = LoadSetting ? cff.BaseStyle : UI.BaseStyle.Value; - UI.GameListViewMode.Value = LoadSetting ? cff.GameListViewMode : UI.GameListViewMode.Value; - UI.ShowNames.Value = LoadSetting ? cff.ShowNames : UI.ShowNames.Value; - UI.IsAscendingOrder.Value = LoadSetting ? cff.IsAscendingOrder : UI.IsAscendingOrder.Value; - UI.GridSize.Value = LoadSetting ? cff.GridSize : UI.GridSize.Value; - UI.ApplicationSort.Value = LoadSetting ? cff.ApplicationSort : UI.ApplicationSort.Value; - UI.StartFullscreen.Value = LoadSetting ? cff.StartFullscreen : UI.StartFullscreen.Value; - UI.StartNoUI.Value = LoadSetting ? cff.StartNoUI : UI.StartNoUI.Value; - UI.ShowConsole.Value = LoadSetting ? cff.ShowConsole : UI.ShowConsole.Value; - UI.WindowStartup.WindowSizeWidth.Value = LoadSetting ? cff.WindowStartup.WindowSizeWidth : UI.WindowStartup.WindowSizeWidth.Value; - UI.WindowStartup.WindowSizeHeight.Value = LoadSetting ? cff.WindowStartup.WindowSizeHeight : UI.WindowStartup.WindowSizeHeight.Value; - UI.WindowStartup.WindowPositionX.Value = LoadSetting ? cff.WindowStartup.WindowPositionX : UI.WindowStartup.WindowPositionX.Value; - UI.WindowStartup.WindowPositionY.Value = LoadSetting ? cff.WindowStartup.WindowPositionY : UI.WindowStartup.WindowPositionY.Value; - UI.WindowStartup.WindowMaximized.Value = LoadSetting ? cff.WindowStartup.WindowMaximized : UI.WindowStartup.WindowMaximized.Value; + UI.GuiColumns.FavColumn.Value = shouldLoadFromFile ? cff.GuiColumns.FavColumn : UI.GuiColumns.FavColumn.Value; + UI.GuiColumns.IconColumn.Value = shouldLoadFromFile ? cff.GuiColumns.IconColumn : UI.GuiColumns.IconColumn.Value; + UI.GuiColumns.AppColumn.Value = shouldLoadFromFile ? cff.GuiColumns.AppColumn : UI.GuiColumns.AppColumn.Value; + UI.GuiColumns.DevColumn.Value = shouldLoadFromFile ? cff.GuiColumns.DevColumn : UI.GuiColumns.DevColumn.Value; + UI.GuiColumns.VersionColumn.Value = shouldLoadFromFile ? cff.GuiColumns.VersionColumn : UI.GuiColumns.VersionColumn.Value; + UI.GuiColumns.TimePlayedColumn.Value = shouldLoadFromFile ? cff.GuiColumns.TimePlayedColumn : UI.GuiColumns.TimePlayedColumn.Value; + UI.GuiColumns.LastPlayedColumn.Value = shouldLoadFromFile ? cff.GuiColumns.LastPlayedColumn : UI.GuiColumns.LastPlayedColumn.Value; + UI.GuiColumns.FileExtColumn.Value = shouldLoadFromFile ? cff.GuiColumns.FileExtColumn : UI.GuiColumns.FileExtColumn.Value; + UI.GuiColumns.FileSizeColumn.Value = shouldLoadFromFile ? cff.GuiColumns.FileSizeColumn : UI.GuiColumns.FileSizeColumn.Value; + UI.GuiColumns.PathColumn.Value = shouldLoadFromFile ? cff.GuiColumns.PathColumn : UI.GuiColumns.PathColumn.Value; + UI.ColumnSort.SortColumnId.Value = shouldLoadFromFile ? cff.ColumnSort.SortColumnId : UI.ColumnSort.SortColumnId.Value; + UI.ColumnSort.SortAscending.Value = shouldLoadFromFile ? cff.ColumnSort.SortAscending : UI.ColumnSort.SortAscending.Value; + UI.GameDirs.Value = shouldLoadFromFile ? cff.GameDirs : UI.GameDirs.Value; + UI.AutoloadDirs.Value = shouldLoadFromFile ? (cff.AutoloadDirs ?? []) : UI.AutoloadDirs.Value; + UI.ShownFileTypes.NSP.Value = shouldLoadFromFile ? cff.ShownFileTypes.NSP : UI.ShownFileTypes.NSP.Value; + UI.ShownFileTypes.PFS0.Value = shouldLoadFromFile ? cff.ShownFileTypes.PFS0 : UI.ShownFileTypes.PFS0.Value; + UI.ShownFileTypes.XCI.Value = shouldLoadFromFile ? cff.ShownFileTypes.XCI : UI.ShownFileTypes.XCI.Value; + UI.ShownFileTypes.NCA.Value = shouldLoadFromFile ? cff.ShownFileTypes.NCA : UI.ShownFileTypes.NCA.Value; + UI.ShownFileTypes.NRO.Value = shouldLoadFromFile ? cff.ShownFileTypes.NRO : UI.ShownFileTypes.NRO.Value; + UI.ShownFileTypes.NSO.Value = shouldLoadFromFile ? cff.ShownFileTypes.NSO : UI.ShownFileTypes.NSO.Value; + UI.LanguageCode.Value = shouldLoadFromFile ? cff.LanguageCode : UI.LanguageCode.Value; + UI.BaseStyle.Value = shouldLoadFromFile ? cff.BaseStyle : UI.BaseStyle.Value; + UI.GameListViewMode.Value = shouldLoadFromFile ? cff.GameListViewMode : UI.GameListViewMode.Value; + UI.ShowNames.Value = shouldLoadFromFile ? cff.ShowNames : UI.ShowNames.Value; + UI.IsAscendingOrder.Value = shouldLoadFromFile ? cff.IsAscendingOrder : UI.IsAscendingOrder.Value; + UI.GridSize.Value = shouldLoadFromFile ? cff.GridSize : UI.GridSize.Value; + UI.ApplicationSort.Value = shouldLoadFromFile ? cff.ApplicationSort : UI.ApplicationSort.Value; + UI.StartFullscreen.Value = shouldLoadFromFile ? cff.StartFullscreen : UI.StartFullscreen.Value; + UI.StartNoUI.Value = shouldLoadFromFile ? cff.StartNoUI : UI.StartNoUI.Value; + UI.ShowConsole.Value = shouldLoadFromFile ? cff.ShowConsole : UI.ShowConsole.Value; + UI.WindowStartup.WindowSizeWidth.Value = shouldLoadFromFile ? cff.WindowStartup.WindowSizeWidth : UI.WindowStartup.WindowSizeWidth.Value; + UI.WindowStartup.WindowSizeHeight.Value = shouldLoadFromFile ? cff.WindowStartup.WindowSizeHeight : UI.WindowStartup.WindowSizeHeight.Value; + UI.WindowStartup.WindowPositionX.Value = shouldLoadFromFile ? cff.WindowStartup.WindowPositionX : UI.WindowStartup.WindowPositionX.Value; + UI.WindowStartup.WindowPositionY.Value = shouldLoadFromFile ? cff.WindowStartup.WindowPositionY : UI.WindowStartup.WindowPositionY.Value; + UI.WindowStartup.WindowMaximized.Value = shouldLoadFromFile ? cff.WindowStartup.WindowMaximized : UI.WindowStartup.WindowMaximized.Value; Hid.EnableKeyboard.Value = cff.EnableKeyboard; Hid.EnableMouse.Value = cff.EnableMouse; - Hid.Hotkeys.Value = LoadSetting ? cff.Hotkeys : Hid.Hotkeys.Value; // Get from global config only + Hid.Hotkeys.Value = shouldLoadFromFile ? cff.Hotkeys : Hid.Hotkeys.Value; // Get from global config only Hid.InputConfig.Value = cff.InputConfig ?? []; Hid.RainbowSpeed.Value = cff.RainbowSpeed; From 2dd787fb7ba849013750fea0e03b6b282153bcb8 Mon Sep 17 00:00:00 2001 From: Vova Date: Wed, 12 Feb 2025 16:00:37 +1000 Subject: [PATCH 19/27] Changed: Hid.DisableInputWhenOutOfFocus only for global config --- .../Utilities/Configuration/ConfigurationState.Migration.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Ryujinx/Utilities/Configuration/ConfigurationState.Migration.cs b/src/Ryujinx/Utilities/Configuration/ConfigurationState.Migration.cs index f1fcf7fcf3..386abcbe5f 100644 --- a/src/Ryujinx/Utilities/Configuration/ConfigurationState.Migration.cs +++ b/src/Ryujinx/Utilities/Configuration/ConfigurationState.Migration.cs @@ -147,7 +147,7 @@ in _migrations.OrderBy(x => x.Key)) Hid.EnableKeyboard.Value = cff.EnableKeyboard; Hid.EnableMouse.Value = cff.EnableMouse; - Hid.DisableInputWhenOutOfFocus.Value = cff.DisableInputWhenOutOfFocus; + Hid.DisableInputWhenOutOfFocus.Value = shouldLoadFromFile ? cff.DisableInputWhenOutOfFocus: Hid.DisableInputWhenOutOfFocus.Value; // Get from global config only Hid.Hotkeys.Value = shouldLoadFromFile ? cff.Hotkeys : Hid.Hotkeys.Value; // Get from global config only Hid.InputConfig.Value = cff.InputConfig ?? []; Hid.RainbowSpeed.Value = cff.RainbowSpeed; From 1dedf4c8d53f6694e7780d39b86ad4b68fd65865 Mon Sep 17 00:00:00 2001 From: Vova Date: Thu, 13 Feb 2025 16:34:03 +1000 Subject: [PATCH 20/27] fixed: when loading a game with a custom configuration via a shortcut or rebooting, when entering the settings menu, a menu for global configuration was displayed. --- src/Ryujinx/UI/ViewModels/MainWindowViewModel.cs | 7 ++++++- src/Ryujinx/UI/Windows/MainWindow.axaml.cs | 4 +++- 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/src/Ryujinx/UI/ViewModels/MainWindowViewModel.cs b/src/Ryujinx/UI/ViewModels/MainWindowViewModel.cs index d881bff98b..5eca7f498a 100644 --- a/src/Ryujinx/UI/ViewModels/MainWindowViewModel.cs +++ b/src/Ryujinx/UI/ViewModels/MainWindowViewModel.cs @@ -355,6 +355,11 @@ public ApplicationData SelectedApplication _ => null, }; } + set + { + ListSelectedApplication = value; + GridSelectedApplication = value; + } } public bool HasCompatibilityEntry => SelectedApplication.HasPlayabilityInfo; @@ -1541,7 +1546,7 @@ public bool InitializeUserConfig(ApplicationData application) { BackendThreadingInit = ConfigurationState.Instance.Graphics.BackendThreading.Value.ToString(); } - + // If a configuration is found in the "/games/xxxxxxxxxxxxxx" folder, the program will load the user setting. string idGame = application.IdBaseString; if (ConfigurationFileFormat.TryLoad(Program.GetDirGameUserConfig(idGame), out ConfigurationFileFormat configurationFileFormat)) diff --git a/src/Ryujinx/UI/Windows/MainWindow.axaml.cs b/src/Ryujinx/UI/Windows/MainWindow.axaml.cs index 8f50aa9652..bf55fac570 100644 --- a/src/Ryujinx/UI/Windows/MainWindow.axaml.cs +++ b/src/Ryujinx/UI/Windows/MainWindow.axaml.cs @@ -223,7 +223,7 @@ internal static void DeferLoadApplication(string launchPathArg, string launchApp _deferLoad = true; _launchPath = launchPathArg; _launchApplicationId = launchApplicationId; - _startFullscreen = startFullscreenArg; + _startFullscreen = startFullscreenArg; } public void SwitchToGameControl(bool startFullscreen = false) @@ -374,6 +374,7 @@ private async Task CheckLaunchState() if (applicationData != null) { + ViewModel.SelectedApplication = applicationData; await ViewModel.LoadApplication(applicationData, _startFullscreen); } else @@ -385,6 +386,7 @@ private async Task CheckLaunchState() else { applicationData = applications[0]; + ViewModel.SelectedApplication = applicationData; await ViewModel.LoadApplication(applicationData, _startFullscreen); } } From 931da5e1d27c14c9beb08d99641d68784d94c48e Mon Sep 17 00:00:00 2001 From: Vova Date: Sat, 15 Feb 2025 15:56:45 +1000 Subject: [PATCH 21/27] fix update --- .../Utilities/Configuration/ConfigurationState.Migration.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Ryujinx/Utilities/Configuration/ConfigurationState.Migration.cs b/src/Ryujinx/Utilities/Configuration/ConfigurationState.Migration.cs index 20c81f8d8e..66b2d0cf49 100644 --- a/src/Ryujinx/Utilities/Configuration/ConfigurationState.Migration.cs +++ b/src/Ryujinx/Utilities/Configuration/ConfigurationState.Migration.cs @@ -95,7 +95,7 @@ in _migrations.OrderBy(x => x.Key)) System.Region.Value = cff.SystemRegion; System.TimeZone.Value = cff.SystemTimeZone; System.SystemTimeOffset.Value = shouldLoadFromFile ? cff.SystemTimeOffset : System.SystemTimeOffset.Value; // Get from global config only - System.MatchSystemTime.Value = shouldLoadFromFile ? cff.MatchSystemTime : System.SystemTimeOffset.Value; // Get from global config only + System.MatchSystemTime.Value = shouldLoadFromFile ? cff.MatchSystemTime : System.MatchSystemTime.Value; // Get from global config only System.EnableDockedMode.Value = cff.DockedMode; System.EnablePtc.Value = cff.EnablePtc; System.EnableLowPowerPtc.Value = cff.EnableLowPowerPtc; From 24867ec9b61e65d13e21916a6f6f966cf1eefb44 Mon Sep 17 00:00:00 2001 From: Vova Date: Sat, 15 Feb 2025 19:59:23 +1000 Subject: [PATCH 22/27] Code refinement. Added UI menu to user settings Added markers to menu for settings related to global settings --- src/Ryujinx/Assets/Styles/Styles.xaml | 13 +++ src/Ryujinx/Program.cs | 5 ++ .../UI/ViewModels/SettingsViewModel.cs | 89 +++++++++---------- .../Views/Settings/SettingsSystemView.axaml | 12 ++- .../UI/Views/Settings/SettingsUIView.axaml | 81 +++++++++++++---- .../Windows/GameSpecificSettingsWindow.axaml | 8 +- .../GameSpecificSettingsWindow.axaml.cs | 4 + .../ConfigurationState.Migration.cs | 4 +- 8 files changed, 147 insertions(+), 69 deletions(-) diff --git a/src/Ryujinx/Assets/Styles/Styles.xaml b/src/Ryujinx/Assets/Styles/Styles.xaml index cf9f28f02b..d75f140ad3 100644 --- a/src/Ryujinx/Assets/Styles/Styles.xaml +++ b/src/Ryujinx/Assets/Styles/Styles.xaml @@ -46,6 +46,8 @@ + @@ -337,6 +339,14 @@ + + + + + diff --git a/src/Ryujinx/Program.cs b/src/Ryujinx/Program.cs index cc748087ed..b13eab4047 100644 --- a/src/Ryujinx/Program.cs +++ b/src/Ryujinx/Program.cs @@ -169,6 +169,11 @@ public static bool FindGameConfig(string gameDir) public static string GetDirGameUserConfig(string gameId, bool rememberGlobalDir = false, bool changeFolderForGame = false) { + if (string.IsNullOrEmpty(gameId)) + { + return ""; + } + string gameDir = Path.Combine(AppDataManager.GamesDirPath, gameId, ReleaseInformation.ConfigName); // Should load with the game if there is a custom setting for the game diff --git a/src/Ryujinx/UI/ViewModels/SettingsViewModel.cs b/src/Ryujinx/UI/ViewModels/SettingsViewModel.cs index db02543cc0..ff675ab2ad 100644 --- a/src/Ryujinx/UI/ViewModels/SettingsViewModel.cs +++ b/src/Ryujinx/UI/ViewModels/SettingsViewModel.cs @@ -81,6 +81,8 @@ public partial class SettingsViewModel : BaseModel public string GamePath => _gamePath; public string GameTitle => _gameTitle; public string GameId => _gameId; + public bool IsGameTitleNotNull => !string.IsNullOrEmpty(GameTitle); + public double PanelOpacity => IsGameTitleNotNull ? 0.5 : 1; public int ResolutionScale { @@ -422,10 +424,8 @@ public SettingsViewModel(bool noLoadGlobalConfig = false) { Task.Run(LoadAvailableGpus); - if (!noLoadGlobalConfig)// Default is false, but loading custom config avoids double call - { + // if (!noLoadGlobalConfig)// Default is false, but loading custom config avoids double call LoadCurrentConfiguration(); - } DirtyHacks = new SettingsHacksViewModel(this); } @@ -536,35 +536,29 @@ public void LoadCurrentConfiguration() { ConfigurationState config = ConfigurationState.Instance; - - //It is necessary that the data is used from the global configuration file - if (string.IsNullOrEmpty(GameId)) + // User Interface + EnableDiscordIntegration = config.EnableDiscordIntegration; + CheckUpdatesOnStart = config.CheckUpdatesOnStart; + ShowConfirmExit = config.ShowConfirmExit; + RememberWindowState = config.RememberWindowState; + ShowTitleBar = config.ShowTitleBar; + HideCursor = (int)config.HideCursor.Value; + UpdateCheckerType = (int)config.UpdateCheckerType.Value; + FocusLostActionType = (int)config.FocusLostActionType.Value; + + GameDirectories.Clear(); + GameDirectories.AddRange(config.UI.GameDirs.Value); + + AutoloadDirectories.Clear(); + AutoloadDirectories.AddRange(config.UI.AutoloadDirs.Value); + + BaseStyleIndex = config.UI.BaseStyle.Value switch { - // User Interface - EnableDiscordIntegration = config.EnableDiscordIntegration; - CheckUpdatesOnStart = config.CheckUpdatesOnStart; - ShowConfirmExit = config.ShowConfirmExit; - RememberWindowState = config.RememberWindowState; - ShowTitleBar = config.ShowTitleBar; - HideCursor = (int)config.HideCursor.Value; - UpdateCheckerType = (int)config.UpdateCheckerType.Value; - FocusLostActionType = (int)config.FocusLostActionType.Value; - - GameDirectories.Clear(); - GameDirectories.AddRange(config.UI.GameDirs.Value); - - AutoloadDirectories.Clear(); - AutoloadDirectories.AddRange(config.UI.AutoloadDirs.Value); - - BaseStyleIndex = config.UI.BaseStyle.Value switch - { - "Auto" => 0, - "Light" => 1, - "Dark" => 2, - _ => 0 - }; - - } + "Auto" => 0, + "Light" => 1, + "Dark" => 2, + _ => 0 + }; // Input EnableDockedMode = config.System.EnableDockedMode; @@ -585,6 +579,7 @@ public void LoadCurrentConfiguration() DateTime currentDateTime = currentHostDateTime.Add(systemDateTimeOffset); CurrentDate = currentDateTime.Date; CurrentTime = currentDateTime.TimeOfDay; + MatchSystemTime = config.System.MatchSystemTime; EnableCustomVSyncInterval = config.Graphics.EnableCustomVSyncInterval; @@ -645,11 +640,10 @@ public void LoadCurrentConfiguration() LdnPassphrase = config.Multiplayer.LdnPassphrase; LdnServer = config.Multiplayer.LdnServer; } - + public void SaveSettings() { ConfigurationState config = ConfigurationState.Instance; - bool userConfigFile = string.IsNullOrEmpty(GameId); // User Interface config.EnableDiscordIntegration.Value = EnableDiscordIntegration; @@ -660,17 +654,16 @@ public void SaveSettings() config.HideCursor.Value = (HideCursorMode)HideCursor; config.UpdateCheckerType.Value = (UpdaterType)UpdateCheckerType; config.FocusLostActionType.Value = (FocusLostType)FocusLostActionType; - config.UI.GameDirs.Value = [..GameDirectories]; - config.UI.AutoloadDirs.Value = [..AutoloadDirectories]; + config.UI.GameDirs.Value = [.. GameDirectories]; + config.UI.AutoloadDirs.Value = [.. AutoloadDirectories]; - - config.UI.BaseStyle.Value = BaseStyleIndex switch - { - 0 => "Auto", - 1 => "Light", - 2 => "Dark", - _ => "Auto" - }; + config.UI.BaseStyle.Value = BaseStyleIndex switch + { + 0 => "Auto", + 1 => "Light", + 2 => "Dark", + _ => "Auto" + }; // Input config.System.EnableDockedMode.Value = EnableDockedMode; @@ -683,10 +676,10 @@ public void SaveSettings() // System config.System.Region.Value = (Region)Region; - + if (config.System.Language.Value != (Language)Language) GameListNeedsRefresh = true; - + config.System.Language.Value = (Language)Language; if (_validTzRegions.Contains(TimeZone)) { @@ -765,15 +758,13 @@ public void SaveSettings() config.Multiplayer.DisableP2p.Value = DisableP2P; config.Multiplayer.LdnPassphrase.Value = LdnPassphrase; config.Multiplayer.LdnServer.Value = LdnServer; - + // Dirty Hacks config.Hacks.Xc2MenuSoftlockFix.Value = DirtyHacks.Xc2MenuSoftlockFix; config.Hacks.EnableShaderTranslationDelay.Value = DirtyHacks.ShaderTranslationDelayEnabled; config.Hacks.ShaderTranslationDelay.Value = DirtyHacks.ShaderTranslationDelay; - - config.ToFileFormat().SaveConfig(Program.ConfigurationPath); - + config.ToFileFormat().SaveConfig(Program.ConfigurationPath); MainWindow.UpdateGraphicsConfig(); RyujinxApp.MainWindow.ViewModel.VSyncModeSettingChanged(); diff --git a/src/Ryujinx/UI/Views/Settings/SettingsSystemView.axaml b/src/Ryujinx/UI/Views/Settings/SettingsSystemView.axaml index 7a9a55848e..5a9f98ae5b 100644 --- a/src/Ryujinx/UI/Views/Settings/SettingsSystemView.axaml +++ b/src/Ryujinx/UI/Views/Settings/SettingsSystemView.axaml @@ -162,6 +162,8 @@ ValueMemberBinding="{Binding Mode=OneWay, Converter={x:Static helpers:TimeZoneConverter.Instance}}" /> + + - + + - - + + + + + - - + + + + + - - + + + + + - - + + + + + - + @@ -64,7 +90,11 @@ - + @@ -81,8 +111,11 @@ + - + @@ -100,7 +133,11 @@ - + + + - + + + + - + + + + + @@ -80,6 +81,11 @@ + + Classes="global"/> diff --git a/src/Ryujinx/UI/Windows/GameSpecificSettingsWindow.axaml.cs b/src/Ryujinx/UI/Windows/GameSpecificSettingsWindow.axaml.cs index f5e8d3733b..ba4da26ef4 100644 --- a/src/Ryujinx/UI/Windows/GameSpecificSettingsWindow.axaml.cs +++ b/src/Ryujinx/UI/Windows/GameSpecificSettingsWindow.axaml.cs @@ -75,6 +75,10 @@ private void NavPanelOnSelectionChanged(object sender, NavigationViewSelectionCh { switch (navItem.Tag.ToString()) { + case nameof(UiPage): + UiPage.ViewModel = ViewModel; + NavPanel.Content = UiPage; + break; case nameof(InputPage): NavPanel.Content = InputPage; break; diff --git a/src/Ryujinx/Utilities/Configuration/ConfigurationState.Migration.cs b/src/Ryujinx/Utilities/Configuration/ConfigurationState.Migration.cs index 8ead03480c..bd145e0484 100644 --- a/src/Ryujinx/Utilities/Configuration/ConfigurationState.Migration.cs +++ b/src/Ryujinx/Utilities/Configuration/ConfigurationState.Migration.cs @@ -53,12 +53,12 @@ in _migrations.OrderBy(x => x.Key)) EnableDiscordIntegration.Value = shouldLoadFromFile ? cff.EnableDiscordIntegration : EnableDiscordIntegration.Value; // Get from global config only CheckUpdatesOnStart.Value = shouldLoadFromFile ? cff.CheckUpdatesOnStart : CheckUpdatesOnStart.Value; // Get from global config only UpdateCheckerType.Value = shouldLoadFromFile ? cff.UpdateCheckerType : UpdateCheckerType.Value; // Get from global config only - FocusLostActionType.Value = shouldLoadFromFile ? cff.FocusLostActionType : FocusLostActionType.Value; // Get from global config only + FocusLostActionType.Value = cff.FocusLostActionType; ShowConfirmExit.Value = shouldLoadFromFile ? cff.ShowConfirmExit : ShowConfirmExit.Value; // Get from global config only RememberWindowState.Value = shouldLoadFromFile ? cff.RememberWindowState : RememberWindowState.Value; // Get from global config only ShowTitleBar.Value = shouldLoadFromFile ? cff.ShowTitleBar : ShowTitleBar.Value; // Get from global config only EnableHardwareAcceleration.Value = shouldLoadFromFile ? cff.EnableHardwareAcceleration : EnableHardwareAcceleration.Value; // Get from global config only - HideCursor.Value = shouldLoadFromFile ? cff.HideCursor : HideCursor.Value; // Get from global config only + HideCursor.Value = cff.HideCursor; Logger.EnableFileLog.Value = cff.EnableFileLog; Logger.EnableDebug.Value = cff.LoggingEnableDebug; From e7c991349ee3ba16286eb67dbba7d15d82342c7d Mon Sep 17 00:00:00 2001 From: Vova Date: Sat, 15 Feb 2025 20:02:47 +1000 Subject: [PATCH 23/27] Removed unused library --- src/Ryujinx/UI/ViewModels/SettingsViewModel.cs | 1 - 1 file changed, 1 deletion(-) diff --git a/src/Ryujinx/UI/ViewModels/SettingsViewModel.cs b/src/Ryujinx/UI/ViewModels/SettingsViewModel.cs index ff675ab2ad..f98c996342 100644 --- a/src/Ryujinx/UI/ViewModels/SettingsViewModel.cs +++ b/src/Ryujinx/UI/ViewModels/SettingsViewModel.cs @@ -4,7 +4,6 @@ using Avalonia.Threading; using CommunityToolkit.Mvvm.ComponentModel; using CommunityToolkit.Mvvm.Input; -using Humanizer; using LibHac.Tools.FsSystem; using Ryujinx.Audio.Backends.OpenAL; using Ryujinx.Audio.Backends.SDL2; From edfd58bbe44dd652fb010c915f6b3045d89ebfbf Mon Sep 17 00:00:00 2001 From: Vova Date: Sat, 15 Feb 2025 21:24:48 +1000 Subject: [PATCH 24/27] small fix --- src/Ryujinx/UI/Windows/GameSpecificSettingsWindow.axaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Ryujinx/UI/Windows/GameSpecificSettingsWindow.axaml b/src/Ryujinx/UI/Windows/GameSpecificSettingsWindow.axaml index 6eb1c49c24..6f11b3b573 100644 --- a/src/Ryujinx/UI/Windows/GameSpecificSettingsWindow.axaml +++ b/src/Ryujinx/UI/Windows/GameSpecificSettingsWindow.axaml @@ -149,7 +149,7 @@ IsVisible="{Binding !IsGameRunning}" Content="{ext:Locale UserProfilesDelete}" Command="{Binding DeleteConfigGame}" - Classes="global"/> + Classes="red"/> From 4461a7c471e1279f99c8dbf2fc42362bee5cd3df Mon Sep 17 00:00:00 2001 From: Vova Date: Sat, 15 Feb 2025 21:44:30 +1000 Subject: [PATCH 25/27] Removed extra line added by mistake --- src/Ryujinx/UI/Views/Settings/SettingsUIView.axaml | 1 - 1 file changed, 1 deletion(-) diff --git a/src/Ryujinx/UI/Views/Settings/SettingsUIView.axaml b/src/Ryujinx/UI/Views/Settings/SettingsUIView.axaml index e47415c334..80f8e8c5f0 100644 --- a/src/Ryujinx/UI/Views/Settings/SettingsUIView.axaml +++ b/src/Ryujinx/UI/Views/Settings/SettingsUIView.axaml @@ -157,7 +157,6 @@ - From ced618d9a194c8f78b976de9843a184b134b3529 Mon Sep 17 00:00:00 2001 From: Evan Husted Date: Mon, 17 Feb 2025 01:47:17 -0600 Subject: [PATCH 26/27] Enabled per-game configuration of discord presence --- .../UI/Views/Settings/SettingsUIView.axaml | 16 ++++++---------- .../ConfigurationState.Migration.cs | 9 ++------- 2 files changed, 8 insertions(+), 17 deletions(-) diff --git a/src/Ryujinx/UI/Views/Settings/SettingsUIView.axaml b/src/Ryujinx/UI/Views/Settings/SettingsUIView.axaml index 80f8e8c5f0..2a46dcf49f 100644 --- a/src/Ryujinx/UI/Views/Settings/SettingsUIView.axaml +++ b/src/Ryujinx/UI/Views/Settings/SettingsUIView.axaml @@ -26,16 +26,12 @@ Spacing="10"> - - - - - + + + + ConfigurationFileFormat.CurrentVersion) { @@ -50,7 +45,7 @@ in _migrations.OrderBy(x => x.Key)) } - EnableDiscordIntegration.Value = shouldLoadFromFile ? cff.EnableDiscordIntegration : EnableDiscordIntegration.Value; // Get from global config only + EnableDiscordIntegration.Value = cff.EnableDiscordIntegration; CheckUpdatesOnStart.Value = shouldLoadFromFile ? cff.CheckUpdatesOnStart : CheckUpdatesOnStart.Value; // Get from global config only UpdateCheckerType.Value = shouldLoadFromFile ? cff.UpdateCheckerType : UpdateCheckerType.Value; // Get from global config only FocusLostActionType.Value = cff.FocusLostActionType; From 65527cfb69792158b02df610eeda425065142e2a Mon Sep 17 00:00:00 2001 From: Evan Husted Date: Mon, 17 Feb 2025 01:47:59 -0600 Subject: [PATCH 27/27] Reload configuration from global & reload app list at the end of the render loop (when it's done) --- src/Ryujinx/AppHost.cs | 14 +++++++------- src/Ryujinx/UI/Windows/MainWindow.axaml.cs | 5 ----- 2 files changed, 7 insertions(+), 12 deletions(-) diff --git a/src/Ryujinx/AppHost.cs b/src/Ryujinx/AppHost.cs index b345eb362c..ba0837725d 100644 --- a/src/Ryujinx/AppHost.cs +++ b/src/Ryujinx/AppHost.cs @@ -582,13 +582,6 @@ private void Exit() Rainbow.Disable(); Rainbow.Reset(); - // Reload settings when the game is turned off - // (resets custom settings if there were any) - Program.ReloadConfig(); - - //Updates the gameList (changes the status of the user setting if it was added or removed during the game) - RyujinxApp.MainWindow.GameListUpdate(); - _isStopped = true; Stop(); } @@ -1125,6 +1118,13 @@ private void RenderLoop() }); (RendererHost.EmbeddedWindow as EmbeddedWindowOpenGL)?.MakeCurrent(true); + + // Reload settings when the game is turned off + // (resets custom settings if there were any) + Program.ReloadConfig(); + + // Reload application list (changes the status of the user setting if it was added or removed during the game) + Dispatcher.UIThread.Post(() => RyujinxApp.MainWindow.LoadApplications()); } public void InitStatus() diff --git a/src/Ryujinx/UI/Windows/MainWindow.axaml.cs b/src/Ryujinx/UI/Windows/MainWindow.axaml.cs index 60d728088a..509f4df8e2 100644 --- a/src/Ryujinx/UI/Windows/MainWindow.axaml.cs +++ b/src/Ryujinx/UI/Windows/MainWindow.axaml.cs @@ -660,11 +660,6 @@ public void LoadApplications() ReloadGameList(); } - public void GameListUpdate() - { - ReloadGameList(); - } - public void ToggleFileType(string fileType) { switch (fileType)