showOverlay method

void showOverlay()

Displays the dropdown overlay.

This method shows the dropdown overlay when called. It calculates the position and size of the dropdown and handles whether it should be displayed above or below the button based on available space.

Implementation

void showOverlay() {
  if (!mounted) return;

  if (_overlayEntry != null) {
    removeOverlay();
    return;
  }

  final OverlayState overlayState = Overlay.of(context);
  _easyDropdownState = GlobalKey<EasyDropdownListState>();
  _overlayEntry = OverlayEntry(
    builder: (context) {
      return OrientationBuilder(builder: (context, orientation) {
        final RenderBox buttonRenderBox =
            _dropDownKey.currentContext!.findRenderObject() as RenderBox;
        final buttonSize = buttonRenderBox.size;

        final screenSize = MediaQuery.of(context).size;

        final dropdownWidth = widget.config.dropdownWidth ??
            buttonSize.width; // Set the width as needed
        double dropdownHeight;

        // Calculate available space below and above the button
        final spaceBelowButton = screenSize.height -
            buttonRenderBox.localToGlobal(Offset.zero).dy -
            buttonSize.height;
        final spaceAboveButton =
            buttonRenderBox.localToGlobal(Offset.zero).dy;

        final minHeightOfTile = widget.config.dropdownHeight ??
            (widget.config.tileHeight ?? EasyDropdownList.kTileHeight);
        bool displayBelow = true;

        double verticalPosition;
        double buttonMargin = widget.config.buttonMargin ?? 4;

        if (widget.config.dropdownDirection == EasyDropdownDirection.above) {
          displayBelow = false;

          dropdownHeight = widget.config.dropdownHeight != null
              ? minHeightOfTile
              : spaceAboveButton;

          verticalPosition = (buttonRenderBox.localToGlobal(Offset.zero).dy -
              dropdownHeight -
              buttonMargin);
        } else if (widget.config.dropdownDirection ==
            EasyDropdownDirection.below) {
          displayBelow = true;
          dropdownHeight = spaceBelowButton;

          verticalPosition = (buttonRenderBox.localToGlobal(Offset.zero).dy +
              buttonSize.height +
              buttonMargin);
        } else if (spaceBelowButton >= minHeightOfTile) {
          // Sufficient space below the button, display below
          dropdownHeight = spaceBelowButton;

          verticalPosition = (buttonRenderBox.localToGlobal(Offset.zero).dy +
              buttonSize.height +
              buttonMargin);
        } else if (spaceAboveButton >= minHeightOfTile) {
          // Sufficient space above the button, display above
          dropdownHeight = widget.config.dropdownHeight != null
              ? minHeightOfTile
              : spaceAboveButton;
          displayBelow = false;

          verticalPosition = (buttonRenderBox.localToGlobal(Offset.zero).dy -
              dropdownHeight -
              buttonMargin);
        } else {
          // Not enough space below or above, use a default height
          dropdownHeight = minHeightOfTile;
          verticalPosition = screenSize.height / 2.0;
        }

        double horizontalPosition;

        switch (widget.config.dropdownAlignment) {
          case EasyDropdownAlignment.center:
            horizontalPosition = buttonRenderBox
                    .localToGlobal(Offset.zero)
                    .dx +
                (buttonSize.width - dropdownWidth) / 2; // Center horizontally
            break;
          case EasyDropdownAlignment.left:
            horizontalPosition =
                buttonRenderBox.localToGlobal(Offset.zero).dx;
            break;
          case EasyDropdownAlignment.right:
            horizontalPosition =
                buttonRenderBox.localToGlobal(Offset.zero).dx +
                    buttonSize.width -
                    dropdownWidth;
            break;
          default:
            horizontalPosition = buttonRenderBox
                    .localToGlobal(Offset.zero)
                    .dx +
                (buttonSize.width - dropdownWidth) / 2; // Default to center
            break;
        }

        return Stack(
          children: [
            Positioned.fill(
              child: GestureDetector(
                behavior: HitTestBehavior.opaque,
                onTap: () {
                  removeOverlay();
                },
              ),
            ),
            Positioned(
              top: verticalPosition,
              // top: spaceBelowButton >= minHeightOfTile
              //     ? (buttonRenderBox.localToGlobal(Offset.zero).dy +
              //         buttonSize.height +
              //         buttonMargin)
              //     : (buttonRenderBox.localToGlobal(Offset.zero).dy -
              //         dropdownHeight -
              //         buttonMargin),
              left: horizontalPosition,
              child: SizedBox(
                width: dropdownWidth,
                height: widget.config.dropdownHeight ?? dropdownHeight,
                child: EasyDropdownList(
                  key: _easyDropdownState,
                  items: widget.items,
                  config: widget.config,
                  alignment: displayBelow
                      ? Alignment.topCenter
                      : Alignment.bottomCenter,
                  itemCount: widget.itemCount,
                  removeOverlay: removeOverlay,
                ),
              ),
            )
          ],
        );
      });
    },
  );

  overlayState.insert(_overlayEntry!);
  setState(() {});
  widget.onDropdownStart?.call();
}