render method

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

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),
      );
    }
  }
}