diff --git a/src/QmlControls/QGCToolBarButton.qml b/src/QmlControls/QGCToolBarButton.qml index cf90039..b2892de 100644 --- a/src/QmlControls/QGCToolBarButton.qml +++ b/src/QmlControls/QGCToolBarButton.qml @@ -14,20 +14,25 @@ import QGroundControl.Controls 1.0 import QGroundControl.Palette 1.0 import QGroundControl.ScreenTools 1.0 +// Important Note: Toolbar buttons must manage their checked state manually in order to support +// view switch prevention. This means they can't be checkable or autoExclusive. + Button { id: button height: ScreenTools.defaultFontPixelHeight * 3 leftPadding: _horizontalMargin rightPadding: _horizontalMargin - autoExclusive: true + checkable: false property bool logo: false property real _horizontalMargin: ScreenTools.defaultFontPixelWidth + onCheckedChanged: checkable = false + background: Rectangle { anchors.fill: parent - color: logo ? qgcPal.brandingPurple : (checked ? qgcPal.buttonHighlight : Qt.rgba(0,0,0,0)) + color: logo ? qgcPal.brandingPurple : (button.checked ? qgcPal.buttonHighlight : Qt.rgba(0,0,0,0)) } contentItem: Row { diff --git a/src/QmlControls/SubMenuButton.qml b/src/QmlControls/SubMenuButton.qml index 8d5a7dc..23b75be 100644 --- a/src/QmlControls/SubMenuButton.qml +++ b/src/QmlControls/SubMenuButton.qml @@ -6,6 +6,9 @@ import QtGraphicalEffects 1.0 import QGroundControl.Palette 1.0 import QGroundControl.ScreenTools 1.0 +// Important Note: SubMenuButtons must manage their checked state manually in order to support +// view switch prevention. This means they can't be checkable or autoExclusive. + Button { id: _rootButton property bool setupComplete: true ///< true: setup complete indicator shows as completed @@ -13,12 +16,14 @@ Button { property string imageResource: "/qmlimages/subMenuButtonImage.png" ///< Button image property size sourceSize: Qt.size(ScreenTools.defaultFontPixelHeight * 2, ScreenTools.defaultFontPixelHeight * 2) - text: "Button" ///< Pass in your own button text + text: "Button" ///< Pass in your own button text + activeFocusOnPress: true - checkable: true implicitHeight: ScreenTools.isTinyScreen ? ScreenTools.defaultFontPixelHeight * 3.5 : ScreenTools.defaultFontPixelHeight * 2.5 implicitWidth: __panel.implicitWidth + onCheckedChanged: checkable = false + style: ButtonStyle { id: buttonStyle diff --git a/src/VehicleSetup/SetupView.qml b/src/VehicleSetup/SetupView.qml index a7feef8..4a845ef 100644 --- a/src/VehicleSetup/SetupView.qml +++ b/src/VehicleSetup/SetupView.qml @@ -41,6 +41,9 @@ Rectangle { function showSummaryPanel() { + if (mainWindow.preventViewSwitch) { + return + } if (_fullParameterVehicleAvailable) { if (QGroundControl.multiVehicleManager.activeVehicle.autopilot.vehicleComponents.length === 0) { panelLoader.setSourceComponent(noComponentsVehicleSummaryComponent) @@ -54,30 +57,19 @@ Rectangle { } } - function showFirmwarePanel() - { - if (!ScreenTools.isMobile) { - panelLoader.setSource("FirmwareUpgrade.qml") + function showPanel(button, qmlSource) { + if (mainWindow.preventViewSwitch) { + return } - } - - function showJoystickPanel() - { - panelLoader.setSource("JoystickConfig.qml") - } - - function showParametersPanel() - { - panelLoader.setSource("SetupParameterEditor.qml") - } - - function showPX4FlowPanel() - { - panelLoader.setSource("PX4FlowSensor.qml") + button.checked = true + panelLoader.setSource(qmlSource) } function showVehicleComponentPanel(vehicleComponent) { + if (mainWindow.preventViewSwitch) { + return + } var autopilotPlugin = QGroundControl.multiVehicleManager.activeVehicle.autopilot var prereq = autopilotPlugin.prerequisiteSetup(vehicleComponent) if (prereq !== "") { @@ -229,7 +221,7 @@ Rectangle { exclusiveGroup: setupButtonGroup text: modelData.title visible: _corePlugin && _corePlugin.options.combineSettingsAndSetup - onClicked: panelLoader.setSource(modelData.url) + onClicked: showPanel(this, modelData.url) Layout.fillWidth: true } } @@ -255,7 +247,7 @@ Rectangle { text: qsTr("Firmware") Layout.fillWidth: true - onClicked: showFirmwarePanel() + onClicked: showPanel(this, "FirmwareUpgrade.qml") } SubMenuButton { @@ -265,8 +257,7 @@ Rectangle { setupIndicator: false text: qsTr("PX4Flow") Layout.fillWidth: true - - onClicked: showPX4FlowPanel() + onClicked: showPX4FlowPanel(this, "PX4FlowSensor.qml") } SubMenuButton { @@ -277,8 +268,7 @@ Rectangle { visible: _fullParameterVehicleAvailable && joystickManager.joysticks.length !== 0 text: qsTr("Joystick") Layout.fillWidth: true - - onClicked: showJoystickPanel() + onClicked: showJoystickPanel(this, "JoystickConfig.qml") } Repeater { @@ -293,8 +283,7 @@ Rectangle { text: modelData.name visible: modelData.setupSource.toString() !== "" Layout.fillWidth: true - - onClicked: showVehicleComponentPanel(modelData) + onClicked: showVehicleComponentPanel(modelData) } } @@ -306,8 +295,7 @@ Rectangle { _corePlugin.showAdvancedUI text: qsTr("Parameters") Layout.fillWidth: true - - onClicked: showParametersPanel() + onClicked: showPanel(this, "SetupParameterEditor.qml") } } diff --git a/src/ui/AppSettings.qml b/src/ui/AppSettings.qml index 3f1f533..ec41b27 100644 --- a/src/ui/AppSettings.qml +++ b/src/ui/AppSettings.qml @@ -74,7 +74,10 @@ Rectangle { Layout.fillWidth: true onClicked: { - if(__rightPanel.source !== modelData.url) { + if (mainWindow.preventViewSwitch) { + return + } + if (__rightPanel.source !== modelData.url) { __rightPanel.source = modelData.url } checked = true diff --git a/src/ui/MainRootWindow.qml b/src/ui/MainRootWindow.qml index 16466a3..ff8e280 100644 --- a/src/ui/MainRootWindow.qml +++ b/src/ui/MainRootWindow.qml @@ -49,6 +49,7 @@ ApplicationWindow { property bool communicationLost: activeVehicle ? activeVehicle.connectionLost : false property string formatedMessage: activeVehicle ? activeVehicle.formatedMessage : "" property real availableHeight: mainWindow.height - mainWindow.header.height - mainWindow.footer.height + property bool preventViewSwitch: false property var currentPlanMissionItem: planMasterControllerPlan ? planMasterControllerPlan.missionController.currentPlanViewItem : null property var planMasterControllerPlan: null @@ -151,8 +152,10 @@ ApplicationWindow { mainWindowDialog.dialogComponent = component mainWindowDialog.dialogTitle = title mainWindowDialog.dialogButtons = buttons + console.log("Prevent view switch") + mainWindow.preventViewSwitch = true mainWindowDialog.open() - if(buttons & StandardButton.Cancel || buttons & StandardButton.Close || buttons & StandardButton.Discard || buttons & StandardButton.Abort || buttons & StandardButton.Ignore) { + if (buttons & StandardButton.Cancel || buttons & StandardButton.Close || buttons & StandardButton.Discard || buttons & StandardButton.Abort || buttons & StandardButton.Ignore) { mainWindowDialog.closePolicy = Popup.NoAutoClose; mainWindowDialog.interactive = false; } else { @@ -184,6 +187,8 @@ ApplicationWindow { dlgLoader.source = "QGCViewDialogContainer.qml" } onClosed: { + console.log("View switch ok") + mainWindow.preventViewSwitch = false dlgLoader.source = "" } } diff --git a/src/ui/toolbar/MainToolBar.qml b/src/ui/toolbar/MainToolBar.qml index cefa4ca..ba99ad2 100644 --- a/src/ui/toolbar/MainToolBar.qml +++ b/src/ui/toolbar/MainToolBar.qml @@ -98,17 +98,25 @@ Item { anchors.bottom: parent.bottom spacing: ScreenTools.defaultFontPixelWidth / 2 - ButtonGroup { - buttons: viewRow.children - } + // Important Note: Toolbar buttons must manage their checked state manually in order to support + // view switch prevention. There doesn't seem to be a way to make this work if they are in a + // ButtonGroup. //--------------------------------------------- // Toolbar Row RowLayout { - id: viewRow + id: buttonRow Layout.fillHeight: true spacing: 0 + function clearAllChecks() { + for (var i=0; i