Unverified Commit 213bf37a authored by Justin McCandless's avatar Justin McCandless Committed by GitHub

Text handle drag swap on Apple platforms (#105069)

Dragging the base text selection handle on Apple makes it the extent.
parent d8783ff4
...@@ -459,14 +459,32 @@ class TextSelectionOverlay { ...@@ -459,14 +459,32 @@ class TextSelectionOverlay {
return; return;
} }
final TextSelection newSelection = TextSelection( final TextSelection newSelection;
switch (defaultTargetPlatform) {
// On Apple platforms, dragging the base handle makes it the extent.
case TargetPlatform.iOS:
case TargetPlatform.macOS:
newSelection = TextSelection(
extentOffset: position.offset,
baseOffset: _selection.start,
);
if (position.offset <= _selection.start) {
return; // Don't allow order swapping.
}
break;
case TargetPlatform.android:
case TargetPlatform.fuchsia:
case TargetPlatform.linux:
case TargetPlatform.windows:
newSelection = TextSelection(
baseOffset: _selection.baseOffset, baseOffset: _selection.baseOffset,
extentOffset: position.offset, extentOffset: position.offset,
); );
if (newSelection.baseOffset >= newSelection.extentOffset) { if (newSelection.baseOffset >= newSelection.extentOffset) {
return; // Don't allow order swapping. return; // Don't allow order swapping.
} }
break;
}
_handleSelectionHandleChanged(newSelection, isEnd: true); _handleSelectionHandleChanged(newSelection, isEnd: true);
} }
...@@ -489,14 +507,32 @@ class TextSelectionOverlay { ...@@ -489,14 +507,32 @@ class TextSelectionOverlay {
return; return;
} }
final TextSelection newSelection = TextSelection( final TextSelection newSelection;
switch (defaultTargetPlatform) {
// On Apple platforms, dragging the base handle makes it the extent.
case TargetPlatform.iOS:
case TargetPlatform.macOS:
newSelection = TextSelection(
extentOffset: position.offset,
baseOffset: _selection.end,
);
if (newSelection.extentOffset >= _selection.end) {
return; // Don't allow order swapping.
}
break;
case TargetPlatform.android:
case TargetPlatform.fuchsia:
case TargetPlatform.linux:
case TargetPlatform.windows:
newSelection = TextSelection(
baseOffset: position.offset, baseOffset: position.offset,
extentOffset: _selection.extentOffset, extentOffset: _selection.extentOffset,
); );
if (newSelection.baseOffset >= newSelection.extentOffset) { if (newSelection.baseOffset >= newSelection.extentOffset) {
return; // Don't allow order swapping. return; // Don't allow order swapping.
} }
break;
}
_handleSelectionHandleChanged(newSelection, isEnd: false); _handleSelectionHandleChanged(newSelection, isEnd: false);
} }
...@@ -1116,7 +1152,6 @@ class _SelectionHandleOverlay extends StatefulWidget { ...@@ -1116,7 +1152,6 @@ class _SelectionHandleOverlay extends StatefulWidget {
} }
class _SelectionHandleOverlayState extends State<_SelectionHandleOverlay> with SingleTickerProviderStateMixin { class _SelectionHandleOverlayState extends State<_SelectionHandleOverlay> with SingleTickerProviderStateMixin {
late AnimationController _controller; late AnimationController _controller;
Animation<double> get _opacity => _controller.view; Animation<double> get _opacity => _controller.view;
......
...@@ -2077,7 +2077,7 @@ void main() { ...@@ -2077,7 +2077,7 @@ void main() {
expect(selection.extentOffset, 7); expect(selection.extentOffset, 7);
final RenderEditable renderEditable = findRenderEditable(tester); final RenderEditable renderEditable = findRenderEditable(tester);
final List<TextSelectionPoint> endpoints = globalize( List<TextSelectionPoint> endpoints = globalize(
renderEditable.getEndpointsForSelection(selection), renderEditable.getEndpointsForSelection(selection),
renderEditable, renderEditable,
); );
...@@ -2100,6 +2100,36 @@ void main() { ...@@ -2100,6 +2100,36 @@ void main() {
// Drag the left handle 2 letters to the left. // Drag the left handle 2 letters to the left.
handlePos = endpoints[0].point + const Offset(-1.0, 1.0); handlePos = endpoints[0].point + const Offset(-1.0, 1.0);
newHandlePos = textOffsetToPosition(tester, 2);
gesture = await tester.startGesture(handlePos, pointer: 7);
await tester.pump();
await gesture.moveTo(newHandlePos);
await tester.pump();
await gesture.up();
await tester.pump();
switch (defaultTargetPlatform) {
// On Apple platforms, dragging the base handle makes it the extent.
case TargetPlatform.iOS:
case TargetPlatform.macOS:
expect(controller.selection.baseOffset, 11);
expect(controller.selection.extentOffset, 2);
break;
case TargetPlatform.android:
case TargetPlatform.fuchsia:
case TargetPlatform.linux:
case TargetPlatform.windows:
expect(controller.selection.baseOffset, 2);
expect(controller.selection.extentOffset, 11);
break;
}
// Drag the left handle 2 letters to the left again.
endpoints = globalize(
renderEditable.getEndpointsForSelection(controller.selection),
renderEditable,
);
handlePos = endpoints[0].point + const Offset(-1.0, 1.0);
newHandlePos = textOffsetToPosition(tester, 0); newHandlePos = textOffsetToPosition(tester, 0);
gesture = await tester.startGesture(handlePos, pointer: 7); gesture = await tester.startGesture(handlePos, pointer: 7);
await tester.pump(); await tester.pump();
...@@ -2108,9 +2138,24 @@ void main() { ...@@ -2108,9 +2138,24 @@ void main() {
await gesture.up(); await gesture.up();
await tester.pump(); await tester.pump();
switch (defaultTargetPlatform) {
case TargetPlatform.iOS:
case TargetPlatform.macOS:
// The left handle was already the extent, and it remains so.
expect(controller.selection.baseOffset, 11);
expect(controller.selection.extentOffset, 0);
break;
case TargetPlatform.android:
case TargetPlatform.fuchsia:
case TargetPlatform.linux:
case TargetPlatform.windows:
expect(controller.selection.baseOffset, 0); expect(controller.selection.baseOffset, 0);
expect(controller.selection.extentOffset, 11); expect(controller.selection.extentOffset, 11);
}); break;
}
},
variant: TargetPlatformVariant.all(),
);
testWidgets('Cannot drag one handle past the other', (WidgetTester tester) async { testWidgets('Cannot drag one handle past the other', (WidgetTester tester) async {
final TextEditingController controller = TextEditingController(); final TextEditingController controller = TextEditingController();
......
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