Ava UI: Input Menu Refactor (#5826)

* Refactor

* Apply suggestions from code review

Co-authored-by: Ac_K <Acoustik666@gmail.com>

* Update src/Ryujinx/UI/Views/Settings/SettingsHotkeysView.axaml.cs

Co-authored-by: Ac_K <Acoustik666@gmail.com>

* Update src/Ryujinx.Input/ButtonValueType.cs

Co-authored-by: Ac_K <Acoustik666@gmail.com>

* Add empty line

* Requested renames

* Update src/Ryujinx/UI/Views/Settings/SettingsHotkeysView.axaml.cs

Co-authored-by: gdkchan <gab.dark.100@gmail.com>

* Make parent models private readonly

* Fix ControllerInputView

* Make line shorter

* Mac keys in locale

* Double line break

* Fix build

* Get rid of _isValid

* Fix potential race condition

* Rename HasAnyButtonPressed to IsAnyButtonPressed

* Use switches

* Simplify enumeration

---------

Co-authored-by: Ac_K <Acoustik666@gmail.com>
Co-authored-by: gdkchan <gab.dark.100@gmail.com>
Co-authored-by: TSR Berry <20988865+TSRBerry@users.noreply.github.com>
This commit is contained in:
Isaac Marovitz 2024-04-17 22:52:12 +01:00 committed by GitHub
parent 8884d1fd73
commit 446f2854a5
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
38 changed files with 3402 additions and 1275 deletions

View file

@ -49,9 +49,9 @@ namespace Ryujinx.Input.Assigner
CollectButtonStats();
}
public bool HasAnyButtonPressed()
public bool IsAnyButtonPressed()
{
return _detector.HasAnyButtonPressed();
return _detector.IsAnyButtonPressed();
}
public bool ShouldCancel()
@ -59,16 +59,11 @@ namespace Ryujinx.Input.Assigner
return _gamepad == null || !_gamepad.IsConnected;
}
public string GetPressedButton()
public Button? GetPressedButton()
{
IEnumerable<GamepadButtonInputId> pressedButtons = _detector.GetPressedButtons();
if (pressedButtons.Any())
{
return !_forStick ? pressedButtons.First().ToString() : ((StickInputId)pressedButtons.First()).ToString();
}
return "";
return !_forStick ? new(pressedButtons.FirstOrDefault()) : new((StickInputId)pressedButtons.FirstOrDefault());
}
private void CollectButtonStats()
@ -123,7 +118,7 @@ namespace Ryujinx.Input.Assigner
_stats = new Dictionary<GamepadButtonInputId, InputSummary>();
}
public bool HasAnyButtonPressed()
public bool IsAnyButtonPressed()
{
return _stats.Values.Any(CheckButtonPressed);
}

View file

@ -19,7 +19,7 @@ namespace Ryujinx.Input.Assigner
/// Check if a button was pressed.
/// </summary>
/// <returns>True if a button was pressed</returns>
bool HasAnyButtonPressed();
bool IsAnyButtonPressed();
/// <summary>
/// Indicate if the user of this API should cancel operations. This is triggered for example when a gamepad get disconnected or when a user cancel assignation operations.
@ -31,6 +31,6 @@ namespace Ryujinx.Input.Assigner
/// Get the pressed button that was read in <see cref="ReadInput"/> by the button assigner.
/// </summary>
/// <returns>The pressed button that was read</returns>
string GetPressedButton();
Button? GetPressedButton();
}
}

View file

@ -21,9 +21,9 @@ namespace Ryujinx.Input.Assigner
_keyboardState = _keyboard.GetKeyboardStateSnapshot();
}
public bool HasAnyButtonPressed()
public bool IsAnyButtonPressed()
{
return GetPressedButton().Length != 0;
return GetPressedButton() is not null;
}
public bool ShouldCancel()
@ -31,20 +31,20 @@ namespace Ryujinx.Input.Assigner
return _keyboardState.IsPressed(Key.Escape);
}
public string GetPressedButton()
public Button? GetPressedButton()
{
string keyPressed = "";
Button? keyPressed = null;
for (Key key = Key.Unknown; key < Key.Count; key++)
{
if (_keyboardState.IsPressed(key))
{
keyPressed = key.ToString();
keyPressed = new(key);
break;
}
}
return !ShouldCancel() ? keyPressed : "";
return !ShouldCancel() ? keyPressed : null;
}
}
}

View file

@ -0,0 +1,33 @@
using System;
namespace Ryujinx.Input
{
public readonly struct Button
{
public readonly ButtonType Type;
private readonly uint _rawValue;
public Button(Key key)
{
Type = ButtonType.Key;
_rawValue = (uint)key;
}
public Button(GamepadButtonInputId gamepad)
{
Type = ButtonType.GamepadButtonInputId;
_rawValue = (uint)gamepad;
}
public Button(StickInputId stick)
{
Type = ButtonType.StickId;
_rawValue = (uint)stick;
}
public T AsHidType<T>() where T : Enum
{
return (T)Enum.ToObject(typeof(T), _rawValue);
}
}
}

View file

@ -0,0 +1,9 @@
namespace Ryujinx.Input
{
public enum ButtonType
{
Key,
GamepadButtonInputId,
StickId,
}
}

View file

@ -203,8 +203,6 @@ namespace Ryujinx.Input.HLE
new(Key.NumLock, 10),
};
private bool _isValid;
private MotionInput _leftMotionInput;
private MotionInput _rightMotionInput;
@ -222,7 +220,6 @@ namespace Ryujinx.Input.HLE
{
State = default;
Id = null;
_isValid = false;
_cemuHookClient = cemuHookClient;
}
@ -234,11 +231,10 @@ namespace Ryujinx.Input.HLE
Id = config.Id;
_gamepad = GamepadDriver.GetGamepad(Id);
_isValid = _gamepad != null;
UpdateUserConfiguration(config);
return _isValid;
return _gamepad != null;
}
public void UpdateUserConfiguration(InputConfig config)
@ -262,10 +258,7 @@ namespace Ryujinx.Input.HLE
_config = config;
if (_isValid)
{
_gamepad.SetConfiguration(config);
}
_gamepad?.SetConfiguration(config);
}
private void UpdateMotionInput(MotionConfigController motionConfig)
@ -282,18 +275,21 @@ namespace Ryujinx.Input.HLE
public void Update()
{
if (_isValid && GamepadDriver != null)
// _gamepad may be altered by other threads
var gamepad = _gamepad;
if (gamepad != null && GamepadDriver != null)
{
State = _gamepad.GetMappedStateSnapshot();
State = gamepad.GetMappedStateSnapshot();
if (_config is StandardControllerInputConfig controllerConfig && controllerConfig.Motion.EnableMotion)
{
if (controllerConfig.Motion.MotionBackend == MotionInputBackendType.GamepadDriver)
{
if (_gamepad.Features.HasFlag(GamepadFeaturesFlag.Motion))
if (gamepad.Features.HasFlag(GamepadFeaturesFlag.Motion))
{
Vector3 accelerometer = _gamepad.GetMotionData(MotionInputId.Accelerometer);
Vector3 gyroscope = _gamepad.GetMotionData(MotionInputId.Gyroscope);
Vector3 accelerometer = gamepad.GetMotionData(MotionInputId.Accelerometer);
Vector3 gyroscope = gamepad.GetMotionData(MotionInputId.Gyroscope);
accelerometer = new Vector3(accelerometer.X, -accelerometer.Z, accelerometer.Y);
gyroscope = new Vector3(gyroscope.X, -gyroscope.Z, gyroscope.Y);