mirror of
https://git.ryujinx.app/ryubing/ryujinx.git
synced 2025-07-25 23:37:11 +02:00
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:
parent
8884d1fd73
commit
446f2854a5
38 changed files with 3402 additions and 1275 deletions
|
@ -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);
|
||||
}
|
||||
|
|
|
@ -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();
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
33
src/Ryujinx.Input/Button.cs
Normal file
33
src/Ryujinx.Input/Button.cs
Normal 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);
|
||||
}
|
||||
}
|
||||
}
|
9
src/Ryujinx.Input/ButtonType.cs
Normal file
9
src/Ryujinx.Input/ButtonType.cs
Normal file
|
@ -0,0 +1,9 @@
|
|||
namespace Ryujinx.Input
|
||||
{
|
||||
public enum ButtonType
|
||||
{
|
||||
Key,
|
||||
GamepadButtonInputId,
|
||||
StickId,
|
||||
}
|
||||
}
|
|
@ -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);
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue