From 817b2e03bc8e235e7f24d5f5145cedb6f6ed61d8 Mon Sep 17 00:00:00 2001 From: Alan Mantoux Date: Sun, 11 Aug 2024 20:43:05 +0200 Subject: [PATCH] Adapt position with viewport offset when hit testing children (#399) --- .../fleather/lib/src/rendering/editor.dart | 3 +- .../fleather/test/widgets/editor_test.dart | 52 +++++++++++++++++++ 2 files changed, 54 insertions(+), 1 deletion(-) diff --git a/packages/fleather/lib/src/rendering/editor.dart b/packages/fleather/lib/src/rendering/editor.dart index 3fc17cb7..ce069de5 100644 --- a/packages/fleather/lib/src/rendering/editor.dart +++ b/packages/fleather/lib/src/rendering/editor.dart @@ -661,7 +661,8 @@ class RenderEditor extends RenderEditableContainerBox @override bool hitTestChildren(BoxHitTestResult result, {required Offset position}) { - return defaultHitTestChildren(result, position: position); + final Offset effectivePosition = position - paintOffset; + return defaultHitTestChildren(result, position: effectivePosition); } void _paintHandleLayers( diff --git a/packages/fleather/test/widgets/editor_test.dart b/packages/fleather/test/widgets/editor_test.dart index 692145b6..29272c54 100644 --- a/packages/fleather/test/widgets/editor_test.dart +++ b/packages/fleather/test/widgets/editor_test.dart @@ -1,5 +1,6 @@ import 'package:fleather/fleather.dart'; import 'package:fleather/src/services/spell_check_suggestions_toolbar.dart'; +import 'package:fleather/src/widgets/checkbox.dart'; import 'package:fleather/src/widgets/keyboard_listener.dart'; import 'package:fleather/src/widgets/text_selection.dart'; import 'package:flutter/cupertino.dart'; @@ -101,6 +102,57 @@ void main() { tester.view.viewInsets = FakeViewPadding.zero; }); + testWidgets('Allows children to capture events when scrolled', + (tester) async { + Delta generateDelta({required bool withBoxChecked}) { + var delta = Delta(); + List.generate(20, (_) => delta.insert('Test\n')); + return delta + ..insert('\n') + ..insert('some check box') + ..insert('\n', {'block': 'cl', 'checked': withBoxChecked}); + } + + final delta = generateDelta(withBoxChecked: false); + final controller = + FleatherController(document: ParchmentDocument.fromDelta(delta)); + final embedHeight = + (tester.view.physicalSize / tester.view.devicePixelRatio).height * + 1.5; + final scrollController = ScrollController(); + final editor = MaterialApp( + home: Scaffold( + body: Column( + children: [ + Expanded( + child: FleatherEditor( + controller: controller, + scrollController: scrollController, + embedBuilder: (context, node) => SizedBox( + width: 100, + height: embedHeight, + ), + ), + ), + ], + ), + ), + ); + await tester.pumpWidget(editor); + final renderEditor = + tester.state(find.byType(RawEditor)).renderEditor; + scrollController.jumpTo(scrollController.position.maxScrollExtent); + await tester.pumpAndSettle(); + final checkBox = find.byType(FleatherCheckbox); + expect(checkBox, findsOneWidget); + await tester.tapAt(tester.getCenter(checkBox) + renderEditor.paintOffset); + await tester.pumpAndSettle(); + tester.binding.scheduleWarmUpFrame(); + await tester.pumpAndSettle(); + expect( + controller.document.toDelta(), generateDelta(withBoxChecked: true)); + }); + testWidgets('Keep selectiontoolbar with editor bounds', (tester) async { final delta = Delta(); for (int i = 0; i < 30; i++) {