pragma ComponentBehavior: Bound import "items" import "services" import qs.components import qs.components.controls import qs.components.containers import qs.services import qs.config import Quickshell import QtQuick import QtQuick.Controls StyledListView { id: root required property TextField search required property PersistentProperties visibilities model: ScriptModel { id: model onValuesChanged: root.currentIndex = 0 } spacing: Appearance.spacing.small orientation: Qt.Vertical implicitHeight: (Config.launcher.sizes.itemHeight + spacing) * Math.min(Config.launcher.maxShown, count) - spacing highlightMoveDuration: Appearance.anim.durations.normal highlightResizeDuration: 0 highlight: StyledRect { radius: Appearance.rounding.full color: Colours.palette.m3onSurface opacity: 0.08 } state: { const text = search.text; const prefix = Config.launcher.actionPrefix; if (text.startsWith(prefix)) { for (const action of ["calc", "scheme", "variant"]) if (text.startsWith(`${prefix}${action} `)) return action; return "actions"; } return "apps"; } states: [ State { name: "apps" PropertyChanges { model.values: Apps.query(search.text) root.delegate: appItem } }, State { name: "actions" PropertyChanges { model.values: Actions.query(search.text) root.delegate: actionItem } }, State { name: "calc" PropertyChanges { model.values: [0] root.delegate: calcItem } }, State { name: "scheme" PropertyChanges { model.values: Schemes.query(search.text) root.delegate: schemeItem } }, State { name: "variant" PropertyChanges { model.values: M3Variants.query(search.text) root.delegate: variantItem } } ] transitions: Transition { SequentialAnimation { ParallelAnimation { Anim { target: root property: "opacity" from: 1 to: 0 duration: Appearance.anim.durations.small easing.bezierCurve: Appearance.anim.curves.standardAccel } Anim { target: root property: "scale" from: 1 to: 0.9 duration: Appearance.anim.durations.small easing.bezierCurve: Appearance.anim.curves.standardAccel } } PropertyAction { targets: [model, root] properties: "values,delegate" } ParallelAnimation { Anim { target: root property: "opacity" from: 0 to: 1 duration: Appearance.anim.durations.small easing.bezierCurve: Appearance.anim.curves.standardDecel } Anim { target: root property: "scale" from: 0.9 to: 1 duration: Appearance.anim.durations.small easing.bezierCurve: Appearance.anim.curves.standardDecel } } PropertyAction { targets: [root.add, root.remove] property: "enabled" value: true } } } ScrollBar.vertical: StyledScrollBar {} add: Transition { enabled: !root.state Anim { properties: "opacity,scale" from: 0 to: 1 } } remove: Transition { enabled: !root.state Anim { properties: "opacity,scale" from: 1 to: 0 } } move: Transition { Anim { property: "y" } Anim { properties: "opacity,scale" to: 1 } } addDisplaced: Transition { Anim { property: "y" duration: Appearance.anim.durations.small } Anim { properties: "opacity,scale" to: 1 } } displaced: Transition { Anim { property: "y" } Anim { properties: "opacity,scale" to: 1 } } Component { id: appItem AppItem { visibilities: root.visibilities } } Component { id: actionItem ActionItem { list: root } } Component { id: calcItem CalcItem { list: root } } Component { id: schemeItem SchemeItem { list: root } } Component { id: variantItem VariantItem { list: root } } component Anim: NumberAnimation { duration: Appearance.anim.durations.normal easing.type: Easing.BezierSpline easing.bezierCurve: Appearance.anim.curves.standard } }