diff --git a/qgroundcontrol.qrc b/qgroundcontrol.qrc index 93865fcb6b89c14338f4e8ff6c3d6dc48231c0c0..a9593fff355e7af0e38764629c792f9ce9e49551 100644 --- a/qgroundcontrol.qrc +++ b/qgroundcontrol.qrc @@ -126,6 +126,7 @@ src/FlightDisplay/FlightDisplayViewMap.qml src/FlightDisplay/FlightDisplayViewVideo.qml src/FlightDisplay/FlightDisplayViewWidgets.qml + src/FlightDisplay/GuidedActionsController.qml src/FlightDisplay/MultiVehicleList.qml src/FlightDisplay/qmldir src/FlightMap/Widgets/CenterMapDropButton.qml diff --git a/src/FirmwarePlugin/PX4/PX4FirmwarePlugin.cc b/src/FirmwarePlugin/PX4/PX4FirmwarePlugin.cc index 8d0a032e29c85efe6d456e22de328247f76619e3..b5360ce8286f07cba8a8a452b409ebb8d76e1d11 100644 --- a/src/FirmwarePlugin/PX4/PX4FirmwarePlugin.cc +++ b/src/FirmwarePlugin/PX4/PX4FirmwarePlugin.cc @@ -220,7 +220,7 @@ bool PX4FirmwarePlugin::supportsManualControl(void) bool PX4FirmwarePlugin::isCapable(const Vehicle *vehicle, FirmwareCapabilities capabilities) { if (vehicle->multiRotor()) { - return (capabilities & (MavCmdPreflightStorageCapability | GuidedModeCapability | SetFlightModeCapability | PauseVehicleCapability | OrbitModeCapability)) == capabilities; + return (capabilities & (MavCmdPreflightStorageCapability | GuidedModeCapability | SetFlightModeCapability | PauseVehicleCapability /*| OrbitModeCapability still NYI*/)) == capabilities; } else { return (capabilities & (MavCmdPreflightStorageCapability | GuidedModeCapability | SetFlightModeCapability | PauseVehicleCapability)) == capabilities; } diff --git a/src/FlightDisplay/FlightDisplayView.qml b/src/FlightDisplay/FlightDisplayView.qml index 47e4a76ff1b9de49bc43d1aaa948e340f253d722..85ba5f0de668dfe0bb537ffee75bbceab4690a22 100644 --- a/src/FlightDisplay/FlightDisplayView.qml +++ b/src/FlightDisplay/FlightDisplayView.qml @@ -15,6 +15,7 @@ import QtQuick.Dialogs 1.2 import QtLocation 5.3 import QtPositioning 5.3 import QtMultimedia 5.5 +import QtQuick.Layouts 1.2 import QGroundControl 1.0 import QGroundControl.FlightDisplay 1.0 @@ -86,6 +87,11 @@ QGCView { } } + MissionController { + id: flyMissionController + Component.onCompleted: start(false /* editMode */) + } + MessageDialog { id: px4JoystickSupport text: qsTr("Joystick support requires MAVLink MANUAL_CONTROL support. ") + @@ -144,11 +150,13 @@ QGCView { } ] FlightDisplayViewMap { - id: _flightMap - anchors.fill: parent - flightWidgets: flightDisplayViewWidgets - rightPanelWidth: ScreenTools.defaultFontPixelHeight * 9 - qgcView: root + id: _flightMap + anchors.fill: parent + missionController: flyMissionController + guidedActionsController: guidedController + flightWidgets: flightDisplayViewWidgets + rightPanelWidth: ScreenTools.defaultFontPixelHeight * 9 + qgcView: root } } @@ -243,7 +251,7 @@ QGCView { z: _panel.z + 4 height: ScreenTools.availableHeight anchors.left: parent.left - anchors.right: parent.right + anchors.right: altitudeSlider.visible ? altitudeSlider.left : parent.right anchors.bottom: parent.bottom qgcView: root useLightColors: isBackgroundDark @@ -315,5 +323,371 @@ QGCView { property Fact _virtualJoystick: QGroundControl.settingsManager.appSettings.virtualJoystick } + + ToolStrip { + id: toolStrip + anchors.leftMargin: ScreenTools.defaultFontPixelWidth + anchors.left: _panel.left + anchors.topMargin: ScreenTools.toolbarHeight + _margins + anchors.top: _panel.top + z: _panel.z + 4 + title: qsTr("Fly") + maxHeight: (_flightVideo.visible ? _flightVideo.y : parent.height) - toolStrip.y + buttonVisible: [ guidedController.showTakeoff || !guidedController.showLand, guidedController.showLand, true, true, true, guidedController.smartShotsAvailable ] + buttonEnabled: [ guidedController.showTakeoff, guidedController.showLand, guidedController.showRTL, guidedController.showPause, _anyActionAvailable, _anySmartShotAvailable ] + + property bool _anyActionAvailable: guidedController.showEmergenyStop || guidedController.showStartMission || guidedController.showResumeMission || guidedController.showChangeAlt || guidedController.showLandAbort + property bool _anySmartShotAvailable: guidedController.showOrbit + property var _actionModel: [ + { + title: guidedController.startMissionTitle, + text: guidedController.startMissionMessage, + action: guidedController.actionStartMission, + visible: guidedController.showStartMission + }, + { + title: guidedController.resumeMissionTitle, + text: guidedController.resumeMissionMessage, + action: guidedController.actionResumeMission, + visible: guidedController.showResumeMission + }, + { + title: guidedController.changeAltTitle, + text: guidedController.changeAltMessage, + action: guidedController.actionChangeAlt, + visible: guidedController.showChangeAlt + }, + { + title: guidedController.landAbortTitle, + text: guidedController.landAbortMessage, + action: guidedController.actionLandAbort, + visible: guidedController.showLandAbort + } + ] + property var _smartShotModel: [ + { + title: guidedController.orbitTitle, + text: guidedController.orbitMessage, + action: guidedController.actionOrbit, + visible: guidedController.showOrbit + } + ] + + model: [ + { + name: guidedController.takeoffTitle, + iconSource: "/qmlimages/MapCenter.svg", + action: guidedController.actionTakeoff + }, + { + name: guidedController.landTitle, + iconSource: "/qmlimages/MapCenter.svg", + action: guidedController.actionLand + }, + { + name: guidedController.rtlTitle, + iconSource: "/qmlimages/MapCenter.svg", + action: guidedController.actionRTL + }, + { + name: guidedController.pauseTitle, + iconSource: "/qmlimages/MapCenter.svg", + action: guidedController.actionPause + }, + { + name: qsTr("Action"), + iconSource: "/qmlimages/MapCenter.svg", + action: -1 + }, + /* + No firmware support any smart shots yet + { + name: qsTr("Smart"), + iconSource: "/qmlimages/MapCenter.svg", + action: -1 + }, + */ + ] + + onClicked: { + guidedActionConfirm.visible = false + guidedActionList.visible = false + altitudeSlider.visible = false + var action = model[index].action + if (action === -1) { + if (index == 4) { + guidedActionList.model = _actionModel + guidedActionList.visible = true + } else if (index == 5) { + guidedActionList.model = _smartShotModel + guidedActionList.visible = true + } + } else { + guidedController.confirmAction(action) + } + } + } + + GuidedActionsController { + id: guidedController + missionController: flyMissionController + z: _flightVideoPipControl.z + 1 + + onShowConfirmAction: { + guidedActionConfirm.title = title + guidedActionConfirm.message = message + guidedActionConfirm.action = action + guidedActionConfirm.actionData = actionData + guidedActionConfirm.visible = true + } + } + + Rectangle { + id: guidedActionConfirm + anchors.margins: _margins + anchors.bottom: parent.bottom + anchors.horizontalCenter: parent.horizontalCenter + width: confirmColumn.width + (_margins * 2) + height: confirmColumn.height + (_margins * 2) + radius: ScreenTools.defaultFontPixelHeight / 2 + color: qgcPal.window + opacity: 0.9 + z: guidedController.z + visible: false + + property alias title: titleText.text + property alias message: messageText.text + property int action + property var actionData + + property real _margins: ScreenTools.defaultFontPixelWidth + + Column { + id: confirmColumn + anchors.margins: _margins + anchors.top: parent.top + anchors.left: parent.left + spacing: _margins + + QGCLabel { + id: titleText + anchors.left: slider.left + anchors.right: slider.right + horizontalAlignment: Text.AlignHCenter + } + + QGCLabel { + id: messageText + anchors.left: slider.left + anchors.right: slider.right + horizontalAlignment: Text.AlignHCenter + wrapMode: Text.WordWrap + } + + // Action confirmation control + SliderSwitch { + id: slider + confirmText: qsTr("Slide to confirm") + width: Math.max(implicitWidth, ScreenTools.defaultFontPixelWidth * 30) + + onAccept: { + guidedActionConfirm.visible = false + if (altitudeSlider.visible) { + guidedActionConfirm.actionData = altitudeSlider.getValue() + altitudeSlider.visible = false + } + guidedController.executeAction(guidedActionConfirm.action, guidedActionConfirm.actionData) + } + + onReject: { + altitudeSlider.visible = false + guidedActionConfirm.visible = false + } + } + } + + QGCColoredImage { + anchors.margins: _margins + anchors.top: parent.top + anchors.right: parent.right + width: ScreenTools.defaultFontPixelHeight + height: width + sourceSize.height: width + source: "/res/XDelete.svg" + fillMode: Image.PreserveAspectFit + color: qgcPal.text + + QGCMouseArea { + fillItem: parent + onClicked: { + altitudeSlider.visible = false + guidedActionConfirm.visible = false + } + } + } + } + + Rectangle { + id: guidedActionList + anchors.margins: _margins + anchors.bottom: parent.bottom + anchors.horizontalCenter: parent.horizontalCenter + width: actionColumn.width + (_margins * 2) + height: actionColumn.height + (_margins * 2) + radius: _margins / 2 + color: qgcPal.window + opacity: 0.9 + z: guidedController.z + visible: false + + property alias model: actionRepeater.model + + property real _margins: Math.round(ScreenTools.defaultFontPixelHeight * 0.66) + + ColumnLayout { + id: actionColumn + anchors.margins: guidedActionList._margins + anchors.top: parent.top + anchors.left: parent.left + spacing: _margins + + QGCLabel { + text: qsTr("Select Action") + Layout.alignment: Qt.AlignHCenter + } + + QGCFlickable { + contentWidth: actionRow.width + contentHeight: actionRow.height + Layout.minimumHeight: actionRow.height + Layout.maximumHeight: actionRow.height + Layout.minimumWidth: _width + Layout.maximumWidth: _width + + property real _width: Math.min(root.width * 0.8, actionRow.width) + + RowLayout { + id: actionRow + spacing: ScreenTools.defaultFontPixelHeight * 2 + + Repeater { + id: actionRepeater + + ColumnLayout { + spacing: ScreenTools.defaultFontPixelHeight / 2 + visible: modelData.visible + Layout.fillHeight: true + + QGCLabel { + id: actionMessage + text: modelData.text + horizontalAlignment: Text.AlignHCenter + wrapMode: Text.WordWrap + Layout.minimumWidth: _width + Layout.maximumWidth: _width + Layout.fillHeight: true + + property real _width: ScreenTools.defaultFontPixelWidth * 25 + } + + QGCButton { + id: actionButton + anchors.horizontalCenter: parent.horizontalCenter + text: modelData.title + + onClicked: { + if (modelData.action === guidedController.actionChangeAlt) { + altitudeSlider.visible = true + } + guidedActionList.visible = false + guidedController.confirmAction(modelData.action) + } + } + } + } + } + } + } + + QGCColoredImage { + anchors.margins: _margins + anchors.top: parent.top + anchors.right: parent.right + width: ScreenTools.defaultFontPixelHeight + height: width + sourceSize.height: width + source: "/res/XDelete.svg" + fillMode: Image.PreserveAspectFit + color: qgcPal.text + + QGCMouseArea { + fillItem: parent + onClicked: guidedActionList.visible = false + } + } + } + + //-- Altitude slider + Rectangle { + id: altitudeSlider + anchors.margins: _margins + anchors.right: parent.right + anchors.topMargin: ScreenTools.toolbarHeight + _margins + anchors.top: parent.top + anchors.bottom: parent.bottom + z: guidedController.z + radius: ScreenTools.defaultFontPixelWidth / 2 + width: ScreenTools.defaultFontPixelWidth * 10 + color: qgcPal.window + visible: false + + function setValue(value) { + altSlider.value = value + } + + function getValue() { + return altSlider.value + } + + Column { + id: headerColumn + anchors.margins: _margins + anchors.top: parent.top + anchors.left: parent.left + anchors.right: parent.right + + QGCLabel { + anchors.horizontalCenter: parent.horizontalCenter + text: altSlider.value >=0 ? qsTr("Up") : qsTr("Down") + } + + QGCLabel { + id: altField + anchors.horizontalCenter: parent.horizontalCenter + text: Math.abs(altSlider.value.toFixed(1)) + " " + QGroundControl.appSettingsDistanceUnitsString + } + } + + QGCSlider { + id: altSlider + anchors.margins: _margins + anchors.top: headerColumn.bottom + anchors.bottom: parent.bottom + anchors.left: parent.left + anchors.right: parent.right + orientation: Qt.Vertical + minimumValue: QGroundControl.metersToAppSettingsDistanceUnits(-10) + maximumValue: QGroundControl.metersToAppSettingsDistanceUnits(10) + indicatorCentered: true + rotation: 180 + + // We want slide up to be positive values + transform: Rotation { + origin.x: altSlider.width / 2 + origin.y: altSlider.height / 2 + angle: 180 + } + } + } } } diff --git a/src/FlightDisplay/FlightDisplayViewMap.qml b/src/FlightDisplay/FlightDisplayViewMap.qml index cda771db7076d688c50dbba54572d9f7ec65e5f7..4af77838ed12a76701afd982903d1cb8787864ac 100644 --- a/src/FlightDisplay/FlightDisplayViewMap.qml +++ b/src/FlightDisplay/FlightDisplayViewMap.qml @@ -30,19 +30,19 @@ FlightMap { allowGCSLocationCenter: !userPanned allowVehicleLocationCenter: !_keepVehicleCentered - property alias missionController: missionController + property var missionController + property var guidedActionsController property var flightWidgets property var rightPanelWidth property var qgcView ///< QGCView control which contains this map - property var _activeVehicle: QGroundControl.multiVehicleManager.activeVehicle - property var _activeVehicleCoordinate: _activeVehicle ? _activeVehicle.coordinate : QtPositioning.coordinate() - property var _gotoHereCoordinate: QtPositioning.coordinate() - property int _retaskSequence: 0 - property real _toolButtonTopMargin: parent.height - ScreenTools.availableHeight + (ScreenTools.defaultFontPixelHeight / 2) + property var _activeVehicle: QGroundControl.multiVehicleManager.activeVehicle + property var _activeVehicleCoordinate: _activeVehicle ? _activeVehicle.coordinate : QtPositioning.coordinate() + property var _gotoHereCoordinate: QtPositioning.coordinate() + property real _toolButtonTopMargin: parent.height - ScreenTools.availableHeight + (ScreenTools.defaultFontPixelHeight / 2) - property bool _disableVehicleTracking: false - property bool _keepVehicleCentered: _mainIsMap ? false : true + property bool _disableVehicleTracking: false + property bool _keepVehicleCentered: _mainIsMap ? false : true // Track last known map position and zoom from Fly view in settings @@ -124,13 +124,11 @@ FlightMap { QGCPalette { id: qgcPal; colorGroupEnabled: true } QGCMapPalette { id: mapPal; lightColors: isSatelliteMap } - MissionController { - id: missionController - - Component.onCompleted: start(false /* editMode */) + Connections { + target: missionController onNewItemsFromVehicle: { - var visualItem = missionController.visualItems + var visualItems = missionController.visualItems if (visualItems && visualItems.count != 1) { mapFitFunctions.fitMapViewportToMissionItems() firstVehiclePositionReceived = true @@ -195,50 +193,6 @@ FlightMap { id: _mapTypeButtonsExclusiveGroup } - ToolStrip { - id: toolStrip - anchors.leftMargin: ScreenTools.defaultFontPixelWidth - anchors.left: parent.left - anchors.topMargin: _toolButtonTopMargin - anchors.top: parent.top - color: qgcPal.window - title: qsTr("Fly") - z: QGroundControl.zOrderWidgets - buttonVisible: [ true, _showZoom, _showZoom ] - maxHeight: (_flightVideo.visible ? _flightVideo.y : parent.height) - toolStrip.y // Massive reach across hack - - property bool _showZoom: !ScreenTools.isMobile - - model: [ - { - name: "Center", - iconSource: "/qmlimages/MapCenter.svg", - dropPanelComponent: centerMapDropPanel - }, - { - name: "In", - iconSource: "/qmlimages/ZoomPlus.svg" - }, - { - name: "Out", - iconSource: "/qmlimages/ZoomMinus.svg" - } - ] - - onClicked: { - switch (index) { - case 1: - _flightMap.zoomLevel += 0.5 - break - case 2: - _flightMap.zoomLevel -= 0.5 - break - } - } - } - - // Toolstrip drop panel compomnents - MapFitFunctions { id: mapFitFunctions map: _flightMap @@ -250,15 +204,6 @@ FlightMap { property real leftToolWidth: toolStrip.x + toolStrip.width } - Component { - id: centerMapDropPanel - - CenterMapDropPanel { - map: _flightMap - fitFunctions: mapFitFunctions - } - } - // Add trajectory points to the map MapItemView { model: _mainIsMap ? _activeVehicle ? _activeVehicle.trajectoryPoints : 0 : 0 @@ -293,11 +238,7 @@ FlightMap { delegate: MissionItemMapVisual { map: flightMap - - onClicked: { - _retaskSequence = object.sequenceNumber - flightWidgets.guidedModeBar.confirmAction(parent.flightWidgets.guidedModeBar.confirmRetask) - } + onClicked: guidedActionsController.confirmAction(guidedActionsController.actionSetWaypoint, object.sequenceNumber) } } @@ -345,30 +286,24 @@ FlightMap { } } - MapScale { - anchors.bottomMargin: ScreenTools.defaultFontPixelHeight * (0.66) - anchors.rightMargin: ScreenTools.defaultFontPixelHeight * (0.33) - anchors.bottom: parent.bottom - anchors.right: parent.right - mapControl: flightMap - visible: !ScreenTools.isTinyScreen - } - // Handle guided mode clicks MouseArea { anchors.fill: parent onClicked: { - if (_activeVehicle) { - if (flightWidgets.guidedModeBar.state != "Shown") { - flightWidgets.guidedModeBar.state = "Shown" - } else { - if (flightWidgets.gotoEnabled) { - _gotoHereCoordinate = flightMap.toCoordinate(Qt.point(mouse.x, mouse.y), false /* clipToViewPort */) - flightWidgets.guidedModeBar.confirmAction(flightWidgets.guidedModeBar.confirmGoTo) - } - } + if (guidedActionsController.showGotoLocation) { + _gotoHereCoordinate = flightMap.toCoordinate(Qt.point(mouse.x, mouse.y), false /* clipToViewPort */) + guidedActionsController.confirmAction(guidedActionsController.actionGoto, _gotoHereCoordinate) } } } + + MapScale { + anchors.bottomMargin: ScreenTools.defaultFontPixelHeight * (0.66) + anchors.rightMargin: ScreenTools.defaultFontPixelHeight * (0.33) + anchors.bottom: parent.bottom + anchors.right: parent.right + mapControl: flightMap + visible: !ScreenTools.isTinyScreen + } } diff --git a/src/FlightDisplay/FlightDisplayViewWidgets.qml b/src/FlightDisplay/FlightDisplayViewWidgets.qml index 7d7776cd0b4e5e066b56c69ca79611be2edc229a..e9bd51db905acd2f252e3e264b53ccba6e6ed23a 100644 --- a/src/FlightDisplay/FlightDisplayViewWidgets.qml +++ b/src/FlightDisplay/FlightDisplayViewWidgets.qml @@ -25,8 +25,6 @@ import QGroundControl.FlightMap 1.0 Item { id: _root - property alias guidedModeBar: _guidedModeBar - property bool gotoEnabled: _activeVehicle && _activeVehicle.guidedMode && _activeVehicle.flying property var qgcView property bool useLightColors property var missionController @@ -35,16 +33,6 @@ Item { property bool _isSatellite: _mainIsMap ? (_flightMap ? _flightMap.isSatelliteMap : true) : true property bool _lightWidgetBorders: _isSatellite - // Guided bar properties - property bool _missionAvailable: missionController.containsItems - property bool _missionActive: _activeVehicle ? _activeVehicle.flightMode === _activeVehicle.missionFlightMode : false - property bool _vehiclePaused: _activeVehicle ? _activeVehicle.flightMode === _activeVehicle.pauseFlightMode : false - property bool _vehicleInRTLMode: _activeVehicle ? _activeVehicle.flightMode === _activeVehicle.rtlFlightMode : false - property bool _vehicleInLandMode: _activeVehicle ? _activeVehicle.flightMode === _activeVehicle.landFlightMode : false - property int _resumeMissionItem: missionController.resumeMissionItem - property bool _showEmergenyStop: QGroundControl.corePlugin.options.guidedBarShowEmergencyStop - property bool _showOrbit: QGroundControl.corePlugin.options.guidedBarShowOrbit - readonly property real _margins: ScreenTools.defaultFontPixelHeight * 0.5 QGCMapPalette { id: mapPal; lightColors: useLightColors } @@ -133,7 +121,7 @@ Item { Loader { id: instrumentsLoader anchors.margins: ScreenTools.defaultFontPixelHeight / 2 - anchors.right: altitudeSlider.visible ? altitudeSlider.left : parent.right + anchors.right: parent.right z: QGroundControl.zOrderWidgets property var qgcView: _root.qgcView property real maxHeight:parent.height - (anchors.margins * 2) @@ -167,405 +155,4 @@ Item { } ] } - - //-- Guided mode buttons - Rectangle { - id: _guidedModeBar - anchors.margins: _barMargin - anchors.bottom: parent.bottom - anchors.horizontalCenter: parent.horizontalCenter - width: (guidedModeButtons.visible ? guidedModeButtons.width : guidedModeConfirm.width) + (_margins * 2) - height: (guidedModeButtons.visible ? guidedModeButtons.height : guidedModeConfirm.height) + (_margins * 2) - radius: ScreenTools.defaultFontPixelHeight * 0.25 - color: _backgroundColor - visible: _activeVehicle - z: QGroundControl.zOrderWidgets - - property real _fontPointSize: ScreenTools.isMobile ? ScreenTools.largeFontPointSize : ScreenTools.defaultFontPointSize - property color _backgroundColor: _isSatellite ? qgcPal.mapWidgetBorderLight : qgcPal.mapWidgetBorderDark - property color _textColor: _isSatellite ? qgcPal.mapWidgetBorderDark : qgcPal.mapWidgetBorderLight - - property string _emergencyStopTitle: qsTr("Emergency Stop") - property string _armTitle: qsTr("Arm") - property string _disarmTitle: qsTr("Disarm") - property string _rtlTitle: qsTr("RTL") - property string _takeoffTitle: qsTr("Takeoff") - property string _landTitle: qsTr("Land") - property string _startMissionTitle: qsTr("Start Mission") - property string _resumeMissionTitle: qsTr("Resume Mission") - property string _pauseTitle: _missionActive ? qsTr("Pause Mission") : qsTr("Pause") - property string _changeAltTitle: qsTr("Change Altitude") - property string _orbitTitle: qsTr("Orbit") - property string _abortTitle: qsTr("Abort") - - - readonly property int confirmHome: 1 - readonly property int confirmLand: 2 - readonly property int confirmTakeoff: 3 - readonly property int confirmArm: 4 - readonly property int confirmDisarm: 5 - readonly property int confirmEmergencyStop: 6 - readonly property int confirmChangeAlt: 7 - readonly property int confirmGoTo: 8 - readonly property int confirmRetask: 9 - readonly property int confirmOrbit: 10 - readonly property int confirmAbort: 11 - readonly property int confirmStartMission: 12 - readonly property int confirmResumeMission: 13 - readonly property int confirmResumeMissionReady: 14 - - property int confirmActionCode - property real _showMargin: _margins - property real _hideMargin: _margins - _guidedModeBar.height - property real _barMargin: _showMargin - - function actionConfirmed() { - switch (confirmActionCode) { - case confirmHome: - _activeVehicle.guidedModeRTL() - break; - case confirmLand: - _activeVehicle.guidedModeLand() - break; - case confirmTakeoff: - _activeVehicle.guidedModeTakeoff() - break; - case confirmResumeMission: - missionController.resumeMission(missionController.resumeMissionItem) - break; - case confirmResumeMissionReady: - _activeVehicle.startMission() - break; - case confirmStartMission: - _activeVehicle.startMission() - break; - case confirmArm: - _activeVehicle.armed = true - break; - case confirmDisarm: - _activeVehicle.armed = false - break; - case confirmEmergencyStop: - _activeVehicle.emergencyStop() - break; - case confirmChangeAlt: - _activeVehicle.guidedModeChangeAltitude(altitudeSlider.getValue()) - break; - case confirmGoTo: - _activeVehicle.guidedModeGotoLocation(_flightMap._gotoHereCoordinate) - break; - case confirmRetask: - _activeVehicle.setCurrentMissionSequence(_flightMap._retaskSequence) - break; - case confirmOrbit: - //-- All parameters controlled by RC - _activeVehicle.guidedModeOrbit() - //-- Center on current flight map position and orbit with a 50m radius (velocity/direction controlled by the RC) - //_activeVehicle.guidedModeOrbit(QGroundControl.flightMapPosition, 50.0) - break; - case confirmAbort: - _activeVehicle.abortLanding(50) // hardcoded value for climbOutAltitude that is currently ignored - break; - default: - console.warn(qsTr("Internal error: unknown confirmActionCode"), confirmActionCode) - } - } - - function rejectGuidedModeConfirm() { - guidedModeButtons.visible = true - guidedModeConfirm.visible = false - altitudeSlider.visible = false - _flightMap._gotoHereCoordinate = QtPositioning.coordinate() - } - - function confirmAction(actionCode) { - confirmActionCode = actionCode - switch (confirmActionCode) { - case confirmArm: - guidedModeConfirm.title = _armTitle - guidedModeConfirm.message = qsTr("arm") - break; - case confirmDisarm: - guidedModeConfirm.title = _disarmTitle - guidedModeConfirm.message = qsTr("disarm") - break; - case confirmEmergencyStop: - guidedModeConfirm.title = _emergencyStopTitle - guidedModeConfirm.message = qsTr("WARNING: This still stop all motors. If vehicle is currently in air it will crash.") - break; - case confirmTakeoff: - guidedModeConfirm.title = _takeoffTitle - guidedModeConfirm.message = qsTr("Takeoff from ground and hold position.") - break; - case confirmStartMission: - guidedModeConfirm.title = _startMissionTitle - guidedModeConfirm.message = qsTr("Start the mission which is currently displayed above. If the vehicle is on the ground it will takeoff.") - break; - case confirmResumeMission: - guidedModeConfirm.title = _resumeMissionTitle - guidedModeConfirm.message = qsTr("Resume the mission which is displayed above. This will re-generate the mission from waypoint %1, takeoff and continue the mission.").arg(_resumeMissionItem) - break; - case confirmResumeMissionReady: - guidedModeConfirm.title = _resumeMissionTitle - guidedModeConfirm.message = qsTr("Review the modified mission above. Confirm if you want to takeoff and begin mission.") - break; - case confirmLand: - guidedModeConfirm.title = _landTitle - guidedModeConfirm.message = qsTr("Land the vehicle at the current position.") - break; - case confirmHome: - guidedModeConfirm.title = _rtlTitle - guidedModeConfirm.message = qsTr("Return to the home position of the vehicle.") - break; - case confirmChangeAlt: - altitudeSlider.visible = true - altitudeSlider.setValue(0) - guidedModeConfirm.title = _changeAltTitle - guidedModeConfirm.message = qsTr("Adjust the slider to the left up or down to change the altitude of the vehicle.") - break; - case confirmGoTo: - guidedModeConfirm.title = qsTr("Go To Location") - guidedModeConfirm.message = qsTr("Confirm to move to the new location.") - break; - case confirmRetask: - guidedModeConfirm.title = qsTr("Waypoint Change") - guidedModeConfirm.message = qsTr("Confirm to change current mission item to %1.").arg(_flightMap._retaskSequence) - break; - case confirmOrbit: - guidedModeConfirm.title = _orbitTitle - guidedModeConfirm.message = qsTr("Confirm to enter Orbit mode.") - break; - case confirmAbort: - guidedModeConfirm.title = _abortTitle - guidedModeConfirm.message = qsTr("Confirm to abort the current landing.") - break; - } - guidedModeButtons.visible = false - guidedModeConfirm.visible = true - } - - ColumnLayout { - id: guidedModeButtons - anchors.margins: _margins - anchors.top: parent.top - anchors.left: parent.left - spacing: _margins - - QGCLabel { - anchors.horizontalCenter: parent.horizontalCenter - color: _guidedModeBar._textColor - text: qsTr("Click in map to move vehicle") - visible: gotoEnabled - } - - Row { - spacing: _margins * 2 - - QGCButton { - pointSize: _guidedModeBar._fontPointSize - text: _guidedModeBar._emergencyStopTitle - visible: _showEmergenyStop && _activeVehicle && _activeVehicle.armed && _activeVehicle.flying - onClicked: _guidedModeBar.confirmAction(_guidedModeBar.confirmEmergencyStop) - } - - QGCButton { - pointSize: _guidedModeBar._fontPointSize - text: _guidedModeBar._disarmTitle - visible: _activeVehicle && _activeVehicle.armed && !_activeVehicle.flying - onClicked: _guidedModeBar.confirmAction(_guidedModeBar.confirmDisarm) - } - - QGCButton { - pointSize: _guidedModeBar._fontPointSize - text: _guidedModeBar._rtlTitle - visible: _activeVehicle && _activeVehicle.armed && _activeVehicle.guidedModeSupported && _activeVehicle.flying && !_vehicleInRTLMode - onClicked: _guidedModeBar.confirmAction(_guidedModeBar.confirmHome) - } - - QGCButton { - pointSize: _guidedModeBar._fontPointSize - text: _guidedModeBar._takeoffTitle - visible: _activeVehicle && _activeVehicle.guidedModeSupported && !_activeVehicle.flying && !_activeVehicle.fixedWing - onClicked: _guidedModeBar.confirmAction(_guidedModeBar.confirmTakeoff) - } - - QGCButton { - pointSize: _guidedModeBar._fontPointSize - text: _guidedModeBar._landTitle - visible: _activeVehicle && _activeVehicle.guidedModeSupported && _activeVehicle.armed && !_activeVehicle.fixedWing && !_vehicleInLandMode - onClicked: _guidedModeBar.confirmAction(_guidedModeBar.confirmLand) - } - - QGCButton { - pointSize: _guidedModeBar._fontPointSize - text: _guidedModeBar._startMissionTitle - visible: _activeVehicle && _missionAvailable && !_missionActive - onClicked: _guidedModeBar.confirmAction(_guidedModeBar.confirmStartMission) - } - - QGCButton { - pointSize: _guidedModeBar._fontPointSize - text: _guidedModeBar._resumeMissionTitle - visible: _activeVehicle && !_activeVehicle.flying && _missionAvailable && _resumeMissionItem !== -1 - onClicked: _guidedModeBar.confirmAction(_guidedModeBar.confirmResumeMission) - } - - QGCButton { - pointSize: _guidedModeBar._fontPointSize - text: _guidedModeBar._pauseTitle - visible: _activeVehicle && _activeVehicle.armed && _activeVehicle.pauseVehicleSupported && _activeVehicle.flying && !_vehiclePaused - onClicked: _activeVehicle.pauseVehicle() - } - - QGCButton { - pointSize: _guidedModeBar._fontPointSize - text: _guidedModeBar._changeAltTitle - visible: (_activeVehicle && _activeVehicle.flying) && _activeVehicle.guidedModeSupported && _activeVehicle.armed && !_missionActive - onClicked: _guidedModeBar.confirmAction(_guidedModeBar.confirmChangeAlt) - } - - QGCButton { - pointSize: _guidedModeBar._fontPointSize - text: _guidedModeBar._orbitTitle - visible: _showOrbit && _activeVehicle && _activeVehicle.flying && _activeVehicle.orbitModeSupported && _activeVehicle.armed && !_missionActive - onClicked: _guidedModeBar.confirmAction(_guidedModeBar.confirmOrbit) - } - - QGCButton { - pointSize: _guidedModeBar._fontPointSize - text: _guidedModeBar._abortTitle - visible: _activeVehicle && _activeVehicle.flying && _activeVehicle.fixedWing - onClicked: _guidedModeBar.confirmAction(_guidedModeBar.confirmAbort) - } - } - } - - Column { - id: guidedModeConfirm - anchors.margins: _margins - anchors.top: parent.top - anchors.left: parent.left - spacing: _margins - visible: false - - property alias title: titleText.text - property alias message: messageText.text - - QGCLabel { - id: titleText - anchors.left: slider.left - anchors.right: slider.right - color: _guidedModeBar._textColor - horizontalAlignment: Text.AlignHCenter - } - - QGCLabel { - id: messageText - anchors.left: slider.left - anchors.right: slider.right - color: _guidedModeBar._textColor - horizontalAlignment: Text.AlignHCenter - wrapMode: Text.WordWrap - } - - // Action confirmation control - SliderSwitch { - id: slider - fontPointSize: _guidedModeBar._fontPointSize - confirmText: qsTr("Slide to confirm") - width: Math.max(implicitWidth, ScreenTools.defaultFontPixelWidth * 30) - - onAccept: { - guidedModeButtons.visible = true - guidedModeConfirm.visible = false - altitudeSlider.visible = false - _guidedModeBar.actionConfirmed() - } - - onReject: _guidedModeBar.rejectGuidedModeConfirm() - } - } - - QGCColoredImage { - anchors.margins: _margins - anchors.top: _guidedModeBar.top - anchors.right: _guidedModeBar.right - width: ScreenTools.defaultFontPixelHeight - height: width - sourceSize.height: width - source: "/res/XDelete.svg" - fillMode: Image.PreserveAspectFit - color: qgcPal.alertText - visible: guidedModeConfirm.visible - - QGCMouseArea { - fillItem: parent - onClicked: _guidedModeBar.rejectGuidedModeConfirm() - } - } - - } // Rectangle - Guided mode buttons - - //-- Altitude slider - Rectangle { - id: altitudeSlider - anchors.margins: _margins - anchors.right: parent.right - anchors.top: parent.top - anchors.bottom: parent.bottom - radius: ScreenTools.defaultFontPixelWidth / 2 - width: ScreenTools.defaultFontPixelWidth * 10 - color: qgcPal.window - visible: false - - function setValue(value) { - altSlider.value = value - } - - function getValue() { - return altSlider.value - } - - Column { - id: headerColumn - anchors.margins: _margins - anchors.top: parent.top - anchors.left: parent.left - anchors.right: parent.right - - QGCLabel { - anchors.horizontalCenter: parent.horizontalCenter - text: altSlider.value >=0 ? qsTr("Up") : qsTr("Down") - } - - QGCLabel { - id: altField - anchors.horizontalCenter: parent.horizontalCenter - text: Math.abs(altSlider.value.toFixed(1)) + " " + QGroundControl.appSettingsDistanceUnitsString - } - } - - QGCSlider { - id: altSlider - anchors.margins: _margins - anchors.top: headerColumn.bottom - anchors.bottom: parent.bottom - anchors.left: parent.left - anchors.right: parent.right - orientation: Qt.Vertical - //minimumValue: QGroundControl.metersToAppSettingsDistanceUnits(0) - //maximumValue: QGroundControl.metersToAppSettingsDistanceUnits((_activeVehicle && _activeVehicle.flying) ? Math.round((_activeVehicle.altitudeRelative.value + 100) / 100) * 100 : 10) - minimumValue: QGroundControl.metersToAppSettingsDistanceUnits(-10) - maximumValue: QGroundControl.metersToAppSettingsDistanceUnits(10) - indicatorCentered: true - rotation: 180 - - // We want slide up to be positive values - transform: Rotation { - origin.x: altSlider.width / 2 - origin.y: altSlider.height / 2 - angle: 180 - } - } - } } diff --git a/src/FlightDisplay/GuidedActionsController.qml b/src/FlightDisplay/GuidedActionsController.qml new file mode 100644 index 0000000000000000000000000000000000000000..ce73f713c6456a171891eb785b99442d2563fa07 --- /dev/null +++ b/src/FlightDisplay/GuidedActionsController.qml @@ -0,0 +1,228 @@ +/**************************************************************************** + * + * (c) 2009-2016 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.3 +import QtQuick.Controls 1.2 +import QtQuick.Controls.Styles 1.4 +import QtQuick.Dialogs 1.2 +import QtLocation 5.3 +import QtPositioning 5.3 +import QtQuick.Layouts 1.2 + +import QGroundControl 1.0 +import QGroundControl.ScreenTools 1.0 +import QGroundControl.Controls 1.0 +import QGroundControl.Palette 1.0 +import QGroundControl.Vehicle 1.0 +import QGroundControl.FlightMap 1.0 + +/// This provides the smarts behind the guided mode commands, minus the user interface. This way you can change UI +/// without affecting the underlying functionality. +Item { + id: _root + + property var missionController + + signal showConfirmAction(string title, string message, int action, var actionData) + + readonly property string emergencyStopTitle: qsTr("Emergency Stop") + readonly property string armTitle: qsTr("Arm") + readonly property string disarmTitle: qsTr("Disarm") + readonly property string rtlTitle: qsTr("RTL") + readonly property string takeoffTitle: qsTr("Takeoff") + readonly property string landTitle: qsTr("Land") + readonly property string startMissionTitle: qsTr("Start Mission") + readonly property string resumeMissionTitle: qsTr("Resume Mission") + readonly property string pauseTitle: qsTr("Pause") + readonly property string changeAltTitle: qsTr("Change Altitude") + readonly property string orbitTitle: qsTr("Orbit") + readonly property string landAbortTitle: qsTr("Land Abort") + readonly property string setWaypointTitle: qsTr("Set Waypoint") + readonly property string gotoTitle: qsTr("Goto Location") + + readonly property string armMessage: qsTr("arm") + readonly property string disarmMessage: qsTr("disarm") + readonly property string emergencyStopMessage: qsTr("WARNING: This still stop all motors. If vehicle is currently in air it will crash.") + readonly property string takeoffMessage: qsTr("Takeoff from ground and hold position.") + readonly property string startMissionMessage: qsTr("Start the mission which is currently displayed above. If the vehicle is on the ground it will takeoff.") + property string resumeMissionMessage: qsTr("Resume the mission which is displayed above. This will re-generate the mission from waypoint %1, takeoff and continue the mission.").arg(_resumeMissionItem) + readonly property string resumeMissionReadyMessage: qsTr("Review the modified mission above. Confirm if you want to takeoff and begin mission.") + readonly property string landMessage: qsTr("Land the vehicle at the current position.") + readonly property string rtlMessage: qsTr("Return to the home position of the vehicle.") + readonly property string changeAltMessage: qsTr("Change the altitude of the vehicle up or down.") + readonly property string gotoMessage: qsTr("Move the vehicle to the location clicked on the map.") + property string setWaypointMessage: qsTr("Adjust current waypoint to %1.").arg(_actionData) + readonly property string orbitMessage: qsTr("Orbit the vehicle around the current location.") + readonly property string landAbortMessage: qsTr("Abort the landing sequence.") + readonly property string pauseMessage: qsTr("Pause the vehicle at it's current position.") + + readonly property int actionRTL: 1 + readonly property int actionLand: 2 + readonly property int actionTakeoff: 3 + readonly property int actionArm: 4 + readonly property int actionDisarm: 5 + readonly property int actionEmergencyStop: 6 + readonly property int actionChangeAlt: 7 + readonly property int actionGoto: 8 + readonly property int actionSetWaypoint: 9 + readonly property int actionOrbit: 10 + readonly property int actionLandAbort: 11 + readonly property int actionStartMission: 12 + readonly property int actionResumeMission: 13 + readonly property int actionResumeMissionReady: 14 + readonly property int actionPause: 15 + + property bool showEmergenyStop: !_hideEmergenyStop && _activeVehicle && _activeVehicle.armed && _activeVehicle.flying + property bool showDisarm: _activeVehicle && _activeVehicle.armed && !_activeVehicle.flying + property bool showRTL: _activeVehicle && _activeVehicle.armed && _activeVehicle.guidedModeSupported && _activeVehicle.flying && !_vehicleInRTLMode + property bool showTakeoff: _activeVehicle && _activeVehicle.guidedModeSupported && !_activeVehicle.flying && !_activeVehicle.fixedWing + property bool showLand: _activeVehicle && _activeVehicle.guidedModeSupported && _activeVehicle.armed && !_activeVehicle.fixedWing && !_vehicleInLandMode + property bool showStartMission: _activeVehicle && _missionAvailable && !_missionActive + property bool showResumeMission: _activeVehicle && !_activeVehicle.flying && _missionAvailable && _resumeMissionItem > 1 + property bool showPause: _activeVehicle && _activeVehicle.armed && _activeVehicle.pauseVehicleSupported && _activeVehicle.flying && !_vehiclePaused + property bool showChangeAlt: (_activeVehicle && _activeVehicle.flying) && _activeVehicle.guidedModeSupported && _activeVehicle.armed && !_missionActive + property bool showOrbit: !_hideOrbit && _activeVehicle && _activeVehicle.flying && _activeVehicle.orbitModeSupported && _activeVehicle.armed && !_missionActive + property bool showLandAbort: _activeVehicle && _activeVehicle.flying && _activeVehicle.fixedWing + property bool showGotoLocation: _activeVehicle && _activeVehicle.guidedMode && _activeVehicle.flying + + property var _activeVehicle: QGroundControl.multiVehicleManager.activeVehicle + property bool _missionAvailable: missionController.containsItems + property bool _missionActive: _activeVehicle ? _activeVehicle.flightMode === _activeVehicle.missionFlightMode : false + property bool _vehiclePaused: _activeVehicle ? _activeVehicle.flightMode === _activeVehicle.pauseFlightMode : false + property bool _vehicleInRTLMode: _activeVehicle ? _activeVehicle.flightMode === _activeVehicle.rtlFlightMode : false + property bool _vehicleInLandMode: _activeVehicle ? _activeVehicle.flightMode === _activeVehicle.landFlightMode : false + property int _resumeMissionItem: missionController.resumeMissionItem + property bool _hideEmergenyStop: !QGroundControl.corePlugin.options.guidedBarShowEmergencyStop + property bool _hideOrbit: !QGroundControl.corePlugin.options.guidedBarShowOrbit + property var _actionData + + // Called when an action is about to be executed in order to confirm + function confirmAction(actionCode, actionData) { + var title + var message + _actionData = actionData + switch (actionCode) { + case actionArm: + title = armTitle + message = armMessage + break; + case actionDisarm: + title = disarmTitle + message = disarmMessage + break; + case actionEmergencyStop: + title = emergencyStopTitle + message = emergencyStopMessage + break; + case actionTakeoff: + title = takeoffTitle + message = takeoffMessage + break; + case actionStartMission: + title = startMissionTitle + message = startMissionMessage + break; + case actionResumeMission: + title = resumeMissionTitle + message = resumeMissionMessage + break; + case actionResumeMissionReady: + title = resumeMissionTitle + message = resumeMissionReadyMessage + break; + case actionLand: + title = landTitle + message = landMessage + break; + case actionRTL: + title = rtlTitle + message = rtlMessage + break; + case actionChangeAlt: + title = changeAltTitle + message = changeAltMessage + break; + case actionGoto: + title = gotoTitle + message = gotoMessage + break; + case actionSetWaypoint: + title = setWaypointTitle + message = setWaypointMessage + break; + case actionOrbit: + title = orbitTitle + message = orbitMessage + break; + case actionLandAbort: + title = landAbortTitle + message = landAbortMessage + break; + case actionPause: + title = pauseTitle + message = pauseMessage + break; + } + showConfirmAction(title, message, actionCode, actionData) + } + + // Executes the specified action + function executeAction(actionCode, actionData) { + switch (actionCode) { + case actionRTL: + _activeVehicle.guidedModeRTL() + break + case actionLand: + _activeVehicle.guidedModeLand() + break + case actionTakeoff: + _activeVehicle.guidedModeTakeoff() + break + case actionResumeMission: + missionController.resumeMission(missionController.resumeMissionItem) + break + case actionResumeMissionReady: + _activeVehicle.startMission() + break + case actionStartMission: + _activeVehicle.startMission() + break + case actionArm: + _activeVehicle.armed = true + break + case actionDisarm: + _activeVehicle.armed = false + break + case actionEmergencyStop: + _activeVehicle.emergencyStop() + break + case actionChangeAlt: + _activeVehicle.guidedModeChangeAltitude(actionData) + break + case actionGoto: + _activeVehicle.guidedModeGotoLocation(actionData) + break + case actionSetWaypoint: + _activeVehicle.setCurrentMissionSequence(actionData) + break + case actionOrbit: + _activeVehicle.guidedModeOrbit() + break + case actionLandAbort: + _activeVehicle.abortLanding(50) // hardcoded value for climbOutAltitude that is currently ignored + break + case actionPause: + _activeVehicle.pauseVehicle() + break + default: + console.warn(qsTr("Internal error: unknown actionCode"), actionCode) + break + } + } +} diff --git a/src/FlightDisplay/qmldir b/src/FlightDisplay/qmldir index bdcc8b713ff35bf132244fbcdb4e358a00f38d3f..ebe28ee788b8683b7569a561ecefd6af0b32ca5a 100644 --- a/src/FlightDisplay/qmldir +++ b/src/FlightDisplay/qmldir @@ -4,5 +4,6 @@ FlightDisplayView 1.0 FlightDisplayView.qml FlightDisplayViewMap 1.0 FlightDisplayViewMap.qml FlightDisplayViewVideo 1.0 FlightDisplayViewVideo.qml FlightDisplayViewWidgets 1.0 FlightDisplayViewWidgets.qml +GuidedCommands 1.0 GuidedCommands.qml MultiVehicleList 1.0 MultiVehicleList.qml diff --git a/src/MissionManager/MissionSettingsItem.cc b/src/MissionManager/MissionSettingsItem.cc index cd94d22751c6d531ced6321d6e4eeffecb5b08eb..4fcc9d8513efe25184e4be72db6fc36faae5e2fe 100644 --- a/src/MissionManager/MissionSettingsItem.cc +++ b/src/MissionManager/MissionSettingsItem.cc @@ -364,9 +364,6 @@ void MissionSettingsItem::_setDirty(void) void MissionSettingsItem::setCoordinate(const QGeoCoordinate& coordinate) { - if (coordinate.isValid()) { - qDebug() << "MissionSettingsItem::setCoordinate" << coordinate.isValid(); - } if (_plannedHomePositionCoordinate != coordinate) { _plannedHomePositionCoordinate = coordinate; emit coordinateChanged(coordinate); diff --git a/src/QmlControls/SliderSwitch.qml b/src/QmlControls/SliderSwitch.qml index 64857239535a21c247dd964964a9ddcc5d13b6e6..101f6dd1dd6b44a77ea030b2ad7cbb02249a26b3 100644 --- a/src/QmlControls/SliderSwitch.qml +++ b/src/QmlControls/SliderSwitch.qml @@ -11,7 +11,7 @@ Rectangle { implicitWidth: label.contentWidth + (_diameter * 2.5) + (_border * 4) implicitHeight: Math.max(ScreenTools.isMobile ? ScreenTools.minTouchPixels : 0, label.height * 2.5) radius: height /2 - color: qgcPal.window + color: qgcPal.text signal accept ///< Action confirmed signal reject ///< Action rejected @@ -29,6 +29,7 @@ Rectangle { anchors.horizontalCenter: parent.horizontalCenter anchors.verticalCenter: parent.verticalCenter text: confirmText + color: qgcPal.window } Rectangle { diff --git a/src/QmlControls/ToolStrip.qml b/src/QmlControls/ToolStrip.qml index 840cb2c83e931814fa50d42fdafb61d6b3802315..5dc99c94656183cf6d55f990e7cbe5ba6b09a7a4 100644 --- a/src/QmlControls/ToolStrip.qml +++ b/src/QmlControls/ToolStrip.qml @@ -120,7 +120,10 @@ Rectangle { property bool checked: false property ExclusiveGroup exclusiveGroup: dropButtonsExclusiveGroup - property var _iconSource: modelData.iconSource + QGCPalette { id: _repeaterPal; colorGroupEnabled: _buttonEnabled } + + property bool _buttonEnabled: _root.buttonEnabled ? _root.buttonEnabled[index] : true + property var _iconSource: modelData.iconSource property var _alternateIconSource: modelData.alternateIconSource property var _source: (_root.showAlternateIcon && _root.showAlternateIcon[index]) ? _alternateIconSource : _iconSource property bool rotateImage: _root.rotateImage ? _root.rotateImage[index] : false @@ -160,7 +163,7 @@ Rectangle { anchors.left: parent.left anchors.right: parent.right height: width - color: checked ? qgcPal.buttonHighlight : qgcPal.button + color: checked ? _repeaterPal.buttonHighlight : _repeaterPal.button QGCColoredImage { id: button @@ -170,7 +173,7 @@ Rectangle { fillMode: Image.PreserveAspectFit mipmap: true smooth: true - color: checked ? qgcPal.buttonHighlightText : qgcPal.buttonText + color: checked ? _repeaterPal.buttonHighlightText : _repeaterPal.buttonText RotationAnimation on rotation { id: imageRotation @@ -199,7 +202,7 @@ Rectangle { anchors.right: parent.right anchors.top: parent.top height: parent.height + (_showOptionalElements? buttonLabel.height + buttonColumn.spacing : 0) - visible: _root.buttonEnabled ? _root.buttonEnabled[index] : true + visible: _buttonEnabled preventStealing: true onClicked: { @@ -233,6 +236,7 @@ Rectangle { font.pointSize: ScreenTools.smallFontPointSize text: modelData.name visible: _showOptionalElements + enabled: _buttonEnabled } } } diff --git a/src/Vehicle/Vehicle.cc b/src/Vehicle/Vehicle.cc index d973c07332c94fa2be993efc781e17da92c9e449..b89cdb5704da2d2f4a62c6156591d4b1bf64ca00 100644 --- a/src/Vehicle/Vehicle.cc +++ b/src/Vehicle/Vehicle.cc @@ -1433,7 +1433,6 @@ void Vehicle::setActive(bool active) QGeoCoordinate Vehicle::homePosition(void) { - qDebug() << "Vehicle::homePosition" << _homePosition.isValid(); return _homePosition; }