import QtQuick 2.3 import QtQuick.Controls 1.2 import QtQuick.Layouts 1.2 import QtQuick.Dialogs 1.2 import QGroundControl 1.0 import QGroundControl.ScreenTools 1.0 import QGroundControl.Controls 1.0 import QGroundControl.FactControls 1.0 import QGroundControl.Palette 1.0 // Toolbar for Plan View Item { width: missionStats.width + _margins property var _planMasterController: globals.planMasterControllerPlanView property var _currentMissionItem: globals.currentPlanMissionItem ///< Mission item to display status for property var missionItems: _controllerValid ? _planMasterController.missionController.visualItems : undefined property real missionDistance: _controllerValid ? _planMasterController.missionController.missionDistance : NaN property real missionTime: _controllerValid ? _planMasterController.missionController.missionTime : NaN property real missionMaxTelemetry: _controllerValid ? _planMasterController.missionController.missionMaxTelemetry : NaN property bool missionDirty: _controllerValid ? _planMasterController.missionController.dirty : false property bool _controllerValid: _planMasterController !== undefined && _planMasterController !== null property bool _controllerOffline: _controllerValid ? _planMasterController.offline : true property var _controllerDirty: _controllerValid ? _planMasterController.dirty : false property var _controllerSyncInProgress: _controllerValid ? _planMasterController.syncInProgress : false property bool _currentMissionItemValid: _currentMissionItem && _currentMissionItem !== undefined && _currentMissionItem !== null property bool _curreItemIsFlyThrough: _currentMissionItemValid && _currentMissionItem.specifiesCoordinate && !_currentMissionItem.isStandaloneCoordinate property bool _currentItemIsVTOLTakeoff: _currentMissionItemValid && _currentMissionItem.command == 84 property bool _missionValid: missionItems !== undefined property real _dataFontSize: ScreenTools.defaultFontPointSize property real _largeValueWidth: ScreenTools.defaultFontPixelWidth * 8 property real _mediumValueWidth: ScreenTools.defaultFontPixelWidth * 4 property real _smallValueWidth: ScreenTools.defaultFontPixelWidth * 3 property real _labelToValueSpacing: ScreenTools.defaultFontPixelWidth property real _rowSpacing: ScreenTools.isMobile ? 1 : 0 property real _distance: _currentMissionItemValid ? _currentMissionItem.distance : NaN property real _altDifference: _currentMissionItemValid ? _currentMissionItem.altDifference : NaN property real _azimuth: _currentMissionItemValid ? _currentMissionItem.azimuth : NaN property real _heading: _currentMissionItemValid ? _currentMissionItem.missionVehicleYaw : NaN property real _missionDistance: _missionValid ? missionDistance : NaN property real _missionMaxTelemetry: _missionValid ? missionMaxTelemetry : NaN property real _missionTime: _missionValid ? missionTime : NaN property int _batteryChangePoint: _controllerValid ? _planMasterController.missionController.batteryChangePoint : -1 property int _batteriesRequired: _controllerValid ? _planMasterController.missionController.batteriesRequired : -1 property bool _batteryInfoAvailable: _batteryChangePoint >= 0 || _batteriesRequired >= 0 property real _controllerProgressPct: _controllerValid ? _planMasterController.missionController.progressPct : 0 property bool _syncInProgress: _controllerValid ? _planMasterController.missionController.syncInProgress : false property real _gradient: _currentMissionItemValid && _currentMissionItem.distance > 0 ? (_currentItemIsVTOLTakeoff ? 0 : (Math.atan(_currentMissionItem.altDifference / _currentMissionItem.distance) * (180.0/Math.PI))) : NaN property string _distanceText: isNaN(_distance) ? "-.-" : QGroundControl.unitsConversion.metersToAppSettingsHorizontalDistanceUnits(_distance).toFixed(1) + " " + QGroundControl.unitsConversion.appSettingsHorizontalDistanceUnitsString property string _altDifferenceText: isNaN(_altDifference) ? "-.-" : QGroundControl.unitsConversion.metersToAppSettingsHorizontalDistanceUnits(_altDifference).toFixed(1) + " " + QGroundControl.unitsConversion.appSettingsHorizontalDistanceUnitsString property string _gradientText: isNaN(_gradient) ? "-.-" : _gradient.toFixed(0) + " deg" property string _azimuthText: isNaN(_azimuth) ? "-.-" : Math.round(_azimuth) % 360 property string _headingText: isNaN(_azimuth) ? "-.-" : Math.round(_heading) % 360 property string _missionDistanceText: isNaN(_missionDistance) ? "-.-" : QGroundControl.unitsConversion.metersToAppSettingsHorizontalDistanceUnits(_missionDistance).toFixed(0) + " " + QGroundControl.unitsConversion.appSettingsHorizontalDistanceUnitsString property string _missionMaxTelemetryText: isNaN(_missionMaxTelemetry) ? "-.-" : QGroundControl.unitsConversion.metersToAppSettingsHorizontalDistanceUnits(_missionMaxTelemetry).toFixed(0) + " " + QGroundControl.unitsConversion.appSettingsHorizontalDistanceUnitsString property string _batteryChangePointText: _batteryChangePoint < 0 ? "N/A" : _batteryChangePoint property string _batteriesRequiredText: _batteriesRequired < 0 ? "N/A" : _batteriesRequired readonly property real _margins: ScreenTools.defaultFontPixelWidth function getMissionTime() { if(isNaN(_missionTime)) { return "00:00:00" } var t = new Date(0, 0, 0, 0, 0, Number(_missionTime)) return Qt.formatTime(t, 'hh:mm:ss') } // Progress bar Connections { target: _controllerValid ? _planMasterController.missionController : null onProgressPctChanged: { if (_controllerProgressPct === 1) { missionStats.visible = false uploadCompleteText.visible = true progressBar.visible = false resetProgressTimer.start() } else if (_controllerProgressPct > 0) { progressBar.visible = true } } } Timer { id: resetProgressTimer interval: 5000 onTriggered: { missionStats.visible = true uploadCompleteText.visible = false } } QGCLabel { id: uploadCompleteText anchors.fill: parent font.pointSize: ScreenTools.largeFontPointSize horizontalAlignment: Text.AlignHCenter verticalAlignment: Text.AlignVCenter text: "Done" visible: false } GridLayout { id: missionStats anchors.top: parent.top anchors.bottom: parent.bottom anchors.leftMargin: _margins anchors.left: parent.left columnSpacing: 0 columns: 4 GridLayout { columns: 8 rowSpacing: _rowSpacing columnSpacing: _labelToValueSpacing Layout.alignment: Qt.AlignVCenter | Qt.AlignHCenter QGCLabel { text: qsTr("Selected Waypoint") Layout.columnSpan: 8 font.pointSize: ScreenTools.smallFontPointSize } QGCLabel { text: qsTr("Alt diff:"); font.pointSize: _dataFontSize; } QGCLabel { text: _altDifferenceText font.pointSize: _dataFontSize Layout.minimumWidth: _mediumValueWidth } Item { width: 1; height: 1 } QGCLabel { text: qsTr("Azimuth:"); font.pointSize: _dataFontSize; } QGCLabel { text: _azimuthText font.pointSize: _dataFontSize Layout.minimumWidth: _smallValueWidth } Item { width: 1; height: 1 } QGCLabel { text: qsTr("Distance:"); font.pointSize: _dataFontSize; } QGCLabel { text: _distanceText font.pointSize: _dataFontSize Layout.minimumWidth: _largeValueWidth } QGCLabel { text: qsTr("Gradient:"); font.pointSize: _dataFontSize; } QGCLabel { text: _gradientText font.pointSize: _dataFontSize Layout.minimumWidth: _mediumValueWidth } Item { width: 1; height: 1 } QGCLabel { text: qsTr("Heading:"); font.pointSize: _dataFontSize; } QGCLabel { text: _headingText font.pointSize: _dataFontSize Layout.minimumWidth: _smallValueWidth } } GridLayout { columns: 5 rowSpacing: _rowSpacing columnSpacing: _labelToValueSpacing Layout.alignment: Qt.AlignVCenter | Qt.AlignHCenter QGCLabel { text: qsTr("Total Mission") Layout.columnSpan: 5 font.pointSize: ScreenTools.smallFontPointSize } QGCLabel { text: qsTr("Distance:"); font.pointSize: _dataFontSize; } QGCLabel { text: _missionDistanceText font.pointSize: _dataFontSize Layout.minimumWidth: _largeValueWidth } Item { width: 1; height: 1 } QGCLabel { text: qsTr("Max telem dist:"); font.pointSize: _dataFontSize; } QGCLabel { text: _missionMaxTelemetryText font.pointSize: _dataFontSize Layout.minimumWidth: _largeValueWidth } QGCLabel { text: qsTr("Time:"); font.pointSize: _dataFontSize; } QGCLabel { text: getMissionTime() font.pointSize: _dataFontSize Layout.minimumWidth: _largeValueWidth } } GridLayout { columns: 3 rowSpacing: _rowSpacing columnSpacing: _labelToValueSpacing Layout.alignment: Qt.AlignVCenter | Qt.AlignHCenter visible: _batteryInfoAvailable QGCLabel { text: qsTr("Battery") Layout.columnSpan: 3 font.pointSize: ScreenTools.smallFontPointSize } QGCLabel { text: qsTr("Batteries required:"); font.pointSize: _dataFontSize; } QGCLabel { text: _batteriesRequiredText font.pointSize: _dataFontSize Layout.minimumWidth: _mediumValueWidth } Item { width: 1; height: 1 } } QGCButton { id: uploadButton text: _controllerDirty ? qsTr("Upload Required") : qsTr("Upload") enabled: !_controllerSyncInProgress visible: !_controllerOffline && !_controllerSyncInProgress && !uploadCompleteText.visible primary: _controllerDirty onClicked: _planMasterController.upload() PropertyAnimation on opacity { easing.type: Easing.OutQuart from: 0.5 to: 1 loops: Animation.Infinite running: _controllerDirty && !_controllerSyncInProgress alwaysRunToEnd: true duration: 2000 } } } // Small mission download progress bar Rectangle { id: progressBar anchors.left: parent.left anchors.bottom: parent.bottom height: 4 width: _controllerProgressPct * parent.width color: qgcPal.colorGreen visible: false onVisibleChanged: { if (visible) { largeProgressBar._userHide = false } } } // Large mission download progress bar Rectangle { id: largeProgressBar anchors.bottom: parent.bottom anchors.left: parent.left anchors.right: parent.right height: parent.height color: qgcPal.window visible: _showLargeProgress property bool _userHide: false property bool _showLargeProgress: progressBar.visible && !_userHide && qgcPal.globalTheme === QGCPalette.Light Connections { target: QGroundControl.multiVehicleManager onActiveVehicleChanged: largeProgressBar._userHide = false } Rectangle { anchors.top: parent.top anchors.bottom: parent.bottom width: _controllerProgressPct * parent.width color: qgcPal.colorGreen } QGCLabel { anchors.centerIn: parent text: qsTr("Syncing Mission") font.pointSize: ScreenTools.largeFontPointSize } QGCLabel { anchors.margins: _margin anchors.right: parent.right anchors.bottom: parent.bottom text: qsTr("Click anywhere to hide") property real _margin: ScreenTools.defaultFontPixelWidth / 2 } MouseArea { anchors.fill: parent onClicked: largeProgressBar._userHide = true } } }