From 9a6bacc73fc1193085dcb61dd4e2dc45fe97ce03 Mon Sep 17 00:00:00 2001 From: Nick Fisher Date: Wed, 21 May 2025 12:01:47 +0800 Subject: [PATCH] pass both logical key & physical key to input handler on keyboard keypress --- .../dart/js_wasm/web/web_input_handler.dart | 39 +++++++++++++----- .../src/input/src/delegate_input_handler.dart | 8 ++-- .../free_flight_camera_delegate_v2.dart | 13 +++--- .../lib/src/input/src/input_types.dart | 9 +++-- .../widgets/src/thermion_listener_widget.dart | 40 ++++++++++++------- 5 files changed, 70 insertions(+), 39 deletions(-) diff --git a/examples/dart/js_wasm/web/web_input_handler.dart b/examples/dart/js_wasm/web/web_input_handler.dart index a129fce8..9c79f76f 100644 --- a/examples/dart/js_wasm/web/web_input_handler.dart +++ b/examples/dart/js_wasm/web/web_input_handler.dart @@ -88,17 +88,19 @@ class WebInputHandler { } void _onKeyDown(web.KeyboardEvent event) { - PhysicalKey? key = _getPhysicalKeyFromEvent(event); - if (key != null) { - inputHandler.handle(KeyEvent(KeyEventType.down, key)); + PhysicalKey? physicalKey = _getPhysicalKeyFromEvent(event); + LogicalKey? logicalKey = _getLogicalKeyFromEvent(event); + if (physicalKey != null && logicalKey != null) { + inputHandler.handle(KeyEvent(KeyEventType.down, logicalKey, physicalKey)); } event.preventDefault(); } void _onKeyUp(web.KeyboardEvent event) { - PhysicalKey? key = _getPhysicalKeyFromEvent(event); - if (key != null) { - inputHandler.handle(KeyEvent(KeyEventType.up, key)); + LogicalKey? logicalKey = _getLogicalKeyFromEvent(event); + PhysicalKey? physicalKey = _getPhysicalKeyFromEvent(event); + if (physicalKey != null && logicalKey != null) { + inputHandler.handle(KeyEvent(KeyEventType.up, logicalKey, physicalKey)); } event.preventDefault(); } @@ -210,16 +212,31 @@ class WebInputHandler { return null; } - PhysicalKey? _getPhysicalKeyFromEvent(web.KeyboardEvent event) { + PhysicalKey? _getPhysicalKeyFromEvent(web.KeyboardEvent event) { switch (event.code) { case 'KeyW': - return PhysicalKey.W; + return PhysicalKey.w; case 'KeyA': - return PhysicalKey.A; + return PhysicalKey.a; case 'KeyS': - return PhysicalKey.S; + return PhysicalKey.s; case 'KeyD': - return PhysicalKey.D; + return PhysicalKey.d; + default: + return null; + } + } + + LogicalKey? _getLogicalKeyFromEvent(web.KeyboardEvent event) { + switch (event.key) { + case 'KeyW': + return LogicalKey.w; + case 'KeyA': + return LogicalKey.a; + case 'KeyS': + return LogicalKey.s; + case 'KeyD': + return LogicalKey.d; default: return null; } diff --git a/thermion_dart/lib/src/input/src/delegate_input_handler.dart b/thermion_dart/lib/src/input/src/delegate_input_handler.dart index 2047765e..a7f2fae7 100644 --- a/thermion_dart/lib/src/input/src/delegate_input_handler.dart +++ b/thermion_dart/lib/src/input/src/delegate_input_handler.dart @@ -64,16 +64,16 @@ class DelegateInputHandler implements InputHandler { _processing = true; final delegate = delegates.first; - final keyUp = {}; - final keyDown = {}; + final keyUp = {}; + final keyDown = {}; for (final event in _events) { if (event is KeyEvent) { switch (event.type) { case KeyEventType.up: - keyUp[event.key] = event; + keyUp[event.logicalKey] = event; case KeyEventType.down: - keyDown[event.key] = event; + keyDown[event.logicalKey] = event; } } } diff --git a/thermion_dart/lib/src/input/src/implementations/free_flight_camera_delegate_v2.dart b/thermion_dart/lib/src/input/src/implementations/free_flight_camera_delegate_v2.dart index 5e48ce62..00353388 100644 --- a/thermion_dart/lib/src/input/src/implementations/free_flight_camera_delegate_v2.dart +++ b/thermion_dart/lib/src/input/src/implementations/free_flight_camera_delegate_v2.dart @@ -69,32 +69,33 @@ class FreeFlightInputHandlerDelegateV2 implements InputHandlerDelegate { break; case ScaleEndEvent(numPointers: final numPointers): break; - case KeyEvent(type: final type, key: var key): - switch (key) { - case PhysicalKey.A: + case KeyEvent(type: final type, logicalKey: var logicalKey, physicalKey: var physicalKey ): + switch (physicalKey) { + case PhysicalKey.a: translation += Vector3( -sensitivity.keySensitivity, 0, 0, ); break; - case PhysicalKey.S: + case PhysicalKey.s: translation += Vector3(0, 0, sensitivity.keySensitivity); break; - case PhysicalKey.D: + case PhysicalKey.d: translation += Vector3( sensitivity.keySensitivity, 0, 0, ); break; - case PhysicalKey.W: + case PhysicalKey.w: translation += Vector3( 0, 0, -sensitivity.keySensitivity, ); break; + default: } break; } diff --git a/thermion_dart/lib/src/input/src/input_types.dart b/thermion_dart/lib/src/input/src/input_types.dart index 8f5b7a8a..97e2b380 100644 --- a/thermion_dart/lib/src/input/src/input_types.dart +++ b/thermion_dart/lib/src/input/src/input_types.dart @@ -80,13 +80,16 @@ class ScrollEvent extends InputEvent { class KeyEvent extends InputEvent { final KeyEventType type; - final PhysicalKey key; + final LogicalKey logicalKey; + final PhysicalKey physicalKey; - KeyEvent(this.type, this.key); + KeyEvent(this.type, this.logicalKey, this.physicalKey); } enum KeyEventType { down, up } -enum PhysicalKey { W, A, S, D } +enum LogicalKey { w, a, s, d, g, r, shift, esc, del } + +enum PhysicalKey { w, a, s, d, g, r, shift, esc, del } enum InputAction { TRANSLATE, ROTATE, PICK, ZOOM, NONE } diff --git a/thermion_flutter/thermion_flutter/lib/src/widgets/src/thermion_listener_widget.dart b/thermion_flutter/thermion_flutter/lib/src/widgets/src/thermion_listener_widget.dart index 93e8c8ff..3f499f9a 100644 --- a/thermion_flutter/thermion_flutter/lib/src/widgets/src/thermion_listener_widget.dart +++ b/thermion_flutter/thermion_flutter/lib/src/widgets/src/thermion_listener_widget.dart @@ -61,24 +61,40 @@ class _ThermionListenerWidgetState extends State { HardwareKeyboard.instance.addHandler(_handleKeyEvent); } - final _keyMap = { - PhysicalKeyboardKey.keyW: PhysicalKey.W, - PhysicalKeyboardKey.keyA: PhysicalKey.A, - PhysicalKeyboardKey.keyS: PhysicalKey.S, - PhysicalKeyboardKey.keyD: PhysicalKey.D, + final _physicalKeyMap = { + PhysicalKeyboardKey.keyW: PhysicalKey.w, + PhysicalKeyboardKey.keyA: PhysicalKey.a, + PhysicalKeyboardKey.keyS: PhysicalKey.s, + PhysicalKeyboardKey.keyD: PhysicalKey.d, + PhysicalKeyboardKey.escape: PhysicalKey.esc, + PhysicalKeyboardKey.delete: PhysicalKey.del, + PhysicalKeyboardKey.keyG: PhysicalKey.g, + PhysicalKeyboardKey.keyR: PhysicalKey.r, + }; + + final _logicalKeyMap = { + LogicalKeyboardKey.keyW: LogicalKey.w, + LogicalKeyboardKey.keyA: LogicalKey.a, + LogicalKeyboardKey.keyS: LogicalKey.s, + LogicalKeyboardKey.keyD: LogicalKey.d, + LogicalKeyboardKey.escape: LogicalKey.esc, + LogicalKeyboardKey.delete: LogicalKey.del, + LogicalKeyboardKey.keyG: LogicalKey.g, + LogicalKeyboardKey.keyR: LogicalKey.r, }; bool _handleKeyEvent(KeyEvent event) { - PhysicalKey? key = _keyMap[event.physicalKey]; + final physicalKey = _physicalKeyMap[event.physicalKey]; + final logicalKey = _logicalKeyMap[event.logicalKey]; - if (key == null) { + if (physicalKey == null || logicalKey == null) { return false; } if (event is KeyDownEvent || event is KeyRepeatEvent) { - widget.inputHandler.handle(t.KeyEvent(KeyEventType.down, key)); + widget.inputHandler.handle(t.KeyEvent(KeyEventType.down, logicalKey, physicalKey)); } else if (event is KeyUpEvent) { - widget.inputHandler.handle(t.KeyEvent(KeyEventType.up, key)); + widget.inputHandler.handle(t.KeyEvent(KeyEventType.up, logicalKey, physicalKey)); return true; } return false; @@ -189,12 +205,6 @@ class _MobileListenerWidgetState extends State<_MobileListenerWidget> { Widget build(BuildContext context) { return GestureDetector( behavior: HitTestBehavior.translucent, - // onPanDown: (event) { - // print("PAN DOWN"); - // }, - // onTapMove: (event) { - // print("TAP MOVE"); - // }, onTapDown: (details) { widget.inputHandler.handle(TouchEvent(TouchEventType.tap, details.localPosition.toVector2() * widget.pixelRatio, null));