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