MissionEditor.qml 41 KB
Newer Older
Don Gagne's avatar
Don Gagne committed
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
/*=====================================================================

QGroundControl Open Source Ground Control Station

(c) 2009, 2015 QGROUNDCONTROL PROJECT <http://www.qgroundcontrol.org>

This file is part of the QGROUNDCONTROL project

    QGROUNDCONTROL is free software: you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
    the Free Software Foundation, either version 3 of the License, or
    (at your option) any later version.

    QGROUNDCONTROL is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU General Public License for more details.

    You should have received a copy of the GNU General Public License
    along with QGROUNDCONTROL. If not, see <http://www.gnu.org/licenses/>.

======================================================================*/

Don Gagne's avatar
Don Gagne committed
24 25 26 27 28
import QtQuick          2.4
import QtQuick.Controls 1.3
import QtQuick.Dialogs  1.2
import QtLocation       5.3
import QtPositioning    5.3
Don Gagne's avatar
Don Gagne committed
29

30
import QGroundControl               1.0
Don Gagne's avatar
Don Gagne committed
31 32 33 34
import QGroundControl.FlightMap     1.0
import QGroundControl.ScreenTools   1.0
import QGroundControl.Controls      1.0
import QGroundControl.Palette       1.0
Don Gagne's avatar
Don Gagne committed
35
import QGroundControl.Mavlink       1.0
36
import QGroundControl.Controllers   1.0
Don Gagne's avatar
Don Gagne committed
37 38

/// Mission Editor
Don Gagne's avatar
Don Gagne committed
39

Don Gagne's avatar
Don Gagne committed
40 41
QGCView {
    viewPanel: panel
Don Gagne's avatar
Don Gagne committed
42

43 44 45
    // zOrder comes from the Loader in MainWindow.qml
    z: zOrder

Don Gagne's avatar
Don Gagne committed
46
    readonly property int   _decimalPlaces:     7
Don Gagne's avatar
Don Gagne committed
47 48
    readonly property real  _horizontalMargin:  ScreenTools.defaultFontPixelWidth / 2
    readonly property real  _verticalMargin:    ScreenTools.defaultFontPixelHeight / 2
Don Gagne's avatar
Don Gagne committed
49
    readonly property var   _activeVehicle:     multiVehicleManager.activeVehicle
50
    readonly property real  _editFieldWidth:    ScreenTools.defaultFontPixelWidth * 16
Don Gagne's avatar
Don Gagne committed
51

52
    property var    _missionItems:              _controller.missionItems
53 54 55

    property var    _homePositionManager:       QGroundControl.homePositionManager
    property string _homePositionName:          _homePositionManager.homePositions.get(0).name
56 57

    property var    offlineHomePosition:        _homePositionManager.homePositions.get(0).coordinate
58 59
    property var    liveHomePosition:           _controller.liveHomePosition
    property var    liveHomePositionAvailable:  _controller.liveHomePositionAvailable
60
    property var    homePosition:               offlineHomePosition // live or offline depending on state
61

62 63
    MissionEditorController { id: _controller }

Don Gagne's avatar
Don Gagne committed
64
    QGCPalette { id: _qgcPal; colorGroupEnabled: enabled }
Don Gagne's avatar
Don Gagne committed
65

66 67 68 69 70 71
    ExclusiveGroup {
        id: _mapTypeButtonsExclusiveGroup
    }

    ExclusiveGroup {
        id: _dropButtonsExclusiveGroup
72
        onCurrentChanged: console.log("Current button", current)
73 74
    }

75 76 77 78 79 80
    function setCurrentItem(index) {
        for (var i=0; i<_missionItems.count; i++) {
            _missionItems.get(i).isCurrentItem = (i == index)
        }
    }

81 82
    function updateHomePosition() {
        homePosition = liveHomePositionAvailable ? liveHomePosition : offlineHomePosition
Don Gagne's avatar
Don Gagne committed
83 84
        // Changing the coordinate will set the dirty bit, so we save and reset it
        var dirtyBit = _missionItems.dirty
85
        _missionItems.get(0).coordinate = homePosition
Don Gagne's avatar
Don Gagne committed
86 87 88
        _missionItems.dirty = dirtyBit
    }

89 90 91 92
    Component.onCompleted:              updateHomePosition()
    onOfflineHomePositionChanged:       updateHomePosition()
    onLiveHomePositionAvailableChanged: updateHomePosition()
    onLiveHomePositionChanged:          updateHomePosition()
Don Gagne's avatar
Don Gagne committed
93 94

    Connections {
95
        target: _controller
Don Gagne's avatar
Don Gagne committed
96

97 98
        // When the mission items change _missionsItems[0] changes as well so we need to reset it to home
        onMissionItemsChanged: updateHomePosition
Don Gagne's avatar
Don Gagne committed
99 100
    }

Don Gagne's avatar
Don Gagne committed
101 102 103
    QGCViewPanel {
        id:             panel
        anchors.fill:   parent
Don Gagne's avatar
Don Gagne committed
104

Don Gagne's avatar
Don Gagne committed
105
        Item {
Don Gagne's avatar
Don Gagne committed
106 107
            anchors.fill: parent

Don Gagne's avatar
Don Gagne committed
108 109 110 111 112 113 114
            FlightMap {
                id:             editorMap
                anchors.left:   parent.left
                anchors.right:  missionItemView.left
                anchors.top:    parent.top
                anchors.bottom: parent.bottom
                mapName:        "MissionEditor"
115 116

                Component.onCompleted: {
117 118
                    latitude = homePosition.latitude
                    longitude = homePosition.longitude
119
                }
Don Gagne's avatar
Don Gagne committed
120 121 122 123 124 125 126 127

                MouseArea {
                    anchors.fill: parent

                    onClicked: {
                        var coordinate = editorMap.toCoordinate(Qt.point(mouse.x, mouse.y))
                        coordinate.latitude = coordinate.latitude.toFixed(_decimalPlaces)
                        coordinate.longitude = coordinate.longitude.toFixed(_decimalPlaces)
128
                        coordinate.altitude = coordinate.altitude.toFixed(_decimalPlaces)
129
                        if (homePositionManagerButton.checked) {
130
                            offlineHomePosition = coordinate
131
                        } else if (addMissionItemsButton.checked) {
132
                            var index = _controller.addMissionItem(coordinate)
133 134
                            setCurrentItem(index)
                        }
Don Gagne's avatar
Don Gagne committed
135
                    }
Don Gagne's avatar
Don Gagne committed
136
                }
Don Gagne's avatar
Don Gagne committed
137

Don Gagne's avatar
Don Gagne committed
138 139 140
                Rectangle {
                    anchors.horizontalCenter:   parent.horizontalCenter
                    anchors.bottom:             parent.bottom
Don Gagne's avatar
Don Gagne committed
141
                    width:                      parent.width * 0.75
Don Gagne's avatar
Don Gagne committed
142 143 144 145 146
                    height:                     syncNeededText.height + (ScreenTools.defaultFontPixelWidth * 2)
                    border.width:               1
                    border.color:               "white"
                    color:                      "black"
                    opacity:                    0.75
147
                    visible:                    _controller.missionItems.dirty
Don Gagne's avatar
Don Gagne committed
148 149 150 151 152 153 154 155 156 157 158 159 160 161 162

                    QGCLabel {
                        id:                     syncNeededText
                        anchors.margins:        ScreenTools.defaultFontPixelWidth
                        anchors.top:            parent.top
                        anchors.left:           parent.left
                        anchors.right:          parent.right
                        wrapMode:               Text.WordWrap
                        horizontalAlignment:    Text.AlignHCenter
                        verticalAlignment:      Text.AlignVCenter
                        font.pixelSize:         ScreenTools.mediumFontPixelSize
                        text:                   "You have unsaved changes. Be sure to use the Sync tool to save when ready."
                    }
                }

163 164 165 166 167 168 169 170
                RoundButton {
                    id:                     addMissionItemsButton
                    anchors.rightMargin:    ScreenTools.defaultFontPixelWidth
                    anchors.right:          homePositionManagerButton.left
                    anchors.top:            helpButton.top
                    buttonImage:            "/qmlimages/MapAddMission.svg"
                    exclusiveGroup:         _dropButtonsExclusiveGroup
                }
171

172 173 174 175 176 177 178 179
                RoundButton {
                    id:                     homePositionManagerButton
                    anchors.rightMargin:    ScreenTools.defaultFontPixelWidth
                    anchors.right:          centerMapButton.left
                    anchors.top:            helpButton.top
                    buttonImage:            "/qmlimages/MapHome.svg"
                    exclusiveGroup:         _dropButtonsExclusiveGroup
                }
180

181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200
                DropButton {
                    id:                     centerMapButton
                    anchors.rightMargin:    ScreenTools.defaultFontPixelWidth
                    anchors.right:          syncButton.left
                    anchors.top:            helpButton.top
                    dropDirection:          dropDown
                    buttonImage:            "/qmlimages/MapCenter.svg"
                    viewportMargins:        ScreenTools.defaultFontPixelWidth / 2
                    exclusiveGroup:         _dropButtonsExclusiveGroup

                    dropDownComponent: Component {
                        Row {
                            spacing: ScreenTools.defaultFontPixelWidth

                            QGCButton {
                                text: "Home"

                                onClicked: {
                                    centerMapButton.hideDropDown()
                                    editorMap.center = QtPositioning.coordinate(homePosition.latitude, homePosition.longitude)
201
                                }
202
                            }
Don Gagne's avatar
Don Gagne committed
203

204 205 206
                            QGCButton {
                                text:       "Vehicle"
                                enabled:    activeVehicle && activeVehicle.latitude != 0 && activeVehicle.longitude != 0
207

208
                                property var activeVehicle: multiVehicleManager.activeVehicle
209

210 211 212 213
                                onClicked: {
                                    centerMapButton.hideDropDown()
                                    editorMap.latitude = activeVehicle.latitude
                                    editorMap.longitude = activeVehicle.longitude
214
                                }
215
                            }
216

217
                            /*
218 219

    This code will need to wait for Qml 5.5 support since Map.visibleRegion is only in Qt 5.5
220

221 222
                                QGCButton {
                                    text: "All Items"
223

224 225
                                    onClicked: {
                                        centerMapButton.hideDropDown()
Don Gagne's avatar
Don Gagne committed
226

227
                                        // Begin with only the home position in the region
228 229
                                        var region = QtPositioning.rectangle(QtPositioning.coordinate(homePosition.latitude, homePosition.longitude),
                                                                             QtPositioning.coordinate(homePosition.latitude, homePosition.longitude))
230

231 232 233
                                        // Now expand the region to include all mission items
                                        for (var i=0; i<_missionItems.count; i++) {
                                            var missionItem = _missionItems.get(i)
234

235 236
                                            region.topLeft.latitude = Math.max(missionItem.coordinate.latitude, region.topLeft.latitude)
                                            region.topLeft.longitude = Math.min(missionItem.coordinate.longitude, region.topLeft.longitude)
237

238 239
                                            region.topRight.latitude = Math.max(missionItem.coordinate.latitude, region.topRight.latitude)
                                            region.topRight.longitude = Math.max(missionItem.coordinate.longitude, region.topRight.longitude)
240

241 242
                                            region.bottomLeft.latitude = Math.min(missionItem.coordinate.latitude, region.bottomLeft.latitude)
                                            region.bottomLeft.longitude = Math.min(missionItem.coordinate.longitude, region.bottomLeft.longitude)
243

244 245 246
                                            region.bottomRight.latitude = Math.min(missionItem.coordinate.latitude, region.bottomRight.latitude)
                                            region.bottomRight.longitude = Math.max(missionItem.coordinate.longitude, region.bottomRight.longitude)
                                        }
247

248
                                        editorMap.visibleRegion = region
249 250
                                    }
                                }
251
    */
Don Gagne's avatar
Don Gagne committed
252 253
                        }
                    }
254
                }
Don Gagne's avatar
Don Gagne committed
255

256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276
                DropButton {
                    id:                     syncButton
                    anchors.rightMargin:    ScreenTools.defaultFontPixelWidth
                    anchors.right:          mapTypeButton.left
                    anchors.top:            helpButton.top
                    dropDirection:          dropDown
                    buttonImage:            "/qmlimages/MapSync.svg"
                    viewportMargins:        ScreenTools.defaultFontPixelWidth / 2
                    exclusiveGroup:         _dropButtonsExclusiveGroup

                    dropDownComponent: Component {
                        Row {
                            spacing: ScreenTools.defaultFontPixelWidth

                            QGCButton {
                                text:       "Load from vehicle"
                                enabled:    _activeVehicle && !_activeVehicle.missionManager.inProgress

                                onClicked: {
                                    syncButton.hideDropDown()
                                    _controller.getMissionItems()
277
                                }
278
                            }
279

280 281 282
                            QGCButton {
                                text:       "Save to vehicle"
                                enabled:    _activeVehicle && !_activeVehicle.missionManager.inProgress
283

284 285 286
                                onClicked: {
                                    syncButton.hideDropDown()
                                    _controller.setMissionItems()
287
                                }
288
                            }
289

290 291
                            QGCButton {
                                text:       "Load from file..."
292

293 294 295
                                onClicked: {
                                    syncButton.hideDropDown()
                                    _controller.loadMissionFromFile()
296
                                }
297
                            }
298

299 300
                            QGCButton {
                                text:       "Save to file..."
301

302 303 304
                                onClicked: {
                                    syncButton.hideDropDown()
                                    _controller.saveMissionToFile()
305 306 307 308
                                }
                            }
                        }
                    }
309
                }
Don Gagne's avatar
Don Gagne committed
310

311 312 313 314 315 316 317 318 319
                DropButton {
                    id:                     mapTypeButton
                    anchors.rightMargin:    ScreenTools.defaultFontPixelWidth
                    anchors.right:          helpButton.left
                    anchors.top:            helpButton.top
                    dropDirection:          dropDown
                    buttonImage:            "/qmlimages/MapType.svg"
                    viewportMargins:        ScreenTools.defaultFontPixelWidth / 2
                    exclusiveGroup:         _dropButtonsExclusiveGroup
320

321 322 323
                    dropDownComponent: Component {
                        Row {
                            spacing: ScreenTools.defaultFontPixelWidth
324

325 326 327 328 329 330 331 332 333 334 335 336 337
                            Repeater {
                                model: QGroundControl.flightMapSettings.mapTypes

                                QGCButton {
                                    checkable:      true
                                    checked:        editorMap.mapType == text
                                    text:           modelData
                                    exclusiveGroup: _mapTypeButtonsExclusiveGroup

                                    onClicked: {
                                        editorMap.mapType = text
                                        checked = true
                                        mapTypeButton.hideDropDown()
338 339
                                    }
                                }
Don Gagne's avatar
Don Gagne committed
340 341 342
                            }
                        }
                    }
343
                }
344

345 346 347 348 349 350 351
                RoundButton {
                    id:                     helpButton
                    anchors.margins:        ScreenTools.defaultFontPixelWidth
                    anchors.right:          parent.right
                    anchors.top:            parent.top
                    buttonImage:            "/qmlimages/Help.svg"
                    exclusiveGroup:         _dropButtonsExclusiveGroup
Don Gagne's avatar
Don Gagne committed
352 353
                }

Don Gagne's avatar
Don Gagne committed
354 355
                // Add the mission items to the map
                MapItemView {
356
                    model: _controller.missionItems
Don Gagne's avatar
Don Gagne committed
357 358 359
                    
                    delegate:
                        MissionItemIndicator {
Don Gagne's avatar
Don Gagne committed
360
                            id:             itemIndicator
361 362
                            label:          object.sequenceNumber == 0 ? (liveHomePositionAvailable ? "H" : "F") : object.sequenceNumber
                            isCurrentItem:  !homePositionManagerButton.checked && object.isCurrentItem
Don Gagne's avatar
Don Gagne committed
363
                            coordinate:     object.coordinate
364
                            z:              2
Don Gagne's avatar
Don Gagne committed
365
                            visible:        object.specifiesCoordinate
Don Gagne's avatar
Don Gagne committed
366

Don Gagne's avatar
Don Gagne committed
367 368
                            onClicked: {
                                setCurrentItem(object.sequenceNumber)
369
                                missionItemEditorButton.checked
Don Gagne's avatar
Don Gagne committed
370
                            }
371

Don Gagne's avatar
Don Gagne committed
372 373 374
                            Row {
                                anchors.top:    parent.top
                                anchors.left:   parent.right
375

Don Gagne's avatar
Don Gagne committed
376 377
                                Repeater {
                                    model: object.childItems
378

Don Gagne's avatar
Don Gagne committed
379 380 381
                                    delegate:
                                        MissionItemIndexLabel {
                                            label:          object.sequenceNumber
382
                                            isCurrentItem:  !homePositionManagerButton.checked && object.isCurrentItem
Don Gagne's avatar
Don Gagne committed
383
                                            z:              2
384

Don Gagne's avatar
Don Gagne committed
385 386
                                            onClicked: {
                                                setCurrentItem(object.sequenceNumber)
387
                                                missionItemEditorButton.checked
Don Gagne's avatar
Don Gagne committed
388
                                            }
389

Don Gagne's avatar
Don Gagne committed
390 391 392 393
                                        }
                                }
                            }
                        }
394 395 396 397
                }

                // Add lines between waypoints
                MapItemView {
398
                    model: _controller.waypointLines
399 400 401 402

                    delegate:
                        MapPolyline {
                            line.width: 3
403
                            line.color: _qgcPal.mapButtonHighlight
404 405 406 407 408 409
                            z:          1

                            path: [
                                { latitude: object.coordinate1.latitude, longitude: object.coordinate1.longitude },
                                { latitude: object.coordinate2.latitude, longitude: object.coordinate2.longitude },
                            ]
Don Gagne's avatar
Don Gagne committed
410 411 412 413 414 415 416 417 418 419 420 421 422 423 424
                        }
                }

                Column {
                    id:                 controlWidgets
                    anchors.margins:    ScreenTools.defaultFontPixelWidth
                    anchors.right:      parent.left
                    anchors.bottom:     parent.top
                    spacing:            ScreenTools.defaultFontPixelWidth / 2

                    QGCButton {
                        id:         addMode
                        text:       "+"
                        checkable:  true
                    }
Don Gagne's avatar
Don Gagne committed
425
                }
Don Gagne's avatar
Don Gagne committed
426 427 428 429 430 431 432 433
            } // FlightMap

            Rectangle {
                id:                 missionItemView
                anchors.right:      parent.right
                anchors.top:        parent.top
                anchors.bottom:     parent.bottom
                width:              ScreenTools.defaultFontPixelWidth * 30
434
                color:              _qgcPal.window
Don Gagne's avatar
Don Gagne committed
435 436 437 438 439

                Item {
                    anchors.margins:    _verticalMargin
                    anchors.fill:       parent

440 441
                    // Mission Item Editor
                    Item {
442
                        id:             missionItemEditor
443
                        anchors.fill:   parent
444
                        visible:        !helpButton.checked && !homePositionManagerButton.checked && _missionItems.count > 1
445 446 447 448 449 450

                        ListView {
                            id:             missionItemSummaryList
                            anchors.fill:   parent
                            spacing:        _verticalMargin
                            orientation:    ListView.Vertical
451
                            model:          _controller.canEdit ? _controller.missionItems : 0
452 453 454 455 456 457 458

                            property real _maxItemHeight: 0

                            delegate:
                                MissionItemEditor {
                                    missionItem:    object
                                    width:          parent.width
459
                                    readOnly:       object.sequenceNumber == 0 && liveHomePositionAvailable
460 461 462 463 464

                                    onClicked:  setCurrentItem(object.sequenceNumber)

                                    onRemove: {
                                        var newCurrentItem = object.sequenceNumber - 1
465
                                        _controller.removeMissionItem(object.sequenceNumber)
Don Gagne's avatar
Don Gagne committed
466
                                        if (_missionItems.count > 1) {
467 468 469
                                            newCurrentItem = Math.min(_missionItems.count - 1, newCurrentItem)
                                            setCurrentItem(newCurrentItem)
                                        }
470 471
                                    }
                                }
472
                        } // ListView
473

474 475
                        QGCLabel {
                            anchors.fill:   parent
476
                            visible:        !_controller.canEdit
477 478 479 480 481
                            wrapMode:       Text.WordWrap
                            text:           "The set of mission items you have loaded cannot be edited by QGroundControl. " +
                                            "You will only be able to save these to a file, or send them to a vehicle."
                        }
                    } // Item - Mission Item editor
Don Gagne's avatar
Don Gagne committed
482

483 484
                    // Home Position Manager
                    Item {
485
                        id:             homePositionManager
486
                        anchors.fill:   parent
487
                        visible:        homePositionManagerButton.checked
488 489

                        Column {
490 491
                            anchors.fill:   parent
                            visible:        !liveHomePositionAvailable
492 493 494

                            QGCLabel {
                                font.pixelSize: ScreenTools.mediumFontPixelSize
495
                                text:           "Flying Field Manager"
496 497 498 499 500 501 502 503
                            }

                            Item {
                                width: 10
                                height: ScreenTools.defaultFontPixelHeight
                            }

                            QGCLabel {
504 505
                                width:      parent.width
                                wrapMode:   Text.WordWrap
506
                                text:       "This is used to save locations associated with your flying field for use while creating missions with no vehicle connection."
507 508 509 510 511 512 513 514
                            }

                            Item {
                                width: 10
                                height: ScreenTools.defaultFontPixelHeight
                            }

                            QGCLabel {
515
                                text:       "Select field to use:"
516 517 518 519 520 521 522 523 524 525 526 527
                            }

                            QGCComboBox {
                                id:         homePosCombo
                                width:      parent.width
                                textRole:   "text"
                                model:      _homePositionManager.homePositions

                                onCurrentIndexChanged: {
                                    if (currentIndex != -1) {
                                        var homePos = _homePositionManager.homePositions.get(currentIndex)
                                        _homePositionName = homePos.name
528 529 530
                                        offlineHomePosition = homePos.coordinate
                                        editorMap.latitude = offlineHomePosition.latitude
                                        editorMap.longitude = offlineHomePosition.longitude
531 532 533 534 535 536 537 538 539 540 541 542
                                    }
                                }
                            }

                            Item {
                                width: 10
                                height: ScreenTools.defaultFontPixelHeight
                            }

                            QGCLabel {
                                width:      parent.width
                                wrapMode:   Text.WordWrap
543
                                text:       "To add a new flying field, click on the Map to set the position. " +
544
                                            "Then give it a new name and click Add/Update. " +
545
                                            "To change the current field position, click on the Map to set the new position. " +
546
                                            "Then click Add/Update without changing the name."
547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577
                            }

                            Item {
                                width: 10
                                height: ScreenTools.defaultFontPixelHeight / 3
                            }

                            Item {
                                width:  parent.width
                                height: nameField.height

                                QGCLabel {
                                    anchors.baseline:   nameField.baseline
                                    text:               "Name:"
                                }

                                QGCTextField {
                                    id:             nameField
                                    anchors.right:  parent.right
                                    width:          _editFieldWidth
                                    text:           _homePositionName
                                }
                            }

                            Item {
                                width: 10
                                height: ScreenTools.defaultFontPixelHeight / 3
                            }

                            Item {
                                width:  parent.width
578
                                height: offlineLatitudeField.height
579 580

                                QGCLabel {
581
                                    anchors.baseline:   offlineLatitudeField.baseline
582 583 584 585
                                    text:               "Lat:"
                                }

                                QGCTextField {
586
                                    id:             offlineLatitudeField
587 588
                                    anchors.right:  parent.right
                                    width:          _editFieldWidth
589
                                    text:           offlineHomePosition.latitude
590 591 592 593 594 595 596 597 598 599
                                }
                            }

                            Item {
                                width: 10
                                height: ScreenTools.defaultFontPixelHeight / 3
                            }

                            Item {
                                width:  parent.width
600
                                height: offlineLongitudeField.height
601 602

                                QGCLabel {
603
                                    anchors.baseline:   offlineLongitudeField.baseline
604 605 606 607
                                    text:               "Lon:"
                                }

                                QGCTextField {
608
                                    id:             offlineLongitudeField
609 610
                                    anchors.right:  parent.right
                                    width:          _editFieldWidth
611
                                    text:           offlineHomePosition.longitude
612 613 614 615 616 617 618 619 620 621
                                }
                            }

                            Item {
                                width: 10
                                height: ScreenTools.defaultFontPixelHeight / 3
                            }

                            Item {
                                width:  parent.width
622
                                height: offlineAltitudeField.height
623 624

                                QGCLabel {
625
                                    anchors.baseline:   offlineAltitudeField.baseline
626 627 628 629
                                    text:               "Alt:"
                                }

                                QGCTextField {
630
                                    id:             offlineAltitudeField
631 632
                                    anchors.right:  parent.right
                                    width:          _editFieldWidth
633
                                    text:           offlineHomePosition.altitude
634 635 636 637 638 639 640 641 642 643 644 645 646 647 648
                                }
                            }

                            Item {
                                width: 10
                                height: ScreenTools.defaultFontPixelHeight
                            }

                            Row {
                                spacing: ScreenTools.defaultFontPixelWidth

                                QGCButton {
                                    text: "Add/Update"

                                    onClicked: {
649 650
                                        offlineHomePosition = QtPositioning.coordinate(latitudeField.text, longitudeField.text, altitudeField.text)
                                        _homePositionManager.updateHomePosition(nameField.text, offlineHomePosition)
651 652 653 654 655 656 657 658 659 660 661 662 663
                                        homePosCombo.currentIndex = homePosCombo.find(nameField.text)
                                    }
                                }

                                QGCButton {
                                    text: "Delete"

                                    onClicked: {
                                        homePosCombo.currentIndex = -1
                                        _homePositionManager.deleteHomePosition(nameField.text)
                                        homePosCombo.currentIndex = 0
                                        var homePos = _homePositionManager.homePositions.get(0)
                                        _homePositionName = homePos.name
664
                                        offlineHomePosition = homePos.coordinate
665 666 667
                                    }
                                }
                            }
668 669 670 671 672 673 674 675 676 677 678 679 680 681 682 683 684 685 686 687 688 689 690 691 692 693 694 695 696 697 698 699 700 701 702 703 704 705 706 707 708 709 710 711 712 713 714 715 716 717 718 719 720 721 722 723 724 725 726 727 728 729 730 731 732 733 734 735 736 737 738 739 740 741 742 743 744 745
                        } // Column - Offline view

                        Column {
                            anchors.fill:   parent
                            visible:        liveHomePositionAvailable

                            QGCLabel {
                                font.pixelSize: ScreenTools.mediumFontPixelSize
                                text:           "Vehicle Home Position"
                            }

                            Item {
                                width: 10
                                height: ScreenTools.defaultFontPixelHeight
                            }

                            Item {
                                width:  parent.width
                                height: liveLatitudeField.height

                                QGCLabel {
                                    anchors.baseline:   liveLatitudeField.baseline
                                    text:               "Lat:"
                                }

                                QGCLabel {
                                    id:             liveLatitudeField
                                    anchors.right:  parent.right
                                    width:          _editFieldWidth
                                    text:           liveHomePosition.latitude
                                }
                            }

                            Item {
                                width: 10
                                height: ScreenTools.defaultFontPixelHeight / 3
                            }

                            Item {
                                width:  parent.width
                                height: liveLongitudeField.height

                                QGCLabel {
                                    anchors.baseline:   liveLongitudeField.baseline
                                    text:               "Lon:"
                                }

                                QGCLabel {
                                    id:             liveLongitudeField
                                    anchors.right:  parent.right
                                    width:          _editFieldWidth
                                    text:           liveHomePosition.longitude
                                }
                            }

                            Item {
                                width: 10
                                height: ScreenTools.defaultFontPixelHeight / 3
                            }

                            Item {
                                width:  parent.width
                                height: liveAltitudeField.height

                                QGCLabel {
                                    anchors.baseline:   liveAltitudeField.baseline
                                    text:               "Alt:"
                                }

                                QGCLabel {
                                    id:             liveAltitudeField
                                    anchors.right:  parent.right
                                    width:          _editFieldWidth
                                    text:           liveHomePosition.altitude
                                }
                            }
                        } // Column - Online view

746 747
                    } // Item - Home Position Manager

748 749
                    // Help Panel
                    Item {
750
                        id:             helpPanel
751
                        anchors.fill:   parent
752
                        visible:        !homePositionManagerButton.checked && (_missionItems.count == 1 || helpButton.checked)
753 754 755 756 757 758 759 760 761 762 763 764 765

                        QGCLabel {
                            id:             helpTitle
                            font.pixelSize: ScreenTools.mediumFontPixelSize
                            text:           "Mission Planner"
                        }

                        QGCLabel {
                            id:                 helpIconLabel
                            anchors.topMargin:  ScreenTools.defaultFontPixelHeight
                            anchors.top:        helpTitle.bottom
                            width:              parent.width
                            wrapMode:           Text.WordWrap
dogmaphobic's avatar
dogmaphobic committed
766
                            text:               "Mission Planner tool buttons:"
767 768
                        }

dogmaphobic's avatar
dogmaphobic committed
769 770 771 772 773 774 775 776 777
                        Image {
                            id:                 addMissionItemsHelpIcon
                            anchors.topMargin:  ScreenTools.defaultFontPixelHeight
                            anchors.top:        helpIconLabel.bottom
                            width:              ScreenTools.defaultFontPixelHeight * 3
                            fillMode:           Image.PreserveAspectFit
                            mipmap:             true
                            smooth:             true
                            source:             "/qmlimages/MapAddMission.svg"
778 779 780 781 782 783 784 785 786
                        }

                        QGCLabel {
                            id:                 addMissionItemsHelpText
                            anchors.leftMargin: ScreenTools.defaultFontPixelHeight
                            anchors.left:       mapTypeHelpIcon.right
                            anchors.right:      parent.right
                            anchors.top:        addMissionItemsHelpIcon.top
                            wrapMode:           Text.WordWrap
dogmaphobic's avatar
dogmaphobic committed
787 788
                            text:               "<b>Add Mission Items</b><br>" +
                                                "When enabled, add mission items by clicking on the map."
789 790
                        }

dogmaphobic's avatar
dogmaphobic committed
791 792 793 794 795 796 797 798 799
                        Image {
                            id:                 homePositionManagerHelpIcon
                            anchors.topMargin:  ScreenTools.defaultFontPixelHeight
                            anchors.top:        addMissionItemsHelpText.bottom
                            width:              ScreenTools.defaultFontPixelHeight * 3
                            fillMode:           Image.PreserveAspectFit
                            mipmap:             true
                            smooth:             true
                            source:             "/qmlimages/MapHome.svg"
800 801 802 803 804 805 806 807 808
                        }

                        QGCLabel {
                            id:                 homePositionManagerHelpText
                            anchors.leftMargin: ScreenTools.defaultFontPixelHeight
                            anchors.left:       mapTypeHelpIcon.right
                            anchors.right:      parent.right
                            anchors.top:        homePositionManagerHelpIcon.top
                            wrapMode:           Text.WordWrap
809 810 811
                            text:               "<b>Flying Field Manager</b><br>" +
                                                "When enabled, allows you to select/add/update flying field locations. " +
                                                "You can save multiple flying field locations for use while creating missions while you are not connected to your vehicle."
812 813 814 815 816 817 818 819 820 821 822 823 824 825 826 827 828 829 830 831
                        }

                        Image {
                            id:                 mapCenterHelpIcon
                            anchors.topMargin:  ScreenTools.defaultFontPixelHeight
                            anchors.top:        homePositionManagerHelpText.bottom
                            width:              ScreenTools.defaultFontPixelHeight * 3
                            fillMode:           Image.PreserveAspectFit
                            mipmap:             true
                            smooth:             true
                            source:             "/qmlimages/MapCenter.svg"
                        }

                        QGCLabel {
                            id:                 mapCenterHelpText
                            anchors.leftMargin: ScreenTools.defaultFontPixelHeight
                            anchors.left:       mapTypeHelpIcon.right
                            anchors.right:      parent.right
                            anchors.top:        mapCenterHelpIcon.top
                            wrapMode:           Text.WordWrap
dogmaphobic's avatar
dogmaphobic committed
832 833
                            text:               "<b>Map Center</b><br>" +
                                                "Options for centering the map."
834 835 836 837 838 839 840 841 842 843
                        }

                        Image {
                            id:                 syncHelpIcon
                            anchors.topMargin:  ScreenTools.defaultFontPixelHeight
                            anchors.top:        mapCenterHelpText.bottom
                            width:              ScreenTools.defaultFontPixelHeight * 3
                            fillMode:           Image.PreserveAspectFit
                            mipmap:             true
                            smooth:             true
dogmaphobic's avatar
dogmaphobic committed
844
                            source:             "/qmlimages/MapSync.svg"
845 846 847 848 849 850 851 852 853
                        }

                        QGCLabel {
                            id:                 syncHelpText
                            anchors.leftMargin: ScreenTools.defaultFontPixelHeight
                            anchors.left:       mapTypeHelpIcon.right
                            anchors.right:      parent.right
                            anchors.top:        syncHelpIcon.top
                            wrapMode:           Text.WordWrap
dogmaphobic's avatar
dogmaphobic committed
854 855
                            text:               "<b>Sync</b><br>" +
                                                "Options for saving/loading mission items."
856 857 858 859 860 861 862 863 864 865 866 867 868 869 870 871 872 873 874 875
                        }

                        Image {
                            id:                 mapTypeHelpIcon
                            anchors.topMargin:  ScreenTools.defaultFontPixelHeight
                            anchors.top:        syncHelpText.bottom
                            width:              ScreenTools.defaultFontPixelHeight * 3
                            fillMode:           Image.PreserveAspectFit
                            mipmap:             true
                            smooth:             true
                            source:             "/qmlimages/MapType.svg"
                        }

                        QGCLabel {
                            id:                 mapTypeHelpText
                            anchors.leftMargin: ScreenTools.defaultFontPixelHeight
                            anchors.left:       mapTypeHelpIcon.right
                            anchors.right:      parent.right
                            anchors.top:        mapTypeHelpIcon.top
                            wrapMode:           Text.WordWrap
dogmaphobic's avatar
dogmaphobic committed
876 877
                            text:               "<b>Map Type</b><br>" +
                                                "Map type options."
878 879
                        }
                    } // Item - Help Panel
Don Gagne's avatar
Don Gagne committed
880 881 882 883 884
                } // Item
            } // Rectangle - mission item list
        } // Item - split view container
    } // QGCViewPanel
} // QGCVIew