/ src / Ryujinx / UI / Views / Input / KeyboardInputView.axaml.cs
KeyboardInputView.axaml.cs
  1  using Avalonia;
  2  using Avalonia.Controls;
  3  using Avalonia.Controls.Primitives;
  4  using Avalonia.Input;
  5  using Avalonia.Interactivity;
  6  using Avalonia.LogicalTree;
  7  using Ryujinx.Ava.UI.Helpers;
  8  using Ryujinx.Ava.UI.ViewModels.Input;
  9  using Ryujinx.Input;
 10  using Ryujinx.Input.Assigner;
 11  using Key = Ryujinx.Common.Configuration.Hid.Key;
 12  
 13  namespace Ryujinx.Ava.UI.Views.Input
 14  {
 15      public partial class KeyboardInputView : UserControl
 16      {
 17          private ButtonKeyAssigner _currentAssigner;
 18  
 19          public KeyboardInputView()
 20          {
 21              InitializeComponent();
 22  
 23              foreach (ILogical visual in SettingButtons.GetLogicalDescendants())
 24              {
 25                  if (visual is ToggleButton button and not CheckBox)
 26                  {
 27                      button.IsCheckedChanged += Button_IsCheckedChanged;
 28                  }
 29              }
 30          }
 31  
 32          protected override void OnPointerReleased(PointerReleasedEventArgs e)
 33          {
 34              base.OnPointerReleased(e);
 35  
 36              if (_currentAssigner != null && _currentAssigner.ToggledButton != null && !_currentAssigner.ToggledButton.IsPointerOver)
 37              {
 38                  _currentAssigner.Cancel();
 39              }
 40          }
 41  
 42          private void Button_IsCheckedChanged(object sender, RoutedEventArgs e)
 43          {
 44              if (sender is ToggleButton button)
 45              {
 46                  if ((bool)button.IsChecked)
 47                  {
 48                      if (_currentAssigner != null && button == _currentAssigner.ToggledButton)
 49                      {
 50                          return;
 51                      }
 52  
 53                      if (_currentAssigner == null)
 54                      {
 55                          _currentAssigner = new ButtonKeyAssigner(button);
 56  
 57                          Focus(NavigationMethod.Pointer);
 58  
 59                          PointerPressed += MouseClick;
 60  
 61                          var viewModel = (DataContext as KeyboardInputViewModel);
 62  
 63                          IKeyboard keyboard = (IKeyboard)viewModel.ParentModel.AvaloniaKeyboardDriver.GetGamepad("0"); // Open Avalonia keyboard for cancel operations.
 64                          IButtonAssigner assigner = CreateButtonAssigner();
 65  
 66                          _currentAssigner.ButtonAssigned += (sender, e) =>
 67                          {
 68                              if (e.ButtonValue.HasValue)
 69                              {
 70                                  var buttonValue = e.ButtonValue.Value;
 71                                  viewModel.ParentModel.IsModified = true;
 72  
 73                                  switch (button.Name)
 74                                  {
 75                                      case "ButtonZl":
 76                                          viewModel.Config.ButtonZl = buttonValue.AsHidType<Key>();
 77                                          break;
 78                                      case "ButtonL":
 79                                          viewModel.Config.ButtonL = buttonValue.AsHidType<Key>();
 80                                          break;
 81                                      case "ButtonMinus":
 82                                          viewModel.Config.ButtonMinus = buttonValue.AsHidType<Key>();
 83                                          break;
 84                                      case "LeftStickButton":
 85                                          viewModel.Config.LeftStickButton = buttonValue.AsHidType<Key>();
 86                                          break;
 87                                      case "LeftStickUp":
 88                                          viewModel.Config.LeftStickUp = buttonValue.AsHidType<Key>();
 89                                          break;
 90                                      case "LeftStickDown":
 91                                          viewModel.Config.LeftStickDown = buttonValue.AsHidType<Key>();
 92                                          break;
 93                                      case "LeftStickRight":
 94                                          viewModel.Config.LeftStickRight = buttonValue.AsHidType<Key>();
 95                                          break;
 96                                      case "LeftStickLeft":
 97                                          viewModel.Config.LeftStickLeft = buttonValue.AsHidType<Key>();
 98                                          break;
 99                                      case "DpadUp":
100                                          viewModel.Config.DpadUp = buttonValue.AsHidType<Key>();
101                                          break;
102                                      case "DpadDown":
103                                          viewModel.Config.DpadDown = buttonValue.AsHidType<Key>();
104                                          break;
105                                      case "DpadLeft":
106                                          viewModel.Config.DpadLeft = buttonValue.AsHidType<Key>();
107                                          break;
108                                      case "DpadRight":
109                                          viewModel.Config.DpadRight = buttonValue.AsHidType<Key>();
110                                          break;
111                                      case "LeftButtonSr":
112                                          viewModel.Config.LeftButtonSr = buttonValue.AsHidType<Key>();
113                                          break;
114                                      case "LeftButtonSl":
115                                          viewModel.Config.LeftButtonSl = buttonValue.AsHidType<Key>();
116                                          break;
117                                      case "RightButtonSr":
118                                          viewModel.Config.RightButtonSr = buttonValue.AsHidType<Key>();
119                                          break;
120                                      case "RightButtonSl":
121                                          viewModel.Config.RightButtonSl = buttonValue.AsHidType<Key>();
122                                          break;
123                                      case "ButtonZr":
124                                          viewModel.Config.ButtonZr = buttonValue.AsHidType<Key>();
125                                          break;
126                                      case "ButtonR":
127                                          viewModel.Config.ButtonR = buttonValue.AsHidType<Key>();
128                                          break;
129                                      case "ButtonPlus":
130                                          viewModel.Config.ButtonPlus = buttonValue.AsHidType<Key>();
131                                          break;
132                                      case "ButtonA":
133                                          viewModel.Config.ButtonA = buttonValue.AsHidType<Key>();
134                                          break;
135                                      case "ButtonB":
136                                          viewModel.Config.ButtonB = buttonValue.AsHidType<Key>();
137                                          break;
138                                      case "ButtonX":
139                                          viewModel.Config.ButtonX = buttonValue.AsHidType<Key>();
140                                          break;
141                                      case "ButtonY":
142                                          viewModel.Config.ButtonY = buttonValue.AsHidType<Key>();
143                                          break;
144                                      case "RightStickButton":
145                                          viewModel.Config.RightStickButton = buttonValue.AsHidType<Key>();
146                                          break;
147                                      case "RightStickUp":
148                                          viewModel.Config.RightStickUp = buttonValue.AsHidType<Key>();
149                                          break;
150                                      case "RightStickDown":
151                                          viewModel.Config.RightStickDown = buttonValue.AsHidType<Key>();
152                                          break;
153                                      case "RightStickRight":
154                                          viewModel.Config.RightStickRight = buttonValue.AsHidType<Key>();
155                                          break;
156                                      case "RightStickLeft":
157                                          viewModel.Config.RightStickLeft = buttonValue.AsHidType<Key>();
158                                          break;
159                                  }
160                              }
161                          };
162  
163                          _currentAssigner.GetInputAndAssign(assigner, keyboard);
164                      }
165                      else
166                      {
167                          if (_currentAssigner != null)
168                          {
169                              _currentAssigner.Cancel();
170                              _currentAssigner = null;
171                              button.IsChecked = false;
172                          }
173                      }
174                  }
175                  else
176                  {
177                      _currentAssigner?.Cancel();
178                      _currentAssigner = null;
179                  }
180              }
181          }
182  
183          private void MouseClick(object sender, PointerPressedEventArgs e)
184          {
185              bool shouldUnbind = e.GetCurrentPoint(this).Properties.IsMiddleButtonPressed;
186  
187              _currentAssigner?.Cancel(shouldUnbind);
188  
189              PointerPressed -= MouseClick;
190          }
191  
192          private IButtonAssigner CreateButtonAssigner()
193          {
194              IButtonAssigner assigner;
195  
196              assigner = new KeyboardKeyAssigner((IKeyboard)(DataContext as KeyboardInputViewModel).ParentModel.SelectedGamepad);
197  
198              return assigner;
199          }
200  
201          protected override void OnDetachedFromVisualTree(VisualTreeAttachmentEventArgs e)
202          {
203              base.OnDetachedFromVisualTree(e);
204              _currentAssigner?.Cancel();
205              _currentAssigner = null;
206          }
207      }
208  }