MainToolBar.qml 33.2 KB
Newer Older
dogmaphobic's avatar
dogmaphobic committed
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33
/*=====================================================================

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/>.

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

/**
 * @file
 *   @brief QGC Main Tool Bar
 *   @author Gus Grubba <mavlink@grubba.com>
 */

import QtQuick 2.3
import QtQuick.Controls 1.2
import QtQuick.Controls.Styles 1.2

34 35 36 37 38 39
import QGroundControl.Controls              1.0
import QGroundControl.FactControls          1.0
import QGroundControl.Palette               1.0
import QGroundControl.MainToolBar           1.0
import QGroundControl.MultiVehicleManager   1.0
import QGroundControl.ScreenTools           1.0
dogmaphobic's avatar
dogmaphobic committed
40 41

Rectangle {
dogmaphobic's avatar
dogmaphobic committed
42
    id: toolBarHolder
dogmaphobic's avatar
dogmaphobic committed
43 44

    property var qgcPal: QGCPalette { id: palette; colorGroupEnabled: true }
45

46 47
    property var activeVehicle: multiVehicleManager.activeVehicle

Don Gagne's avatar
Don Gagne committed
48 49
    readonly property real toolBarHeight:   ScreenTools.defaultFontPixelHeight * 3
    property int cellSpacerSize:            ScreenTools.isMobile ? getProportionalDimmension(6) : getProportionalDimmension(4)
Don Gagne's avatar
Don Gagne committed
50 51 52 53
    readonly property int cellHeight:       toolBarHeight * 0.75

    readonly property real horizontalMargins:   ScreenTools.defaultFontPixelWidth / 2
    readonly property real verticalMargins:     ScreenTools.defaultFontPixelHeight / 4
dogmaphobic's avatar
dogmaphobic committed
54

Don Gagne's avatar
Don Gagne committed
55 56 57 58 59
    readonly property var colorBlue:    "#1a6eaa"
    readonly property var colorGreen:   "#329147"
    readonly property var colorRed:     "#942324"
    readonly property var colorOrange:  "#a76f26"
    readonly property var colorWhite:   "#f0f0f0"
dogmaphobic's avatar
dogmaphobic committed
60

61 62 63 64 65
    property var colorOrangeText: (qgcPal.globalTheme === QGCPalette.Light) ? "#b75711" : "#ea8225"
    property var colorRedText:    (qgcPal.globalTheme === QGCPalette.Light) ? "#ee1112" : "#ef2526"
    property var colorGreenText:  (qgcPal.globalTheme === QGCPalette.Light) ? "#046b1b" : "#00d930"
    property var colorWhiteText:  (qgcPal.globalTheme === QGCPalette.Light) ? "#343333" : "#f0f0f0"

66
    color:  qgcPal.windowShade
dogmaphobic's avatar
dogmaphobic committed
67

Don Gagne's avatar
Don Gagne committed
68 69
    Connections {
        target: mainToolBar
Don Gagne's avatar
Don Gagne committed
70 71 72

        onShowMessage: {
            toolBarMessage.text = message
73 74 75 76 77
            if (toolBarMessage.contentHeight > toolBarMessageCloseButton.height) {
                mainToolBar.height = toolBarHeight + toolBarMessage.contentHeight + (verticalMargins * 2)
            } else {
                mainToolBar.height = toolBarHeight + toolBarMessageCloseButton.height + (verticalMargins * 2)
            }
Don Gagne's avatar
Don Gagne committed
78 79
            toolBarMessageArea.visible = true
        }
Don Gagne's avatar
Don Gagne committed
80 81
    }

dogmaphobic's avatar
dogmaphobic committed
82
    function getProportionalDimmension(val) {
Don Gagne's avatar
Don Gagne committed
83
        return toolBarHeight * val / 40
dogmaphobic's avatar
dogmaphobic committed
84 85
    }

dogmaphobic's avatar
dogmaphobic committed
86
    function getMessageColor() {
87
        if (activeVehicle.messageTypeNone)
dogmaphobic's avatar
dogmaphobic committed
88
            return qgcPal.button;
89
        if (activeVehicle.messageTypeNorma)
dogmaphobic's avatar
dogmaphobic committed
90
            return colorBlue;
91
        if (activeVehicle.messageTypeWarning)
dogmaphobic's avatar
dogmaphobic committed
92
            return colorOrange;
93
        if (activeVehicle.messageTypeError)
dogmaphobic's avatar
dogmaphobic committed
94 95 96 97 98 99
            return colorRed;
        // Cannot be so make make it obnoxious to show error
        return "purple";
    }

    function getMessageIcon() {
100
        if (activeVehicle.messageTypeNormal || activeVehicle.messageTypeNone)
Don Gagne's avatar
Don Gagne committed
101
            return "qrc:/res/Megaphone";
dogmaphobic's avatar
dogmaphobic committed
102
        else
Don Gagne's avatar
Don Gagne committed
103
            return "qrc:/res/Yield";
dogmaphobic's avatar
dogmaphobic committed
104 105 106
    }

    function getBatteryIcon() {
107
        if(activeVehicle.batteryPercent < 20.0)
Don Gagne's avatar
Don Gagne committed
108
            return "qrc:/res/Battery_0";
109
        else if(activeVehicle.batteryPercent < 40.0)
Don Gagne's avatar
Don Gagne committed
110
            return "qrc:/res/Battery_20";
111
        else if(activeVehicle.batteryPercent < 60.0)
Don Gagne's avatar
Don Gagne committed
112
            return "qrc:/res/Battery_40";
113
        else if(activeVehicle.batteryPercent < 80.0)
Don Gagne's avatar
Don Gagne committed
114
            return "qrc:/res/Battery_60";
115
        else if(activeVehicle.batteryPercent < 90.0)
Don Gagne's avatar
Don Gagne committed
116
            return "qrc:/res/Battery_80";
dogmaphobic's avatar
dogmaphobic committed
117
        else
Don Gagne's avatar
Don Gagne committed
118
            return "qrc:/res/Battery_100";
dogmaphobic's avatar
dogmaphobic committed
119 120
    }

dogmaphobic's avatar
dogmaphobic committed
121
    function getBatteryColor() {
122
        if (activeVehicle.batteryPercent > 40.0)
dogmaphobic's avatar
dogmaphobic committed
123
            return colorGreen;
124
        if(activeVehicle.batteryPercent > 0.01)
dogmaphobic's avatar
dogmaphobic committed
125 126 127 128 129 130 131
            return colorRed;
        // This means there is no battery level data
        return colorBlue;
    }

    function getSatelliteColor() {
        // No GPS data
132
        if (activeVehicle.satelliteCount < 0)
dogmaphobic's avatar
dogmaphobic committed
133 134
            return qgcPal.button
        // No Lock
135
        if(activeVehicle.satelliteLock < 2)
dogmaphobic's avatar
dogmaphobic committed
136 137
            return colorRed;
        // 2D Lock
138
        if(activeVehicle.satelliteLock === 2)
dogmaphobic's avatar
dogmaphobic committed
139 140 141 142 143
            return colorBlue;
        // Lock is 3D or more
        return colorGreen;
    }

144 145 146 147 148 149
    function getRSSIColor(value) {
        if(value < 10)
            return colorRed;
        if(value < 50)
            return colorOrange;
        return colorGreen;
150 151
    }

dogmaphobic's avatar
dogmaphobic committed
152
    function showMavStatus() {
153
         return (multiVehicleManager.activeVehicleAvailable && activeVehicle.heartbeatTimeout === 0 && mainToolBar.connectionCount > 0);
dogmaphobic's avatar
dogmaphobic committed
154 155
    }

dogmaphobic's avatar
dogmaphobic committed
156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199
    //-------------------------------------------------------------------------
    //-- Main menu for Mobile Devices
    Menu {
        id: maintMenu
        ExclusiveGroup { id: mainMenuGroup }
        MenuItem {
            text: "Vehicle Setup"
            checkable:  true
            exclusiveGroup: mainMenuGroup
            checked: (mainToolBar.currentView === MainToolBar.ViewSetup)
            onTriggered:
            {
                mainToolBar.onSetupView();
            }
        }
        MenuItem {
            text: "Plan View"
            checkable:  true
            checked: (mainToolBar.currentView === MainToolBar.ViewPlan)
            exclusiveGroup: mainMenuGroup
            onTriggered:
            {
                mainToolBar.onPlanView();
            }
        }
        MenuItem {
            text: "Flight View"
            checkable: true
            checked: (mainToolBar.currentView === MainToolBar.ViewFly)
            exclusiveGroup: mainMenuGroup
            onTriggered:
            {
                mainToolBar.onFlyView();
            }
        }
        //-- Flight View Context Menu
        MenuItem {
            text: "Flight View Options..."
            visible: (mainToolBar.currentView === MainToolBar.ViewFly)
            onTriggered:
            {
                mainToolBar.onFlyViewMenu();
            }
        }
Don Gagne's avatar
Don Gagne committed
200
    } // Menu
dogmaphobic's avatar
dogmaphobic committed
201

202 203
    Component {
        id: activeVehicleComponent
dogmaphobic's avatar
dogmaphobic committed
204

205
        Row {
206 207
            height:     cellHeight
            spacing:    cellSpacerSize
dogmaphobic's avatar
dogmaphobic committed
208

dogmaphobic's avatar
dogmaphobic committed
209
            Rectangle {
210
                id: messages
211
                width: (activeVehicle.messageCount > 99) ? getProportionalDimmension(65) : getProportionalDimmension(60)
212
                height: cellHeight
213
                visible: mainToolBar.showMessages
dogmaphobic's avatar
dogmaphobic committed
214
                anchors.verticalCenter: parent.verticalCenter
215 216 217 218 219 220 221 222
                color:  getMessageColor()
                border.color: "#00000000"
                border.width: 0
                property bool showTriangle: false

                Image {
                    id: messageIcon
                    source: getMessageIcon();
dogmaphobic's avatar
dogmaphobic committed
223
                    height: getProportionalDimmension(16)
224
                    fillMode: Image.PreserveAspectFit
dogmaphobic's avatar
dogmaphobic committed
225
                    anchors.verticalCenter: parent.verticalCenter
226
                    anchors.left: parent.left
227
                    anchors.leftMargin: getProportionalDimmension(8)
dogmaphobic's avatar
dogmaphobic committed
228 229
                }

dogmaphobic's avatar
dogmaphobic committed
230
                Item {
231 232 233 234
                    id: messageTextRect
                    anchors.verticalCenter: parent.verticalCenter
                    anchors.right: parent.right
                    width: messages.width - messageIcon.width
235
                    QGCLabel {
236
                        id: messageText
237
                        text: (activeVehicle.messageCount > 0) ? activeVehicle.messageCount : ''
Don Gagne's avatar
Don Gagne committed
238
                        font.pixelSize: ScreenTools.smallFontPixelSize
239 240 241 242 243 244 245
                        font.weight: Font.DemiBold
                        anchors.verticalCenter: parent.verticalCenter
                        anchors.horizontalCenter: parent.horizontalCenter
                        horizontalAlignment: Text.AlignHCenter
                        color: colorWhite
                    }
                }
dogmaphobic's avatar
dogmaphobic committed
246

247 248
                Image {
                    id: dropDown
249
                    source: "/qmlimages/arrow-down.png"
250
                    visible: (messages.showTriangle) && (activeVehicle.messageCount > 0)
251 252
                    anchors.bottom: parent.bottom
                    anchors.right: parent.right
dogmaphobic's avatar
dogmaphobic committed
253 254
                    anchors.bottomMargin: getProportionalDimmension(3)
                    anchors.rightMargin:  getProportionalDimmension(3)
dogmaphobic's avatar
dogmaphobic committed
255 256
                }

257 258 259 260 261 262 263 264
                Timer {
                    id: mouseOffTimer
                    interval: 2000;
                    running: false;
                    repeat: false
                    onTriggered: {
                        messages.showTriangle = false;
                    }
dogmaphobic's avatar
dogmaphobic committed
265
                }
266 267 268 269 270 271 272 273 274

                MouseArea {
                    anchors.fill: parent
                    hoverEnabled: true
                    onEntered: {
                        messages.showTriangle = true;
                        mouseOffTimer.start();
                    }
                    onClicked: {
dogmaphobic's avatar
dogmaphobic committed
275 276 277
                        var p = mapToItem(toolBarHolder, mouseX, mouseY);
                        mainToolBar.onEnterMessageArea(p.x, p.y);
                    }
dogmaphobic's avatar
dogmaphobic committed
278 279 280 281
                }

            }

Don Gagne's avatar
Don Gagne committed
282 283 284 285
            QGCButton {
                width:                  ScreenTools.defaultFontPixelWidth * 12
                height:                 cellHeight
                visible:                mainToolBar.showMav
dogmaphobic's avatar
dogmaphobic committed
286
                anchors.verticalCenter: parent.verticalCenter
Don Gagne's avatar
Don Gagne committed
287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330
                text:                   "Vehicle " + activeVehicle.id

                menu: vehicleMenu

                Menu {
                    id: vehicleMenu
                }

                Component {
                    id: vehicleMenuItemComponent

                    MenuItem {
                        checkable:      true
                        checked:        vehicle.active
                        onTriggered:    multiVehicleManager.activeVehicle = vehicle

                        property int vehicleId: Number(text.split(" ")[1])
                        property var vehicle:   multiVehicleManager.getVehicleById(vehicleId)
                    }
                }

                property var vehicleMenuItems: []

                function updateVehicleMenu() {
                    // Remove old menu items
                    for (var i=0; i<vehicleMenuItems.length; i++) {
                        vehicleMenu.removeItem(vehicleMenuItems[i])
                    }
                    vehicleMenuItems.length = 0

                    // Add new items
                    for (var i=0; i<multiVehicleManager.vehicles.count; i++) {
                        var vehicle = multiVehicleManager.vehicles.get(i)
                        var menuItem = vehicleMenuItemComponent.createObject(null, { "text": "Vehicle " + vehicle.id })
                        vehicleMenuItems.push(menuItem)
                        vehicleMenu.insertItem(i, menuItem)
                    }
                }

                Component.onCompleted: updateVehicleMenu()

                Connections {
                    target:         multiVehicleManager.vehicles
                    onCountChanged: parent.updateVehicleMenu
331
                }
dogmaphobic's avatar
dogmaphobic committed
332 333
            }

Don Gagne's avatar
Don Gagne committed
334

335 336
            Rectangle {
                id: satelitte
337
                width:  getProportionalDimmension(55)
338
                height: cellHeight
339
                visible: mainToolBar.showGPS
dogmaphobic's avatar
dogmaphobic committed
340
                anchors.verticalCenter: parent.verticalCenter
341 342 343 344 345
                color:  getSatelliteColor();
                border.color: "#00000000"
                border.width: 0

                Image {
Don Gagne's avatar
Don Gagne committed
346
                    source: "qrc:/res/Gps";
dogmaphobic's avatar
dogmaphobic committed
347
                    height: getProportionalDimmension(24)
348 349 350
                    fillMode: Image.PreserveAspectFit
                    anchors.verticalCenter: parent.verticalCenter
                    anchors.left: parent.left
351
                    anchors.leftMargin: getProportionalDimmension(6)
352 353 354 355
                    mipmap: true
                    smooth: true
                }

356
                QGCLabel {
357
                    id: satelitteText
358 359
                    text: activeVehicle.satelliteCount >= 0 ? activeVehicle.satelliteCount : 'NA'
                    font.pixelSize: activeVehicle.satelliteCount >= 0 ? ScreenTools.defaultFontPixelSize : ScreenTools.smallFontPixelSize
360 361 362
                    font.weight: Font.DemiBold
                    anchors.verticalCenter: parent.verticalCenter
                    anchors.right: parent.right
363
                    anchors.rightMargin: getProportionalDimmension(6)
364 365 366
                    horizontalAlignment: Text.AlignRight
                    color: colorWhite
                }
dogmaphobic's avatar
dogmaphobic committed
367 368
            }

369
            Rectangle {
370 371
                id: rssiRC
                width:  getProportionalDimmension(55)
372
                height: cellHeight
373
                visible: mainToolBar.showRSSI && mainToolBar.remoteRSSI <= 100
374
                anchors.verticalCenter: parent.verticalCenter
375
                color:  getRSSIColor(mainToolBar.remoteRSSI);
376 377 378
                border.color: "#00000000"
                border.width: 0
                Image {
379 380
                    source: "qrc:/res/AntennaRC";
                    width: cellHeight * 0.7
381 382 383 384 385 386 387
                    fillMode: Image.PreserveAspectFit
                    anchors.verticalCenter: parent.verticalCenter
                    anchors.left: parent.left
                    anchors.leftMargin: getProportionalDimmension(6)
                    mipmap: true
                    smooth: true
                }
388 389 390 391 392 393
                QGCLabel {
                    text: mainToolBar.remoteRSSI
                    anchors.right: parent.right
                    anchors.rightMargin: getProportionalDimmension(6)
                    anchors.verticalCenter: parent.verticalCenter
                    horizontalAlignment: Text.AlignRight
Don Gagne's avatar
Don Gagne committed
394
                    font.pixelSize: ScreenTools.smallFontPixelSize
395 396 397 398
                    font.weight: Font.DemiBold
                    color: colorWhite
                }
            }
399

400 401 402 403
            Rectangle {
                id: rssiTelemetry
                width:  getProportionalDimmension(80)
                height: cellHeight
404
                visible: mainToolBar.showRSSI && (mainToolBar.telemetryRRSSI > 0) && (mainToolBar.telemetryLRSSI > 0)
405 406 407 408 409 410 411 412 413 414 415 416 417 418
                anchors.verticalCenter: parent.verticalCenter
                color:  getRSSIColor(Math.min(mainToolBar.telemetryRRSSI,mainToolBar.telemetryLRSSI));
                border.color: "#00000000"
                border.width: 0
                Image {
                    source: "qrc:/res/AntennaT";
                    width: cellHeight * 0.7
                    fillMode: Image.PreserveAspectFit
                    anchors.verticalCenter: parent.verticalCenter
                    anchors.left: parent.left
                    anchors.leftMargin: getProportionalDimmension(6)
                    mipmap: true
                    smooth: true
                }
419 420 421 422 423 424 425 426
                Column {
                    anchors.verticalCenter: parent.verticalCenter
                    anchors.right:          parent.right
                    anchors.rightMargin:    getProportionalDimmension(6)
                    Row {
                        anchors.right: parent.right
                        QGCLabel {
                            text: 'R '
Don Gagne's avatar
Don Gagne committed
427
                            font.pixelSize: ScreenTools.smallFontPixelSize
428 429 430 431
                            font.weight: Font.DemiBold
                            color: colorWhite
                        }
                        QGCLabel {
432 433
                            text: mainToolBar.telemetryRRSSI + 'dB'
                            width: getProportionalDimmension(30)
434
                            horizontalAlignment: Text.AlignRight
Don Gagne's avatar
Don Gagne committed
435
                            font.pixelSize: ScreenTools.smallFontPixelSize
436 437 438 439 440 441 442
                            font.weight: Font.DemiBold
                            color: colorWhite
                        }
                    }
                    Row {
                        anchors.right: parent.right
                        QGCLabel {
443
                            text: 'L '
Don Gagne's avatar
Don Gagne committed
444
                            font.pixelSize: ScreenTools.smallFontPixelSize
445 446 447 448
                            font.weight: Font.DemiBold
                            color: colorWhite
                        }
                        QGCLabel {
449 450
                            text: mainToolBar.telemetryLRSSI + 'dB'
                            width: getProportionalDimmension(30)
451
                            horizontalAlignment: Text.AlignRight
Don Gagne's avatar
Don Gagne committed
452
                            font.pixelSize: ScreenTools.smallFontPixelSize
453 454 455 456 457 458 459
                            font.weight: Font.DemiBold
                            color: colorWhite
                        }
                    }
                }
            }

460
            Rectangle {
461
                id: batteryStatus
462
                width:  activeVehicle.batteryConsumed < 0.0 ? getProportionalDimmension(60) : getProportionalDimmension(80)
463
                height: cellHeight
464
                visible: mainToolBar.showBattery
dogmaphobic's avatar
dogmaphobic committed
465
                anchors.verticalCenter: parent.verticalCenter
dogmaphobic's avatar
dogmaphobic committed
466
                color:  getBatteryColor();
467 468 469 470
                border.color: "#00000000"
                border.width: 0
                Image {
                    source: getBatteryIcon();
dogmaphobic's avatar
dogmaphobic committed
471
                    height: getProportionalDimmension(20)
472 473 474
                    fillMode: Image.PreserveAspectFit
                    anchors.verticalCenter: parent.verticalCenter
                    anchors.left: parent.left
dogmaphobic's avatar
dogmaphobic committed
475
                    anchors.leftMargin: getProportionalDimmension(6)
476 477 478 479
                    mipmap: true
                    smooth: true
                }

480
                QGCLabel {
481 482
                    visible: batteryStatus.visible && activeVehicle.batteryConsumed < 0.0
                    text: activeVehicle.batteryVoltage.toFixed(1) + 'V';
Don Gagne's avatar
Don Gagne committed
483
                    font.pixelSize: ScreenTools.smallFontPixelSize
484 485
                    font.weight: Font.DemiBold
                    anchors.right: parent.right
486
                    anchors.rightMargin: getProportionalDimmension(6)
dogmaphobic's avatar
dogmaphobic committed
487
                    anchors.verticalCenter: parent.verticalCenter
488 489 490
                    horizontalAlignment: Text.AlignRight
                    color: colorWhite
                }
491 492 493 494 495

                Column {
                    anchors.verticalCenter: parent.verticalCenter
                    anchors.right:          parent.right
                    anchors.rightMargin:    getProportionalDimmension(6)
496
                    visible: batteryStatus.visible && activeVehicle.batteryConsumed >= 0.0
497
                    QGCLabel {
498
                        text: activeVehicle.batteryVoltage.toFixed(1) + 'V';
499 500
                        width: getProportionalDimmension(30)
                        horizontalAlignment: Text.AlignRight
Don Gagne's avatar
Don Gagne committed
501
                        font.pixelSize: ScreenTools.smallFontPixelSize
502 503 504 505
                        font.weight: Font.DemiBold
                        color: colorWhite
                    }
                    QGCLabel {
506
                        text: activeVehicle.batteryConsumed.toFixed(0) + 'mAh';
507 508
                        width: getProportionalDimmension(30)
                        horizontalAlignment: Text.AlignRight
Don Gagne's avatar
Don Gagne committed
509
                        font.pixelSize: ScreenTools.smallFontPixelSize
510 511 512 513
                        font.weight: Font.DemiBold
                        color: colorWhite
                    }
                }
dogmaphobic's avatar
dogmaphobic committed
514 515
            }

Don Gagne's avatar
Don Gagne committed
516 517 518
            QGCButton {
                width:                  ScreenTools.defaultFontPixelWidth * 11
                height:                 cellHeight
dogmaphobic's avatar
dogmaphobic committed
519
                anchors.verticalCenter: parent.verticalCenter
Don Gagne's avatar
Don Gagne committed
520
                text:                   activeVehicle.armed ? "Armed" : "Disarmed"
dogmaphobic's avatar
dogmaphobic committed
521

Don Gagne's avatar
Don Gagne committed
522 523 524 525
                menu: Menu {
                    MenuItem {
                        enabled: !activeVehicle.armed
                        text: "Arm"
526

Don Gagne's avatar
Don Gagne committed
527 528 529 530 531 532 533 534
                        onTriggered: activeVehicle.armed = true
                    }

                    MenuItem {
                        enabled: activeVehicle.armed
                        text: "Disarm"

                        onTriggered: activeVehicle.armed = false
535 536
                    }
                }
Don Gagne's avatar
Don Gagne committed
537
            }
538

Don Gagne's avatar
Don Gagne committed
539 540 541 542 543
            QGCButton {
                width:                  ScreenTools.defaultFontPixelWidth * 15
                height:                 cellHeight
                anchors.verticalCenter: parent.verticalCenter
                text:                   activeVehicle.flightMode
544

Don Gagne's avatar
Don Gagne committed
545 546 547 548 549 550 551 552 553 554 555 556 557
                menu: flightModesMenu

                Menu {
                    id: flightModesMenu
                }

                Component {
                    id: flightModeMenuItemComponent

                    MenuItem {
                        checkable:      true
                        checked:        activeVehicle.flightMode == text
                        onTriggered:    activeVehicle.flightMode = text
558 559 560
                    }
                }

Don Gagne's avatar
Don Gagne committed
561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583
                property var flightModesMenuItems: []

                function updateFlightModesMenu() {
                    // Remove old menu items
                    for (var i=0; i<flightModesMenuItems.length; i++) {
                        flightModesMenu.removeItem(flightModesMenuItems[i])
                    }
                    flightModesMenuItems.length = 0

                    // Add new items
                    for (var i=0; i<activeVehicle.flightModes.length; i++) {
                        var menuItem = flightModeMenuItemComponent.createObject(null, { "text": activeVehicle.flightModes[i] })
                        flightModesMenuItems.push(menuItem)
                        flightModesMenu.insertItem(i, menuItem)
                    }
                }

                Component.onCompleted: updateFlightModesMenu()

                Connections {
                    target:                 multiVehicleManager
                    onActiveVehicleChanged: parent.updateFlightModesMenu
                }
584
            }
dogmaphobic's avatar
dogmaphobic committed
585 586

            Rectangle {
Don Gagne's avatar
Don Gagne committed
587 588 589 590 591 592
                width:                  ScreenTools.defaultFontPixelWidth * 4
                height:                 cellHeight
                anchors.verticalCenter: parent.verticalCenter
                color:                  colorBlue
                border.width:           0
                visible:                activeVehicle.hilMode
dogmaphobic's avatar
dogmaphobic committed
593

594
                QGCLabel {
Don Gagne's avatar
Don Gagne committed
595 596 597 598
                    anchors.fill:           parent
                    horizontalAlignment:    Text.AlignHCenter
                    verticalAlignment:      Text.AlignVCenter
                    text:                   "HIL"
dogmaphobic's avatar
dogmaphobic committed
599 600
                }
            }
Don Gagne's avatar
Don Gagne committed
601

602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 622 623 624 625 626 627 628 629 630 631 632 633 634 635 636 637 638 639 640 641 642 643 644 645 646 647 648 649 650 651 652 653 654 655 656 657 658 659 660 661 662 663 664 665 666 667 668 669 670 671 672 673 674 675 676 677 678 679 680 681 682 683 684 685 686 687 688 689 690 691 692 693 694 695 696 697 698 699 700 701 702 703 704 705 706 707 708 709 710 711 712 713 714 715 716 717 718 719 720 721 722 723 724 725 726 727 728 729 730 731 732 733 734 735 736 737
        } // Row
    } // Component - activeVehicleComponent

    Row {
        id:         toolRow
        x:          horizontalMargins
        y:          (toolBarHeight - cellHeight) / 2
        height:     cellHeight
        spacing:    getProportionalDimmension(4)

        //---------------------------------------------------------------------
        //-- Main menu for Non Mobile Devices (Chevron Buttons)
        Row {
            id:             row11
            height:         cellHeight
            spacing:        -getProportionalDimmension(12)
            anchors.top:    parent.top
            visible:        !ScreenTools.isMobile

            Connections {
                target: ScreenTools
                onRepaintRequested: {
                    setupButton.repaintChevron   = true;
                    planButton.repaintChevron    = true;
                    flyButton.repaintChevron     = true;
                    analyzeButton.repaintChevron = true;
                }
            }

            ExclusiveGroup { id: mainActionGroup }

            QGCToolBarButton {
                id: setupButton
                width: getProportionalDimmension(90)
                height: cellHeight
                exclusiveGroup: mainActionGroup
                text: qsTr("Setup")
                checked: (mainToolBar.currentView === MainToolBar.ViewSetup)
                onClicked: {
                    mainToolBar.onSetupView();
                }
                z: 1000
            }

            QGCToolBarButton {
                id: planButton
                width: getProportionalDimmension(90)
                height: cellHeight
                exclusiveGroup: mainActionGroup
                text: qsTr("Plan")
                checked: (mainToolBar.currentView === MainToolBar.ViewPlan)
                onClicked: {
                    mainToolBar.onPlanView();
                }
                z: 900
            }

            QGCToolBarButton {
                id: flyButton
                width: getProportionalDimmension(90)
                height: cellHeight
                exclusiveGroup: mainActionGroup
                text: qsTr("Fly")
                checked: (mainToolBar.currentView === MainToolBar.ViewFly)
                onClicked: {
                    mainToolBar.onFlyView();
                }
                z: 800
            }

            QGCToolBarButton {
                id: analyzeButton
                width: getProportionalDimmension(90)
                height: cellHeight
                exclusiveGroup: mainActionGroup
                text: qsTr("Analyze")
                checked: (mainToolBar.currentView === MainToolBar.ViewAnalyze)
                onClicked: {
                    mainToolBar.onAnalyzeView();
                }
                z: 700
            }
        } // Row

        //---------------------------------------------------------------------
        //-- Indicators
        Row {
            id:                     row12
            height:                 cellHeight
            spacing:                cellSpacerSize
            anchors.verticalCenter: parent.verticalCenter

            //-- "Hamburger" menu for Mobile Devices
            Item {
                id:         actionButton
                visible:    ScreenTools.isMobile
                height:     cellHeight
                width:      cellHeight
                Image {
                    id:             buttomImg
                    anchors.fill:   parent
                    source:         "/qmlimages/buttonMore.svg"
                    mipmap:         true
                    smooth:         true
                    antialiasing:   true
                    fillMode:       Image.PreserveAspectFit
                }
                MouseArea {
                    anchors.fill: parent
                    acceptedButtons: Qt.LeftButton
                    onClicked: {
                        if (mouse.button == Qt.LeftButton)
                        {
                            maintMenu.popup();
                        }
                    }
                }
            }

            //-- Separator if Hamburger menu is visible
            Rectangle {
                visible:    actionButton.visible
                height:     cellHeight
                width:      cellHeight
                color:      "#00000000"
                anchors.verticalCenter: parent.verticalCenter
            }

            Loader {
                id:                 activeVehicleLoader
                visible:            showMavStatus()
                sourceComponent:    multiVehicleManager.activeVehicleAvailable ? activeVehicleComponent : undefined

                property real cellHeight:       toolBarHolder.cellHeight
                property real cellSpacerSize:   toolBarHolder.cellSpacerSize
            }
dogmaphobic's avatar
dogmaphobic committed
738 739

            Rectangle {
740
                id: connectionStatus
dogmaphobic's avatar
dogmaphobic committed
741
                width: getProportionalDimmension(160)
742
                height: cellHeight
743
                visible: (mainToolBar.connectionCount > 0 && multiVehicleManager.activeVehicleAvailable && activeVehicle.heartbeatTimeout != 0)
744
                anchors.verticalCenter: parent.verticalCenter
dogmaphobic's avatar
dogmaphobic committed
745 746 747 748
                color: "#00000000"
                border.color: "#00000000"
                border.width: 0

749
                QGCLabel {
750 751
                    id: connectionStatusText
                    text: qsTr("CONNECTION LOST")
Don Gagne's avatar
Don Gagne committed
752
                    font.pixelSize: ScreenTools.defaultFontPixelSize
dogmaphobic's avatar
dogmaphobic committed
753
                    font.weight: Font.DemiBold
754 755
                    anchors.verticalCenter: parent.verticalCenter
                    anchors.horizontalCenter: parent.horizontalCenter
756
                    color: colorRedText
dogmaphobic's avatar
dogmaphobic committed
757 758
                }
            }
Don Gagne's avatar
Don Gagne committed
759 760
        } // Row
    } // Row
dogmaphobic's avatar
dogmaphobic committed
761 762

    Row {
Don Gagne's avatar
Don Gagne committed
763 764 765 766 767 768 769
        id:                     connectRow
        anchors.rightMargin:    verticalMargins
        anchors.right:          parent.right
        anchors.top:            toolRow.top
        anchors.verticalCenter: toolRow.verticalCenter
        height:                 toolRow.height
        spacing:                cellSpacerSize
dogmaphobic's avatar
dogmaphobic committed
770

dogmaphobic's avatar
dogmaphobic committed
771 772
        Menu {
            id: connectMenu
dogmaphobic's avatar
dogmaphobic committed
773
            Component.onCompleted: {
dogmaphobic's avatar
dogmaphobic committed
774 775
                mainToolBar.configListChanged.connect(connectMenu.updateConnectionList);
                connectMenu.updateConnectionList();
dogmaphobic's avatar
dogmaphobic committed
776
            }
dogmaphobic's avatar
dogmaphobic committed
777 778 779 780 781 782 783 784 785 786 787 788 789 790 791 792 793 794
            function addMenuEntry(name) {
                var label = "Add Connection"
                if(name !== "")
                    label = name;
                var mItem = connectMenu.addItem(label);
                var menuSlot = function() {mainToolBar.onConnect(name)};
                mItem.triggered.connect(menuSlot);
            }
            function updateConnectionList() {
                connectMenu.clear();
                for(var i = 0; i < mainToolBar.configList.length; i++) {
                    connectMenu.addMenuEntry(mainToolBar.configList[i]);
                }
                if(mainToolBar.configList.length > 0) {
                    connectMenu.addSeparator();
                }
                // Add "Add Connection" to the list
                connectMenu.addMenuEntry("");
dogmaphobic's avatar
dogmaphobic committed
795 796 797 798
            }
        }

        QGCButton {
dogmaphobic's avatar
dogmaphobic committed
799
            id:         connectButton
dogmaphobic's avatar
dogmaphobic committed
800
            width:      getProportionalDimmension(100)
dogmaphobic's avatar
dogmaphobic committed
801 802 803 804 805 806 807
            visible:    mainToolBar.connectionCount === 0
            text:       qsTr("Connect")
            menu:       connectMenu
        }

        QGCButton {
            id:         disconnectButton
dogmaphobic's avatar
dogmaphobic committed
808
            width:      getProportionalDimmension(100)
dogmaphobic's avatar
dogmaphobic committed
809 810
            visible:    mainToolBar.connectionCount === 1
            text:       qsTr("Disconnect")
dogmaphobic's avatar
dogmaphobic committed
811
            onClicked: {
dogmaphobic's avatar
dogmaphobic committed
812
                mainToolBar.onDisconnect("");
dogmaphobic's avatar
dogmaphobic committed
813 814 815 816 817 818 819 820
            }
        }

        Menu {
            id: disconnectMenu
            Component.onCompleted: {
                mainToolBar.connectedListChanged.connect(disconnectMenu.onConnectedListChanged)
            }
dogmaphobic's avatar
dogmaphobic committed
821 822 823 824 825
            function addMenuEntry(name) {
                var mItem = disconnectMenu.addItem(name);
                var menuSlot = function() {mainToolBar.onDisconnect(name)};
                mItem.triggered.connect(menuSlot);
            }
dogmaphobic's avatar
dogmaphobic committed
826 827 828
            function onConnectedListChanged(conList) {
                disconnectMenu.clear();
                for(var i = 0; i < conList.length; i++) {
dogmaphobic's avatar
dogmaphobic committed
829
                    disconnectMenu.addMenuEntry(conList[i]);
dogmaphobic's avatar
dogmaphobic committed
830 831 832 833 834
                }
            }
        }

        QGCButton {
dogmaphobic's avatar
dogmaphobic committed
835
            id:         multidisconnectButton
dogmaphobic's avatar
dogmaphobic committed
836
            width:      getProportionalDimmension(100)
dogmaphobic's avatar
dogmaphobic committed
837 838 839
            text:       "Disconnect"
            visible:    mainToolBar.connectionCount > 1
            menu:       disconnectMenu
dogmaphobic's avatar
dogmaphobic committed
840
        }
Don Gagne's avatar
Don Gagne committed
841
    } // Row
842 843 844

    // Progress bar
    Rectangle {
Don Gagne's avatar
Don Gagne committed
845 846 847 848 849
        id:             progressBar
        anchors.top:    toolRow.bottom
        height:         getProportionalDimmension(3)
        width:          parent.width * mainToolBar.progressBarValue
        color:          qgcPal.text
850
    }
dogmaphobic's avatar
dogmaphobic committed
851

Don Gagne's avatar
Don Gagne committed
852 853
    // Toolbar message area
    Rectangle {
854 855 856 857 858 859 860 861 862 863 864
        id:                     toolBarMessageArea
        anchors.leftMargin:     horizontalMargins
        anchors.rightMargin:    horizontalMargins
        anchors.topMargin:      verticalMargins
        anchors.bottomMargin:   verticalMargins
        anchors.top:            progressBar.bottom
        anchors.bottom:         parent.bottom
        anchors.left:           parent.left
        anchors.right:          parent.right
        color:                  qgcPal.windowShadeDark
        visible:                false
Don Gagne's avatar
Don Gagne committed
865 866 867 868 869

        QGCLabel {
            id:             toolBarMessage
            anchors.fill:   parent
            wrapMode:       Text.WordWrap
870
			color:			qgcPal.warningText
Don Gagne's avatar
Don Gagne committed
871 872 873 874 875 876 877
        }

        QGCButton {
            id:                     toolBarMessageCloseButton
            anchors.rightMargin:    horizontalMargins
            anchors.top:            parent.top
            anchors.right:          parent.right
878
			primary:				true
Don Gagne's avatar
Don Gagne committed
879 880 881 882 883
            text:                   "Close Message"

            onClicked: {
                parent.visible = false
                mainToolBar.height = toolBarHeight
884
                mainToolBar.onToolBarMessageClosed()
Don Gagne's avatar
Don Gagne committed
885 886 887 888
            }
        }
    }
} // Rectangle