pragma ComponentBehavior: Bound import QtQuick import Quickshell import qs.components import qs.config Item { id: root required property ShellScreen screen required property DrawerVisibilities 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: anchors.bottomMargin > -implicitHeight - 5 anchors.bottomMargin: -implicitHeight - 5 implicitHeight: content.implicitHeight implicitWidth: content.implicitWidth onShouldBeActiveChanged: { if (shouldBeActive) { timer.stop(); hideAnim.stop(); showAnim.start(); } else { showAnim.stop(); hideAnim.start(); } } SequentialAnimation { id: showAnim Anim { target: root.anchors property: "bottomMargin" to: 0 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.anchors property: "bottomMargin" to: -content.implicitHeight - 5 // easing.bezierCurve: Appearance.anim.curves.emphasized duration: Appearance.anim.durations.expressiveDefaultSpatial easing.bezierCurve: Appearance.anim.curves.expressiveDefaultSpatial } } Connections { function onEnabledChanged(): void { timer.start(); } function onMaxShownChanged(): void { timer.start(); } target: Config.launcher } Connections { function onValuesChanged(): void { if (DesktopEntries.applications.values.length < Config.launcher.maxShown) timer.start(); } target: DesktopEntries.applications } Timer { id: timer interval: Appearance.anim.durations.extraLarge onRunningChanged: { if (running && !root.shouldBeActive) { content.visible = false; content.active = true; } else { root.contentHeight = Math.min(root.maxHeight, content.implicitHeight); content.active = Qt.binding(() => root.shouldBeActive || root.visible); content.visible = true; if (showAnim.running) { showAnim.stop(); showAnim.start(); } } } } 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 } } }