Skip to content
FlyViewMap.qml 20.7 KiB
Newer Older
/****************************************************************************
 *
Gus Grubba's avatar
Gus Grubba committed
 * (c) 2009-2020 QGROUNDCONTROL PROJECT <http://www.qgroundcontrol.org>
 *
 * 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 QtLocation                   5.3
import QtPositioning                5.3
import QtQuick.Dialogs              1.2
dogmaphobic's avatar
dogmaphobic committed

import QGroundControl               1.0
import QGroundControl.Airspace      1.0
import QGroundControl.Controllers   1.0
import QGroundControl.Controls      1.0
dogmaphobic's avatar
dogmaphobic committed
import QGroundControl.FlightDisplay 1.0
import QGroundControl.FlightMap     1.0
import QGroundControl.Palette       1.0
import QGroundControl.ScreenTools   1.0
dogmaphobic's avatar
dogmaphobic committed
import QGroundControl.Vehicle       1.0

FlightMap {
DoinLakeFlyer's avatar
 
DoinLakeFlyer committed
    id:                         _root
    allowGCSLocationCenter:     true
    allowVehicleLocationCenter: !_keepVehicleCentered
    planView:                   false
    zoomLevel:                  QGroundControl.flightMapZoom
    center:                     QGroundControl.flightMapPosition
DoinLakeFlyer's avatar
 
DoinLakeFlyer committed
    property Item pipState: _pipState
    QGCPipState {
        id:         _pipState
        pipOverlay: _pipOverlay
        isDark:     _isFullWindowItemDark
    }

    property var    rightPanelWidth
DoinLakeFlyer's avatar
 
DoinLakeFlyer committed
    property var    planMasterController
DoinLakeFlyer's avatar
 
DoinLakeFlyer committed
    property bool   pipMode:                    false   // true: map is shown in a small pip mode
    property var    toolInsets                          // Insets for the center viewport area
DonLakeFlyer's avatar
 
DonLakeFlyer committed
    property var    _activeVehicle:             QGroundControl.multiVehicleManager.activeVehicle
DoinLakeFlyer's avatar
 
DoinLakeFlyer committed
    property var    _planMasterController:      planMasterController
    property var    _geoFenceController:        planMasterController.geoFenceController
    property var    _rallyPointController:      planMasterController.rallyPointController
DonLakeFlyer's avatar
 
DonLakeFlyer committed
    property var    _activeVehicleCoordinate:   _activeVehicle ? _activeVehicle.coordinate : QtPositioning.coordinate()
    property real   _toolButtonTopMargin:       parent.height - mainWindow.height + (ScreenTools.defaultFontPixelHeight / 2)
Gus Grubba's avatar
Gus Grubba committed
    property bool   _airspaceEnabled:           QGroundControl.airmapSupported ? (QGroundControl.settingsManager.airMapSettings.enableAirMap.rawValue && QGroundControl.airspaceManager.connected): false
DonLakeFlyer's avatar
 
DonLakeFlyer committed
    property var    _flyViewSettings:           QGroundControl.settingsManager.flyViewSettings
    property bool   _keepMapCenteredOnVehicle:  _flyViewSettings.keepMapCenteredOnVehicle.rawValue
    property bool   _disableVehicleTracking:    false
DoinLakeFlyer's avatar
 
DoinLakeFlyer committed
    property bool   _keepVehicleCentered:       pipMode ? true : false
    property bool   _saveZoomLevelSetting:      true
DoinLakeFlyer's avatar
 
DoinLakeFlyer committed
            var coordinateNW = _root.toCoordinate(Qt.point(0,0), false /* clipToViewPort */)
            var coordinateSE = _root.toCoordinate(Qt.point(width,height), false /* clipToViewPort */)
            if(coordinateNW.isValid && coordinateSE.isValid) {
                QGroundControl.airspaceManager.setROI(coordinateNW, coordinateSE, false /*planView*/, reset)
DoinLakeFlyer's avatar
 
DoinLakeFlyer committed
    function _adjustMapZoomForPipMode() {
        _saveZoomLevelSetting = false
        if (pipMode) {
            if (QGroundControl.flightMapZoom > 3) {
                zoomLevel = QGroundControl.flightMapZoom - 3
            }
        } else {
            zoomLevel = QGroundControl.flightMapZoom
DoinLakeFlyer's avatar
 
DoinLakeFlyer committed
        _saveZoomLevelSetting = true
DoinLakeFlyer's avatar
 
DoinLakeFlyer committed
    onPipModeChanged: _adjustMapZoomForPipMode()
    onVisibleChanged: {
DoinLakeFlyer's avatar
 
DoinLakeFlyer committed
        if (visible) {
            // Synchronize center position with Plan View
            center = QGroundControl.flightMapPosition
DoinLakeFlyer's avatar
 
DoinLakeFlyer committed
        if (_saveZoomLevelSetting) {
            QGroundControl.flightMapZoom = zoomLevel
            updateAirspace(false)
        }
        QGroundControl.flightMapPosition = center
Gus Grubba's avatar
Gus Grubba committed
    on_AirspaceEnabledChanged: {
DoinLakeFlyer's avatar
 
DoinLakeFlyer committed
    // We track whether the user has panned or not to correctly handle automatic map positioning
    Connections {
        target: gesture

        onPanStarted:       _disableVehicleTracking = true
        onFlickStarted:     _disableVehicleTracking = true
        onPanFinished:      panRecenterTimer.restart()
        onFlickFinished:    panRecenterTimer.restart()
    }

    function pointInRect(point, rect) {
        return point.x > rect.x &&
                point.x < rect.x + rect.width &&
                point.y > rect.y &&
                point.y < rect.y + rect.height;
    }

    property real _animatedLatitudeStart
    property real _animatedLatitudeStop
    property real _animatedLongitudeStart
    property real _animatedLongitudeStop
    property real animatedLatitude
    property real animatedLongitude

DoinLakeFlyer's avatar
 
DoinLakeFlyer committed
    onAnimatedLatitudeChanged: _root.center = QtPositioning.coordinate(animatedLatitude, animatedLongitude)
    onAnimatedLongitudeChanged: _root.center = QtPositioning.coordinate(animatedLatitude, animatedLongitude)

    NumberAnimation on animatedLatitude { id: animateLat; from: _animatedLatitudeStart; to: _animatedLatitudeStop; duration: 1000 }
    NumberAnimation on animatedLongitude { id: animateLong; from: _animatedLongitudeStart; to: _animatedLongitudeStop; duration: 1000 }

    function animatedMapRecenter(fromCoord, toCoord) {
        _animatedLatitudeStart = fromCoord.latitude
        _animatedLongitudeStart = fromCoord.longitude
        _animatedLatitudeStop = toCoord.latitude
        _animatedLongitudeStop = toCoord.longitude
        animateLat.start()
        animateLong.start()
    }

DoinLakeFlyer's avatar
 
DoinLakeFlyer committed
    function _insetRect() {
        return Qt.rect(toolInsets.leftEdgeCenterInset,
                       toolInsets.topEdgeCenterInset,
                       _root.width - toolInsets.leftEdgeCenterInset - toolInsets.rightEdgeCenterInset,
                       _root.height - toolInsets.topEdgeCenterInset - toolInsets.bottomEdgeCenterInset)
    }

    function recenterNeeded() {
DoinLakeFlyer's avatar
 
DoinLakeFlyer committed
        var vehiclePoint = _root.fromCoordinate(_activeVehicleCoordinate, false /* clipToViewport */)
        var insetRect = _insetRect()
        return !pointInRect(vehiclePoint, insetRect)
    }

    function updateMapToVehiclePosition() {
DoinLakeFlyer's avatar
 
DoinLakeFlyer committed
        if (animateLat.running || animateLong.running) {
            return
        }
        // We let FlightMap handle first vehicle position
DonLakeFlyer's avatar
 
DonLakeFlyer committed
        if (!_keepMapCenteredOnVehicle && firstVehiclePositionReceived && _activeVehicleCoordinate.isValid && !_disableVehicleTracking) {
            if (_keepVehicleCentered) {
DoinLakeFlyer's avatar
 
DoinLakeFlyer committed
                _root.center = _activeVehicleCoordinate
            } else {
DonLakeFlyer's avatar
DonLakeFlyer committed
                if (firstVehiclePositionReceived && recenterNeeded()) {
DoinLakeFlyer's avatar
 
DoinLakeFlyer committed
                    // Move the map such that the vehicle is centered within the inset area
                    var vehiclePoint = _root.fromCoordinate(_activeVehicleCoordinate, false /* clipToViewport */)
                    var insetRect = _insetRect()
                    var centerInsetPoint = Qt.point(insetRect.x + insetRect.width / 2, insetRect.y + insetRect.height / 2)
                    var centerOffset = Qt.point((_root.width / 2) - centerInsetPoint.x, (_root.height / 2) - centerInsetPoint.y)
                    var vehicleOffsetPoint = Qt.point(vehiclePoint.x + centerOffset.x, vehiclePoint.y + centerOffset.y)
                    var vehicleOffsetCoord = _root.toCoordinate(vehicleOffsetPoint, false /* clipToViewport */)
                    animatedMapRecenter(_root.center, vehicleOffsetCoord)
DonLakeFlyer's avatar
 
DonLakeFlyer committed
    on_ActiveVehicleCoordinateChanged: {
        if (_keepMapCenteredOnVehicle && _activeVehicleCoordinate.isValid && !_disableVehicleTracking) {
DoinLakeFlyer's avatar
 
DoinLakeFlyer committed
            _root.center = _activeVehicleCoordinate
DonLakeFlyer's avatar
 
DonLakeFlyer committed
        }
    }

        id:         panRecenterTimer
        interval:   10000
        running:    false
        onTriggered: {
            _disableVehicleTracking = false
            updateMapToVehiclePosition()
    Timer {
        interval:       500
        running:        true
        repeat:         true
        onTriggered:    updateMapToVehiclePosition()
    }

    QGCMapPalette { id: mapPal; lightColors: isSatelliteMap }
Don Gagne's avatar
Don Gagne committed

    Connections {
DoinLakeFlyer's avatar
 
DoinLakeFlyer committed
        target:                 _missionController
        ignoreUnknownSignals:   true
DoinLakeFlyer's avatar
 
DoinLakeFlyer committed
            var visualItems = _missionController.visualItems
            if (visualItems && visualItems.count !== 1) {
                mapFitFunctions.fitMapViewportToMissionItems()
                firstVehiclePositionReceived = true
Don Gagne's avatar
Don Gagne committed
    MapFitFunctions {
        id:                         mapFitFunctions // The name for this id cannot be changed without breaking references outside of this code. Beware!
DoinLakeFlyer's avatar
 
DoinLakeFlyer committed
        map:                        _root
Don Gagne's avatar
Don Gagne committed
        usePlannedHomePosition:     false
DoinLakeFlyer's avatar
 
DoinLakeFlyer committed
        planMasterController:       _planMasterController
Don Gagne's avatar
Don Gagne committed
    }
DonLakeFlyer's avatar
 
DonLakeFlyer committed
    // Add trajectory lines to the map
    MapPolyline {
        id:         trajectoryPolyline
        line.width: 3
        line.color: "red"
        z:          QGroundControl.zOrderTrajectoryLines
DoinLakeFlyer's avatar
 
DoinLakeFlyer committed
        visible:    !pipMode
DonLakeFlyer's avatar
 
DonLakeFlyer committed

        Connections {
            target:                 QGroundControl.multiVehicleManager
DonLakeFlyer's avatar
 
DonLakeFlyer committed
            onActiveVehicleChanged: trajectoryPolyline.path = _activeVehicle ? _activeVehicle.trajectoryPoints.list() : []
DonLakeFlyer's avatar
 
DonLakeFlyer committed
        }

        Connections {
DonLakeFlyer's avatar
 
DonLakeFlyer committed
            target:                 _activeVehicle ? _activeVehicle.trajectoryPoints : null
DonLakeFlyer's avatar
 
DonLakeFlyer committed
            onPointAdded:           trajectoryPolyline.addCoordinate(coordinate)
            onUpdateLastPoint:      trajectoryPolyline.replaceCoordinate(trajectoryPolyline.pathLength() - 1, coordinate)
            onPointsCleared:        trajectoryPolyline.path = []
Don Gagne's avatar
Don Gagne committed
        }
dogmaphobic's avatar
dogmaphobic committed
    }

    // Add the vehicles to the map
    MapItemView {
        model: QGroundControl.multiVehicleManager.vehicles
DonLakeFlyer's avatar
DonLakeFlyer committed
        delegate: VehicleMapItem {
Don Gagne's avatar
Don Gagne committed
            vehicle:        object
            coordinate:     object.coordinate
DoinLakeFlyer's avatar
 
DoinLakeFlyer committed
            map:            _root
            size:           pipMode ? ScreenTools.defaultFontPixelHeight : ScreenTools.defaultFontPixelHeight * 3
DonLakeFlyer's avatar
DonLakeFlyer committed
            z:              QGroundControl.zOrderVehicles
Don Gagne's avatar
Don Gagne committed
        }
    // Add distance sensor view
    MapItemView{
        model: QGroundControl.multiVehicleManager.vehicles
        delegate: ProximityRadarMapView {
            vehicle:        object
            coordinate:     object.coordinate
            map:            _root
            z:              QGroundControl.zOrderVehicles
        }
    }
    // Add ADSB vehicles to the map
    MapItemView {
DonLakeFlyer's avatar
 
DonLakeFlyer committed
        model: QGroundControl.adsbVehicleManager.adsbVehicles
        delegate: VehicleMapItem {
            coordinate:     object.coordinate
            altitude:       object.altitude
            callsign:       object.callsign
            heading:        object.heading
Gus Grubba's avatar
Gus Grubba committed
            alert:          object.alert
DoinLakeFlyer's avatar
 
DoinLakeFlyer committed
            map:            _root
            z:              QGroundControl.zOrderVehicles
        }
    }

    // Add the items associated with each vehicles flight plan to the map
    Repeater {
        model: QGroundControl.multiVehicleManager.vehicles

        PlanMapItems {
DoinLakeFlyer's avatar
 
DoinLakeFlyer committed
            map:                    _root
            largeMapView:           !pipMode
DoinLakeFlyer's avatar
 
DoinLakeFlyer committed
            planMasterController:   _planMasterController
            vehicle:                _vehicle

            property var _vehicle: object

            PlanMasterController {
                id: masterController
                Component.onCompleted: startStaticActiveVehicle(object)
            }
        }
Don Gagne's avatar
 
Don Gagne committed
    MapItemView {
DoinLakeFlyer's avatar
 
DoinLakeFlyer committed
        model: pipMode ? undefined : _missionController.directionArrows
Don Gagne's avatar
 
Don Gagne committed

        delegate: MapLineArrow {
            fromCoord:      object ? object.coordinate1 : undefined
            toCoord:        object ? object.coordinate2 : undefined
            arrowPosition:  2
            z:              QGroundControl.zOrderWaypointLines
        }
    }

    // Allow custom builds to add map items
    CustomMapItems {
DoinLakeFlyer's avatar
 
DoinLakeFlyer committed
        map:            _root
        largeMapView:   !pipMode
    GeoFenceMapVisuals {
DoinLakeFlyer's avatar
 
DoinLakeFlyer committed
        map:                    _root
        myGeoFenceController:   _geoFenceController
DonLakeFlyer's avatar
 
DonLakeFlyer committed
        homePosition:           _activeVehicle && _activeVehicle.homePosition.isValid ? _activeVehicle.homePosition :  QtPositioning.coordinate()
    // Rally points on map
    MapItemView {
        model: _rallyPointController.points

        delegate: MapQuickItem {
            id:             itemIndicator
            anchorPoint.x:  sourceItem.anchorPointX
            anchorPoint.y:  sourceItem.anchorPointY
            coordinate:     object.coordinate
            z:              QGroundControl.zOrderMapItems

            sourceItem: MissionItemIndexLabel {
                id:         itemIndexLabel
                label:      qsTr("R", "rally point map item label")
            }
        }
    }

DonLakeFlyer's avatar
DonLakeFlyer committed
    // Camera trigger points
    MapItemView {
DonLakeFlyer's avatar
 
DonLakeFlyer committed
        model: _activeVehicle ? _activeVehicle.cameraTriggerPoints : 0
DonLakeFlyer's avatar
DonLakeFlyer committed

        delegate: CameraTriggerIndicator {
            coordinate:     object.coordinate
            z:              QGroundControl.zOrderTopMost
        }
    }

Don Gagne's avatar
 
Don Gagne committed
    // GoTo Location visuals
Don Gagne's avatar
Don Gagne committed
    MapQuickItem {
        id:             gotoLocationItem
        visible:        false
Don Gagne's avatar
Don Gagne committed
        z:              QGroundControl.zOrderMapItems
        anchorPoint.x:  sourceItem.anchorPointX
        anchorPoint.y:  sourceItem.anchorPointY
Don Gagne's avatar
Don Gagne committed
        sourceItem: MissionItemIndexLabel {
DonLakeFlyer's avatar
DonLakeFlyer committed
            checked:    true
            index:      -1
Don Gagne's avatar
 
Don Gagne committed
            label:      qsTr("Go here", "Go to location waypoint")
Don Gagne's avatar
Don Gagne committed
        }
DonLakeFlyer's avatar
 
DonLakeFlyer committed
        property bool inGotoFlightMode: _activeVehicle ? _activeVehicle.flightMode === _activeVehicle.gotoFlightMode : false
Don Gagne's avatar
 
Don Gagne committed

        onInGotoFlightModeChanged: {
DonLakeFlyer's avatar
 
DonLakeFlyer committed
            if (!inGotoFlightMode && gotoLocationItem.visible) {
Don Gagne's avatar
 
Don Gagne committed
                // Hide goto indicator when vehicle falls out of guided mode
DonLakeFlyer's avatar
 
DonLakeFlyer committed
                gotoLocationItem.visible = false
Don Gagne's avatar
 
Don Gagne committed
            }
        }

Gus Grubba's avatar
Gus Grubba committed
        Connections {
DonLakeFlyer's avatar
 
DonLakeFlyer committed
            target: QGroundControl.multiVehicleManager
Gus Grubba's avatar
Gus Grubba committed
            onActiveVehicleChanged: {
                if (!activeVehicle) {
DonLakeFlyer's avatar
 
DonLakeFlyer committed
                    gotoLocationItem.visible = false
Gus Grubba's avatar
Gus Grubba committed
                }
Don Gagne's avatar
 
Don Gagne committed
            }
        }

        function show(coord) {
            gotoLocationItem.coordinate = coord
            gotoLocationItem.visible = true
        }
        function hide() {
            gotoLocationItem.visible = false
        }

Don Gagne's avatar
 
Don Gagne committed
        function actionConfirmed() {
            // We leave the indicator visible. The handling for onInGuidedModeChanged will hide it.
        }

        function actionCancelled() {
            hide()
        }
    }
Don Gagne's avatar
 
Don Gagne committed

Don Gagne's avatar
 
Don Gagne committed
    // Orbit editing visuals
    QGCMapCircleVisuals {
Don Gagne's avatar
 
Don Gagne committed
        id:             orbitMapCircle
        mapControl:     parent
        mapCircle:      _mapCircle
        visible:        false
Don Gagne's avatar
 
Don Gagne committed
        property alias center:              _mapCircle.center
        property alias clockwiseRotation:   _mapCircle.clockwiseRotation
        readonly property real defaultRadius: 30

Gus Grubba's avatar
Gus Grubba committed
        Connections {
DonLakeFlyer's avatar
 
DonLakeFlyer committed
            target: QGroundControl.multiVehicleManager
Gus Grubba's avatar
Gus Grubba committed
            onActiveVehicleChanged: {
                if (!activeVehicle) {
DonLakeFlyer's avatar
 
DonLakeFlyer committed
                    orbitMapCircle.visible = false
Gus Grubba's avatar
Gus Grubba committed
                }
Don Gagne's avatar
 
Don Gagne committed
            }
        }

        function show(coord) {
DonLakeFlyer's avatar
DonLakeFlyer committed
            _mapCircle.radius.rawValue = defaultRadius
            orbitMapCircle.center = coord
            orbitMapCircle.visible = true
        }

        function hide() {
            orbitMapCircle.visible = false
        }

Don Gagne's avatar
 
Don Gagne committed
        function actionConfirmed() {
            // Live orbit status is handled by telemetry so we hide here and telemetry will show again.
            hide()
        }

        function actionCancelled() {
            hide()
        }

DonLakeFlyer's avatar
DonLakeFlyer committed
        function radius() {
            return _mapCircle.radius.rawValue
        }

DonLakeFlyer's avatar
 
DonLakeFlyer committed
        Component.onCompleted: globals.guidedControllerFlyView.orbitMapCircle = orbitMapCircle

        QGCMapCircle {
            id:                 _mapCircle
            interactive:        true
DonLakeFlyer's avatar
DonLakeFlyer committed
            radius.rawValue:    30
Don Gagne's avatar
 
Don Gagne committed
            showRotation:       true
            clockwiseRotation:  true
Gus Grubba's avatar
Gus Grubba committed
    // ROI Location visuals
    MapQuickItem {
        id:             roiLocationItem
DonLakeFlyer's avatar
 
DonLakeFlyer committed
        visible:        _activeVehicle && _activeVehicle.isROIEnabled
Gus Grubba's avatar
Gus Grubba committed
        z:              QGroundControl.zOrderMapItems
        anchorPoint.x:  sourceItem.anchorPointX
        anchorPoint.y:  sourceItem.anchorPointY
        sourceItem: MissionItemIndexLabel {
            checked:    true
            index:      -1
            label:      qsTr("ROI here", "Make this a Region Of Interest")
        }

        //-- Visibilty controlled by actual state
Gus Grubba's avatar
Gus Grubba committed
        function show(coord) {
            roiLocationItem.coordinate = coord
        }

        function hide() {
        }

        function actionConfirmed() {
        }

        function actionCancelled() {
        }
    }

Don Gagne's avatar
 
Don Gagne committed
    // Orbit telemetry visuals
Don Gagne's avatar
 
Don Gagne committed
    QGCMapCircleVisuals {
Don Gagne's avatar
 
Don Gagne committed
        id:             orbitTelemetryCircle
Don Gagne's avatar
 
Don Gagne committed
        mapControl:     parent
DonLakeFlyer's avatar
 
DonLakeFlyer committed
        mapCircle:      _activeVehicle ? _activeVehicle.orbitMapCircle : null
        visible:        _activeVehicle ? _activeVehicle.orbitActive : false
Don Gagne's avatar
 
Don Gagne committed
    }

Don Gagne's avatar
 
Don Gagne committed
    MapQuickItem {
        id:             orbitCenterIndicator
        anchorPoint.x:  sourceItem.anchorPointX
        anchorPoint.y:  sourceItem.anchorPointY
DonLakeFlyer's avatar
 
DonLakeFlyer committed
        coordinate:     _activeVehicle ? _activeVehicle.orbitMapCircle.center : QtPositioning.coordinate()
Don Gagne's avatar
 
Don Gagne committed
        visible:        orbitTelemetryCircle.visible

        sourceItem: MissionItemIndexLabel {
            checked:    true
            index:      -1
            label:      qsTr("Orbit", "Orbit waypoint")
        }
    }

Don Gagne's avatar
Don Gagne committed
    // Handle guided mode clicks
dogmaphobic's avatar
dogmaphobic committed
    MouseArea {
        anchors.fill: parent
Don Gagne's avatar
Don Gagne committed

        QGCMenu {
DonLakeFlyer's avatar
DonLakeFlyer committed
            id: clickMenu
            property var coord
            QGCMenuItem {
DonLakeFlyer's avatar
DonLakeFlyer committed
                text:           qsTr("Go to location")
DonLakeFlyer's avatar
 
DonLakeFlyer committed
                visible:        globals.guidedControllerFlyView.showGotoLocation
DonLakeFlyer's avatar
DonLakeFlyer committed

                onTriggered: {
                    gotoLocationItem.show(clickMenu.coord)
DonLakeFlyer's avatar
 
DonLakeFlyer committed
                    globals.guidedControllerFlyView.confirmAction(globals.guidedControllerFlyView.actionGoto, clickMenu.coord, gotoLocationItem)
            QGCMenuItem {
DonLakeFlyer's avatar
DonLakeFlyer committed
                text:           qsTr("Orbit at location")
DonLakeFlyer's avatar
 
DonLakeFlyer committed
                visible:        globals.guidedControllerFlyView.showOrbit
DonLakeFlyer's avatar
DonLakeFlyer committed
                onTriggered: {
                    orbitMapCircle.show(clickMenu.coord)
DonLakeFlyer's avatar
 
DonLakeFlyer committed
                    globals.guidedControllerFlyView.confirmAction(globals.guidedControllerFlyView.actionOrbit, clickMenu.coord, orbitMapCircle)
Gus Grubba's avatar
Gus Grubba committed
            QGCMenuItem {
                text:           qsTr("ROI at location")
DonLakeFlyer's avatar
 
DonLakeFlyer committed
                visible:        globals.guidedControllerFlyView.showROI
Gus Grubba's avatar
Gus Grubba committed

                onTriggered: {
                    roiLocationItem.show(clickMenu.coord)
DonLakeFlyer's avatar
 
DonLakeFlyer committed
                    globals.guidedControllerFlyView.confirmAction(globals.guidedControllerFlyView.actionROI, clickMenu.coord, roiLocationItem)
Gus Grubba's avatar
Gus Grubba committed
                }
            }
Don Gagne's avatar
Don Gagne committed
        onClicked: {
DonLakeFlyer's avatar
 
DonLakeFlyer committed
            if (!globals.guidedControllerFlyView.guidedUIVisible && (globals.guidedControllerFlyView.showGotoLocation || globals.guidedControllerFlyView.showOrbit || globals.guidedControllerFlyView.showROI)) {
DonLakeFlyer's avatar
 
DonLakeFlyer committed
                orbitMapCircle.hide()
                gotoLocationItem.hide()
                var clickCoord = _root.toCoordinate(Qt.point(mouse.x, mouse.y), false /* clipToViewPort */)
                clickMenu.coord = clickCoord
DonLakeFlyer's avatar
DonLakeFlyer committed
                clickMenu.popup()
    // Airspace overlap support
    MapItemView {
        model:              _airspaceEnabled && QGroundControl.settingsManager.airMapSettings.enableAirspace && QGroundControl.airspaceManager.airspaceVisible ? QGroundControl.airspaceManager.airspaces.circles : []
        delegate: MapCircle {
            center:         object.center
            radius:         object.radius
            color:          object.color
Gus Grubba's avatar
Gus Grubba committed
            border.color:   object.lineColor
            border.width:   object.lineWidth
        model:              _airspaceEnabled && QGroundControl.settingsManager.airMapSettings.enableAirspace && QGroundControl.airspaceManager.airspaceVisible ? QGroundControl.airspaceManager.airspaces.polygons : []
        delegate: MapPolygon {
            path:           object.polygon
            color:          object.color
Gus Grubba's avatar
Gus Grubba committed
            border.color:   object.lineColor
            border.width:   object.lineWidth