From 698e163924744a57de12519dbbceff0e68c7e1a6 Mon Sep 17 00:00:00 2001 From: "Danilo M." Date: Fri, 6 Nov 2026 17:44:33 +0100 Subject: wallpaper: a page to preview and pick the transition A tile per transition plus Random. A click selects in the draft and plays the real shader between the two current wallpapers, and Apply or Reset in the header settle it, like every other draft page. Ticks are Random's pool. Co-Authored-By: Claude Opus 5.5 --- desktop/modules/appearance/TransitionTile.qml | 120 ++++++++++++++++++++++++++ 1 file changed, 120 insertions(+) create mode 100644 desktop/modules/appearance/TransitionTile.qml (limited to 'desktop/modules/appearance/TransitionTile.qml') diff --git a/desktop/modules/appearance/TransitionTile.qml b/desktop/modules/appearance/TransitionTile.qml new file mode 100644 index 0000000..9c6d9eb --- /dev/null +++ b/desktop/modules/appearance/TransitionTile.qml @@ -0,0 +1,120 @@ +// Copyright (C) 2026 Danilo M. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License version 2 as +// published by the Free Software Foundation. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +import QtQuick +import "../.." + +// One choice on the transitions page. A click selects it in the draft and +// plays it once between the two current wallpapers. The tick puts it in +// Random's pool. The tile named "random" has no shader and no tick. +Item { + id: tile + required property string name + required property string label + readonly property bool random: name === "random" + readonly property bool selected: Transitions.draftPick === name + readonly property bool shows: !random && Wallpapers.currentH !== "" && Wallpapers.currentV !== "" + property real progress: 0 + property point origin: Qt.point(0.5, 0.5) + + implicitHeight: thumb.height + 30 + + Glow { + anchors.fill: thumb + on: tile.selected + } + + Rectangle { + id: thumb + width: tile.width + height: Math.round(width * 9 / 16) + color: Theme.surface + clip: true + + // Same layering as the cover, WallpaperSpread.qml. ponytail: rests on + // the old picture again after playing, with a cut. + Image { + id: newImg + visible: tile.shows + anchors.fill: parent + source: tile.shows ? Wallpapers.currentV : "" + fillMode: Image.PreserveAspectCrop + sourceSize: Qt.size(thumb.width, thumb.height) + asynchronous: true + layer.enabled: tile.shows + } + Image { + id: oldImg + visible: tile.shows + anchors.fill: parent + source: tile.shows ? Wallpapers.currentH : "" + fillMode: Image.PreserveAspectCrop + sourceSize: Qt.size(thumb.width, thumb.height) + asynchronous: true + layer.enabled: tile.shows + layer.effect: WallShader { + name: tile.name + target: newImg + progress: tile.progress + aspect: thumb.width / Math.max(1, thumb.height) + origin: tile.origin + } + } + + Text { + anchors.centerIn: parent + visible: tile.random + // nf-fa-shuffle, present in Inconsolata Nerd Font. + text: "" + color: Theme.subtext + font { family: Theme.iconFamily; pixelSize: Theme.fontSize * 2 } + } + + MouseArea { + anchors.fill: parent + cursorShape: Qt.PointingHandCursor + onClicked: { + Transitions.draftPick = tile.name; + if (!tile.shows) return; + tile.origin = Qt.point(Math.random(), Math.random()); + play.restart(); + } + } + } + + NumberAnimation { + id: play + target: tile + property: "progress" + from: 0 + to: 1 + duration: Transitions.duration + onFinished: tile.progress = 0 + } + + Toggle { + anchors { top: thumb.bottom; topMargin: 6; left: parent.left } + visible: !tile.random + label: tile.label + // Toggle assigns checked itself, which would break a plain binding + // and leave the tick stale after Reset. + Binding on checked { value: Transitions.draftPool.indexOf(tile.name) >= 0 } + onToggled: Transitions.toggle(tile.name) + } + + Text { + anchors { top: thumb.bottom; topMargin: 8; left: parent.left } + visible: tile.random + text: tile.label + color: Theme.subtext + font { family: Theme.fontFamily; pixelSize: Theme.fontSize - 4 } + } +} -- cgit v1.2.3