Update clipboard status on cut (#92167)
Cut now explicitly updates the clipboard status.
This commit is contained in:
parent
8865212254
commit
33e261c0a2
@ -55,7 +55,7 @@ class _CupertinoDesktopTextSelectionControls extends TextSelectionControls {
|
|||||||
clipboardStatus: clipboardStatus,
|
clipboardStatus: clipboardStatus,
|
||||||
endpoints: endpoints,
|
endpoints: endpoints,
|
||||||
globalEditableRegion: globalEditableRegion,
|
globalEditableRegion: globalEditableRegion,
|
||||||
handleCut: canCut(delegate) ? () => handleCut(delegate) : null,
|
handleCut: canCut(delegate) ? () => handleCut(delegate, clipboardStatus) : null,
|
||||||
handleCopy: canCopy(delegate) ? () => handleCopy(delegate, clipboardStatus) : null,
|
handleCopy: canCopy(delegate) ? () => handleCopy(delegate, clipboardStatus) : null,
|
||||||
handlePaste: canPaste(delegate) ? () => handlePaste(delegate) : null,
|
handlePaste: canPaste(delegate) ? () => handlePaste(delegate) : null,
|
||||||
handleSelectAll: canSelectAll(delegate) ? () => handleSelectAll(delegate) : null,
|
handleSelectAll: canSelectAll(delegate) ? () => handleSelectAll(delegate) : null,
|
||||||
|
@ -236,7 +236,7 @@ class CupertinoTextSelectionControls extends TextSelectionControls {
|
|||||||
clipboardStatus: clipboardStatus,
|
clipboardStatus: clipboardStatus,
|
||||||
endpoints: endpoints,
|
endpoints: endpoints,
|
||||||
globalEditableRegion: globalEditableRegion,
|
globalEditableRegion: globalEditableRegion,
|
||||||
handleCut: canCut(delegate) ? () => handleCut(delegate) : null,
|
handleCut: canCut(delegate) ? () => handleCut(delegate, clipboardStatus) : null,
|
||||||
handleCopy: canCopy(delegate) ? () => handleCopy(delegate, clipboardStatus) : null,
|
handleCopy: canCopy(delegate) ? () => handleCopy(delegate, clipboardStatus) : null,
|
||||||
handlePaste: canPaste(delegate) ? () => handlePaste(delegate) : null,
|
handlePaste: canPaste(delegate) ? () => handlePaste(delegate) : null,
|
||||||
handleSelectAll: canSelectAll(delegate) ? () => handleSelectAll(delegate) : null,
|
handleSelectAll: canSelectAll(delegate) ? () => handleSelectAll(delegate) : null,
|
||||||
|
@ -41,7 +41,7 @@ class _DesktopTextSelectionControls extends TextSelectionControls {
|
|||||||
clipboardStatus: clipboardStatus,
|
clipboardStatus: clipboardStatus,
|
||||||
endpoints: endpoints,
|
endpoints: endpoints,
|
||||||
globalEditableRegion: globalEditableRegion,
|
globalEditableRegion: globalEditableRegion,
|
||||||
handleCut: canCut(delegate) ? () => handleCut(delegate) : null,
|
handleCut: canCut(delegate) ? () => handleCut(delegate, clipboardStatus) : null,
|
||||||
handleCopy: canCopy(delegate) ? () => handleCopy(delegate, clipboardStatus) : null,
|
handleCopy: canCopy(delegate) ? () => handleCopy(delegate, clipboardStatus) : null,
|
||||||
handlePaste: canPaste(delegate) ? () => handlePaste(delegate) : null,
|
handlePaste: canPaste(delegate) ? () => handlePaste(delegate) : null,
|
||||||
handleSelectAll: canSelectAll(delegate) ? () => handleSelectAll(delegate) : null,
|
handleSelectAll: canSelectAll(delegate) ? () => handleSelectAll(delegate) : null,
|
||||||
|
@ -45,7 +45,7 @@ class MaterialTextSelectionControls extends TextSelectionControls {
|
|||||||
endpoints: endpoints,
|
endpoints: endpoints,
|
||||||
delegate: delegate,
|
delegate: delegate,
|
||||||
clipboardStatus: clipboardStatus,
|
clipboardStatus: clipboardStatus,
|
||||||
handleCut: canCut(delegate) ? () => handleCut(delegate) : null,
|
handleCut: canCut(delegate) ? () => handleCut(delegate, clipboardStatus) : null,
|
||||||
handleCopy: canCopy(delegate) ? () => handleCopy(delegate, clipboardStatus) : null,
|
handleCopy: canCopy(delegate) ? () => handleCopy(delegate, clipboardStatus) : null,
|
||||||
handlePaste: canPaste(delegate) ? () => handlePaste(delegate) : null,
|
handlePaste: canPaste(delegate) ? () => handlePaste(delegate) : null,
|
||||||
handleSelectAll: canSelectAll(delegate) ? () => handleSelectAll(delegate) : null,
|
handleSelectAll: canSelectAll(delegate) ? () => handleSelectAll(delegate) : null,
|
||||||
|
@ -2808,7 +2808,7 @@ class EditableTextState extends State<EditableText> with AutomaticKeepAliveClien
|
|||||||
|
|
||||||
VoidCallback? _semanticsOnCut(TextSelectionControls? controls) {
|
VoidCallback? _semanticsOnCut(TextSelectionControls? controls) {
|
||||||
return widget.selectionEnabled && cutEnabled && _hasFocus && controls?.canCut(this) == true
|
return widget.selectionEnabled && cutEnabled && _hasFocus && controls?.canCut(this) == true
|
||||||
? () => controls!.handleCut(this)
|
? () => controls!.handleCut(this, _clipboardStatus)
|
||||||
: null;
|
: null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -204,8 +204,9 @@ abstract class TextSelectionControls {
|
|||||||
///
|
///
|
||||||
/// This is called by subclasses when their cut affordance is activated by
|
/// This is called by subclasses when their cut affordance is activated by
|
||||||
/// the user.
|
/// the user.
|
||||||
void handleCut(TextSelectionDelegate delegate) {
|
void handleCut(TextSelectionDelegate delegate, ClipboardStatusNotifier? clipboardStatus) {
|
||||||
delegate.cutSelection(SelectionChangedCause.toolbar);
|
delegate.cutSelection(SelectionChangedCause.toolbar);
|
||||||
|
clipboardStatus?.update();
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Call [TextSelectionDelegate.copySelection] to copy current selection.
|
/// Call [TextSelectionDelegate.copySelection] to copy current selection.
|
||||||
|
@ -8724,7 +8724,7 @@ class MockTextSelectionControls extends Fake implements TextSelectionControls {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@override
|
@override
|
||||||
void handleCut(TextSelectionDelegate delegate) {
|
void handleCut(TextSelectionDelegate delegate, ClipboardStatusNotifier? clipboardStatus) {
|
||||||
cutCount += 1;
|
cutCount += 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -759,6 +759,28 @@ void main() {
|
|||||||
});
|
});
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
|
group('TextSelectionControls', () {
|
||||||
|
test('ClipboardStatusNotifier is updated on handleCut', () async {
|
||||||
|
final FakeClipboardStatusNotifier clipboardStatus = FakeClipboardStatusNotifier();
|
||||||
|
final FakeTextSelectionDelegate delegate = FakeTextSelectionDelegate();
|
||||||
|
final CustomTextSelectionControls textSelectionControls = CustomTextSelectionControls();
|
||||||
|
|
||||||
|
expect(clipboardStatus.updateCalled, false);
|
||||||
|
textSelectionControls.handleCut(delegate, clipboardStatus);
|
||||||
|
expect(clipboardStatus.updateCalled, true);
|
||||||
|
});
|
||||||
|
|
||||||
|
test('ClipboardStatusNotifier is updated on handleCopy', () async {
|
||||||
|
final FakeClipboardStatusNotifier clipboardStatus = FakeClipboardStatusNotifier();
|
||||||
|
final FakeTextSelectionDelegate delegate = FakeTextSelectionDelegate();
|
||||||
|
final CustomTextSelectionControls textSelectionControls = CustomTextSelectionControls();
|
||||||
|
|
||||||
|
expect(clipboardStatus.updateCalled, false);
|
||||||
|
textSelectionControls.handleCopy(delegate, clipboardStatus);
|
||||||
|
expect(clipboardStatus.updateCalled, true);
|
||||||
|
});
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
class FakeTextSelectionGestureDetectorBuilderDelegate implements TextSelectionGestureDetectorBuilderDelegate {
|
class FakeTextSelectionGestureDetectorBuilderDelegate implements TextSelectionGestureDetectorBuilderDelegate {
|
||||||
@ -872,3 +894,55 @@ class FakeRenderEditable extends RenderEditable {
|
|||||||
selectWordCalled = true;
|
selectWordCalled = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
class CustomTextSelectionControls extends TextSelectionControls {
|
||||||
|
@override
|
||||||
|
Widget buildHandle(BuildContext context, TextSelectionHandleType type, double textLineHeight, [VoidCallback? onTap, double? startGlyphHeight, double? endGlyphHeight]) {
|
||||||
|
throw UnimplementedError();
|
||||||
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
Widget buildToolbar(
|
||||||
|
BuildContext context,
|
||||||
|
Rect globalEditableRegion,
|
||||||
|
double textLineHeight,
|
||||||
|
Offset position,
|
||||||
|
List<TextSelectionPoint> endpoints,
|
||||||
|
TextSelectionDelegate delegate,
|
||||||
|
ClipboardStatusNotifier clipboardStatus,
|
||||||
|
Offset? lastSecondaryTapDownPosition,
|
||||||
|
) {
|
||||||
|
throw UnimplementedError();
|
||||||
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
Offset getHandleAnchor(TextSelectionHandleType type, double textLineHeight, [double? startGlyphHeight, double? endGlyphHeight]) {
|
||||||
|
throw UnimplementedError();
|
||||||
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
Size getHandleSize(double textLineHeight) {
|
||||||
|
throw UnimplementedError();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
class FakeClipboardStatusNotifier extends ClipboardStatusNotifier {
|
||||||
|
FakeClipboardStatusNotifier() : super(value: ClipboardStatus.unknown);
|
||||||
|
|
||||||
|
@override
|
||||||
|
bool get disposed => false;
|
||||||
|
|
||||||
|
bool updateCalled = false;
|
||||||
|
@override
|
||||||
|
Future<void> update() async {
|
||||||
|
updateCalled = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
class FakeTextSelectionDelegate extends Fake implements TextSelectionDelegate {
|
||||||
|
@override
|
||||||
|
void cutSelection(SelectionChangedCause cause) { }
|
||||||
|
|
||||||
|
@override
|
||||||
|
void copySelection(SelectionChangedCause cause) { }
|
||||||
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user