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
}
}
}
|