diff --git a/qgroundcontrol.qrc b/qgroundcontrol.qrc index bd33b77b0cd35f849a34a68280f8c57a614dd3dd..7604c5a9fc686a0bc81e43f8c054a291555f9733 100644 --- a/qgroundcontrol.qrc +++ b/qgroundcontrol.qrc @@ -22,6 +22,7 @@ src/PlanView/CorridorScanEditor.qml src/QmlControls/QGCViewDialogContainer.qml src/PlanView/PlanToolBar.qml + src/PlanView/PlanToolBarIndicators.qml src/PlanView/CameraCalc.qml src/PlanView/CorridorScanMapVisual.qml src/QmlControls/EditPositionDialog.qml diff --git a/src/PlanView/PlanToolBar.qml b/src/PlanView/PlanToolBar.qml index 327b03bf57ed2fab846510076ff36c9ac6ce407d..c74df9e3c9db82b2da1b78a3583015555c4d31f2 100644 --- a/src/PlanView/PlanToolBar.qml +++ b/src/PlanView/PlanToolBar.qml @@ -13,82 +13,24 @@ import QGroundControl.Palette 1.0 Rectangle { id: _root color: qgcPal.globalTheme === QGCPalette.Light ? Qt.rgba(1,1,1,0.8) : Qt.rgba(0,0,0,0.75) - - property var _planMasterController: mainWindow.planMasterControllerPlan - property var _currentMissionItem: mainWindow.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 _statusValid: _currentMissionItem !== undefined && _currentMissionItem !== null - 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: _statusValid && _currentMissionItem ? _currentMissionItem.distance : NaN - property real _altDifference: _statusValid && _currentMissionItem ? _currentMissionItem.altDifference : NaN - property real _gradient: _statusValid && _currentMissionItem && _currentMissionItem.distance > 0 ? Math.atan(_currentMissionItem.altDifference / _currentMissionItem.distance) : NaN - property real _gradientPercent: isNaN(_gradient) ? NaN : _gradient * 100 - property real _azimuth: _statusValid && _currentMissionItem ? _currentMissionItem.azimuth : NaN - property real _heading: _statusValid && _currentMissionItem ? _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 string _distanceText: isNaN(_distance) ? "-.-" : QGroundControl.metersToAppSettingsDistanceUnits(_distance).toFixed(1) + " " + QGroundControl.appSettingsDistanceUnitsString - property string _altDifferenceText: isNaN(_altDifference) ? "-.-" : QGroundControl.metersToAppSettingsDistanceUnits(_altDifference).toFixed(1) + " " + QGroundControl.appSettingsDistanceUnitsString - property string _gradientText: isNaN(_gradient) ? "-.-" : _gradientPercent.toFixed(0) + " %" - property string _azimuthText: isNaN(_azimuth) ? "-.-" : Math.round(_azimuth) % 360 - property string _headingText: isNaN(_azimuth) ? "-.-" : Math.round(_heading) % 360 - property string _missionDistanceText: isNaN(_missionDistance) ? "-.-" : QGroundControl.metersToAppSettingsDistanceUnits(_missionDistance).toFixed(0) + " " + QGroundControl.appSettingsDistanceUnitsString - property string _missionMaxTelemetryText: isNaN(_missionMaxTelemetry) ? "-.-" : QGroundControl.metersToAppSettingsDistanceUnits(_missionMaxTelemetry).toFixed(0) + " " + QGroundControl.appSettingsDistanceUnitsString - 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') - } - - //-- Eat mouse events, preventing them from reaching toolbar, which is underneath us. - DeadMouseArea { - anchors.fill: parent + anchors.fill: parent + /// Bottom single pixel divider + Rectangle { + anchors.left: parent.left + anchors.right: parent.right + anchors.bottom: parent.bottom + height: 1 + color: "black" + visible: qgcPal.globalTheme === QGCPalette.Light } - - //-- The reason for this Row to be here is so the Logo (Home) button is in the same - // location as the one in the main toolbar. - Row { - id: logoRow + RowLayout { anchors.bottomMargin: 1 - anchors.left: parent.left - anchors.top: parent.top - anchors.bottom: parent.bottom + anchors.rightMargin: ScreenTools.defaultFontPixelWidth / 2 + anchors.fill: parent + spacing: ScreenTools.defaultFontPixelWidth * 2 QGCToolBarButton { id: settingsButton - anchors.top: parent.top - anchors.bottom: parent.bottom + Layout.fillHeight: true icon.source: "/qmlimages/PaperPlane.svg" logo: true checked: false @@ -97,266 +39,10 @@ Rectangle { mainWindow.showFlyView() } } - } - - // Progress bar - - on_ControllerProgressPctChanged: { - 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.rightMargin: _margins - anchors.left: parent.left - anchors.right: uploadButton.visible ? uploadButton.left : parent.right - columnSpacing: 0 - columns: 3 - - 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 } -/* - FIXME: Swap point display is currently hidden since the code which calcs it doesn't work correctly - QGCLabel { text: qsTr("Swap waypoint:"); font.pointSize: _dataFontSize; } - QGCLabel { - text: _batteryChangePointText - font.pointSize: _dataFontSize - Layout.minimumWidth: _mediumValueWidth - } -*/ - } - } - - QGCButton { - id: uploadButton - anchors.rightMargin: _margins - anchors.right: parent.right - anchors.verticalCenter: parent.verticalCenter - 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 - } - } - } - - /* - Rectangle { - anchors.bottom: parent.bottom - height: toolBar.height * 0.05 - width: activeVehicle ? activeVehicle.parameterManager.loadProgress * parent.width : 0 - color: qgcPal.colorGreen - visible: !largeProgressBar.visible - } - */ - - // 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 + Loader { + source: "PlanToolBarIndicators.qml" + Layout.fillWidth: true + Layout.fillHeight: true } } } diff --git a/src/PlanView/PlanToolBarIndicators.qml b/src/PlanView/PlanToolBarIndicators.qml new file mode 100644 index 0000000000000000000000000000000000000000..a5907fe2fa77cefd85099deb2b01fe4a7eea93e0 --- /dev/null +++ b/src/PlanView/PlanToolBarIndicators.qml @@ -0,0 +1,335 @@ +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 { + anchors.fill: parent + + property var _planMasterController: mainWindow.planMasterControllerPlan + property var _currentMissionItem: mainWindow.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 _statusValid: _currentMissionItem !== undefined && _currentMissionItem !== null + 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: _statusValid && _currentMissionItem ? _currentMissionItem.distance : NaN + property real _altDifference: _statusValid && _currentMissionItem ? _currentMissionItem.altDifference : NaN + property real _gradient: _statusValid && _currentMissionItem && _currentMissionItem.distance > 0 ? Math.atan(_currentMissionItem.altDifference / _currentMissionItem.distance) : NaN + property real _gradientPercent: isNaN(_gradient) ? NaN : _gradient * 100 + property real _azimuth: _statusValid && _currentMissionItem ? _currentMissionItem.azimuth : NaN + property real _heading: _statusValid && _currentMissionItem ? _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 string _distanceText: isNaN(_distance) ? "-.-" : QGroundControl.metersToAppSettingsDistanceUnits(_distance).toFixed(1) + " " + QGroundControl.appSettingsDistanceUnitsString + property string _altDifferenceText: isNaN(_altDifference) ? "-.-" : QGroundControl.metersToAppSettingsDistanceUnits(_altDifference).toFixed(1) + " " + QGroundControl.appSettingsDistanceUnitsString + property string _gradientText: isNaN(_gradient) ? "-.-" : _gradientPercent.toFixed(0) + " %" + property string _azimuthText: isNaN(_azimuth) ? "-.-" : Math.round(_azimuth) % 360 + property string _headingText: isNaN(_azimuth) ? "-.-" : Math.round(_heading) % 360 + property string _missionDistanceText: isNaN(_missionDistance) ? "-.-" : QGroundControl.metersToAppSettingsDistanceUnits(_missionDistance).toFixed(0) + " " + QGroundControl.appSettingsDistanceUnitsString + property string _missionMaxTelemetryText: isNaN(_missionMaxTelemetry) ? "-.-" : QGroundControl.metersToAppSettingsDistanceUnits(_missionMaxTelemetry).toFixed(0) + " " + QGroundControl.appSettingsDistanceUnitsString + 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 + + on_ControllerProgressPctChanged: { + 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.rightMargin: _margins + anchors.left: parent.left + anchors.right: uploadButton.visible ? uploadButton.left : parent.right + columnSpacing: 0 + columns: 3 + + 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 } +/* + FIXME: Swap point display is currently hidden since the code which calcs it doesn't work correctly + QGCLabel { text: qsTr("Swap waypoint:"); font.pointSize: _dataFontSize; } + QGCLabel { + text: _batteryChangePointText + font.pointSize: _dataFontSize + Layout.minimumWidth: _mediumValueWidth + } +*/ + } + } + + QGCButton { + id: uploadButton + anchors.rightMargin: _margins + anchors.right: parent.right + anchors.verticalCenter: parent.verticalCenter + 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 + } + } + } + + /* + Rectangle { + anchors.bottom: parent.bottom + height: toolBar.height * 0.05 + width: activeVehicle ? activeVehicle.parameterManager.loadProgress * parent.width : 0 + color: qgcPal.colorGreen + visible: !largeProgressBar.visible + } + */ + + // 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 + } + } +} +