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