zoomForScale static method

KLineZoomResult zoomForScale({
  1. required double startBeginIndex,
  2. required double startItemCount,
  3. required double scale,
  4. required double startFocalDx,
  5. required double currentFocalDx,
  6. required double viewportWidth,
  7. required int dataLength,
  8. required double minItemCount,
  9. required double maxItemCount,
  10. double trailingBlankItemCount = 0,
  11. double minTrailingVisibleItemCount = 3,
})

Implementation

static KLineZoomResult zoomForScale({
  required double startBeginIndex,
  required double startItemCount,
  required double scale,
  required double startFocalDx,
  required double currentFocalDx,
  required double viewportWidth,
  required int dataLength,
  required double minItemCount,
  required double maxItemCount,
  double trailingBlankItemCount = 0,
  double minTrailingVisibleItemCount = 3,
}) {
  if (dataLength <= 0 || startItemCount <= 0 || viewportWidth <= 0) {
    return const KLineZoomResult(beginIndex: 0.0, itemCount: 0.0);
  }

  final safeScale = scale > 0 ? scale : 1.0;
  final maxVisibleCount = min(maxItemCount, dataLength.toDouble());
  final minVisibleCount = min(minItemCount, maxVisibleCount);
  final nextItemCount = (startItemCount / safeScale)
      .clamp(minVisibleCount, maxVisibleCount)
      .toDouble();

  final startFocalRatio = (startFocalDx / viewportWidth).clamp(0.0, 1.0);
  final currentFocalRatio = (currentFocalDx / viewportWidth).clamp(0.0, 1.0);
  final focalDataIndex = startBeginIndex + startItemCount * startFocalRatio;
  final rawBeginIndex = focalDataIndex - nextItemCount * currentFocalRatio;
  final maxBeginIndex = maxBeginIndexFor(
    dataLength: dataLength,
    itemCount: nextItemCount,
    trailingBlankItemCount: trailingBlankItemCount,
    minTrailingVisibleItemCount: minTrailingVisibleItemCount,
  );

  return KLineZoomResult(
    beginIndex: rawBeginIndex.clamp(0.0, maxBeginIndex).toDouble(),
    itemCount: nextItemCount,
  );
}