Unverified Commit b429ec1e authored by Justin McCandless's avatar Justin McCandless Committed by GitHub

InteractiveViewer mouse scale bug (#59478)

parent 5a4bb505
......@@ -659,16 +659,17 @@ class _InteractiveViewerState extends State<InteractiveViewer> with TickerProvid
// Returns true iff the given _GestureType is enabled.
bool _gestureIsSupported(_GestureType gestureType) {
if (_gestureType == _GestureType.pan && !widget.panEnabled) {
return false;
}
if (_gestureType == _GestureType.scale && !widget.scaleEnabled) {
return false;
}
if (_gestureType == _GestureType.rotate && !_rotateEnabled) {
return false;
switch (gestureType) {
case _GestureType.rotate:
return _rotateEnabled;
case _GestureType.scale:
return widget.scaleEnabled;
case _GestureType.pan:
default:
return widget.panEnabled;
}
return true;
}
// Handle the start of a gesture. All of pan, scale, and rotate are handled
......@@ -841,6 +842,9 @@ class _InteractiveViewerState extends State<InteractiveViewer> with TickerProvid
// Handle mousewheel scroll events.
void _receivedPointerSignal(PointerSignalEvent event) {
if (!_gestureIsSupported(_GestureType.scale)) {
return;
}
if (event is PointerScrollEvent) {
final RenderBox childRenderBox = _childKey.currentContext.findRenderObject() as RenderBox;
final Size childSize = childRenderBox.size;
......
// Copyright 2014 The Flutter Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
// @dart = 2.8
import 'package:flutter/gestures.dart';
import 'package:flutter_test/flutter_test.dart';
Future<void> scrollAt(Offset position, WidgetTester tester) {
final TestPointer testPointer = TestPointer(1, PointerDeviceKind.mouse);
// Create a hover event so that |testPointer| has a location when generating the scroll.
testPointer.hover(position);
final HitTestResult result = tester.hitTestOnBinding(position);
return tester.sendEventToBinding(testPointer.scroll(const Offset(0.0, 20.0)), result);
}
......@@ -4,11 +4,14 @@
// @dart = 2.8
import 'package:flutter/gestures.dart';
import 'package:flutter/material.dart';
import 'package:flutter/widgets.dart';
import 'package:flutter_test/flutter_test.dart';
import 'package:vector_math/vector_math_64.dart' show Quad, Vector3, Matrix4;
import 'gesture_utils.dart';
void main() {
group('InteractiveViewer', () {
testWidgets('child fits in viewport', (WidgetTester tester) async {
......@@ -402,6 +405,51 @@ void main() {
expect(newSceneFocalPoint.dx, closeTo(sceneFocalPoint.dx, 1.0));
expect(newSceneFocalPoint.dy, closeTo(sceneFocalPoint.dy, 1.0));
});
testWidgets('Can scale with mouse', (WidgetTester tester) async {
final TransformationController transformationController = TransformationController();
await tester.pumpWidget(
MaterialApp(
home: Scaffold(
body: Center(
child: InteractiveViewer(
transformationController: transformationController,
child: Container(width: 200.0, height: 200.0),
),
),
),
),
);
final Offset center = tester.getCenter(find.byType(InteractiveViewer));
await scrollAt(center, tester);
await tester.pumpAndSettle();
expect(transformationController.value.getMaxScaleOnAxis(), greaterThan(1.0));
});
testWidgets('Cannot scale with mouse when scale is disabled', (WidgetTester tester) async {
final TransformationController transformationController = TransformationController();
await tester.pumpWidget(
MaterialApp(
home: Scaffold(
body: Center(
child: InteractiveViewer(
transformationController: transformationController,
scaleEnabled: false,
child: Container(width: 200.0, height: 200.0),
),
),
),
),
);
final Offset center = tester.getCenter(find.byType(InteractiveViewer));
await scrollAt(center, tester);
await tester.pumpAndSettle();
expect(transformationController.value.getMaxScaleOnAxis(), equals(1.0));
});
});
group('getNearestPointOnLine', () {
......
......@@ -12,6 +12,7 @@ import 'package:flutter_test/flutter_test.dart';
import 'package:flutter/widgets.dart';
import 'package:flutter/gestures.dart';
import 'gesture_utils.dart';
void main() {
testWidgets('Events bubble up the tree', (WidgetTester tester) async {
......@@ -400,11 +401,3 @@ void main() {
]);
});
}
Future<void> scrollAt(Offset position, WidgetTester tester) {
final TestPointer testPointer = TestPointer(1, PointerDeviceKind.mouse);
// Create a hover event so that |testPointer| has a location when generating the scroll.
testPointer.hover(position);
final HitTestResult result = tester.hitTestOnBinding(position);
return tester.sendEventToBinding(testPointer.scroll(const Offset(0.0, 20.0)), result);
}
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