opt: SegmentProgressBar

Signed-off-by: bggRGjQaUbCoE <githubaccount56556@proton.me>
This commit is contained in:
bggRGjQaUbCoE
2024-12-03 11:42:28 +08:00
parent 49fe27176d
commit 98158c4f0c
3 changed files with 29 additions and 43 deletions

View File

@@ -21,12 +21,10 @@ class Segment {
}
class SegmentProgressBar extends CustomPainter {
final double progress;
final List<Segment> segmentColors;
double? _defHeight;
late double _defHeight;
SegmentProgressBar({
required this.progress,
required this.segmentColors,
});
@@ -38,52 +36,44 @@ class SegmentProgressBar extends CustomPainter {
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) {
break;
}
final segmentWidth =
(progressEnd < segmentEnd ? progressEnd : segmentEnd) - segmentStart;
if (segmentWidth >= 0) {
if (segmentEnd > segmentStart ||
(segmentEnd == segmentStart && segmentStart > 0)) {
if (segmentColors[i].title != null) {
double fontSize = 8;
TextPainter textPainter = TextPainter(
text: TextSpan(
text: segmentColors[i].title,
style: TextStyle(color: Colors.white, fontSize: fontSize),
),
textDirection: TextDirection.ltr,
)..layout();
_defHeight ??= textPainter.height;
double? prevStart;
TextPainter getTextPainter() => TextPainter(
text: TextSpan(
text: segmentColors[i].title,
style: TextStyle(
color: Colors.white,
fontSize: fontSize,
),
),
textDirection: TextDirection.ltr,
)..layout();
TextPainter textPainter = getTextPainter();
if (i == 0) {
_defHeight = textPainter.height;
}
late double prevStart;
if (i != 0) {
prevStart = segmentColors[i - 1].start * size.width;
}
double width = i == 0 ? segmentStart : segmentStart - prevStart!;
double width = i == 0 ? segmentStart : segmentStart - prevStart;
while (textPainter.width > width - 2 && fontSize >= 2) {
fontSize -= 1;
textPainter = TextPainter(
text: TextSpan(
text: segmentColors[i].title,
style: TextStyle(
color: Colors.white,
fontSize: fontSize,
),
),
textDirection: TextDirection.ltr,
);
textPainter.layout();
textPainter = getTextPainter();
}
if (i == 0) {
canvas.drawRect(
Rect.fromLTRB(
0,
-_defHeight!,
-_defHeight,
size.width,
0,
),
@@ -94,26 +84,26 @@ class SegmentProgressBar extends CustomPainter {
canvas.drawRect(
Rect.fromLTWH(
segmentStart,
-_defHeight!,
segmentWidth == 0 ? 2 : segmentWidth,
size.height + _defHeight!,
-_defHeight,
segmentEnd == segmentStart ? 2 : segmentEnd - segmentStart,
size.height + _defHeight,
),
paint,
);
double textX = i == 0
? (segmentStart - textPainter.width) / 2
: (segmentStart - prevStart! - textPainter.width) / 2 +
: (segmentStart - prevStart - textPainter.width) / 2 +
prevStart +
1;
double textY = -_defHeight! / 2 - textPainter.height / 2;
double textY = (-_defHeight - textPainter.height) / 2;
textPainter.paint(canvas, Offset(textX, textY));
} else {
canvas.drawRect(
Rect.fromLTWH(
segmentStart,
0,
segmentWidth == 0 ? 2 : segmentWidth,
segmentEnd == segmentStart ? 2 : segmentEnd - segmentStart,
size.height,
),
paint,