From 58856ccb1ec1b3162d2dd6cb18d400fade58fa43 Mon Sep 17 00:00:00 2001 From: "Lucas.Xu" Date: Mon, 1 Aug 2022 11:29:04 +0800 Subject: [PATCH] feat: implement deleting text in multiple lines. --- .../flowy_editor/lib/document/text_delta.dart | 5 ++++ .../lib/operation/transaction_builder.dart | 24 +++++++++++++++++-- .../delele_text_handler.dart | 16 +++++-------- 3 files changed, 33 insertions(+), 12 deletions(-) diff --git a/frontend/app_flowy/packages/flowy_editor/lib/document/text_delta.dart b/frontend/app_flowy/packages/flowy_editor/lib/document/text_delta.dart index 2f3d194255..64335d4a05 100644 --- a/frontend/app_flowy/packages/flowy_editor/lib/document/text_delta.dart +++ b/frontend/app_flowy/packages/flowy_editor/lib/document/text_delta.dart @@ -275,6 +275,11 @@ class Delta { Delta([List? ops]) : operations = ops ?? []; + Delta addAll(List textOps) { + textOps.forEach(add); + return this; + } + Delta add(TextOperation textOp) { if (textOp.isEmpty) { return this; diff --git a/frontend/app_flowy/packages/flowy_editor/lib/operation/transaction_builder.dart b/frontend/app_flowy/packages/flowy_editor/lib/operation/transaction_builder.dart index 5c50a19c42..e70dfc411a 100644 --- a/frontend/app_flowy/packages/flowy_editor/lib/operation/transaction_builder.dart +++ b/frontend/app_flowy/packages/flowy_editor/lib/operation/transaction_builder.dart @@ -63,8 +63,28 @@ class TransactionBuilder { add(TextEditOperation(path: path, delta: delta, inverted: inverted)); } - insertText(TextNode node, int index, String content) { - textEdit(node, () => Delta().retain(index).insert(content)); + mergeText(TextNode firstNode, TextNode secondNode, + {int? firstOffset, int secondOffset = 0}) { + final firstLength = firstNode.delta.length; + final secondLength = secondNode.delta.length; + textEdit( + firstNode, + () => Delta() + ..retain(firstOffset ?? firstLength) + ..delete(firstLength - (firstOffset ?? firstLength)) + ..addAll(secondNode.delta.slice(secondOffset, secondLength).operations), + ); + afterSelection = Selection.collapsed( + Position( + path: firstNode.path, + offset: firstOffset ?? firstLength, + ), + ); + } + + insertText(TextNode node, int index, String content, + [Attributes? attributes]) { + textEdit(node, () => Delta().retain(index).insert(content, attributes)); afterSelection = Selection.collapsed( Position(path: node.path, offset: index + content.length)); } diff --git a/frontend/app_flowy/packages/flowy_editor/lib/service/internal_key_event_handlers/delele_text_handler.dart b/frontend/app_flowy/packages/flowy_editor/lib/service/internal_key_event_handlers/delele_text_handler.dart index 4ad34b3c08..498fd845b2 100644 --- a/frontend/app_flowy/packages/flowy_editor/lib/service/internal_key_event_handlers/delele_text_handler.dart +++ b/frontend/app_flowy/packages/flowy_editor/lib/service/internal_key_event_handlers/delele_text_handler.dart @@ -39,12 +39,7 @@ FlowyKeyEventHandler deleteTextHandler = (editorState, event) { final previous = textNode.previous as TextNode; transactionBuilder ..deleteNode(textNode) - ..insertText( - previous, - previous.toRawString().length, - textNode.toRawString(), - ); - // FIXME: keep the attributes. + ..mergeText(previous, textNode); break; } } @@ -66,17 +61,18 @@ FlowyKeyEventHandler deleteTextHandler = (editorState, event) { } } else { final first = textNodes.first; + final last = textNodes.last; var content = textNodes.last.toRawString(); content = content.substring(selection.end.offset, content.length); // Merge the fist and the last text node content, // and delete the all nodes expect for the first. transactionBuilder ..deleteNodes(textNodes.sublist(1)) - ..replaceText( + ..mergeText( first, - selection.start.offset, - first.toRawString().length - selection.start.offset, - content, + last, + firstOffset: selection.start.offset, + secondOffset: selection.end.offset, ); }