render method
Implementation
@override
void render(Rect area, Buffer buffer, RenderContext ctx) {
if (area.isEmpty) return;
final colWidths = _computeWidths(area.width);
final headerStyle = ctx.theme.text.title;
var x = area.x;
for (var i = 0; i < columns.length && i < colWidths.length; i++) {
buffer.writeText(x, area.y, columns[i],
style: headerStyle, maxWidth: colWidths[i]);
x += colWidths[i] + 1;
}
final dataArea = Rect(area.x, area.y + 1, area.width, area.height - 1);
final visible = dataArea.height;
if (visible <= 0) return;
if (state.selectedRow < state.scrollOffset) {
state.scrollOffset = state.selectedRow;
} else if (state.selectedRow >= state.scrollOffset + visible) {
state.scrollOffset = state.selectedRow - visible + 1;
}
state.scrollOffset = state.scrollOffset
.clamp(0, (rows.length - visible).clamp(0, rows.length));
for (var i = 0; i < visible && i + state.scrollOffset < rows.length; i++) {
final idx = i + state.scrollOffset;
final row = rows[idx];
final isSel = idx == state.selectedRow;
final rowRect = Rect(dataArea.x, dataArea.y + i, dataArea.width, 1);
final rowStyle = isSel
? Style(bg: ctx.theme.colors.primary, fg: ctx.theme.colors.background)
: ctx.theme.text.body;
if (isSel) buffer.fillStyle(rowRect, rowStyle);
x = rowRect.x;
for (var c = 0; c < colWidths.length && c < row.length; c++) {
buffer.writeText(x, rowRect.y, row[c],
style: rowStyle, maxWidth: colWidths[c]);
x += colWidths[c] + 1;
}
}
}