movePageDown function

NavigationResult movePageDown(
  1. Root root,
  2. CaretStop current,
  3. double preferredX,
  4. CaretXResolver resolveX,
  5. CaretYResolver resolveY, {
  6. List<LogicalLine>? lines,
})

Moves the cursor down by approximately 10-15 logical lines.

Implementation

NavigationResult movePageDown(
  Root root,
  CaretStop current,
  double preferredX,
  CaretXResolver resolveX,
  CaretYResolver resolveY, {
  List<LogicalLine>? lines,
}) {
  final lines_ = lines ?? buildAllLogicalLines(root);
  final lineInfo = findLineForStop(lines_, current);
  if (lineInfo == null) return NavigationResult.none;

  final currentLineIndex = lineInfo.lineIndex;
  final targetLineIndex = (currentLineIndex + 10).clamp(0, lines_.length - 1);

  if (targetLineIndex == currentLineIndex) {
    // Already at or near the bottom, go to document end
    final stops = buildAllStops(root);
    if (stops.isEmpty) return NavigationResult.none;
    final lastStop = stops.last;
    if (lastStop == current) return NavigationResult.none;
    return NavigationResult(position: lastStop, preferredX: preferredX);
  }

  final targetLine = lines_[targetLineIndex];
  if (targetLine.stops.isEmpty) return NavigationResult.none;

  final x = preferredX >= 0.0 ? preferredX : resolveX(current);
  final best = _stopNearestX(targetLine.stops, x, resolveX);

  return NavigationResult(position: best, preferredX: x);
}