Fix copy/cut/paste/selectAll not working

pull/670/head
X Code 3 years ago
parent 1c73a172a4
commit 9004ec95ee
  1. 89
      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
void _copySelection(SelectionChangedCause cause) {
final selection = textEditingValue.selection; final selection = textEditingValue.selection;
final text = textEditingValue.text; final text = textEditingValue.text;
if (selection.isCollapsed || !selection.isValid) { if (selection.isCollapsed) {
return; 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) {
final selection = textEditingValue.selection;
if (widget.readOnly || !selection.isValid) {
return; return;
} }
final selection = textEditingValue.selection;
final text = textEditingValue.text; final text = textEditingValue.text;
if (selection.isCollapsed) { if (selection.isCollapsed) {
return; return;
} }
Clipboard.setData(ClipboardData(text: selection.textInside(text))); Clipboard.setData(ClipboardData(text: selection.textInside(text)));
userUpdateTextEditingValue( _replaceText(ReplaceTextIntent(textEditingValue, '', selection, cause));
TextEditingValue(
text: selection.textBefore(text) + selection.textAfter(text),
selection: TextSelection.collapsed(
offset: math.min(selection.start, selection.end),
affinity: selection.affinity,
),
),
cause,
);
}
_cutSelection(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,13 +958,7 @@ class RawEditorState extends EditorState
return; return;
} }
// Copied straight from EditableTextState
Future<void> pasteText(SelectionChangedCause cause) async {
final selection = textEditingValue.selection; final selection = textEditingValue.selection;
if (widget.readOnly || !selection.isValid) {
return;
}
final text = textEditingValue.text;
if (!selection.isValid) { if (!selection.isValid) {
return; return;
} }
@ -978,22 +968,9 @@ class RawEditorState extends EditorState
if (data == null) { if (data == null) {
return; 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) {
return;
}
userUpdateTextEditingValue(
textEditingValue.copyWith(selection: nextSelection),
cause,
);
}
@override @override
void selectAll(SelectionChangedCause cause) { void selectAll(SelectionChangedCause cause) {
// Copied straight from EditableTextState userUpdateTextEditingValue(
void _selectAll(SelectionChangedCause cause) { textEditingValue.copyWith(
_setSelection( selection: TextSelection(
textEditingValue.selection.copyWith( baseOffset: 0, extentOffset: textEditingValue.text.length),
baseOffset: 0,
extentOffset: textEditingValue.text.length,
), ),
cause, cause,
); );
}
_selectAll(cause);
if (cause == SelectionChangedCause.toolbar) { if (cause == SelectionChangedCause.toolbar) {
bringIntoView(textEditingValue.selection.extent); bringIntoView(textEditingValue.selection.extent);

Loading…
Cancel
Save