Lomiri
Loading...
Searching...
No Matches
SurfaceContainer.qml
1/*
2 * Copyright 2014-2016 Canonical Ltd.
3 *
4 * This program is free software; you can redistribute it and/or modify
5 * it under the terms of the GNU Lesser General Public License as published by
6 * the Free Software Foundation; version 3.
7 *
8 * This program is distributed in the hope that it will be useful,
9 * but WITHOUT ANY WARRANTY; without even the implied warranty of
10 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11 * GNU Lesser General Public License for more details.
12 *
13 * You should have received a copy of the GNU Lesser General Public License
14 * along with this program. If not, see <http://www.gnu.org/licenses/>.
15*/
16
17import QtQuick 2.15
18import QtQml 2.15
19import Lomiri.Components 1.3
20import Lomiri.Gestures 0.1 // For TouchGate
21import Utils 0.1 // for InputWatcher
22import QtMir.Application 0.1 // for MirSurfaceItem
23
24FocusScope {
25 id: root
26 objectName: "surfaceContainer"
27 implicitWidth: surfaceItem.implicitWidth
28 implicitHeight: surfaceItem.implicitHeight
29
30 // Must be set from outside
31 property var surface: null
32
33 // Might be changed from outside
34 property int requestedWidth: -1
35 property int requestedHeight: -1
36 property bool interactive
37 property int surfaceOrientationAngle: 0
38 property bool isPromptSurface: false
39 // FIME - dont export, use interactive property. Need to fix qtmir to handle consumesInputChanged
40 // to update surface activeFocus. See mock MirSurfaceItem.
41 property alias consumesInput: surfaceItem.consumesInput
42
43 property bool hadSurface: false
44
45 onSurfaceChanged: {
46 // Not a binding because animations might remove the surface from the surfaceItem
47 // programatically (in order to signal that a zombie surface is free for deletion),
48 // even though root.surface is still !null.
49 if (surface != null)
50 root.hadSurface = true;
51
52 surfaceItem.surface = surface;
53 }
54
55 InputWatcher {
56 target: surfaceItem
57 onTargetPressedChanged: {
58 if (targetPressed && root.interactive) {
59 root.focus = true;
60 root.forceActiveFocus();
61 }
62 }
63 }
64
65 MirSurfaceItem {
66 id: surfaceItem
67 objectName: "surfaceItem"
68 anchors.fill: parent
69
70 focus: true
71
72 fillMode: MirSurfaceItem.PadOrCrop
73 consumesInput: true
74
75 surfaceWidth: root.requestedWidth
76 surfaceHeight: root.requestedHeight
77
78 enabled: root.interactive
79 antialiasing: !root.interactive
80 orientationAngle: root.surfaceOrientationAngle
81 }
82
83 TouchGate {
84 targetItem: surfaceItem
85 anchors.fill: root
86 enabled: surfaceItem.enabled
87 }
88
89 Loader {
90 id: animationsLoader
91 objectName: "animationsLoader"
92 active: root.surface || root.hadSurface
93 source: {
94 if (root.isPromptSurface) {
95 return "PromptSurfaceAnimations.qml";
96 } else {
97 // Let ApplicationWindow do the animations
98 return "";
99 }
100 }
101 Binding {
102 target: animationsLoader.item
103 when: animationsLoader.item
104 property: "surfaceItem"
105 value: surfaceItem
106 restoreMode: Binding.RestoreBinding
107 }
108 Binding {
109 target: animationsLoader.item
110 when: animationsLoader.item
111 property: "container"
112 value: root
113 restoreMode: Binding.RestoreBinding
114 }
115 Binding {
116 target: animationsLoader.item
117 when: animationsLoader.item
118 property: "hadSurface"
119 value: hadSurface
120 restoreMode: Binding.RestoreBinding
121 }
122 }
123}