launcher: loader content

This commit is contained in:
2 * r + 2 * t 2025-09-12 18:04:44 +10:00
parent d06d8b870f
commit 302a82da2d
4 changed files with 61 additions and 51 deletions

View file

@ -11,7 +11,6 @@ import QtQuick
Item {
id: root
required property var wrapper
required property PersistentProperties visibilities
required property var panels
@ -21,9 +20,6 @@ Item {
implicitWidth: listWrapper.width + padding * 2
implicitHeight: searchWrapper.height + listWrapper.height + padding * 2
anchors.top: parent.top
anchors.horizontalCenter: parent.horizontalCenter
Item {
id: listWrapper
@ -37,7 +33,7 @@ Item {
ContentList {
id: list
wrapper: root.wrapper
content: root
visibilities: root.visibilities
panels: root.panels
search: search
@ -129,23 +125,19 @@ Item {
}
}
Component.onCompleted: forceActiveFocus()
Connections {
target: root.visibilities
function onLauncherChanged(): void {
if (root.visibilities.launcher)
search.focus = true;
else {
if (!root.visibilities.launcher)
search.text = "";
const current = list.currentList;
if (current)
current.currentIndex = 0;
}
}
function onSessionChanged(): void {
if (root.visibilities.launcher && !root.visibilities.session)
search.focus = true;
if (!root.visibilities.session)
search.forceActiveFocus();
}
}
}

View file

@ -11,7 +11,7 @@ import QtQuick.Controls
Item {
id: root
required property var wrapper
required property var content
required property PersistentProperties visibilities
required property var panels
required property TextField search
@ -77,7 +77,6 @@ Item {
id: appList
active: false
asynchronous: true
anchors.left: parent.left
anchors.right: parent.right
@ -92,7 +91,6 @@ Item {
id: wallpaperList
active: false
asynchronous: true
anchors.top: parent.top
anchors.bottom: parent.bottom
@ -102,7 +100,7 @@ Item {
search: root.search
visibilities: root.visibilities
panels: root.panels
wrapper: root.wrapper
content: root.content
}
}

View file

@ -13,7 +13,7 @@ PathView {
required property TextField search
required property PersistentProperties visibilities
required property var panels
required property var wrapper
required property var content
readonly property int itemWidth: Config.launcher.sizes.wallpaperWidth * 0.8 + Appearance.padding.larger * 2
@ -24,7 +24,7 @@ PathView {
// Screen width - 4x outer rounding - 2x max side thickness (cause centered)
let outerMargins = Math.max(Config.border.thickness, panels.bar.implicitWidth);
if (panels.popouts.hasCurrent && panels.popouts.currentCenter + panels.popouts.nonAnimHeight / 2 > screen.height - wrapper.implicitHeight - Config.border.thickness * 2)
if (panels.popouts.hasCurrent && panels.popouts.currentCenter + panels.popouts.nonAnimHeight / 2 > screen.height - content.implicitHeight - Config.border.thickness * 2)
outerMargins = panels.bar.implicitWidth + panels.popouts.nonAnimWidth;
const maxWidth = screen.width - Config.border.rounding * 4 - outerMargins * 2;

View file

@ -1,3 +1,5 @@
pragma ComponentBehavior: Bound
import qs.components
import qs.config
import Quickshell
@ -9,48 +11,66 @@ Item {
required property PersistentProperties visibilities
required property var panels
readonly property bool shouldBeActive: visibilities.launcher && Config.launcher.enabled
property int contentHeight
visible: height > 0
implicitHeight: 0
implicitWidth: content.implicitWidth
states: State {
name: "visible"
when: root.visibilities.launcher && Config.launcher.enabled
PropertyChanges {
root.implicitHeight: content.implicitHeight
onShouldBeActiveChanged: {
if (shouldBeActive) {
hideAnim.stop();
showAnim.start();
} else {
showAnim.stop();
hideAnim.start();
}
}
transitions: [
Transition {
from: ""
to: "visible"
SequentialAnimation {
id: showAnim
Anim {
target: root
property: "implicitHeight"
duration: Appearance.anim.durations.expressiveDefaultSpatial
easing.bezierCurve: Appearance.anim.curves.expressiveDefaultSpatial
}
},
Transition {
from: "visible"
to: ""
Anim {
target: root
property: "implicitHeight"
easing.bezierCurve: Appearance.anim.curves.emphasized
}
Anim {
target: root
property: "implicitHeight"
to: root.contentHeight
duration: Appearance.anim.durations.expressiveDefaultSpatial
easing.bezierCurve: Appearance.anim.curves.expressiveDefaultSpatial
}
]
ScriptAction {
script: root.implicitHeight = Qt.binding(() => content.implicitHeight)
}
}
Content {
SequentialAnimation {
id: hideAnim
ScriptAction {
script: root.implicitHeight = root.implicitHeight
}
Anim {
target: root
property: "implicitHeight"
to: 0
easing.bezierCurve: Appearance.anim.curves.emphasized
}
}
Loader {
id: content
wrapper: root
visibilities: root.visibilities
panels: root.panels
anchors.top: parent.top
anchors.horizontalCenter: parent.horizontalCenter
Component.onCompleted: {
root.contentHeight = implicitHeight;
active = Qt.binding(() => root.shouldBeActive || root.visible);
}
sourceComponent: Content {
visibilities: root.visibilities
panels: root.panels
}
}
}