Browse Source

Done with first pass of the Flight View re-work.

QGC4.4
dogmaphobic 10 years ago
parent
commit
b14e1a463f
  1. 5
      qgroundcontrol.qrc
  2. 192
      src/FlightDisplay/FlightDisplayView.qml
  3. 222
      src/FlightDisplay/FlightDisplayViewDelayLoad.qml
  4. 202
      src/FlightDisplay/FlightDisplayViewWidgets.qml
  5. 1
      src/FlightDisplay/qmldir
  6. 4
      src/FlightMap/FlightMap.qml
  7. 16
      src/FlightMap/Images/ZoomMinus.svg
  8. 13
      src/FlightMap/Images/ZoomPlus.svg
  9. 7
      src/FlightMap/MapItems/VehicleMapItem.qml
  10. 56
      src/FlightMap/Widgets/QGCInstrumentWidget.qml
  11. 215
      src/MissionEditor/MissionEditor.qml

5
qgroundcontrol.qrc

@ -77,11 +77,14 @@
<file alias="FlightDisplayView.qml">src/FlightDisplay/FlightDisplayView.qml</file> <file alias="FlightDisplayView.qml">src/FlightDisplay/FlightDisplayView.qml</file>
<file alias="FlightDisplayWidget.qml">src/FlightDisplay/FlightDisplayWidget.qml</file> <file alias="FlightDisplayWidget.qml">src/FlightDisplay/FlightDisplayWidget.qml</file>
<file alias="MissionEditor.qml">src/MissionEditor/MissionEditor.qml</file> <file alias="MissionEditor.qml">src/MissionEditor/MissionEditor.qml</file>
<file alias="MissionEditorHelp.qml">src/MissionEditor/MissionEditorHelp.qml</file>
<!-- FlightDisplay module --> <!-- FlightDisplay module -->
<file alias="QGroundControl/FlightDisplay/qmldir">src/FlightDisplay/qmldir</file> <file alias="QGroundControl/FlightDisplay/qmldir">src/FlightDisplay/qmldir</file>
<file alias="QGroundControl/FlightDisplay/FlightDisplayView.qml">src/FlightDisplay/FlightDisplayView.qml</file> <file alias="QGroundControl/FlightDisplay/FlightDisplayView.qml">src/FlightDisplay/FlightDisplayView.qml</file>
<file alias="QGroundControl/FlightDisplay/FlightDisplayViewDelayLoad.qml">src/FlightDisplay/FlightDisplayViewDelayLoad.qml</file> <file alias="QGroundControl/FlightDisplay/FlightDisplayViewMap.qml">src/FlightDisplay/FlightDisplayViewMap.qml</file>
<file alias="QGroundControl/FlightDisplay/FlightDisplayViewVideo.qml">src/FlightDisplay/FlightDisplayViewVideo.qml</file>
<file alias="QGroundControl/FlightDisplay/FlightDisplayViewWidgets.qml">src/FlightDisplay/FlightDisplayViewWidgets.qml</file>
<!-- FlightMap module --> <!-- FlightMap module -->
<file alias="QGroundControl/FlightMap/qmldir">src/FlightMap/qmldir</file> <file alias="QGroundControl/FlightMap/qmldir">src/FlightMap/qmldir</file>

192
src/FlightDisplay/FlightDisplayView.qml

@ -41,16 +41,6 @@ import QGroundControl.Controllers 1.0
Item { Item {
id: root id: root
property alias latitude: flightMap.latitude
property alias longitude: flightMap.longitude
// Top margin for all widgets. Used to prevent overlap with the toolbar
property real topMargin: 0
// Used by parent to hide widgets when it displays something above in the z order.
// Prevents z order drawing problems.
property bool hideWidgets: false
QGCPalette { id: qgcPal; colorGroupEnabled: enabled } QGCPalette { id: qgcPal; colorGroupEnabled: enabled }
property var _activeVehicle: multiVehicleManager.activeVehicle property var _activeVehicle: multiVehicleManager.activeVehicle
@ -64,139 +54,117 @@ Item {
readonly property real _defaultAirSpeed: 0 readonly property real _defaultAirSpeed: 0
readonly property real _defaultClimbRate: 0 readonly property real _defaultClimbRate: 0
readonly property string _mapName: "FlightDisplayView" readonly property string _mapName: "FlightDisplayView"
readonly property string _showMapBackgroundKey: "/showMapBackground" readonly property string _showMapBackgroundKey: "/showMapBackground"
readonly property var _flightMap: flightMap property bool _mainIsMap: !_controller.hasVideo
property real _roll: _activeVehicle ? (isNaN(_activeVehicle.roll) ? _defaultRoll : _activeVehicle.roll) : _defaultRoll property real _roll: _activeVehicle ? (isNaN(_activeVehicle.roll) ? _defaultRoll : _activeVehicle.roll) : _defaultRoll
property real _pitch: _activeVehicle ? (isNaN(_activeVehicle.pitch) ? _defaultPitch : _activeVehicle.pitch) : _defaultPitch property real _pitch: _activeVehicle ? (isNaN(_activeVehicle.pitch) ? _defaultPitch : _activeVehicle.pitch) : _defaultPitch
property real _heading: _activeVehicle ? (isNaN(_activeVehicle.heading) ? _defaultHeading : _activeVehicle.heading) : _defaultHeading property real _heading: _activeVehicle ? (isNaN(_activeVehicle.heading) ? _defaultHeading : _activeVehicle.heading) : _defaultHeading
property var _vehicleCoordinate: _activeVehicle ? (_activeVehicle.coordinateValid ? _activeVehicle.coordinate : _defaultVehicleCoordinate) : _defaultVehicleCoordinate property var _vehicleCoordinate: _activeVehicle ? (_activeVehicle.coordinateValid ? _activeVehicle.coordinate : _defaultVehicleCoordinate) : _defaultVehicleCoordinate
property real _altitudeWGS84: _activeVehicle ? _activeVehicle.altitudeWGS84 : _defaultAltitudeWGS84 property real _altitudeWGS84: _activeVehicle ? _activeVehicle.altitudeWGS84 : _defaultAltitudeWGS84
property real _groundSpeed: _activeVehicle ? _activeVehicle.groundSpeed : _defaultGroundSpeed property real _groundSpeed: _activeVehicle ? _activeVehicle.groundSpeed : _defaultGroundSpeed
property real _airSpeed: _activeVehicle ? _activeVehicle.airSpeed : _defaultAirSpeed property real _airSpeed: _activeVehicle ? _activeVehicle.airSpeed : _defaultAirSpeed
property real _climbRate: _activeVehicle ? _activeVehicle.climbRate : _defaultClimbRate property real _climbRate: _activeVehicle ? _activeVehicle.climbRate : _defaultClimbRate
property bool _showMap: getBool(QGroundControl.flightMapSettings.loadMapSetting(flightMap.mapName, _showMapBackgroundKey, "1")) property var _flightMap: null
property var _flightVideo: null
property var _savedZoomLevel: 0
FlightDisplayViewController { id: _controller } FlightDisplayViewController { id: _controller }
MissionController { MissionController {
id: _missionController id: _missionController
Component.onCompleted: start(false /* editMode */) Component.onCompleted: start(false /* editMode */)
} }
ExclusiveGroup { function reloadContents() {
id: _dropButtonsExclusiveGroup if(_flightVideo) {
_flightVideo.visible = false
}
if(_mainIsMap) {
mainLoader.source = "FlightDisplayViewMap.qml"
pipLoader.source = "FlightDisplayViewVideo.qml"
} else {
mainLoader.source = "FlightDisplayViewVideo.qml"
pipLoader.source = "FlightDisplayViewMap.qml"
}
} }
// Validate _showMap setting
Component.onCompleted: { Component.onCompleted: {
delayLoader.source = "FlightDisplayViewDelayLoad.qml" reloadContents();
widgetsLoader.source = "FlightDisplayViewWidgets.qml"
// We have to be careful to not reference root properties in a function which is in a subcomponent
// until the root component has completed loading. Otherwise you get undefined references.
flightMap.rootLoadCompleted = true
flightMap.updateMapPosition(true /* force */)
_setShowMap(_showMap)
}
function getBool(value) {
return value === '0' ? false : true;
} }
function setBool(value) { //-- Main Window
return value ? "1" : "0"; Loader {
} id: mainLoader
anchors.fill: parent
function _setShowMap(showMap) { onLoaded: {
_showMap = _controller.hasVideo ? showMap : true if(_mainIsMap) {
QGroundControl.flightMapSettings.saveMapSetting(flightMap.mapName, _showMapBackgroundKey, setBool(_showMap)) _flightMap = item
} if(_savedZoomLevel != 0)
_flightMap.zoomLevel = _savedZoomLevel
FlightMap { else
id: flightMap _savedZoomLevel = _flightMap.zoomLevel
anchors.fill: parent _flightMap.updateMapPosition(true /* force */)
mapName: _mapName } else {
visible: _showMap _flightVideo = item
latitude: root._defaultCoordinate.latitude _flightVideo.visible = true
longitude: root._defaultCoordinate.longitude
property var rootVehicleCoordinate: _vehicleCoordinate
property bool rootLoadCompleted: false
property bool _followVehicle: true
onRootVehicleCoordinateChanged: updateMapPosition(false /* force */)
function updateMapPosition(force) {
if ((_followVehicle || force) && rootLoadCompleted) {
flightMap.latitude = root._vehicleCoordinate.latitude
flightMap.longitude = root._vehicleCoordinate.longitude
} }
} }
}
// Home position //-- PIP Window
MissionItemIndicator { Rectangle {
label: "H" id: pip
coordinate: (_activeVehicle && _activeVehicle.homePositionAvailable) ? _activeVehicle.homePosition : QtPositioning.coordinate(0, 0) visible: _controller.hasVideo
visible: _activeVehicle ? _activeVehicle.homePositionAvailable : false anchors.margins: ScreenTools.defaultFontPixelHeight
z: QGroundControl.zOrderMapItems anchors.left: parent.left
} anchors.bottom: parent.bottom
height: ScreenTools.defaultFontPixelSize * (9)
// Add trajectory points to the map width: ScreenTools.defaultFontPixelSize * (9) * (16/9)
MapItemView { color: "#000010"
model: multiVehicleManager.activeVehicle ? multiVehicleManager.activeVehicle.trajectoryPoints : 0 border.width: 4
radius: 4
delegate: border.color: {
MapPolyline { if(_mainIsMap && _flightMap != null)
line.width: 3 return _flightMap.isSatelliteMap ? Qt.rgba(1,1,1,0.75) : Qt.rgba(0,0,0,0.75)
line.color: "orange" else
z: QGroundControl.zOrderMapItems - 1 return Qt.rgba(0,0,0,0.75)
path: [
{ latitude: object.coordinate1.latitude, longitude: object.coordinate1.longitude },
{ latitude: object.coordinate2.latitude, longitude: object.coordinate2.longitude },
]
}
} }
Loader {
// Add the vehicles to the map id: pipLoader
MapItemView { anchors.fill: parent
model: multiVehicleManager.vehicles anchors.margins: 2
onLoaded: {
delegate: if(_mainIsMap) {
VehicleMapItem { _flightVideo = item
vehicle: object _flightVideo.visible = true
coordinate: object.coordinate } else {
isSatellite: flightMap.isSatelliteMap _flightMap = item
z: QGroundControl.zOrderMapItems _savedZoomLevel = _flightMap.zoomLevel
_flightMap.zoomLevel = _savedZoomLevel - 3
} }
pip.visible = _controller.hasVideo
}
} }
// Add the mission items to the map
MissionItemView {
model: _missionController.missionItems
}
// Add lines between waypoints
MissionLineView {
model: _missionController.waypointLines
}
// Used to make pinch zoom work
MouseArea { MouseArea {
anchors.fill: parent anchors.fill: parent
onClicked: {
_mainIsMap = !_mainIsMap
pip.visible = false
reloadContents();
}
} }
} // Flight Map }
//-- Widgets
Loader { Loader {
id: delayLoader id: widgetsLoader
anchors.fill: parent anchors.fill: parent
} }
} }

222
src/FlightDisplay/FlightDisplayViewDelayLoad.qml

@ -1,222 +0,0 @@
/*=====================================================================
QGroundControl Open Source Ground Control Station
(c) 2009, 2015 QGROUNDCONTROL PROJECT <http://www.qgroundcontrol.org>
This file is part of the QGROUNDCONTROL project
QGROUNDCONTROL is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
QGROUNDCONTROL 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 General Public License for more details.
You should have received a copy of the GNU General Public License
along with QGROUNDCONTROL. If not, see <http://www.gnu.org/licenses/>.
======================================================================*/
import QtQuick 2.4
import QtQuick.Controls 1.3
import QtQuick.Controls.Styles 1.2
import QtQuick.Dialogs 1.2
import QtLocation 5.3
import QtPositioning 5.2
import QGroundControl 1.0
import QGroundControl.ScreenTools 1.0
import QGroundControl.Controls 1.0
import QGroundControl.Palette 1.0
import QGroundControl.Vehicle 1.0
import QGroundControl.FlightMap 1.0
/// This component is used to delay load the items which are direct children of the
/// FlightDisplayViewControl.
Item {
QGCVideoBackground {
anchors.fill: parent
display: _controller.videoSurface
receiver: _controller.videoReceiver
visible: !_showMap
QGCCompassHUD {
id: compassHUD
y: root.height * 0.7
x: root.width * 0.5 - ScreenTools.defaultFontPixelSize * (5)
width: ScreenTools.defaultFontPixelSize * (10)
height: ScreenTools.defaultFontPixelSize * (10)
heading: _heading
active: multiVehicleManager.activeVehicleAvailable
z: QGroundControl.zOrderWidgets
}
QGCAttitudeHUD {
id: attitudeHUD
rollAngle: _roll
pitchAngle: _pitch
width: ScreenTools.defaultFontPixelSize * (30)
height: ScreenTools.defaultFontPixelSize * (30)
active: multiVehicleManager.activeVehicleAvailable
z: QGroundControl.zOrderWidgets
}
}
//-- Vehicle GPS lock display
Column {
id: gpsLockColumn
y: (parent.height - height) / 2
width: parent.width
Repeater {
model: multiVehicleManager.vehicles
delegate:
QGCLabel {
width: gpsLockColumn.width
horizontalAlignment: Text.AlignHCenter
visible: !object.coordinateValid
text: "No GPS Lock for Vehicle #" + object.id
z: QGroundControl.zOrderMapItems - 2
}
}
}
//-- Instrument Pannel
QGCInstrumentWidget {
anchors.margins: ScreenTools.defaultFontPixelHeight
anchors.left: parent.left
anchors.bottom: parent.bottom
size: ScreenTools.defaultFontPixelSize * (9)
heading: _heading
rollAngle: _roll
pitchAngle: _pitch
z: QGroundControl.zOrderWidgets
}
//-- Map Center Control
DropButton {
id: centerMapDropButton
anchors.rightMargin: ScreenTools.defaultFontPixelHeight
anchors.right: mapTypeButton.left
anchors.top: mapTypeButton.top
dropDirection: dropDown
buttonImage: "/qmlimages/MapCenter.svg"
viewportMargins: ScreenTools.defaultFontPixelWidth / 2
exclusiveGroup: _dropButtonsExclusiveGroup
z: QGroundControl.zOrderWidgets
dropDownComponent: Component {
Row {
spacing: ScreenTools.defaultFontPixelWidth
QGCCheckBox {
id: followVehicleCheckBox
text: "Follow Vehicle"
checked: flightMap._followVehicle
anchors.baseline: centerMapButton.baseline
onClicked: {
centerMapDropButton.hideDropDown()
flightMap._followVehicle = !flightMap._followVehicle
}
}
QGCButton {
id: centerMapButton
text: "Center map on Vehicle"
enabled: _activeVehicle && !followVehicleCheckBox.checked
property var activeVehicle: multiVehicleManager.activeVehicle
onClicked: {
centerMapDropButton.hideDropDown()
flightMap.latitude = activeVehicle.latitude
flightMap.longitude = activeVehicle.longitude
}
}
}
}
}
//-- Map Type Control
DropButton {
id: mapTypeButton
anchors.topMargin: topMargin
anchors.rightMargin: ScreenTools.defaultFontPixelHeight
anchors.top: parent.top
anchors.right: parent.right
dropDirection: dropDown
buttonImage: "/qmlimages/MapType.svg"
viewportMargins: ScreenTools.defaultFontPixelWidth / 2
exclusiveGroup: _dropButtonsExclusiveGroup
z: QGroundControl.zOrderWidgets
dropDownComponent: Component {
Row {
spacing: ScreenTools.defaultFontPixelWidth
Repeater {
model: QGroundControl.flightMapSettings.mapTypes
QGCButton {
checkable: true
checked: flightMap.mapType == text
text: modelData
onClicked: {
flightMap.mapType = text
mapTypeButton.hideDropDown()
}
}
}
}
}
}
//-- Temporary Options Button
QGCButton {
id: optionsButton
x: _flightMap.mapWidgets.x
y: _flightMap.mapWidgets.y - height - (ScreenTools.defaultFontPixelHeight / 2)
z: QGroundControl.zOrderWidgets
width: _flightMap.mapWidgets.width
text: "Options"
menu: optionsMenu
visible: _controller.hasVideo && !hideWidgets
ExclusiveGroup {
id: backgroundTypeGroup
}
Menu {
id: optionsMenu
MenuItem {
id: mapBackgroundMenuItem
exclusiveGroup: backgroundTypeGroup
checkable: true
checked: _showMap
text: "Show map as background"
onTriggered: _setShowMap(true)
}
MenuItem {
id: videoBackgroundMenuItem
exclusiveGroup: backgroundTypeGroup
checkable: true
checked: !_showMap
text: "Show video as background"
onTriggered: _setShowMap(false)
}
}
}
}

202
src/FlightDisplay/FlightDisplayViewWidgets.qml

@ -0,0 +1,202 @@
/*=====================================================================
QGroundControl Open Source Ground Control Station
(c) 2009, 2015 QGROUNDCONTROL PROJECT <http://www.qgroundcontrol.org>
This file is part of the QGROUNDCONTROL project
QGROUNDCONTROL is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
QGROUNDCONTROL 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 General Public License for more details.
You should have received a copy of the GNU General Public License
along with QGROUNDCONTROL. If not, see <http://www.gnu.org/licenses/>.
======================================================================*/
import QtQuick 2.4
import QtQuick.Controls 1.3
import QtQuick.Controls.Styles 1.2
import QtQuick.Dialogs 1.2
import QtLocation 5.3
import QtPositioning 5.2
import QGroundControl 1.0
import QGroundControl.ScreenTools 1.0
import QGroundControl.Controls 1.0
import QGroundControl.Palette 1.0
import QGroundControl.Vehicle 1.0
import QGroundControl.FlightMap 1.0
/// This component is used to delay load the items which are direct children of the
/// FlightDisplayViewControl.
Item {
ExclusiveGroup {
id: _dropButtonsExclusiveGroup
}
//-- Vehicle GPS lock display
Column {
id: gpsLockColumn
y: (parent.height - height) / 2
width: parent.width
Repeater {
model: multiVehicleManager.vehicles
delegate:
QGCLabel {
width: gpsLockColumn.width
horizontalAlignment: Text.AlignHCenter
visible: !object.coordinateValid
text: "No GPS Lock for Vehicle #" + object.id
z: QGroundControl.zOrderMapItems - 2
}
}
}
//-- Dismiss Drop Down (if any)
MouseArea {
anchors.fill: parent
enabled: _dropButtonsExclusiveGroup.current != null
onClicked: {
if(_dropButtonsExclusiveGroup.current)
_dropButtonsExclusiveGroup.current.checked = false
_dropButtonsExclusiveGroup.current = null
}
}
//-- Instrument Pannel
QGCInstrumentWidget {
anchors.margins: ScreenTools.defaultFontPixelHeight
anchors.bottom: parent.bottom
anchors.right: parent.right
size: ScreenTools.defaultFontPixelSize * (9)
active: _activeVehicle != null
heading: _heading
rollAngle: _roll
pitchAngle: _pitch
isSatellite: _mainIsMap ? _flightMap ? _flightMap.isSatelliteMap : true : true
z: QGroundControl.zOrderWidgets
}
//-- Vertical Tool Buttons
Column {
id: toolColumn
anchors.margins: ScreenTools.defaultFontPixelHeight
anchors.left: parent.left
anchors.top: parent.top
spacing: ScreenTools.defaultFontPixelHeight
//-- Map Center Control
DropButton {
id: centerMapDropButton
dropDirection: dropRight
buttonImage: "/qmlimages/MapCenter.svg"
viewportMargins: ScreenTools.defaultFontPixelWidth / 2
exclusiveGroup: _dropButtonsExclusiveGroup
z: QGroundControl.zOrderWidgets
dropDownComponent: Component {
Row {
spacing: ScreenTools.defaultFontPixelWidth
QGCCheckBox {
id: followVehicleCheckBox
text: "Follow Vehicle"
checked: _flightMap ? _flightMap._followVehicle : false
anchors.baseline: centerMapButton.baseline
onClicked: {
_dropButtonsExclusiveGroup.current = null
_flightMap._followVehicle = !_flightMap._followVehicle
}
}
QGCButton {
id: centerMapButton
text: "Center map on Vehicle"
enabled: _activeVehicle && !followVehicleCheckBox.checked
property var activeVehicle: multiVehicleManager.activeVehicle
onClicked: {
_dropButtonsExclusiveGroup.current = null
_flightMap.latitude = activeVehicle.latitude
_flightMap.longitude = activeVehicle.longitude
}
}
}
}
}
//-- Map Type Control
DropButton {
id: mapTypeButton
dropDirection: dropRight
buttonImage: "/qmlimages/MapType.svg"
viewportMargins: ScreenTools.defaultFontPixelWidth / 2
exclusiveGroup: _dropButtonsExclusiveGroup
z: QGroundControl.zOrderWidgets
dropDownComponent: Component {
Row {
spacing: ScreenTools.defaultFontPixelWidth
Repeater {
model: QGroundControl.flightMapSettings.mapTypes
QGCButton {
checkable: true
checked: _flightMap ? _flightMap.mapType == text : false
text: modelData
onClicked: {
_flightMap.mapType = text
_dropButtonsExclusiveGroup.current = null
}
}
}
}
}
}
//-- Zoom Map In
RoundButton {
id: mapZoomPlus
visible: _mainIsMap
buttonImage: "/qmlimages/ZoomPlus.svg"
exclusiveGroup: _dropButtonsExclusiveGroup
z: QGroundControl.zOrderWidgets
onClicked: {
if(_flightMap)
_flightMap.zoomLevel += 0.5
checked = false
}
}
//-- Zoom Map Out
RoundButton {
id: mapZoomMinus
visible: _mainIsMap
buttonImage: "/qmlimages/ZoomMinus.svg"
exclusiveGroup: _dropButtonsExclusiveGroup
z: QGroundControl.zOrderWidgets
onClicked: {
if(_flightMap)
_flightMap.zoomLevel -= 0.5
checked = false
}
}
}
}

1
src/FlightDisplay/qmldir

@ -1,5 +1,4 @@
Module QGroundControl.FlightDisplay Module QGroundControl.FlightDisplay
FlightDisplayView 1.0 FlightDisplayView.qml FlightDisplayView 1.0 FlightDisplayView.qml
FlightDisplayViewDelayLoad 1.0 FlightDisplayViewDelayLoad.qml

4
src/FlightMap/FlightMap.qml

@ -49,7 +49,7 @@ Map {
property bool interactive: true property bool interactive: true
property string mapName: 'defaultMap' property string mapName: 'defaultMap'
property string mapType: QGroundControl.flightMapSettings.mapTypeForMapName(mapName) property string mapType: QGroundControl.flightMapSettings.mapTypeForMapName(mapName)
property alias mapWidgets: controlWidgets // property alias mapWidgets: controlWidgets
property bool isSatelliteMap: mapType == "Satellite Map" || mapType == "Hybrid Map" property bool isSatelliteMap: mapType == "Satellite Map" || mapType == "Hybrid Map"
property real lon: (longitude >= -180 && longitude <= 180) ? longitude : 0 property real lon: (longitude >= -180 && longitude <= 180) ? longitude : 0
@ -80,6 +80,7 @@ Map {
} }
} }
/*********************************************
/// Map control widgets /// Map control widgets
Column { Column {
id: controlWidgets id: controlWidgets
@ -151,6 +152,7 @@ Map {
} }
} // Row - +/- buttons } // Row - +/- buttons
} // Column - Map control widgets } // Column - Map control widgets
*********************************************/
/* /*
The slider and scale display are commented out for now to try to save real estate - DonLakeFlyer The slider and scale display are commented out for now to try to save real estate - DonLakeFlyer

16
src/FlightMap/Images/ZoomMinus.svg

@ -1,9 +1,15 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<!-- Generator: Adobe Illustrator 19.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) --> <!-- Generator: Adobe Illustrator 19.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" <svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
viewBox="0 0 72 72" enable-background="new 0 0 72 72" xml:space="preserve"> viewBox="-269 361 72 72" style="enable-background:new -269 361 72 72;" xml:space="preserve">
<circle fill="none" stroke="#FFFFFF" stroke-width="2" stroke-miterlimit="10" cx="29.573" cy="30.04" r="22.416"/> <style type="text/css">
<line fill="none" stroke="#FFFFFF" stroke-width="3" stroke-miterlimit="10" x1="64.8" y1="64.83" x2="45.801" y2="45.765"/> .st0{fill:none;stroke:#FFFFFF;stroke-width:2;stroke-miterlimit:10;}
<line fill="none" x1="16.973" y1="30.04" x2="42.173" y2="30.04"/> .st1{fill:none;stroke:#FFFFFF;stroke-width:3;stroke-miterlimit:10;}
<line fill="none" stroke="#FFFFFF" stroke-width="5" stroke-miterlimit="10" x1="16.973" y1="30.134" x2="42.173" y2="29.946"/> .st2{fill:none;}
.st3{fill:none;stroke:#FFFFFF;stroke-width:5;stroke-miterlimit:10;}
</style>
<circle class="st0" cx="-236.2" cy="393.9" r="11.2"/>
<line class="st1" x1="-218.6" y1="411.3" x2="-228.1" y2="401.8"/>
<line class="st2" x1="-242.5" y1="393.9" x2="-229.9" y2="393.9"/>
<line class="st3" x1="-242.5" y1="394" x2="-229.9" y2="393.9"/>
</svg> </svg>

Before

Width:  |  Height:  |  Size: 780 B

After

Width:  |  Height:  |  Size: 885 B

13
src/FlightMap/Images/ZoomPlus.svg

@ -1,8 +1,13 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<!-- Generator: Adobe Illustrator 19.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) --> <!-- Generator: Adobe Illustrator 19.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" <svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
viewBox="0 0 72 72" enable-background="new 0 0 72 72" xml:space="preserve"> viewBox="-269 361 72 72" style="enable-background:new -269 361 72 72;" xml:space="preserve">
<circle fill="none" stroke="#FFFFFF" stroke-width="2" stroke-miterlimit="10" cx="29.573" cy="30.04" r="22.416"/> <style type="text/css">
<line fill="none" stroke="#FFFFFF" stroke-width="3" stroke-miterlimit="10" x1="64.8" y1="64.83" x2="45.801" y2="45.765"/> .st0{fill:none;stroke:#FFFFFF;stroke-width:2;stroke-miterlimit:10;}
<path fill="#FFFFFF" d="M27.36,42.653V32.187H16.973v-4.374H27.36V17.426h4.426v10.387h10.387v4.374H31.786v10.466H27.36z"/> .st1{fill:none;stroke:#FFFFFF;stroke-width:3;stroke-miterlimit:10;}
.st2{fill:#FFFFFF;}
</style>
<circle class="st0" cx="-236.2" cy="393.9" r="11.2"/>
<line class="st1" x1="-218.6" y1="411.3" x2="-228.1" y2="401.8"/>
<path class="st2" d="M-237.3,400.2V395h-5.2v-2.2h5.2v-5.2h2.2v5.2h5.2v2.2h-5.2v5.2H-237.3z"/>
</svg> </svg>

Before

Width:  |  Height:  |  Size: 710 B

After

Width:  |  Height:  |  Size: 781 B

7
src/FlightMap/MapItems/VehicleMapItem.qml

@ -33,8 +33,9 @@ import QGroundControl.Vehicle 1.0
/// Marker for displaying a vehicle location on the map /// Marker for displaying a vehicle location on the map
MapQuickItem { MapQuickItem {
property var vehicle ///< Vehicle object property var vehicle ///< Vehicle object
property bool isSatellite: false ///< true: satellite map is showing property bool isSatellite: false ///< true: satellite map is showing
property real size: ScreenTools.defaultFontPixelHeight * 5
anchorPoint.x: vehicleIcon.width / 2 anchorPoint.x: vehicleIcon.width / 2
anchorPoint.y: vehicleIcon.height / 2 anchorPoint.y: vehicleIcon.height / 2
@ -44,7 +45,7 @@ MapQuickItem {
id: vehicleIcon id: vehicleIcon
source: isSatellite ? "/qmlimages/airplaneOpaque.svg" : "/qmlimages/airplaneOutline.svg" source: isSatellite ? "/qmlimages/airplaneOpaque.svg" : "/qmlimages/airplaneOutline.svg"
mipmap: true mipmap: true
width: ScreenTools.defaultFontPixelHeight * 5 width: size
fillMode: Image.PreserveAspectFit fillMode: Image.PreserveAspectFit
transform: Rotation { transform: Rotation {

56
src/FlightMap/Widgets/QGCInstrumentWidget.qml

@ -36,21 +36,26 @@ Item {
id: root id: root
height: size height: size
property alias heading: compass.heading property alias heading: compass.heading
property alias active: attitude.active property alias rollAngle: attitude.rollAngle
property alias rollAngle: attitude.rollAngle property alias pitchAngle: attitude.pitchAngle
property alias pitchAngle: attitude.pitchAngle
property real size: ScreenTools.defaultFontPixelSize * (10)
property real size: ScreenTools.defaultFontPixelSize * (10)
property bool isSatellite: false
property bool active: false
property bool _isVisible: true
//-- Instrument Pannel
Rectangle { Rectangle {
id: instrumentPannel id: instrumentPannel
anchors.left: parent.left anchors.right: parent.right
anchors.bottom: parent.bottom anchors.bottom: parent.bottom
height: root.size height: root.size
width: instruments.width + 8 width: instruments.width + 8
radius: root.size / 2 radius: root.size / 2
color: Qt.rgba(0,0,0,0.5) visible: _isVisible
color: isSatellite ? Qt.rgba(1,1,1,0.5) : Qt.rgba(0,0,0,0.5)
Row { Row {
id: instruments id: instruments
height: parent.height height: parent.height
@ -59,14 +64,49 @@ Item {
QGCAttitudeWidget { QGCAttitudeWidget {
id: attitude id: attitude
size: parent.height * 0.9 size: parent.height * 0.9
active: root.active
anchors.verticalCenter: parent.verticalCenter anchors.verticalCenter: parent.verticalCenter
} }
QGCCompassWidget { QGCCompassWidget {
id: compass id: compass
size: parent.height * 0.9 size: parent.height * 0.9
active: root.active
anchors.verticalCenter: parent.verticalCenter anchors.verticalCenter: parent.verticalCenter
} }
} }
MouseArea {
anchors.fill: parent
onClicked: {
_isVisible = !_isVisible
}
}
}
//-- Show Instruments
Rectangle {
id: openButton
anchors.right: parent.right
anchors.bottom: parent.bottom
height: 24
width: 24
radius: 4
visible: !_isVisible
color: isSatellite ? Qt.rgba(1,1,1,0.5) : Qt.rgba(0,0,0,0.5)
Image {
width: parent.width * 0.75
height: parent.height * 0.75
source: "/qmlimages/buttonLeft.svg"
mipmap: true
fillMode: Image.PreserveAspectFit
anchors.verticalCenter: parent.verticalCenter
anchors.horizontalCenter: parent.horizontalCenter
}
MouseArea {
anchors.fill: parent
onClicked: {
_isVisible = !_isVisible
}
}
} }
} }

215
src/MissionEditor/MissionEditor.qml

@ -75,7 +75,11 @@ QGCView {
property bool _showHelp: QGroundControl.flightMapSettings.loadBoolMapSetting(editorMap.mapName, _showHelpKey, true) property bool _showHelp: QGroundControl.flightMapSettings.loadBoolMapSetting(editorMap.mapName, _showHelpKey, true)
onGpsLockChanged: updateMapToVehiclePosition() onGpsLockChanged: updateMapToVehiclePosition()
Component.onCompleted: updateMapToVehiclePosition()
Component.onCompleted: {
helpPanel.source = "MissionEditorHelp.qml"
updateMapToVehiclePosition()
}
function updateMapToVehiclePosition() { function updateMapToVehiclePosition() {
if (gpsLock && _firstGpsLock) { if (gpsLock && _firstGpsLock) {
@ -676,207 +680,16 @@ QGCView {
} // Item - Home Position Manager } // Item - Home Position Manager
*/ */
// Help Panel //-- Help Panel
Rectangle { Loader {
id: helpPanel id: helpPanel
anchors.margins: margins width: parent.width * 0.65
anchors.top: parent.top height: parent.height * 0.75
anchors.bottom: parent.bottom z: QGroundControl.zOrderTopMost
anchors.left: addMissionItemsButton.right anchors.verticalCenter: parent.verticalCenter
anchors.right: missionItemEditor.left anchors.horizontalCenter: parent.horizontalCenter
width: parent.width - (margins * 2) - _rightPanelWidth }
visible: helpButton.checked
color: qgcPal.window
opacity: _rightPanelOpacity
radius: ScreenTools.defaultFontPixelHeight
z: QGroundControl.zOrderTopMost
readonly property real margins: ScreenTools.defaultFontPixelHeight
Image {
anchors.margins: ScreenTools.defaultFontPixelHeight
anchors.top: parent.top
anchors.right: parent.right
width: ScreenTools.defaultFontPixelHeight * 1.5
height: ScreenTools.defaultFontPixelHeight * 1.5
source: (qgcPal.globalTheme === QGCPalette.Light) ? "/qmlimages/XDeleteBlack.svg" : "/qmlimages/XDelete.svg"
fillMode: Image.PreserveAspectFit
mipmap: true
smooth: true
MouseArea {
anchors.fill: parent
onClicked: helpButton.checked = false
}
}
Item {
anchors.margins: _margin
anchors.fill: parent
QGCLabel {
id: helpTitle
font.pixelSize: ScreenTools.mediumFontPixelSize
text: "Mission Planner"
}
QGCLabel {
id: helpIconLabel
anchors.topMargin: ScreenTools.defaultFontPixelHeight
anchors.top: helpTitle.bottom
width: parent.width
wrapMode: Text.WordWrap
text: "Mission Planner tool buttons:"
}
Image {
id: addMissionItemsHelpIcon
anchors.topMargin: ScreenTools.defaultFontPixelHeight
anchors.top: helpIconLabel.bottom
width: ScreenTools.defaultFontPixelHeight * 3
fillMode: Image.PreserveAspectFit
mipmap: true
smooth: true
source: (qgcPal.globalTheme === QGCPalette.Light) ? "/qmlimages/MapAddMissionBlack.svg" : "/qmlimages/MapAddMission.svg"
}
QGCLabel {
id: addMissionItemsHelpText
anchors.leftMargin: ScreenTools.defaultFontPixelHeight
anchors.left: mapTypeHelpIcon.right
anchors.right: parent.right
anchors.top: addMissionItemsHelpIcon.top
wrapMode: Text.WordWrap
text: "<b>Add Mission Items</b><br>" +
"When enabled, add mission items by clicking on the map."
}
Image {
id: deleteHelpIcon
anchors.topMargin: ScreenTools.defaultFontPixelHeight
anchors.top: addMissionItemsHelpText.bottom
width: ScreenTools.defaultFontPixelHeight * 3
fillMode: Image.PreserveAspectFit
mipmap: true
smooth: true
source: (qgcPal.globalTheme === QGCPalette.Light) ? "/qmlimages/TrashDeleteBlack.svg" : "/qmlimages/TrashDelete.svg"
}
QGCLabel {
id: deleteHelpText
anchors.leftMargin: ScreenTools.defaultFontPixelHeight
anchors.left: mapTypeHelpIcon.right
anchors.right: parent.right
anchors.top: deleteHelpIcon.top
wrapMode: Text.WordWrap
text: "<b>Delete Mission Item</b><br>" +
"Delete the currently selected mission item."
}
/*
Home Position Manager disabled
Image {
id: homePositionManagerHelpIcon
anchors.topMargin: ScreenTools.defaultFontPixelHeight
anchors.top: deleteHelpText.bottom
width: ScreenTools.defaultFontPixelHeight * 3
fillMode: Image.PreserveAspectFit
mipmap: true
smooth: true
source: (qgcPal.globalTheme === QGCPalette.Light) ? "/qmlimages/MapHomeBlack.svg" : "/qmlimages/MapHome.svg"
}
QGCLabel {
id: homePositionManagerHelpText
anchors.leftMargin: ScreenTools.defaultFontPixelHeight
anchors.left: mapTypeHelpIcon.right
anchors.right: parent.right
anchors.top: homePositionManagerHelpIcon.top
wrapMode: Text.WordWrap
text: "<b>Flying Field Manager</b><br>" +
"When enabled, allows you to select/add/update flying field locations. " +
"You can save multiple flying field locations for use while creating missions while you are not connected to your vehicle."
}
*/
Image {
id: mapCenterHelpIcon
anchors.topMargin: ScreenTools.defaultFontPixelHeight
anchors.top: deleteHelpText.bottom
width: ScreenTools.defaultFontPixelHeight * 3
fillMode: Image.PreserveAspectFit
mipmap: true
smooth: true
source: (qgcPal.globalTheme === QGCPalette.Light) ? "/qmlimages/MapCenterBlack.svg" : "/qmlimages/MapCenter.svg"
}
QGCLabel {
id: mapCenterHelpText
anchors.leftMargin: ScreenTools.defaultFontPixelHeight
anchors.left: mapTypeHelpIcon.right
anchors.right: parent.right
anchors.top: mapCenterHelpIcon.top
wrapMode: Text.WordWrap
text: "<b>Map Center</b><br>" +
"Options for centering the map."
}
Image {
id: syncHelpIcon
anchors.topMargin: ScreenTools.defaultFontPixelHeight
anchors.top: mapCenterHelpText.bottom
width: ScreenTools.defaultFontPixelHeight * 3
fillMode: Image.PreserveAspectFit
mipmap: true
smooth: true
source: (qgcPal.globalTheme === QGCPalette.Light) ? "/qmlimages/MapSyncBlack.svg" : "/qmlimages/MapSync.svg"
}
QGCLabel {
id: syncHelpText
anchors.leftMargin: ScreenTools.defaultFontPixelHeight
anchors.left: mapTypeHelpIcon.right
anchors.right: parent.right
anchors.top: syncHelpIcon.top
wrapMode: Text.WordWrap
text: "<b>Sync</b><br>" +
"Options for saving/loading mission items."
}
Image {
id: mapTypeHelpIcon
anchors.topMargin: ScreenTools.defaultFontPixelHeight
anchors.top: syncHelpText.bottom
width: ScreenTools.defaultFontPixelHeight * 3
fillMode: Image.PreserveAspectFit
mipmap: true
smooth: true
source: (qgcPal.globalTheme === QGCPalette.Light) ? "/qmlimages/MapTypeBlack.svg" : "/qmlimages/MapType.svg"
}
QGCLabel {
id: mapTypeHelpText
anchors.leftMargin: ScreenTools.defaultFontPixelHeight
anchors.left: mapTypeHelpIcon.right
anchors.right: parent.right
anchors.top: mapTypeHelpIcon.top
wrapMode: Text.WordWrap
text: "<b>Map Type</b><br>" +
"Map type options."
}
QGCCheckBox {
anchors.left: parent.left
anchors.bottom: parent.bottom
anchors.margins: _margin
checked: !_showHelp
text: "Don't show me again"
onClicked: QGroundControl.flightMapSettings.saveBoolMapSetting(editorMap.mapName, _showHelpKey, !checked)
}
} // Item - margin
} // Item - Help Panel
RoundButton { RoundButton {
id: addMissionItemsButton id: addMissionItemsButton

Loading…
Cancel
Save