地面站终端 App
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

383 lines
14 KiB

/*=====================================================================
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/>.
======================================================================*/
/**
* @file
* @brief QGC Main Tool Bar
* @author Gus Grubba <mavlink@grubba.com>
*/
import QtQuick 2.3
import QtQuick.Controls 1.2
import QtQuick.Controls.Styles 1.2
import QGroundControl.HUDControls 1.0
Rectangle {
id: root
color: Qt.rgba(0,0,0,0);
property real roll: isNaN(flightDisplay.roll) ? 0 : flightDisplay.roll
property real pitch: isNaN(flightDisplay.pitch) ? 0 : flightDisplay.pitch
function getBool(value) {
return value === '0' ? false : true;
}
function setBool(value) {
return value ? "1" : "0";
}
Component.onCompleted:
{
mapBackground.visible = getBool(flightDisplay.loadSetting("showMapBackground", "0"));
mapBackground.alwaysNorth = getBool(flightDisplay.loadSetting("mapAlwaysPointsNorth", "0"));
attitudeWidget.visible = getBool(flightDisplay.loadSetting("showAttitudeWidget", "1"));
attitudeWidget.displayBackground = getBool(flightDisplay.loadSetting("showAttitudeBackground", "1"));
pitchWidget.visible = getBool(flightDisplay.loadSetting("showPitchWidget", "1"));
altitudeWidget.visible = getBool(flightDisplay.loadSetting("showAltitudeWidget", "1"));
speedWidget.visible = getBool(flightDisplay.loadSetting("showSpeedWidget", "1"));
compassIndicator.visible = getBool(flightDisplay.loadSetting("showCompassIndicator", "1"));
currentSpeed.showAirSpeed = getBool(flightDisplay.loadSetting("showCurrentAirSpeed", "1"));
currentSpeed.showGroundSpeed = getBool(flightDisplay.loadSetting("showCurrentGroundSpeed", "1"));
currentAltitude.showClimbRate = getBool(flightDisplay.loadSetting("showCurrentClimbRate", "1"));
currentAltitude.showAltitude = getBool(flightDisplay.loadSetting("showCurrentAltitude", "1"));
mapTypeMenu.update();
}
Rectangle {
id: windowBackground
anchors.fill: parent
anchors.centerIn: parent
visible: !attitudeWidget.visible && !mapBackground.visible
color: Qt.hsla(0.25, 0.5, 0.45)
z: 0
}
Menu {
id: contextMenu
MenuItem {
text: "Main Attitude Indicators"
checkable: true
checked: attitudeWidget.visible
onTriggered:
{
attitudeWidget.visible = !attitudeWidget.visible;
flightDisplay.saveSetting("showAttitudeWidget", setBool(attitudeWidget.visible));
}
}
MenuItem {
text: "Display Attitude Background"
checkable: true
checked: attitudeWidget.displayBackground
onTriggered:
{
attitudeWidget.displayBackground = !attitudeWidget.displayBackground;
flightDisplay.saveSetting("showAttitudeBackground", setBool(attitudeWidget.displayBackground));
}
}
MenuItem {
text: "Pitch Indicator"
checkable: true
checked: pitchWidget.visible
onTriggered:
{
pitchWidget.visible = !pitchWidget.visible;
flightDisplay.saveSetting("showPitchWidget", setBool(pitchWidget.visible));
}
}
MenuItem {
text: "Altitude Indicator"
checkable: true
checked: altitudeWidget.visible
onTriggered:
{
altitudeWidget.visible = !altitudeWidget.visible;
flightDisplay.saveSetting("showAltitudeWidget", setBool(altitudeWidget.visible));
}
}
MenuItem {
text: "Current Altitude"
checkable: true
checked: currentAltitude.showAltitude
onTriggered:
{
currentAltitude.showAltitude = !currentAltitude.showAltitude;
flightDisplay.saveSetting("showCurrentAltitude", setBool(currentAltitude.showAltitude));
}
}
MenuItem {
text: "Current Climb Rate"
checkable: true
checked: currentAltitude.showClimbRate
onTriggered:
{
currentAltitude.showClimbRate = !currentAltitude.showClimbRate;
flightDisplay.saveSetting("showCurrentClimbRate", setBool(currentAltitude.showClimbRate));
}
}
MenuItem {
text: "Speed Indicator"
checkable: true
checked: speedWidget.visible
onTriggered:
{
speedWidget.visible = !speedWidget.visible;
flightDisplay.saveSetting("showSpeedWidget", setBool(speedWidget.visible));
}
}
MenuItem {
text: "Current Air Speed"
checkable: true
checked: currentSpeed.showAirSpeed
onTriggered:
{
currentSpeed.showAirSpeed = !currentSpeed.showAirSpeed;
flightDisplay.saveSetting("showCurrentAirSpeed", setBool(currentSpeed.showAirSpeed));
}
}
MenuItem {
text: "Current Ground Speed"
checkable: true
checked: currentSpeed.showGroundSpeed
onTriggered:
{
currentSpeed.showGroundSpeed = !currentSpeed.showGroundSpeed;
flightDisplay.saveSetting("showCurrentGroundSpeed", setBool(currentSpeed.showGroundSpeed));
}
}
MenuItem {
text: "Compass"
checkable: true
checked: compassIndicator.visible
onTriggered:
{
compassIndicator.visible = !compassIndicator.visible;
flightDisplay.saveSetting("showCompassIndicator", setBool(compassIndicator.visible));
}
}
MenuSeparator {}
MenuItem {
text: "Map Background"
checkable: true
checked: mapBackground.visible
onTriggered:
{
mapBackground.visible = !mapBackground.visible;
flightDisplay.saveSetting("showMapBackground", setBool(mapBackground.visible));
}
}
MenuItem {
text: "Map Always Points North"
checkable: true
checked: mapBackground.alwaysNorth
onTriggered:
{
mapBackground.alwaysNorth = !mapBackground.alwaysNorth;
flightDisplay.saveSetting("mapAlwaysPointsNorth", setBool(mapBackground.alwaysNorth));
}
}
Menu {
id: mapTypeMenu
title: "Map Type..."
ExclusiveGroup { id: currentMapType }
function setCurrentMap(map) {
for (var i = 0; i < mapBackground.mapItem.supportedMapTypes.length; i++) {
if (map === mapBackground.mapItem.supportedMapTypes[i].name) {
mapBackground.mapItem.activeMapType = mapBackground.mapItem.supportedMapTypes[i]
flightDisplay.saveSetting("currentMapType", map);
return;
}
}
}
function addMap(map, checked) {
var mItem = mapTypeMenu.addItem(map);
mItem.checkable = true
mItem.checked = checked
mItem.exclusiveGroup = currentMapType
var menuSlot = function() {setCurrentMap(map);};
mItem.triggered.connect(menuSlot);
}
function update() {
clear()
var map = ''
if (mapBackground.mapItem.supportedMapTypes.length > 0)
map = mapBackground.mapItem.activeMapType.name;
map = flightDisplay.loadSetting("currentMapType", map);
for (var i = 0; i < mapBackground.mapItem.supportedMapTypes.length; i++) {
var name = mapBackground.mapItem.supportedMapTypes[i].name;
addMap(name, map === name);
}
if(map != '')
setCurrentMap(map);
}
}
MenuSeparator {}
MenuItem {
text: "Restore Defaults"
onTriggered:
{
attitudeWidget.visible = true;
flightDisplay.saveSetting("showAttitudeWidget", setBool(attitudeWidget.visible));
attitudeWidget.displayBackground = true;
flightDisplay.saveSetting("showAttitudeBackground", setBool(attitudeWidget.displayBackground));
pitchWidget.visible = true;
flightDisplay.saveSetting("showPitchWidget", setBool(pitchWidget.visible));
altitudeWidget.visible = true;
flightDisplay.saveSetting("showAltitudeWidget", setBool(altitudeWidget.visible));
currentAltitude.showAltitude = true;
flightDisplay.saveSetting("showCurrentAltitude", setBool(currentAltitude.showAltitude));
currentAltitude.showClimbRate = true;
flightDisplay.saveSetting("showCurrentClimbRate", setBool(currentAltitude.showClimbRate));
speedWidget.visible = true;
flightDisplay.saveSetting("showSpeedWidget", setBool(speedWidget.visible));
currentSpeed.showAirSpeed = true;
flightDisplay.saveSetting("showCurrentAirSpeed", setBool(currentSpeed.showAirSpeed));
currentSpeed.showGroundSpeed = true;
flightDisplay.saveSetting("showCurrentGroundSpeed", setBool(currentSpeed.showGroundSpeed));
compassIndicator.visible = true;
flightDisplay.saveSetting("showCompassIndicator", setBool(compassIndicator.visible));
mapBackground.visible = false;
flightDisplay.saveSetting("showMapBackground", setBool(mapBackground.visible));
mapBackground.alwaysNorth = false;
flightDisplay.saveSetting("mapAlwaysPointsNorth", setBool(mapBackground.alwaysNorth));
}
}
}
QGCMapBackground {
id: mapBackground
anchors.centerIn: parent
visible: false
heading: isNaN(flightDisplay.heading) ? 0 : flightDisplay.heading
latitude: flightDisplay.latitude
longitude: flightDisplay.longitude
z: 5
}
QGCAttitudeWidget {
id: attitudeWidget
anchors.centerIn: parent
rollAngle: roll
pitchAngle: pitch
useWhite: !mapBackground.visible
backgroundOpacity: mapBackground.visible ? 0.25 : 1.0
z: 10
}
QGCPitchWidget {
id: pitchWidget
anchors.verticalCenter: parent.verticalCenter
pitchAngle: pitch
rollAngle: roll
color: mapBackground.visible ? Qt.rgba(0,0,0,0.5) : Qt.rgba(0,0,0,0)
opacity: mapBackground.visible ? 1 : 0.75
z: mapBackground.visible ? 20 : 25
}
Image {
anchors.centerIn: parent
source: "/qml/crossHair.svg"
mipmap: true
width: 260
fillMode: Image.PreserveAspectFit
z: mapBackground.visible ? 25 : 20
}
QGCAltitudeWidget {
id: altitudeWidget
anchors.right: parent.right
width: 60
altitude: flightDisplay.altitudeWGS84
z: 30
}
QGCSpeedWidget {
id: speedWidget
anchors.left: parent.left
width: 60
speed: flightDisplay.groundSpeed
z: 40
}
QGCCurrentSpeed {
id: currentSpeed
anchors.left: parent.left
width: 75
airspeed: flightDisplay.airSpeed
groundspeed: flightDisplay.groundSpeed
showAirSpeed: true
showGroundSpeed: true
visible: (currentSpeed.showGroundSpeed || currentSpeed.showAirSpeed)
z: 50
}
QGCCurrentAltitude {
id: currentAltitude
anchors.right: parent.right
width: 75
altitude: flightDisplay.altitudeWGS84
vertZ: flightDisplay.climbRate
showAltitude: true
showClimbRate: true
visible: (currentAltitude.showAltitude || currentAltitude.showClimbRate)
z: 60
}
QGCCompass {
id: compassIndicator
y: root.height * 0.7
anchors.horizontalCenter: parent.horizontalCenter
heading: isNaN(flightDisplay.heading) ? 0 : flightDisplay.heading
z: 70
}
MouseArea {
anchors.fill: parent
acceptedButtons: Qt.RightButton
onClicked: {
if (mouse.button == Qt.RightButton)
{
contextMenu.popup()
}
}
z: 100
}
}