drawTouchedSpotsIndicator method

  1. @visibleForTesting
void drawTouchedSpotsIndicator(
  1. CanvasWrapper canvasWrapper,
  2. List<LineIndexDrawingInfo> lineIndexDrawingInfo,
  3. PaintHolder<LineChartData> holder
)

Implementation

@visibleForTesting
void drawTouchedSpotsIndicator(
  CanvasWrapper canvasWrapper,
  List<LineIndexDrawingInfo> lineIndexDrawingInfo,
  PaintHolder<LineChartData> holder,
) {
  if (lineIndexDrawingInfo.isEmpty) {
    return;
  }
  final viewSize = canvasWrapper.size;

  lineIndexDrawingInfo.sort((a, b) => b.spot.y.compareTo(a.spot.y));

  for (final info in lineIndexDrawingInfo) {
    final barData = info.line;
    final barXDelta = getBarLineXLength(barData, viewSize, holder);

    final data = holder.data;

    final index = info.spotIndex;
    final spot = info.spot;
    final indicatorData = info.indicatorData;

    final touchedSpot = Offset(
      getPixelX(spot.x, viewSize, holder),
      getPixelY(spot.y, viewSize, holder),
    );

    /// For drawing the dot
    final showingDots = indicatorData.touchedSpotDotData.show;
    var dotHeight = 0.0;
    late FlDotPainter dotPainter;

    if (showingDots) {
      final xPercentInLine = (touchedSpot.dx / barXDelta) * 100;
      dotPainter = indicatorData.touchedSpotDotData
          .getDotPainter(spot, xPercentInLine, barData, index);
      dotHeight = dotPainter.getSize(spot).height;
    }

    /// For drawing the indicator line
    final lineStartY = min(
      data.maxY,
      max(data.minY, data.lineTouchData.getTouchLineStart(barData, index)),
    );
    final lineEndY = min(
      data.maxY,
      max(data.minY, data.lineTouchData.getTouchLineEnd(barData, index)),
    );
    final lineStart =
        Offset(touchedSpot.dx, getPixelY(lineStartY, viewSize, holder));
    var lineEnd =
        Offset(touchedSpot.dx, getPixelY(lineEndY, viewSize, holder));

    /// If line end is inside the dot, adjust it so that it doesn't overlap with the dot.
    final dotMinY = touchedSpot.dy - dotHeight / 2;
    final dotMaxY = touchedSpot.dy + dotHeight / 2;
    if (lineEnd.dy > dotMinY && lineEnd.dy < dotMaxY) {
      if (lineStart.dy < lineEnd.dy) {
        lineEnd -= Offset(0, lineEnd.dy - dotMinY);
      } else {
        lineEnd += Offset(0, dotMaxY - lineEnd.dy);
      }
    }

    _touchLinePaint
      ..color = indicatorData.indicatorBelowLine.color
      ..strokeWidth = indicatorData.indicatorBelowLine.strokeWidth
      ..transparentIfWidthIsZero();

    canvasWrapper.drawDashedLine(
      lineStart,
      lineEnd,
      _touchLinePaint,
      indicatorData.indicatorBelowLine.dashArray,
    );

    /// Draw the indicator dot
    if (showingDots) {
      canvasWrapper.drawDot(dotPainter, spot, touchedSpot);
    }
  }
}