Unverified Commit 610ca324 authored by Kate Lovett's avatar Kate Lovett Committed by GitHub

Update scrollbar for hover events (#90636)

parent 126370fb
...@@ -462,29 +462,37 @@ class ScrollbarPainter extends ChangeNotifier implements CustomPainter { ...@@ -462,29 +462,37 @@ class ScrollbarPainter extends ChangeNotifier implements CustomPainter {
break; break;
} }
// Whether we paint or not, calculating these rects allows us to hit test
// when the scrollbar is transparent.
_trackRect = trackOffset & trackSize; _trackRect = trackOffset & trackSize;
canvas.drawRect(_trackRect!, _paintTrack());
canvas.drawLine(
trackOffset,
Offset(trackOffset.dx, trackOffset.dy + _trackExtent),
_paintTrack(isBorder: true),
);
_thumbRect = Offset(x, y) & thumbSize; _thumbRect = Offset(x, y) & thumbSize;
if (radius != null) { // Paint if the opacity dictates visibility
canvas.drawRRect(RRect.fromRectAndRadius(_thumbRect!, radius!), _paintThumb); if (fadeoutOpacityAnimation.value != 0.0) {
return; // Track
} canvas.drawRect(_trackRect!, _paintTrack());
// Track Border
if (shape == null) { canvas.drawLine(
canvas.drawRect(_thumbRect!, _paintThumb); trackOffset,
return; Offset(trackOffset.dx, trackOffset.dy + _trackExtent),
_paintTrack(isBorder: true),
);
if (radius != null) {
// Rounded rect thumb
canvas.drawRRect(
RRect.fromRectAndRadius(_thumbRect!, radius!), _paintThumb);
return;
}
if (shape == null) {
// Square thumb
canvas.drawRect(_thumbRect!, _paintThumb);
return;
}
// Custom-shaped thumb
final Path outerPath = shape!.getOuterPath(_thumbRect!);
canvas.drawPath(outerPath, _paintThumb);
shape!.paint(canvas, _thumbRect!);
} }
final Path outerPath = shape!.getOuterPath(_thumbRect!);
canvas.drawPath(outerPath, _paintThumb);
shape!.paint(canvas, _thumbRect!);
} }
double _thumbExtent() { double _thumbExtent() {
...@@ -573,7 +581,6 @@ class ScrollbarPainter extends ChangeNotifier implements CustomPainter { ...@@ -573,7 +581,6 @@ class ScrollbarPainter extends ChangeNotifier implements CustomPainter {
void paint(Canvas canvas, Size size) { void paint(Canvas canvas, Size size) {
if (_lastAxisDirection == null if (_lastAxisDirection == null
|| _lastMetrics == null || _lastMetrics == null
|| fadeoutOpacityAnimation.value == 0.0
|| _lastMetrics!.maxScrollExtent <= _lastMetrics!.minScrollExtent) || _lastMetrics!.maxScrollExtent <= _lastMetrics!.minScrollExtent)
return; return;
...@@ -606,7 +613,7 @@ class ScrollbarPainter extends ChangeNotifier implements CustomPainter { ...@@ -606,7 +613,7 @@ class ScrollbarPainter extends ChangeNotifier implements CustomPainter {
/// be used. /// be used.
bool hitTestInteractive(Offset position, PointerDeviceKind kind, { bool forHover = false }) { bool hitTestInteractive(Offset position, PointerDeviceKind kind, { bool forHover = false }) {
if (_thumbRect == null) { if (_thumbRect == null) {
// We have never painted the scrollbar, so we do not know where it will be. // We have not computed the scrollbar position yet.
return false; return false;
} }
......
...@@ -883,6 +883,41 @@ void main() { ...@@ -883,6 +883,41 @@ void main() {
); );
}); });
testWidgets('Scrollbar will show on hover without needing to scroll first for metrics', (WidgetTester tester) async {
await tester.pumpWidget(
const Directionality(
textDirection: TextDirection.ltr,
child: MediaQuery(
data: MediaQueryData(),
child: RawScrollbar(
child: SingleChildScrollView(
child: SizedBox(width: 4000.0, height: 4000.0),
),
),
),
),
);
await tester.pump();
// Hover over scrollbar with mouse. Even though we have not scrolled, the
// ScrollMetricsNotification will have informed the Scrollbar's hit testing.
final TestGesture mouseGesture = await tester.createGesture(kind: ui.PointerDeviceKind.mouse);
await mouseGesture.addPointer();
addTearDown(mouseGesture.removePointer);
await mouseGesture.moveTo(const Offset(794.0, 5.0));
await tester.pumpAndSettle();
// Scrollbar should have appeared in response to hover event.
expect(
find.byType(RawScrollbar),
paints
..rect(rect: const Rect.fromLTRB(794.0, 0.0, 800.0, 600.0))
..rect(
rect: const Rect.fromLTRB(794.0, 0.0, 800.0, 90.0),
color: const Color(0x66BCBCBC),
),
);
});
testWidgets('Scrollbar thumb can be dragged', (WidgetTester tester) async { testWidgets('Scrollbar thumb can be dragged', (WidgetTester tester) async {
final ScrollController scrollController = ScrollController(); final ScrollController scrollController = ScrollController();
await tester.pumpWidget( await tester.pumpWidget(
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment