render method

  1. @override
void render(
  1. Buffer buffer,
  2. Rect area
)
override

Renders the widget onto the provided buffer within the specified area.

Implementation

@override
void render(Buffer buffer, Rect area) {
  if (bindings.isEmpty || area.width <= 0 || area.height <= 0) return;

  final items = <_HelpItem>[];
  for (final entry in bindings.entries) {
    items.add(_HelpItem(entry.key, entry.value));
  }

  var currentLineY = 0;
  var currentLineX = 0;

  final separatorChars = separator.characters;

  for (var i = 0; i < items.length; i++) {
    final item = items[i];
    final keyPart = item.key;
    final keyPartChars = keyPart.characters;
    final descPart = item.desc;
    final descPartChars = descPart.characters;
    final isLast = i == items.length - 1;

    // Calculate the length of "key desc" + separator (if not last)
    final itemLength = keyPartChars.length + 1 + descPartChars.length;

    // Wrap to next line if it doesn't fit on the current line
    if (currentLineX + itemLength > area.width && currentLineX > 0) {
      currentLineY++;
      currentLineX = 0;
    }

    if (currentLineY >= area.height) break;

    // Render key
    buffer.writeString(currentLineX, currentLineY, keyPart, keyStyle);
    currentLineX += keyPartChars.length;

    // Render space
    buffer.writeString(currentLineX, currentLineY, ' ', Style.empty);
    currentLineX += 1;

    // Render description
    buffer.writeString(currentLineX, currentLineY, descPart, descStyle);
    currentLineX += descPartChars.length;

    // Render separator
    if (!isLast) {
      if (currentLineX + separatorChars.length <= area.width) {
        buffer.writeString(
          currentLineX,
          currentLineY,
          separator,
          separatorStyle,
        );
        currentLineX += separatorChars.length;
      } else {
        currentLineY++;
        currentLineX = 0;
      }
    }
  }
}