Signed-off-by: dom <githubaccount56556@proton.me>
This commit is contained in:
dom
2026-01-19 12:48:24 +08:00
parent 397f887b91
commit 33278a74b2
17 changed files with 79 additions and 101 deletions

View File

@@ -4,6 +4,11 @@ import 'package:flutter/foundation.dart';
import 'package:flutter/gestures.dart';
import 'package:flutter/material.dart';
import 'package:flutter/rendering.dart';
import 'package:flutter/services.dart'
show
MouseTrackerAnnotation,
PointerEnterEventListener,
PointerExitEventListener;
/// The shape of the progress bar at the left and right ends.
enum BarCapShape {
@@ -330,7 +335,7 @@ class _EagerHorizontalDragGestureRecognizer
String get debugDescription => '_EagerHorizontalDragGestureRecognizer';
}
class RenderProgressBar extends RenderBox {
class RenderProgressBar extends RenderBox implements MouseTrackerAnnotation {
RenderProgressBar({
required Duration progress,
required Duration total,
@@ -838,4 +843,16 @@ class RenderProgressBar extends RenderBox {
markNeedsPaint();
markNeedsSemanticsUpdate();
}
@override
MouseCursor get cursor => SystemMouseCursors.click;
@override
PointerEnterEventListener? onEnter;
@override
PointerExitEventListener? onExit;
@override
bool get validForMouseTracker => false;
}

View File

@@ -125,10 +125,10 @@ class RenderProgressBar extends BaseRenderProgressBar<Segment> {
if (segmentEnd > segmentStart ||
(segmentEnd == segmentStart && segmentStart > 0)) {
canvas.drawRect(
Rect.fromLTWH(
Rect.fromLTRB(
segmentStart,
0,
segmentEnd == segmentStart ? 2 : segmentEnd - segmentStart,
segmentEnd == segmentStart ? segmentStart + 2 : segmentEnd,
size.height,
),
paint,
@@ -183,13 +183,13 @@ class RenderViewPointProgressBar
}
}
static const double barHeight = 15.0;
@override
Size computeDryLayout(BoxConstraints constraints) {
return constraints.constrain(Size(constraints.maxWidth, barHeight));
void performLayout() {
size = constraints.constrain(Size(constraints.maxWidth, _barHeight));
}
static const double _barHeight = 15.0;
@override
void paint(PaintingContext context, Offset offset) {
final size = this.size;
@@ -197,7 +197,7 @@ class RenderViewPointProgressBar
final paint = Paint()..style = PaintingStyle.fill;
canvas.drawRect(
Rect.fromLTWH(0, 0, size.width, barHeight),
Rect.fromLTRB(0, 0, size.width, _barHeight),
paint..color = Colors.grey[600]!.withValues(alpha: 0.45),
);
@@ -241,11 +241,11 @@ class RenderViewPointProgressBar
}
canvas.drawRect(
Rect.fromLTWH(
Rect.fromLTRB(
segmentStart,
0,
segmentEnd == segmentStart ? 2 : segmentEnd - segmentStart,
barHeight + height,
segmentEnd == segmentStart ? segmentStart + 2 : segmentEnd,
_barHeight + height,
),
paint,
);
@@ -255,7 +255,7 @@ class RenderViewPointProgressBar
: (segmentStart - prevStart - textPainter.width) / 2 +
prevStart +
1;
final textY = (barHeight - textPainter.height) / 2;
final textY = (_barHeight - textPainter.height) / 2;
textPainter.paint(canvas, Offset(textX, textY));
}
}
@@ -356,12 +356,7 @@ class BaseRenderProgressBar<T extends BaseSegment> extends RenderBox {
@override
void performLayout() {
size = computeDryLayout(constraints);
}
@override
Size computeDryLayout(BoxConstraints constraints) {
return constraints.constrain(Size(constraints.maxWidth, height));
size = constraints.constrain(Size(constraints.maxWidth, height));
}
@override

View File

@@ -113,14 +113,7 @@ class RenderProgressBar extends RenderBox {
@override
void performLayout() {
size = computeDryLayout(constraints);
}
@override
Size computeDryLayout(BoxConstraints constraints) {
return constraints.constrain(
Size(constraints.maxWidth, _radius),
);
size = constraints.constrain(Size(constraints.maxWidth, _radius));
}
@override
@@ -130,11 +123,11 @@ class RenderProgressBar extends RenderBox {
final paint = Paint()..style = .fill;
canvas.clipRect(
.fromLTWH(0, size.height - height, size.width, height),
.fromLTRB(0, size.height - height, size.width, size.height),
);
final radius = Radius.circular(_radius);
final rect = Rect.fromLTWH(0, 0, size.width, size.height);
final rect = Rect.fromLTRB(0, 0, size.width, size.height);
final rrect = RRect.fromRectAndCorners(
rect,
bottomLeft: radius,
@@ -147,8 +140,8 @@ class RenderProgressBar extends RenderBox {
canvas.drawRRect(rrect, paint..color = _color);
} else {
final w = size.width * progress;
final left = Rect.fromLTWH(0, 0, w, size.height);
final right = Rect.fromLTWH(w, 0, size.width - w, size.height);
final left = Rect.fromLTRB(0, 0, w, size.height);
final right = Rect.fromLTRB(w, 0, size.width, size.height);
canvas
..clipRRect(rrect)
..drawRect(left, paint..color = _color)