performPaint method

  1. @override
void performPaint(
  1. Buffer buffer,
  2. Offset offset
)
override

Hook for subclasses to implement actual painting.

Implementation

@override
void performPaint(Buffer buffer, Offset offset) {
  final viewport = Viewport(
    buffer,
    Rect(offset.dx, offset.dy, size.width, size.height),
  );
  final help = widget as Help;
  if (help.bindings.isEmpty || size.width <= 0 || size.height <= 0) return;

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

  var currentLineY = 0;
  var currentLineX = 0;
  final separatorChars = help.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;

    final itemLength = keyPartChars.length + 1 + descPartChars.length;

    if (currentLineX + itemLength > size.width && currentLineX > 0) {
      currentLineY++;
      currentLineX = 0;
    }

    if (currentLineY >= size.height) break;

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

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

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

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