Selaa lähdekoodia

feat: implement delete multiple text node and merge the text.

Lucas.Xu 2 vuotta sitten
vanhempi
commit
b577489c2f

+ 4 - 0
frontend/app_flowy/packages/flowy_editor/lib/operation/transaction_builder.dart

@@ -48,6 +48,10 @@ class TransactionBuilder {
     add(DeleteOperation(path: node.path, removedValue: node));
     add(DeleteOperation(path: node.path, removedValue: node));
   }
   }
 
 
+  deleteNodes(List<Node> nodes) {
+    nodes.forEach(deleteNode);
+  }
+
   textEdit(TextNode node, Delta Function() f) {
   textEdit(TextNode node, Delta Function() f) {
     beforeSelection = state.cursorSelection;
     beforeSelection = state.cursorSelection;
     final path = node.path;
     final path = node.path;

+ 13 - 18
frontend/app_flowy/packages/flowy_editor/lib/service/internal_key_event_handlers/delele_text_handler.dart

@@ -57,24 +57,19 @@ FlowyKeyEventHandler deleteTextHandler = (editorState, event) {
       );
       );
     }
     }
   } else {
   } else {
-    for (var i = 0; i < textNodes.length; i++) {
-      final textNode = textNodes[i];
-      if (i == 0) {
-        transactionBuilder.deleteText(
-          textNode,
-          selection.start.offset,
-          textNode.toRawString().length - selection.start.offset,
-        );
-      } else if (i == textNodes.length - 1) {
-        transactionBuilder.deleteText(
-          textNode,
-          0,
-          selection.end.offset,
-        );
-      } else {
-        transactionBuilder.deleteNode(textNode);
-      }
-    }
+    final first = textNodes.first;
+    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(
+        first,
+        selection.start.offset,
+        first.toRawString().length - selection.start.offset,
+        content,
+      );
   }
   }
 
 
   transactionBuilder.commit();
   transactionBuilder.commit();