Просмотр исходного кода

feat: binary search selection supports searching child nodes

Lucas.Xu 2 лет назад
Родитель
Сommit
1ece5cfd9e

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

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

+ 11 - 5
frontend/app_flowy/packages/flowy_editor/lib/render/rich_text/checkbox_text.dart

@@ -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(),

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

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