| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180 |
- using Avalonia.Controls;
- using Avalonia.Controls.Primitives;
- using Avalonia.Input;
- using Avalonia.Interactivity;
- using Avalonia.LogicalTree;
- using Ryujinx.Ava.Common.Locale;
- using Ryujinx.Ava.Ui.Controls;
- using Ryujinx.Ava.Ui.Models;
- using Ryujinx.Ava.Ui.ViewModels;
- using Ryujinx.Common.Configuration.Hid.Controller;
- using Ryujinx.Input;
- using Ryujinx.Input.Assigner;
- using System;
- namespace Ryujinx.Ava.Ui.Windows
- {
- public partial class ControllerSettingsWindow : UserControl
- {
- private bool _dialogOpen;
- private ButtonKeyAssigner _currentAssigner;
- internal ControllerSettingsViewModel ViewModel { get; set; }
- public ControllerSettingsWindow()
- {
- DataContext = ViewModel = new ControllerSettingsViewModel(this);
- InitializeComponent();
- foreach (ILogical visual in SettingButtons.GetLogicalDescendants())
- {
- if (visual is ToggleButton button && !(visual is CheckBox))
- {
- button.Checked += Button_Checked;
- button.Unchecked += Button_Unchecked;
- }
- }
- }
- protected override void OnPointerReleased(PointerReleasedEventArgs e)
- {
- base.OnPointerReleased(e);
- if (_currentAssigner != null && _currentAssigner.ToggledButton != null && !_currentAssigner.ToggledButton.IsPointerOver)
- {
- _currentAssigner.Cancel();
- }
- }
- private void Button_Checked(object sender, RoutedEventArgs e)
- {
- if (sender is ToggleButton button)
- {
- 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);
- FocusManager.Instance.Focus(this, NavigationMethod.Pointer);
- PointerPressed += MouseClick;
- IKeyboard keyboard = (IKeyboard)ViewModel.AvaloniaKeyboardDriver.GetGamepad("0"); // Open Avalonia keyboard for cancel operations.
- IButtonAssigner assigner = CreateButtonAssigner(isStick);
- _currentAssigner.ButtonAssigned += (sender, e) =>
- {
- if (e.IsAssigned)
- {
- ViewModel.IsModified = true;
- }
- };
- _currentAssigner.GetInputAndAssign(assigner, keyboard);
- }
- else
- {
- if (_currentAssigner != null)
- {
- ToggleButton oldButton = _currentAssigner.ToggledButton;
- _currentAssigner.Cancel();
- _currentAssigner = null;
- button.IsChecked = false;
- }
- }
- }
- }
- public void SaveCurrentProfile()
- {
- ViewModel.Save();
- }
- private IButtonAssigner CreateButtonAssigner(bool forStick)
- {
- IButtonAssigner assigner;
- var device = ViewModel.Devices[ViewModel.Device];
- if (device.Type == DeviceType.Keyboard)
- {
- assigner = new KeyboardKeyAssigner((IKeyboard)ViewModel.SelectedGamepad);
- }
- else if (device.Type == DeviceType.Controller)
- {
- assigner = new GamepadButtonAssigner(ViewModel.SelectedGamepad, (ViewModel.Config as StandardControllerInputConfig).TriggerThreshold, forStick);
- }
- else
- {
- throw new Exception("Controller not supported");
- }
- return assigner;
- }
- private void Button_Unchecked(object sender, RoutedEventArgs e)
- {
- _currentAssigner?.Cancel();
- _currentAssigner = null;
- }
- private void MouseClick(object sender, PointerPressedEventArgs e)
- {
- bool shouldUnbind = false;
- if (e.GetCurrentPoint(this).Properties.IsMiddleButtonPressed)
- {
- shouldUnbind = true;
- }
- _currentAssigner?.Cancel(shouldUnbind);
- PointerPressed -= MouseClick;
- }
- private async void PlayerIndexBox_OnSelectionChanged(object sender, SelectionChangedEventArgs e)
- {
- if (ViewModel.IsModified && !_dialogOpen)
- {
- _dialogOpen = true;
- var result = await ContentDialogHelper.CreateConfirmationDialog(
- LocaleManager.Instance["DialogControllerSettingsModifiedConfirmMessage"],
- LocaleManager.Instance["DialogControllerSettingsModifiedConfirmSubMessage"],
- LocaleManager.Instance["InputDialogYes"],
- LocaleManager.Instance["InputDialogNo"],
- LocaleManager.Instance["RyujinxConfirm"]);
- if (result == UserResult.Yes)
- {
- ViewModel.Save();
- }
- _dialogOpen = false;
- ViewModel.IsModified = false;
- if (e.AddedItems.Count > 0)
- {
- var player = (PlayerModel)e.AddedItems[0];
- ViewModel.PlayerId = player.Id;
- }
- }
- }
- public void Dispose()
- {
- _currentAssigner?.Cancel();
- _currentAssigner = null;
- ViewModel.Dispose();
- }
- }
- }
|