.
This commit is contained in:
167
PresenterWpf/src/WPFInputHandler.cs
Normal file
167
PresenterWpf/src/WPFInputHandler.cs
Normal file
@@ -0,0 +1,167 @@
|
||||
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;
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user