performPaint method

  1. @override
void performPaint(
  1. Buffer buffer,
  2. Offset offset
)
override

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);
  }
}