performPaint method
Hook for subclasses to implement actual painting.
Implementation
@override
void performPaint(Buffer buffer, Offset offset) {
final viewport = Viewport(
buffer,
Rect(offset.dx, offset.dy, size.width, size.height),
);
final timer = widget as TimerWidget;
if (size.width <= 0 || size.height <= 0) return;
final minutes = timer.duration.inMinutes;
final seconds = timer.duration.inSeconds % 60;
final mm = minutes.toString().padLeft(2, '0');
final ss = seconds.toString().padLeft(2, '0');
const timeStringLength = 5; // "MM:SS"
final startX = ((size.width - timeStringLength) / 2).floor().clamp(
0,
size.width,
);
// Draw digits & separators
if (startX + 5 <= size.width) {
viewport.writeString(startX, 0, mm, timer.digitStyle);
viewport.writeString(startX + 2, 0, ':', timer.separatorStyle);
viewport.writeString(startX + 3, 0, ss, timer.digitStyle);
} else {
// Fallback: draw what fits
final fallback = '$mm:$ss'.substring(0, size.width);
viewport.writeString(0, 0, fallback, timer.digitStyle);
}
if (size.height >= 2) {
// Draw progress bar below
final progress = timer.initialDuration.inMilliseconds == 0
? 0.0
: timer.duration.inMilliseconds /
timer.initialDuration.inMilliseconds;
final progressWidth = size.width;
final filledCount = (progress * progressWidth).round().clamp(
0,
progressWidth,
);
final barText = '█' * filledCount + '░' * (progressWidth - filledCount);
viewport.writeString(0, 1, barText, timer.progressStyle);
}
}