feat: progressbar: show viewpoints #28

Signed-off-by: bggRGjQaUbCoE <githubaccount56556@proton.me>
This commit is contained in:
bggRGjQaUbCoE
2024-12-01 16:01:57 +08:00
parent 43977c737b
commit f9ed31c65a
6 changed files with 81 additions and 31 deletions

View File

@@ -4,8 +4,9 @@ class Segment {
final double start;
final double end;
final Color color;
final String? title;
Segment(this.start, this.end, this.color);
Segment(this.start, this.end, this.color, [this.title]);
}
class SegmentProgressBar extends CustomPainter {
@@ -21,10 +22,10 @@ class SegmentProgressBar extends CustomPainter {
void paint(Canvas canvas, Size size) {
final paint = Paint()..style = PaintingStyle.fill;
for (var segment in segmentColors) {
paint.color = segment.color;
final segmentStart = segment.start * size.width;
final segmentEnd = segment.end * size.width;
for (int i = 0; i < segmentColors.length; i++) {
paint.color = segmentColors[i].color;
final segmentStart = segmentColors[i].start * size.width;
final segmentEnd = segmentColors[i].end * size.width;
final progressEnd = progress * size.width;
if (progressEnd < segmentStart) {
@@ -33,11 +34,35 @@ class SegmentProgressBar extends CustomPainter {
final segmentWidth =
(progressEnd < segmentEnd ? progressEnd : segmentEnd) - segmentStart;
if (segmentWidth > 0) {
if (segmentWidth >= 0) {
canvas.drawRect(
Rect.fromLTWH(segmentStart, 0, segmentWidth, size.height),
Rect.fromLTWH(
segmentStart,
0,
segmentWidth == 0 ? 2 : segmentWidth,
size.height,
),
paint,
);
if (segmentColors[i].title != null) {
TextPainter textPainter = TextPainter(
text: TextSpan(
text: segmentColors[i].title,
style: TextStyle(color: Colors.white, fontSize: 8),
),
textDirection: TextDirection.ltr,
)..layout();
double? prevStart;
if (i != 0) {
prevStart = segmentColors[i - 1].start * size.width;
}
double textX = i == 0
? (segmentStart - textPainter.width) / 2
: (segmentStart - prevStart! - textPainter.width) / 2 + prevStart;
double textY = size.height - textPainter.height - 1;
textPainter.paint(canvas, Offset(textX, textY));
}
}
}
}