From b2b13f762c9c3da770a9f684fdea4140ca827990 Mon Sep 17 00:00:00 2001 From: Angelo Silvestre Date: Thu, 9 Jan 2025 21:50:36 -0300 Subject: [PATCH] [SuperEditor][SuperTextField][mobile] - Do not crop magnifier at screen edges (Resolves #2167) (#2482) --- .../demo_mobile_editing_ios.dart | 8 +-- .../document_gestures_touch_android.dart | 25 ++++--- .../document_gestures_touch_ios.dart | 44 +++++++------ .../platforms/android/magnifier.dart | 24 +++++-- .../platforms/ios/magnifier.dart | 39 +++++------ .../platforms/mobile_documents.dart | 6 +- ...nly_document_android_touch_interactor.dart | 12 ++-- ...ad_only_document_ios_touch_interactor.dart | 8 +-- .../android/_editing_controls.dart | 17 +++-- .../android/_user_interaction.dart | 3 +- .../android/android_textfield.dart | 3 +- .../infrastructure/magnifier.dart | 53 ++++++++++++++- .../super_textfield/ios/editing_controls.dart | 8 +-- ...reditor_android_magnifier_screen_edges.png | Bin 0 -> 47489 bytes ...supereditor_ios_magnifier_screen_edges.png | Bin 0 -> 52098 bytes ...reditor_android_overlay_controls_test.dart | 57 ++++++++++++++++ ...supereditor_ios_overlay_controls_test.dart | 55 ++++++++++++++++ ...xtfield_android_magnifier_screen_edges.png | Bin 0 -> 9494 bytes ...r_textfield_ios_magnifier_screen_edges.png | Bin 0 -> 11837 bytes ...xtfield_android_overlay_controls_test.dart | 61 ++++++++++++++++++ ...r_textfield_ios_overlay_controls_test.dart | 60 +++++++++++++++++ 21 files changed, 383 insertions(+), 100 deletions(-) create mode 100644 super_editor/test_goldens/editor/mobile/goldens/supereditor_android_magnifier_screen_edges.png create mode 100644 super_editor/test_goldens/editor/mobile/goldens/supereditor_ios_magnifier_screen_edges.png create mode 100644 super_editor/test_goldens/editor/mobile/supereditor_android_overlay_controls_test.dart create mode 100644 super_editor/test_goldens/editor/mobile/supereditor_ios_overlay_controls_test.dart create mode 100644 super_editor/test_goldens/super_textfield/goldens/super_textfield_android_magnifier_screen_edges.png create mode 100644 super_editor/test_goldens/super_textfield/goldens/super_textfield_ios_magnifier_screen_edges.png create mode 100644 super_editor/test_goldens/super_textfield/super_textfield_android_overlay_controls_test.dart create mode 100644 super_editor/test_goldens/super_textfield/super_textfield_ios_overlay_controls_test.dart diff --git a/super_editor/example/lib/demos/editor_configs/demo_mobile_editing_ios.dart b/super_editor/example/lib/demos/editor_configs/demo_mobile_editing_ios.dart index fd6a1728f6..c9e10c359d 100644 --- a/super_editor/example/lib/demos/editor_configs/demo_mobile_editing_ios.dart +++ b/super_editor/example/lib/demos/editor_configs/demo_mobile_editing_ios.dart @@ -136,10 +136,10 @@ class _MobileEditingIOSDemoState extends State with Single child: IOSFollowingMagnifier.roundedRectangle( magnifierKey: magnifierKey, leaderLink: focalPoint, - // The bottom of the magnifier sits above the focal point. - // Leave a few pixels between the bottom of the magnifier and the focal point. This - // value was chosen empirically. - offsetFromFocalPoint: const Offset(0, -20), + // The magnifier is centered with the focal point. Translate it so that it sits + // above the focal point and leave a few pixels between the bottom of the magnifier + // and the focal point. This value was chosen empirically. + offsetFromFocalPoint: Offset(0, (-defaultIosMagnifierSize.height / 2) - 20), show: isVisible, ), ); diff --git a/super_editor/lib/src/default_editor/document_gestures_touch_android.dart b/super_editor/lib/src/default_editor/document_gestures_touch_android.dart index 7774221be5..7dfd9590a4 100644 --- a/super_editor/lib/src/default_editor/document_gestures_touch_android.dart +++ b/super_editor/lib/src/default_editor/document_gestures_touch_android.dart @@ -1948,23 +1948,20 @@ class SuperEditorAndroidControlsOverlayManagerState extends State with Sing // Animate the magnfier up on entrance and down on exit. widget.offsetFromFocalPoint.dy * devicePixelRatio * percentage, ), - // Translate the magnifier so it's displayed above the focal point - // when the animation ends. - child: FractionalTranslation( - translation: Offset(0.0, -0.5 * percentage), - child: widget.magnifierBuilder( - context, - IosMagnifierViewModel( - // In theory, the offsetFromFocalPoint should either be `widget.offsetFromFocalPoint.dy` to match - // the actual offset, or it should be `widget.offsetFromFocalPoint.dy / magnificationLevel`. Neither - // of those align the focal point correctly. The following offset was found empirically to give the - // desired results. These values seem to work even with different pixel densities. - offsetFromFocalPoint: Offset( - -22 * percentage, - (-defaultIosMagnifierSize.height + 14) * percentage, - ), - animationValue: _animationController.value, - animationDirection: - const [AnimationStatus.forward, AnimationStatus.completed].contains(_animationController.status) - ? AnimationDirection.forward - : AnimationDirection.reverse, - borderColor: widget.handleColor ?? Theme.of(context).primaryColor, + boundary: ScreenFollowerBoundary( + screenSize: MediaQuery.sizeOf(context), + devicePixelRatio: MediaQuery.devicePixelRatioOf(context), + ), + child: widget.magnifierBuilder( + context, + IosMagnifierViewModel( + offsetFromFocalPoint: Offset( + widget.offsetFromFocalPoint.dx * percentage, + widget.offsetFromFocalPoint.dy * percentage, ), - widget.magnifierKey, + animationValue: _animationController.value, + animationDirection: + const [AnimationStatus.forward, AnimationStatus.completed].contains(_animationController.status) + ? AnimationDirection.forward + : AnimationDirection.reverse, + borderColor: widget.handleColor ?? Theme.of(context).primaryColor, ), + widget.magnifierKey, ), ); }, diff --git a/super_editor/lib/src/infrastructure/platforms/mobile_documents.dart b/super_editor/lib/src/infrastructure/platforms/mobile_documents.dart index 95fafe93d4..db7d3e70a2 100644 --- a/super_editor/lib/src/infrastructure/platforms/mobile_documents.dart +++ b/super_editor/lib/src/infrastructure/platforms/mobile_documents.dart @@ -370,7 +370,7 @@ class GestureEditingController with ChangeNotifier { GestureEditingController({ required this.selectionLinks, required MagnifierAndToolbarController overlayController, - required LayerLink magnifierFocalPointLink, + required LeaderLink magnifierFocalPointLink, }) : _magnifierFocalPointLink = magnifierFocalPointLink, _overlayController = overlayController { _overlayController.addListener(_toolbarChanged); @@ -386,8 +386,8 @@ class GestureEditingController with ChangeNotifier { /// A `LayerLink` whose top-left corner sits at the location where the /// magnifier should magnify. - LayerLink get magnifierFocalPointLink => _magnifierFocalPointLink; - final LayerLink _magnifierFocalPointLink; + LeaderLink get magnifierFocalPointLink => _magnifierFocalPointLink; + final LeaderLink _magnifierFocalPointLink; /// Controls the magnifier and the toolbar. MagnifierAndToolbarController get overlayController => _overlayController; diff --git a/super_editor/lib/src/super_reader/read_only_document_android_touch_interactor.dart b/super_editor/lib/src/super_reader/read_only_document_android_touch_interactor.dart index 1c0438ec13..e9efeed297 100644 --- a/super_editor/lib/src/super_reader/read_only_document_android_touch_interactor.dart +++ b/super_editor/lib/src/super_reader/read_only_document_android_touch_interactor.dart @@ -132,7 +132,7 @@ class _ReadOnlyAndroidDocumentTouchInteractorState extends State _magnifierFocalPoint; + final LeaderLink _magnifierFocalPoint; + LeaderLink get magnifierFocalPoint => _magnifierFocalPoint; bool _isMagnifierVisible = false; bool get isMagnifierVisible => _isMagnifierVisible; diff --git a/super_editor/lib/src/super_textfield/android/_user_interaction.dart b/super_editor/lib/src/super_textfield/android/_user_interaction.dart index 402601c016..d6758e4cbb 100644 --- a/super_editor/lib/src/super_textfield/android/_user_interaction.dart +++ b/super_editor/lib/src/super_textfield/android/_user_interaction.dart @@ -1,6 +1,7 @@ import 'package:flutter/gestures.dart'; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; +import 'package:follow_the_leader/follow_the_leader.dart'; import 'package:super_editor/src/infrastructure/_logging.dart'; import 'package:super_editor/src/infrastructure/document_gestures_interaction_overrides.dart'; import 'package:super_editor/src/infrastructure/flutter/flutter_scheduler.dart'; @@ -691,7 +692,7 @@ class AndroidTextFieldTouchInteractorState extends State late ImeAttributedTextEditingController _textEditingController; - final _magnifierLayerLink = LayerLink(); + final _magnifierLayerLink = LeaderLink(); late AndroidEditingOverlayController _editingOverlayController; late TextScrollController _textScrollController; diff --git a/super_editor/lib/src/super_textfield/infrastructure/magnifier.dart b/super_editor/lib/src/super_textfield/infrastructure/magnifier.dart index 8eeac0bf38..03c79cc00e 100644 --- a/super_editor/lib/src/super_textfield/infrastructure/magnifier.dart +++ b/super_editor/lib/src/super_textfield/infrastructure/magnifier.dart @@ -57,10 +57,57 @@ class MagnifyingGlass extends StatelessWidget { } ImageFilter _createMagnificationFilter() { + // When displayed without scaling, the content inside the magnifier looks + // like this: + // ________________ + // | | + // | center | + // |________________| + // + // Applying scaling causes the content to grow outward shifting the center + // away from the magnifier's center, like this: + // ________________ + // | | + // | | + // |_________c e n t|e r + // + // To correct this, we shift the content in the opposite direction before scaling, + // so it appears like this before scaling: + // ________________ + // |center | + // | | + // |________________| + // + // After scaling, the content shifts again due to the scaling effect. However, + // the pre-shift ensures that the center of the content aligns correctly within + // the magnifier, like this: + // ________________ + // | | + // | c e n t e r | + // |________________| + // final magnifierMatrix = Matrix4.identity() - ..translate(offsetFromFocalPoint.dx * magnificationScale, offsetFromFocalPoint.dy * magnificationScale) - ..scale(magnificationScale, magnificationScale); - + // Calculate the extra size introduced by scaling and move the content + // back by half of that amount. + // + // For example: + // + // If the magnifier is 133px wide with a magnification scale of 1.5, + // the scaled width will be: + // 133px * 1.5 = 199.5px. + // + // The width increases by 66.5px in total. Since the growth is symmetric, + // we shift the content left by half the increase (66.5px / 2 = 33.25px) + // to re-center it under the magnifier after the scaling. + ..translate( + -(size.width * magnificationScale - size.width) / 2, + -(size.height * magnificationScale - size.height) / 2, + ) + // Apply the scaling transformation to magnify the content. + ..scale(magnificationScale, magnificationScale) + // Move the content to the center of where the app wants to + // display the magnifier. + ..translate(offsetFromFocalPoint.dx, offsetFromFocalPoint.dy); return ImageFilter.matrix(magnifierMatrix.storage); } } diff --git a/super_editor/lib/src/super_textfield/ios/editing_controls.dart b/super_editor/lib/src/super_textfield/ios/editing_controls.dart index 411f70a9ab..28841f3332 100644 --- a/super_editor/lib/src/super_textfield/ios/editing_controls.dart +++ b/super_editor/lib/src/super_textfield/ios/editing_controls.dart @@ -570,10 +570,10 @@ class _IOSEditingControlsState extends State return IOSFollowingMagnifier.roundedRectangle( leaderLink: widget.editingController.magnifierFocalPoint, show: showMagnifier, - // The bottom of the magnifier sits above the focal point. - // Leave a few pixels between the bottom of the magnifier and the focal point. This - // value was chosen empirically. - offsetFromFocalPoint: const Offset(0, -20), + // The magnifier is centered with the focal point. Translate it so that it sits + // above the focal point and leave a few pixels between the bottom of the magnifier + // and the focal point. This value was chosen empirically. + offsetFromFocalPoint: Offset(0, (-defaultIosMagnifierSize.height / 2) - 20), ); }, ); diff --git a/super_editor/test_goldens/editor/mobile/goldens/supereditor_android_magnifier_screen_edges.png b/super_editor/test_goldens/editor/mobile/goldens/supereditor_android_magnifier_screen_edges.png new file mode 100644 index 0000000000000000000000000000000000000000..9cc0840179284bd977ff647ad13151c0be91b928 GIT binary patch literal 47489 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 literal 0 HcmV?d00001 diff --git a/super_editor/test_goldens/editor/mobile/goldens/supereditor_ios_magnifier_screen_edges.png b/super_editor/test_goldens/editor/mobile/goldens/supereditor_ios_magnifier_screen_edges.png new file mode 100644 index 0000000000000000000000000000000000000000..28e59d5c4b932798a3b4a82dfc16f7d8ef61b617 GIT binary patch literal 52098 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 Android > overlay controls >", () { + testGoldensOnAndroid("confines magnifier within screen bounds", (tester) async { + tester.view + ..devicePixelRatio = 1.0 + ..platformDispatcher.textScaleFactorTestValue = 1.0 + ..physicalSize = const Size(400.0, 500.0); + + addTearDown(() => tester.platformDispatcher.clearAllTestValues()); + + await tester // + .createDocument() + .withSingleParagraph() + .useStylesheet(Stylesheet( + rules: defaultStylesheet.rules, + inlineTextStyler: (attributions, style) => _textStyleBuilder(attributions), + )) + .pump(); + + // Place the caret at "Duis aute|" (line 6). + await tester.tapInParagraph("1", 241); + + // // Press and drag the caret to the beginning of the line. + final gesture = await tester.pressDownOnCollapsedMobileHandle(); + for (int i = 1; i < 7; i++) { + await gesture.moveBy(const Offset(-12, 0)); + await tester.pump(); + } + + await tester.pump(); + await expectLater( + find.byType(MaterialApp), + matchesGoldenFileWithPixelAllowance("goldens/supereditor_android_magnifier_screen_edges.png", 52), + ); + + // Release the gesture. + await gesture.up(); + }); + }); +} + +TextStyle _textStyleBuilder(Set attributions) { + return const TextStyle( + color: Colors.black, + fontFamily: 'Roboto', + fontSize: 16, + height: 1.4, + ); +} diff --git a/super_editor/test_goldens/editor/mobile/supereditor_ios_overlay_controls_test.dart b/super_editor/test_goldens/editor/mobile/supereditor_ios_overlay_controls_test.dart new file mode 100644 index 0000000000..b3f0f8e07d --- /dev/null +++ b/super_editor/test_goldens/editor/mobile/supereditor_ios_overlay_controls_test.dart @@ -0,0 +1,55 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_test/flutter_test.dart'; +import 'package:golden_toolkit/golden_toolkit.dart'; +import 'package:super_editor/super_editor.dart'; +import 'package:super_editor/super_editor_test.dart'; + +import '../../../test/super_editor/supereditor_test_tools.dart'; +import '../../test_tools_goldens.dart'; + +void main() { + group("SuperEditor > iOS > overlay controls >", () { + testGoldensOniOS("confines magnifier within screen bounds", (tester) async { + tester.view + ..devicePixelRatio = 1.0 + ..platformDispatcher.textScaleFactorTestValue = 1.0 + ..physicalSize = const Size(400.0, 500.0); + + addTearDown(() => tester.platformDispatcher.clearAllTestValues()); + + await tester // + .createDocument() + .withSingleParagraph() + .useStylesheet(Stylesheet( + rules: defaultStylesheet.rules, + inlineTextStyler: (attributions, style) => _textStyleBuilder(attributions), + )) + .pump(); + + // Place the caret at "Duis aute|" (line 6). + await tester.tapInParagraph("1", 241); + + // Press and drag the caret to the beginning of the line. + final gesture = await tester.tapDownInParagraph("1", 241); + for (int i = 1; i < 7; i++) { + await gesture.moveBy(const Offset(-12, 0)); + await tester.pump(); + } + + await screenMatchesGolden(tester, 'supereditor_ios_magnifier_screen_edges'); + + // Resolve the gesture so that we don't have pending gesture timers. + await gesture.up(); + await tester.pump(const Duration(milliseconds: 100)); + }); + }); +} + +TextStyle _textStyleBuilder(Set attributions) { + return const TextStyle( + color: Colors.black, + fontFamily: 'Roboto', + fontSize: 16, + height: 1.4, + ); +} diff --git a/super_editor/test_goldens/super_textfield/goldens/super_textfield_android_magnifier_screen_edges.png b/super_editor/test_goldens/super_textfield/goldens/super_textfield_android_magnifier_screen_edges.png new file mode 100644 index 0000000000000000000000000000000000000000..cf998e62546fb43a187c94502baf2069ba8a7122 GIT binary patch literal 9494 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 literal 0 HcmV?d00001 diff --git a/super_editor/test_goldens/super_textfield/goldens/super_textfield_ios_magnifier_screen_edges.png b/super_editor/test_goldens/super_textfield/goldens/super_textfield_ios_magnifier_screen_edges.png new file mode 100644 index 0000000000000000000000000000000000000000..8ae6ab59c3b037d836f5563d8beaaf477b4caeb9 GIT binary patch literal 11837 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 Android > overlay controls >", () { + testGoldensOnAndroid("confines magnifier within screen bounds", (tester) async { + tester.view + ..devicePixelRatio = 1.0 + ..platformDispatcher.textScaleFactorTestValue = 1.0 + ..physicalSize = const Size(400.0, 500.0); + + addTearDown(() => tester.platformDispatcher.clearAllTestValues()); + + final controller = AttributedTextEditingController( + text: AttributedText('Lorem ipsum dolor sit amet'), + ); + + await tester.pumpWidget( + MaterialApp( + home: Scaffold( + body: Center( + child: SizedBox( + width: double.infinity, + child: SuperTextField( + textController: controller, + padding: const EdgeInsets.all(20), + textStyleBuilder: (_) => const TextStyle( + color: Colors.black, + // Use Roboto so that goldens show real text + fontFamily: 'Roboto', + ), + ), + ), + ), + ), + debugShowCheckedModeBanner: false, + ), + ); + + // Place the caret at the end of the textfield. + await tester.placeCaretInSuperTextField(30); + + // Press and drag the caret to the beginning of the line. + final gesture = await tester.dragCaretByDistanceInSuperTextField(const Offset(-200, 0)); + await tester.pump(); + + await expectLater( + find.byType(MaterialApp), + matchesGoldenFileWithPixelAllowance("goldens/super_textfield_android_magnifier_screen_edges.png", 38), + ); + + // Release the gesture. + await gesture.up(); + }); + }); +} diff --git a/super_editor/test_goldens/super_textfield/super_textfield_ios_overlay_controls_test.dart b/super_editor/test_goldens/super_textfield/super_textfield_ios_overlay_controls_test.dart new file mode 100644 index 0000000000..d9ac59463a --- /dev/null +++ b/super_editor/test_goldens/super_textfield/super_textfield_ios_overlay_controls_test.dart @@ -0,0 +1,60 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_test/flutter_test.dart'; +import 'package:super_editor/super_editor.dart'; + +import '../../test/super_textfield/super_textfield_robot.dart'; +import '../test_tools_goldens.dart'; + +void main() { + group("SuperTextField > iOS > overlay controls >", () { + testGoldensOniOS("confines magnifier within screen bounds", (tester) async { + tester.view + ..devicePixelRatio = 1.0 + ..platformDispatcher.textScaleFactorTestValue = 1.0 + ..physicalSize = const Size(400.0, 500.0); + + addTearDown(() => tester.platformDispatcher.clearAllTestValues()); + + final controller = AttributedTextEditingController( + text: AttributedText('Lorem ipsum dolor sit amet'), + ); + + await tester.pumpWidget( + MaterialApp( + home: Scaffold( + body: Center( + child: SizedBox( + width: double.infinity, + child: SuperTextField( + textController: controller, + padding: const EdgeInsets.all(20), + textStyleBuilder: (_) => const TextStyle( + color: Colors.black, + // Use Roboto so that goldens show real text + fontFamily: 'Roboto', + ), + ), + ), + ), + ), + debugShowCheckedModeBanner: false, + ), + ); + + // Place the caret at the end of the textfield. + await tester.placeCaretInSuperTextField(30); + + // Press and drag the caret to the beginning of the line. + final gesture = await tester.dragCaretByDistanceInSuperTextField(const Offset(-200, 0)); + await tester.pump(); + + await expectLater( + find.byType(MaterialApp), + matchesGoldenFileWithPixelAllowance("goldens/super_textfield_ios_magnifier_screen_edges.png", 4), + ); + + // Release the gesture. + await gesture.up(); + }); + }); +}