pragma ComponentBehavior: Bound import qs.components import qs.components.controls import qs.services import qs.config import qs.utils import Quickshell import QtQuick Item { id: root required property var content required property PersistentProperties visibilities required property var panels required property real maxHeight required property StyledTextField search required property int padding required property int rounding readonly property bool showWallpapers: search.text.startsWith(`${Config.launcher.actionPrefix}wallpaper `) readonly property Item currentList: showWallpapers ? wallpaperList.item : appList.item anchors.horizontalCenter: parent.horizontalCenter anchors.bottom: parent.bottom clip: true state: showWallpapers ? "wallpapers" : "apps" states: [ State { name: "apps" PropertyChanges { root.implicitWidth: Config.launcher.sizes.itemWidth root.implicitHeight: Math.min(root.maxHeight, appList.implicitHeight > 0 ? appList.implicitHeight : empty.implicitHeight) appList.active: true } AnchorChanges { anchors.left: root.parent.left anchors.right: root.parent.right } }, State { name: "wallpapers" PropertyChanges { root.implicitWidth: Math.max(Config.launcher.sizes.itemWidth * 1.2, wallpaperList.implicitWidth) root.implicitHeight: Config.launcher.sizes.wallpaperHeight wallpaperList.active: true } } ] Behavior on state { SequentialAnimation { Anim { target: root property: "opacity" from: 1 to: 0 duration: Appearance.anim.durations.small } PropertyAction {} Anim { target: root property: "opacity" from: 0 to: 1 duration: Appearance.anim.durations.small } } } Loader { id: appList active: false anchors.fill: parent sourceComponent: AppList { search: root.search visibilities: root.visibilities } } Loader { id: wallpaperList active: false anchors.top: parent.top anchors.bottom: parent.bottom anchors.horizontalCenter: parent.horizontalCenter sourceComponent: WallpaperList { search: root.search visibilities: root.visibilities panels: root.panels content: root.content } } Row { id: empty opacity: root.currentList?.count === 0 ? 1 : 0 scale: root.currentList?.count === 0 ? 1 : 0.5 spacing: Appearance.spacing.normal padding: Appearance.padding.large anchors.horizontalCenter: parent.horizontalCenter anchors.verticalCenter: parent.verticalCenter MaterialIcon { text: root.state === "wallpapers" ? "wallpaper_slideshow" : "manage_search" color: Colours.palette.m3onSurfaceVariant font.pointSize: Appearance.font.size.extraLarge anchors.verticalCenter: parent.verticalCenter } Column { anchors.verticalCenter: parent.verticalCenter StyledText { text: root.state === "wallpapers" ? qsTr("No wallpapers found") : qsTr("No results") color: Colours.palette.m3onSurfaceVariant font.pointSize: Appearance.font.size.larger font.weight: 500 } StyledText { text: root.state === "wallpapers" && Wallpapers.list.length === 0 ? qsTr("Try putting some wallpapers in %1").arg(Paths.shortenHome(Paths.wallsdir)) : qsTr("Try searching for something else") color: Colours.palette.m3onSurfaceVariant font.pointSize: Appearance.font.size.normal } } Behavior on opacity { Anim {} } Behavior on scale { Anim {} } } Behavior on implicitWidth { enabled: root.visibilities.launcher Anim { duration: Appearance.anim.durations.large easing.bezierCurve: Appearance.anim.curves.emphasizedDecel } } Behavior on implicitHeight { enabled: root.visibilities.launcher Anim { duration: Appearance.anim.durations.large easing.bezierCurve: Appearance.anim.curves.emphasizedDecel } } }