render method
Implementation
@override
void render(Rect area, Buffer buffer, RenderContext ctx) {
if (area.isEmpty) return;
_ensureDefaults();
if (items.isEmpty) return;
final isFocused = ctx.isFocused(id);
final maxVisible = area.height.clamp(1, items.length);
state.activeIndex = state.activeIndex.clamp(0, items.length - 1);
if (state.activeIndex < state.scrollOffset) {
state.scrollOffset = state.activeIndex;
} else if (state.activeIndex >= state.scrollOffset + maxVisible) {
state.scrollOffset = state.activeIndex - maxVisible + 1;
}
final maxOffset = (items.length - maxVisible).clamp(0, items.length);
state.scrollOffset = state.scrollOffset.clamp(0, maxOffset);
for (var i = 0;
i < maxVisible && i + state.scrollOffset < items.length;
i++) {
final idx = i + state.scrollOffset;
final item = items[idx];
final lineRect = Rect(area.x, area.y + i, area.width, 1);
if (lineRect.isEmpty) continue;
final itemState = CheckboxItemState(
isChecked: state.checked.contains(item),
isActive: isFocused && idx == state.activeIndex,
isFocused: isFocused,
index: idx,
);
builder(item, itemState).render(lineRect, buffer, ctx);
if (itemState.isActive) {
buffer.fillStyle(
lineRect,
Style(bg: ctx.theme.colors.primary, fg: ctx.theme.colors.background),
);
}
}
}