You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
107 lines
2.2 KiB
107 lines
2.2 KiB
using Model.Hotkeys; |
|
|
|
namespace Services.Immortal; |
|
|
|
public class KeyService : IKeyService |
|
{ |
|
private static readonly List<string> PressedKeys = new(); |
|
private string? _hotkey; |
|
private string _hotkeyGroup = "C"; |
|
private bool _isHoldingSpace; |
|
|
|
|
|
public void Subscribe(Action? action) |
|
{ |
|
OnChange += action; |
|
} |
|
|
|
public void Unsubscribe(Action? action) |
|
{ |
|
OnChange -= action; |
|
} |
|
|
|
public bool AddPressedKey(string key) |
|
{ |
|
_hotkey = null; |
|
|
|
if (PressedKeys.Count > 0) return false; |
|
var pressedKey = key.ToUpper(); |
|
|
|
if (pressedKey.Equals(" ") || pressedKey.Equals("SPACE")) |
|
{ |
|
if (!_isHoldingSpace) |
|
{ |
|
_isHoldingSpace = true; |
|
NotifyDataChanged(); |
|
} |
|
|
|
return false; |
|
} |
|
|
|
if (!PressedKeys.Contains(pressedKey)) |
|
{ |
|
if (HotkeyModel.KeyGroups.Contains(pressedKey)) _hotkeyGroup = pressedKey; |
|
|
|
if (HotkeyModel.HotKeys.Contains(pressedKey)) _hotkey = pressedKey; |
|
|
|
PressedKeys.Add(pressedKey); |
|
NotifyDataChanged(); |
|
return true; |
|
} |
|
|
|
return false; |
|
} |
|
|
|
public List<string> GetAllPressedKeys() |
|
{ |
|
return PressedKeys; |
|
} |
|
|
|
public bool RemovePressedKey(string key) |
|
{ |
|
_hotkey = null; |
|
|
|
var pressedKey = key.ToUpper(); |
|
if (pressedKey.Equals(" ") || pressedKey.Equals("SPACE")) |
|
{ |
|
if (_isHoldingSpace || true) |
|
{ |
|
_isHoldingSpace = false; |
|
NotifyDataChanged(); |
|
} |
|
|
|
return false; |
|
} |
|
|
|
if (PressedKeys.Contains(pressedKey)) |
|
{ |
|
PressedKeys.Remove(pressedKey); |
|
NotifyDataChanged(); |
|
return true; |
|
} |
|
|
|
return false; |
|
} |
|
|
|
public bool IsHoldingSpace() |
|
{ |
|
return _isHoldingSpace; |
|
} |
|
|
|
public string? GetHotkey() |
|
{ |
|
return _hotkey; |
|
} |
|
|
|
public string GetHotkeyGroup() |
|
{ |
|
return _hotkeyGroup; |
|
} |
|
|
|
private event Action? OnChange; |
|
|
|
private void NotifyDataChanged() |
|
{ |
|
OnChange?.Invoke(); |
|
} |
|
} |