openOverlay method

void openOverlay()

Implementation

void openOverlay() async {
  if (isOverlayOpen) return;
  _highlightedIndex = -1;

  if (items.isEmpty && asyncSearchCallback != null) {
    await _prefillData();
  }

  _scrollController = ScrollController();
  _scrollController!.addListener(_onScrollListener);

  // Mobile (width < 600) → bottom sheet modale. Desktop → overlay ancorato.
  final isMobile =
      MediaQuery.sizeOf(context).width < _mobileBreakpoint;

  if (isMobile) {
    _useBottomSheet = true;
    isOverlayOpen = true;
    notifyListeners();
    _openBottomSheet();
  } else {
    _useBottomSheet = false;
    _overlayEntry = _createOverlayEntry();
    Overlay.of(context).insert(_overlayEntry!);
    isOverlayOpen = true;
    notifyListeners();
    // shadcn ensureSelectedVisible: dopo il primo frame, scrolla all'item
    // selezionato (single) così è già visibile all'apertura.
    WidgetsBinding.instance.addPostFrameCallback((_) {
      // Autofocus sul campo ricerca del popover (se presente).
      _searchFocusNode.requestFocus();
      final ctx = _selectedItemKey.currentContext;
      if (ctx != null) {
        Scrollable.ensureVisible(ctx,
            alignment: 0.5,
            duration: const Duration(milliseconds: 150),
            curve: Curves.easeOut);
      }
      _updateScrollChevrons();
    });
  }
}