render method

  1. @override
void render(
  1. Rect area,
  2. Buffer buffer,
  3. RenderContext ctx
)
override

Implementation

@override
void render(Rect area, Buffer buffer, RenderContext ctx) {
  if (area.isEmpty) return;
  final t = _theme(ctx);
  final lines = code.split('\n');
  final lineNoWidth = showLineNumbers
      ? (lines.length + firstLineNumber - 1).toString().length
      : 0;
  final lineNoGutter = showLineNumbers ? lineNoWidth + 1 : 0;

  int offset = 0;
  if (scrollable) {
    final maxOff = _maxOffset(lines.length, area.height);
    state!.scrollOffset = state!.scrollOffset.clamp(0, maxOff);
    offset = state!.scrollOffset;
  }

  for (var i = 0; i < area.height && (i + offset) < lines.length; i++) {
    final lineIndex = i + offset;
    final y = area.y + i;
    var x = area.x;
    if (showLineNumbers) {
      final n = (lineIndex + firstLineNumber).toString().padLeft(lineNoWidth);
      buffer.writeText(x, y, n, style: t.lineNumber, maxWidth: lineNoWidth);
      x += lineNoGutter;
    }
    final tokens = _tokenize(lines[lineIndex], t);
    for (final tok in tokens) {
      if (x >= area.right) break;
      final remaining = area.right - x;
      final shown = tok.text.length > remaining
          ? tok.text.substring(0, remaining)
          : tok.text;
      buffer.writeText(x, y, shown, style: tok.style, maxWidth: remaining);
      x += shown.length;
    }
  }
}