소스 검색

Merge pull request #763 from AppFlowy-IO/refactor/use-node-iterator-for-selection

Refactor: use node iterator for selection
Nathan.fooo 2 년 전
부모
커밋
60072c5ae2

+ 10 - 0
frontend/app_flowy/packages/flowy_editor/lib/document/node_iterator.dart

@@ -61,4 +61,14 @@ class NodeIterator implements Iterator<Node> {
   Node get current {
     return _currentNode!;
   }
+
+  List<Node> toList() {
+    final result = <Node>[];
+
+    while (moveNext()) {
+      result.add(current);
+    }
+
+    return result;
+  }
 }

+ 9 - 14
frontend/app_flowy/packages/flowy_editor/lib/service/selection_service.dart

@@ -1,5 +1,7 @@
 import 'dart:async';
 
+import 'package:flowy_editor/document/node_iterator.dart';
+import 'package:flowy_editor/document/state_tree.dart';
 import 'package:flutter/gestures.dart';
 import 'package:flutter/material.dart';
 
@@ -212,7 +214,7 @@ class _FlowySelectionState extends State<FlowySelection>
 
   @override
   List<Node> getNodesInSelection(Selection selection) =>
-      _selectedNodesInSelection(editorState.document.root, selection);
+      _selectedNodesInSelection(editorState.document, selection);
 
   @override
   void initState() {
@@ -462,8 +464,7 @@ class _FlowySelectionState extends State<FlowySelection>
   }
 
   void _updateSelection(Selection selection) {
-    final nodes =
-        _selectedNodesInSelection(editorState.document.root, selection);
+    final nodes = _selectedNodesInSelection(editorState.document, selection);
 
     currentSelection = selection;
     currentSelectedNodes.value = nodes;
@@ -572,16 +573,10 @@ class _FlowySelectionState extends State<FlowySelection>
     currentState?.show();
   }
 
-  List<Node> _selectedNodesInSelection(Node node, Selection selection) {
-    List<Node> result = [];
-    if (node.parent != null) {
-      if (node.inSelection(selection)) {
-        result.add(node);
-      }
-    }
-    for (final child in node.children) {
-      result.addAll(_selectedNodesInSelection(child, selection));
-    }
-    return result;
+  List<Node> _selectedNodesInSelection(
+      StateTree stateTree, Selection selection) {
+    final startNode = stateTree.nodeAtPath(selection.start.path)!;
+    final endNode = stateTree.nodeAtPath(selection.end.path)!;
+    return NodeIterator(stateTree, startNode, endNode).toList();
   }
 }