Skip to content

Commit d648f2b

Browse files
committed
fix: merge current text node's children to previous text node
1 parent ab35355 commit d648f2b

File tree

1 file changed

+25
-49
lines changed

1 file changed

+25
-49
lines changed

frontend/app_flowy/packages/appflowy_editor/lib/src/service/internal_key_event_handlers/backspace_handler.dart

Lines changed: 25 additions & 49 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@ import 'package:appflowy_editor/src/service/internal_key_event_handlers/number_l
22
import 'package:flutter/material.dart';
33
import 'package:flutter/services.dart';
44
import 'package:appflowy_editor/appflowy_editor.dart';
5-
import 'package:appflowy_editor/src/extensions/path_extensions.dart';
65

76
// Handle delete text.
87
ShortcutEventHandler deleteTextHandler = (editorState, event) {
@@ -128,33 +127,38 @@ KeyEventResult _backDeleteToPreviousTextNode(
128127
Selection selection,
129128
) {
130129
// Not reach to the root.
131-
if (textNode.parent?.parent != null) {
132-
transactionBuilder
133-
..deleteNode(textNode)
134-
..insertNode(textNode.parent!.path.next, textNode)
135-
..afterSelection = Selection.collapsed(
136-
Position(path: textNode.parent!.path.next, offset: 0),
137-
)
138-
..commit();
139-
return KeyEventResult.handled;
140-
}
130+
// if (textNode.parent?.parent != null) {
131+
// transactionBuilder
132+
// ..deleteNode(textNode)
133+
// ..insertNode(textNode.parent!.path.next, textNode)
134+
// ..afterSelection = Selection.collapsed(
135+
// Position(path: textNode.parent!.path.next, offset: 0),
136+
// )
137+
// ..commit();
138+
// return KeyEventResult.handled;
139+
// }
141140

142141
bool prevIsNumberList = false;
143-
final previousTextNode = _closestTextNode(textNode.previous);
144-
if (previousTextNode != null && previousTextNode is TextNode) {
142+
final previousTextNode = forwardNearestTextNode(textNode);
143+
if (previousTextNode != null) {
145144
if (previousTextNode.subtype == BuiltInAttributeKey.numberList) {
146145
prevIsNumberList = true;
147146
}
148147

149-
transactionBuilder
150-
..mergeText(previousTextNode, textNode)
151-
..deleteNode(textNode)
152-
..afterSelection = Selection.collapsed(
153-
Position(
154-
path: previousTextNode.path,
155-
offset: previousTextNode.toRawString().length,
156-
),
148+
transactionBuilder.mergeText(previousTextNode, textNode);
149+
transactionBuilder.deleteNode(textNode);
150+
if (textNode.children.isNotEmpty) {
151+
transactionBuilder.insertNodes(
152+
previousTextNode.path + [0],
153+
textNode.children.toList(growable: false),
157154
);
155+
}
156+
transactionBuilder.afterSelection = Selection.collapsed(
157+
Position(
158+
path: previousTextNode.path,
159+
offset: previousTextNode.toRawString().length,
160+
),
161+
);
158162
}
159163

160164
if (transactionBuilder.operations.isNotEmpty) {
@@ -271,24 +275,6 @@ void _deleteTextNodes(TransactionBuilder transactionBuilder,
271275
}
272276

273277
// TODO: Just a simple solution for textNode, need to be optimized.
274-
Node? _closestTextNode(Node? node) {
275-
if (node is TextNode) {
276-
var children = node.children;
277-
if (children.isEmpty) {
278-
return node;
279-
}
280-
var last = children.last;
281-
while (last.children.isNotEmpty) {
282-
last = children.last;
283-
}
284-
return last;
285-
}
286-
if (node?.previous != null) {
287-
return _closestTextNode(node!.previous!);
288-
}
289-
return null;
290-
}
291-
292278
TextNode? findLastTextNode(Node node) {
293279
final children = node.children.toList(growable: false).reversed;
294280
for (final child in children) {
@@ -330,13 +316,3 @@ TextNode? forwardNearestTextNode(Node node) {
330316
}
331317
return null;
332318
}
333-
334-
Node? _forwardNearestTextNode(Node node) {
335-
if (node is TextNode) {
336-
return node;
337-
}
338-
if (node.next != null) {
339-
return _forwardNearestTextNode(node.next!);
340-
}
341-
return null;
342-
}

0 commit comments

Comments
 (0)