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();

  final isFocused = ctx.isFocused(id);
  final filtered = _filteredItems();

  var remaining = area;
  if (filterable) {
    final filterRect = Rect(remaining.x, remaining.y, remaining.width, 1);
    _renderFilter(filterRect, buffer, ctx, isFocused);
    remaining = remaining.inset(top: 1);
    if (remaining.isEmpty) return;
  }

  Rect errorRect = const Rect.zero();
  if (state.validationError != null && remaining.height > 1) {
    errorRect = Rect(remaining.x, remaining.bottom - 1, remaining.width, 1);
    remaining = remaining.inset(bottom: 1);
  }

  final maxVisible = visibleCount.clamp(1, remaining.height);
  if (filtered.isEmpty) {
    _renderEmpty(remaining, buffer, ctx);
  } else {
    _renderList(remaining, buffer, ctx, filtered, maxVisible, isFocused);
  }

  if (state.validationError != null && !errorRect.isEmpty) {
    buffer.writeText(
      errorRect.x,
      errorRect.y,
      state.validationError!,
      style: Style(fg: ctx.theme.colors.error),
      maxWidth: errorRect.width,
    );
  }
}