From 8da6faa74bc36064ea1511ebd99b1162f4ceffe8 Mon Sep 17 00:00:00 2001 From: Vincent Chan Date: Wed, 3 Aug 2022 19:35:37 +0800 Subject: [PATCH] feat: node traverser --- .../lib/document/node_traverser.dart | 42 +++++++++++++++++++ 1 file changed, 42 insertions(+) create mode 100644 frontend/app_flowy/packages/flowy_editor/lib/document/node_traverser.dart diff --git a/frontend/app_flowy/packages/flowy_editor/lib/document/node_traverser.dart b/frontend/app_flowy/packages/flowy_editor/lib/document/node_traverser.dart new file mode 100644 index 0000000000..b4005f054a --- /dev/null +++ b/frontend/app_flowy/packages/flowy_editor/lib/document/node_traverser.dart @@ -0,0 +1,42 @@ +import 'package:flowy_editor/document/node.dart'; + +import './state_tree.dart'; +import './node.dart'; + +/// [NodeTraverser] is used to traverse the nodes in visual order. +class NodeTraverser { + final StateTree stateTree; + Node? currentNode; + + NodeTraverser(this.stateTree, Node beginNode) : currentNode = beginNode; + + Node? next() { + final node = currentNode; + if (node == null) { + return null; + } + + if (node.children.isNotEmpty) { + currentNode = _findLeadingChild(node); + } else if (node.next != null) { + currentNode = node.next!; + } else { + final parent = node.parent!; + final nextOfParent = parent.next; + if (nextOfParent == null) { + currentNode = null; + } else { + currentNode = _findLeadingChild(node); + } + } + + return node; + } + + Node _findLeadingChild(Node node) { + while (node.children.isNotEmpty) { + node = node.children.first; + } + return node; + } +}