pragma ComponentBehavior: Bound import qs.components import qs.components.images import qs.components.filedialog import qs.services import qs.config import qs.utils import QtQuick Item { id: root property string source: Paths.wallpaper property Image current: one anchors.fill: parent onSourceChanged: { if (!source) current = null; else if (current === one) two.update(); else one.update(); } Component.onCompleted: { if (source) Qt.callLater(() => one.update()); } Loader { anchors.fill: parent active: !root.source asynchronous: true sourceComponent: StyledRect { color: Colours.palette.m3surfaceContainer Row { anchors.centerIn: parent spacing: Appearance.spacing.large MaterialIcon { text: "sentiment_stressed" color: Colours.palette.m3onSurfaceVariant font.pointSize: Appearance.font.size.extraLarge * 5 } Column { anchors.verticalCenter: parent.verticalCenter spacing: Appearance.spacing.small StyledText { text: qsTr("Wallpaper missing?") color: Colours.palette.m3onSurfaceVariant font.pointSize: Appearance.font.size.extraLarge * 2 font.bold: true } } } } } Img { id: one } Img { id: two } component Img: CachingImage { id: img function update(): void { if (path === root.source) root.current = this; else path = root.source; } anchors.fill: parent opacity: 0 scale: 0.8 onStatusChanged: { if (status === Image.Ready) root.current = this; } states: State { name: "visible" when: root.current === img PropertyChanges { img.opacity: 1 img.scale: 1 } } transitions: Transition { Anim { target: img properties: "opacity,scale" } } } }