pass both logical key & physical key to input handler on keyboard keypress

This commit is contained in:
Nick Fisher
2025-05-21 12:01:47 +08:00
parent e432b0be1d
commit 9a6bacc73f
5 changed files with 70 additions and 39 deletions

View File

@@ -88,17 +88,19 @@ class WebInputHandler {
} }
void _onKeyDown(web.KeyboardEvent event) { void _onKeyDown(web.KeyboardEvent event) {
PhysicalKey? key = _getPhysicalKeyFromEvent(event); PhysicalKey? physicalKey = _getPhysicalKeyFromEvent(event);
if (key != null) { LogicalKey? logicalKey = _getLogicalKeyFromEvent(event);
inputHandler.handle(KeyEvent(KeyEventType.down, key)); if (physicalKey != null && logicalKey != null) {
inputHandler.handle(KeyEvent(KeyEventType.down, logicalKey, physicalKey));
} }
event.preventDefault(); event.preventDefault();
} }
void _onKeyUp(web.KeyboardEvent event) { void _onKeyUp(web.KeyboardEvent event) {
PhysicalKey? key = _getPhysicalKeyFromEvent(event); LogicalKey? logicalKey = _getLogicalKeyFromEvent(event);
if (key != null) { PhysicalKey? physicalKey = _getPhysicalKeyFromEvent(event);
inputHandler.handle(KeyEvent(KeyEventType.up, key)); if (physicalKey != null && logicalKey != null) {
inputHandler.handle(KeyEvent(KeyEventType.up, logicalKey, physicalKey));
} }
event.preventDefault(); event.preventDefault();
} }
@@ -210,16 +212,31 @@ class WebInputHandler {
return null; return null;
} }
PhysicalKey? _getPhysicalKeyFromEvent(web.KeyboardEvent event) { PhysicalKey? _getPhysicalKeyFromEvent(web.KeyboardEvent event) {
switch (event.code) { switch (event.code) {
case 'KeyW': case 'KeyW':
return PhysicalKey.W; return PhysicalKey.w;
case 'KeyA': case 'KeyA':
return PhysicalKey.A; return PhysicalKey.a;
case 'KeyS': case 'KeyS':
return PhysicalKey.S; return PhysicalKey.s;
case 'KeyD': 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: default:
return null; return null;
} }

View File

@@ -64,16 +64,16 @@ class DelegateInputHandler implements InputHandler {
_processing = true; _processing = true;
final delegate = delegates.first; final delegate = delegates.first;
final keyUp = <PhysicalKey, KeyEvent>{}; final keyUp = <LogicalKey, KeyEvent>{};
final keyDown = <PhysicalKey, KeyEvent>{}; final keyDown = <LogicalKey, KeyEvent>{};
for (final event in _events) { for (final event in _events) {
if (event is KeyEvent) { if (event is KeyEvent) {
switch (event.type) { switch (event.type) {
case KeyEventType.up: case KeyEventType.up:
keyUp[event.key] = event; keyUp[event.logicalKey] = event;
case KeyEventType.down: case KeyEventType.down:
keyDown[event.key] = event; keyDown[event.logicalKey] = event;
} }
} }
} }

View File

@@ -69,32 +69,33 @@ class FreeFlightInputHandlerDelegateV2 implements InputHandlerDelegate {
break; break;
case ScaleEndEvent(numPointers: final numPointers): case ScaleEndEvent(numPointers: final numPointers):
break; break;
case KeyEvent(type: final type, key: var key): case KeyEvent(type: final type, logicalKey: var logicalKey, physicalKey: var physicalKey ):
switch (key) { switch (physicalKey) {
case PhysicalKey.A: case PhysicalKey.a:
translation += Vector3( translation += Vector3(
-sensitivity.keySensitivity, -sensitivity.keySensitivity,
0, 0,
0, 0,
); );
break; break;
case PhysicalKey.S: case PhysicalKey.s:
translation += Vector3(0, 0, sensitivity.keySensitivity); translation += Vector3(0, 0, sensitivity.keySensitivity);
break; break;
case PhysicalKey.D: case PhysicalKey.d:
translation += Vector3( translation += Vector3(
sensitivity.keySensitivity, sensitivity.keySensitivity,
0, 0,
0, 0,
); );
break; break;
case PhysicalKey.W: case PhysicalKey.w:
translation += Vector3( translation += Vector3(
0, 0,
0, 0,
-sensitivity.keySensitivity, -sensitivity.keySensitivity,
); );
break; break;
default:
} }
break; break;
} }

View File

@@ -80,13 +80,16 @@ class ScrollEvent extends InputEvent {
class KeyEvent extends InputEvent { class KeyEvent extends InputEvent {
final KeyEventType type; 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 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 } enum InputAction { TRANSLATE, ROTATE, PICK, ZOOM, NONE }

View File

@@ -61,24 +61,40 @@ class _ThermionListenerWidgetState extends State<ThermionListenerWidget> {
HardwareKeyboard.instance.addHandler(_handleKeyEvent); HardwareKeyboard.instance.addHandler(_handleKeyEvent);
} }
final _keyMap = { final _physicalKeyMap = {
PhysicalKeyboardKey.keyW: PhysicalKey.W, PhysicalKeyboardKey.keyW: PhysicalKey.w,
PhysicalKeyboardKey.keyA: PhysicalKey.A, PhysicalKeyboardKey.keyA: PhysicalKey.a,
PhysicalKeyboardKey.keyS: PhysicalKey.S, PhysicalKeyboardKey.keyS: PhysicalKey.s,
PhysicalKeyboardKey.keyD: PhysicalKey.D, 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) { 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; return false;
} }
if (event is KeyDownEvent || event is KeyRepeatEvent) { 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) { } 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 true;
} }
return false; return false;
@@ -189,12 +205,6 @@ class _MobileListenerWidgetState extends State<_MobileListenerWidget> {
Widget build(BuildContext context) { Widget build(BuildContext context) {
return GestureDetector( return GestureDetector(
behavior: HitTestBehavior.translucent, behavior: HitTestBehavior.translucent,
// onPanDown: (event) {
// print("PAN DOWN");
// },
// onTapMove: (event) {
// print("TAP MOVE");
// },
onTapDown: (details) { onTapDown: (details) {
widget.inputHandler.handle(TouchEvent(TouchEventType.tap, widget.inputHandler.handle(TouchEvent(TouchEventType.tap,
details.localPosition.toVector2() * widget.pixelRatio, null)); details.localPosition.toVector2() * widget.pixelRatio, null));