Fix copy/cut/paste/selectAll not working

pull/670/head
X Code 3 years ago
parent 1c73a172a4
commit 9004ec95ee
  1. 131
      lib/src/widgets/raw_editor.dart

@ -870,23 +870,27 @@ class RawEditorState extends EditorState
return true; return true;
} }
void _replaceText(ReplaceTextIntent intent) {
userUpdateTextEditingValue(
intent.currentTextEditingValue
.replaced(intent.replacementRange, intent.replacementText),
intent.cause,
);
}
/// Copy current selection to [Clipboard].
@override @override
void copySelection(SelectionChangedCause cause) { void copySelection(SelectionChangedCause cause) {
widget.controller.copiedImageUrl = null; widget.controller.copiedImageUrl = null;
_pastePlainText = widget.controller.getPlainText(); _pastePlainText = widget.controller.getPlainText();
_pasteStyle = widget.controller.getAllIndividualSelectionStyles(); _pasteStyle = widget.controller.getAllIndividualSelectionStyles();
// Copied straight from EditableTextState final selection = textEditingValue.selection;
void _copySelection(SelectionChangedCause cause) { final text = textEditingValue.text;
final selection = textEditingValue.selection; if (selection.isCollapsed) {
final text = textEditingValue.text; return;
if (selection.isCollapsed || !selection.isValid) {
return;
}
Clipboard.setData(ClipboardData(text: selection.textInside(text)));
} }
Clipboard.setData(ClipboardData(text: selection.textInside(text)));
_copySelection(cause);
if (cause == SelectionChangedCause.toolbar) { if (cause == SelectionChangedCause.toolbar) {
bringIntoView(textEditingValue.selection.extent); bringIntoView(textEditingValue.selection.extent);
@ -906,36 +910,23 @@ class RawEditorState extends EditorState
} }
} }
/// Cut current selection to [Clipboard].
@override @override
void cutSelection(SelectionChangedCause cause) { void cutSelection(SelectionChangedCause cause) {
widget.controller.copiedImageUrl = null; widget.controller.copiedImageUrl = null;
_pastePlainText = widget.controller.getPlainText(); _pastePlainText = widget.controller.getPlainText();
_pasteStyle = widget.controller.getAllIndividualSelectionStyles(); _pasteStyle = widget.controller.getAllIndividualSelectionStyles();
// Copied straight from EditableTextState if (widget.readOnly) {
void _cutSelection(SelectionChangedCause cause) { return;
final selection = textEditingValue.selection;
if (widget.readOnly || !selection.isValid) {
return;
}
final text = textEditingValue.text;
if (selection.isCollapsed) {
return;
}
Clipboard.setData(ClipboardData(text: selection.textInside(text)));
userUpdateTextEditingValue(
TextEditingValue(
text: selection.textBefore(text) + selection.textAfter(text),
selection: TextSelection.collapsed(
offset: math.min(selection.start, selection.end),
affinity: selection.affinity,
),
),
cause,
);
} }
final selection = textEditingValue.selection;
_cutSelection(cause); final text = textEditingValue.text;
if (selection.isCollapsed) {
return;
}
Clipboard.setData(ClipboardData(text: selection.textInside(text)));
_replaceText(ReplaceTextIntent(textEditingValue, '', selection, cause));
if (cause == SelectionChangedCause.toolbar) { if (cause == SelectionChangedCause.toolbar) {
bringIntoView(textEditingValue.selection.extent); bringIntoView(textEditingValue.selection.extent);
@ -943,8 +934,13 @@ class RawEditorState extends EditorState
} }
} }
/// Paste text from [Clipboard].
@override @override
Future<void> pasteText(SelectionChangedCause cause) async { Future<void> pasteText(SelectionChangedCause cause) async {
if (widget.readOnly) {
return;
}
if (widget.controller.copiedImageUrl != null) { if (widget.controller.copiedImageUrl != null) {
final index = textEditingValue.selection.baseOffset; final index = textEditingValue.selection.baseOffset;
final length = textEditingValue.selection.extentOffset - index; final length = textEditingValue.selection.extentOffset - index;
@ -962,38 +958,19 @@ class RawEditorState extends EditorState
return; return;
} }
// Copied straight from EditableTextState final selection = textEditingValue.selection;
Future<void> pasteText(SelectionChangedCause cause) async { if (!selection.isValid) {
final selection = textEditingValue.selection; return;
if (widget.readOnly || !selection.isValid) { }
return; // Snapshot the input before using `await`.
} // See https://github.com/flutter/flutter/issues/11427
final text = textEditingValue.text; final data = await Clipboard.getData(Clipboard.kTextPlain);
if (!selection.isValid) { if (data == null) {
return; return;
}
// Snapshot the input before using `await`.
// See https://github.com/flutter/flutter/issues/11427
final data = await Clipboard.getData(Clipboard.kTextPlain);
if (data == null) {
return;
}
userUpdateTextEditingValue(
TextEditingValue(
text: selection.textBefore(text) +
data.text! +
selection.textAfter(text),
selection: TextSelection.collapsed(
offset:
math.min(selection.start, selection.end) + data.text!.length,
affinity: selection.affinity,
),
),
cause,
);
} }
pasteText(cause); // ignore: unawaited_futures _replaceText(
ReplaceTextIntent(textEditingValue, data.text!, selection, cause));
if (cause == SelectionChangedCause.toolbar) { if (cause == SelectionChangedCause.toolbar) {
bringIntoView(textEditingValue.selection.extent); bringIntoView(textEditingValue.selection.extent);
@ -1001,30 +978,16 @@ class RawEditorState extends EditorState
} }
} }
void _setSelection(TextSelection nextSelection, SelectionChangedCause cause) { /// Select the entire text value.
if (nextSelection == textEditingValue.selection) { @override
return; void selectAll(SelectionChangedCause cause) {
}
userUpdateTextEditingValue( userUpdateTextEditingValue(
textEditingValue.copyWith(selection: nextSelection), textEditingValue.copyWith(
selection: TextSelection(
baseOffset: 0, extentOffset: textEditingValue.text.length),
),
cause, cause,
); );
}
@override
void selectAll(SelectionChangedCause cause) {
// Copied straight from EditableTextState
void _selectAll(SelectionChangedCause cause) {
_setSelection(
textEditingValue.selection.copyWith(
baseOffset: 0,
extentOffset: textEditingValue.text.length,
),
cause,
);
}
_selectAll(cause);
if (cause == SelectionChangedCause.toolbar) { if (cause == SelectionChangedCause.toolbar) {
bringIntoView(textEditingValue.selection.extent); bringIntoView(textEditingValue.selection.extent);

Loading…
Cancel
Save