resolveViewport method

TextViewport resolveViewport(
  1. TextDocument document,
  2. EditorState state
)

Implementation

TextViewport resolveViewport(TextDocument document, EditorState state) {
  final lines = buildLines(document, state);
  final totalRows = lines.length;
  final totalColumns = totalVisualColumns(document, state);
  final viewportWidth = effectiveContentWidth();
  final cursor = resolveCursorVisualPosition(document, state);
  final cursorRow = cursor?.visualRow ?? 0;
  final cursorColumn = cursor?.displayColumn ?? 0;
  final verticalMargin = _resolvedScrollMargin(height);
  final horizontalMargin = softWrap
      ? 0
      : _resolvedScrollMargin(viewportWidth);

  final resolvedStartColumn = switch ((softWrap, viewportWidth > 0)) {
    (true, _) || (_, false) => 0,
    _ => _resolveViewportStart(
      currentStart: viewportStartColumn,
      cursorOffset: cursorColumn,
      viewportExtent: viewportWidth,
      totalExtent: totalColumns,
      margin: horizontalMargin,
    ),
  };
  final resolvedEndColumn = switch ((softWrap, viewportWidth > 0)) {
    (true, _) || (_, false) => totalColumns,
    _ => (resolvedStartColumn + viewportWidth).clamp(0, totalColumns),
  };

  if (height <= 0 || totalRows <= height) {
    return TextViewport(
      startRow: 0,
      endRow: totalRows,
      totalRows: totalRows,
      startColumn: resolvedStartColumn,
      endColumn: resolvedEndColumn,
      totalColumns: totalColumns,
    );
  }

  final resolvedStart = _resolveViewportStart(
    currentStart: viewportStartRow,
    cursorOffset: cursorRow,
    viewportExtent: height,
    totalExtent: totalRows,
    margin: verticalMargin,
  );

  return TextViewport(
    startRow: resolvedStart,
    endRow: (resolvedStart + height).clamp(0, totalRows),
    totalRows: totalRows,
    startColumn: resolvedStartColumn,
    endColumn: resolvedEndColumn,
    totalColumns: totalColumns,
  );
}