refactor: use node iterator for selection

This commit is contained in:
Vincent Chan 2022-08-04 11:22:38 +08:00
parent 22976a6847
commit 8b60cd7abd
2 changed files with 19 additions and 14 deletions

View File

@ -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;
}
}

View File

@ -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();
}
}