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; } }