From 429cf82d0419b178b4e7bc50b058b4af84fdf8a1 Mon Sep 17 00:00:00 2001 From: Stefan Dunca Date: Tue, 31 Mar 2020 18:05:10 +0200 Subject: [PATCH] Show mission items in Geofence and Rally Point edit mode Propagate opacity and interactive properties to mission items Set opacity to 0.5 for items that are not part of the current edit view --- src/FlightMap/MapItems/MissionItemIndicator.qml | 1 + src/FlightMap/MapItems/MissionItemIndicatorDrag.qml | 1 + src/MissionManager/QGCMapPolygonVisuals.qml | 8 ++++---- src/MissionManager/QGCMapPolylineVisuals.qml | 10 +++++++++- src/PlanView/CorridorScanMapVisual.qml | 3 ++- src/PlanView/FWLandingPatternMapVisual.qml | 4 ++++ src/PlanView/GeoFenceMapVisuals.qml | 9 ++++++--- src/PlanView/MissionItemMapVisual.qml | 3 ++- src/PlanView/PlanView.qml | 18 ++++++++++++------ src/PlanView/RallyPointMapVisuals.qml | 4 +++- src/PlanView/SimpleItemMapVisual.qml | 5 ++++- src/PlanView/StructureScanMapVisual.qml | 10 ++++++---- src/PlanView/TakeoffItemMapVisual.qml | 10 +++++++--- src/PlanView/TransectStyleMapVisuals.qml | 18 ++++++++++++++---- 14 files changed, 75 insertions(+), 29 deletions(-) diff --git a/src/FlightMap/MapItems/MissionItemIndicator.qml b/src/FlightMap/MapItems/MissionItemIndicator.qml index 7fd42ef..ac494f7 100644 --- a/src/FlightMap/MapItems/MissionItemIndicator.qml +++ b/src/FlightMap/MapItems/MissionItemIndicator.qml @@ -38,6 +38,7 @@ MapQuickItem { showGimbalYaw: !isNaN(missionItem.missionGimbalYaw) highlightSelected: true onClicked: _item.clicked() + opacity: _item.opacity property bool _isCurrentItem: missionItem ? missionItem.isCurrentItem || missionItem.hasCurrentChildItem : false } diff --git a/src/FlightMap/MapItems/MissionItemIndicatorDrag.qml b/src/FlightMap/MapItems/MissionItemIndicatorDrag.qml index f2ebe64..8bac02a 100644 --- a/src/FlightMap/MapItems/MissionItemIndicatorDrag.qml +++ b/src/FlightMap/MapItems/MissionItemIndicatorDrag.qml @@ -71,6 +71,7 @@ Rectangle { drag.maximumX: itemDragger.parent.width - parent.width drag.maximumY: itemDragger.parent.height - parent.height preventStealing: true + enabled: itemDragger.visible onClicked: { focus = true diff --git a/src/MissionManager/QGCMapPolygonVisuals.qml b/src/MissionManager/QGCMapPolygonVisuals.qml index 96a1d80..1e7a608 100644 --- a/src/MissionManager/QGCMapPolygonVisuals.qml +++ b/src/MissionManager/QGCMapPolygonVisuals.qml @@ -303,7 +303,7 @@ Item { sourceItem: SplitIndicator { z: _zorderSplitHandle - onClicked: mapPolygon.splitPolygonSegment(mapQuickItem.vertexIndex) + onClicked: if(_root.interactive) mapPolygon.splitPolygonSegment(mapQuickItem.vertexIndex) } } } @@ -368,7 +368,7 @@ Item { } } - onClicked: menu.popupVertex(polygonVertex) + onClicked: if(_root.interactive) menu.popupVertex(polygonVertex) } } @@ -577,7 +577,7 @@ Item { z: QGroundControl.zOrderMapItems + 1 // Over item indicators onClicked: { - if (mouse.button === Qt.LeftButton) { + if (mouse.button === Qt.LeftButton && _root.interactive) { mapPolygon.appendVertex(mapControl.toCoordinate(Qt.point(mouse.x, mouse.y), false /* clipToViewPort */)) } } @@ -599,7 +599,7 @@ Item { height: width radius: width / 2 color: "white" - opacity: .90 + opacity: interiorOpacity * .90 } } } diff --git a/src/MissionManager/QGCMapPolylineVisuals.qml b/src/MissionManager/QGCMapPolylineVisuals.qml index ad1d56f..2a864ee 100644 --- a/src/MissionManager/QGCMapPolylineVisuals.qml +++ b/src/MissionManager/QGCMapPolylineVisuals.qml @@ -175,6 +175,7 @@ Item { line.color: lineColor path: mapPolyline.path visible: _root.visible + opacity: _root.opacity } } @@ -186,6 +187,7 @@ Item { anchorPoint.x: sourceItem.width / 2 anchorPoint.y: sourceItem.height / 2 z: _zorderSplitHandle + opacity: _root.opacity property int vertexIndex @@ -205,6 +207,8 @@ Item { property var _splitHandle property var _vertices: mapPolyline.path + opacity: _root.opacity + function _setHandlePosition() { var nextIndex = index + 1 var distance = _vertices[index].distanceTo(_vertices[nextIndex]) @@ -238,6 +242,7 @@ Item { mapControl: _root.mapControl id: dragArea z: _zorderDragHandle + opacity: _root.opacity property int polylineVertex @@ -267,6 +272,7 @@ Item { anchorPoint.x: dragHandle.width / 2 anchorPoint.y: dragHandle.height / 2 z: _zorderDragHandle + opacity: _root.opacity property int polylineVertex @@ -292,6 +298,8 @@ Item { delegate: Item { property var _visuals: [ ] + opacity: _root.opacity + Component.onCompleted: { var dragHandle = dragHandleComponent.createObject(mapControl) dragHandle.coordinate = Qt.binding(function() { return object.coordinate }) @@ -366,7 +374,7 @@ Item { z: QGroundControl.zOrderMapItems + 1 // Over item indicators onClicked: { - if (mouse.button === Qt.LeftButton) { + if (mouse.button === Qt.LeftButton && _root.interactive) { mapPolyline.appendVertex(mapControl.toCoordinate(Qt.point(mouse.x, mouse.y), false /* clipToViewPort */)) } } diff --git a/src/PlanView/CorridorScanMapVisual.qml b/src/PlanView/CorridorScanMapVisual.qml index ca47b56..5104da6 100644 --- a/src/PlanView/CorridorScanMapVisual.qml +++ b/src/PlanView/CorridorScanMapVisual.qml @@ -25,9 +25,10 @@ TransectStyleMapVisuals { id: mapPolylineVisuals mapControl: map mapPolyline: object.corridorPolyline - interactive: _currentItem + interactive: _currentItem && parent.interactive lineWidth: 3 lineColor: "#be781c" visible: _currentItem + opacity: parent.opacity } } diff --git a/src/PlanView/FWLandingPatternMapVisual.qml b/src/PlanView/FWLandingPatternMapVisual.qml index 277c2ee..5ed2605 100644 --- a/src/PlanView/FWLandingPatternMapVisual.qml +++ b/src/PlanView/FWLandingPatternMapVisual.qml @@ -24,6 +24,7 @@ Item { id: _root property var map ///< Map control to place item in + property bool interactive: true signal clicked(int sequenceNumber) @@ -178,6 +179,7 @@ Item { MouseArea { anchors.fill: map z: QGroundControl.zOrderMapItems + 1 // Over item indicators + visible: _root.interactive readonly property int _decimalPlaces: 8 @@ -199,6 +201,7 @@ Item { mapControl: _root.map itemIndicator: _loiterPointObject itemCoordinate: _missionItem.loiterCoordinate + visible: _root.interactive property bool _preventReentrancy: false @@ -224,6 +227,7 @@ Item { mapControl: _root.map itemIndicator: _landingPointObject itemCoordinate: _missionItem.landingCoordinate + visible: _root.interactive onItemCoordinateChanged: _missionItem.moveLandingPosition(itemCoordinate) } diff --git a/src/PlanView/GeoFenceMapVisuals.qml b/src/PlanView/GeoFenceMapVisuals.qml index cfd868a..4b2e53b 100644 --- a/src/PlanView/GeoFenceMapVisuals.qml +++ b/src/PlanView/GeoFenceMapVisuals.qml @@ -39,8 +39,8 @@ Item { property int _borderWidthExclusion: 0 property color _interiorColorExclusion: "orange" property color _interiorColorInclusion: "transparent" - property real _interiorOpacityExclusion: 0.2 - property real _interiorOpacityInclusion: 1 + property real _interiorOpacityExclusion: 0.2 * opacity + property real _interiorOpacityInclusion: 1 * opacity function addPolygon(inclusionPolygon) { // Initial polygon is inset to take 2/3rds space @@ -104,6 +104,7 @@ Item { borderColor: _borderColor interiorColor: object.inclusion ? _interiorColorInclusion : _interiorColorExclusion interiorOpacity: object.inclusion ? _interiorOpacityInclusion : _interiorOpacityExclusion + interactive: _root.interactive && mapPolygon && mapPolygon.interactive } } @@ -118,6 +119,7 @@ Item { borderColor: _borderColor interiorColor: object.inclusion ? _interiorColorInclusion : _interiorColorExclusion interiorOpacity: object.inclusion ? _interiorOpacityInclusion : _interiorOpacityExclusion + interactive: _root.interactive && mapCircle && mapCircle.interactive } } @@ -146,7 +148,7 @@ Item { MissionItemIndicatorDrag { mapControl: map itemCoordinate: myGeoFenceController.breachReturnPoint - //visible: itemCoordinate.isValid + visible: _root.interactive onItemCoordinateChanged: myGeoFenceController.breachReturnPoint = itemCoordinate } @@ -162,6 +164,7 @@ Item { anchorPoint.y: sourceItem.anchorPointY z: QGroundControl.zOrderMapItems coordinate: myGeoFenceController.breachReturnPoint + opacity: _root.opacity sourceItem: MissionItemIndexLabel { label: qsTr("B", "Breach Return Point item indicator") diff --git a/src/PlanView/MissionItemMapVisual.qml b/src/PlanView/MissionItemMapVisual.qml index 07c19bf..bb1414a 100644 --- a/src/PlanView/MissionItemMapVisual.qml +++ b/src/PlanView/MissionItemMapVisual.qml @@ -23,6 +23,7 @@ Item { property var map ///< Map control to place item in property var vehicle ///< Vehicle associated with this item + property var interactive: true ///< Vehicle associated with this item signal clicked(int sequenceNumber) @@ -34,7 +35,7 @@ Item { if (component.status === Component.Error) { console.log("Error loading Qml: ", object.mapVisualQML, component.errorString()) } - _visualItem = component.createObject(map, { "map": _root.map, vehicle: _root.vehicle }) + _visualItem = component.createObject(map, { "map": _root.map, vehicle: _root.vehicle, 'opacity': Qt.binding(function() { return _root.opacity }), 'interactive': Qt.binding(function() { return _root.interactive }) }) _visualItem.clicked.connect(_root.clicked) } } diff --git a/src/PlanView/PlanView.qml b/src/PlanView/PlanView.qml index eb92026..8d213ae 100644 --- a/src/PlanView/PlanView.qml +++ b/src/PlanView/PlanView.qml @@ -390,6 +390,7 @@ Item { property real _leftToolWidth: toolStrip.x + toolStrip.width property real _rightToolWidth: rightPanel.width + rightPanel.anchors.rightMargin + property real _nonInteractiveOpacity: 0.5 // Initial map position duplicates Fly view position Component.onCompleted: editorMap.center = QGroundControl.flightMapPosition @@ -436,18 +437,20 @@ Item { // Add the mission item visuals to the map Repeater { - model: _editingLayer == _layerMission ? _missionController.visualItems : undefined + model: _missionController.visualItems delegate: MissionItemMapVisual { map: editorMap onClicked: _missionController.setCurrentPlanViewSeqNum(sequenceNumber, false) - visible: _editingLayer == _layerMission + opacity: _editingLayer == _layerMission ? 1 : editorMap._nonInteractiveOpacity + interactive: _editingLayer == _layerMission } } // Add lines between waypoints MissionLineView { showSpecialVisual: _missionController.isROIBeginCurrentItem - model: _editingLayer == _layerMission ? _missionController.waypointLines : undefined + model: _missionController.waypointLines + opacity: _editingLayer == _layerMission ? 1 : editorMap._nonInteractiveOpacity } // Direction arrows in waypoint lines @@ -464,13 +467,14 @@ Item { // Incomplete segment lines MapItemView { - model: _editingLayer == _layerMission ? _missionController.incompleteComplexItemLines : undefined + model: _missionController.incompleteComplexItemLines delegate: MapPolyline { path: [ object.coordinate1, object.coordinate2 ] line.width: 1 line.color: "red" z: QGroundControl.zOrderWaypointLines + opacity: _editingLayer == _layerMission ? 1 : editorMap._nonInteractiveOpacity } } @@ -513,8 +517,7 @@ Item { // Add the vehicles to the map MapItemView { model: QGroundControl.multiVehicleManager.vehicles - delegate: - VehicleMapItem { + delegate: VehicleMapItem { vehicle: object coordinate: object.coordinate map: editorMap @@ -529,6 +532,7 @@ Item { interactive: _editingLayer == _layerGeoFence homePosition: _missionController.plannedHomePosition planView: true + opacity: _editingLayer != _layerGeoFence ? editorMap._nonInteractiveOpacity : 1 } RallyPointMapVisuals { @@ -536,6 +540,7 @@ Item { myRallyPointController: _rallyPointController interactive: _editingLayer == _layerRallyPoints planView: true + opacity: _editingLayer != _layerRallyPoints ? editorMap._nonInteractiveOpacity : 1 } // Airspace overlap support @@ -851,6 +856,7 @@ Item { flightMap: editorMap visible: _editingLayer == _layerGeoFence } + // Rally Point Editor RallyPointEditorHeader { id: rallyPointHeader diff --git a/src/PlanView/RallyPointMapVisuals.qml b/src/PlanView/RallyPointMapVisuals.qml index ded1282..81ef091 100644 --- a/src/PlanView/RallyPointMapVisuals.qml +++ b/src/PlanView/RallyPointMapVisuals.qml @@ -47,7 +47,7 @@ Item { MissionItemIndicatorDrag { mapControl: _root.map itemCoordinate: rallyPointObject.coordinate - visible: rallyPointObject === myRallyPointController.currentRallyPoint + visible: rallyPointObject === myRallyPointController.currentRallyPoint && _root.interactive property var rallyPointObject @@ -63,6 +63,7 @@ Item { anchorPoint.x: sourceItem.anchorPointX anchorPoint.y: sourceItem.anchorPointY z: QGroundControl.zOrderMapItems + opacity: _root.opacity property var rallyPointObject @@ -84,6 +85,7 @@ Item { model: _rallyPoints delegate: Item { + opacity: _root.opacity property var _visuals: [ ] Component.onCompleted: { diff --git a/src/PlanView/SimpleItemMapVisual.qml b/src/PlanView/SimpleItemMapVisual.qml index 489fda6..85e10e5 100644 --- a/src/PlanView/SimpleItemMapVisual.qml +++ b/src/PlanView/SimpleItemMapVisual.qml @@ -24,6 +24,7 @@ Item { property var map ///< Map control to place item in property var vehicle ///< Vehicle associated with this item + property bool interactive: true property var _missionItem: object property var _itemVisual @@ -95,6 +96,7 @@ Item { mapControl: _root.map itemIndicator: _itemVisual itemCoordinate: _missionItem.coordinate + visible: _root.interactive onItemCoordinateChanged: _missionItem.coordinate = itemCoordinate } @@ -109,7 +111,8 @@ Item { z: QGroundControl.zOrderMapItems missionItem: _missionItem sequenceNumber: _missionItem.sequenceNumber - onClicked: _root.clicked(_missionItem.sequenceNumber) + onClicked: if(_root.interactive) _root.clicked(_missionItem.sequenceNumber) + opacity: _root.opacity } } } diff --git a/src/PlanView/StructureScanMapVisual.qml b/src/PlanView/StructureScanMapVisual.qml index f2ac448..c779acc 100644 --- a/src/PlanView/StructureScanMapVisual.qml +++ b/src/PlanView/StructureScanMapVisual.qml @@ -27,6 +27,7 @@ Item { property var _missionItem: object property var _structurePolygon: object.structurePolygon property var _flightPolygon: object.flightPolygon + property bool interactive: parent.interactive signal clicked(int sequenceNumber) @@ -43,11 +44,11 @@ Item { QGCMapPolygonVisuals { mapControl: map mapPolygon: _structurePolygon - interactive: _missionItem.isCurrentItem + interactive: _missionItem.isCurrentItem && _root.interactive borderWidth: 1 borderColor: "black" interiorColor: "green" - interiorOpacity: 0.25 + interiorOpacity: 0.5 * _root.opacity } QGCMapPolygonVisuals { @@ -56,6 +57,7 @@ Item { interactive: false borderWidth: 2 borderColor: "white" + interiorOpacity: _root.opacity } // Entry point @@ -67,7 +69,7 @@ Item { anchorPoint.y: sourceItem.anchorPointY z: QGroundControl.zOrderMapItems coordinate: _missionItem.coordinate - visible: _missionItem.exitCoordinate.isValid + visible: _missionItem.exitCoordinate.isValid && _root.interactive sourceItem: MissionItemIndexLabel { index: _missionItem.sequenceNumber @@ -87,7 +89,7 @@ Item { anchorPoint.y: sourceItem.anchorPointY z: QGroundControl.zOrderMapItems coordinate: _missionItem.exitCoordinate - visible: _missionItem.exitCoordinate.isValid + visible: _missionItem.exitCoordinate.isValid && _root.interactive sourceItem: MissionItemIndexLabel { index: _missionItem.lastSequenceNumber diff --git a/src/PlanView/TakeoffItemMapVisual.qml b/src/PlanView/TakeoffItemMapVisual.qml index 3894aec..f19436d 100644 --- a/src/PlanView/TakeoffItemMapVisual.qml +++ b/src/PlanView/TakeoffItemMapVisual.qml @@ -24,6 +24,7 @@ Item { property var map ///< Map control to place item in property var vehicle ///< Vehicle associated with this item + property bool interactive: true property var _missionItem: object property var _takeoffIndicatorItem @@ -78,6 +79,7 @@ Item { mapControl: _root.map itemIndicator: _takeoffIndicatorItem itemCoordinate: _missionItem.specifiesCoordinate ? _missionItem.coordinate : _missionItem.launchCoordinate + visible: _root.interactive onItemCoordinateChanged: { if (_missionItem.specifiesCoordinate) { @@ -96,7 +98,7 @@ Item { mapControl: _root.map itemIndicator: _launchIndicatorItem itemCoordinate: _missionItem.launchCoordinate - visible: !_missionItem.launchTakeoffAtSameLocation + visible: !_missionItem.launchTakeoffAtSameLocation && _root.interactive onItemCoordinateChanged: _missionItem.launchCoordinate = itemCoordinate } @@ -111,6 +113,7 @@ Item { missionItem: _missionItem sequenceNumber: _missionItem.sequenceNumber onClicked: _root.clicked(_missionItem.sequenceNumber) + opacity: _root.opacity } } @@ -121,7 +124,7 @@ Item { coordinate: _missionItem.launchCoordinate anchorPoint.x: sourceItem.anchorPointX anchorPoint.y: sourceItem.anchorPointY - visible: !_missionItem.launchTakeoffAtSameLocation + visible: !_missionItem.launchTakeoffAtSameLocation && _root.interactive sourceItem: MissionItemIndexLabel { @@ -129,6 +132,7 @@ Item { label: qsTr("Launch") highlightSelected: true onClicked: _root.clicked(_missionItem.sequenceNumber) + visible: _root.interactive } } } @@ -140,7 +144,7 @@ Item { MouseArea { anchors.fill: map z: QGroundControl.zOrderMapItems + 1 // Over item indicators - visible: !_missionItem.launchCoordinate.isValid + visible: !_missionItem.launchCoordinate.isValid && _root.interactive readonly property int _decimalPlaces: 8 diff --git a/src/PlanView/TransectStyleMapVisuals.qml b/src/PlanView/TransectStyleMapVisuals.qml index 2c26288..54d8156 100644 --- a/src/PlanView/TransectStyleMapVisuals.qml +++ b/src/PlanView/TransectStyleMapVisuals.qml @@ -24,6 +24,7 @@ Item { property var map ///< Map control to place item in property bool polygonInteractive: true + property bool interactive: true property var _missionItem: object property var _mapPolygon: object.surveyAreaPolygon @@ -70,11 +71,11 @@ Item { id: mapPolygonVisuals mapControl: map mapPolygon: _mapPolygon - interactive: polygonInteractive && _missionItem.isCurrentItem + interactive: polygonInteractive && _missionItem.isCurrentItem && _root.interactive borderWidth: 1 borderColor: "black" interiorColor: QGroundControl.globalPalette.surveyPolygonInterior - interiorOpacity: 0.5 + interiorOpacity: 0.5 * _root.opacity } // Full set of transects lines. Shown when item is selected. @@ -86,6 +87,7 @@ Item { line.width: 2 path: _transectPoints visible: _currentItem + opacity: _root.opacity } } @@ -98,6 +100,7 @@ Item { line.width: 2 path: _showPartialEntryExit ? [ _transectPoints[0], _transectPoints[1] ] : [] visible: _showPartialEntryExit + opacity: _root.opacity } } Component { @@ -108,6 +111,7 @@ Item { line.width: 2 path: _showPartialEntryExit ? [ _transectPoints[_lastPointIndex - 1], _transectPoints[_lastPointIndex] ] : [] visible: _showPartialEntryExit + opacity: _root.opacity } } @@ -121,11 +125,12 @@ Item { z: QGroundControl.zOrderMapItems coordinate: _missionItem.coordinate visible: _missionItem.exitCoordinate.isValid + opacity: _root.opacity sourceItem: MissionItemIndexLabel { index: _missionItem.sequenceNumber checked: _missionItem.isCurrentItem - onClicked: _root.clicked(_missionItem.sequenceNumber) + onClicked: if(_root.interactive) _root.clicked(_missionItem.sequenceNumber) } } } @@ -138,6 +143,7 @@ Item { toCoord: _transectPoints[_firstTrueTransectIndex + 1] arrowPosition: 1 visible: _currentItem + opacity: _root.opacity } } @@ -149,6 +155,7 @@ Item { toCoord: _transectPoints[nextTrueTransectIndex + 1] arrowPosition: 1 visible: _currentItem && _transectCount > 3 + opacity: _root.opacity property int nextTrueTransectIndex: _firstTrueTransectIndex + (_hasTurnaround ? 4 : 2) } @@ -162,6 +169,7 @@ Item { toCoord: _transectPoints[_lastTrueTransectIndex] arrowPosition: 3 visible: _currentItem + opacity: _root.opacity } } @@ -173,6 +181,7 @@ Item { toCoord: _transectPoints[prevTrueTransectIndex] arrowPosition: 13 visible: _currentItem && _transectCount > 3 + opacity: _root.opacity property int prevTrueTransectIndex: _lastTrueTransectIndex - (_hasTurnaround ? 4 : 2) } @@ -188,11 +197,12 @@ Item { z: QGroundControl.zOrderMapItems coordinate: _missionItem.exitCoordinate visible: _missionItem.exitCoordinate.isValid + opacity: _root.opacity sourceItem: MissionItemIndexLabel { index: _missionItem.lastSequenceNumber checked: _missionItem.isCurrentItem - onClicked: _root.clicked(_missionItem.sequenceNumber) + onClicked: if(_root.interactive) _root.clicked(_missionItem.sequenceNumber) } } }