render method

  1. @override
void render(
  1. Buffer buffer,
  2. Rect area
)
override

Renders the widget onto the provided buffer within the specified area.

Implementation

@override
void render(Buffer buffer, Rect area) {
  if (area.width <= 0 || area.height <= 0) return;

  final minutes = duration.inMinutes;
  final seconds = duration.inSeconds % 60;

  final mm = minutes.toString().padLeft(2, '0');
  final ss = seconds.toString().padLeft(2, '0');

  final timeStringLength = 5; // "MM:SS"
  final startX = ((area.width - timeStringLength) / 2).floor().clamp(
    0,
    area.width,
  );

  // Draw digits & separators
  if (startX + 5 <= area.width) {
    buffer.writeString(startX, 0, mm, digitStyle);
    buffer.writeString(startX + 2, 0, ':', separatorStyle);
    buffer.writeString(startX + 3, 0, ss, digitStyle);
  } else {
    // Fallback: draw what fits
    final fallback = '$mm:$ss'.substring(0, area.width);
    buffer.writeString(0, 0, fallback, digitStyle);
  }

  if (area.height >= 2) {
    // Draw progress bar below
    final progress = initialDuration.inMilliseconds == 0
        ? 0.0
        : duration.inMilliseconds / initialDuration.inMilliseconds;

    final progressWidth = area.width;
    final filledCount = (progress * progressWidth).round().clamp(
      0,
      progressWidth,
    );

    final barText = '█' * filledCount + '░' * (progressWidth - filledCount);
    buffer.writeString(0, 1, barText, progressStyle);
  }
}