pragma ComponentBehavior: Bound import qs.components.filedialog import qs.config import qs.utils import Quickshell import Quickshell.Hyprland import QtQuick Item { id: root required property PersistentProperties visibilities readonly property PersistentProperties state: PersistentProperties { property int currentTab readonly property FileDialog facePicker: FileDialog { title: qsTr("Select a profile picture") filterLabel: qsTr("Image files") filters: Images.validImageExtensions onAccepted: path => { Paths.copy(path, `${Paths.home}/.face`); Quickshell.execDetached(["notify-send", "-a", "caelestia-shell", "-u", "low", "-h", `STRING:image-path:${path}`, "Profile picture changed", `Profile picture changed to ${Paths.shortenHome(path)}`]); } } } visible: height > 0 implicitHeight: 0 implicitWidth: content.implicitWidth states: State { name: "visible" when: root.visibilities.dashboard && Config.dashboard.enabled PropertyChanges { root.implicitHeight: content.implicitHeight } } transitions: [ Transition { from: "" to: "visible" NumberAnimation { target: root property: "implicitHeight" duration: Appearance.anim.durations.expressiveDefaultSpatial easing.type: Easing.BezierSpline easing.bezierCurve: Appearance.anim.curves.expressiveDefaultSpatial } }, Transition { from: "visible" to: "" NumberAnimation { target: root property: "implicitHeight" duration: Appearance.anim.durations.normal easing.type: Easing.BezierSpline easing.bezierCurve: Appearance.anim.curves.emphasized } } ] HyprlandFocusGrab { active: !Config.dashboard.showOnHover && root.visibilities.dashboard && Config.dashboard.enabled windows: [QsWindow.window] onCleared: root.visibilities.dashboard = false } Loader { id: content Component.onCompleted: active = Qt.binding(() => (root.visibilities.dashboard && Config.dashboard.enabled) || root.visible) anchors.horizontalCenter: parent.horizontalCenter anchors.bottom: parent.bottom sourceComponent: Content { visibilities: root.visibilities state: root.state } } }