resolveCursorVisualPosition method

TextVisualCursorPosition? resolveCursorVisualPosition(
  1. TextDocument document,
  2. EditorState state, {
  3. TextPosition? cursor,
})

Implementation

TextVisualCursorPosition? resolveCursorVisualPosition(
  TextDocument document,
  EditorState state, {
  TextPosition? cursor,
}) {
  final lines = buildLines(document, state);
  if (lines.isEmpty) {
    return null;
  }

  final resolvedCursor = document.clampPosition(cursor ?? state.cursor);
  for (var i = 0; i < lines.length; i++) {
    final line = lines[i];
    if (resolvedCursor.line != line.logicalLine) {
      continue;
    }

    final segStart = line.charOffset;
    final segEnd = segStart + line.graphemeCount;
    if (resolvedCursor.column < segStart || resolvedCursor.column > segEnd) {
      continue;
    }

    if (resolvedCursor.column == segEnd && i + 1 < lines.length) {
      final next = lines[i + 1];
      if (next.logicalLine == line.logicalLine && next.charOffset == segEnd) {
        continue;
      }
    }

    return _visualCursorPositionForLine(
      document,
      lines,
      i,
      cursorColumn: resolvedCursor.column,
    );
  }

  final fallbackRow = lines.lastIndexWhere(
    (line) => line.logicalLine == resolvedCursor.line,
  );
  final resolvedRow = fallbackRow >= 0 ? fallbackRow : lines.length - 1;
  final fallbackLine = lines[resolvedRow];
  final fallbackColumn = fallbackLine.logicalLine == resolvedCursor.line
      ? resolvedCursor.column.clamp(
          fallbackLine.charOffset,
          fallbackLine.charOffset + fallbackLine.graphemeCount,
        )
      : fallbackLine.charOffset + fallbackLine.graphemeCount;

  return _visualCursorPositionForLine(
    document,
    lines,
    resolvedRow,
    cursorColumn: fallbackColumn,
  );
}