Unverified Commit e05d0dd2 authored by Callum Moffat's avatar Callum Moffat Committed by GitHub

ScaleGestureRecognizer pointerCount=2 for trackpad gestures (#140745)

Now trackpad gestures will count as pointerCount=2 instead of 1. It makes it easier for people who want to have different behaviour for single-finger drag vs two-finger pan/zoom. Also fixed up `scale_test.dart` to verify `pointerCount` in more places.

Related: https://github.com/flutter/flutter/issues/13102
Fixes https://github.com/flutter/flutter/issues/140730
parent b0c5fc91
...@@ -230,7 +230,8 @@ class ScaleUpdateDetails { ...@@ -230,7 +230,8 @@ class ScaleUpdateDetails {
/// The number of pointers being tracked by the gesture recognizer. /// The number of pointers being tracked by the gesture recognizer.
/// ///
/// Typically this is the number of fingers being used to pan the widget using the gesture /// Typically this is the number of fingers being used to pan the widget using the gesture
/// recognizer. /// recognizer. Due to platform limitations, trackpad gestures count as two fingers
/// even if more than two fingers are used.
final int pointerCount; final int pointerCount;
/// Recorded timestamp of the source pointer event that triggered the scale /// Recorded timestamp of the source pointer event that triggered the scale
...@@ -408,7 +409,10 @@ class ScaleGestureRecognizer extends OneSequenceGestureRecognizer { ...@@ -408,7 +409,10 @@ class ScaleGestureRecognizer extends OneSequenceGestureRecognizer {
/// Typically this is the number of fingers being used to pan the widget using the gesture /// Typically this is the number of fingers being used to pan the widget using the gesture
/// recognizer. /// recognizer.
int get pointerCount { int get pointerCount {
return _pointerPanZooms.length + _pointerQueue.length; // PointerPanZoom protocol doesn't contain the exact number of pointers
// used on the trackpad, as it isn't exposed by all platforms. However, it
// will always be at least two.
return (2 * _pointerPanZooms.length) + _pointerQueue.length;
} }
late Offset _initialFocalPoint; late Offset _initialFocalPoint;
...@@ -583,7 +587,7 @@ class ScaleGestureRecognizer extends OneSequenceGestureRecognizer { ...@@ -583,7 +587,7 @@ class ScaleGestureRecognizer extends OneSequenceGestureRecognizer {
for (final _PointerPanZoomData p in _pointerPanZooms.values) { for (final _PointerPanZoomData p in _pointerPanZooms.values) {
focalPoint += p.focalPoint; focalPoint += p.focalPoint;
} }
_currentFocalPoint = pointerCount > 0 ? focalPoint / pointerCount.toDouble() : Offset.zero; _currentFocalPoint = focalPoint / math.max(1, _pointerLocations.length + _pointerPanZooms.length).toDouble();
if (previousFocalPoint == null) { if (previousFocalPoint == null) {
_localFocalPoint = PointerEvent.transformPosition( _localFocalPoint = PointerEvent.transformPosition(
......
...@@ -18,9 +18,11 @@ void main() { ...@@ -18,9 +18,11 @@ void main() {
bool didStartScale = false; bool didStartScale = false;
Offset? updatedFocalPoint; Offset? updatedFocalPoint;
int? updatedPointerCount;
scale.onStart = (ScaleStartDetails details) { scale.onStart = (ScaleStartDetails details) {
didStartScale = true; didStartScale = true;
updatedFocalPoint = details.focalPoint; updatedFocalPoint = details.focalPoint;
updatedPointerCount = details.pointerCount;
}; };
double? updatedScale; double? updatedScale;
...@@ -33,6 +35,7 @@ void main() { ...@@ -33,6 +35,7 @@ void main() {
updatedVerticalScale = details.verticalScale; updatedVerticalScale = details.verticalScale;
updatedFocalPoint = details.focalPoint; updatedFocalPoint = details.focalPoint;
updatedDelta = details.focalPointDelta; updatedDelta = details.focalPointDelta;
updatedPointerCount = details.pointerCount;
}; };
bool didEndScale = false; bool didEndScale = false;
...@@ -56,6 +59,7 @@ void main() { ...@@ -56,6 +59,7 @@ void main() {
expect(updatedScale, isNull); expect(updatedScale, isNull);
expect(updatedFocalPoint, isNull); expect(updatedFocalPoint, isNull);
expect(updatedDelta, isNull); expect(updatedDelta, isNull);
expect(updatedPointerCount, isNull);
expect(didEndScale, isFalse); expect(didEndScale, isFalse);
expect(didTap, isFalse); expect(didTap, isFalse);
...@@ -65,6 +69,7 @@ void main() { ...@@ -65,6 +69,7 @@ void main() {
expect(updatedScale, isNull); expect(updatedScale, isNull);
expect(updatedFocalPoint, isNull); expect(updatedFocalPoint, isNull);
expect(updatedDelta, isNull); expect(updatedDelta, isNull);
expect(updatedPointerCount, isNull);
expect(didEndScale, isFalse); expect(didEndScale, isFalse);
expect(didTap, isFalse); expect(didTap, isFalse);
...@@ -77,9 +82,10 @@ void main() { ...@@ -77,9 +82,10 @@ void main() {
updatedScale = null; updatedScale = null;
expect(updatedDelta, const Offset(20.0, 30.0)); expect(updatedDelta, const Offset(20.0, 30.0));
updatedDelta = null; updatedDelta = null;
expect(updatedPointerCount, 1);
updatedPointerCount = null;
expect(didEndScale, isFalse); expect(didEndScale, isFalse);
expect(didTap, isFalse); expect(didTap, isFalse);
expect(scale.pointerCount, 1);
// Two-finger scaling // Two-finger scaling
final TestPointer pointer2 = TestPointer(2); final TestPointer pointer2 = TestPointer(2);
...@@ -88,13 +94,13 @@ void main() { ...@@ -88,13 +94,13 @@ void main() {
tap.addPointer(down2); tap.addPointer(down2);
tester.closeArena(2); tester.closeArena(2);
tester.route(down2); tester.route(down2);
expect(scale.pointerCount, 2);
expect(didEndScale, isTrue); expect(didEndScale, isTrue);
didEndScale = false; didEndScale = false;
expect(updatedScale, isNull); expect(updatedScale, isNull);
expect(updatedFocalPoint, isNull); expect(updatedFocalPoint, isNull);
expect(updatedDelta, isNull); expect(updatedDelta, isNull);
expect(updatedPointerCount, isNull);
expect(didStartScale, isFalse); expect(didStartScale, isFalse);
// Zoom in // Zoom in
...@@ -107,10 +113,12 @@ void main() { ...@@ -107,10 +113,12 @@ void main() {
expect(updatedHorizontalScale, 2.0); expect(updatedHorizontalScale, 2.0);
expect(updatedVerticalScale, 2.0); expect(updatedVerticalScale, 2.0);
expect(updatedDelta, const Offset(-5.0, -5.0)); expect(updatedDelta, const Offset(-5.0, -5.0));
expect(updatedPointerCount, 2);
updatedScale = null; updatedScale = null;
updatedHorizontalScale = null; updatedHorizontalScale = null;
updatedVerticalScale = null; updatedVerticalScale = null;
updatedDelta = null; updatedDelta = null;
updatedPointerCount = null;
expect(didEndScale, isFalse); expect(didEndScale, isFalse);
expect(didTap, isFalse); expect(didTap, isFalse);
...@@ -121,22 +129,26 @@ void main() { ...@@ -121,22 +129,26 @@ void main() {
expect(updatedHorizontalScale, 0.5); expect(updatedHorizontalScale, 0.5);
expect(updatedVerticalScale, 0.5); expect(updatedVerticalScale, 0.5);
expect(updatedDelta, const Offset(7.5, 7.5)); expect(updatedDelta, const Offset(7.5, 7.5));
expect(updatedPointerCount, 2);
expect(didTap, isFalse); expect(didTap, isFalse);
// Horizontal scaling // Horizontal scaling
tester.route(pointer2.move(const Offset(0.0, 20.0))); tester.route(pointer2.move(const Offset(0.0, 20.0)));
expect(updatedHorizontalScale, 2.0); expect(updatedHorizontalScale, 2.0);
expect(updatedVerticalScale, 1.0); expect(updatedVerticalScale, 1.0);
expect(updatedPointerCount, 2);
// Vertical scaling // Vertical scaling
tester.route(pointer2.move(const Offset(10.0, 10.0))); tester.route(pointer2.move(const Offset(10.0, 10.0)));
expect(updatedHorizontalScale, 1.0); expect(updatedHorizontalScale, 1.0);
expect(updatedVerticalScale, 2.0); expect(updatedVerticalScale, 2.0);
expect(updatedDelta, const Offset(5.0, -5.0)); expect(updatedDelta, const Offset(5.0, -5.0));
expect(updatedPointerCount, 2);
tester.route(pointer2.move(const Offset(15.0, 25.0))); tester.route(pointer2.move(const Offset(15.0, 25.0)));
updatedFocalPoint = null; updatedFocalPoint = null;
updatedScale = null; updatedScale = null;
updatedDelta = null; updatedDelta = null;
updatedPointerCount = null;
// Three-finger scaling // Three-finger scaling
final TestPointer pointer3 = TestPointer(3); final TestPointer pointer3 = TestPointer(3);
...@@ -151,6 +163,7 @@ void main() { ...@@ -151,6 +163,7 @@ void main() {
expect(updatedScale, isNull); expect(updatedScale, isNull);
expect(updatedFocalPoint, isNull); expect(updatedFocalPoint, isNull);
expect(updatedDelta, isNull); expect(updatedDelta, isNull);
expect(updatedPointerCount, isNull);
expect(didStartScale, isFalse); expect(didStartScale, isFalse);
// Zoom in // Zoom in
...@@ -163,6 +176,8 @@ void main() { ...@@ -163,6 +176,8 @@ void main() {
updatedScale = null; updatedScale = null;
expect(updatedDelta, const Offset(10.0, 10.0)); expect(updatedDelta, const Offset(10.0, 10.0));
updatedDelta = null; updatedDelta = null;
expect(updatedPointerCount, 3);
updatedPointerCount = null;
expect(didEndScale, isFalse); expect(didEndScale, isFalse);
expect(didTap, isFalse); expect(didTap, isFalse);
...@@ -178,6 +193,8 @@ void main() { ...@@ -178,6 +193,8 @@ void main() {
expect(updatedDelta!.dx, closeTo(-13.3, 0.1)); expect(updatedDelta!.dx, closeTo(-13.3, 0.1));
expect(updatedDelta!.dy, closeTo(-13.3, 0.1)); expect(updatedDelta!.dy, closeTo(-13.3, 0.1));
updatedDelta = null; updatedDelta = null;
expect(updatedPointerCount, 3);
updatedPointerCount = null;
expect(didEndScale, isFalse); expect(didEndScale, isFalse);
expect(didTap, isFalse); expect(didTap, isFalse);
...@@ -200,6 +217,8 @@ void main() { ...@@ -200,6 +217,8 @@ void main() {
updatedScale = null; updatedScale = null;
expect(updatedDelta, const Offset(-2.5, -2.5)); expect(updatedDelta, const Offset(-2.5, -2.5));
updatedDelta = null; updatedDelta = null;
expect(updatedPointerCount, 2);
updatedPointerCount = null;
// Continue rotating with two fingers // Continue rotating with two fingers
tester.route(pointer3.move(const Offset(30.0, 40.0))); tester.route(pointer3.move(const Offset(30.0, 40.0)));
...@@ -216,6 +235,8 @@ void main() { ...@@ -216,6 +235,8 @@ void main() {
updatedScale = null; updatedScale = null;
expect(updatedDelta, const Offset(-10.0, -10.0)); expect(updatedDelta, const Offset(-10.0, -10.0));
updatedDelta = null; updatedDelta = null;
expect(updatedPointerCount, 2);
updatedPointerCount = null;
tester.route(pointer2.up()); tester.route(pointer2.up());
expect(didStartScale, isFalse); expect(didStartScale, isFalse);
...@@ -236,6 +257,8 @@ void main() { ...@@ -236,6 +257,8 @@ void main() {
updatedScale = null; updatedScale = null;
expect(updatedDelta, const Offset(-10.0, -20.0)); expect(updatedDelta, const Offset(-10.0, -20.0));
updatedDelta = null; updatedDelta = null;
expect(updatedPointerCount, 1);
updatedPointerCount = null;
// We are done // We are done
tester.route(pointer3.up()); tester.route(pointer3.up());
...@@ -243,6 +266,7 @@ void main() { ...@@ -243,6 +266,7 @@ void main() {
expect(updatedFocalPoint, isNull); expect(updatedFocalPoint, isNull);
expect(updatedScale, isNull); expect(updatedScale, isNull);
expect(updatedDelta, isNull); expect(updatedDelta, isNull);
expect(updatedPointerCount, isNull);
expect(didEndScale, isTrue); expect(didEndScale, isTrue);
didEndScale = false; didEndScale = false;
expect(didTap, isFalse); expect(didTap, isFalse);
...@@ -438,9 +462,11 @@ void main() { ...@@ -438,9 +462,11 @@ void main() {
bool didStartScale = false; bool didStartScale = false;
Offset? updatedFocalPoint; Offset? updatedFocalPoint;
int? updatedPointerCount;
scale.onStart = (ScaleStartDetails details) { scale.onStart = (ScaleStartDetails details) {
didStartScale = true; didStartScale = true;
updatedFocalPoint = details.focalPoint; updatedFocalPoint = details.focalPoint;
updatedPointerCount = details.pointerCount;
}; };
double? updatedRotation; double? updatedRotation;
...@@ -449,6 +475,7 @@ void main() { ...@@ -449,6 +475,7 @@ void main() {
updatedRotation = details.rotation; updatedRotation = details.rotation;
updatedFocalPoint = details.focalPoint; updatedFocalPoint = details.focalPoint;
updatedDelta = details.focalPointDelta; updatedDelta = details.focalPointDelta;
updatedPointerCount = details.pointerCount;
}; };
bool didEndScale = false; bool didEndScale = false;
...@@ -486,6 +513,8 @@ void main() { ...@@ -486,6 +513,8 @@ void main() {
updatedDelta = null; updatedDelta = null;
expect(updatedRotation, 0.0); expect(updatedRotation, 0.0);
updatedRotation = null; updatedRotation = null;
expect(updatedPointerCount, 1);
updatedPointerCount = null;
expect(didEndScale, isFalse); expect(didEndScale, isFalse);
expect(didTap, isFalse); expect(didTap, isFalse);
...@@ -502,6 +531,7 @@ void main() { ...@@ -502,6 +531,7 @@ void main() {
expect(updatedFocalPoint, isNull); expect(updatedFocalPoint, isNull);
expect(updatedDelta, isNull); expect(updatedDelta, isNull);
expect(updatedRotation, isNull); expect(updatedRotation, isNull);
expect(updatedPointerCount, isNull);
expect(didStartScale, isFalse); expect(didStartScale, isFalse);
// Zoom in // Zoom in
...@@ -514,6 +544,8 @@ void main() { ...@@ -514,6 +544,8 @@ void main() {
updatedDelta = null; updatedDelta = null;
expect(updatedRotation, 0.0); expect(updatedRotation, 0.0);
updatedRotation = null; updatedRotation = null;
expect(updatedPointerCount, 2);
updatedPointerCount = null;
expect(didEndScale, isFalse); expect(didEndScale, isFalse);
expect(didTap, isFalse); expect(didTap, isFalse);
...@@ -525,6 +557,8 @@ void main() { ...@@ -525,6 +557,8 @@ void main() {
updatedDelta = null; updatedDelta = null;
expect(updatedRotation, math.pi); expect(updatedRotation, math.pi);
updatedRotation = null; updatedRotation = null;
expect(updatedPointerCount, 2);
updatedPointerCount = null;
expect(didEndScale, isFalse); expect(didEndScale, isFalse);
expect(didTap, isFalse); expect(didTap, isFalse);
...@@ -541,6 +575,7 @@ void main() { ...@@ -541,6 +575,7 @@ void main() {
expect(updatedFocalPoint, isNull); expect(updatedFocalPoint, isNull);
expect(updatedDelta, isNull); expect(updatedDelta, isNull);
expect(updatedRotation, isNull); expect(updatedRotation, isNull);
expect(updatedPointerCount, isNull);
expect(didStartScale, isFalse); expect(didStartScale, isFalse);
// Zoom in // Zoom in
...@@ -553,6 +588,8 @@ void main() { ...@@ -553,6 +588,8 @@ void main() {
updatedDelta = null; updatedDelta = null;
expect(updatedRotation, 0.0); expect(updatedRotation, 0.0);
updatedRotation = null; updatedRotation = null;
expect(updatedPointerCount, 3);
updatedPointerCount = null;
expect(didEndScale, isFalse); expect(didEndScale, isFalse);
expect(didTap, isFalse); expect(didTap, isFalse);
...@@ -568,6 +605,8 @@ void main() { ...@@ -568,6 +605,8 @@ void main() {
updatedDelta = null; updatedDelta = null;
expect(updatedRotation, 0.0); expect(updatedRotation, 0.0);
updatedRotation = null; updatedRotation = null;
expect(updatedPointerCount, 3);
updatedPointerCount = null;
expect(didEndScale, isFalse); expect(didEndScale, isFalse);
expect(didTap, isFalse); expect(didTap, isFalse);
...@@ -590,6 +629,8 @@ void main() { ...@@ -590,6 +629,8 @@ void main() {
updatedDelta = null; updatedDelta = null;
expect(updatedRotation, 0.0); expect(updatedRotation, 0.0);
updatedRotation = null; updatedRotation = null;
expect(updatedPointerCount, 2);
updatedPointerCount = null;
// Continue rotating with two fingers // Continue rotating with two fingers
tester.route(pointer3.move(const Offset(30.0, 40.0))); tester.route(pointer3.move(const Offset(30.0, 40.0)));
...@@ -599,6 +640,8 @@ void main() { ...@@ -599,6 +640,8 @@ void main() {
updatedDelta = null; updatedDelta = null;
expect(updatedRotation, - math.pi); expect(updatedRotation, - math.pi);
updatedRotation = null; updatedRotation = null;
expect(updatedPointerCount, 2);
updatedPointerCount = null;
tester.route(pointer3.move(const Offset(10.0, 20.0))); tester.route(pointer3.move(const Offset(10.0, 20.0)));
expect(updatedFocalPoint, const Offset(15.0, 25.0)); expect(updatedFocalPoint, const Offset(15.0, 25.0));
updatedFocalPoint = null; updatedFocalPoint = null;
...@@ -606,12 +649,15 @@ void main() { ...@@ -606,12 +649,15 @@ void main() {
updatedDelta = null; updatedDelta = null;
expect(updatedRotation, 0.0); expect(updatedRotation, 0.0);
updatedRotation = null; updatedRotation = null;
expect(updatedPointerCount, 2);
updatedPointerCount = null;
tester.route(pointer2.up()); tester.route(pointer2.up());
expect(didStartScale, isFalse); expect(didStartScale, isFalse);
expect(updatedFocalPoint, isNull); expect(updatedFocalPoint, isNull);
expect(updatedDelta, isNull); expect(updatedDelta, isNull);
expect(updatedRotation, isNull); expect(updatedRotation, isNull);
expect(updatedPointerCount, isNull);
expect(didEndScale, isTrue); expect(didEndScale, isTrue);
didEndScale = false; didEndScale = false;
expect(didTap, isFalse); expect(didTap, isFalse);
...@@ -622,6 +668,7 @@ void main() { ...@@ -622,6 +668,7 @@ void main() {
expect(updatedFocalPoint, isNull); expect(updatedFocalPoint, isNull);
expect(updatedDelta, isNull); expect(updatedDelta, isNull);
expect(updatedRotation, isNull); expect(updatedRotation, isNull);
expect(updatedPointerCount, isNull);
expect(didEndScale, isFalse); expect(didEndScale, isFalse);
didEndScale = false; didEndScale = false;
expect(didTap, isFalse); expect(didTap, isFalse);
...@@ -719,9 +766,11 @@ void main() { ...@@ -719,9 +766,11 @@ void main() {
bool didStartScale = false; bool didStartScale = false;
Offset? updatedFocalPoint; Offset? updatedFocalPoint;
int? updatedPointerCount;
scale.onStart = (ScaleStartDetails details) { scale.onStart = (ScaleStartDetails details) {
didStartScale = true; didStartScale = true;
updatedFocalPoint = details.focalPoint; updatedFocalPoint = details.focalPoint;
updatedPointerCount = details.pointerCount;
}; };
double? updatedScale; double? updatedScale;
...@@ -734,6 +783,7 @@ void main() { ...@@ -734,6 +783,7 @@ void main() {
updatedVerticalScale = details.verticalScale; updatedVerticalScale = details.verticalScale;
updatedFocalPoint = details.focalPoint; updatedFocalPoint = details.focalPoint;
updatedDelta = details.focalPointDelta; updatedDelta = details.focalPointDelta;
updatedPointerCount = details.pointerCount;
}; };
bool didEndScale = false; bool didEndScale = false;
...@@ -752,6 +802,7 @@ void main() { ...@@ -752,6 +802,7 @@ void main() {
expect(updatedScale, isNull); expect(updatedScale, isNull);
expect(updatedFocalPoint, isNull); expect(updatedFocalPoint, isNull);
expect(updatedDelta, isNull); expect(updatedDelta, isNull);
expect(updatedPointerCount, isNull);
expect(didEndScale, isFalse); expect(didEndScale, isFalse);
// Panning. // Panning.
...@@ -760,6 +811,7 @@ void main() { ...@@ -760,6 +811,7 @@ void main() {
expect(updatedScale, isNull); expect(updatedScale, isNull);
expect(updatedFocalPoint, isNull); expect(updatedFocalPoint, isNull);
expect(updatedDelta, isNull); expect(updatedDelta, isNull);
expect(updatedPointerCount, isNull);
expect(didEndScale, isFalse); expect(didEndScale, isFalse);
tester.route(pointer1.panZoomUpdate(Offset.zero, pan: const Offset(20.0, 30.0))); tester.route(pointer1.panZoomUpdate(Offset.zero, pan: const Offset(20.0, 30.0)));
...@@ -771,6 +823,8 @@ void main() { ...@@ -771,6 +823,8 @@ void main() {
updatedScale = null; updatedScale = null;
expect(updatedDelta, const Offset(20.0, 30.0)); expect(updatedDelta, const Offset(20.0, 30.0));
updatedDelta = null; updatedDelta = null;
expect(updatedPointerCount, 2);
updatedPointerCount = null;
expect(didEndScale, isFalse); expect(didEndScale, isFalse);
// Zoom in. // Zoom in.
...@@ -781,10 +835,12 @@ void main() { ...@@ -781,10 +835,12 @@ void main() {
expect(updatedHorizontalScale, 2.0); expect(updatedHorizontalScale, 2.0);
expect(updatedVerticalScale, 2.0); expect(updatedVerticalScale, 2.0);
expect(updatedDelta, Offset.zero); expect(updatedDelta, Offset.zero);
expect(updatedPointerCount, 2);
updatedScale = null; updatedScale = null;
updatedHorizontalScale = null; updatedHorizontalScale = null;
updatedVerticalScale = null; updatedVerticalScale = null;
updatedDelta = null; updatedDelta = null;
updatedPointerCount = null;
expect(didEndScale, isFalse); expect(didEndScale, isFalse);
// Zoom out. // Zoom out.
...@@ -795,10 +851,12 @@ void main() { ...@@ -795,10 +851,12 @@ void main() {
expect(updatedHorizontalScale, 1.0); expect(updatedHorizontalScale, 1.0);
expect(updatedVerticalScale, 1.0); expect(updatedVerticalScale, 1.0);
expect(updatedDelta, Offset.zero); expect(updatedDelta, Offset.zero);
expect(updatedPointerCount, 2);
updatedScale = null; updatedScale = null;
updatedHorizontalScale = null; updatedHorizontalScale = null;
updatedVerticalScale = null; updatedVerticalScale = null;
updatedDelta = null; updatedDelta = null;
updatedPointerCount = null;
expect(didEndScale, isFalse); expect(didEndScale, isFalse);
// We are done. // We are done.
...@@ -807,6 +865,7 @@ void main() { ...@@ -807,6 +865,7 @@ void main() {
expect(updatedFocalPoint, isNull); expect(updatedFocalPoint, isNull);
expect(updatedScale, isNull); expect(updatedScale, isNull);
expect(updatedDelta, isNull); expect(updatedDelta, isNull);
expect(updatedPointerCount, isNull);
expect(didEndScale, isTrue); expect(didEndScale, isTrue);
didEndScale = false; didEndScale = false;
...@@ -821,9 +880,11 @@ void main() { ...@@ -821,9 +880,11 @@ void main() {
bool didStartScale = false; bool didStartScale = false;
Offset? updatedFocalPoint; Offset? updatedFocalPoint;
int? updatedPointerCount;
scale.onStart = (ScaleStartDetails details) { scale.onStart = (ScaleStartDetails details) {
didStartScale = true; didStartScale = true;
updatedFocalPoint = details.focalPoint; updatedFocalPoint = details.focalPoint;
updatedPointerCount = details.pointerCount;
}; };
double? updatedScale; double? updatedScale;
...@@ -838,6 +899,7 @@ void main() { ...@@ -838,6 +899,7 @@ void main() {
updatedFocalPoint = details.focalPoint; updatedFocalPoint = details.focalPoint;
updatedDelta = details.focalPointDelta; updatedDelta = details.focalPointDelta;
updatedRotation = details.rotation; updatedRotation = details.rotation;
updatedPointerCount = details.pointerCount;
}; };
bool didEndScale = false; bool didEndScale = false;
...@@ -858,6 +920,7 @@ void main() { ...@@ -858,6 +920,7 @@ void main() {
expect(updatedScale, isNull); expect(updatedScale, isNull);
expect(updatedFocalPoint, isNull); expect(updatedFocalPoint, isNull);
expect(updatedDelta, isNull); expect(updatedDelta, isNull);
expect(updatedPointerCount, isNull);
expect(didEndScale, isFalse); expect(didEndScale, isFalse);
// Panning starting with trackpad. // Panning starting with trackpad.
...@@ -866,6 +929,7 @@ void main() { ...@@ -866,6 +929,7 @@ void main() {
expect(updatedScale, isNull); expect(updatedScale, isNull);
expect(updatedFocalPoint, isNull); expect(updatedFocalPoint, isNull);
expect(updatedDelta, isNull); expect(updatedDelta, isNull);
expect(updatedPointerCount, isNull);
expect(didEndScale, isFalse); expect(didEndScale, isFalse);
tester.route(panZoomPointer.panZoomUpdate(Offset.zero, pan: const Offset(40, 40))); tester.route(panZoomPointer.panZoomUpdate(Offset.zero, pan: const Offset(40, 40)));
...@@ -877,6 +941,8 @@ void main() { ...@@ -877,6 +941,8 @@ void main() {
updatedScale = null; updatedScale = null;
expect(updatedDelta, const Offset(40.0, 40.0)); expect(updatedDelta, const Offset(40.0, 40.0));
updatedDelta = null; updatedDelta = null;
expect(updatedPointerCount, 2);
updatedPointerCount = null;
expect(didEndScale, isFalse); expect(didEndScale, isFalse);
// Add a touch pointer. // Add a touch pointer.
...@@ -898,6 +964,8 @@ void main() { ...@@ -898,6 +964,8 @@ void main() {
updatedScale = null; updatedScale = null;
expect(updatedDelta, const Offset(-15, -15)); expect(updatedDelta, const Offset(-15, -15));
updatedDelta = null; updatedDelta = null;
expect(updatedPointerCount, 3);
updatedPointerCount = null;
expect(didEndScale, isFalse); expect(didEndScale, isFalse);
// Add a second touch pointer. // Add a second touch pointer.
...@@ -925,6 +993,8 @@ void main() { ...@@ -925,6 +993,8 @@ void main() {
updatedDelta = null; updatedDelta = null;
expect(updatedRotation, -math.pi / 4); expect(updatedRotation, -math.pi / 4);
updatedRotation = null; updatedRotation = null;
expect(updatedPointerCount, 4);
updatedPointerCount = null;
expect(didEndScale, isFalse); expect(didEndScale, isFalse);
// Change the scale and angle of the pan/zoom to test combining. // Change the scale and angle of the pan/zoom to test combining.
...@@ -944,6 +1014,8 @@ void main() { ...@@ -944,6 +1014,8 @@ void main() {
updatedDelta = null; updatedDelta = null;
expect(updatedRotation, closeTo(math.pi / 12, 0.0001)); expect(updatedRotation, closeTo(math.pi / 12, 0.0001));
updatedRotation = null; updatedRotation = null;
expect(updatedPointerCount, 4);
updatedPointerCount = null;
expect(didEndScale, isFalse); expect(didEndScale, isFalse);
// Move the pan/zoom origin to test combining. // Move the pan/zoom origin to test combining.
...@@ -957,6 +1029,8 @@ void main() { ...@@ -957,6 +1029,8 @@ void main() {
updatedDelta = null; updatedDelta = null;
expect(updatedRotation, closeTo(math.pi / 12, 0.0001)); expect(updatedRotation, closeTo(math.pi / 12, 0.0001));
updatedRotation = null; updatedRotation = null;
expect(updatedPointerCount, 4);
updatedPointerCount = null;
expect(didEndScale, isFalse); expect(didEndScale, isFalse);
// We are done. // We are done.
...@@ -966,18 +1040,21 @@ void main() { ...@@ -966,18 +1040,21 @@ void main() {
didEndScale = false; didEndScale = false;
expect(updatedScale, isNull); expect(updatedScale, isNull);
expect(updatedDelta, isNull); expect(updatedDelta, isNull);
expect(updatedPointerCount, isNull);
expect(didStartScale, isFalse); expect(didStartScale, isFalse);
tester.route(touchPointer1.up()); tester.route(touchPointer1.up());
expect(updatedFocalPoint, isNull); expect(updatedFocalPoint, isNull);
expect(didEndScale, isFalse); expect(didEndScale, isFalse);
expect(updatedScale, isNull); expect(updatedScale, isNull);
expect(updatedDelta, isNull); expect(updatedDelta, isNull);
expect(updatedPointerCount, isNull);
expect(didStartScale, isFalse); expect(didStartScale, isFalse);
tester.route(touchPointer2.up()); tester.route(touchPointer2.up());
expect(didEndScale, isFalse); expect(didEndScale, isFalse);
expect(updatedFocalPoint, isNull); expect(updatedFocalPoint, isNull);
expect(updatedScale, isNull); expect(updatedScale, isNull);
expect(updatedDelta, isNull); expect(updatedDelta, isNull);
expect(updatedPointerCount, isNull);
expect(didStartScale, isFalse); expect(didStartScale, isFalse);
scale.dispose(); scale.dispose();
...@@ -1178,9 +1255,11 @@ void main() { ...@@ -1178,9 +1255,11 @@ void main() {
bool didStartScale = false; bool didStartScale = false;
Offset? updatedFocalPoint; Offset? updatedFocalPoint;
int? updatedPointerCount;
scale.onStart = (ScaleStartDetails details) { scale.onStart = (ScaleStartDetails details) {
didStartScale = true; didStartScale = true;
updatedFocalPoint = details.focalPoint; updatedFocalPoint = details.focalPoint;
updatedPointerCount = details.pointerCount;
}; };
double? updatedScale; double? updatedScale;
...@@ -1189,6 +1268,7 @@ void main() { ...@@ -1189,6 +1268,7 @@ void main() {
updatedScale = details.scale; updatedScale = details.scale;
updatedFocalPoint = details.focalPoint; updatedFocalPoint = details.focalPoint;
updatedDelta = details.focalPointDelta; updatedDelta = details.focalPointDelta;
updatedPointerCount = details.pointerCount;
}; };
bool didEndScale = false; bool didEndScale = false;
...@@ -1206,6 +1286,7 @@ void main() { ...@@ -1206,6 +1286,7 @@ void main() {
expect(updatedScale, isNull); expect(updatedScale, isNull);
expect(updatedFocalPoint, isNull); expect(updatedFocalPoint, isNull);
expect(updatedDelta, isNull); expect(updatedDelta, isNull);
expect(updatedPointerCount, isNull);
expect(didEndScale, isFalse); expect(didEndScale, isFalse);
tester.route(start); tester.route(start);
...@@ -1215,6 +1296,8 @@ void main() { ...@@ -1215,6 +1296,8 @@ void main() {
expect(updatedFocalPoint, Offset.zero); expect(updatedFocalPoint, Offset.zero);
updatedFocalPoint = null; updatedFocalPoint = null;
expect(updatedDelta, isNull); expect(updatedDelta, isNull);
expect(updatedPointerCount, 2);
updatedPointerCount = null;
expect(didEndScale, isFalse); expect(didEndScale, isFalse);
// Zoom in by scrolling up. // Zoom in by scrolling up.
...@@ -1226,6 +1309,8 @@ void main() { ...@@ -1226,6 +1309,8 @@ void main() {
updatedScale = null; updatedScale = null;
expect(updatedDelta, Offset.zero); expect(updatedDelta, Offset.zero);
updatedDelta = null; updatedDelta = null;
expect(updatedPointerCount, 2);
updatedPointerCount = null;
expect(didEndScale, isFalse); expect(didEndScale, isFalse);
// A horizontal scroll should do nothing. // A horizontal scroll should do nothing.
...@@ -1237,6 +1322,8 @@ void main() { ...@@ -1237,6 +1322,8 @@ void main() {
updatedScale = null; updatedScale = null;
expect(updatedDelta, Offset.zero); expect(updatedDelta, Offset.zero);
updatedDelta = null; updatedDelta = null;
expect(updatedPointerCount, 2);
updatedPointerCount = null;
expect(didEndScale, isFalse); expect(didEndScale, isFalse);
// End. // End.
...@@ -1245,6 +1332,7 @@ void main() { ...@@ -1245,6 +1332,7 @@ void main() {
expect(updatedFocalPoint, isNull); expect(updatedFocalPoint, isNull);
expect(updatedScale, isNull); expect(updatedScale, isNull);
expect(updatedDelta, isNull); expect(updatedDelta, isNull);
expect(updatedPointerCount, isNull);
expect(didEndScale, isTrue); expect(didEndScale, isTrue);
didEndScale = false; didEndScale = false;
...@@ -1259,6 +1347,7 @@ void main() { ...@@ -1259,6 +1347,7 @@ void main() {
expect(updatedScale, isNull); expect(updatedScale, isNull);
expect(updatedFocalPoint, isNull); expect(updatedFocalPoint, isNull);
expect(updatedDelta, isNull); expect(updatedDelta, isNull);
expect(updatedPointerCount, isNull);
expect(didEndScale, isFalse); expect(didEndScale, isFalse);
tester.route(start2); tester.route(start2);
...@@ -1268,6 +1357,8 @@ void main() { ...@@ -1268,6 +1357,8 @@ void main() {
expect(updatedFocalPoint, Offset.zero); expect(updatedFocalPoint, Offset.zero);
updatedFocalPoint = null; updatedFocalPoint = null;
expect(updatedDelta, isNull); expect(updatedDelta, isNull);
expect(updatedPointerCount, 2);
updatedPointerCount = null;
expect(didEndScale, isFalse); expect(didEndScale, isFalse);
// Zoom in by scrolling left. // Zoom in by scrolling left.
...@@ -1280,6 +1371,8 @@ void main() { ...@@ -1280,6 +1371,8 @@ void main() {
updatedScale = null; updatedScale = null;
expect(updatedDelta, Offset.zero); expect(updatedDelta, Offset.zero);
updatedDelta = null; updatedDelta = null;
expect(updatedPointerCount, 2);
updatedPointerCount = null;
expect(didEndScale, isFalse); expect(didEndScale, isFalse);
// A vertical scroll should do nothing. // A vertical scroll should do nothing.
...@@ -1291,6 +1384,8 @@ void main() { ...@@ -1291,6 +1384,8 @@ void main() {
updatedScale = null; updatedScale = null;
expect(updatedDelta, Offset.zero); expect(updatedDelta, Offset.zero);
updatedDelta = null; updatedDelta = null;
expect(updatedPointerCount, 2);
updatedPointerCount = null;
expect(didEndScale, isFalse); expect(didEndScale, isFalse);
// End. // End.
...@@ -1299,6 +1394,7 @@ void main() { ...@@ -1299,6 +1394,7 @@ void main() {
expect(updatedFocalPoint, isNull); expect(updatedFocalPoint, isNull);
expect(updatedScale, isNull); expect(updatedScale, isNull);
expect(updatedDelta, isNull); expect(updatedDelta, isNull);
expect(updatedPointerCount, isNull);
expect(didEndScale, isTrue); expect(didEndScale, isTrue);
didEndScale = false; didEndScale = false;
......
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