pragma ComponentBehavior: Bound import Quickshell import QtQuick import qs.Paths import qs.Modules import qs.Components import qs.Helpers import qs.Config Item { id: root required property var content required property PersistentProperties visibilities required property var panels required property real maxHeight required property CustomTextField 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: DynamicColors.palette.m3onSurfaceVariant font.pointSize: Appearance.font.size.extraLarge anchors.verticalCenter: parent.verticalCenter } Column { anchors.verticalCenter: parent.verticalCenter CustomText { text: root.state === "wallpapers" ? qsTr("No wallpapers found") : qsTr("No results") color: DynamicColors.palette.m3onSurfaceVariant font.pointSize: Appearance.font.size.larger font.weight: 500 } CustomText { 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: DynamicColors.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.small easing.bezierCurve: Appearance.anim.curves.expressiveEffects } } Behavior on implicitHeight { enabled: root.visibilities.launcher Anim { duration: Appearance.anim.durations.small easing.bezierCurve: Appearance.anim.curves.expressiveEffects } } }