File: SurfaceContainer.qml

package info (click to toggle)
lomiri 0.5.0-6
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 24,088 kB
  • sloc: cpp: 39,498; python: 2,559; javascript: 1,426; ansic: 1,012; sh: 289; xml: 252; makefile: 69
file content (134 lines) | stat: -rw-r--r-- 4,024 bytes parent folder | download
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
/*
 * Copyright 2014-2016 Canonical Ltd.
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU Lesser General Public License as published by
 * the Free Software Foundation; version 3.
 *
 * 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 Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public License
 * along with this program. If not, see <http://www.gnu.org/licenses/>.
*/

import QtQuick 2.15
import QtQml 2.15
import Lomiri.Components 1.3
import Lomiri.Gestures 0.1 // For TouchGate
import Utils 0.1 // for InputWatcher
import QtMir.Application 0.1 // for MirSurfaceItem

FocusScope {
    id: root
    objectName: "surfaceContainer"
    implicitWidth: surfaceItem.implicitWidth
    implicitHeight: surfaceItem.implicitHeight

    // Must be set from outside
    property var surface: null

    // Might be changed from outside
    property int requestedWidth: -1
    property int requestedHeight: -1
    property bool interactive
    property int surfaceOrientationAngle: 0
    property bool isPromptSurface: false
    property var stage : null
    // FIME - dont export, use interactive property. Need to fix qtmir to handle consumesInputChanged
    // to update surface activeFocus. See mock MirSurfaceItem.
    property alias consumesInput: surfaceItem.consumesInput

    property bool hadSurface: false

    signal sizeChanged(size size)

    onSurfaceChanged: {
        // Not a binding because animations might remove the surface from the surfaceItem
        // programatically (in order to signal that a zombie surface is free for deletion),
        // even though root.surface is still !null.
        if (surface != null)
            root.hadSurface = true;

        surfaceItem.surface = surface;
    }

    InputWatcher {
        target: surfaceItem
        onTargetPressedChanged: {
            if (targetPressed && root.interactive) {
                root.focus = true;
                root.forceActiveFocus();
            }
        }
    }

    MirSurfaceItem {
        id: surfaceItem
        objectName: "surfaceItem"
        anchors.fill: parent

        focus: true

        fillMode: MirSurfaceItem.PadOrCrop
        consumesInput: true

        surfaceWidth: root.requestedWidth
        surfaceHeight: root.requestedHeight

        enabled: root.interactive
        antialiasing: !root.interactive
        orientationAngle: root.surfaceOrientationAngle

        Connections {
            target: surfaceItem.surface
            onSizeChanged: {
                root.sizeChanged(value)
            }
        }
        clip: stage && stage.mode === "windowed"
    }

    TouchGate {
        targetItem: surfaceItem
        anchors.fill: root
        enabled: surfaceItem.enabled
    }

    Loader {
        id: animationsLoader
        objectName: "animationsLoader"
        active: root.surface || root.hadSurface
        source: {
            if (root.isPromptSurface) {
                return "PromptSurfaceAnimations.qml";
            } else {
                // Let ApplicationWindow do the animations
                return "";
            }
        }
        Binding {
            target: animationsLoader.item
            when: animationsLoader.item
            property: "surfaceItem"
            value: surfaceItem
            restoreMode: Binding.RestoreBinding
        }
        Binding {
            target: animationsLoader.item
            when: animationsLoader.item
            property: "container"
            value: root
            restoreMode: Binding.RestoreBinding
        }
        Binding {
            target: animationsLoader.item
            when: animationsLoader.item
            property: "hadSurface"
            value: hadSurface
            restoreMode: Binding.RestoreBinding
        }
    }
}