MissionEditor.qml 44.4 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
        onMissionItemsChanged: itemEditor.clearItem()
87
    }
88

89
    QGCPalette { id: qgcPal; colorGroupEnabled: enabled }
Don Gagne's avatar
Don Gagne committed
90

91 92 93 94 95 96
    ExclusiveGroup {
        id: _mapTypeButtonsExclusiveGroup
    }

    ExclusiveGroup {
        id: _dropButtonsExclusiveGroup
97 98
    }

99 100 101 102 103 104
    function setCurrentItem(index) {
        for (var i=0; i<_missionItems.count; i++) {
            _missionItems.get(i).isCurrentItem = (i == index)
        }
    }

Don Gagne's avatar
Don Gagne committed
105 106 107
    QGCViewPanel {
        id:             panel
        anchors.fill:   parent
Don Gagne's avatar
Don Gagne committed
108

Don Gagne's avatar
Don Gagne committed
109
        Item {
Don Gagne's avatar
Don Gagne committed
110 111
            anchors.fill: parent

Don Gagne's avatar
Don Gagne committed
112 113
            FlightMap {
                id:             editorMap
114
                anchors.fill:   parent
Don Gagne's avatar
Don Gagne committed
115
                mapName:        "MissionEditor"
116 117
                latitude:       tabletPosition.latitude
                longitude:      tabletPosition.longitude
Don Gagne's avatar
Don Gagne committed
118

119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141
                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
142 143 144 145 146 147 148
                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)
149
                        coordinate.altitude = coordinate.altitude.toFixed(_decimalPlaces)
150 151
                        if (false /*homePositionManagerButton.checked*/) {
                            //offlineHomePosition = coordinate
152
                        } else if (addMissionItemsButton.checked) {
153
                            var index = controller.addMissionItem(coordinate)
154
                            addMissionItemsButtonAutoOffTimer.start()
155
                            setCurrentItem(index)
156 157
                        } else {
                            editorMap.zoomLevel = editorMap.maxZoomLevel - 2
158
                        }
Don Gagne's avatar
Don Gagne committed
159
                    }
Don Gagne's avatar
Don Gagne committed
160
                }
Don Gagne's avatar
Don Gagne committed
161

162 163 164 165 166 167 168 169
                // 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
170
                    z:          QGroundControl.zOrderMapItems + 1    // Above item icons
171 172 173 174 175

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

176 177 178 179 180 181
                    function clearItem() {
                        itemEditor.visible = false
                        itemEditor.missionItem = undefined
                        itemEditor.missionItemIndicator = undefined
                    }

182 183 184 185 186 187 188 189 190
                    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
191
                    }
192

193 194 195 196
                    MouseArea {
                        id:             itemDrag
                        anchors.fill:   parent
                        drag.target:    parent
197

198
                        property bool dragActive: drag.active
199

200 201 202
                        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
203 204 205
                                var coordinate = editorMap.toCoordinate(point)
                                coordinate.altitude = itemEditor.missionItem.coordinate.altitude
                                itemEditor.missionItem.coordinate = coordinate
Don Gagne's avatar
Don Gagne committed
206 207 208
                            }
                        }
                    }
209
                }
210

Don Gagne's avatar
Don Gagne committed
211
                // Add the mission items to the map
212 213 214
                MissionItemView {
                    model:          controller.missionItems
                    itemDragger:    itemEditor
215 216 217
                }

                // Add lines between waypoints
218 219
                MissionLineView {
                    model:          controller.waypointLines
Don Gagne's avatar
Don Gagne committed
220 221
                }

222
                // Mission Item Editor
Don Gagne's avatar
Don Gagne committed
223
                Item {
224 225 226 227 228
                    id:             missionItemEditor
                    anchors.top:    parent.top
                    anchors.bottom: parent.bottom
                    anchors.right:  parent.right
                    width:          _rightPanelWidth
229
                    visible:        _missionItems.count > 1
230
                    opacity:        _rightPanelOpacity
Gus Grubba's avatar
Gus Grubba committed
231
                    z:              QGroundControl.zOrderTopMost
232 233 234

                    ListView {
                        id:             missionItemSummaryList
235
                        anchors.fill:   parent
236 237
                        spacing:        _margin / 2
                        orientation:    ListView.Vertical
238
                        model:          controller.canEdit ? controller.missionItems : 0
239 240 241 242 243 244 245

                        property real _maxItemHeight: 0

                        delegate:
                            MissionItemEditor {
                            missionItem:    object
                            width:          parent.width
246 247
                            readOnly:       object.sequenceNumber == 0
                            visible:        !readOnly || object.homePositionValid
248 249 250 251 252

                            onClicked:  setCurrentItem(object.sequenceNumber)

                            onRemove: {
                                var newCurrentItem = object.sequenceNumber - 1
253
                                controller.removeMissionItem(object.sequenceNumber)
254 255 256
                                if (_missionItems.count > 1) {
                                    newCurrentItem = Math.min(_missionItems.count - 1, newCurrentItem)
                                    setCurrentItem(newCurrentItem)
257
                                }
258
                            }
259
                        }
260
                    } // ListView
Don Gagne's avatar
Don Gagne committed
261

262
                    QGCLabel {
263
                        anchors.fill:   parent
264
                        visible:        !controller.canEdit
265 266 267 268 269
                        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
270

271 272
                /*
                  Home Position Manager temporarily disbled till more work is done on it
273

274 275 276 277 278 279 280 281 282 283
                // 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
284
                    z:              QGroundControl.zOrderTopMost
285 286 287 288 289

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

291 292 293 294
                        QGCLabel {
                            font.pixelSize: ScreenTools.mediumFontPixelSize
                            text:           "Flying Field Manager"
                        }
295

296 297 298 299
                        Item {
                            width: 10
                            height: ScreenTools.defaultFontPixelHeight
                        }
300

301 302 303 304 305
                        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."
                        }
306

307 308 309 310
                        Item {
                            width: 10
                            height: ScreenTools.defaultFontPixelHeight
                        }
311

312 313 314
                        QGCLabel {
                            text:       "Select field to use:"
                        }
315

316 317 318 319 320 321 322 323 324 325 326 327 328
                        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
329 330
                                }
                            }
331
                        }
332

333 334 335 336
                        Item {
                            width: 10
                            height: ScreenTools.defaultFontPixelHeight
                        }
337

338 339 340 341 342 343 344 345
                        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."
                        }
346

347 348 349 350
                        Item {
                            width: 10
                            height: ScreenTools.defaultFontPixelHeight / 3
                        }
351

352 353 354
                        Item {
                            width:  parent.width
                            height: nameField.height
355

356 357 358
                            QGCLabel {
                                anchors.baseline:   nameField.baseline
                                text:               "Name:"
359 360
                            }

361 362 363 364 365
                            QGCTextField {
                                id:             nameField
                                anchors.right:  parent.right
                                width:          _editFieldWidth
                                text:           _homePositionName
366
                            }
367
                        }
368

369 370 371 372
                        Item {
                            width: 10
                            height: ScreenTools.defaultFontPixelHeight / 3
                        }
373

374 375 376
                        Item {
                            width:  parent.width
                            height: offlineLatitudeField.height
377

378 379 380
                            QGCLabel {
                                anchors.baseline:   offlineLatitudeField.baseline
                                text:               "Lat:"
381 382
                            }

383 384 385 386 387
                            QGCTextField {
                                id:             offlineLatitudeField
                                anchors.right:  parent.right
                                width:          _editFieldWidth
                                text:           offlineHomePosition.latitude
388
                            }
389
                        }
390

391 392 393 394
                        Item {
                            width: 10
                            height: ScreenTools.defaultFontPixelHeight / 3
                        }
395

396 397 398
                        Item {
                            width:  parent.width
                            height: offlineLongitudeField.height
399

400 401 402
                            QGCLabel {
                                anchors.baseline:   offlineLongitudeField.baseline
                                text:               "Lon:"
403 404
                            }

405 406 407 408 409
                            QGCTextField {
                                id:             offlineLongitudeField
                                anchors.right:  parent.right
                                width:          _editFieldWidth
                                text:           offlineHomePosition.longitude
410
                            }
411
                        }
412

413 414 415 416
                        Item {
                            width: 10
                            height: ScreenTools.defaultFontPixelHeight / 3
                        }
417

418 419 420
                        Item {
                            width:  parent.width
                            height: offlineAltitudeField.height
421

422 423 424
                            QGCLabel {
                                anchors.baseline:   offlineAltitudeField.baseline
                                text:               "Alt:"
425 426
                            }

427 428 429 430 431
                            QGCTextField {
                                id:             offlineAltitudeField
                                anchors.right:  parent.right
                                width:          _editFieldWidth
                                text:           offlineHomePosition.altitude
432
                            }
433
                        }
434

435 436 437 438
                        Item {
                            width: 10
                            height: ScreenTools.defaultFontPixelHeight
                        }
439

440 441
                        Row {
                            spacing: ScreenTools.defaultFontPixelWidth
442

443 444
                            QGCButton {
                                text: "Add/Update"
445

446 447 448 449
                                onClicked: {
                                    offlineHomePosition = QtPositioning.coordinate(latitudeField.text, longitudeField.text, altitudeField.text)
                                    _homePositionManager.updateHomePosition(nameField.text, offlineHomePosition)
                                    homePosCombo.currentIndex = homePosCombo.find(nameField.text)
450 451
                                }
                            }
452

453 454
                            QGCButton {
                                text: "Delete"
455

456 457 458 459 460 461 462 463
                                onClicked: {
                                    homePosCombo.currentIndex = -1
                                    _homePositionManager.deleteHomePosition(nameField.text)
                                    homePosCombo.currentIndex = 0
                                    var homePos = _homePositionManager.homePositions.get(0)
                                    _homePositionName = homePos.name
                                    offlineHomePosition = homePos.coordinate
                                }
464
                            }
465 466
                        }
                    } // Column - Offline view
467

468 469 470 471
                    Column {
                        anchors.margins:    _margin
                        anchors.fill:       parent
                        visible:            liveHomePositionAvailable
472

473 474 475 476
                        QGCLabel {
                            font.pixelSize: ScreenTools.mediumFontPixelSize
                            text:           "Vehicle Home Position"
                        }
477

478 479 480 481
                        Item {
                            width: 10
                            height: ScreenTools.defaultFontPixelHeight
                        }
482

483 484 485 486 487 488 489
                        Item {
                            width:  parent.width
                            height: liveLatitudeField.height

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

492 493 494 495 496
                            QGCLabel {
                                id:             liveLatitudeField
                                anchors.right:  parent.right
                                width:          _editFieldWidth
                                text:           liveHomePosition.latitude
497
                            }
498
                        }
499

500 501 502 503
                        Item {
                            width: 10
                            height: ScreenTools.defaultFontPixelHeight / 3
                        }
504

505 506 507
                        Item {
                            width:  parent.width
                            height: liveLongitudeField.height
508

509 510 511
                            QGCLabel {
                                anchors.baseline:   liveLongitudeField.baseline
                                text:               "Lon:"
512 513
                            }

514 515 516 517 518
                            QGCLabel {
                                id:             liveLongitudeField
                                anchors.right:  parent.right
                                width:          _editFieldWidth
                                text:           liveHomePosition.longitude
519
                            }
520
                        }
521

522 523 524 525
                        Item {
                            width: 10
                            height: ScreenTools.defaultFontPixelHeight / 3
                        }
526

527 528 529
                        Item {
                            width:  parent.width
                            height: liveAltitudeField.height
530

531 532 533
                            QGCLabel {
                                anchors.baseline:   liveAltitudeField.baseline
                                text:               "Alt:"
534 535
                            }

536 537 538 539 540 541 542 543 544
                            QGCLabel {
                                id:             liveAltitudeField
                                anchors.right:  parent.right
                                width:          _editFieldWidth
                                text:           liveHomePosition.altitude
                            }
                        }
                    } // Column - Online view
                } // Item - Home Position Manager
545
                */
546 547 548

                // Help Panel
                Rectangle {
Don Gagne's avatar
Don Gagne committed
549 550 551 552
                    id:                 helpPanel
                    anchors.margins:    margins
                    anchors.top:        parent.top
                    anchors.bottom:     parent.bottom
553 554
                    anchors.left:       addMissionItemsButton.right
                    anchors.right:      missionItemEditor.left
Don Gagne's avatar
Don Gagne committed
555 556 557 558 559
                    width:              parent.width - (margins * 2) - _rightPanelWidth
                    visible:            helpButton.checked
                    color:              qgcPal.window
                    opacity:            _rightPanelOpacity
                    radius:             ScreenTools.defaultFontPixelHeight
Gus Grubba's avatar
Gus Grubba committed
560
                    z:                  QGroundControl.zOrderTopMost
Don Gagne's avatar
Don Gagne committed
561

562
                    readonly property real margins:  ScreenTools.defaultFontPixelHeight
Don Gagne's avatar
Don Gagne committed
563 564 565 566 567 568 569

                    Image {
                        anchors.margins:    ScreenTools.defaultFontPixelHeight
                        anchors.top:        parent.top
                        anchors.right:      parent.right
                        width:              ScreenTools.defaultFontPixelHeight * 1.5
                        height:             ScreenTools.defaultFontPixelHeight * 1.5
570
                        source:             (qgcPal.globalTheme === QGCPalette.Light) ? "/qmlimages/XDeleteBlack.svg" : "/qmlimages/XDelete.svg"
Don Gagne's avatar
Don Gagne committed
571 572 573 574 575 576 577 578 579
                        fillMode:           Image.PreserveAspectFit
                        mipmap:             true
                        smooth:             true

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

581
                    Item {
582 583
                        anchors.margins:    _margin
                        anchors.fill:       parent
584 585 586 587 588 589 590 591 592 593 594 595 596

                        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
597
                            text:               "Mission Planner tool buttons:"
598 599
                        }

dogmaphobic's avatar
dogmaphobic committed
600 601 602 603 604 605 606 607
                        Image {
                            id:                 addMissionItemsHelpIcon
                            anchors.topMargin:  ScreenTools.defaultFontPixelHeight
                            anchors.top:        helpIconLabel.bottom
                            width:              ScreenTools.defaultFontPixelHeight * 3
                            fillMode:           Image.PreserveAspectFit
                            mipmap:             true
                            smooth:             true
608
                            source:             (qgcPal.globalTheme === QGCPalette.Light) ? "/qmlimages/MapAddMissionBlack.svg" : "/qmlimages/MapAddMission.svg"
609 610 611 612 613 614 615 616 617
                        }

                        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
618 619
                            text:               "<b>Add Mission Items</b><br>" +
                                                "When enabled, add mission items by clicking on the map."
620 621
                        }

dogmaphobic's avatar
dogmaphobic committed
622
                        Image {
Don Gagne's avatar
Don Gagne committed
623
                            id:                 deleteHelpIcon
dogmaphobic's avatar
dogmaphobic committed
624 625 626 627 628 629
                            anchors.topMargin:  ScreenTools.defaultFontPixelHeight
                            anchors.top:        addMissionItemsHelpText.bottom
                            width:              ScreenTools.defaultFontPixelHeight * 3
                            fillMode:           Image.PreserveAspectFit
                            mipmap:             true
                            smooth:             true
630
                            source:             (qgcPal.globalTheme === QGCPalette.Light) ? "/qmlimages/TrashDeleteBlack.svg" : "/qmlimages/TrashDelete.svg"
Don Gagne's avatar
Don Gagne committed
631 632 633 634 635 636 637 638 639 640 641 642 643
                        }

                        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."
                        }

644
                        /*
645
                          Home Position Manager disabled
646

Don Gagne's avatar
Don Gagne committed
647 648 649 650 651 652 653 654
                        Image {
                            id:                 homePositionManagerHelpIcon
                            anchors.topMargin:  ScreenTools.defaultFontPixelHeight
                            anchors.top:        deleteHelpText.bottom
                            width:              ScreenTools.defaultFontPixelHeight * 3
                            fillMode:           Image.PreserveAspectFit
                            mipmap:             true
                            smooth:             true
655
                            source:             (qgcPal.globalTheme === QGCPalette.Light) ? "/qmlimages/MapHomeBlack.svg" : "/qmlimages/MapHome.svg"
656 657 658 659 660 661 662 663 664
                        }

                        QGCLabel {
                            id:                 homePositionManagerHelpText
                            anchors.leftMargin: ScreenTools.defaultFontPixelHeight
                            anchors.left:       mapTypeHelpIcon.right
                            anchors.right:      parent.right
                            anchors.top:        homePositionManagerHelpIcon.top
                            wrapMode:           Text.WordWrap
665 666 667
                            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."
668
                        }
669
                        */
670 671 672 673

                        Image {
                            id:                 mapCenterHelpIcon
                            anchors.topMargin:  ScreenTools.defaultFontPixelHeight
674
                            anchors.top:        deleteHelpText.bottom
675 676 677 678
                            width:              ScreenTools.defaultFontPixelHeight * 3
                            fillMode:           Image.PreserveAspectFit
                            mipmap:             true
                            smooth:             true
679
                            source:             (qgcPal.globalTheme === QGCPalette.Light) ? "/qmlimages/MapCenterBlack.svg" : "/qmlimages/MapCenter.svg"
680 681 682 683 684 685 686 687 688
                        }

                        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
689 690
                            text:               "<b>Map Center</b><br>" +
                                                "Options for centering the map."
691 692 693 694 695 696 697 698 699 700
                        }

                        Image {
                            id:                 syncHelpIcon
                            anchors.topMargin:  ScreenTools.defaultFontPixelHeight
                            anchors.top:        mapCenterHelpText.bottom
                            width:              ScreenTools.defaultFontPixelHeight * 3
                            fillMode:           Image.PreserveAspectFit
                            mipmap:             true
                            smooth:             true
701
                            source:             (qgcPal.globalTheme === QGCPalette.Light) ? "/qmlimages/MapSyncBlack.svg" : "/qmlimages/MapSync.svg"
702 703 704 705 706 707 708 709 710
                        }

                        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
711 712
                            text:               "<b>Sync</b><br>" +
                                                "Options for saving/loading mission items."
713 714 715 716 717 718 719 720 721 722
                        }

                        Image {
                            id:                 mapTypeHelpIcon
                            anchors.topMargin:  ScreenTools.defaultFontPixelHeight
                            anchors.top:        syncHelpText.bottom
                            width:              ScreenTools.defaultFontPixelHeight * 3
                            fillMode:           Image.PreserveAspectFit
                            mipmap:             true
                            smooth:             true
723
                            source:             (qgcPal.globalTheme === QGCPalette.Light) ? "/qmlimages/MapTypeBlack.svg" : "/qmlimages/MapType.svg"
724 725 726 727 728 729 730 731 732
                        }

                        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
733 734
                            text:               "<b>Map Type</b><br>" +
                                                "Map type options."
735
                        }
Don Gagne's avatar
Don Gagne committed
736 737

                        QGCCheckBox {
738 739 740 741 742
                            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
743

744
                            onClicked:          QGroundControl.flightMapSettings.saveBoolMapSetting(editorMap.mapName, _showHelpKey, !checked)
Don Gagne's avatar
Don Gagne committed
745
                        }
746 747 748 749
                    } // Item - margin
                } // Item - Help Panel

                RoundButton {
750 751 752 753 754 755
                    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
756
                    z:                  QGroundControl.zOrderWidgets
757 758 759 760 761 762 763 764 765 766 767 768 769 770 771 772 773 774 775

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

                    Timer {
                        id:         addMissionItemsButtonAutoOffTimer
                        interval:   _addMissionItemsButtonAutoOffTimeout
                        repeat:     false

                        onTriggered: addMissionItemsButton.checked = false
                    }
                }

                RoundButton {
776
                    id:                 deleteMissionItemButton
777 778 779
                    anchors.margins:    _margin
                    anchors.left:       parent.left
                    anchors.top:        addMissionItemsButton.bottom
780 781
                    buttonImage:        "/qmlimages/TrashDelete.svg"
                    exclusiveGroup:     _dropButtonsExclusiveGroup
Gus Grubba's avatar
Gus Grubba committed
782
                    z:                  QGroundControl.zOrderWidgets
783 784 785 786 787 788 789 790

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

791
                /*
792
                  Home Position manager temporarily disable
793 794 795 796 797
                RoundButton {
                    id:                 homePositionManagerButton
                    anchors.margins:    _margin
                    anchors.left:       parent.left
                    anchors.top:        deleteMissionItemButton.bottom
798 799
                    buttonImage:        "/qmlimages/MapHome.svg"
                    exclusiveGroup:     _dropButtonsExclusiveGroup
Gus Grubba's avatar
Gus Grubba committed
800
                    z:                  QGroundControl.zOrderWidgets
801
                }
802
                */
803 804 805 806 807

                DropButton {
                    id:                 centerMapButton
                    anchors.margins:    _margin
                    anchors.left:       parent.left
808
                    anchors.top:        deleteMissionItemButton.bottom
809 810 811 812
                    dropDirection:      dropRight
                    buttonImage:        "/qmlimages/MapCenter.svg"
                    viewportMargins:    ScreenTools.defaultFontPixelWidth / 2
                    exclusiveGroup:     _dropButtonsExclusiveGroup
Gus Grubba's avatar
Gus Grubba committed
813
                    z:                  QGroundControl.zOrderWidgets
814 815 816 817 818 819 820 821 822

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

                            Row {
                                spacing: ScreenTools.defaultFontPixelWidth

                                QGCButton {
823 824
                                    text:       "Home"
                                    enabled:    liveHomePositionAvailable
825 826 827

                                    onClicked: {
                                        centerMapButton.hideDropDown()
828
                                        editorMap.center = liveHomePosition
829 830 831 832 833 834 835 836 837 838 839 840 841 842 843 844 845 846 847 848 849 850 851 852 853 854 855 856 857
                                    }
                                }

                                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
858
                    z:                  QGroundControl.zOrderWidgets
859 860
                    dropDownComponent:  syncDropDownComponent
                    enabled:            !_syncInProgress
861 862 863 864 865 866 867 868 869 870 871
                }

                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
872
                    z:                  QGroundControl.zOrderWidgets
873 874 875 876 877 878 879 880 881 882 883 884 885 886 887 888 889 890 891 892 893 894 895 896 897 898 899 900 901 902 903 904 905 906 907 908

                    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
909
                    z:                  QGroundControl.zOrderWidgets
Don Gagne's avatar
Don Gagne committed
910
                    checked:            _showHelp
911 912
                }
            } // FlightMap
Don Gagne's avatar
Don Gagne committed
913 914
        } // Item - split view container
    } // QGCViewPanel
915 916 917 918 919 920 921 922 923 924 925 926 927 928 929 930 931

    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 {
932
                visible:    true //autoSyncCheckBox.enabled && autoSyncCheckBox.checked
933 934 935 936 937 938 939 940 941 942 943 944 945 946 947 948 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
                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()
                    }
                }
            }
977 978
/*
        FIXME: autoSync is temporarily disconnected since it's still buggy
979 980 981 982 983 984 985 986 987 988 989 990 991 992 993

            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
            }
994
*/
995 996
        }
    }
Don Gagne's avatar
Don Gagne committed
997
} // QGCVIew