import QtQuick import QtQuick.Layouts import Quickshell import qs.modules.common import qs.modules.common.functions import qs.modules.common.widgets Rectangle { id: root property bool show: false default property alias data: contentColumn.data property real backgroundHeight: 600 property real backgroundAnimationMovementDistance: 60 signal dismiss() Keys.onPressed: (event) => { if (event.key === Qt.Key_Escape) { root.dismiss(); event.accepted = true; } } color: root.show ? Appearance.colors.colScrim : ColorUtils.transparentize(Appearance.colors.colScrim) Behavior on color { animation: Appearance.animation.elementMoveFast.colorAnimation.createObject(this) } visible: dialogBackground.implicitHeight > 0 onShowChanged: { dialogBackgroundHeightAnimation.easing.bezierCurve = (show ? Appearance.animationCurves.emphasizedDecel : Appearance.animationCurves.emphasizedAccel) dialogBackground.implicitHeight = show ? backgroundHeight : 0 } radius: Appearance.rounding.screenRounding - Appearance.sizes.hyprlandGapsOut + 1 MouseArea { // Clicking outside the dialog should dismiss anchors.fill: parent acceptedButtons: Qt.AllButtons hoverEnabled: true onPressed: root.dismiss() } Rectangle { id: dialogBackground anchors.horizontalCenter: parent.horizontalCenter radius: Appearance.rounding.large color: Appearance.colors.colLayer3 property real targetY: root.height / 2 - root.backgroundHeight / 2 y: root.show ? targetY : (targetY - root.backgroundAnimationMovementDistance) implicitWidth: 350 implicitHeight: 0 Behavior on implicitHeight { NumberAnimation { id: dialogBackgroundHeightAnimation duration: Appearance.animation.elementMoveFast.duration easing.type: Easing.BezierSpline easing.bezierCurve: Appearance.animationCurves.emphasizedDecel } } Behavior on y { NumberAnimation { duration: dialogBackgroundHeightAnimation.duration easing.type: dialogBackgroundHeightAnimation.easing.type easing.bezierCurve: dialogBackgroundHeightAnimation.easing.bezierCurve } } MouseArea { // So clicking inside the dialog won't dismiss anchors.fill: parent acceptedButtons: Qt.AllButtons hoverEnabled: true } ColumnLayout { id: contentColumn anchors { fill: parent margins: dialogBackground.radius } spacing: 16 opacity: root.show ? 1 : 0 Behavior on opacity { animation: Appearance.animation.elementMoveFast.numberAnimation.createObject(this) } } } }