From 4995801d814e2074b054507174dfdefd8c578c76 Mon Sep 17 00:00:00 2001 From: WilliamWsyHK Date: Sat, 18 May 2024 00:21:03 +0800 Subject: [PATCH] Per-game input controller settings! --- .../UI/ViewModels/Input/InputViewModel.cs | 28 ++++++++++++++++--- .../UI/Windows/SettingsWindow.axaml.cs | 2 ++ 2 files changed, 26 insertions(+), 4 deletions(-) diff --git a/src/Ryujinx/UI/ViewModels/Input/InputViewModel.cs b/src/Ryujinx/UI/ViewModels/Input/InputViewModel.cs index 3fb480552b..9088099e74 100644 --- a/src/Ryujinx/UI/ViewModels/Input/InputViewModel.cs +++ b/src/Ryujinx/UI/ViewModels/Input/InputViewModel.cs @@ -19,6 +19,7 @@ using Ryujinx.Common.Configuration.Hid.Keyboard; using Ryujinx.Common.Logging; using Ryujinx.Common.Utilities; using Ryujinx.Input; +using Ryujinx.UI.App.Common; using Ryujinx.UI.Common.Configuration; using System; using System.Collections.Generic; @@ -51,9 +52,12 @@ namespace Ryujinx.Ava.UI.ViewModels.Input private object _configViewModel; private string _profileName; private bool _isLoaded; + private ApplicationData _applicationData; private static readonly InputConfigJsonSerializerContext _serializerContext = new(JsonHelper.GetDefaultSerializerOptions()); + public bool IsTitleSpecificSettings => _applicationData != null; + public IGamepadDriver AvaloniaKeyboardDriver { get; } public IGamepad SelectedGamepad { get; private set; } @@ -275,6 +279,17 @@ namespace Ryujinx.Ava.UI.ViewModels.Input PlayerIndexes.Add(new(PlayerIndex.Handheld, LocaleManager.Instance[LocaleKeys.ControllerSettingsHandheld])); } + internal void SetApplicationData(ApplicationData applicationData) + { + _applicationData = applicationData; + OnPropertyChanged(nameof(_applicationData)); + _isLoaded = false; + LoadConfiguration(ConfigurationState.Instance(IsTitleSpecificSettings).Hid.InputConfig.Value.Find(inputConfig => inputConfig.PlayerIndex == _playerId)); + LoadDevice(); + _isLoaded = true; + LoadProfiles(); + } + private void LoadConfiguration(InputConfig inputConfig = null) { Config = inputConfig ?? ConfigurationState.Shared.Hid.InputConfig.Value.Find(inputConfig => inputConfig.PlayerIndex == _playerId); @@ -807,7 +822,9 @@ namespace Ryujinx.Ava.UI.ViewModels.Input List newConfig = new(); - newConfig.AddRange(ConfigurationState.Shared.Hid.InputConfig.Value); + ConfigurationState configState = ConfigurationState.Instance(IsTitleSpecificSettings); + + newConfig.AddRange(configState.Hid.InputConfig.Value); newConfig.Remove(newConfig.Find(x => x == null)); @@ -847,13 +864,15 @@ namespace Ryujinx.Ava.UI.ViewModels.Input } } - _mainWindow.ViewModel.AppHost?.NpadManager.ReloadConfiguration(newConfig, ConfigurationState.Shared.Hid.EnableKeyboard, ConfigurationState.Shared.Hid.EnableMouse); + _mainWindow.ViewModel.AppHost?.NpadManager.ReloadConfiguration(newConfig, configState.Hid.EnableKeyboard, configState.Hid.EnableMouse); // Atomically replace and signal input change. // NOTE: Do not modify InputConfig.Value directly as other code depends on the on-change event. - ConfigurationState.Shared.Hid.InputConfig.Value = newConfig; + configState.Hid.InputConfig.Value = newConfig; - ConfigurationState.Shared.ToFileFormat().SaveConfig(Program.ConfigurationPath); + configState.ToFileFormat().SaveConfig(IsTitleSpecificSettings + ? ConfigurationState.ConfigurationFilePathForTitle(_applicationData.TitleId) + : Program.ConfigurationPath); } public void NotifyChange(string property) @@ -863,6 +882,7 @@ namespace Ryujinx.Ava.UI.ViewModels.Input public void NotifyChanges() { + OnPropertyChanged(nameof(_applicationData)); OnPropertyChanged(nameof(ConfigViewModel)); OnPropertyChanged(nameof(IsController)); OnPropertyChanged(nameof(ShowSettings)); diff --git a/src/Ryujinx/UI/Windows/SettingsWindow.axaml.cs b/src/Ryujinx/UI/Windows/SettingsWindow.axaml.cs index 14125e07e6..1d70d5640e 100644 --- a/src/Ryujinx/UI/Windows/SettingsWindow.axaml.cs +++ b/src/Ryujinx/UI/Windows/SettingsWindow.axaml.cs @@ -79,6 +79,8 @@ namespace Ryujinx.Ava.UI.Windows NavPanel.Content = UiPage; break; case "InputPage": + (InputPage.InputView.DataContext as InputViewModel)?.SetApplicationData( + ViewModel.ApplicationData); NavPanel.Content = InputPage; break; case "HotkeysPage":