summaryrefslogtreecommitdiffstats
path: root/examples/wayland/custom-extension/compositor/qml/main.qml
blob: 9907263dadb3a85ef1a0141b0cdcc08182881bba (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
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
// Copyright (C) 2017 The Qt Company Ltd.
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause

import QtQuick
import QtWayland.Compositor
import QtWayland.Compositor.XdgShell

import io.qt.examples.customextension 1.0

WaylandCompositor {
    id: comp

    property alias customExtension: custom
    property var itemList: []

    function itemForSurface(surface) {
        var n = itemList.length
        for (var i = 0; i < n; i++) {
            if (itemList[i].surface === surface)
                return itemList[i]
        }
    }

    CompositorScreen {
        compositor: comp
    }

    Component {
        id: chromeComponent
        ShellSurfaceItem {
            id: chrome

            property bool isCustom
            property int fontSize: 12

            onSurfaceDestroyed: {
                var index = itemList.indexOf(chrome)
                if (index > -1) {
                    var listCopy = itemList
                    listCopy.splice(index, 1)
                    itemList = listCopy
                }
                chrome.destroy()
            }

            transform: [
                Rotation {
                    id: xRot
                    origin.x: chrome.width / 2; origin.y: chrome.height / 2
                    angle: 0
                    axis { x: 1; y: 0; z: 0 }
                },
                Rotation {
                    id: yRot
                    origin.x: chrome.width / 2; origin.y: chrome.height / 2
                    angle: 0
                    axis { x: 0; y: 1; z: 0 }
                }
            ]

            NumberAnimation {
                id: spinAnimation
                running: false
                loops: 2
                target: yRot
                property: "angle"
                from: 0; to: 360
                duration: 400
            }

            function doSpin(ms) {
                console.log("spin " + ms)
                // using the 'ms' argument is left as an exercise for the reader...
                spinAnimation.start()
            }

            NumberAnimation {
                id: bounceAnimation
                running: false
                target: chrome
                property: "y"
                from: 0
                to: output.window.height - chrome.height
                easing.type: Easing.OutBounce
                duration: 1000
            }

            function doBounce(ms) {
                console.log("bounce " + ms)
                // using the 'ms' argument is left as an exercise for the reader...
                bounceAnimation.start()
            }

//! [setFontSize]
            onFontSizeChanged: {
                custom.setFontSize(surface, fontSize)
            }
//! [setFontSize]
        }
    }

    Component {
        id: customObjectComponent
        Rectangle {
            id: customItem
            property QtObject obj
            property alias text: label.text

            width: 100
            height: 100
            radius: width / 2
            x: Math.random() * (defaultOutput.surfaceArea.width - 100)
            y: Math.random() * (defaultOutput.surfaceArea.height - 100)

            Text {
                id: label
                anchors.centerIn: parent
                text: "?"
            }

            MouseArea {
                anchors.fill: parent
                onClicked: obj.sendClicked()
            }

            Connections {
                target: obj
                function onResourceDestroyed() {
                    customItem.destroy()
                }
            }
        }
    }

    XdgShell {
        onToplevelCreated: (toplevel, xdgSurface) => {
            var item = chromeComponent.createObject(defaultOutput.surfaceArea, { "shellSurface": xdgSurface } )
            var w = defaultOutput.surfaceArea.width / 2
            var h = defaultOutput.surfaceArea.height / 2
            item.x = Math.random() * w
            item.y = Math.random() * h
            var listCopy = itemList // List properties cannot be modified through Javascript operations
            listCopy.push(item)
            itemList = listCopy
        }
    }

//! [CustomExtension]
    CustomExtension {
        id: custom

        onSurfaceAdded: (surface) => {
            var item = itemForSurface(surface)
            item.isCustom = true
        }

        onBounce: (surface, ms) => {
            var item = itemForSurface(surface)
            item.doBounce(ms)
        }

        onSpin: (surface, ms) => {
            var item = itemForSurface(surface)
            item.doSpin(ms)
        }

        onCustomObjectCreated: (obj) => {
            var item = customObjectComponent.createObject(defaultOutput.surfaceArea,
                                                          { "color": obj.color,
                                                            "text": obj.text,
                                                            "obj": obj } )
        }
    }

    function setDecorations(shown) {
        var n = itemList.length
        for (var i = 0; i < n; i++) {
            if (itemList[i].isCustom)
                custom.showDecorations(itemList[i].surface.client, shown)
        }
    }
//! [CustomExtension]
}