Files
doom-dm/PresenterWpf/src/WPFInputHandler.cs
2024-12-16 04:28:45 +03:00

167 lines
5.5 KiB
C#

using System.Windows;
using System.Windows.Input;
using Engine.Input;
namespace PresenterWpf;
public class WpfInputHandler : IInputHandler
{
private readonly Window _window;
private readonly bool[] _currentKeys = new bool[(int)KeyboardButtonCode.TotalCount];
private readonly bool[] _previousKeys = new bool[(int)KeyboardButtonCode.TotalCount];
private readonly bool[] _currentMouseButtons = new bool[(int)MouseButtonCode.TotalCount];
private readonly bool[] _previousMouseButtons = new bool[(int)MouseButtonCode.TotalCount];
public WpfInputHandler(Window parWindow)
{
_window = parWindow;
_window.PreviewKeyDown += Window_PreviewKeyDown;
_window.PreviewKeyUp += Window_PreviewKeyUp;
_window.PreviewMouseDown += Window_PreviewMouseDown;
_window.PreviewMouseUp += Window_PreviewMouseUp;
}
public void Update(double parDeltaTime)
{
for (var i = 0; i < _currentKeys.Length; i++)
{
_previousKeys[i] = _currentKeys[i];
}
for (var i = 0; i < _currentMouseButtons.Length; i++)
{
_previousMouseButtons[i] = _currentMouseButtons[i];
}
}
private void Window_PreviewKeyDown(object parSender, KeyEventArgs parEventArgs)
{
var keyCode = ConvertToKeyboardButtonCode(parEventArgs.Key);
if (keyCode >= 0 && keyCode < _currentKeys.Length)
{
_currentKeys[keyCode] = true;
}
}
private void Window_PreviewKeyUp(object parSender, KeyEventArgs parEventArgs)
{
var keyCode = ConvertToKeyboardButtonCode(parEventArgs.Key);
if (keyCode >= 0 && keyCode < _currentKeys.Length)
{
_currentKeys[keyCode] = false;
}
}
private void Window_PreviewMouseDown(object parSender, MouseButtonEventArgs parEventArgs)
{
var buttonCode = ConvertToMouseButtonCode(parEventArgs.ChangedButton);
if (buttonCode >= 0 && buttonCode < _currentMouseButtons.Length)
{
_currentMouseButtons[buttonCode] = true;
}
}
private void Window_PreviewMouseUp(object parSender, MouseButtonEventArgs parEventArgs)
{
var buttonCode = ConvertToMouseButtonCode(parEventArgs.ChangedButton);
if (buttonCode >= 0 && buttonCode < _currentMouseButtons.Length)
{
_currentMouseButtons[buttonCode] = false;
}
}
public bool IsKeyPressed(KeyboardButtonCode parKeyboardButtonCode)
{
var keyCode = (int)parKeyboardButtonCode;
return _currentKeys[keyCode];
}
public bool IsKeyJustPressed(KeyboardButtonCode parKeyboardButtonCode)
{
var keyCode = (int)parKeyboardButtonCode;
return _currentKeys[keyCode] && !_previousKeys[keyCode];
}
public bool IsMouseButtonPressed(MouseButtonCode parButtonCode)
{
var buttonCode = (int)parButtonCode;
return _currentMouseButtons[buttonCode];
}
public bool IsMouseButtonJustPressed(MouseButtonCode parButtonCode)
{
var buttonCode = (int)parButtonCode;
return _currentMouseButtons[buttonCode] && !_previousMouseButtons[buttonCode];
}
private static int ConvertToKeyboardButtonCode(Key parKey) => parKey switch
{
Key.A => (int)KeyboardButtonCode.A,
Key.B => (int)KeyboardButtonCode.B,
Key.C => (int)KeyboardButtonCode.C,
Key.D => (int)KeyboardButtonCode.D,
Key.E => (int)KeyboardButtonCode.E,
Key.F => (int)KeyboardButtonCode.F,
Key.G => (int)KeyboardButtonCode.G,
Key.H => (int)KeyboardButtonCode.H,
Key.I => (int)KeyboardButtonCode.I,
Key.J => (int)KeyboardButtonCode.J,
Key.K => (int)KeyboardButtonCode.K,
Key.L => (int)KeyboardButtonCode.L,
Key.M => (int)KeyboardButtonCode.M,
Key.N => (int)KeyboardButtonCode.N,
Key.O => (int)KeyboardButtonCode.O,
Key.P => (int)KeyboardButtonCode.P,
Key.Q => (int)KeyboardButtonCode.Q,
Key.R => (int)KeyboardButtonCode.R,
Key.S => (int)KeyboardButtonCode.S,
Key.T => (int)KeyboardButtonCode.T,
Key.U => (int)KeyboardButtonCode.U,
Key.V => (int)KeyboardButtonCode.V,
Key.W => (int)KeyboardButtonCode.W,
Key.X => (int)KeyboardButtonCode.X,
Key.Y => (int)KeyboardButtonCode.Y,
Key.Z => (int)KeyboardButtonCode.Z,
Key.LeftCtrl => (int)KeyboardButtonCode.Ctrl,
Key.LeftAlt => (int)KeyboardButtonCode.Alt,
Key.LeftShift => (int)KeyboardButtonCode.Shift,
Key.RightCtrl => (int)KeyboardButtonCode.Ctrl,
Key.RightAlt => (int)KeyboardButtonCode.Alt,
Key.RightShift => (int)KeyboardButtonCode.Shift,
Key.Space => (int)KeyboardButtonCode.Space,
Key.Tab => (int)KeyboardButtonCode.Tab,
Key.Back => (int)KeyboardButtonCode.Backspace,
Key.Return => (int)KeyboardButtonCode.Enter,
Key.Escape => (int)KeyboardButtonCode.Escape,
Key.PageUp => (int)KeyboardButtonCode.PageUp,
Key.PageDown => (int)KeyboardButtonCode.PageDown,
Key.Up => (int)KeyboardButtonCode.Up,
Key.Down => (int)KeyboardButtonCode.Down,
Key.Left => (int)KeyboardButtonCode.Left,
Key.Right => (int)KeyboardButtonCode.Right,
Key.Delete => (int)KeyboardButtonCode.Delete,
Key.Insert => (int)KeyboardButtonCode.Insert,
Key.Home => (int)KeyboardButtonCode.Home,
Key.End => (int)KeyboardButtonCode.End,
_ => -1
};
private static int ConvertToMouseButtonCode(MouseButton parButton) =>
parButton switch
{
MouseButton.Left => (int)MouseButtonCode.Left,
MouseButton.Right => (int)MouseButtonCode.Right,
MouseButton.Middle => (int)MouseButtonCode.Middle,
_ => -1
};
~WpfInputHandler()
{
_window.PreviewKeyDown -= Window_PreviewKeyDown;
_window.PreviewKeyUp -= Window_PreviewKeyUp;
_window.PreviewMouseDown -= Window_PreviewMouseDown;
_window.PreviewMouseUp -= Window_PreviewMouseUp;
}
}