onZoom method
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();
}