render method

  1. @override
String render()
override

Renders the component as a string.

Implementation

@override
String render() {
  if (items.isEmpty) return '';

  // Auto-calculate columns if not specified
  final maxItemWidth = items
      .map((i) => Style.visibleLength(i))
      .fold<int>(0, (m, v) => v > m ? v : m);
  final cols =
      columnCount ??
      ((renderConfig.terminalWidth - indent) ~/ (maxItemWidth + gutter))
          .clamp(1, items.length);

  final colWidth =
      (renderConfig.terminalWidth - indent - (cols - 1) * gutter) ~/ cols;

  final buffer = StringBuffer();

  for (var i = 0; i < items.length; i += cols) {
    final row = <String>[];
    for (var j = 0; j < cols && i + j < items.length; j++) {
      final item = items[i + j];
      final visible = Style.visibleLength(item);
      final fill = colWidth - visible;
      row.add('$item${' ' * (fill > 0 ? fill : 0)}');
    }
    if (buffer.isNotEmpty) buffer.writeln();
    buffer.write('${' ' * indent}${row.join(' ' * gutter)}');
  }

  return buffer.toString();
}