draw method
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),
),
);
}
}
}