aboutsummaryrefslogtreecommitdiffstats
path: root/desktop/modules/appearance/TransitionTile.qml
blob: 9c6d9ebb00592376edba474c4d6be6a6da115278 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
// Copyright (C) 2026 Danilo M. <danix@danix.xyz>
//
// 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 }
    }
}