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 }