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 || items.isEmpty) return;
  final visible = area.height ~/ itemHeight;
  if (visible <= 0) return;
  if (state.selected < state.scrollOffset) {
    state.scrollOffset = state.selected;
  } else if (state.selected >= state.scrollOffset + visible) {
    state.scrollOffset = state.selected - visible + 1;
  }
  state.scrollOffset = state.scrollOffset
      .clamp(0, (items.length - visible).clamp(0, items.length));

  for (var i = 0; i < visible && i + state.scrollOffset < items.length; i++) {
    final idx = i + state.scrollOffset;
    final isSel = idx == state.selected;
    final rect =
        Rect(area.x, area.y + i * itemHeight, area.width, itemHeight);
    itemBuilder(items[idx], isSel).render(rect, buffer, ctx);
    if (isSel) {
      final sel = selectedStyle ??
          Style(
              bg: ctx.theme.colors.primary, fg: ctx.theme.colors.background);
      buffer.fillStyle(rect, sel);
    }
  }
}