Newer
Older
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
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
/****************************************************************************
*
* (c) 2009-2020 QGROUNDCONTROL PROJECT <http://www.qgroundcontrol.org>
*
* QGroundControl is licensed according to the terms in the file
* COPYING.md in the root of the source code directory.
*
****************************************************************************/
import QtQuick 2.12
import QtQuick.Window 2.12
import QGroundControl 1.0
import QGroundControl.ScreenTools 1.0
import QGroundControl.Controls 1.0
import QGroundControl.Palette 1.0
Item {
id: _root
width: _pipSize
height: _pipSize * (9/16)
z: pipZOrder + 1
visible: item2 && item2.pipState !== item2.pipState.window
property var item1: null // Required
property var item2: null // Optional, may come and go
property string item1IsFullSettingsKey // Settings key to save whether item1 was saved in full mode
property real fullZOrder: 0 // zOrder for items in full mode
property real pipZOrder: 1 // zOrder for items in pip mode
readonly property string _pipExpandedSettingsKey: "IsPIPVisible"
property var _fullItem
property var _pipOrWindowItem
property alias _windowContentItem: window.contentItem
property bool _isExpanded: true
property real _pipSize: parent.width * 0.2
property real _maxSize: 0.75 // Percentage of parent control size
property real _minSize: 0.10
property bool _componentComplete: false
Component.onCompleted: {
_initForItems()
_componentComplete = true
}
onItem2Changed: _initForItems()
function showWindow() {
window.width = _root.width
window.height = _root.height
window.show()
}
function _initForItems() {
var item1IsFull = QGroundControl.loadBoolGlobalSetting(item1IsFullSettingsKey, true)
if (item1 && item2) {
item1.pipState.state = item1IsFull ? item1.pipState.fullState : item1.pipState.pipState
item2.pipState.state = item1IsFull ? item2.pipState.pipState : item2.pipState.fullState
_fullItem = item1IsFull ? item1 : item2
_pipOrWindowItem = item1IsFull ? item2 : item1
} else {
item1.pipState.state = item1.pipState.fullState
_fullItem = item1
_pipOrWindowItem = null
}
_setPipIsExpanded(QGroundControl.loadBoolGlobalSetting(_pipExpandedSettingsKey, true))
}
function _swapPip() {
var item1IsFull = false
if (item1.pipState.state === item1.pipState.fullState) {
item1.pipState.state = item1.pipState.pipState
item2.pipState.state = item2.pipState.fullState
_fullItem = item2
_pipOrWindowItem = item1
item1IsFull = false
} else {
item1.pipState.state = item1.pipState.fullState
item2.pipState.state = item2.pipState.pipState
_fullItem = item1
_pipOrWindowItem = item2
item1IsFull = true
}
QGroundControl.saveBoolGlobalSetting(item1IsFullSettingsKey, item1IsFull)
}
function _setPipIsExpanded(isExpanded) {
QGroundControl.saveBoolGlobalSetting(_pipExpandedSettingsKey, isExpanded)
_isExpanded = isExpanded
if (_pipOrWindowItem) {
_pipOrWindowItem.visible = isExpanded
}
}
Window {
id: window
visible: false
onClosing: {
var item = contentItem.children[0]
item.pipState.windowAboutToClose()
item.pipState.state = item.pipState.windowClosingState
item.pipState.state = item.pipState.pipState
}
}
MouseArea {
id: pipMouseArea
anchors.fill: parent
enabled: _isExpanded
hoverEnabled: true
onClicked: _swapPip()
}
// MouseArea to drag in order to resize the PiP area
MouseArea {
id: pipResize
anchors.top: parent.top
anchors.right: parent.right
height: ScreenTools.minTouchPixels
width: height
property real initialX: 0
property real initialWidth: 0
// When we push the mouse button down, we un-anchor the mouse area to prevent a resizing loop
onPressed: {
pipResize.anchors.top = undefined // Top doesn't seem to 'detach'
pipResize.anchors.right = undefined // This one works right, which is what we really need
pipResize.initialX = mouse.x
pipResize.initialWidth = _root.width
}
// When we let go of the mouse button, we re-anchor the mouse area in the correct position
onReleased: {
pipResize.anchors.top = _root.top
pipResize.anchors.right = _root.right
}
// Drag
onPositionChanged: {
if (pipResize.pressed) {
var parentWidth = _root.parent.width
var newWidth = pipResize.initialWidth + mouse.x - pipResize.initialX
if (newWidth < parentWidth * _maxSize && newWidth > parentWidth * _minSize) {
_pipSize = newWidth
}
}
}
}
// Resize icon
Image {
source: "/qmlimages/pipResize.svg"
fillMode: Image.PreserveAspectFit
mipmap: true
anchors.right: parent.right
anchors.top: parent.top
visible: _isExpanded && (ScreenTools.isMobile || pipMouseArea.containsMouse)
height: ScreenTools.defaultFontPixelHeight * 2.5
width: ScreenTools.defaultFontPixelHeight * 2.5
sourceSize.height: height
}
// Check min/max constraints on pip size when when parent is resized
Connections {
target: _root.parent
onWidthChanged: {
if (!_componentComplete) {
// Wait until first time setup is done
return
}
var parentWidth = _root.parent.width
if (_root.width > parentWidth * _maxSize) {
_pipSize = parentWidth * _maxSize
} else if (_root.width < parentWidth * _minSize) {
_pipSize = parentWidth * _minSize
}
}
}
// Pip to Window
Image {
id: popupPIP
source: "/qmlimages/PiP.svg"
mipmap: true
fillMode: Image.PreserveAspectFit
anchors.left: parent.left
anchors.top: parent.top
visible: _isExpanded && !ScreenTools.isMobile && pipMouseArea.containsMouse
height: ScreenTools.defaultFontPixelHeight * 2.5
width: ScreenTools.defaultFontPixelHeight * 2.5
sourceSize.height: height
MouseArea {
anchors.fill: parent
onClicked: _pipOrWindowItem.pipState.state = _pipOrWindowItem.pipState.windowState
}
}
Image {
id: hidePIP
source: "/qmlimages/pipHide.svg"
mipmap: true
fillMode: Image.PreserveAspectFit
anchors.left: parent.left
anchors.bottom: parent.bottom
visible: _isExpanded && (ScreenTools.isMobile || pipMouseArea.containsMouse)
height: ScreenTools.defaultFontPixelHeight * 2.5
width: ScreenTools.defaultFontPixelHeight * 2.5
sourceSize.height: height
MouseArea {
anchors.fill: parent
onClicked: _root._setPipIsExpanded(false)
}
}
Rectangle {
id: showPip
anchors.left : parent.left
anchors.bottom: parent.bottom
height: ScreenTools.defaultFontPixelHeight * 2
width: ScreenTools.defaultFontPixelHeight * 2
radius: ScreenTools.defaultFontPixelHeight / 3
visible: !_isExpanded
color: _fullItem.pipState.isDark ? Qt.rgba(0,0,0,0.75) : Qt.rgba(0,0,0,0.5)
Image {
width: parent.width * 0.75
height: parent.height * 0.75
sourceSize.height: height
source: "/res/buttonRight.svg"
mipmap: true
fillMode: Image.PreserveAspectFit
anchors.verticalCenter: parent.verticalCenter
anchors.horizontalCenter: parent.horizontalCenter
}
MouseArea {
anchors.fill: parent
onClicked: _root._setPipIsExpanded(true)
}
}
}