performPaint method
Hook for subclasses to implement actual painting.
Implementation
@override
void performPaint(Buffer buffer, Offset offset) {
final table = widget as LazyTable;
final w = size.width;
final h = size.height;
if (w <= 0 || h <= 0) return;
final hasHeaders = table.headers.isNotEmpty;
final headerRowsCount = hasHeaders ? 2 : 0;
final usableHeight = h - headerRowsCount;
if (usableHeight <= 0) return;
// Cache total column layout width (columns + single space separators)
final int columnsTotalWidth =
resolvedColumnWidths.fold<int>(0, (prev, val) => prev + val) +
(table.headers.isNotEmpty ? table.headers.length - 1 : 0);
// 1. Render Headers
if (hasHeaders) {
final headerSb = StringBuffer();
for (var i = 0; i < table.headers.length; i++) {
final width = resolvedColumnWidths[i];
final text = table.headers[i];
final padded = padOrTruncate(text, width);
headerSb.write(padded);
if (i < table.headers.length - 1) headerSb.write(' ');
}
String headerStr;
if (columnsTotalWidth <= w) {
if (columnsTotalWidth < w) {
headerSb.write(' ' * (w - columnsTotalWidth));
}
headerStr = headerSb.toString();
} else {
headerStr = padOrTruncate(headerSb.toString(), w);
}
buffer.writeString(offset.dx, offset.dy, headerStr, table.headerStyle);
// Render Divider Line
final dividerChar = '─';
final divider = dividerChar * w;
buffer.writeString(offset.dx, offset.dy + 1, divider, table.borderStyle);
}
// 2. Render Visible Rows
for (var r = 0; r < usableHeight; r++) {
final rowIdx = table.scrollOffset + r;
if (rowIdx >= table.itemCount) break;
final rowData = table.itemBuilder(rowIdx);
final isSelected = rowIdx == table.selectedRowIndex;
final currentStyle = isSelected ? table.selectedRowStyle : table.rowStyle;
final rowSb = StringBuffer();
for (var c = 0; c < table.headers.length; c++) {
final width = resolvedColumnWidths[c];
final cellText = c < rowData.length ? rowData[c] : '';
final padded = padOrTruncate(cellText, width);
rowSb.write(padded);
if (c < table.headers.length - 1) rowSb.write(' ');
}
String rowStr;
if (columnsTotalWidth <= w) {
if (columnsTotalWidth < w) {
rowSb.write(' ' * (w - columnsTotalWidth));
}
rowStr = rowSb.toString();
} else {
rowStr = padOrTruncate(rowSb.toString(), w);
}
final targetY = offset.dy + headerRowsCount + r;
buffer.writeString(offset.dx, targetY, rowStr, currentStyle);
}
}