From a0b1e2372731ee6fcfa2ba269e20b5eb6158db75 Mon Sep 17 00:00:00 2001 From: bggRGjQaUbCoE Date: Sun, 1 Dec 2024 19:34:03 +0800 Subject: [PATCH] opt: viewpoints Signed-off-by: bggRGjQaUbCoE --- lib/common/widgets/segment_progress_bar.dart | 42 +++++++++++++++----- 1 file changed, 32 insertions(+), 10 deletions(-) diff --git a/lib/common/widgets/segment_progress_bar.dart b/lib/common/widgets/segment_progress_bar.dart index 0a6d8063..164f182c 100644 --- a/lib/common/widgets/segment_progress_bar.dart +++ b/lib/common/widgets/segment_progress_bar.dart @@ -12,6 +12,7 @@ class Segment { class SegmentProgressBar extends CustomPainter { final double progress; final List segmentColors; + double? _defHeight; SegmentProgressBar({ required this.progress, @@ -36,19 +37,42 @@ class SegmentProgressBar extends CustomPainter { (progressEnd < segmentEnd ? progressEnd : segmentEnd) - segmentStart; if (segmentWidth >= 0) { if (segmentColors[i].title != null) { + double fontSize = 8; TextPainter textPainter = TextPainter( text: TextSpan( text: segmentColors[i].title, - style: TextStyle(color: Colors.white, fontSize: 8), + style: TextStyle(color: Colors.white, fontSize: fontSize), ), textDirection: TextDirection.ltr, )..layout(); + _defHeight ??= textPainter.height; + + double? prevStart; + if (i != 0) { + prevStart = segmentColors[i - 1].start * size.width; + } + 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(); + } if (i == 0) { canvas.drawRect( Rect.fromLTRB( 0, - size.height - textPainter.height, + -_defHeight!, size.width, 0, ), @@ -59,21 +83,19 @@ class SegmentProgressBar extends CustomPainter { canvas.drawRect( Rect.fromLTWH( segmentStart, - -textPainter.height + 3, + -_defHeight!, segmentWidth == 0 ? 2 : segmentWidth, - size.height + textPainter.height - 3, + size.height + _defHeight!, ), paint, ); - 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 - 2; + : (segmentStart - prevStart! - textPainter.width) / 2 + + prevStart + + 1; + double textY = -_defHeight! / 2 - textPainter.height / 2; textPainter.paint(canvas, Offset(textX, textY)); } else { canvas.drawRect(