searchableList static method

KeyBindings searchableList({
  1. required void onUp(),
  2. required void onDown(),
  3. required void onSearchToggle(),
  4. required TextInputBuffer searchBuffer,
  5. required bool isSearchEnabled(),
  6. void onSearchInput()?,
  7. void onToggle()?,
  8. bool hasMultiSelect = false,
  9. KeyActionResult onConfirm()?,
  10. void onCancel()?,
})

Search/list focus bindings. isSearchEnabled reports text focus; onSearchToggle switches focus without clearing the query or filter. Slash focuses search from results; Ctrl+F switches either direction. onSearchInput runs only when query text changes.

Implementation

static KeyBindings searchableList({
  required void Function() onUp,
  required void Function() onDown,
  required void Function() onSearchToggle,
  required TextInputBuffer searchBuffer,
  required bool Function() isSearchEnabled,
  void Function()? onSearchInput,
  void Function()? onToggle,
  bool hasMultiSelect = false,
  KeyActionResult Function()? onConfirm,
  void Function()? onCancel,
}) {
  var bindings = verticalNavigation(onUp: onUp, onDown: onDown) +
      KeyBindings([
        KeyBinding.single(KeyEventType.slash, (event) {
          if (isSearchEnabled()) return KeyActionResult.ignored;
          onSearchToggle();
          return KeyActionResult.handled;
        }, hintLabel: '/', hintDescription: 'focus search'),
        KeyBinding.single(KeyEventType.ctrlGeneric, (event) {
          if (event.char != 'f') return KeyActionResult.ignored;
          onSearchToggle();
          return KeyActionResult.handled;
        }, hintLabel: 'Ctrl+F', hintDescription: 'search/results focus'),
      ]) +
      textInput(
        buffer: () => searchBuffer,
        isEnabled: isSearchEnabled,
        onTextChanged: onSearchInput,
      );

  if (hasMultiSelect && onToggle != null) {
    bindings = bindings +
        conditionalToggle(
          isEnabled: () => !isSearchEnabled(),
          onToggle: onToggle,
          hintDescription: 'select in results',
        );
  }

  return bindings +
      confirm(onConfirm: onConfirm) +
      cancel(onCancel: onCancel);
}