Loading...
Searching...
No Matches
SurfaceContainer.qml
/*
* 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
}
}
}