aboutsummaryrefslogtreecommitdiff
path: root/src/Ryujinx.Ava/UI/ViewModels
diff options
context:
space:
mode:
Diffstat (limited to 'src/Ryujinx.Ava/UI/ViewModels')
-rw-r--r--src/Ryujinx.Ava/UI/ViewModels/Input/ControllerInputViewModel.cs84
-rw-r--r--src/Ryujinx.Ava/UI/ViewModels/Input/InputViewModel.cs (renamed from src/Ryujinx.Ava/UI/ViewModels/ControllerInputViewModel.cs)93
-rw-r--r--src/Ryujinx.Ava/UI/ViewModels/Input/KeyboardInputViewModel.cs73
-rw-r--r--src/Ryujinx.Ava/UI/ViewModels/Input/MotionInputViewModel.cs (renamed from src/Ryujinx.Ava/UI/ViewModels/MotionInputViewModel.cs)2
-rw-r--r--src/Ryujinx.Ava/UI/ViewModels/Input/RumbleInputViewModel.cs (renamed from src/Ryujinx.Ava/UI/ViewModels/RumbleInputViewModel.cs)2
5 files changed, 202 insertions, 52 deletions
diff --git a/src/Ryujinx.Ava/UI/ViewModels/Input/ControllerInputViewModel.cs b/src/Ryujinx.Ava/UI/ViewModels/Input/ControllerInputViewModel.cs
new file mode 100644
index 00000000..0e23dfa7
--- /dev/null
+++ b/src/Ryujinx.Ava/UI/ViewModels/Input/ControllerInputViewModel.cs
@@ -0,0 +1,84 @@
+using Avalonia.Svg.Skia;
+using Ryujinx.Ava.UI.Models.Input;
+using Ryujinx.Ava.UI.Views.Input;
+
+namespace Ryujinx.Ava.UI.ViewModels.Input
+{
+ public class ControllerInputViewModel : BaseModel
+ {
+ private ControllerInputConfig _config;
+ public ControllerInputConfig Config
+ {
+ get => _config;
+ set
+ {
+ _config = value;
+ OnPropertyChanged();
+ }
+ }
+
+ private bool _isLeft;
+ public bool IsLeft
+ {
+ get => _isLeft;
+ set
+ {
+ _isLeft = value;
+ OnPropertyChanged();
+ OnPropertyChanged(nameof(HasSides));
+ }
+ }
+
+ private bool _isRight;
+ public bool IsRight
+ {
+ get => _isRight;
+ set
+ {
+ _isRight = value;
+ OnPropertyChanged();
+ OnPropertyChanged(nameof(HasSides));
+ }
+ }
+
+ public bool HasSides => IsLeft ^ IsRight;
+
+ private SvgImage _image;
+ public SvgImage Image
+ {
+ get => _image;
+ set
+ {
+ _image = value;
+ OnPropertyChanged();
+ }
+ }
+
+ public InputViewModel parentModel;
+
+ public ControllerInputViewModel(InputViewModel model, ControllerInputConfig config)
+ {
+ parentModel = model;
+ model.NotifyChangesEvent += OnParentModelChanged;
+ OnParentModelChanged();
+ Config = config;
+ }
+
+ public async void ShowMotionConfig()
+ {
+ await MotionInputView.Show(this);
+ }
+
+ public async void ShowRumbleConfig()
+ {
+ await RumbleInputView.Show(this);
+ }
+
+ public void OnParentModelChanged()
+ {
+ IsLeft = parentModel.IsLeft;
+ IsRight = parentModel.IsRight;
+ Image = parentModel.Image;
+ }
+ }
+}
diff --git a/src/Ryujinx.Ava/UI/ViewModels/ControllerInputViewModel.cs b/src/Ryujinx.Ava/UI/ViewModels/Input/InputViewModel.cs
index c0c62532..ef8ffd50 100644
--- a/src/Ryujinx.Ava/UI/ViewModels/ControllerInputViewModel.cs
+++ b/src/Ryujinx.Ava/UI/ViewModels/Input/InputViewModel.cs
@@ -8,7 +8,7 @@ using Ryujinx.Ava.Common.Locale;
using Ryujinx.Ava.Input;
using Ryujinx.Ava.UI.Helpers;
using Ryujinx.Ava.UI.Models;
-using Ryujinx.Ava.UI.Views.Input;
+using Ryujinx.Ava.UI.Models.Input;
using Ryujinx.Ava.UI.Windows;
using Ryujinx.Common;
using Ryujinx.Common.Configuration;
@@ -30,9 +30,9 @@ using ConfigGamepadInputId = Ryujinx.Common.Configuration.Hid.Controller.Gamepad
using ConfigStickInputId = Ryujinx.Common.Configuration.Hid.Controller.StickInputId;
using Key = Ryujinx.Common.Configuration.Hid.Key;
-namespace Ryujinx.Ava.UI.ViewModels
+namespace Ryujinx.Ava.UI.ViewModels.Input
{
- public class ControllerInputViewModel : BaseModel, IDisposable
+ public class InputViewModel : BaseModel, IDisposable
{
private const string Disabled = "disabled";
private const string ProControllerResource = "Ryujinx.Ui.Common/Resources/Controller_ProCon.svg";
@@ -48,7 +48,7 @@ namespace Ryujinx.Ava.UI.ViewModels
private int _controllerNumber;
private string _controllerImage;
private int _device;
- private object _configuration;
+ private object _configViewModel;
private string _profileName;
private bool _isLoaded;
@@ -71,13 +71,14 @@ namespace Ryujinx.Ava.UI.ViewModels
public bool IsLeft { get; set; }
public bool IsModified { get; set; }
+ public event Action NotifyChangesEvent;
- public object Configuration
+ public object ConfigViewModel
{
- get => _configuration;
+ get => _configViewModel;
set
{
- _configuration = value;
+ _configViewModel = value;
OnPropertyChanged();
}
@@ -232,7 +233,7 @@ namespace Ryujinx.Ava.UI.ViewModels
public InputConfig Config { get; set; }
- public ControllerInputViewModel(UserControl owner) : this()
+ public InputViewModel(UserControl owner) : this()
{
if (Program.PreviewerDetached)
{
@@ -244,7 +245,6 @@ namespace Ryujinx.Ava.UI.ViewModels
_mainWindow.InputManager.GamepadDriver.OnGamepadConnected += HandleOnGamepadConnected;
_mainWindow.InputManager.GamepadDriver.OnGamepadDisconnected += HandleOnGamepadDisconnected;
-
_mainWindow.ViewModel.AppHost?.NpadManager.BlockInputUpdates();
_isLoaded = false;
@@ -255,7 +255,7 @@ namespace Ryujinx.Ava.UI.ViewModels
}
}
- public ControllerInputViewModel()
+ public InputViewModel()
{
PlayerIndexes = new ObservableCollection<PlayerModel>();
Controllers = new ObservableCollection<ControllerModel>();
@@ -282,12 +282,12 @@ namespace Ryujinx.Ava.UI.ViewModels
if (Config is StandardKeyboardInputConfig keyboardInputConfig)
{
- Configuration = new InputConfiguration<Key, ConfigStickInputId>(keyboardInputConfig);
+ ConfigViewModel = new KeyboardInputViewModel(this, new KeyboardInputConfig(keyboardInputConfig));
}
if (Config is StandardControllerInputConfig controllerInputConfig)
{
- Configuration = new InputConfiguration<ConfigGamepadInputId, ConfigStickInputId>(controllerInputConfig);
+ ConfigViewModel = new ControllerInputViewModel(this, new ControllerInputConfig(controllerInputConfig));
}
}
@@ -323,16 +323,6 @@ namespace Ryujinx.Ava.UI.ViewModels
}
}
- public async void ShowMotionConfig()
- {
- await MotionInputView.Show(this);
- }
-
- public async void ShowRumbleConfig()
- {
- await RumbleInputView.Show(this);
- }
-
private void LoadInputDriver()
{
if (_device < 0)
@@ -740,7 +730,7 @@ namespace Ryujinx.Ava.UI.ViewModels
return;
}
- if (Configuration == null)
+ if (ConfigViewModel == null)
{
return;
}
@@ -751,35 +741,37 @@ namespace Ryujinx.Ava.UI.ViewModels
return;
}
-
- bool validFileName = ProfileName.IndexOfAny(Path.GetInvalidFileNameChars()) == -1;
-
- if (validFileName)
+ else
{
- string path = Path.Combine(GetProfileBasePath(), ProfileName + ".json");
-
- InputConfig config = null;
+ bool validFileName = ProfileName.IndexOfAny(Path.GetInvalidFileNameChars()) == -1;
- if (IsKeyboard)
+ if (validFileName)
{
- config = (Configuration as InputConfiguration<Key, ConfigStickInputId>).GetConfig();
- }
- else if (IsController)
- {
- config = (Configuration as InputConfiguration<GamepadInputId, ConfigStickInputId>).GetConfig();
- }
+ string path = Path.Combine(GetProfileBasePath(), ProfileName + ".json");
- config.ControllerType = Controllers[_controller].Type;
+ InputConfig config = null;
- string jsonString = JsonHelper.Serialize(config, _serializerContext.InputConfig);
+ if (IsKeyboard)
+ {
+ config = (ConfigViewModel as KeyboardInputViewModel).Config.GetConfig();
+ }
+ else if (IsController)
+ {
+ config = (ConfigViewModel as ControllerInputViewModel).Config.GetConfig();
+ }
- await File.WriteAllTextAsync(path, jsonString);
+ config.ControllerType = Controllers[_controller].Type;
- LoadProfiles();
- }
- else
- {
- await ContentDialogHelper.CreateErrorDialog(LocaleManager.Instance[LocaleKeys.DialogProfileInvalidProfileNameErrorMessage]);
+ string jsonString = JsonHelper.Serialize(config, _serializerContext.InputConfig);
+
+ await File.WriteAllTextAsync(path, jsonString);
+
+ LoadProfiles();
+ }
+ else
+ {
+ await ContentDialogHelper.CreateErrorDialog(LocaleManager.Instance[LocaleKeys.DialogProfileInvalidProfileNameErrorMessage]);
+ }
}
}
@@ -830,18 +822,18 @@ namespace Ryujinx.Ava.UI.ViewModels
if (device.Type == DeviceType.Keyboard)
{
- var inputConfig = Configuration as InputConfiguration<Key, ConfigStickInputId>;
+ var inputConfig = (ConfigViewModel as KeyboardInputViewModel).Config;
inputConfig.Id = device.Id;
}
else
{
- var inputConfig = Configuration as InputConfiguration<GamepadInputId, ConfigStickInputId>;
+ var inputConfig = (ConfigViewModel as ControllerInputViewModel).Config;
inputConfig.Id = device.Id.Split(" ")[0];
}
var config = !IsController
- ? (Configuration as InputConfiguration<Key, ConfigStickInputId>).GetConfig()
- : (Configuration as InputConfiguration<GamepadInputId, ConfigStickInputId>).GetConfig();
+ ? (ConfigViewModel as KeyboardInputViewModel).Config.GetConfig()
+ : (ConfigViewModel as ControllerInputViewModel).Config.GetConfig();
config.ControllerType = Controllers[_controller].Type;
config.PlayerIndex = _playerId;
@@ -872,12 +864,13 @@ namespace Ryujinx.Ava.UI.ViewModels
public void NotifyChanges()
{
- OnPropertyChanged(nameof(Configuration));
+ OnPropertyChanged(nameof(ConfigViewModel));
OnPropertyChanged(nameof(IsController));
OnPropertyChanged(nameof(ShowSettings));
OnPropertyChanged(nameof(IsKeyboard));
OnPropertyChanged(nameof(IsRight));
OnPropertyChanged(nameof(IsLeft));
+ NotifyChangesEvent?.Invoke();
}
public void Dispose()
diff --git a/src/Ryujinx.Ava/UI/ViewModels/Input/KeyboardInputViewModel.cs b/src/Ryujinx.Ava/UI/ViewModels/Input/KeyboardInputViewModel.cs
new file mode 100644
index 00000000..a9387306
--- /dev/null
+++ b/src/Ryujinx.Ava/UI/ViewModels/Input/KeyboardInputViewModel.cs
@@ -0,0 +1,73 @@
+using Avalonia.Svg.Skia;
+using Ryujinx.Ava.UI.Models.Input;
+
+namespace Ryujinx.Ava.UI.ViewModels.Input
+{
+ public class KeyboardInputViewModel : BaseModel
+ {
+ private KeyboardInputConfig _config;
+ public KeyboardInputConfig Config
+ {
+ get => _config;
+ set
+ {
+ _config = value;
+ OnPropertyChanged();
+ }
+ }
+
+ private bool _isLeft;
+ public bool IsLeft
+ {
+ get => _isLeft;
+ set
+ {
+ _isLeft = value;
+ OnPropertyChanged();
+ OnPropertyChanged(nameof(HasSides));
+ }
+ }
+
+ private bool _isRight;
+ public bool IsRight
+ {
+ get => _isRight;
+ set
+ {
+ _isRight = value;
+ OnPropertyChanged();
+ OnPropertyChanged(nameof(HasSides));
+ }
+ }
+
+ public bool HasSides => IsLeft ^ IsRight;
+
+ private SvgImage _image;
+ public SvgImage Image
+ {
+ get => _image;
+ set
+ {
+ _image = value;
+ OnPropertyChanged();
+ }
+ }
+
+ public InputViewModel parentModel;
+
+ public KeyboardInputViewModel(InputViewModel model, KeyboardInputConfig config)
+ {
+ parentModel = model;
+ model.NotifyChangesEvent += OnParentModelChanged;
+ OnParentModelChanged();
+ Config = config;
+ }
+
+ public void OnParentModelChanged()
+ {
+ IsLeft = parentModel.IsLeft;
+ IsRight = parentModel.IsRight;
+ Image = parentModel.Image;
+ }
+ }
+}
diff --git a/src/Ryujinx.Ava/UI/ViewModels/MotionInputViewModel.cs b/src/Ryujinx.Ava/UI/ViewModels/Input/MotionInputViewModel.cs
index 0b12a51f..c9ed8f2d 100644
--- a/src/Ryujinx.Ava/UI/ViewModels/MotionInputViewModel.cs
+++ b/src/Ryujinx.Ava/UI/ViewModels/Input/MotionInputViewModel.cs
@@ -1,4 +1,4 @@
-namespace Ryujinx.Ava.UI.ViewModels
+namespace Ryujinx.Ava.UI.ViewModels.Input
{
public class MotionInputViewModel : BaseModel
{
diff --git a/src/Ryujinx.Ava/UI/ViewModels/RumbleInputViewModel.cs b/src/Ryujinx.Ava/UI/ViewModels/Input/RumbleInputViewModel.cs
index 49de1993..8ad33cf4 100644
--- a/src/Ryujinx.Ava/UI/ViewModels/RumbleInputViewModel.cs
+++ b/src/Ryujinx.Ava/UI/ViewModels/Input/RumbleInputViewModel.cs
@@ -1,4 +1,4 @@
-namespace Ryujinx.Ava.UI.ViewModels
+namespace Ryujinx.Ava.UI.ViewModels.Input
{
public class RumbleInputViewModel : BaseModel
{