Keep edge-scroll fractions valid after clamped jumps

This commit is contained in:
fufesou
2026-09-13 12:04:05 +08:00
parent d2561f7f6b
commit d2d7c83602
2 changed files with 10 additions and 2 deletions

View File

@@ -2696,6 +2696,8 @@ class CanvasModel with ChangeNotifier {
setScrollPercent(scrollPixelPercent.x, scrollPixelPercent.y);
pushScrollPositionToUI(scrollPixel.x, scrollPixel.y);
// A no-op jump emits no notification to refresh the actual scroll fractions.
updateScrollPercent();
notifyListeners();
}

View File

@@ -14,6 +14,7 @@ import 'package:vector_math/vector_math.dart' show Vector2;
const _viewport = Size(200, 160);
const _hotspot = Offset(4, 9);
const _scrollDeltas = [80.0, -20.0, 1000.0, 1000.0, -1000.0, -1000.0, 80.0, 0.0];
class _Peer extends Fake implements FfiModel {
_Peer(ui.Image frame)
@@ -138,7 +139,7 @@ Future<void> _check(
addTearDown(tester.view.reset);
final vertical = frame.height > _viewport.height;
final pointer =
vertical ? const Offset(50.25, 130.75) : const Offset(130.25, 50.75);
vertical ? const Offset(50.25, 200.75) : const Offset(240.25, 50.75);
final video = await createTestImage(
width: frame.width.toInt(), height: frame.height.toInt());
final cursor = await createTestImage(width: 48, height: 64);
@@ -155,10 +156,15 @@ Future<void> _check(
});
await _mount(tester, ffi, dpr);
final videoWidget = texture ? find.byType(Texture) : _paintOf(video);
for (final distance in [80.0, -20.0]) {
final scrolling = vertical
? ffi.canvasModel.scrollVertical
: ffi.canvasModel.scrollHorizontal;
for (final distance in _scrollDeltas) {
// Drive the real scroll controllers; canvas pan offsets are not the video origin.
ffi.canvasModel.performEdgeScroll(
vertical ? Vector2(0, distance) : Vector2(distance, 0));
expect(vertical ? ffi.canvasModel.scrollY : ffi.canvasModel.scrollX,
closeTo(scrolling.offset / (vertical ? frame.height : frame.width), 1e-9));
await tester.pump();
final painter =
tester.widget<CustomPaint>(_paintOf(cursor)).painter! as ImagePainter;