| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238 |
- 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.Common.Configuration.Hid.Controller;
- using Ryujinx.Input;
- using Ryujinx.Input.Assigner;
- using StickInputId = Ryujinx.Common.Configuration.Hid.Controller.StickInputId;
- namespace Ryujinx.Ava.UI.Views.Input
- {
- public partial class ControllerInputView : UserControl
- {
- private ButtonKeyAssigner _currentAssigner;
- public ControllerInputView()
- {
- InitializeComponent();
- foreach (ILogical visual in SettingButtons.GetLogicalDescendants())
- {
- switch (visual)
- {
- case ToggleButton button and not CheckBox:
- button.IsCheckedChanged += Button_IsCheckedChanged;
- break;
- case CheckBox check:
- check.IsCheckedChanged += CheckBox_IsCheckedChanged;
- break;
- case Slider slider:
- slider.PropertyChanged += Slider_ValueChanged;
- break;
- }
- }
- }
- protected override void OnPointerReleased(PointerReleasedEventArgs e)
- {
- base.OnPointerReleased(e);
- if (_currentAssigner is { ToggledButton.IsPointerOver: false })
- {
- _currentAssigner.Cancel();
- }
- }
- private float _changeSlider = float.NaN;
- private void Slider_ValueChanged(object sender, AvaloniaPropertyChangedEventArgs e)
- {
- if (sender is Slider check)
- {
- _changeSlider = check.IsPointerOver switch
- {
- true when float.IsNaN(_changeSlider) => (float)check.Value,
- false => float.NaN,
- _ => _changeSlider
- };
- if (!float.IsNaN(_changeSlider) && _changeSlider != (float)check.Value)
- {
- (DataContext as ControllerInputViewModel)!.ParentModel.IsModified = true;
- _changeSlider = (float)check.Value;
- }
- }
- }
- private void CheckBox_IsCheckedChanged(object sender, RoutedEventArgs e)
- {
- if (sender is CheckBox { IsPointerOver: true })
- {
- (DataContext as ControllerInputViewModel)!.ParentModel.IsModified = true;
- _currentAssigner?.Cancel();
- _currentAssigner = null;
- }
- }
- private void Button_IsCheckedChanged(object sender, RoutedEventArgs e)
- {
- if (sender is ToggleButton button)
- {
- if (button.IsChecked is true)
- {
- if (_currentAssigner != null && button == _currentAssigner.ToggledButton)
- {
- return;
- }
- bool isStick = button.Tag != null && button.Tag.ToString() == "stick";
- if (_currentAssigner == null)
- {
- _currentAssigner = new ButtonKeyAssigner(button);
- this.Focus(NavigationMethod.Pointer);
- PointerPressed += MouseClick;
- var viewModel = (DataContext as ControllerInputViewModel);
- IKeyboard keyboard = (IKeyboard)viewModel.ParentModel.AvaloniaKeyboardDriver.GetGamepad("0"); // Open Avalonia keyboard for cancel operations.
- IButtonAssigner assigner = CreateButtonAssigner(isStick);
- _currentAssigner.ButtonAssigned += (sender, e) =>
- {
- if (e.ButtonValue.HasValue)
- {
- var buttonValue = e.ButtonValue.Value;
- viewModel.ParentModel.IsModified = true;
- switch (button.Name)
- {
- case "ButtonZl":
- viewModel.Config.ButtonZl = buttonValue.AsHidType<GamepadInputId>();
- break;
- case "ButtonL":
- viewModel.Config.ButtonL = buttonValue.AsHidType<GamepadInputId>();
- break;
- case "ButtonMinus":
- viewModel.Config.ButtonMinus = buttonValue.AsHidType<GamepadInputId>();
- break;
- case "LeftStickButton":
- viewModel.Config.LeftStickButton = buttonValue.AsHidType<GamepadInputId>();
- break;
- case "LeftJoystick":
- viewModel.Config.LeftJoystick = buttonValue.AsHidType<StickInputId>();
- break;
- case "DpadUp":
- viewModel.Config.DpadUp = buttonValue.AsHidType<GamepadInputId>();
- break;
- case "DpadDown":
- viewModel.Config.DpadDown = buttonValue.AsHidType<GamepadInputId>();
- break;
- case "DpadLeft":
- viewModel.Config.DpadLeft = buttonValue.AsHidType<GamepadInputId>();
- break;
- case "DpadRight":
- viewModel.Config.DpadRight = buttonValue.AsHidType<GamepadInputId>();
- break;
- case "LeftButtonSr":
- viewModel.Config.LeftButtonSr = buttonValue.AsHidType<GamepadInputId>();
- break;
- case "LeftButtonSl":
- viewModel.Config.LeftButtonSl = buttonValue.AsHidType<GamepadInputId>();
- break;
- case "RightButtonSr":
- viewModel.Config.RightButtonSr = buttonValue.AsHidType<GamepadInputId>();
- break;
- case "RightButtonSl":
- viewModel.Config.RightButtonSl = buttonValue.AsHidType<GamepadInputId>();
- break;
- case "ButtonZr":
- viewModel.Config.ButtonZr = buttonValue.AsHidType<GamepadInputId>();
- break;
- case "ButtonR":
- viewModel.Config.ButtonR = buttonValue.AsHidType<GamepadInputId>();
- break;
- case "ButtonPlus":
- viewModel.Config.ButtonPlus = buttonValue.AsHidType<GamepadInputId>();
- break;
- case "ButtonA":
- viewModel.Config.ButtonA = buttonValue.AsHidType<GamepadInputId>();
- break;
- case "ButtonB":
- viewModel.Config.ButtonB = buttonValue.AsHidType<GamepadInputId>();
- break;
- case "ButtonX":
- viewModel.Config.ButtonX = buttonValue.AsHidType<GamepadInputId>();
- break;
- case "ButtonY":
- viewModel.Config.ButtonY = buttonValue.AsHidType<GamepadInputId>();
- break;
- case "RightStickButton":
- viewModel.Config.RightStickButton = buttonValue.AsHidType<GamepadInputId>();
- break;
- case "RightJoystick":
- viewModel.Config.RightJoystick = buttonValue.AsHidType<StickInputId>();
- break;
- }
- }
- };
- _currentAssigner.GetInputAndAssign(assigner, keyboard);
- }
- else
- {
- if (_currentAssigner != null)
- {
- _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;
- var controllerInputViewModel = DataContext as ControllerInputViewModel;
- assigner = new GamepadButtonAssigner(
- controllerInputViewModel.ParentModel.SelectedGamepad,
- (controllerInputViewModel.ParentModel.Config as StandardControllerInputConfig).TriggerThreshold,
- forStick);
- return assigner;
- }
- protected override void OnDetachedFromVisualTree(VisualTreeAttachmentEventArgs e)
- {
- base.OnDetachedFromVisualTree(e);
- _currentAssigner?.Cancel();
- _currentAssigner = null;
- }
- }
- }
|