key method
Implementation
KeyEventResult key(FocusNode node, KeyEvent e) {
if (!options.keyboard || e is KeyUpEvent) return KeyEventResult.ignored;
final key = e.logicalKey;
final shift = HardwareKeyboard.instance.isShiftPressed;
if (key == LogicalKeyboardKey.escape && box.value != null) {
box.value = null;
_gesture = _Gesture.undecided;
return KeyEventResult.handled;
}
// As MapLibre's: from the nearest whole zoom, two levels with shift.
final zoomStep = shift ? 2 : 1;
final zoom = target.zoom;
final turn = shift ? _keyTurn(key) : null;
final tilt = shift ? _keyTilt(key) : null;
final MapGestureStep step;
if (key == LogicalKeyboardKey.equal ||
key == LogicalKeyboardKey.add ||
key == LogicalKeyboardKey.numpadAdd) {
step = MapGestureStep(
zoomBy: _clampZoom(zoom.roundToDouble() + zoomStep) - zoom,
);
} else if (key == LogicalKeyboardKey.minus ||
key == LogicalKeyboardKey.underscore ||
key == LogicalKeyboardKey.numpadSubtract) {
step = MapGestureStep(
zoomBy: _clampZoom(zoom.roundToDouble() - zoomStep) - zoom,
);
} else if (turn != null && options.rotate) {
step = MapGestureStep(turn: turn);
} else if (tilt != null && options.pitch) {
step = MapGestureStep(tilt: tilt);
} else {
final by = switch (key) {
LogicalKeyboardKey.arrowLeft => const Offset(-100, 0),
LogicalKeyboardKey.arrowRight => const Offset(100, 0),
LogicalKeyboardKey.arrowUp => const Offset(0, -100),
LogicalKeyboardKey.arrowDown => const Offset(0, 100),
_ => null,
};
if (by == null) return KeyEventResult.ignored;
final middle = target.size.center(Offset.zero);
step = MapGestureStep(from: middle + by, to: middle);
}
target.ease(step, const Duration(milliseconds: 200));
return KeyEventResult.handled;
}