pragma ComponentBehavior: Bound import qs.components import qs.config import Quickshell import QtQuick Item { id: root required property ShellScreen screen required property PersistentProperties visibilities required property var panels readonly property bool shouldBeActive: visibilities.launcher && Config.launcher.enabled property int contentHeight readonly property real maxHeight: { let max = screen.height - Config.border.thickness * 2 - Appearance.spacing.large; if (visibilities.dashboard) max -= panels.dashboard.nonAnimHeight; return max; } onMaxHeightChanged: timer.start() visible: height > 0 implicitHeight: 0 implicitWidth: content.implicitWidth onShouldBeActiveChanged: { if (shouldBeActive) { timer.stop(); hideAnim.stop(); showAnim.start(); } else { showAnim.stop(); hideAnim.start(); } } SequentialAnimation { id: showAnim Anim { target: root property: "implicitHeight" to: root.contentHeight duration: Appearance.anim.durations.expressiveDefaultSpatial easing.bezierCurve: Appearance.anim.curves.expressiveDefaultSpatial } ScriptAction { script: root.implicitHeight = Qt.binding(() => content.implicitHeight) } } SequentialAnimation { id: hideAnim ScriptAction { script: root.implicitHeight = root.implicitHeight } Anim { target: root property: "implicitHeight" to: 0 easing.bezierCurve: Appearance.anim.curves.emphasized } } Connections { target: Config.launcher function onEnabledChanged(): void { timer.start(); } function onMaxShownChanged(): void { timer.start(); } } Connections { target: DesktopEntries.applications function onValuesChanged(): void { if (DesktopEntries.applications.values.length < Config.launcher.maxShown) timer.start(); } } Timer { id: timer interval: Appearance.anim.durations.extraLarge onRunningChanged: { if (running && !root.shouldBeActive) { content.visible = false; content.active = true; } else { root.contentHeight = content.implicitHeight; content.active = Qt.binding(() => root.shouldBeActive || root.visible); content.visible = true; } } } Loader { id: content anchors.top: parent.top anchors.horizontalCenter: parent.horizontalCenter visible: false active: false Component.onCompleted: timer.start() sourceComponent: Content { visibilities: root.visibilities panels: root.panels maxHeight: root.maxHeight Component.onCompleted: root.contentHeight = implicitHeight } } }