class_name PopupBackdrop extends ColorRect ## Dims everything behind an open popup and keeps clicks from reaching the buttons ## under it. ## ## The backdrop sits above the rest of its parent and below the popups it belongs to. ## Popups close themselves when clicked outside, and the backdrop keeps that click from ## reaching the buttons behind them. var _popups: Array[PopupWindow] = [] ## Adds a backdrop to [param parent] and moves [param popups] above it. The backdrop ## shows while any of them is open. static func add_to(parent: Control, popups: Array[PopupWindow]) -> PopupBackdrop: var backdrop: PopupBackdrop = PopupBackdrop.new() backdrop.name = "PopupBackdrop" backdrop.color = Color(0, 0, 0, 0.55) backdrop.mouse_filter = Control.MOUSE_FILTER_STOP backdrop._popups = popups parent.add_child(backdrop) backdrop.set_anchors_and_offsets_preset(Control.PRESET_FULL_RECT) for popup: PopupWindow in popups: parent.move_child(popup, -1) popup.visibility_changed.connect(backdrop._update) backdrop._update() return backdrop func _update() -> void: visible = _popups.any(func(popup: PopupWindow) -> bool: return popup.visible)