Newer
Older
/****************************************************************************
*
* (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 QtGraphicalEffects 1.0
import QtMultimedia 5.5
import QtQuick 2.3
import QtQuick.Controls 1.2
import QtQuick.Controls.Styles 1.4
import QtQuick.Dialogs 1.2
import QtQuick.Layouts 1.2
import QtLocation 5.3
import QtPositioning 5.3
import QGroundControl.Airspace 1.0
import QGroundControl.FactControls 1.0
import QGroundControl.FactSystem 1.0
import QGroundControl.FlightMap 1.0
import QGroundControl.MultiVehicleManager 1.0
import QGroundControl.Palette 1.0
Gus Grubba
committed
Item {
id: _root
anchors.fill: parent
anchors.margins: ScreenTools.defaultFontPixelWidth
property real _labelWidth: ScreenTools.defaultFontPixelWidth * 20
property real _editFieldWidth: ScreenTools.defaultFontPixelWidth * 20
property real _buttonWidth: ScreenTools.defaultFontPixelWidth * 18
Gus Grubba
committed
property real _panelWidth: _root.width * _internalWidthRatio
property Fact _enableAirMapFact: QGroundControl.settingsManager.airMapSettings.enableAirMap
property var _authStatus: QGroundControl.airspaceManager.authStatus
Gus Grubba
committed
QGCFlickable {
clip: true
anchors.fill: parent
contentHeight: settingsColumn.height
contentWidth: settingsColumn.width
Column {
id: settingsColumn
width: _root.width
spacing: ScreenTools.defaultFontPixelHeight * 0.5
anchors.margins: ScreenTools.defaultFontPixelWidth
//-----------------------------------------------------------------
//-- General
Item {
width: _panelWidth
height: generalLabel.height
anchors.margins: ScreenTools.defaultFontPixelWidth
anchors.horizontalCenter: parent.horizontalCenter
QGCLabel {
id: generalLabel
text: qsTr("General")
font.family: ScreenTools.demiboldFontFamily
Gus Grubba
committed
}
Rectangle {
height: generalRow.height + (ScreenTools.defaultFontPixelHeight * 2)
width: _panelWidth
color: qgcPal.windowShade
anchors.margins: ScreenTools.defaultFontPixelWidth
anchors.horizontalCenter: parent.horizontalCenter
Row {
id: generalRow
spacing: ScreenTools.defaultFontPixelWidth * 4
anchors.centerIn: parent
Column {
spacing: ScreenTools.defaultFontPixelWidth
FactCheckBox {
text: qsTr("Enable AirMap Services")
fact: _enableAirMapFact
visible: _enableAirMapFact.visible
Gus Grubba
committed
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
FactCheckBox {
text: qsTr("Enable Telemetry")
fact: _enableTelemetryFact
visible: _enableTelemetryFact.visible
enabled: _airMapEnabled
property Fact _enableTelemetryFact: QGroundControl.settingsManager.airMapSettings.enableTelemetry
}
FactCheckBox {
text: qsTr("Show Airspace on Map (Experimental)")
fact: _enableAirspaceFact
visible: _enableAirspaceFact.visible
enabled: _airMapEnabled
property Fact _enableAirspaceFact: QGroundControl.settingsManager.airMapSettings.enableAirspace
}
}
QGCButton {
text: qsTr("Clear Saved Answers")
enabled: _enableAirMapFact.rawValue
onClicked: clearDialog.open()
anchors.verticalCenter: parent.verticalCenter
MessageDialog {
id: clearDialog
visible: false
icon: StandardIcon.Warning
standardButtons: StandardButton.Yes | StandardButton.No
title: qsTr("Clear Saved Answers")
text: qsTr("All saved ruleset answers will be cleared. Is this really what you want?")
onYes: {
QGroundControl.airspaceManager.ruleSets.clearAllFeatures()
clearDialog.close()
}
onNo: {
clearDialog.close()
Gus Grubba
committed
}
//-----------------------------------------------------------------
//-- Connection Status
Item {
width: _panelWidth
height: statusLabel.height
anchors.margins: ScreenTools.defaultFontPixelWidth
anchors.horizontalCenter: parent.horizontalCenter
visible: QGroundControl.settingsManager.appSettings.visible && _airMapEnabled
QGCLabel {
id: statusLabel
text: qsTr("Connection Status")
font.family: ScreenTools.demiboldFontFamily
Gus Grubba
committed
}
Rectangle {
height: statusCol.height + (ScreenTools.defaultFontPixelHeight * 2)
width: _panelWidth
color: qgcPal.windowShade
visible: QGroundControl.settingsManager.appSettings.visible && _airMapEnabled
anchors.margins: ScreenTools.defaultFontPixelWidth
anchors.horizontalCenter: parent.horizontalCenter
Column {
id: statusCol
spacing: ScreenTools.defaultFontPixelHeight * 0.5
width: parent.width
anchors.centerIn: parent
QGCLabel {
text: QGroundControl.airspaceManager.connected ? qsTr("Connected") : qsTr("Not Connected")
color: QGroundControl.airspaceManager.connected ? qgcPal.colorGreen : qgcPal.colorRed
anchors.horizontalCenter: parent.horizontalCenter
Gus Grubba
committed
text: QGroundControl.airspaceManager.connectStatus
visible: QGroundControl.airspaceManager.connectStatus != ""
wrapMode: Text.WordWrap
horizontalAlignment: Text.AlignHCenter
width: parent.width * 0.8
anchors.horizontalCenter: parent.horizontalCenter
Gus Grubba
committed
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
}
//-----------------------------------------------------------------
//-- Login / Registration
Item {
width: _panelWidth
height: loginLabel.height
anchors.margins: ScreenTools.defaultFontPixelWidth
anchors.horizontalCenter: parent.horizontalCenter
QGCLabel {
id: loginLabel
text: qsTr("Login / Registration")
font.family: ScreenTools.demiboldFontFamily
}
}
Rectangle {
height: loginGrid.height + (ScreenTools.defaultFontPixelHeight * 2)
width: _panelWidth
color: qgcPal.windowShade
anchors.margins: ScreenTools.defaultFontPixelWidth
anchors.horizontalCenter: parent.horizontalCenter
GridLayout {
id: loginGrid
columns: 3
columnSpacing: ScreenTools.defaultFontPixelWidth
rowSpacing: ScreenTools.defaultFontPixelHeight * 0.25
anchors.centerIn: parent
QGCLabel { text: qsTr("User Name:") }
FactTextField {
fact: _usernameFact
width: _editFieldWidth
enabled: _airMapEnabled
visible: _usernameFact.visible
Layout.fillWidth: true
Layout.minimumWidth: _editFieldWidth
property Fact _usernameFact: QGroundControl.settingsManager.airMapSettings.userName
}
QGCLabel {
text: {
if(!QGroundControl.airspaceManager.connected)
return qsTr("Not Connected")
switch(_authStatus) {
case AirspaceManager.Unknown:
Gus Grubba
committed
case AirspaceManager.Anonymous:
return qsTr("Anonymous")
case AirspaceManager.Authenticated:
return qsTr("Authenticated")
default:
return qsTr("Authentication Error")
Gus Grubba
committed
Layout.rowSpan: 2
Layout.alignment: Qt.AlignVCenter
Gus Grubba
committed
QGCLabel { text: qsTr("Password:") }
FactTextField {
fact: _passwordFact
width: _editFieldWidth
enabled: _airMapEnabled
visible: _passwordFact.visible
echoMode: TextInput.Password
Layout.fillWidth: true
Layout.minimumWidth: _editFieldWidth
property Fact _passwordFact: QGroundControl.settingsManager.airMapSettings.password
Gus Grubba
committed
Item {
width: 1
height: 1
}
Item {
width: 1
height: 1
Layout.columnSpan: 3
Gus Grubba
committed
text: qsTr("Forgot Your AirMap Password?")
Layout.alignment: Qt.AlignHCenter
Layout.columnSpan: 3
Gus Grubba
committed
Item {
width: 1
height: 1
Layout.columnSpan: 3
}
QGCButton {
text: qsTr("Register for an AirMap Account")
Layout.alignment: Qt.AlignHCenter
Layout.columnSpan: 3
enabled: _airMapEnabled
onClicked: {
Qt.openUrlExternally("https://www.airmap.com");
Gus Grubba
committed
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
}
//-----------------------------------------------------------------
//-- Pilot Profile
Item {
//-- Disabled for now
width: _panelWidth
height: profileLabel.height
anchors.margins: ScreenTools.defaultFontPixelWidth
anchors.horizontalCenter: parent.horizontalCenter
visible: false // QGroundControl.settingsManager.appSettings.visible
QGCLabel {
id: profileLabel
text: qsTr("Pilot Profile (WIP)")
font.family: ScreenTools.demiboldFontFamily
}
}
Rectangle {
//-- Disabled for now
height: profileGrid.height + (ScreenTools.defaultFontPixelHeight * 2)
width: _panelWidth
color: qgcPal.windowShade
visible: false // QGroundControl.settingsManager.appSettings.visible
anchors.margins: ScreenTools.defaultFontPixelWidth
anchors.horizontalCenter: parent.horizontalCenter
GridLayout {
id: profileGrid
columns: 2
columnSpacing: ScreenTools.defaultFontPixelHeight * 2
rowSpacing: ScreenTools.defaultFontPixelWidth * 0.25
anchors.centerIn: parent
QGCLabel { text: qsTr("Name:") }
QGCLabel { text: qsTr("John Doe") }
QGCLabel { text: qsTr("User Name:") }
QGCLabel { text: qsTr("joe36") }
QGCLabel { text: qsTr("Email:") }
QGCLabel { text: qsTr("jonh@doe.com") }
QGCLabel { text: qsTr("Phone:") }
QGCLabel { text: qsTr("+1 212 555 1212") }
}
}
//-----------------------------------------------------------------
//-- License (Will this stay here?)
Item {
width: _panelWidth
height: licenseLabel.height
anchors.margins: ScreenTools.defaultFontPixelWidth
anchors.horizontalCenter: parent.horizontalCenter
visible: QGroundControl.settingsManager.airMapSettings.usePersonalApiKey.visible
QGCLabel {
id: licenseLabel
text: qsTr("License")
font.family: ScreenTools.demiboldFontFamily
}
}
Rectangle {
height: licenseGrid.height + (ScreenTools.defaultFontPixelHeight * 2)
width: _panelWidth
color: qgcPal.windowShade
anchors.margins: ScreenTools.defaultFontPixelWidth
anchors.horizontalCenter: parent.horizontalCenter
visible: QGroundControl.settingsManager.airMapSettings.usePersonalApiKey.visible
GridLayout {
id: licenseGrid
columns: 2
columnSpacing: ScreenTools.defaultFontPixelHeight * 2
rowSpacing: ScreenTools.defaultFontPixelWidth * 0.25
anchors.centerIn: parent
FactCheckBox {
id: hasPrivateKey
text: qsTr("Personal API Key")
fact: QGroundControl.settingsManager.airMapSettings.usePersonalApiKey
Layout.columnSpan: 2
}
Item {
width: 1
height: 1
visible: hasPrivateKey.checked
Layout.columnSpan: 2
Gus Grubba
committed
QGCLabel { text: qsTr("API Key:"); visible: hasPrivateKey.checked; }
FactTextField { fact: QGroundControl.settingsManager.airMapSettings.apiKey; width: _editFieldWidth * 2; visible: hasPrivateKey.checked; Layout.fillWidth: true; Layout.minimumWidth: _editFieldWidth * 2; }
QGCLabel { text: qsTr("Client ID:"); visible: hasPrivateKey.checked; }
FactTextField { fact: QGroundControl.settingsManager.airMapSettings.clientID; width: _editFieldWidth * 2; visible: hasPrivateKey.checked; Layout.fillWidth: true; Layout.minimumWidth: _editFieldWidth * 2; }
Gus Grubba
committed
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
}
//-----------------------------------------------------------------
//-- Flight List
Item {
width: _panelWidth
height: flightListLabel.height
anchors.margins: ScreenTools.defaultFontPixelWidth
anchors.horizontalCenter: parent.horizontalCenter
visible: QGroundControl.settingsManager.appSettings.visible
QGCLabel {
id: flightListLabel
text: qsTr("Flight List Management")
font.family: ScreenTools.demiboldFontFamily
}
}
Rectangle {
height: flightListButton.height + (ScreenTools.defaultFontPixelHeight * 2)
width: _panelWidth
color: qgcPal.windowShade
anchors.margins: ScreenTools.defaultFontPixelWidth
anchors.horizontalCenter: parent.horizontalCenter
QGCButton {
id: flightListButton
text: qsTr("Show Flight List")
backRadius: 4
heightFactor: 0.3333
showBorder: true
width: ScreenTools.defaultFontPixelWidth * 16
anchors.centerIn: parent
onClicked: {
panelLoader.sourceComponent = flightList
Gus Grubba
committed
}
Loader {
id: panelLoader
anchors.centerIn: parent
}
//---------------------------------------------------------------
//-- Flight List
Component {
id: flightList
Rectangle {
id: flightListRoot
Gus Grubba
committed
width: _root.width
height: _root.height
property var _flightList: QGroundControl.airspaceManager.flightPlan.flightList
property real _mapWidth: ScreenTools.defaultFontPixelWidth * 40
MouseArea {
anchors.fill: parent
hoverEnabled: true
onWheel: { wheel.accepted = true; }
onPressed: { mouse.accepted = true; }
onReleased: { mouse.accepted = true; }
}
//---------------------------------------------------------
//-- Flight List
RowLayout {
anchors.fill: parent
TableView {
id: tableView
model: _flightList
selectionMode: SelectionMode.SingleSelection
Layout.alignment: Qt.AlignVCenter
onCurrentRowChanged: {
var o = _flightList.get(tableView.currentRow)
if(o) {
flightArea.path = o.boundingBox
map.fitViewportToMapItems()
title: qsTr("No")
width: ScreenTools.defaultFontPixelWidth * 3
horizontalAlignment: Text.AlignHCenter
delegate : Text {
horizontalAlignment: Text.AlignHCenter
text: (styleData.row + 1)
color: tableView.currentRow === styleData.row ? qgcPal.colorBlue : "black"
font.family: ScreenTools.fixedFontFamily
font.pixelSize: ScreenTools.smallFontPointSize
}
}
TableViewColumn {
title: qsTr("Created")
width: ScreenTools.defaultFontPixelWidth * 18
horizontalAlignment: Text.AlignHCenter
delegate : Text {
horizontalAlignment: Text.AlignHCenter
text: {
var o = _flightList.get(styleData.row)
return o ? o.createdTime : ""
}
color: tableView.currentRow === styleData.row ? qgcPal.colorBlue : "black"
font.family: ScreenTools.fixedFontFamily
font.pixelSize: ScreenTools.smallFontPointSize
width: ScreenTools.defaultFontPixelWidth * 18
horizontalAlignment: Text.AlignHCenter
delegate : Text {
horizontalAlignment: Text.AlignHCenter
text: {
var o = _flightList.get(styleData.row)
return o ? o.startTime : ""
}
color: tableView.currentRow === styleData.row ? qgcPal.colorBlue : "black"
font.family: ScreenTools.fixedFontFamily
font.pixelSize: ScreenTools.smallFontPointSize
TableViewColumn {
title: qsTr("Flight End")
width: ScreenTools.defaultFontPixelWidth * 18
horizontalAlignment: Text.AlignHCenter
delegate : Text {
horizontalAlignment: Text.AlignHCenter
text: {
var o = _flightList.get(styleData.row)
return o ? o.endTime : ""
}
color: tableView.currentRow === styleData.row ? qgcPal.colorBlue : "black"
font.family: ScreenTools.fixedFontFamily
font.pixelSize: ScreenTools.smallFontPointSize
}
}
width: ScreenTools.defaultFontPixelWidth * 8
horizontalAlignment: Text.AlignHCenter
delegate : Text {
horizontalAlignment: Text.AlignHCenter
text: {
var o = _flightList.get(styleData.row)
return o ? (o.active ? qsTr("Active") : qsTr("Completed")) : qsTr("Unknown")
color: tableView.currentRow === styleData.row ? qgcPal.colorBlue : "black"
font.family: ScreenTools.fixedFontFamily
font.pixelSize: ScreenTools.smallFontPointSize
height: parent.height
Layout.alignment: Qt.AlignTop | Qt.AlignLeft
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
QGCLabel {
id: loadingLabel
text: qsTr("Loading Flight List")
visible: QGroundControl.airspaceManager.flightPlan.loadingFlightList
anchors.centerIn: parent
}
QGCColoredImage {
id: busyIndicator
height: ScreenTools.defaultFontPixelHeight * 2.5
width: height
source: "/qmlimages/MapSync.svg"
sourceSize.height: height
fillMode: Image.PreserveAspectFit
mipmap: true
smooth: true
color: qgcPal.colorGreen
visible: loadingLabel.visible
anchors.top: loadingLabel.bottom
anchors.topMargin: ScreenTools.defaultFontPixelHeight
anchors.horizontalCenter: parent.horizontalCenter
RotationAnimation on rotation {
loops: Animation.Infinite
from: 360
to: 0
duration: 740
running: busyIndicator.visible
}
}
spacing: ScreenTools.defaultFontPixelHeight * 0.75
visible: !QGroundControl.airspaceManager.flightPlan.loadingFlightList
anchors.top: parent.top
anchors.horizontalCenter: parent.horizontalCenter
QGCLabel {
text: qsTr("Flight List")
anchors.horizontalCenter: parent.horizontalCenter
}
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
Rectangle {
color: qgcPal.window
border.color: qgcPal.globalTheme === QGCPalette.Dark ? Qt.rgba(1,1,1,0.25) : Qt.rgba(0,0,0,0.25)
border.width: 1
radius: 4
width: _mapWidth - (ScreenTools.defaultFontPixelWidth * 2)
height: rangeCol.height + (ScreenTools.defaultFontPixelHeight * 2)
Column {
id: rangeCol
anchors.centerIn: parent
spacing: ScreenTools.defaultFontPixelHeight * 0.5
QGCLabel {
text: qsTr("Range")
anchors.horizontalCenter: parent.horizontalCenter
}
Row {
spacing: ScreenTools.defaultFontPixelWidth * 2
anchors.horizontalCenter: parent.horizontalCenter
Column {
spacing: ScreenTools.defaultFontPixelHeight * 0.5
QGCButton {
text: qsTr("From")
backRadius: 4
heightFactor: 0.3333
showBorder: true
width: _buttonWidth * 0.5
onClicked: fromPicker.visible = true
anchors.horizontalCenter: parent.horizontalCenter
}
QGCLabel {
anchors.horizontalCenter: parent.horizontalCenter
text: fromPicker.selectedDate.toLocaleDateString(Qt.locale())
}
}
Rectangle {
width: 1
height: parent.height
color: qgcPal.globalTheme === QGCPalette.Dark ? Qt.rgba(1,1,1,0.25) : Qt.rgba(0,0,0,0.25)
}
Column {
spacing: ScreenTools.defaultFontPixelHeight * 0.5
QGCButton {
text: qsTr("To")
backRadius: 4
heightFactor: 0.3333
showBorder: true
width: _buttonWidth * 0.5
onClicked: toPicker.visible = true
anchors.horizontalCenter: parent.horizontalCenter
}
QGCLabel {
anchors.horizontalCenter: parent.horizontalCenter
text: toPicker.selectedDate.toLocaleDateString(Qt.locale())
}
}
}
}
}
QGCButton {
text: qsTr("Refresh")
backRadius: 4
heightFactor: 0.3333
showBorder: true
width: _buttonWidth
enabled: true
anchors.horizontalCenter: parent.horizontalCenter
onClicked: {
var start = fromPicker.selectedDate
var end = toPicker.selectedDate
start.setHours(0,0,0,0)
end.setHours(23,59,59,0)
QGroundControl.airspaceManager.flightPlan.loadFlightList(start, end)
text: qsTr("End Selected")
backRadius: 4
heightFactor: 0.3333
showBorder: true
width: _buttonWidth
enabled: {
var o = _flightList.get(tableView.currentRow)
return o && o.active
}
anchors.horizontalCenter: parent.horizontalCenter
onClicked: {
endFlightDialog.visible = true
}
MessageDialog {
id: endFlightDialog
visible: false
icon: StandardIcon.Warning
standardButtons: StandardButton.Yes | StandardButton.No
title: qsTr("End Flight")
text: qsTr("Confirm ending active flight?")
onYes: {
var o = _flightList.get(tableView.currentRow)
if(o) {
QGroundControl.airspaceManager.flightPlan.endFlight(o.flightID)
}
endFlightDialog.visible = false
}
onNo: {
endFlightDialog.visible = false
}
}
QGCButton {
text: qsTr("Close")
backRadius: 4
heightFactor: 0.3333
showBorder: true
width: _buttonWidth
anchors.horizontalCenter: parent.horizontalCenter
onClicked: {
panelLoader.sourceComponent = null
}
}
text: _flightList.count > 0 ? _flightList.count + qsTr(" Flights Loaded") : qsTr("No Flights Loaded")
anchors.horizontalCenter: parent.horizontalCenter
}
QGCLabel {
text: qsTr("A maximum of 250 flights were loaded")
color: qgcPal.colorOrange
font.pixelSize: ScreenTools.smallFontPointSize
visible: _flightList.count >= 250
anchors.horizontalCenter: parent.horizontalCenter
}
text: qsTr("Flight Area ") + (tableView.currentRow + 1)
visible: !QGroundControl.airspaceManager.flightPlan.loadingFlightList && _flightList.count > 0 && tableView.currentRow >= 0
anchors.bottom: map.top
anchors.bottomMargin: ScreenTools.defaultFontPixelHeight * 0.25
}
Map {
id: map
width: ScreenTools.defaultFontPixelWidth * 40
height: width * 0.6666
anchors.bottom: parent.bottom
anchors.horizontalCenter: parent.horizontalCenter
zoomLevel: QGroundControl.flightMapZoom
center: QGroundControl.flightMapPosition
gesture.acceptedGestures: MapGestureArea.PinchGesture
plugin: Plugin { name: "QGroundControl" }
visible: !QGroundControl.airspaceManager.flightPlan.loadingFlightList && _flightList.count > 0 && tableView.currentRow >= 0
function updateActiveMapType() {
var settings = QGroundControl.settingsManager.flightMapSettings
var fullMapName = settings.mapProvider.value + " " + settings.mapType.value
for (var i = 0; i < map.supportedMapTypes.length; i++) {
if (fullMapName === map.supportedMapTypes[i].name) {
map.activeMapType = map.supportedMapTypes[i]
MapPolygon {
id: flightArea
color: Qt.rgba(1,0,0,0.2)
border.color: Qt.rgba(1,1,1,0.65)
Component.onCompleted: {
updateActiveMapType()
}
Connections {
target: QGroundControl.settingsManager.flightMapSettings.mapType
onRawValueChanged: updateActiveMapType()
}
Connections {
target: QGroundControl.settingsManager.flightMapSettings.mapProvider
onRawValueChanged: updateActiveMapType()
}
Calendar {
id: fromPicker
anchors.centerIn: parent
visible: false;
onClicked: {
visible = false;
}
}
Calendar {
id: toPicker
anchors.centerIn: parent
visible: false;
minimumDate: fromPicker.selectedDate
onClicked: {
visible = false;
}
}