render method
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;
}
}
}