reorder code in StickyAdapters

move fields and property to the top, button code before the equivalent axis code, general cleanup
This commit is contained in:
Morilli 2024-09-22 23:04:38 +02:00
parent 525a95ea0a
commit 84f774aa9c
1 changed files with 67 additions and 81 deletions

View File

@ -12,91 +12,83 @@ namespace BizHawk.Client.Common
public class StickyXorAdapter : IStickyAdapter public class StickyXorAdapter : IStickyAdapter
{ {
private readonly HashSet<string> _buttonHolds = [ ];
// if SetAxis() is called (typically virtual pads), then that axis will entirely override the Source input
// otherwise, the source is passed thru.
private readonly Dictionary<string, int> _axisHolds = [ ];
public IController Source { get; set; }
public ControllerDefinition Definition => Source.Definition; public ControllerDefinition Definition => Source.Definition;
public IReadOnlyCollection<string> CurrentStickies => _buttonHolds; // the callsite doesn't care about sticky axes
public bool IsPressed(string button) public bool IsPressed(string button)
{ {
var source = Source.IsPressed(button); var source = Source.IsPressed(button);
source ^= CurrentStickies.Contains(button); source ^= _buttonHolds.Contains(button);
return source; return source;
} }
public int AxisValue(string name) public int AxisValue(string name)
{ {
if (_axisSet.TryGetValue(name, out var i)) return i; return _axisHolds.TryGetValue(name, out int axisValue) ? axisValue : Source.AxisValue(name);
if (Source == null)
{
return 0;
}
return Source.AxisValue(name);
} }
public IReadOnlyCollection<(string Name, int Strength)> GetHapticsSnapshot() => Source.GetHapticsSnapshot(); public IReadOnlyCollection<(string Name, int Strength)> GetHapticsSnapshot() => Source.GetHapticsSnapshot();
public void SetHapticChannelStrength(string name, int strength) => Source.SetHapticChannelStrength(name, strength); public void SetHapticChannelStrength(string name, int strength) => Source.SetHapticChannelStrength(name, strength);
public IController Source { get; set; } public void SetSticky(string button, bool isSticky)
{
private List<string> _justPressed = new List<string>(); if (isSticky)
{
// if SetAxis() is called (typically virtual pads), then that axis will entirely override the Source input _buttonHolds.Add(button);
// otherwise, the source is passed thru. }
private readonly Dictionary<string, int> _axisSet = new(); else
{
_buttonHolds.Remove(button);
}
}
public void SetAxis(string name, int? value) public void SetAxis(string name, int? value)
{ {
if (value is int i) if (value is int i)
{ {
_axisSet[name] = i; _axisHolds[name] = i;
} }
else else
{ {
_axisSet.Remove(name); _axisHolds.Remove(name);
}
}
public void ClearStickyAxes() => _axisSet.Clear();
public void SetSticky(string button, bool isSticky)
{
if (isSticky)
{
CurrentStickies.Add(button);
}
else
{
CurrentStickies.Remove(button);
} }
} }
public void Unset(string button) public void Unset(string button)
{ {
CurrentStickies.Remove(button); _buttonHolds.Remove(button);
_axisSet.Remove(button); _axisHolds.Remove(button);
} }
public bool IsSticky(string button) => CurrentStickies.Contains(button); public bool IsSticky(string button) => _buttonHolds.Contains(button);
public HashSet<string> CurrentStickies { get; } = new HashSet<string>();
public void ClearStickies() public void ClearStickies()
{ {
CurrentStickies.Clear(); _buttonHolds.Clear();
_axisSet.Clear(); _axisHolds.Clear();
} }
private List<string> _justPressed = [ ];
public void MassToggleStickyState(List<string> buttons) public void MassToggleStickyState(List<string> buttons)
{ {
foreach (var button in buttons.Where(button => !_justPressed.Contains(button))) foreach (var button in buttons.Where(button => !_justPressed.Contains(button)))
{ {
if (CurrentStickies.Contains(button)) if (_buttonHolds.Contains(button))
{ {
CurrentStickies.Remove(button); _buttonHolds.Remove(button);
} }
else else
{ {
CurrentStickies.Add(button); _buttonHolds.Add(button);
} }
} }
@ -106,15 +98,31 @@ namespace BizHawk.Client.Common
public class AutoFireStickyXorAdapter : IStickyAdapter, IInputAdapter public class AutoFireStickyXorAdapter : IStickyAdapter, IInputAdapter
{ {
// TODO: Change the AutoHold adapter to be one of these, with an 'Off' value of 0?
// Probably would have slightly lower performance, but it seems weird to have such a similar class that is only used once.
private int _onFrames;
private int _offFrames;
private readonly Dictionary<string, AutoPatternBool> _boolPatterns = [ ];
private readonly Dictionary<string, AutoPatternAxis> _axisPatterns = [ ];
public IController Source { get; set; }
public ControllerDefinition Definition => Source.Definition; public ControllerDefinition Definition => Source.Definition;
public IReadOnlyCollection<string> CurrentStickies => _boolPatterns.Keys; // the callsite doesn't care about sticky axes
public AutoFireStickyXorAdapter()
{
_onFrames = 1;
_offFrames = 1;
}
public bool IsPressed(string button) public bool IsPressed(string button)
{ {
var source = Source.IsPressed(button); var source = Source.IsPressed(button);
bool patternValue = false; bool patternValue = false;
if (_boolPatterns.TryGetValue(button, out var pattern)) if (_boolPatterns.TryGetValue(button, out var pattern))
{ {
// I can't figure a way to determine right here if it should Peek or Get.
patternValue = pattern.PeekNextValue(); patternValue = pattern.PeekNextValue();
} }
@ -126,53 +134,23 @@ namespace BizHawk.Client.Common
public int AxisValue(string name) public int AxisValue(string name)
=> _axisPatterns.TryGetValue(name, out var pattern) => _axisPatterns.TryGetValue(name, out var pattern)
? pattern.PeekNextValue() ? pattern.PeekNextValue()
: Source?.AxisValue(name) ?? 0; : Source.AxisValue(name);
public IReadOnlyCollection<(string Name, int Strength)> GetHapticsSnapshot() => Source.GetHapticsSnapshot(); public IReadOnlyCollection<(string Name, int Strength)> GetHapticsSnapshot() => Source.GetHapticsSnapshot();
public void SetHapticChannelStrength(string name, int strength) => Source.SetHapticChannelStrength(name, strength); public void SetHapticChannelStrength(string name, int strength) => Source.SetHapticChannelStrength(name, strength);
// TODO: Change the AutoHold adapter to be one of these, with an 'Off' value of 0? public void SetOnOffPatternFromConfig(int onFrames, int offFrames)
// Probably would have slightly lower performance, but it seems weird to have such a similar class that is only used once.
private int _on;
private int _off;
public void SetOnOffPatternFromConfig(int on, int off)
{ {
_on = on < 0 ? 0 : on; _onFrames = Math.Max(onFrames, 1);
_off = off < 0 ? 0 : off; _offFrames = Math.Max(offFrames, 1);
}
private readonly Dictionary<string, AutoPatternAxis> _axisPatterns = new();
private readonly Dictionary<string, AutoPatternBool> _boolPatterns = new();
public AutoFireStickyXorAdapter()
{
_on = 1;
_off = 1;
}
public IController Source { get; set; }
public void SetAxis(string name, int? value, AutoPatternAxis pattern = null)
{
if (value.HasValue)
{
pattern ??= new AutoPatternAxis(value.Value, _on, 0, _off);
_axisPatterns[name] = pattern;
}
else
{
_axisPatterns.Remove(name);
}
} }
public void SetSticky(string button, bool isSticky, AutoPatternBool pattern = null) public void SetSticky(string button, bool isSticky, AutoPatternBool pattern = null)
{ {
if (isSticky) if (isSticky)
{ {
pattern ??= new AutoPatternBool(_on, _off); pattern ??= new AutoPatternBool(_onFrames, _offFrames);
_boolPatterns[button] = pattern; _boolPatterns[button] = pattern;
} }
else else
@ -181,12 +159,20 @@ namespace BizHawk.Client.Common
} }
} }
public bool IsSticky(string button) public void SetAxis(string name, int? value, AutoPatternAxis pattern = null)
{ {
return _boolPatterns.ContainsKey(button) || _axisPatterns.ContainsKey(button); if (value.HasValue)
{
pattern ??= new AutoPatternAxis(value.Value, _onFrames, 0, _offFrames);
_axisPatterns[name] = pattern;
}
else
{
_axisPatterns.Remove(name);
}
} }
public HashSet<string> CurrentStickies => new HashSet<string>(_boolPatterns.Keys); public bool IsSticky(string button) => _boolPatterns.ContainsKey(button) || _axisPatterns.ContainsKey(button);
public void ClearStickies() public void ClearStickies()
{ {
@ -200,7 +186,7 @@ namespace BizHawk.Client.Common
foreach (var v in _axisPatterns.Values) v.GetNextValue(lagged); foreach (var v in _axisPatterns.Values) v.GetNextValue(lagged);
} }
private List<string> _justPressed = new List<string>(); private List<string> _justPressed = [ ];
public void MassToggleStickyState(List<string> buttons) public void MassToggleStickyState(List<string> buttons)
{ {