From d648f2b5b924583acc1bd1de300f67db6370e5a2 Mon Sep 17 00:00:00 2001 From: "Lucas.Xu" Date: Fri, 23 Sep 2022 23:08:48 +0800 Subject: [PATCH] fix: merge current text node's children to previous text node --- .../backspace_handler.dart | 74 +++++++------------ 1 file changed, 25 insertions(+), 49 deletions(-) diff --git a/frontend/app_flowy/packages/appflowy_editor/lib/src/service/internal_key_event_handlers/backspace_handler.dart b/frontend/app_flowy/packages/appflowy_editor/lib/src/service/internal_key_event_handlers/backspace_handler.dart index fad5bb7337..c9504918af 100644 --- a/frontend/app_flowy/packages/appflowy_editor/lib/src/service/internal_key_event_handlers/backspace_handler.dart +++ b/frontend/app_flowy/packages/appflowy_editor/lib/src/service/internal_key_event_handlers/backspace_handler.dart @@ -2,7 +2,6 @@ import 'package:appflowy_editor/src/service/internal_key_event_handlers/number_l import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; import 'package:appflowy_editor/appflowy_editor.dart'; -import 'package:appflowy_editor/src/extensions/path_extensions.dart'; // Handle delete text. ShortcutEventHandler deleteTextHandler = (editorState, event) { @@ -128,33 +127,38 @@ KeyEventResult _backDeleteToPreviousTextNode( Selection selection, ) { // Not reach to the root. - if (textNode.parent?.parent != null) { - transactionBuilder - ..deleteNode(textNode) - ..insertNode(textNode.parent!.path.next, textNode) - ..afterSelection = Selection.collapsed( - Position(path: textNode.parent!.path.next, offset: 0), - ) - ..commit(); - return KeyEventResult.handled; - } + // if (textNode.parent?.parent != null) { + // transactionBuilder + // ..deleteNode(textNode) + // ..insertNode(textNode.parent!.path.next, textNode) + // ..afterSelection = Selection.collapsed( + // Position(path: textNode.parent!.path.next, offset: 0), + // ) + // ..commit(); + // return KeyEventResult.handled; + // } bool prevIsNumberList = false; - final previousTextNode = _closestTextNode(textNode.previous); - if (previousTextNode != null && previousTextNode is TextNode) { + final previousTextNode = forwardNearestTextNode(textNode); + if (previousTextNode != null) { if (previousTextNode.subtype == BuiltInAttributeKey.numberList) { prevIsNumberList = true; } - transactionBuilder - ..mergeText(previousTextNode, textNode) - ..deleteNode(textNode) - ..afterSelection = Selection.collapsed( - Position( - path: previousTextNode.path, - offset: previousTextNode.toRawString().length, - ), + transactionBuilder.mergeText(previousTextNode, textNode); + transactionBuilder.deleteNode(textNode); + if (textNode.children.isNotEmpty) { + transactionBuilder.insertNodes( + previousTextNode.path + [0], + textNode.children.toList(growable: false), ); + } + transactionBuilder.afterSelection = Selection.collapsed( + Position( + path: previousTextNode.path, + offset: previousTextNode.toRawString().length, + ), + ); } if (transactionBuilder.operations.isNotEmpty) { @@ -271,24 +275,6 @@ void _deleteTextNodes(TransactionBuilder transactionBuilder, } // TODO: Just a simple solution for textNode, need to be optimized. -Node? _closestTextNode(Node? node) { - if (node is TextNode) { - var children = node.children; - if (children.isEmpty) { - return node; - } - var last = children.last; - while (last.children.isNotEmpty) { - last = children.last; - } - return last; - } - if (node?.previous != null) { - return _closestTextNode(node!.previous!); - } - return null; -} - TextNode? findLastTextNode(Node node) { final children = node.children.toList(growable: false).reversed; for (final child in children) { @@ -330,13 +316,3 @@ TextNode? forwardNearestTextNode(Node node) { } return null; } - -Node? _forwardNearestTextNode(Node node) { - if (node is TextNode) { - return node; - } - if (node.next != null) { - return _forwardNearestTextNode(node.next!); - } - return null; -}