summaryrefslogtreecommitdiffstats
path: root/homescreen/qml/IconItem.qml
blob: a5c032e28ea003c63c17a27de5695f83b487c0eb (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
import QtQuick 2.0
import QtQuick.Controls 2.0
import QtGraphicalEffects 1.0

Item {
    id: main
    width: 320
    height: 320
    property string icon: model.icon

    Item {
        id: container
        parent: loc
        x: main.x
        y: main.y
        width: main.width
        height: main.height

        Image {
            id: item
            anchors.top: parent.top
            anchors.topMargin: 20
            anchors.horizontalCenter: parent.horizontalCenter
            width: 220
            height: width
            source: './images/%1_%2.svg'.arg(model.icon).arg(loc.pressed && (loc.index === model.index || loc.currentId === model.id) ? 'active' : 'inactive')
            antialiasing: item.state !== ''

            property string initial: model.name.substring(0,1).toUpperCase()

            Item {
                id: title
                width: 125
                height: 125
                anchors.centerIn: parent
                Repeater {
                    delegate: Label {
                        style: Text.Outline
                        styleColor: 'red'
                        color: 'transparent'
                        font.pixelSize: 125
                        anchors.centerIn: parent
                        anchors.horizontalCenterOffset: model.index / 3 - 1
                        anchors.verticalCenterOffset: model.index % 3 - 1
                        text: item.initial
                    }
                    model: main.icon === 'blank' ? 9 : 0
                }
                layer.enabled: true
                layer.effect: LinearGradient {
                    gradient: Gradient {
                        GradientStop { position: -0.5; color: "#6BFBFF" }
                        GradientStop { position: +1.5; color: "#00ADDC" }
                    }
                }
            }
        }
        Label {
            id: name
            anchors.top: item.bottom
            anchors.left: parent.left
            anchors.right: parent.right
            anchors.margins: 20
            font.pixelSize: 25
            font.letterSpacing: 5
            wrapMode: Text.WordWrap
            horizontalAlignment: Text.AlignHCenter
            color: "white"
            text: qsTr(model.name.toUpperCase())
        }

        Behavior on x { enabled: item.state !== 'active'; NumberAnimation { duration: 400; easing.type: Easing.OutCubic } }
        Behavior on y { enabled: item.state !== 'active'; NumberAnimation { duration: 400; easing.type: Easing.OutCubic } }
        SequentialAnimation on rotation {
            NumberAnimation { to:  5; duration: 100 }
            NumberAnimation { to: -5; duration: 200 }
            NumberAnimation { to:  0; duration: 100 }
            running: loc.currentId !== '' && item.state !== 'active'
            loops: Animation.Infinite; alwaysRunToEnd: true
        }
        states: [
            State {
                name: 'active'
                when: loc.currentId == model.id
                PropertyChanges {
                    target: container
                    x: loc.mouseX - width/2
                    y: loc.mouseY - height/2
                    scale: 1.15
                    z: 10
                }
            },
            State {
                when: loc.currentId !== ''
                PropertyChanges {
                    target: container
                    scale: 0.85
                    opacity: 0.75
                }
            }
        ]
        transitions: Transition { NumberAnimation { properties: 'scale, opacity, x, y'; duration: 150; easing.type: Easing.OutCubic} }
    }
}