onZoom method

void onZoom(
  1. double scaleFactor,
  2. Offset focalPoint
)

Focal-point aware horizontal zoom (pinch zoom or mouse wheel).

Implementation

void onZoom(double scaleFactor, Offset focalPoint) {
  const minWidth = 2.0;
  const maxWidth = 50.0;
  final oldCandleWidth = _viewport.candleWidth;
  final newWidth = (oldCandleWidth * scaleFactor).clamp(minWidth, maxWidth);
  if (newWidth == oldCandleWidth) return;

  final oldTotal = _viewport.candleTotalWidth;
  final newTotal = newWidth + _viewport.candleSpacing;
  final ratio = newTotal / oldTotal;

  // Anchor calculation to keep candle under focalPoint.dx stationary
  final focalX = focalPoint.dx;
  final distFromRight =
      _viewport.viewportWidth -
      _viewport.rightMargin -
      focalX +
      _viewport.scrollOffset;
  final newScrollOffset =
      (_viewport.scrollOffset + distFromRight * (ratio - 1.0)).clamp(
        -120.0,
        math.max(0.0, candles.length * newTotal).toDouble(),
      );

  _viewport = _viewport.copyWith(
    candleWidth: newWidth,
    scrollOffset: newScrollOffset,
  );
  notifyListeners();
}