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