Files
plezy/lib/widgets/video_controls/painters/buffer_range_painter.dart
T

53 lines
1.7 KiB
Dart

import 'package:flutter/material.dart';
import '../../../mpv/models.dart';
/// Custom painter that draws a background track and buffered range bars
/// on the video timeline slider.
class BufferRangePainter extends CustomPainter {
final List<BufferRange> ranges;
final Duration duration;
BufferRangePainter({required this.ranges, required this.duration});
@override
void paint(Canvas canvas, Size size) {
final trackHeight = 4.0;
final y = (size.height - trackHeight) / 2;
// Background track (full width)
final bgPaint = Paint()
..color = Colors.white.withValues(alpha: 0.3)
..style = PaintingStyle.fill;
canvas.drawRRect(
RRect.fromRectAndRadius(Rect.fromLTWH(0, y, size.width, trackHeight), const Radius.circular(2)),
bgPaint,
);
if (duration.inMilliseconds <= 0) return;
// Buffer range bars
final bufPaint = Paint()
..color = Colors.white.withValues(alpha: 0.5)
..style = PaintingStyle.fill;
final durationMs = duration.inMilliseconds.toDouble();
for (final range in ranges) {
final startFraction = (range.start.inMilliseconds / durationMs).clamp(0.0, 1.0);
final endFraction = (range.end.inMilliseconds / durationMs).clamp(0.0, 1.0);
if (endFraction <= startFraction) continue;
final left = startFraction * size.width;
final right = endFraction * size.width;
canvas.drawRRect(
RRect.fromRectAndRadius(Rect.fromLTWH(left, y, right - left, trackHeight), const Radius.circular(2)),
bufPaint,
);
}
}
@override
bool shouldRepaint(BufferRangePainter oldDelegate) {
return oldDelegate.duration != duration || oldDelegate.ranges != ranges;
}
}