MissionEditor.qml 45 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
    // zOrder comes from the Loader in MainWindow.qml
Gus Grubba's avatar
Gus Grubba committed
44
    z: QGroundControl.zOrderTopMost
45

46 47 48 49 50 51 52 53 54
    readonly property int       _decimalPlaces:     8
    readonly property real      _horizontalMargin:  ScreenTools.defaultFontPixelWidth / 2
    readonly property real      _margin:            ScreenTools.defaultFontPixelHeight / 2
    readonly property var       _activeVehicle:     multiVehicleManager.activeVehicle
    readonly property real      _editFieldWidth:    ScreenTools.defaultFontPixelWidth * 16
    readonly property real      _rightPanelWidth:   ScreenTools.defaultFontPixelWidth * 30
    readonly property real      _rightPanelOpacity: 0.8
    readonly property int       _toolButtonCount:   6
    readonly property string    _autoSyncKey:       "AutoSync"
Don Gagne's avatar
Don Gagne committed
55
    readonly property string    _showHelpKey:       "ShowHelp"
56
    readonly property int       _addMissionItemsButtonAutoOffTimeout:   10000
57
    readonly property var       _defaultVehicleCoordinate:   QtPositioning.coordinate(37.803784, -122.462276)
58 59

    property var    _missionItems:              controller.missionItems
60

61 62
    //property var    _homePositionManager:       QGroundControl.homePositionManager
    //property string _homePositionName:          _homePositionManager.homePositions.get(0).name
63
    //property var    offlineHomePosition:        _homePositionManager.homePositions.get(0).coordinate
64

65 66
    property var    liveHomePosition:           controller.liveHomePosition
    property var    liveHomePositionAvailable:  controller.liveHomePositionAvailable
67
    property var    homePosition:               _defaultVehicleCoordinate
68

69 70
    property bool _syncNeeded:                  controller.missionItems.dirty
    property bool _syncInProgress:              _activeVehicle ? _activeVehicle.missionManager.inProgress : false
71

Don Gagne's avatar
Don Gagne committed
72 73
    property bool _showHelp:                    QGroundControl.flightMapSettings.loadBoolMapSetting(editorMap.mapName, _showHelpKey, true)

74
    MissionController {
75
        id:         controller
76 77

        Component.onCompleted: start(true /* editMode */)
78 79 80
/*
        FIXME: autoSync is temporarily disconnected since it's still buggy

81 82 83
        autoSync:   QGroundControl.flightMapSettings.loadMapSetting(editorMap.mapName, _autoSyncKey, true)

        onAutoSyncChanged:      QGroundControl.flightMapSettings.saveMapSetting(editorMap.mapName, _autoSyncKey, autoSync)
84
*/
85 86 87 88 89 90

        onMissionItemsChanged:  {
            updateHomePosition()
            itemEditor.clearItem()
        }
    }
91

92
    QGCPalette { id: qgcPal; colorGroupEnabled: enabled }
Don Gagne's avatar
Don Gagne committed
93

94 95 96 97 98 99
    ExclusiveGroup {
        id: _mapTypeButtonsExclusiveGroup
    }

    ExclusiveGroup {
        id: _dropButtonsExclusiveGroup
100 101
    }

102 103 104 105 106 107
    function setCurrentItem(index) {
        for (var i=0; i<_missionItems.count; i++) {
            _missionItems.get(i).isCurrentItem = (i == index)
        }
    }

108
    function updateHomePosition() {
109
        if (liveHomePositionAvailable) {
110
            homePosition = liveHomePosition
111 112 113
            _missionItems.get(0).coordinate = liveHomePosition
            _missionItems.get(0).homePositionValid = true
        }
Don Gagne's avatar
Don Gagne committed
114 115
    }

116
    Component.onCompleted:              updateHomePosition()
117
    //onOfflineHomePositionChanged:       updateHomePosition()
118 119
    onLiveHomePositionAvailableChanged: updateHomePosition()
    onLiveHomePositionChanged:          updateHomePosition()
Don Gagne's avatar
Don Gagne committed
120

Don Gagne's avatar
Don Gagne committed
121 122 123
    QGCViewPanel {
        id:             panel
        anchors.fill:   parent
Don Gagne's avatar
Don Gagne committed
124

Don Gagne's avatar
Don Gagne committed
125
        Item {
Don Gagne's avatar
Don Gagne committed
126 127
            anchors.fill: parent

Don Gagne's avatar
Don Gagne committed
128 129
            FlightMap {
                id:             editorMap
130
                anchors.fill:   parent
Don Gagne's avatar
Don Gagne committed
131
                mapName:        "MissionEditor"
132 133
                latitude:       tabletPosition.latitude
                longitude:      tabletPosition.longitude
Don Gagne's avatar
Don Gagne committed
134

135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157
                readonly property real animationDuration: 500

                Behavior on zoomLevel {
                    NumberAnimation {
                        duration:       editorMap.animationDuration
                        easing.type:    Easing.InOutQuad
                    }
                }

                Behavior on latitude {
                    NumberAnimation {
                        duration:       editorMap.animationDuration
                        easing.type:    Easing.InOutQuad
                    }
                }

                Behavior on longitude {
                    NumberAnimation {
                        duration:       editorMap.animationDuration
                        easing.type:    Easing.InOutQuad
                    }
                }

Don Gagne's avatar
Don Gagne committed
158 159 160 161 162 163 164
                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)
165
                        coordinate.altitude = coordinate.altitude.toFixed(_decimalPlaces)
166 167
                        if (false /*homePositionManagerButton.checked*/) {
                            //offlineHomePosition = coordinate
168
                        } else if (addMissionItemsButton.checked) {
169
                            var index = controller.addMissionItem(coordinate)
170
                            addMissionItemsButtonAutoOffTimer.start()
171
                            setCurrentItem(index)
172 173
                        } else {
                            editorMap.zoomLevel = editorMap.maxZoomLevel - 2
174
                        }
Don Gagne's avatar
Don Gagne committed
175
                    }
Don Gagne's avatar
Don Gagne committed
176
                }
Don Gagne's avatar
Don Gagne committed
177

178 179 180 181 182 183 184 185
                // We use this item to support dragging since dragging a MapQuickItem just doesn't seem to work
                Item {
                    id:         itemEditor
                    x:          missionItemIndicator ? (missionItemIndicator.x + missionItemIndicator.anchorPoint.x - (itemEditor.width / 2)) : 100
                    y:          missionItemIndicator ? (missionItemIndicator.y + missionItemIndicator.anchorPoint.y - (itemEditor.height / 2)) : 100
                    width:      ScreenTools.defaultFontPixelHeight * 7
                    height:     ScreenTools.defaultFontPixelHeight * 7
                    visible:    false
Gus Grubba's avatar
Gus Grubba committed
186
                    z:          QGroundControl.zOrderMapItems + 1    // Above item icons
187 188 189 190 191

                    property var    missionItem
                    property var    missionItemIndicator
                    property real   heading: missionItem ? missionItem.heading : 0

192 193 194 195 196 197
                    function clearItem() {
                        itemEditor.visible = false
                        itemEditor.missionItem = undefined
                        itemEditor.missionItemIndicator = undefined
                    }

198 199 200 201 202 203 204 205 206
                    Drag.active:    itemDrag.drag.active
                    Drag.hotSpot.x: width  / 2
                    Drag.hotSpot.y: height / 2

                    MissionItemIndexLabel {
                        x:              (itemEditor.width / 2) - (width / 2)
                        y:              (itemEditor.height / 2) - (height / 2)
                        label:          itemEditor.missionItemIndicator ? itemEditor.missionItemIndicator.label : ""
                        isCurrentItem:  true
207
                    }
208

209 210 211 212
                    MouseArea {
                        id:             itemDrag
                        anchors.fill:   parent
                        drag.target:    parent
213

214
                        property bool dragActive: drag.active
215

216 217 218
                        onDragActiveChanged: {
                            if (!drag.active) {
                                var point = Qt.point(itemEditor.x + (itemEditor.width  / 2), itemEditor.y + (itemEditor.height / 2))
Don Gagne's avatar
Don Gagne committed
219 220 221
                                var coordinate = editorMap.toCoordinate(point)
                                coordinate.altitude = itemEditor.missionItem.coordinate.altitude
                                itemEditor.missionItem.coordinate = coordinate
Don Gagne's avatar
Don Gagne committed
222 223 224
                            }
                        }
                    }
225
                }
226

Don Gagne's avatar
Don Gagne committed
227
                // Add the mission items to the map
228 229 230
                MissionItemView {
                    model:          controller.missionItems
                    itemDragger:    itemEditor
231 232 233
                }

                // Add lines between waypoints
234 235
                MissionLineView {
                    model:          controller.waypointLines
Don Gagne's avatar
Don Gagne committed
236 237
                }

238
                // Mission Item Editor
Don Gagne's avatar
Don Gagne committed
239
                Item {
240 241 242 243 244
                    id:             missionItemEditor
                    anchors.top:    parent.top
                    anchors.bottom: parent.bottom
                    anchors.right:  parent.right
                    width:          _rightPanelWidth
245
                    visible:        _missionItems.count > 1
246
                    opacity:        _rightPanelOpacity
Gus Grubba's avatar
Gus Grubba committed
247
                    z:              QGroundControl.zOrderTopMost
248 249 250

                    ListView {
                        id:             missionItemSummaryList
251
                        anchors.fill:   parent
252 253
                        spacing:        _margin / 2
                        orientation:    ListView.Vertical
254
                        model:          controller.canEdit ? controller.missionItems : 0
255 256 257 258 259 260 261

                        property real _maxItemHeight: 0

                        delegate:
                            MissionItemEditor {
                            missionItem:    object
                            width:          parent.width
262 263
                            readOnly:       object.sequenceNumber == 0
                            visible:        !readOnly || object.homePositionValid
264 265 266 267 268

                            onClicked:  setCurrentItem(object.sequenceNumber)

                            onRemove: {
                                var newCurrentItem = object.sequenceNumber - 1
269
                                controller.removeMissionItem(object.sequenceNumber)
270 271 272
                                if (_missionItems.count > 1) {
                                    newCurrentItem = Math.min(_missionItems.count - 1, newCurrentItem)
                                    setCurrentItem(newCurrentItem)
273
                                }
274
                            }
275
                        }
276
                    } // ListView
Don Gagne's avatar
Don Gagne committed
277

278
                    QGCLabel {
279
                        anchors.fill:   parent
280
                        visible:        !controller.canEdit
281 282 283 284 285
                        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
286

287 288
                /*
                  Home Position Manager temporarily disbled till more work is done on it
289

290 291 292 293 294 295 296 297 298 299
                // Home Position Manager
                Rectangle {
                    id:             homePositionManager
                    anchors.top:    parent.top
                    anchors.bottom: parent.bottom
                    anchors.right:  parent.right
                    width:          _rightPanelWidth
                    visible:        homePositionManagerButton.checked
                    color:          qgcPal.window
                    opacity:        _rightPanelOpacity
Gus Grubba's avatar
Gus Grubba committed
300
                    z:              QGroundControl.zOrderTopMost
301 302 303 304 305

                    Column {
                        anchors.margins:    _margin
                        anchors.fill:       parent
                        visible:            !liveHomePositionAvailable
306

307 308 309 310
                        QGCLabel {
                            font.pixelSize: ScreenTools.mediumFontPixelSize
                            text:           "Flying Field Manager"
                        }
311

312 313 314 315
                        Item {
                            width: 10
                            height: ScreenTools.defaultFontPixelHeight
                        }
316

317 318 319 320 321
                        QGCLabel {
                            width:      parent.width
                            wrapMode:   Text.WordWrap
                            text:       "This is used to save locations associated with your flying field for use while creating missions with no vehicle connection."
                        }
322

323 324 325 326
                        Item {
                            width: 10
                            height: ScreenTools.defaultFontPixelHeight
                        }
327

328 329 330
                        QGCLabel {
                            text:       "Select field to use:"
                        }
331

332 333 334 335 336 337 338 339 340 341 342 343 344
                        QGCComboBox {
                            id:         homePosCombo
                            width:      parent.width
                            textRole:   "text"
                            model:      _homePositionManager.homePositions

                            onCurrentIndexChanged: {
                                if (currentIndex != -1) {
                                    var homePos = _homePositionManager.homePositions.get(currentIndex)
                                    _homePositionName = homePos.name
                                    offlineHomePosition = homePos.coordinate
                                    editorMap.latitude = offlineHomePosition.latitude
                                    editorMap.longitude = offlineHomePosition.longitude
345 346
                                }
                            }
347
                        }
348

349 350 351 352
                        Item {
                            width: 10
                            height: ScreenTools.defaultFontPixelHeight
                        }
353

354 355 356 357 358 359 360 361
                        QGCLabel {
                            width:      parent.width
                            wrapMode:   Text.WordWrap
                            text:       "To add a new flying field, click on the Map to set the position. " +
                                        "Then give it a new name and click Add/Update. " +
                                        "To change the current field position, click on the Map to set the new position. " +
                                        "Then click Add/Update without changing the name."
                        }
362

363 364 365 366
                        Item {
                            width: 10
                            height: ScreenTools.defaultFontPixelHeight / 3
                        }
367

368 369 370
                        Item {
                            width:  parent.width
                            height: nameField.height
371

372 373 374
                            QGCLabel {
                                anchors.baseline:   nameField.baseline
                                text:               "Name:"
375 376
                            }

377 378 379 380 381
                            QGCTextField {
                                id:             nameField
                                anchors.right:  parent.right
                                width:          _editFieldWidth
                                text:           _homePositionName
382
                            }
383
                        }
384

385 386 387 388
                        Item {
                            width: 10
                            height: ScreenTools.defaultFontPixelHeight / 3
                        }
389

390 391 392
                        Item {
                            width:  parent.width
                            height: offlineLatitudeField.height
393

394 395 396
                            QGCLabel {
                                anchors.baseline:   offlineLatitudeField.baseline
                                text:               "Lat:"
397 398
                            }

399 400 401 402 403
                            QGCTextField {
                                id:             offlineLatitudeField
                                anchors.right:  parent.right
                                width:          _editFieldWidth
                                text:           offlineHomePosition.latitude
404
                            }
405
                        }
406

407 408 409 410
                        Item {
                            width: 10
                            height: ScreenTools.defaultFontPixelHeight / 3
                        }
411

412 413 414
                        Item {
                            width:  parent.width
                            height: offlineLongitudeField.height
415

416 417 418
                            QGCLabel {
                                anchors.baseline:   offlineLongitudeField.baseline
                                text:               "Lon:"
419 420
                            }

421 422 423 424 425
                            QGCTextField {
                                id:             offlineLongitudeField
                                anchors.right:  parent.right
                                width:          _editFieldWidth
                                text:           offlineHomePosition.longitude
426
                            }
427
                        }
428

429 430 431 432
                        Item {
                            width: 10
                            height: ScreenTools.defaultFontPixelHeight / 3
                        }
433

434 435 436
                        Item {
                            width:  parent.width
                            height: offlineAltitudeField.height
437

438 439 440
                            QGCLabel {
                                anchors.baseline:   offlineAltitudeField.baseline
                                text:               "Alt:"
441 442
                            }

443 444 445 446 447
                            QGCTextField {
                                id:             offlineAltitudeField
                                anchors.right:  parent.right
                                width:          _editFieldWidth
                                text:           offlineHomePosition.altitude
448
                            }
449
                        }
450

451 452 453 454
                        Item {
                            width: 10
                            height: ScreenTools.defaultFontPixelHeight
                        }
455

456 457
                        Row {
                            spacing: ScreenTools.defaultFontPixelWidth
458

459 460
                            QGCButton {
                                text: "Add/Update"
461

462 463 464 465
                                onClicked: {
                                    offlineHomePosition = QtPositioning.coordinate(latitudeField.text, longitudeField.text, altitudeField.text)
                                    _homePositionManager.updateHomePosition(nameField.text, offlineHomePosition)
                                    homePosCombo.currentIndex = homePosCombo.find(nameField.text)
466 467
                                }
                            }
468

469 470
                            QGCButton {
                                text: "Delete"
471

472 473 474 475 476 477 478 479
                                onClicked: {
                                    homePosCombo.currentIndex = -1
                                    _homePositionManager.deleteHomePosition(nameField.text)
                                    homePosCombo.currentIndex = 0
                                    var homePos = _homePositionManager.homePositions.get(0)
                                    _homePositionName = homePos.name
                                    offlineHomePosition = homePos.coordinate
                                }
480
                            }
481 482
                        }
                    } // Column - Offline view
483

484 485 486 487
                    Column {
                        anchors.margins:    _margin
                        anchors.fill:       parent
                        visible:            liveHomePositionAvailable
488

489 490 491 492
                        QGCLabel {
                            font.pixelSize: ScreenTools.mediumFontPixelSize
                            text:           "Vehicle Home Position"
                        }
493

494 495 496 497
                        Item {
                            width: 10
                            height: ScreenTools.defaultFontPixelHeight
                        }
498

499 500 501 502 503 504 505
                        Item {
                            width:  parent.width
                            height: liveLatitudeField.height

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

508 509 510 511 512
                            QGCLabel {
                                id:             liveLatitudeField
                                anchors.right:  parent.right
                                width:          _editFieldWidth
                                text:           liveHomePosition.latitude
513
                            }
514
                        }
515

516 517 518 519
                        Item {
                            width: 10
                            height: ScreenTools.defaultFontPixelHeight / 3
                        }
520

521 522 523
                        Item {
                            width:  parent.width
                            height: liveLongitudeField.height
524

525 526 527
                            QGCLabel {
                                anchors.baseline:   liveLongitudeField.baseline
                                text:               "Lon:"
528 529
                            }

530 531 532 533 534
                            QGCLabel {
                                id:             liveLongitudeField
                                anchors.right:  parent.right
                                width:          _editFieldWidth
                                text:           liveHomePosition.longitude
535
                            }
536
                        }
537

538 539 540 541
                        Item {
                            width: 10
                            height: ScreenTools.defaultFontPixelHeight / 3
                        }
542

543 544 545
                        Item {
                            width:  parent.width
                            height: liveAltitudeField.height
546

547 548 549
                            QGCLabel {
                                anchors.baseline:   liveAltitudeField.baseline
                                text:               "Alt:"
550 551
                            }

552 553 554 555 556 557 558 559 560
                            QGCLabel {
                                id:             liveAltitudeField
                                anchors.right:  parent.right
                                width:          _editFieldWidth
                                text:           liveHomePosition.altitude
                            }
                        }
                    } // Column - Online view
                } // Item - Home Position Manager
561
                */
562 563 564

                // Help Panel
                Rectangle {
Don Gagne's avatar
Don Gagne committed
565 566 567 568
                    id:                 helpPanel
                    anchors.margins:    margins
                    anchors.top:        parent.top
                    anchors.bottom:     parent.bottom
569 570
                    anchors.left:       addMissionItemsButton.right
                    anchors.right:      missionItemEditor.left
Don Gagne's avatar
Don Gagne committed
571 572 573 574 575
                    width:              parent.width - (margins * 2) - _rightPanelWidth
                    visible:            helpButton.checked
                    color:              qgcPal.window
                    opacity:            _rightPanelOpacity
                    radius:             ScreenTools.defaultFontPixelHeight
Gus Grubba's avatar
Gus Grubba committed
576
                    z:                  QGroundControl.zOrderTopMost
Don Gagne's avatar
Don Gagne committed
577

578
                    readonly property real margins:  ScreenTools.defaultFontPixelHeight
Don Gagne's avatar
Don Gagne committed
579 580 581 582 583 584 585

                    Image {
                        anchors.margins:    ScreenTools.defaultFontPixelHeight
                        anchors.top:        parent.top
                        anchors.right:      parent.right
                        width:              ScreenTools.defaultFontPixelHeight * 1.5
                        height:             ScreenTools.defaultFontPixelHeight * 1.5
586
                        source:             (qgcPal.globalTheme === QGCPalette.Light) ? "/qmlimages/XDeleteBlack.svg" : "/qmlimages/XDelete.svg"
Don Gagne's avatar
Don Gagne committed
587 588 589 590 591 592 593 594 595
                        fillMode:           Image.PreserveAspectFit
                        mipmap:             true
                        smooth:             true

                        MouseArea {
                            anchors.fill:   parent
                            onClicked:      helpButton.checked = false
                        }
                    }
596

597
                    Item {
598 599
                        anchors.margins:    _margin
                        anchors.fill:       parent
600 601 602 603 604 605 606 607 608 609 610 611 612

                        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
613
                            text:               "Mission Planner tool buttons:"
614 615
                        }

dogmaphobic's avatar
dogmaphobic committed
616 617 618 619 620 621 622 623
                        Image {
                            id:                 addMissionItemsHelpIcon
                            anchors.topMargin:  ScreenTools.defaultFontPixelHeight
                            anchors.top:        helpIconLabel.bottom
                            width:              ScreenTools.defaultFontPixelHeight * 3
                            fillMode:           Image.PreserveAspectFit
                            mipmap:             true
                            smooth:             true
624
                            source:             (qgcPal.globalTheme === QGCPalette.Light) ? "/qmlimages/MapAddMissionBlack.svg" : "/qmlimages/MapAddMission.svg"
625 626 627 628 629 630 631 632 633
                        }

                        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
634 635
                            text:               "<b>Add Mission Items</b><br>" +
                                                "When enabled, add mission items by clicking on the map."
636 637
                        }

dogmaphobic's avatar
dogmaphobic committed
638
                        Image {
Don Gagne's avatar
Don Gagne committed
639
                            id:                 deleteHelpIcon
dogmaphobic's avatar
dogmaphobic committed
640 641 642 643 644 645
                            anchors.topMargin:  ScreenTools.defaultFontPixelHeight
                            anchors.top:        addMissionItemsHelpText.bottom
                            width:              ScreenTools.defaultFontPixelHeight * 3
                            fillMode:           Image.PreserveAspectFit
                            mipmap:             true
                            smooth:             true
646
                            source:             (qgcPal.globalTheme === QGCPalette.Light) ? "/qmlimages/TrashDeleteBlack.svg" : "/qmlimages/TrashDelete.svg"
Don Gagne's avatar
Don Gagne committed
647 648 649 650 651 652 653 654 655 656 657 658 659
                        }

                        QGCLabel {
                            id:                 deleteHelpText
                            anchors.leftMargin: ScreenTools.defaultFontPixelHeight
                            anchors.left:       mapTypeHelpIcon.right
                            anchors.right:      parent.right
                            anchors.top:        deleteHelpIcon.top
                            wrapMode:           Text.WordWrap
                            text:               "<b>Delete Mission Item</b><br>" +
                                                "Delete the currently selected mission item."
                        }

660
                        /*
661
                          Home Position Manager disabled
662

Don Gagne's avatar
Don Gagne committed
663 664 665 666 667 668 669 670
                        Image {
                            id:                 homePositionManagerHelpIcon
                            anchors.topMargin:  ScreenTools.defaultFontPixelHeight
                            anchors.top:        deleteHelpText.bottom
                            width:              ScreenTools.defaultFontPixelHeight * 3
                            fillMode:           Image.PreserveAspectFit
                            mipmap:             true
                            smooth:             true
671
                            source:             (qgcPal.globalTheme === QGCPalette.Light) ? "/qmlimages/MapHomeBlack.svg" : "/qmlimages/MapHome.svg"
672 673 674 675 676 677 678 679 680
                        }

                        QGCLabel {
                            id:                 homePositionManagerHelpText
                            anchors.leftMargin: ScreenTools.defaultFontPixelHeight
                            anchors.left:       mapTypeHelpIcon.right
                            anchors.right:      parent.right
                            anchors.top:        homePositionManagerHelpIcon.top
                            wrapMode:           Text.WordWrap
681 682 683
                            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."
684
                        }
685
                        */
686 687 688 689

                        Image {
                            id:                 mapCenterHelpIcon
                            anchors.topMargin:  ScreenTools.defaultFontPixelHeight
690
                            anchors.top:        deleteHelpText.bottom
691 692 693 694
                            width:              ScreenTools.defaultFontPixelHeight * 3
                            fillMode:           Image.PreserveAspectFit
                            mipmap:             true
                            smooth:             true
695
                            source:             (qgcPal.globalTheme === QGCPalette.Light) ? "/qmlimages/MapCenterBlack.svg" : "/qmlimages/MapCenter.svg"
696 697 698 699 700 701 702 703 704
                        }

                        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
705 706
                            text:               "<b>Map Center</b><br>" +
                                                "Options for centering the map."
707 708 709 710 711 712 713 714 715 716
                        }

                        Image {
                            id:                 syncHelpIcon
                            anchors.topMargin:  ScreenTools.defaultFontPixelHeight
                            anchors.top:        mapCenterHelpText.bottom
                            width:              ScreenTools.defaultFontPixelHeight * 3
                            fillMode:           Image.PreserveAspectFit
                            mipmap:             true
                            smooth:             true
717
                            source:             (qgcPal.globalTheme === QGCPalette.Light) ? "/qmlimages/MapSyncBlack.svg" : "/qmlimages/MapSync.svg"
718 719 720 721 722 723 724 725 726
                        }

                        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
727 728
                            text:               "<b>Sync</b><br>" +
                                                "Options for saving/loading mission items."
729 730 731 732 733 734 735 736 737 738
                        }

                        Image {
                            id:                 mapTypeHelpIcon
                            anchors.topMargin:  ScreenTools.defaultFontPixelHeight
                            anchors.top:        syncHelpText.bottom
                            width:              ScreenTools.defaultFontPixelHeight * 3
                            fillMode:           Image.PreserveAspectFit
                            mipmap:             true
                            smooth:             true
739
                            source:             (qgcPal.globalTheme === QGCPalette.Light) ? "/qmlimages/MapTypeBlack.svg" : "/qmlimages/MapType.svg"
740 741 742 743 744 745 746 747 748
                        }

                        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
749 750
                            text:               "<b>Map Type</b><br>" +
                                                "Map type options."
751
                        }
Don Gagne's avatar
Don Gagne committed
752 753

                        QGCCheckBox {
754 755 756 757 758
                            anchors.left:       parent.left
                            anchors.bottom:     parent.bottom
                            anchors.margins:    _margin
                            checked:            !_showHelp
                            text:               "Don't show me again"
Don Gagne's avatar
Don Gagne committed
759

760
                            onClicked:          QGroundControl.flightMapSettings.saveBoolMapSetting(editorMap.mapName, _showHelpKey, !checked)
Don Gagne's avatar
Don Gagne committed
761
                        }
762 763 764 765
                    } // Item - margin
                } // Item - Help Panel

                RoundButton {
766 767 768 769 770 771
                    id:                 addMissionItemsButton
                    anchors.margins:    _margin
                    anchors.left:       parent.left
                    y:                  (parent.height - (_toolButtonCount * height) - ((_toolButtonCount - 1) * _margin)) / 2
                    buttonImage:        "/qmlimages/MapAddMission.svg"
                    exclusiveGroup:     _dropButtonsExclusiveGroup
Gus Grubba's avatar
Gus Grubba committed
772
                    z:                  QGroundControl.zOrderWidgets
773 774 775 776 777 778 779 780 781 782 783 784 785 786 787 788 789 790 791

                    onCheckedChanged: {
                        if (checked) {
                            addMissionItemsButtonAutoOffTimer.start()
                        } else {
                            addMissionItemsButtonAutoOffTimer.stop()
                        }
                    }

                    Timer {
                        id:         addMissionItemsButtonAutoOffTimer
                        interval:   _addMissionItemsButtonAutoOffTimeout
                        repeat:     false

                        onTriggered: addMissionItemsButton.checked = false
                    }
                }

                RoundButton {
792
                    id:                 deleteMissionItemButton
793 794 795
                    anchors.margins:    _margin
                    anchors.left:       parent.left
                    anchors.top:        addMissionItemsButton.bottom
796 797
                    buttonImage:        "/qmlimages/TrashDelete.svg"
                    exclusiveGroup:     _dropButtonsExclusiveGroup
Gus Grubba's avatar
Gus Grubba committed
798
                    z:                  QGroundControl.zOrderWidgets
799 800 801 802 803 804 805 806

                    onClicked: {
                        itemEditor.clearItem()
                        controller.deleteCurrentMissionItem()
                        checked = false
                    }
                }

807
                /*
808
                  Home Position manager temporarily disable
809 810 811 812 813
                RoundButton {
                    id:                 homePositionManagerButton
                    anchors.margins:    _margin
                    anchors.left:       parent.left
                    anchors.top:        deleteMissionItemButton.bottom
814 815
                    buttonImage:        "/qmlimages/MapHome.svg"
                    exclusiveGroup:     _dropButtonsExclusiveGroup
Gus Grubba's avatar
Gus Grubba committed
816
                    z:                  QGroundControl.zOrderWidgets
817
                }
818
                */
819 820 821 822 823

                DropButton {
                    id:                 centerMapButton
                    anchors.margins:    _margin
                    anchors.left:       parent.left
824
                    anchors.top:        deleteMissionItemButton.bottom
825 826 827 828
                    dropDirection:      dropRight
                    buttonImage:        "/qmlimages/MapCenter.svg"
                    viewportMargins:    ScreenTools.defaultFontPixelWidth / 2
                    exclusiveGroup:     _dropButtonsExclusiveGroup
Gus Grubba's avatar
Gus Grubba committed
829
                    z:                  QGroundControl.zOrderWidgets
830 831 832 833 834 835 836 837 838

                    dropDownComponent: Component {
                        Column {
                            QGCLabel { text: "Center map:" }

                            Row {
                                spacing: ScreenTools.defaultFontPixelWidth

                                QGCButton {
839 840
                                    text:       "Home"
                                    enabled:    liveHomePositionAvailable
841 842 843

                                    onClicked: {
                                        centerMapButton.hideDropDown()
844
                                        editorMap.center = liveHomePosition
845 846 847 848 849 850 851 852 853 854 855 856 857 858 859 860 861 862 863 864 865 866 867 868 869 870 871 872 873
                                    }
                                }

                                QGCButton {
                                    text:       "Vehicle"
                                    enabled:    activeVehicle && activeVehicle.latitude != 0 && activeVehicle.longitude != 0

                                    property var activeVehicle: multiVehicleManager.activeVehicle

                                    onClicked: {
                                        centerMapButton.hideDropDown()
                                        editorMap.latitude = activeVehicle.latitude
                                        editorMap.longitude = activeVehicle.longitude
                                    }
                                }
                            }
                        }
                    }
                }

                DropButton {
                    id:                 syncButton
                    anchors.margins:    _margin
                    anchors.left:       parent.left
                    anchors.top:        centerMapButton.bottom
                    dropDirection:      dropRight
                    buttonImage:        _syncNeeded ? "/qmlimages/MapSyncChanged.svg" : "/qmlimages/MapSync.svg"
                    viewportMargins:    ScreenTools.defaultFontPixelWidth / 2
                    exclusiveGroup:     _dropButtonsExclusiveGroup
Gus Grubba's avatar
Gus Grubba committed
874
                    z:                  QGroundControl.zOrderWidgets
875 876
                    dropDownComponent:  syncDropDownComponent
                    enabled:            !_syncInProgress
877 878 879 880 881 882 883 884 885 886 887
                }

                DropButton {
                    id:                 mapTypeButton
                    anchors.margins:    _margin
                    anchors.left:       parent.left
                    anchors.top:        syncButton.bottom
                    dropDirection:      dropRight
                    buttonImage:        "/qmlimages/MapType.svg"
                    viewportMargins:    ScreenTools.defaultFontPixelWidth / 2
                    exclusiveGroup:     _dropButtonsExclusiveGroup
Gus Grubba's avatar
Gus Grubba committed
888
                    z:                  QGroundControl.zOrderWidgets
889 890 891 892 893 894 895 896 897 898 899 900 901 902 903 904 905 906 907 908 909 910 911 912 913 914 915 916 917 918 919 920 921 922 923 924

                    dropDownComponent: Component {
                        Column {
                            QGCLabel { text: "Map type:" }

                            Row {
                                spacing: ScreenTools.defaultFontPixelWidth

                                Repeater {
                                    model: QGroundControl.flightMapSettings.mapTypes

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

                                        onClicked: {
                                            editorMap.mapType = text
                                            checked = true
                                            mapTypeButton.hideDropDown()
                                        }
                                    }
                                }
                            }
                        }
                    }
                }

                RoundButton {
                    id:                 helpButton
                    anchors.margins:    _margin
                    anchors.left:       parent.left
                    anchors.top:        mapTypeButton.bottom
                    buttonImage:        "/qmlimages/Help.svg"
                    exclusiveGroup:     _dropButtonsExclusiveGroup
Gus Grubba's avatar
Gus Grubba committed
925
                    z:                  QGroundControl.zOrderWidgets
Don Gagne's avatar
Don Gagne committed
926
                    checked:            _showHelp
927 928
                }
            } // FlightMap
Don Gagne's avatar
Don Gagne committed
929 930
        } // Item - split view container
    } // QGCViewPanel
931 932 933 934 935 936 937 938 939 940 941 942 943 944 945 946 947

    Component {
        id: syncDropDownComponent

        Column {
            id:         columnHolder
            spacing:    _margin

            QGCLabel {
                width:      columnHolder.width
                wrapMode:   Text.WordWrap
                text:       _syncNeeded && !controller.autoSync ?
                                "You have unsaved changed to you mission. You should send to your vehicle, or save to a file:" :
                                "Sync:"
            }

            Row {
948
                visible:    true //autoSyncCheckBox.enabled && autoSyncCheckBox.checked
949 950 951 952 953 954 955 956 957 958 959 960 961 962 963 964 965 966 967 968 969 970 971 972 973 974 975 976 977 978 979 980 981 982 983 984 985 986 987 988 989 990 991 992
                spacing:    ScreenTools.defaultFontPixelWidth

                QGCButton {
                    text:       "Send to vehicle"
                    enabled:    _activeVehicle && !_activeVehicle.missionManager.inProgress

                    onClicked: {
                        syncButton.hideDropDown()
                        controller.sendMissionItems()
                    }
                }

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

                    onClicked: {
                        syncButton.hideDropDown()
                        controller.getMissionItems()
                    }
                }
            }

            Row {
                spacing: ScreenTools.defaultFontPixelWidth

                QGCButton {
                    text:       "Save to file..."

                    onClicked: {
                        syncButton.hideDropDown()
                        controller.saveMissionToFile()
                    }
                }

                QGCButton {
                    text:       "Load from file..."

                    onClicked: {
                        syncButton.hideDropDown()
                        controller.loadMissionFromFile()
                    }
                }
            }
993 994
/*
        FIXME: autoSync is temporarily disconnected since it's still buggy
995 996 997 998 999 1000 1001 1002 1003 1004 1005 1006 1007 1008 1009

            QGCLabel {
                id:         autoSyncDisallowedLabel
                visible:    _activeVehicle && _activeVehicle.armed
                text:       "AutoSync is not allowed whie vehicle is armed"
            }

            QGCCheckBox {
                id:         autoSyncCheckBox
                checked:    controller.autoSync
                text:       "Automatically sync changes with vehicle"
                enabled:    _activeVehicle ? !_activeVehicle.armed : false

                onClicked: controller.autoSync = checked
            }
1010
*/
1011 1012
        }
    }
Don Gagne's avatar
Don Gagne committed
1013
} // QGCVIew