draw method

  1. @override
void draw(
  1. Canvas canvas,
  2. Size size,
  3. ChartContext context
)
override

Implementation

@override
void draw(Canvas canvas, Size size, ChartContext context) {
  final series = context.config.series.isNotEmpty
      ? context.config.series.first
      : null;
  if (series == null || series.points.isEmpty) return;

  final segments = _buildSegments(series.points);
  if (segments.isEmpty) return;

  final anim = context.animationValue;
  final color = series.style.color ?? context.theme.seriesColor(0);
  final negColor = context.theme.seriesColor(1);
  final art = SeriesPaint(context.config.style);

  final categoryCount = segments.length;
  final slotWidth = context.bounds.width / categoryCount;

  for (var i = 0; i < segments.length; i++) {
    final seg = segments[i];
    final startY =
        context.viewport.minY + (seg.start - context.viewport.minY) * anim;
    final endY =
        context.viewport.minY + (seg.end - context.viewport.minY) * anim;

    final left = context.bounds.left + i * slotWidth + slotWidth * 0.2;
    final right = left + slotWidth * barWidthFactor;
    final y1 = context.transformer.dataToCanvasY(startY);
    final y2 = context.transformer.dataToCanvasY(endY);

    final (barColor, barOpacity) = switch (seg.kind) {
      _WaterfallKind.total || _WaterfallKind.subtotal => (color, 0.6),
      _WaterfallKind.positive => (color, 1.0),
      _WaterfallKind.negative => (negColor, 0.9),
    };

    final barRect = Rect.fromLTRB(
      left,
      y1 < y2 ? y1 : y2,
      right,
      y1 < y2 ? y2 : y1,
    );
    final paint = art.barFill(barRect, barColor, opacity: barOpacity);
    final baseY = context.transformer.dataToCanvasY(context.viewport.minY);
    drawVerticalBar(
      canvas,
      barRect,
      radius: context.config.barBorderRadius,
      paint: paint,
      baseY: baseY,
    );

    if (connectorLines && i < segments.length - 1) {
      final next = segments[i + 1];
      final nextStartY =
          context.viewport.minY + (next.start - context.viewport.minY) * anim;
      final lineY = context.transformer.dataToCanvasY(endY);
      final nextX =
          context.bounds.left + (i + 1) * slotWidth + slotWidth * 0.2;
      canvas.drawLine(
        Offset(right, lineY),
        Offset(nextX, context.transformer.dataToCanvasY(nextStartY)),
        context.paintCache.get(
          key: 'wf-connector',
          color: context.theme.gridColor.withValues(alpha: 0.6),
        ),
      );
    }
  }
}