FlightMap.qml 10.1 KB
Newer Older
1 2 3 4 5 6 7 8
/****************************************************************************
 *
 *   (c) 2009-2016 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.
 *
 ****************************************************************************/
dogmaphobic's avatar
dogmaphobic committed
9 10 11 12 13 14 15 16


/**
 * @file
 *   @brief QGC Map Background
 *   @author Gus Grubba <mavlink@grubba.com>
 */

17
import QtQuick          2.4
18
import QtQuick.Controls 1.3
19 20
import QtLocation       5.3
import QtPositioning    5.3
dogmaphobic's avatar
dogmaphobic committed
21

22
import QGroundControl                       1.0
dogmaphobic's avatar
dogmaphobic committed
23
import QGroundControl.FactSystem            1.0
24
import QGroundControl.Controls              1.0
25
import QGroundControl.FlightMap             1.0
26 27 28
import QGroundControl.ScreenTools           1.0
import QGroundControl.MultiVehicleManager   1.0
import QGroundControl.Vehicle               1.0
29
import QGroundControl.Mavlink               1.0
dogmaphobic's avatar
dogmaphobic committed
30

31 32
Map {
    id: _map
dogmaphobic's avatar
dogmaphobic committed
33

34
    property string mapName:            'defaultMap'
35
    property string mapType:            QGroundControl.flightMapSettings.mapTypeForMapName(mapName)
36
//  property alias  mapWidgets:         controlWidgets
37
    property bool   isSatelliteMap:     mapType == "Satellite Map" || mapType == "Hybrid Map"
dogmaphobic's avatar
dogmaphobic committed
38
    property bool   showScale:          false
39

dogmaphobic's avatar
dogmaphobic committed
40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86
    readonly property real  maxZoomLevel: 20
    property variant        scaleLengths: [5, 10, 25, 50, 100, 150, 250, 500, 1000, 2000, 5000, 10000, 20000, 50000, 100000, 200000, 500000, 1000000, 2000000]

    function formatDistance(meters)
    {
        var dist = Math.round(meters)
        if (dist > 1000 ){
            if (dist > 100000){
                dist = Math.round(dist / 1000)
            }
            else{
                dist = Math.round(dist / 100)
                dist = dist / 10
            }
            dist = dist + " km"
        }
        else{
            dist = dist + " m"
        }
        return dist
    }

    function calculateScale() {
        var coord1, coord2, dist, text, f
        f = 0
        coord1 = _map.toCoordinate(Qt.point(0, scale.y))
        coord2 = _map.toCoordinate(Qt.point(0 + scaleImage.sourceSize.width, scale.y))
        dist = Math.round(coord1.distanceTo(coord2))
        if (dist === 0) {
            // not visible
        } else {
            for (var i = 0; i < scaleLengths.length - 1; i++) {
                if (dist < (scaleLengths[i] + scaleLengths[i+1]) / 2 ) {
                    f = scaleLengths[i] / dist
                    dist = scaleLengths[i]
                    break;
                }
            }
            if (f === 0) {
                f = dist / scaleLengths[i]
                dist = scaleLengths[i]
            }
        }
        text = formatDistance(dist)
        scaleImage.width = (scaleImage.sourceSize.width * f) - 2 * scaleImageLeft.sourceSize.width
        scaleText.text = text
    }
87 88

    zoomLevel:                  18
89
    center:                     QGroundControl.lastKnownHomePosition
90
    gesture.flickDeceleration:  3000
91

92
    plugin: Plugin { name: "QGroundControl" }
93

Don Gagne's avatar
Don Gagne committed
94
    ExclusiveGroup { id: mapTypeGroup }
95 96 97

    Component.onCompleted: onMapTypeChanged

98
    property bool _initialMapPositionSet: false
dogmaphobic's avatar
dogmaphobic committed
99

100 101 102 103 104
    Connections {
        target: mainWindow
        onGcsPositionChanged: {
            if (!_initialMapPositionSet) {
                _initialMapPositionSet = true
Don Gagne's avatar
Don Gagne committed
105
                center = mainWindow.gcsPosition
106 107 108 109
            }
        }
    }

110 111 112
    onMapTypeChanged: {
        QGroundControl.flightMapSettings.setMapTypeForMapName(mapName, mapType)
        var fullMapName = QGroundControl.flightMapSettings.mapProvider + " " + mapType
Don Gagne's avatar
Don Gagne committed
113
        for (var i = 0; i < _map.supportedMapTypes.length; i++) {
114
            if (fullMapName === _map.supportedMapTypes[i].name) {
Don Gagne's avatar
Don Gagne committed
115
                _map.activeMapType = _map.supportedMapTypes[i]
116
                return
Don Gagne's avatar
Don Gagne committed
117 118 119
            }
        }
    }
120

121 122 123 124 125
    MapQuickItem {
        anchorPoint.x:  sourceItem.width  / 2
        anchorPoint.y:  sourceItem.height / 2
        visible:        mainWindow.gcsPosition.isValid
        coordinate:     mainWindow.gcsPosition
dogmaphobic's avatar
dogmaphobic committed
126
        sourceItem:     MissionItemIndexLabel {
127 128 129 130
            label: "Q"
        }
    }

dogmaphobic's avatar
dogmaphobic committed
131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159
    onWidthChanged: {
        if(_map.showScale)
            scaleTimer.restart()
    }

    onHeightChanged: {
        if(_map.showScale)
            scaleTimer.restart()
    }

    onZoomLevelChanged:{
        if(_map.showScale)
            scaleTimer.restart()
    }

    Timer {
        id:         scaleTimer
        interval:   100
        running:    false
        repeat:     false
        onTriggered: {
            _map.calculateScale()
        }
    }
    /*
        Scale
    */
    Item {
        id:                         scale
160
        visible:                    !ScreenTools.isTinyScreen && _map.showScale && scaleText.text !== "0 m"
dogmaphobic's avatar
dogmaphobic committed
161 162 163 164
        z:                          _map.z + 20
        width:                      scaleImageLeft.width + scaleImage.width + scaleImageRight.width
        anchors {
            bottom:                 parent.bottom
165
            bottomMargin:           ScreenTools.defaultFontPixelHeight * (0.66)
dogmaphobic's avatar
dogmaphobic committed
166
            right:                  parent.right
167
            rightMargin:            ScreenTools.defaultFontPixelHeight * (0.33)
dogmaphobic's avatar
dogmaphobic committed
168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189
        }
        Image {
            id:                     scaleImageLeft
            source:                 isSatelliteMap ? "/qmlimages/scale_end.png" : "/qmlimages/scale_endLight.png"
            anchors.bottom:         parent.bottom
            anchors.left:           parent.left
        }
        Image {
            id:                     scaleImage
            source:                 isSatelliteMap ? "/qmlimages/scale.png" : "/qmlimages/scaleLight.png"
            anchors.bottom:         parent.bottom
            anchors.left:           scaleImageLeft.right
        }
        Image {
            id:                     scaleImageRight
            source:                 isSatelliteMap ? "/qmlimages/scale_end.png" : "/qmlimages/scale_endLight.png"
            anchors.bottom:         parent.bottom
            anchors.left:           scaleImage.right
        }
        QGCLabel {
            id: scaleText
            color:                  isSatelliteMap ? "white" : "black"
190
            font.family:            ScreenTools.demiboldFontFamily
dogmaphobic's avatar
dogmaphobic committed
191 192 193
            horizontalAlignment:    Text.AlignHCenter
            anchors.bottom:         parent.bottom
            anchors.right:          parent.right
194
            anchors.bottomMargin:   ScreenTools.defaultFontPixelHeight * (0.83)
dogmaphobic's avatar
dogmaphobic committed
195 196 197 198 199 200 201 202
            text: "0 m"
        }
        Component.onCompleted: {
            if(_map.showScale)
                _map.calculateScale();
        }
    }

203
    /*********************************************
204
    /// Map control widgets
205
    Column {
206
        id:                 controlWidgets
207 208 209 210
        anchors.margins:    ScreenTools.defaultFontPixelWidth
        anchors.right:      parent.right
        anchors.bottom:     parent.bottom
        spacing:            ScreenTools.defaultFontPixelWidth / 2
Don Gagne's avatar
Don Gagne committed
211
        z:                  1000    // Must be on top for clicking
Don Gagne's avatar
Don Gagne committed
212 213
        // Pinch zoom doesn't seem to be working, so zoom buttons in mobile on for now
        //visible:            !ScreenTools.isMobile
214 215 216 217 218

        Row {
            layoutDirection:    Qt.RightToLeft
            spacing:            ScreenTools.defaultFontPixelWidth / 2

219
            readonly property real _zoomIncrement: 1.0
Don Gagne's avatar
Don Gagne committed
220
            property real _buttonWidth: ScreenTools.defaultFontPixelWidth * 5
Gus Grubba's avatar
Gus Grubba committed
221

222 223
            NumberAnimation {
                id: animateZoom
Gus Grubba's avatar
Gus Grubba committed
224

225 226
                property real startZoom
                property real endZoom
Gus Grubba's avatar
Gus Grubba committed
227

228
                target:     _map
229 230 231 232
                properties: "zoomLevel"
                from:       startZoom
                to:         endZoom
                duration:   500
Gus Grubba's avatar
Gus Grubba committed
233

234 235 236 237 238
                easing {
                    type: Easing.OutExpo
                }
            }

239 240

            QGCButton {
241
                width:  parent._buttonWidth
Gus Grubba's avatar
Gus Grubba committed
242
                z:      QGroundControl.zOrderWidgets
dogmaphobic's avatar
dogmaphobic committed
243
                //iconSource: "/qmlimages/ZoomPlus.svg"
244
                text:   "+"
Gus Grubba's avatar
Gus Grubba committed
245

246
                onClicked: {
247 248 249
                    var endZoomLevel = _map.zoomLevel + parent._zoomIncrement
                    if (endZoomLevel > _map.maximumZoomLevel) {
                        endZoomLevel = _map.maximumZoomLevel
250
                    }
251
                    animateZoom.startZoom = _map.zoomLevel
252 253 254
                    animateZoom.endZoom = endZoomLevel
                    animateZoom.start()
                }
255
            }
Gus Grubba's avatar
Gus Grubba committed
256

257
            QGCButton {
258
                width:  parent._buttonWidth
Gus Grubba's avatar
Gus Grubba committed
259
                z:      QGroundControl.zOrderWidgets
dogmaphobic's avatar
dogmaphobic committed
260
                //iconSource: "/qmlimages/ZoomMinus.svg"
261
                text:   "-"
Gus Grubba's avatar
Gus Grubba committed
262

263
                onClicked: {
264 265 266
                    var endZoomLevel = _map.zoomLevel - parent._zoomIncrement
                    if (endZoomLevel < _map.minimumZoomLevel) {
                        endZoomLevel = _map.minimumZoomLevel
267
                    }
268
                    animateZoom.startZoom = _map.zoomLevel
269 270 271
                    animateZoom.endZoom = endZoomLevel
                    animateZoom.start()
                }
272
            }
273 274
        } // Row - +/- buttons
    } // Column - Map control widgets
275
*********************************************/
276 277 278 279

/*
 The slider and scale display are commented out for now to try to save real estate - DonLakeFlyer
 Not sure if I'll bring them back or not. Need room for waypoint list at bottom
Gus Grubba's avatar
Gus Grubba committed
280

dogmaphobic's avatar
dogmaphobic committed
281 282 283 284 285 286
    QGCSlider {
        id: zoomSlider;
        minimum: map.minimumZoomLevel;
        maximum: map.maximumZoomLevel;
        opacity: 1
        visible: parent.visible
287
        z: 1000
dogmaphobic's avatar
dogmaphobic committed
288 289
        anchors {
            bottom: parent.bottom;
290 291 292
            bottomMargin:   ScreenTools.defaultFontPixelHeight * (1.25)
            rightMargin:    ScreenTools.defaultFontPixelHeight * (1.66)
            leftMargin:     ScreenTools.defaultFontPixelHeight * (1.66)
dogmaphobic's avatar
dogmaphobic committed
293 294 295 296 297 298 299 300 301 302 303
            left: parent.left
        }
        width: parent.width - anchors.rightMargin - anchors.leftMargin
        value: map.zoomLevel
        Binding {
            target: zoomSlider; property: "value"; value: map.zoomLevel
        }
        onValueChanged: {
            map.zoomLevel = value
        }
    }
304
*/
dogmaphobic's avatar
dogmaphobic committed
305

306
} // Map