diff --git a/qgroundcontrol.qrc b/qgroundcontrol.qrc index c9b1729ca470d7ac163e1ef994431325152b5a05..a5ec028432a1104eaec95a265488f52105dcb3a1 100644 --- a/qgroundcontrol.qrc +++ b/qgroundcontrol.qrc @@ -120,16 +120,16 @@ src/ui/mapdisplay/MapDisplay.qml src/ui/qmlcommon/QGCAltitudeWidget.qml src/ui/qmlcommon/QGCArtificialHorizon.qml - src/ui/qmlcommon/QGCAttitudeInstrument.qml src/ui/qmlcommon/QGCAttitudeWidget.qml - src/ui/qmlcommon/QGCCompass.qml - src/ui/qmlcommon/QGCCompassInstrument.qml + src/ui/qmlcommon/QGCAttitudeHUD.qml + src/ui/qmlcommon/QGCCompassWidget.qml + src/ui/qmlcommon/QGCCompassHUD.qml src/ui/qmlcommon/QGCCurrentAltitude.qml src/ui/qmlcommon/QGCCurrentSpeed.qml src/ui/qmlcommon/QGCHudMessage.qml src/ui/qmlcommon/QGCMapBackground.qml src/ui/qmlcommon/QGCMapToolButton.qml - src/ui/qmlcommon/QGCPitchWidget.qml + src/ui/qmlcommon/QGCPitchIndicator.qml src/ui/qmlcommon/QGCSlider.qml src/ui/qmlcommon/QGCSpeedWidget.qml src/ui/qmlcommon/QGCVideoBackground.qml diff --git a/src/ui/flightdisplay/FlightDisplay.qml b/src/ui/flightdisplay/FlightDisplay.qml index e075a524857b0dad2c672d9975c3135a57de35ad..0d4a7dd767503d785b4dcda153e2273d60b47e76 100644 --- a/src/ui/flightdisplay/FlightDisplay.qml +++ b/src/ui/flightdisplay/FlightDisplay.qml @@ -47,8 +47,6 @@ Item { property real pitch: isNaN(MavManager.pitch) ? 0 : MavManager.pitch property bool showPitchIndicator: true - property bool showAttitudeIndicator: true - property bool showCompass: true function getBool(value) { return value === '0' ? false : true; @@ -58,8 +56,11 @@ Item { return value ? "1" : "0"; } - function showHudInstruments() { - return videoBackground.visible || mapBackground.visible; + function enforceExclusiveOption(setWidget, alternateWidget, defaultSetting, alternateSetting) { + setWidget.visible = !setWidget.visible; + flightDisplay.saveSetting(defaultSetting, setBool(setWidget.visible)); + alternateWidget.visible = setWidget.visible ? false : alternateWidget.visible; + flightDisplay.saveSetting(alternateSetting, setBool(alternateWidget.visible)); } Connections { @@ -75,9 +76,11 @@ Item { mapBackground.showWaypoints = getBool(flightDisplay.loadSetting("mapShowWaypoints", "0")); mapBackground.alwaysNorth = getBool(flightDisplay.loadSetting("mapAlwaysPointsNorth", "0")); videoBackground.visible = getBool(flightDisplay.loadSetting("showVideoBackground", "0")); - showAttitudeIndicator = getBool(flightDisplay.loadSetting("showAttitudeIndicator", "1")); showPitchIndicator = getBool(flightDisplay.loadSetting("showPitchIndicator", "1")); - showCompass = getBool(flightDisplay.loadSetting("showCompass", "1")); + compassWidget.visible = getBool(flightDisplay.loadSetting("showCompassWidget", "0")); + compassHUD.visible = getBool(flightDisplay.loadSetting("showCompassHUD", "1")); + attitudeWidget.visible = getBool(flightDisplay.loadSetting("showAttitudeWidget", "0")); + attitudeHUD.visible = getBool(flightDisplay.loadSetting("showAttitudeHUD", "1")); altitudeWidget.visible = getBool(flightDisplay.loadSetting("showAltitudeWidget", "1")); speedWidget.visible = getBool(flightDisplay.loadSetting("showSpeedWidget", "1")); currentSpeed.showAirSpeed = getBool(flightDisplay.loadSetting("showCurrentAirSpeed", "1")); @@ -91,6 +94,16 @@ Item { videoBackground.visible = false; flightDisplay.saveSetting("showVideoBackground", setBool(videoBackground.visible)); } + // Compass HUD or Widget. Not both: + if(compassWidget.visible && compassHUD.visible) { + compassWidget.visible = false; + flightDisplay.saveSetting("showCompassWidget", setBool(compassWidget.visible)); + } + // Attitude HUD or Widget. Not both: + if(attitudeWidget.visible && attitudeHUD.visible) { + attitudeWidget.visible = false; + flightDisplay.saveSetting("showAttitudeWidget", setBool(attitudeWidget.visible)); + } // Disable video if we don't have support for it if(!flightDisplay.hasVideo) { videoBackground.visible = false; @@ -103,19 +116,13 @@ Item { Menu { id: contextMenu - ExclusiveGroup { id: backgroundDisplay } - MenuItem { text: "Map Background" checkable: true checked: mapBackground.visible - exclusiveGroup: backgroundDisplay onTriggered: { - mapBackground.visible = !mapBackground.visible; - flightDisplay.saveSetting("showMapBackground", setBool(mapBackground.visible)); - videoBackground.visible = mapBackground.visible ? false : videoBackground.visible; - flightDisplay.saveSetting("showVideoBackground", setBool(videoBackground.visible)); + enforceExclusiveOption(mapBackground, videoBackground, "showMapBackground", "showVideoBackground"); } } @@ -152,22 +159,39 @@ Item { text: "Video Background" checkable: true checked: videoBackground.visible - exclusiveGroup: backgroundDisplay onTriggered: { - videoBackground.visible = !videoBackground.visible; - flightDisplay.saveSetting("showVideoBackground", setBool(videoBackground.visible)); - mapBackground.visible = videoBackground.visible ? false : mapBackground.visible; - flightDisplay.saveSetting("showMapBackground", setBool(mapBackground.visible)); + enforceExclusiveOption(videoBackground, mapBackground, "showVideoBackground", "showMapBackground"); } } MenuSeparator {} + MenuItem { + text: "Attitude Widget" + checkable: true + checked: attitudeWidget.visible + onTriggered: + { + enforceExclusiveOption(attitudeWidget, attitudeHUD, "showAttitudeWidget", "showAttitudeHUD"); + } + } + + MenuItem { + text: "Attitude HUD" + checkable: true + checked: attitudeHUD.visible + onTriggered: + { + enforceExclusiveOption(attitudeHUD, attitudeWidget, "showAttitudeHUD", "showAttitudeWidget"); + } + } + MenuItem { text: "Pitch Indicator" checkable: true checked: showPitchIndicator + enabled: attitudeHUD.visible || attitudeWidget.visible onTriggered: { showPitchIndicator = !showPitchIndicator; @@ -176,24 +200,22 @@ Item { } MenuItem { - text: "Attitude Indicator" - checkable: true - checked: showAttitudeIndicator + text: "Compass Widget" + checkable: true + checked: compassWidget.visible onTriggered: { - showAttitudeIndicator = !showAttitudeIndicator; - flightDisplay.saveSetting("showAttitudeIndicator", setBool(showAttitudeIndicator)); + enforceExclusiveOption(compassWidget, compassHUD, "showCompassWidget", "showCompassHUD"); } } MenuItem { - text: "Compass" + text: "Compass HUD" checkable: true - checked: showCompass + checked: compassHUD.visible onTriggered: { - showCompass = !showCompass; - flightDisplay.saveSetting("showCompass", setBool(showCompass)); + enforceExclusiveOption(compassHUD, compassWidget, "showCompassHUD", "showCompassWidget"); } } @@ -271,10 +293,14 @@ Item { { showPitchIndicator = true; flightDisplay.saveSetting("showPitchIndicator", setBool(showPitchIndicator)); - showAttitudeIndicator = true; - flightDisplay.saveSetting("showAttitudeIndicator", setBool(showAttitudeIndicator)); - showCompass = true; - flightDisplay.saveSetting("showCompass", setBool(showCompass)); + attitudeWidget.visible = false; + flightDisplay.saveSetting("showAttitudeWidget", setBool(attitudeWidget.visible)); + attitudeHUD.visible = true; + flightDisplay.saveSetting("showAttitudeHUD", setBool(attitudeHUD.visible)); + compassWidget.visible = false + flightDisplay.saveSetting("showCompassWidget", setBool(compassWidget.visible)); + compassHUD.visible = true + flightDisplay.saveSetting("showCompassHUD", setBool(compassHUD.visible)); altitudeWidget.visible = true; flightDisplay.saveSetting("showAltitudeWidget", setBool(altitudeWidget.visible)); currentAltitude.showAltitude = true; @@ -300,6 +326,8 @@ Item { } + // Video and Map backgrounds are exclusive. If one is enabled the other is disabled. + QGCVideoBackground { id: videoBackground anchors.fill: parent @@ -329,13 +357,14 @@ Item { z: mapBackground.z + 1 } - QGCCompassInstrument { - id: compassInstrument + // Floating (Top Left) Compass Widget + + QGCCompassWidget { + id: compassWidget y: ScreenTools.defaultFontPixelSize * (0.42) x: ScreenTools.defaultFontPixelSize * (7.1) size: ScreenTools.defaultFontPixelSize * (13.3) heading: isNaN(MavManager.heading) ? 0 : MavManager.heading - visible: showHudInstruments() && showCompass z: mapBackground.z + 2 onResetRequested: { y = ScreenTools.defaultFontPixelSize * (0.42) @@ -346,14 +375,37 @@ Item { } } - QGCAttitudeInstrument { - id: attitudeInstrument + // HUD (lower middle) Compass + + 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: isNaN(MavManager.heading) ? 0 : MavManager.heading + z: 70 + } + + // Sky/Ground background (visible when no Map or Video is enabled) + + QGCArtificialHorizon { + id: artificialHoriz + anchors.fill: parent + rollAngle: roll + pitchAngle: pitch + visible: !videoBackground.visible && !mapBackground.visible + } + + // Floating (Top Right) Attitude Widget + + QGCAttitudeWidget { + id: attitudeWidget y: ScreenTools.defaultFontPixelSize * (0.42) size: ScreenTools.defaultFontPixelSize * (13.3) rollAngle: roll pitchAngle: pitch showPitch: showPitchIndicator - visible: showHudInstruments() && showAttitudeIndicator anchors.right: root.right anchors.rightMargin: ScreenTools.defaultFontPixelSize * (7.1) z: mapBackground.z + 2 @@ -367,35 +419,18 @@ Item { } } - QGCArtificialHorizon { - id: artificialHoriz - anchors.fill: parent - rollAngle: roll - pitchAngle: pitch - visible: !showHudInstruments() - } + // HUD (center) Attitude Indicator - QGCAttitudeWidget { - id: attitudeWidget + QGCAttitudeHUD { + id: attitudeHUD rollAngle: roll pitchAngle: pitch - visible: !showHudInstruments() && showAttitudeIndicator - width: ScreenTools.defaultFontPixelSize * (21.7) - height: ScreenTools.defaultFontPixelSize * (21.7) + showPitch: showPitchIndicator + width: ScreenTools.defaultFontPixelSize * (30) + height: ScreenTools.defaultFontPixelSize * (30) z: 20 } - QGCPitchWidget { - id: pitchWidget - visible: showPitchIndicator && !showHudInstruments() - anchors.verticalCenter: parent.verticalCenter - pitchAngle: pitch - rollAngle: roll - color: Qt.rgba(0,0,0,0) - size: ScreenTools.defaultFontPixelSize * (10) - z: 30 - } - QGCAltitudeWidget { id: altitudeWidget anchors.right: parent.right @@ -438,17 +473,6 @@ Item { z: 60 } - QGCCompass { - id: compassIndicator - y: root.height * 0.7 - x: root.width * 0.5 - ScreenTools.defaultFontPixelSize * (5) - width: ScreenTools.defaultFontPixelSize * (10) - height: ScreenTools.defaultFontPixelSize * (10) - heading: isNaN(MavManager.heading) ? 0 : MavManager.heading - visible: !showHudInstruments() && showCompass - z: 70 - } - //- Context Menu MouseArea { anchors.fill: parent diff --git a/src/ui/qmlcommon/QGCAttitudeInstrument.qml b/src/ui/qmlcommon/QGCAttitudeHUD.qml similarity index 54% rename from src/ui/qmlcommon/QGCAttitudeInstrument.qml rename to src/ui/qmlcommon/QGCAttitudeHUD.qml index df060bc4a43a3d920bf1b9bff9586056eda76095..2456a478cf778e9e011f98245a68f3295c1cfa76 100644 --- a/src/ui/qmlcommon/QGCAttitudeInstrument.qml +++ b/src/ui/qmlcommon/QGCAttitudeHUD.qml @@ -23,81 +23,59 @@ This file is part of the QGROUNDCONTROL project /** * @file - * @brief QGC Attitude Instrument + * @brief QGC Attitude Widget * @author Gus Grubba */ import QtQuick 2.4 -import QGroundControl.Controls 1.0 +import QGroundControl.ScreenTools 1.0 -QGCMovableItem { +Item { id: root - property real rollAngle: 0 + anchors.centerIn: parent + property real rollAngle : 0 property real pitchAngle: 0 property bool showPitch: true - property real size - width: size - height: size - - //---------------------------------------------------- - //-- Artificial Horizon - QGCArtificialHorizon { - rollAngle: root.rollAngle - pitchAngle: root.pitchAngle - anchors.fill: parent - } - //---------------------------------------------------- - //-- Pointer Image { - id: pointer - source: "/qmlimages/attitudePointer.svg" + id: rollDial + anchors { bottom: root.verticalCenter; horizontalCenter: parent.horizontalCenter} + source: "/qmlimages/rollDialWhite.svg" mipmap: true + width: parent.width fillMode: Image.PreserveAspectFit - anchors.fill: parent + transform: Rotation { + origin.x: rollDial.width / 2 + origin.y: rollDial.height + angle: -rollAngle + } } - //---------------------------------------------------- - //-- Instrument Dial + Image { - id: instrumentDial - source: "/qmlimages/attitudeDial.svg" + id: pointer + anchors { bottom: root.verticalCenter; horizontalCenter: parent.horizontalCenter} + source: "/qmlimages/rollPointerWhite.svg" mipmap: true + width: rollDial.width fillMode: Image.PreserveAspectFit - anchors.fill: parent - transform: Rotation { - origin.x: root.width / 2 - origin.y: root.height / 2 - angle: -rollAngle - } } - //---------------------------------------------------- - //-- Pitch - QGCPitchWidget { - id: pitchWidget - visible: root.showPitch - size: root.size * 0.65 - anchors.verticalCenter: parent.verticalCenter - pitchAngle: root.pitchAngle - rollAngle: root.rollAngle - color: Qt.rgba(0,0,0,0) - } - //---------------------------------------------------- - //-- Cross Hair + Image { id: crossHair anchors.centerIn: parent source: "/qmlimages/crossHair.svg" mipmap: true - width: size * 0.75 + width: parent.width fillMode: Image.PreserveAspectFit } - //---------------------------------------------------- - //-- Instrument Pannel - Image { - id: pannel - source: "/qmlimages/attitudeInstrument.svg" - mipmap: true - fillMode: Image.PreserveAspectFit - anchors.fill: parent + + QGCPitchIndicator { + id: pitchIndicator + anchors.verticalCenter: parent.verticalCenter + visible: root.showPitch + pitchAngle: root.pitchAngle + rollAngle: root.rollAngle + color: Qt.rgba(0,0,0,0) + size: ScreenTools.defaultFontPixelSize * (10) } } diff --git a/src/ui/qmlcommon/QGCAttitudeWidget.qml b/src/ui/qmlcommon/QGCAttitudeWidget.qml index 40e80622268a21ceeface2125e05c19b78a4cddc..f0095fd935efc3ff2bbb2a92cf011921ff0741bd 100644 --- a/src/ui/qmlcommon/QGCAttitudeWidget.qml +++ b/src/ui/qmlcommon/QGCAttitudeWidget.qml @@ -23,48 +23,81 @@ This file is part of the QGROUNDCONTROL project /** * @file - * @brief QGC Attitude Widget + * @brief QGC Attitude Instrument * @author Gus Grubba */ import QtQuick 2.4 -import QGroundControl.ScreenTools 1.0 +import QGroundControl.Controls 1.0 -Item { +QGCMovableItem { id: root - anchors.centerIn: parent - property real rollAngle : 0 + property real rollAngle: 0 property real pitchAngle: 0 + property bool showPitch: true + property real size + width: size + height: size + + //---------------------------------------------------- + //-- Artificial Horizon + QGCArtificialHorizon { + rollAngle: root.rollAngle + pitchAngle: root.pitchAngle + anchors.fill: parent + } + //---------------------------------------------------- + //-- Pointer Image { - id: rollDial - anchors { bottom: root.verticalCenter; horizontalCenter: parent.horizontalCenter} - source: "/qmlimages/rollDialWhite.svg" + id: pointer + source: "/qmlimages/attitudePointer.svg" mipmap: true - width: parent.width fillMode: Image.PreserveAspectFit - transform: Rotation { - origin.x: rollDial.width / 2 - origin.y: rollDial.height - angle: -rollAngle - } + anchors.fill: parent } - + //---------------------------------------------------- + //-- Instrument Dial Image { - id: pointer - anchors { bottom: root.verticalCenter; horizontalCenter: parent.horizontalCenter} - source: "/qmlimages/rollPointerWhite.svg" + id: instrumentDial + source: "/qmlimages/attitudeDial.svg" mipmap: true - width: rollDial.width fillMode: Image.PreserveAspectFit + anchors.fill: parent + transform: Rotation { + origin.x: root.width / 2 + origin.y: root.height / 2 + angle: -rollAngle + } } - + //---------------------------------------------------- + //-- Pitch + QGCPitchIndicator { + id: pitchWidget + visible: root.showPitch + size: root.size * 0.65 + anchors.verticalCenter: parent.verticalCenter + pitchAngle: root.pitchAngle + rollAngle: root.rollAngle + color: Qt.rgba(0,0,0,0) + } + //---------------------------------------------------- + //-- Cross Hair Image { id: crossHair anchors.centerIn: parent source: "/qmlimages/crossHair.svg" mipmap: true - width: parent.width + width: size * 0.75 fillMode: Image.PreserveAspectFit } + //---------------------------------------------------- + //-- Instrument Pannel + Image { + id: pannel + source: "/qmlimages/attitudeInstrument.svg" + mipmap: true + fillMode: Image.PreserveAspectFit + anchors.fill: parent + } } diff --git a/src/ui/qmlcommon/QGCCompass.qml b/src/ui/qmlcommon/QGCCompassHUD.qml similarity index 98% rename from src/ui/qmlcommon/QGCCompass.qml rename to src/ui/qmlcommon/QGCCompassHUD.qml index 2d8e2afbaa7091f5463a209c6f1d0bdfe55d4b16..6a39a3525c3313f90515f85c4f63b22af7bfecc6 100644 --- a/src/ui/qmlcommon/QGCCompass.qml +++ b/src/ui/qmlcommon/QGCCompassHUD.qml @@ -23,7 +23,7 @@ This file is part of the QGROUNDCONTROL project /** * @file - * @brief QGC Compass + * @brief QGC Compass HUD * @author Gus Grubba */ @@ -70,5 +70,3 @@ Item { } } } - - diff --git a/src/ui/qmlcommon/QGCCompassInstrument.qml b/src/ui/qmlcommon/QGCCompassWidget.qml similarity index 98% rename from src/ui/qmlcommon/QGCCompassInstrument.qml rename to src/ui/qmlcommon/QGCCompassWidget.qml index adbde3be52dbdbf4db03092f06e3c69cb0a4221f..d4ca061c526de971e91af142c1e39d9f0564b8b3 100644 --- a/src/ui/qmlcommon/QGCCompassInstrument.qml +++ b/src/ui/qmlcommon/QGCCompassWidget.qml @@ -23,7 +23,7 @@ This file is part of the QGROUNDCONTROL project /** * @file - * @brief QGC Compass + * @brief QGC Compass Widget * @author Gus Grubba */ diff --git a/src/ui/qmlcommon/QGCPitchWidget.qml b/src/ui/qmlcommon/QGCPitchIndicator.qml similarity index 100% rename from src/ui/qmlcommon/QGCPitchWidget.qml rename to src/ui/qmlcommon/QGCPitchIndicator.qml diff --git a/src/ui/qmlcommon/qmldir b/src/ui/qmlcommon/qmldir index dfaeec284866d363a0dea2a2f779fba35d71eb30..7bd0f9046a03ffe39d30769a79535b77c4f527b5 100644 --- a/src/ui/qmlcommon/qmldir +++ b/src/ui/qmlcommon/qmldir @@ -1,19 +1,19 @@ Module QGroundControl.FlightControls QGCAltitudeWidget 1.0 QGCAltitudeWidget.qml +QGCArtificialHorizon 1.0 QGCArtificialHorizon.qml +QGCAttitudeHUD 1.0 QGCAttitudeHUD.qml QGCAttitudeWidget 1.0 QGCAttitudeWidget.qml -QGCCompass 1.0 QGCCompass.qml +QGCCompassHUD 1.0 QGCCompassHUD.qml +QGCCompassWidget 1.0 QGCCompassWidget.qml QGCCurrentAltitude 1.0 QGCCurrentAltitude.qml QGCCurrentSpeed 1.0 QGCCurrentSpeed.qml +QGCHudMessage 1.0 QGCHudMessage.qml QGCMapBackground 1.0 QGCMapBackground.qml -QGCPitchWidget 1.0 QGCPitchWidget.qml -QGCSpeedWidget 1.0 QGCSpeedWidget.qml -QGCSlider 1.0 QGCSlider.qml -QGCWaypointEditor 1.0 QGCWaypointEditor.qml QGCMapToolButton 1.0 QGCMapToolButton.qml -QGCAttitudeInstrument 1.0 QGCAttitudeInstrument.qml -QGCCompassInstrument 1.0 QGCCompassInstrument.qml -QGCArtificialHorizon 1.0 QGCArtificialHorizon.qml -QGCWaypoint 1.0 QGCWaypoint.qml -QGCHudMessage 1.0 QGCHudMessage.qml +QGCPitchIndicator 1.0 QGCPitchIndicator.qml +QGCSlider 1.0 QGCSlider.qml +QGCSpeedWidget 1.0 QGCSpeedWidget.qml QGCVideoBackground 1.0 QGCVideoBackground.qml +QGCWaypoint 1.0 QGCWaypoint.qml +QGCWaypointEditor 1.0 QGCWaypointEditor.qml