resolveCursorVisualPosition method
TextVisualCursorPosition?
resolveCursorVisualPosition(
- TextDocument document,
- EditorState state, {
- 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,
);
}