pragma ComponentBehavior: Bound import "root:/widgets" import "root:/services" import "root:/config" import QtQuick import QtQuick.Dialogs Item { id: root property string source: Wallpapers.current property Image current: one anchors.fill: parent onSourceChanged: { if (!source) current = null; else if (current === one) two.update(); else 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 font.variableAxes: ({ opsz: 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 } StyledRect { implicitWidth: selectWallText.implicitWidth + Appearance.padding.large * 2 implicitHeight: selectWallText.implicitHeight + Appearance.padding.small * 2 radius: Appearance.rounding.full color: Colours.palette.m3primary FileDialog { id: dialog nameFilters: [`Image files (${Wallpapers.extensions.map(e => `*.${e}`).join(" ")})`] onAccepted: Wallpapers.setWallpaper(selectedFile.toString().replace("file://", "")) } StateLayer { radius: parent.radius color: Colours.palette.m3onPrimary function onClicked(): void { dialog.open(); } } StyledText { id: selectWallText anchors.centerIn: parent text: qsTr("Set it now!") color: Colours.palette.m3onPrimary font.pointSize: Appearance.font.size.large } } } } } } 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: Wallpapers.showPreview ? 1 : 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 { NumberAnimation { target: img properties: "opacity,scale" duration: Appearance.anim.durations.normal easing.type: Easing.BezierSpline easing.bezierCurve: Appearance.anim.curves.standard } } } }