aboutsummaryrefslogtreecommitdiff
path: root/src/Ryujinx.Ava/UI/Views/Input/KeyboardInputView.axaml.cs
diff options
context:
space:
mode:
Diffstat (limited to 'src/Ryujinx.Ava/UI/Views/Input/KeyboardInputView.axaml.cs')
-rw-r--r--src/Ryujinx.Ava/UI/Views/Input/KeyboardInputView.axaml.cs210
1 files changed, 210 insertions, 0 deletions
diff --git a/src/Ryujinx.Ava/UI/Views/Input/KeyboardInputView.axaml.cs b/src/Ryujinx.Ava/UI/Views/Input/KeyboardInputView.axaml.cs
new file mode 100644
index 00000000..f7024c5d
--- /dev/null
+++ b/src/Ryujinx.Ava/UI/Views/Input/KeyboardInputView.axaml.cs
@@ -0,0 +1,210 @@
+using Avalonia;
+using Avalonia.Controls;
+using Avalonia.Controls.Primitives;
+using Avalonia.Input;
+using Avalonia.Interactivity;
+using Avalonia.LogicalTree;
+using Ryujinx.Ava.UI.Helpers;
+using Ryujinx.Ava.UI.ViewModels.Input;
+using Ryujinx.Input;
+using Ryujinx.Input.Assigner;
+
+namespace Ryujinx.Ava.UI.Views.Input
+{
+ public partial class KeyboardInputView : UserControl
+ {
+ private ButtonKeyAssigner _currentAssigner;
+
+ public KeyboardInputView()
+ {
+ InitializeComponent();
+
+ foreach (ILogical visual in SettingButtons.GetLogicalDescendants())
+ {
+ if (visual is ToggleButton button and not CheckBox)
+ {
+ button.IsCheckedChanged += Button_IsCheckedChanged;
+ }
+ }
+ }
+
+ protected override void OnPointerReleased(PointerReleasedEventArgs e)
+ {
+ base.OnPointerReleased(e);
+
+ if (_currentAssigner != null && _currentAssigner.ToggledButton != null && !_currentAssigner.ToggledButton.IsPointerOver)
+ {
+ _currentAssigner.Cancel();
+ }
+ }
+
+ private void Button_IsCheckedChanged(object sender, RoutedEventArgs e)
+ {
+ if (sender is ToggleButton button)
+ {
+ if ((bool)button.IsChecked)
+ {
+ if (_currentAssigner != null && button == _currentAssigner.ToggledButton)
+ {
+ return;
+ }
+
+ bool isStick = button.Tag != null && button.Tag.ToString() == "stick";
+
+ if (_currentAssigner == null && (bool)button.IsChecked)
+ {
+ _currentAssigner = new ButtonKeyAssigner(button);
+
+ this.Focus(NavigationMethod.Pointer);
+
+ PointerPressed += MouseClick;
+
+ IKeyboard keyboard = (IKeyboard)(DataContext as KeyboardInputViewModel).parentModel.AvaloniaKeyboardDriver.GetGamepad("0"); // Open Avalonia keyboard for cancel operations.
+ IButtonAssigner assigner = CreateButtonAssigner(isStick);
+
+ _currentAssigner.ButtonAssigned += (sender, e) =>
+ {
+ if (e.ButtonValue.HasValue)
+ {
+ var viewModel = (DataContext as KeyboardInputViewModel);
+ var buttonValue = e.ButtonValue.Value;
+ viewModel.parentModel.IsModified = true;
+
+ switch (button.Name)
+ {
+ case "ButtonZl":
+ viewModel.Config.ButtonZl = buttonValue.AsKey();
+ break;
+ case "ButtonL":
+ viewModel.Config.ButtonL = buttonValue.AsKey();
+ break;
+ case "ButtonMinus":
+ viewModel.Config.ButtonMinus = buttonValue.AsKey();
+ break;
+ case "LeftStickButton":
+ viewModel.Config.LeftStickButton = buttonValue.AsKey();
+ break;
+ case "LeftStickUp":
+ viewModel.Config.LeftStickUp = buttonValue.AsKey();
+ break;
+ case "LeftStickDown":
+ viewModel.Config.LeftStickDown = buttonValue.AsKey();
+ break;
+ case "LeftStickRight":
+ viewModel.Config.LeftStickRight = buttonValue.AsKey();
+ break;
+ case "LeftStickLeft":
+ viewModel.Config.LeftStickLeft = buttonValue.AsKey();
+ break;
+ case "DpadUp":
+ viewModel.Config.DpadUp = buttonValue.AsKey();
+ break;
+ case "DpadDown":
+ viewModel.Config.DpadDown = buttonValue.AsKey();
+ break;
+ case "DpadLeft":
+ viewModel.Config.DpadLeft = buttonValue.AsKey();
+ break;
+ case "DpadRight":
+ viewModel.Config.DpadRight = buttonValue.AsKey();
+ break;
+ case "LeftButtonSr":
+ viewModel.Config.LeftButtonSr = buttonValue.AsKey();
+ break;
+ case "LeftButtonSl":
+ viewModel.Config.LeftButtonSl = buttonValue.AsKey();
+ break;
+ case "RightButtonSr":
+ viewModel.Config.RightButtonSr = buttonValue.AsKey();
+ break;
+ case "RightButtonSl":
+ viewModel.Config.RightButtonSl = buttonValue.AsKey();
+ break;
+ case "ButtonZr":
+ viewModel.Config.ButtonZr = buttonValue.AsKey();
+ break;
+ case "ButtonR":
+ viewModel.Config.ButtonR = buttonValue.AsKey();
+ break;
+ case "ButtonPlus":
+ viewModel.Config.ButtonPlus = buttonValue.AsKey();
+ break;
+ case "ButtonA":
+ viewModel.Config.ButtonA = buttonValue.AsKey();
+ break;
+ case "ButtonB":
+ viewModel.Config.ButtonB = buttonValue.AsKey();
+ break;
+ case "ButtonX":
+ viewModel.Config.ButtonX = buttonValue.AsKey();
+ break;
+ case "ButtonY":
+ viewModel.Config.ButtonY = buttonValue.AsKey();
+ break;
+ case "RightStickButton":
+ viewModel.Config.RightStickButton = buttonValue.AsKey();
+ break;
+ case "RightStickUp":
+ viewModel.Config.RightStickUp = buttonValue.AsKey();
+ break;
+ case "RightStickDown":
+ viewModel.Config.RightStickDown = buttonValue.AsKey();
+ break;
+ case "RightStickRight":
+ viewModel.Config.RightStickRight = buttonValue.AsKey();
+ break;
+ case "RightStickLeft":
+ viewModel.Config.RightStickLeft = buttonValue.AsKey();
+ break;
+ }
+ }
+ };
+
+ _currentAssigner.GetInputAndAssign(assigner, keyboard);
+ }
+ else
+ {
+ if (_currentAssigner != null)
+ {
+ ToggleButton oldButton = _currentAssigner.ToggledButton;
+
+ _currentAssigner.Cancel();
+ _currentAssigner = null;
+ button.IsChecked = false;
+ }
+ }
+ }
+ else
+ {
+ _currentAssigner?.Cancel();
+ _currentAssigner = null;
+ }
+ }
+ }
+
+ private void MouseClick(object sender, PointerPressedEventArgs e)
+ {
+ bool shouldUnbind = e.GetCurrentPoint(this).Properties.IsMiddleButtonPressed;
+
+ _currentAssigner?.Cancel(shouldUnbind);
+
+ PointerPressed -= MouseClick;
+ }
+
+ private IButtonAssigner CreateButtonAssigner(bool forStick)
+ {
+ IButtonAssigner assigner;
+
+ assigner = new KeyboardKeyAssigner((IKeyboard)(DataContext as KeyboardInputViewModel).parentModel.SelectedGamepad);
+
+ return assigner;
+ }
+
+ protected override void OnDetachedFromVisualTree(VisualTreeAttachmentEventArgs e)
+ {
+ base.OnDetachedFromVisualTree(e);
+ _currentAssigner?.Cancel();
+ _currentAssigner = null;
+ }
+ }
+}