Newer
Older
/****************************************************************************
*
* (c) 2009-2016 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.FactControls 1.0
import QGroundControl.FactSystem 1.0
import QGroundControl.FlightMap 1.0
import QGroundControl.MultiVehicleManager 1.0
import QGroundControl.Palette 1.0
import QGroundControl.SettingsManager 1.0
QGCView {
id: _qgcView
viewPanel: panel
color: qgcPal.window
anchors.fill: parent
anchors.margins: ScreenTools.defaultFontPixelWidth
property real _labelWidth: ScreenTools.defaultFontPixelWidth * 20
property real _editFieldWidth: ScreenTools.defaultFontPixelWidth * 30
property real _buttonWidth: ScreenTools.defaultFontPixelWidth * 18
property real _panelWidth: _qgcView.width * _internalWidthRatio
property Fact _enableAirMapFact: QGroundControl.settingsManager.airMapSettings.enableAirMap
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
property bool _airMapEnabled: _enableAirMapFact.rawValue
readonly property real _internalWidthRatio: 0.8
QGCPalette { id: qgcPal }
QGCViewPanel {
id: panel
anchors.fill: parent
QGCFlickable {
clip: true
anchors.fill: parent
contentHeight: settingsColumn.height
contentWidth: settingsColumn.width
Column {
id: settingsColumn
width: _qgcView.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
visible: QGroundControl.settingsManager.unitsSettings.visible
QGCLabel {
id: generalLabel
text: qsTr("General")
font.family: ScreenTools.demiboldFontFamily
}
}
Rectangle {
height: generalCol.height + (ScreenTools.defaultFontPixelHeight * 2)
width: _panelWidth
color: qgcPal.windowShade
anchors.margins: ScreenTools.defaultFontPixelWidth
anchors.horizontalCenter: parent.horizontalCenter
Column {
id: generalCol
spacing: ScreenTools.defaultFontPixelWidth
anchors.centerIn: parent
FactCheckBox {
text: qsTr("Enable AirMap Services")
fact: _enableAirMapFact
visible: _enableAirMapFact.visible
}
FactCheckBox {
text: qsTr("Enable Telemetry")
fact: _enableTelemetryFact
visible: _enableTelemetryFact.visible
property Fact _enableTelemetryFact: QGroundControl.settingsManager.airMapSettings.enableTelemetry
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
}
}
}
//-----------------------------------------------------------------
//-- 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: 2
rowSpacing: ScreenTools.defaultFontPixelHeight * 0.25
anchors.centerIn: parent
visible: _usernameFact.visible
property Fact _usernameFact: QGroundControl.settingsManager.airMapSettings.userName
property Fact _passwordFact: QGroundControl.settingsManager.airMapSettings.password
}
Item {
width: 1
height: 1
Layout.columnSpan: 2
}
QGCLabel {
text: qsTr("Forgot Your AirMap Password?")
Layout.alignment: Qt.AlignHCenter
Layout.columnSpan: 2
text: qsTr("Register for an AirMap Account")
Layout.alignment: Qt.AlignHCenter
Layout.columnSpan: 2
enabled: _airMapEnabled
onClicked: {
Qt.openUrlExternally("https://www.airmap.com");
}
}
}
}
//-----------------------------------------------------------------
//-- Pilot Profile
Item {
width: _panelWidth
height: profileLabel.height
anchors.margins: ScreenTools.defaultFontPixelWidth
anchors.horizontalCenter: parent.horizontalCenter
visible: QGroundControl.settingsManager.appSettings.visible
QGCLabel {
id: profileLabel
font.family: ScreenTools.demiboldFontFamily
}
}
Rectangle {
height: profileGrid.height + (ScreenTools.defaultFontPixelHeight * 2)
width: _panelWidth
color: qgcPal.windowShade
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") }
}
}
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
//-----------------------------------------------------------------
//-- License (Will this stay here?)
Item {
width: _panelWidth
height: licenseLabel.height
anchors.margins: ScreenTools.defaultFontPixelWidth
anchors.horizontalCenter: parent.horizontalCenter
visible: QGroundControl.settingsManager.appSettings.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
GridLayout {
id: licenseGrid
columns: 2
columnSpacing: ScreenTools.defaultFontPixelHeight * 2
rowSpacing: ScreenTools.defaultFontPixelWidth * 0.25
anchors.centerIn: parent
QGCCheckBox {
id: hasPrivateKey
text: qsTr("Personal API Key")
Gus Grubba
committed
onClicked: QGroundControl.settingsManager.airMapSettings.usePersonalApiKey = checked
Layout.columnSpan: 2
Component.onCompleted: {
Gus Grubba
committed
checked = QGroundControl.settingsManager.airMapSettings.usePersonalApiKey
}
}
Item {
width: 1
height: 1
visible: hasPrivateKey.checked
Layout.columnSpan: 2
}
QGCLabel { text: qsTr("API Key:"); visible: hasPrivateKey.checked; }
FactTextField { fact: QGroundControl.settingsManager.airMapSettings.apiKey; width: _editFieldWidth * 2; visible: hasPrivateKey.checked; }
QGCLabel { text: qsTr("Client ID:"); visible: hasPrivateKey.checked; }
FactTextField { fact: QGroundControl.settingsManager.airMapSettings.clientID; width: _editFieldWidth * 2; visible: hasPrivateKey.checked; }
//-----------------------------------------------------------------
//-- 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
height: flightListButton.height + (ScreenTools.defaultFontPixelHeight * 2)
width: _panelWidth
color: qgcPal.windowShade
anchors.margins: ScreenTools.defaultFontPixelWidth
anchors.horizontalCenter: parent.horizontalCenter
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
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
}
}
}
}
}
Loader {
id: panelLoader
anchors.centerIn: parent
}
}
//---------------------------------------------------------------
//-- Flight List
Component {
id: flightList
Rectangle {
id: flightListRoot
width: _qgcView.width
height: _qgcView.height
color: qgcPal.window
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
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
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
}
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
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.enumStringValue + " " + settings.mapType.enumStringValue
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;
}
}