feat: binary search selection supports searching child nodes

This commit is contained in:
Lucas.Xu 2022-08-08 18:11:20 +08:00
parent 2f84d7e54e
commit 1ece5cfd9e
3 changed files with 26 additions and 8 deletions

View File

@ -43,7 +43,7 @@ class NodeIterator implements Iterator<Node> {
if (nextOfParent == null) {
_currentNode = null;
} else {
_currentNode = _findLeadingChild(node);
_currentNode = _findLeadingChild(nextOfParent);
}
}

View File

@ -110,11 +110,17 @@ class _CheckboxNodeWidgetState extends State<CheckboxNodeWidget>
.map(
(child) => widget.editorState.service.renderPluginService
.buildPluginWidget(
NodeWidgetContext(
context: context,
node: child,
editorState: widget.editorState,
),
child is TextNode
? NodeWidgetContext<TextNode>(
context: context,
node: child,
editorState: widget.editorState,
)
: NodeWidgetContext<Node>(
context: context,
node: child,
editorState: widget.editorState,
),
),
)
.toList(),

View File

@ -527,6 +527,7 @@ class _FlowySelectionState extends State<FlowySelection>
/// currently only single-level nesting is supported
// find the first node's rect.bottom <= offset.dy
Node _lowerBound(List<Node> sortedNodes, Offset offset, int start, int end) {
assert(start >= 0 && end < sortedNodes.length);
var min = start;
var max = end;
while (min <= max) {
@ -537,7 +538,12 @@ class _FlowySelectionState extends State<FlowySelection>
max = mid - 1;
}
}
return sortedNodes[min];
final node = sortedNodes[min];
if (node.children.isNotEmpty && node.children.first.rect.top <= offset.dy) {
final children = node.children.toList(growable: false);
return _lowerBound(children, offset, 0, children.length - 1);
}
return node;
}
/// TODO: Supports multi-level nesting,
@ -549,6 +555,7 @@ class _FlowySelectionState extends State<FlowySelection>
int start,
int end,
) {
assert(start >= 0 && end < sortedNodes.length);
var min = start;
var max = end;
while (min <= max) {
@ -559,7 +566,12 @@ class _FlowySelectionState extends State<FlowySelection>
max = mid - 1;
}
}
return sortedNodes[max];
final node = sortedNodes[max];
if (node.children.isNotEmpty && node.children.first.rect.top <= offset.dy) {
final children = node.children.toList(growable: false);
return _lowerBound(children, offset, 0, children.length - 1);
}
return node;
}
}