/**************************************************************************** * * (c) 2009-2020 QGROUNDCONTROL PROJECT * * QGroundControl is licensed according to the terms in the file * COPYING.md in the root of the source code directory. * ****************************************************************************/ import QtQuick 2.11 import QtQuick.Controls 2.4 import QtQuick.Layouts 1.11 import QtQuick.Dialogs 1.3 import QGroundControl 1.0 import QGroundControl.Controls 1.0 import QGroundControl.Palette 1.0 import QGroundControl.MultiVehicleManager 1.0 import QGroundControl.ScreenTools 1.0 import QGroundControl.Controllers 1.0 Item { id: _root // FIXME: Reaching up for communicationLost? property var _activeVehicle: QGroundControl.multiVehicleManager.activeVehicle property real _toolIndicatorMargins: ScreenTools.defaultFontPixelHeight * 0.66 Component.onCompleted: _viewButtonClicked(flyButton) function _viewButtonClicked(button) { if (mainWindow.preventViewSwitch()) { return false } viewButtonSelectRow.visible = false buttonSelectHideTimer.stop() currentButton.icon.source = button.icon.source currentButton.logo = button.logo return true } //-- Setup can be invoked from c++ side Connections { target: setupWindow onVisibleChanged: { if (setupWindow.visible) { _viewButtonClicked(setupButton) } } } QGCPalette { id: qgcPal } /// 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 } //-- Setup can be invoked from c++ side Connections { target: setupWindow onVisibleChanged: { if (setupWindow.visible) { buttonRow.clearAllChecks() setupButton.checked = true } } } RowLayout { id: viewButtonRow anchors.bottomMargin: 1 anchors.top: parent.top anchors.bottom: parent.bottom spacing: ScreenTools.defaultFontPixelWidth / 2 QGCToolBarButton { id: currentButton Layout.fillHeight: true onClicked: { viewButtonSelectRow.visible = !viewButtonSelectRow.visible if (viewButtonSelectRow.visible) { buttonSelectHideTimer.start() } else { buttonSelectHideTimer.stop() } } } //--------------------------------------------- // Toolbar Row RowLayout { id: viewButtonSelectRow Layout.fillHeight: true spacing: 0 visible: false Timer { id: buttonSelectHideTimer interval: 5000 repeat: false onTriggered: viewButtonSelectRow.visible = false } QGCToolBarButton { id: settingsButton Layout.fillHeight: true icon.source: "/res/QGCLogoFull" logo: true visible: currentButton.icon.source !== icon.source && !QGroundControl.corePlugin.options.combineSettingsAndSetup onClicked: { if (_viewButtonClicked(this)) { mainWindow.showSettingsView() } } } QGCToolBarButton { id: setupButton Layout.fillHeight: true icon.source: "/qmlimages/Gears.svg" visible: currentButton.icon.source !== icon.source onClicked: { if (_viewButtonClicked(this)) { mainWindow.showSetupView() } } } QGCToolBarButton { id: planButton Layout.fillHeight: true icon.source: "/qmlimages/Plan.svg" visible: currentButton.icon.source !== icon.source onClicked: { if (_viewButtonClicked(this)) { mainWindow.showPlanView() } } } QGCToolBarButton { id: flyButton Layout.fillHeight: true icon.source: "/qmlimages/PaperPlane.svg" visible: currentButton.icon.source !== icon.source onClicked: { if (_viewButtonClicked(this)) { mainWindow.showFlyView() // Easter Egg mechanism _clickCount++ eggTimer.restart() if (_clickCount == 5) { if(!QGroundControl.corePlugin.showAdvancedUI) { advancedModeConfirmation.open() } else { QGroundControl.corePlugin.showAdvancedUI = false } } else if (_clickCount == 7) { QGroundControl.corePlugin.showTouchAreas = !QGroundControl.corePlugin.showTouchAreas } } } property int _clickCount: 0 Timer { id: eggTimer interval: 1000 repeat: false onTriggered: parent._clickCount = 0 } MessageDialog { id: advancedModeConfirmation title: qsTr("Advanced Mode") text: QGroundControl.corePlugin.showAdvancedUIMessage standardButtons: StandardButton.Yes | StandardButton.No onYes: { QGroundControl.corePlugin.showAdvancedUI = true advancedModeConfirmation.close() } } } QGCToolBarButton { id: analyzeButton Layout.fillHeight: true icon.source: "/qmlimages/Analyze.svg" visible: currentButton.icon.source !== icon.source && QGroundControl.corePlugin.showAdvancedUI onClicked: { if (_viewButtonClicked(this)) { mainWindow.showAnalyzeView() } } } } } // View / Tool separator Row { id: separator anchors.bottomMargin: 1 anchors.top: parent.top anchors.bottom: parent.bottom spacing: ScreenTools.defaultFontPixelWidth * 1.5 Item { anchors.top: parent.top anchors.bottom: parent.bottom width: ScreenTools.defaultFontPixelWidth / 2 } Rectangle { anchors.margins: ScreenTools.defaultFontPixelHeight / 2 anchors.top: parent.top anchors.bottom: parent.bottom width: 1 color: qgcPal.text } Item { anchors.top: parent.top anchors.bottom: parent.bottom width: ScreenTools.defaultFontPixelWidth / 2 } } QGCFlickable { id: toolsFlickable anchors.left: separator.right anchors.right: connectionStatus.visible ? connectionStatus.left : parent.right anchors.bottomMargin: 1 anchors.top: parent.top anchors.bottom: parent.bottom contentWidth: toolRow.width flickableDirection: Flickable.HorizontalFlick Row { id: toolRow anchors.bottomMargin: 1 anchors.top: parent.top anchors.bottom: parent.bottom spacing: ScreenTools.defaultFontPixelWidth * 1.5 Repeater { id: appRepeater model: QGroundControl.corePlugin.toolBarIndicators Loader { anchors.top: parent.top anchors.bottom: parent.bottom anchors.margins: _toolIndicatorMargins source: modelData visible: item.showIndicator } } Repeater { model: _activeVehicle ? _activeVehicle.toolBarIndicators : [] Loader { anchors.top: parent.top anchors.bottom: parent.bottom anchors.margins: _toolIndicatorMargins source: modelData visible: item.showIndicator } } } } //------------------------------------------------------------------------- //-- Branding Logo Image { anchors.right: parent.right anchors.top: parent.top anchors.bottom: parent.bottom anchors.margins: ScreenTools.defaultFontPixelHeight * 0.66 visible: _activeVehicle && !communicationLost && x > (toolsFlickable.x + toolsFlickable.contentWidth + ScreenTools.defaultFontPixelWidth) fillMode: Image.PreserveAspectFit source: _outdoorPalette ? _brandImageOutdoor : _brandImageIndoor mipmap: true property bool _outdoorPalette: qgcPal.globalTheme === QGCPalette.Light property bool _corePluginBranding: QGroundControl.corePlugin.brandImageIndoor.length != 0 property string _userBrandImageIndoor: QGroundControl.settingsManager.brandImageSettings.userBrandImageIndoor.value property string _userBrandImageOutdoor: QGroundControl.settingsManager.brandImageSettings.userBrandImageOutdoor.value property bool _userBrandingIndoor: _userBrandImageIndoor.length != 0 property bool _userBrandingOutdoor: _userBrandImageOutdoor.length != 0 property string _brandImageIndoor: _userBrandingIndoor ? _userBrandImageIndoor : (_userBrandingOutdoor ? _userBrandImageOutdoor : (_corePluginBranding ? QGroundControl.corePlugin.brandImageIndoor : (activeVehicle ? activeVehicle.brandImageIndoor : "" ) ) ) property string _brandImageOutdoor: _userBrandingOutdoor ? _userBrandImageOutdoor : (_userBrandingIndoor ? _userBrandImageIndoor : (_corePluginBranding ? QGroundControl.corePlugin.brandImageOutdoor : (activeVehicle ? activeVehicle.brandImageOutdoor : "" ) ) ) } // Small parameter download progress bar Rectangle { anchors.bottom: parent.bottom height: _root.height * 0.05 width: _activeVehicle ? _activeVehicle.parameterManager.loadProgress * parent.width : 0 color: qgcPal.colorGreen visible: !largeProgressBar.visible } // Large parameter 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 _initialDownloadComplete: _activeVehicle ? _activeVehicle.parameterManager.parametersReady : true property bool _userHide: false property bool _showLargeProgress: !_initialDownloadComplete && !_userHide && qgcPal.globalTheme === QGCPalette.Light Connections { target: QGroundControl.multiVehicleManager onActiveVehicleChanged: largeProgressBar._userHide = false } Rectangle { anchors.top: parent.top anchors.bottom: parent.bottom width: _activeVehicle ? _activeVehicle.parameterManager.loadProgress * parent.width : 0 color: qgcPal.colorGreen } QGCLabel { anchors.centerIn: parent text: qsTr("Downloading Parameters") 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 } } //------------------------------------------------------------------------- //-- Waiting for a vehicle QGCLabel { anchors.rightMargin: ScreenTools.defaultFontPixelWidth anchors.right: parent.right anchors.verticalCenter: parent.verticalCenter text: qsTr("Waiting For Vehicle Connection") font.pointSize: ScreenTools.mediumFontPointSize font.family: ScreenTools.demiboldFontFamily color: qgcPal.colorRed visible: !_activeVehicle } //------------------------------------------------------------------------- //-- Connection Status Row { id: connectionStatus anchors.rightMargin: ScreenTools.defaultFontPixelWidth anchors.top: parent.top anchors.bottom: parent.bottom anchors.right: parent.right layoutDirection: Qt.RightToLeft spacing: ScreenTools.defaultFontPixelWidth visible: _activeVehicle && communicationLost QGCButton { id: disconnectButton anchors.verticalCenter: parent.verticalCenter text: qsTr("Disconnect") primary: true onClicked: _activeVehicle.disconnectInactiveVehicle() } QGCLabel { id: connectionLost anchors.verticalCenter: parent.verticalCenter text: qsTr("COMMUNICATION LOST") font.pointSize: ScreenTools.largeFontPointSize font.family: ScreenTools.demiboldFontFamily color: qgcPal.colorRed } } }