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