TakeoffItemMapVisual.qml 5.65 KB
Newer Older
1 2
/****************************************************************************
 *
Gus Grubba's avatar
Gus Grubba committed
3
 * (c) 2009-2020 QGROUNDCONTROL PROJECT <http://www.qgroundcontrol.org>
4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
 *
 * 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 QtLocation       5.3
import QtPositioning    5.3

import QGroundControl               1.0
import QGroundControl.ScreenTools   1.0
import QGroundControl.Palette       1.0
import QGroundControl.Controls      1.0
import QGroundControl.FlightMap     1.0

/// Simple Mission Item visuals
Item {
    id: _root

    property var map        ///< Map control to place item in
    property var vehicle    ///< Vehicle associated with this item
27
    property bool interactive: true
28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45

    property var    _missionItem:           object
    property var    _takeoffIndicatorItem
    property var    _launchIndicatorItem

    signal clicked(int sequenceNumber)

    function addCommonVisuals() {
        if (_objMgrCommonVisuals.empty) {
            _takeoffIndicatorItem = _objMgrCommonVisuals.createObject(takeoffIndicatorComponent, map, true /* addToMap */)
            _launchIndicatorItem = _objMgrCommonVisuals.createObject(launchIndicatorComponent, map, true /* addToMap */)
        }
    }

    function addEditingVisuals() {
        if (_objMgrEditingVisuals.empty) {
            _objMgrEditingVisuals.createObjects([ takeoffDragComponent, launchDragComponent ], map, false /* addToMap */)
        }
46 47 48
        if (!_missionItem.launchCoordinate.isValid) {
            _objMgrMouseClick.createObject(mouseAreaClickComponent, map, false /* addToMap */)
        }
49 50 51 52
    }

    QGCDynamicObjectManager { id: _objMgrCommonVisuals }
    QGCDynamicObjectManager { id: _objMgrEditingVisuals }
53
    QGCDynamicObjectManager { id: _objMgrMouseClick }
54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69

    Component.onCompleted: {
        addCommonVisuals()
        if (_missionItem.isCurrentItem && map.planView) {
            addEditingVisuals()
        }
    }

    Connections {
        target: _missionItem

        onIsCurrentItemChanged: {
            if (_missionItem.isCurrentItem && map.planView) {
                addEditingVisuals()
            } else {
                _objMgrEditingVisuals.destroyObjects()
70
                _objMgrMouseClick.destroyObjects()
71 72 73 74 75 76 77 78 79 80 81
            }
        }
    }

    Component {
        id: takeoffDragComponent

        MissionItemIndicatorDrag {
            mapControl:     _root.map
            itemIndicator:  _takeoffIndicatorItem
            itemCoordinate: _missionItem.specifiesCoordinate ? _missionItem.coordinate : _missionItem.launchCoordinate
82
            visible:        _root.interactive
83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100

            onItemCoordinateChanged: {
                if (_missionItem.specifiesCoordinate) {
                    _missionItem.coordinate = itemCoordinate
                } else {
                    _missionItem.launchCoordinate = itemCoordinate
                }
            }
        }
    }

    Component {
        id: launchDragComponent

        MissionItemIndicatorDrag {
            mapControl:     _root.map
            itemIndicator:  _launchIndicatorItem
            itemCoordinate: _missionItem.launchCoordinate
101
            visible:        !_missionItem.launchTakeoffAtSameLocation && _root.interactive
102 103 104 105 106 107 108 109 110 111 112 113 114 115

            onItemCoordinateChanged: _missionItem.launchCoordinate = itemCoordinate
        }
    }

    Component {
        id: takeoffIndicatorComponent

        MissionItemIndicator {
            coordinate:     _missionItem.specifiesCoordinate ? _missionItem.coordinate : _missionItem.launchCoordinate
            z:              QGroundControl.zOrderMapItems
            missionItem:    _missionItem
            sequenceNumber: _missionItem.sequenceNumber
            onClicked:      _root.clicked(_missionItem.sequenceNumber)
116
            opacity:        _root.opacity
117 118 119 120 121 122 123 124 125 126
        }
    }

    Component {
        id: launchIndicatorComponent

        MapQuickItem {
            coordinate:     _missionItem.launchCoordinate
            anchorPoint.x:  sourceItem.anchorPointX
            anchorPoint.y:  sourceItem.anchorPointY
127
            visible:        !_missionItem.launchTakeoffAtSameLocation && _root.interactive
128 129 130 131 132 133 134

            sourceItem:
                MissionItemIndexLabel {
                    checked:            _missionItem.isCurrentItem
                    label:              qsTr("Launch")
                    highlightSelected:  true
                    onClicked:          _root.clicked(_missionItem.sequenceNumber)
135
                    visible:            _root.interactive
136 137 138
                }
        }
    }
139 140 141 142 143 144 145 146

    // Mouse area to capture launch location click
    Component {
        id:  mouseAreaClickComponent

        MouseArea {
            anchors.fill:   map
            z:              QGroundControl.zOrderMapItems + 1   // Over item indicators
147
            visible:        !_missionItem.launchCoordinate.isValid && _root.interactive
148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163

            readonly property int   _decimalPlaces: 8

            onClicked: {
                var coordinate = map.toCoordinate(Qt.point(mouse.x, mouse.y), false /* clipToViewPort */)
                coordinate.latitude = coordinate.latitude.toFixed(_decimalPlaces)
                coordinate.longitude = coordinate.longitude.toFixed(_decimalPlaces)
                coordinate.altitude = coordinate.altitude.toFixed(_decimalPlaces)
                _missionItem.launchCoordinate = coordinate
                if (_missionItem.launchTakeoffAtSameLocation) {
                    _missionItem.wizardMode = false
                }
                _objMgrMouseClick.destroyObjects()
            }
        }
    }
164
}