MainWindowInner.qml 24.3 KB
Newer Older
1 2 3 4 5 6 7 8
/****************************************************************************
 *
 *   (c) 2009-2016 QGROUNDCONTROL PROJECT <http://www.qgroundcontrol.org>
 *
 * QGroundControl is licensed according to the terms in the file
 * COPYING.md in the root of the source code directory.
 *
 ****************************************************************************/
9 10


11 12
import QtQuick          2.3
import QtQuick.Controls 1.2
13
import QtQuick.Dialogs  1.2
14
import QtPositioning    5.3
15

16 17 18 19 20 21
import QGroundControl                       1.0
import QGroundControl.Palette               1.0
import QGroundControl.Controls              1.0
import QGroundControl.FlightDisplay         1.0
import QGroundControl.ScreenTools           1.0
import QGroundControl.MultiVehicleManager   1.0
22
import Wima                                 1.0
23

24
/// Inner common QML for mainWindow
25
Item {
26
    id: mainWindow
Don Gagne's avatar
Don Gagne committed
27

28 29
    signal reallyClose

30
    QGCPalette { id: qgcPal; colorGroupEnabled: true }
dogmaphobic's avatar
dogmaphobic committed
31

Valentin Platzgummer's avatar
Valentin Platzgummer committed
32
    property real   fps: 0.0
33 34
    property var    currentPopUp:       null
    property real   currentCenterX:     0
35
    property var    activeVehicle:      QGroundControl.multiVehicleManager.activeVehicle
36
    property string formatedMessage:    activeVehicle ? activeVehicle.formatedMessage : ""
37

38
    property var _viewList: [ settingsViewLoader, setupViewLoader, planViewLoader, wimaViewLoader, flightView, analyzeViewLoader ]
Don Gagne's avatar
Don Gagne committed
39 40 41

    readonly property string _settingsViewSource:   "AppSettings.qml"
    readonly property string _setupViewSource:      "SetupView.qml"
42
    readonly property string _planViewSource:       "PlanView.qml"
Valentin Platzgummer's avatar
Valentin Platzgummer committed
43
    readonly property string _wimaViewSource:       "WimaView.qml"
Don Gagne's avatar
Don Gagne committed
44 45
    readonly property string _analyzeViewSource:    "AnalyzeView.qml"

Valentin Platzgummer's avatar
Valentin Platzgummer committed
46 47
    readonly property int _messageLifeTime: 10000 // ms, messages will be removed from the screen after this time

48
    onHeightChanged: {
49 50 51 52
        //-- We only deal with the available height if within the Fly or Plan view
        if(!setupViewLoader.visible) {
            ScreenTools.availableHeight = parent.height - toolBar.height
        }
53 54
    }

55

56 57 58 59 60 61 62 63
    function disableToolbar() {
        toolbarBlocker.enabled = true
    }

    function enableToolbar() {
        toolbarBlocker.enabled = false
    }

Don Gagne's avatar
Don Gagne committed
64 65 66
    function hideAllViews() {
        for (var i=0; i<_viewList.length; i++) {
            _viewList[i].visible = false
67
        }
68
        planToolBar.visible = false
Don Gagne's avatar
Don Gagne committed
69
    }
70

Don Gagne's avatar
Don Gagne committed
71
    function showSettingsView() {
72 73
        mainWindow.enableToolbar()
        rootLoader.sourceComponent = null
Don Gagne's avatar
Don Gagne committed
74 75
        if(currentPopUp) {
            currentPopUp.close()
76
        }
Don Gagne's avatar
Don Gagne committed
77 78
        //-- In settings view, the full height is available. Set to 0 so it is ignored.
        ScreenTools.availableHeight = 0
79
        hideAllViews()
Don Gagne's avatar
Don Gagne committed
80 81
        if (settingsViewLoader.source != _settingsViewSource) {
            settingsViewLoader.source  = _settingsViewSource
Don Gagne's avatar
Don Gagne committed
82
        }
83
        settingsViewLoader.visible  = true
Don Gagne's avatar
Don Gagne committed
84
        toolBar.checkSettingsButton()
Don Gagne's avatar
Don Gagne committed
85
    }
86

Don Gagne's avatar
Don Gagne committed
87
    function showSetupView() {
88 89
        mainWindow.enableToolbar()
        rootLoader.sourceComponent = null
Don Gagne's avatar
Don Gagne committed
90 91 92
        if(currentPopUp) {
            currentPopUp.close()
        }
93 94
        //-- In setup view, the full height is available. Set to 0 so it is ignored.
        ScreenTools.availableHeight = 0
95
        hideAllViews()
Don Gagne's avatar
Don Gagne committed
96 97
        if (setupViewLoader.source  != _setupViewSource) {
            setupViewLoader.source  = _setupViewSource
98
        }
Don Gagne's avatar
Don Gagne committed
99
        setupViewLoader.visible  = true
Don Gagne's avatar
Don Gagne committed
100 101
        toolBar.checkSetupButton()
    }
102

Don Gagne's avatar
Don Gagne committed
103
    function showPlanView() {
104 105
        mainWindow.enableToolbar()
        rootLoader.sourceComponent = null
106 107 108
        if(currentPopUp) {
            currentPopUp.close()
        }
Don Gagne's avatar
Don Gagne committed
109 110
        if (planViewLoader.source   != _planViewSource) {
            planViewLoader.source   = _planViewSource
111
        }
Don Gagne's avatar
Don Gagne committed
112 113 114
        ScreenTools.availableHeight = parent.height - toolBar.height
        hideAllViews()
        planViewLoader.visible = true
115
        planToolBar.visible = true
Don Gagne's avatar
Don Gagne committed
116
    }
117

Valentin Platzgummer's avatar
Valentin Platzgummer committed
118
    function showWimaView() {
Valentin Platzgummer's avatar
Valentin Platzgummer committed
119 120 121 122 123
        mainWindow.enableToolbar()
        rootLoader.sourceComponent = null
        if(currentPopUp) {
            currentPopUp.close()
        }
Valentin Platzgummer's avatar
Valentin Platzgummer committed
124 125
        if (wimaViewLoader.source   != _wimaViewSource) {
            wimaViewLoader.source   = _wimaViewSource
Valentin Platzgummer's avatar
Valentin Platzgummer committed
126 127 128
        }
        ScreenTools.availableHeight = parent.height - toolBar.height
        hideAllViews()
Valentin Platzgummer's avatar
Valentin Platzgummer committed
129 130
        wimaViewLoader.visible = true
        wimaToolBar.visible = true
Valentin Platzgummer's avatar
Valentin Platzgummer committed
131 132
    }

Don Gagne's avatar
Don Gagne committed
133
    function showFlyView() {
134 135
        mainWindow.enableToolbar()
        rootLoader.sourceComponent = null
Don Gagne's avatar
Don Gagne committed
136 137 138 139 140 141 142
        if(currentPopUp) {
            currentPopUp.close()
        }
        ScreenTools.availableHeight = parent.height - toolBar.height
        hideAllViews()
        flightView.visible = true
        toolBar.checkFlyButton()
Don Gagne's avatar
Don Gagne committed
143
    }
144

Don Gagne's avatar
Don Gagne committed
145
    function showAnalyzeView() {
146 147
        mainWindow.enableToolbar()
        rootLoader.sourceComponent = null
Don Gagne's avatar
Don Gagne committed
148 149 150 151 152 153 154 155 156 157
        if(currentPopUp) {
            currentPopUp.close()
        }
        ScreenTools.availableHeight = 0
        if (analyzeViewLoader.source  != _analyzeViewSource) {
            analyzeViewLoader.source  = _analyzeViewSource
        }
        hideAllViews()
        analyzeViewLoader.visible = true
        toolBar.checkAnalyzeButton()
158 159
    }

160 161 162 163 164 165 166 167 168 169
    /// Start the process of closing QGroundControl. Prompts the user are needed.
    function attemptWindowClose() {
        unsavedMissionCloseDialog.check()
    }

    function finishCloseProcess() {
        QGroundControl.linkManager.shutdown()
        // The above shutdown causes a flurry of activity as the vehicle components are removed. This in turn
        // causes the Windows Version of Qt to crash if you allow the close event to be accepted. In order to prevent
        // the crash, we ignore the close event and setup a delayed timer to close the window after things settle down.
Gus Grubba's avatar
Gus Grubba committed
170 171 172 173 174
        if(ScreenTools.isWindows) {
            delayedWindowCloseTimer.start()
        } else {
            mainWindow.reallyClose()
        }
175 176
    }

177
    // Wima Data Container
178 179
    WimaBridge{
        id: wimaBridge
180 181
    }

182 183
    MessageDialog {
        id:                 unsavedMissionCloseDialog
184
        title:              qsTr("%1 close").arg(QGroundControl.appName)
Tomaz Canabrava's avatar
Tomaz Canabrava committed
185
        text:               qsTr("You have a mission edit in progress which has not been saved/sent. If you close you will lose changes. Are you sure you want to close?")
186 187 188 189 190 191
        standardButtons:    StandardButton.Yes | StandardButton.No
        modality:           Qt.ApplicationModal
        visible:            false

        onYes: activeConnectionsCloseDialog.check()

Valentin Platzgummer's avatar
Valentin Platzgummer committed
192
        // here what to do?
193
        function check() {
194
            if (planViewLoader.item && planViewLoader.item.dirty) {
195 196 197 198 199 200 201 202 203
                unsavedMissionCloseDialog.open()
            } else {
                activeConnectionsCloseDialog.check()
            }
        }
    }

    MessageDialog {
        id:                 activeConnectionsCloseDialog
204
        title:              qsTr("%1 close").arg(QGroundControl.appName)
DonLakeFlyer's avatar
DonLakeFlyer committed
205
        text:               qsTr("There are still active connections to vehicles. Are you sure you want to exit?")
206 207 208 209 210
        standardButtons:    StandardButton.Yes | StandardButton.Cancel
        modality:           Qt.ApplicationModal
        visible:            false
        onYes:              finishCloseProcess()

211 212


213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232
        function check() {
            if (QGroundControl.multiVehicleManager.activeVehicle) {
                activeConnectionsCloseDialog.open()
            } else {
                finishCloseProcess()
            }
        }
    }

    Timer {
        id:         delayedWindowCloseTimer
        interval:   1500
        running:    false
        repeat:     false

        onTriggered: {
            mainWindow.reallyClose()
        }
    }

233 234
    property var messageQueue: []

Don Gagne's avatar
Don Gagne committed
235
    function showMessage(message) {
236
        if(criticalMmessageArea.visible || QGroundControl.videoManager.fullScreen) {
237 238 239 240 241 242 243
            messageQueue.push(message)
        } else {
            criticalMessageText.text = message
            criticalMmessageArea.visible = true
        }
    }

244 245 246 247
    function formatMessage(message) {        
        message = message.replace(new RegExp("<#E>", "g"), "color: " + qgcPal.warningText + "; font: " + (ScreenTools.defaultFontPointSize.toFixed(0) - 1) + "pt monospace;");
        message = message.replace(new RegExp("<#I>", "g"), "color: " + qgcPal.warningText + "; font: " + (ScreenTools.defaultFontPointSize.toFixed(0) - 1) + "pt monospace;");
        message = message.replace(new RegExp("<#N>", "g"), "color: " + qgcPal.text + "; font: " + (ScreenTools.defaultFontPointSize.toFixed(0) - 1) + "pt monospace;");
248 249 250
        return message;
    }

251 252
    onFormatedMessageChanged: {
        if(messageArea.visible) {
253
            messageText.append(formatMessage(formatedMessage))
254 255 256 257 258 259
            //-- Hack to scroll down
            messageFlick.flick(0,-500)
        }
    }

    function showMessageArea() {
260 261
        mainWindow.enableToolbar()
        rootLoader.sourceComponent = null
262
        var currentlyVisible = messageArea.visible
263 264 265
        if(currentPopUp) {
            currentPopUp.close()
        }
266 267 268 269 270 271 272 273 274 275 276 277
        if(!currentlyVisible) {
            if(QGroundControl.multiVehicleManager.activeVehicleAvailable) {
                messageText.text = formatMessage(activeVehicle.formatedMessages)
                //-- Hack to scroll to last message
                for (var i = 0; i < activeVehicle.messageCount; i++)
                    messageFlick.flick(0,-5000)
                activeVehicle.resetMessages()
            } else {
                messageText.text = qsTr("No Messages")
            }
            currentPopUp = messageArea
            messageArea.visible = true
278 279 280 281
        }
    }

    function showPopUp(dropItem, centerX) {
282 283
        mainWindow.enableToolbar()
        rootLoader.sourceComponent = null
284
        var oldIndicator = indicatorDropdown.sourceComponent
285 286
        if(currentPopUp) {
            currentPopUp.close()
Don Gagne's avatar
Don Gagne committed
287
        }
288
        if(oldIndicator !== dropItem) {
289 290
            //console.log(oldIndicator)
            //console.log(dropItem)
291 292 293 294 295
            indicatorDropdown.centerX = centerX
            indicatorDropdown.sourceComponent = dropItem
            indicatorDropdown.visible = true
            currentPopUp = indicatorDropdown
        }
296 297
    }

dogmaphobic's avatar
dogmaphobic committed
298 299
    //-- Main UI

dogmaphobic's avatar
dogmaphobic committed
300 301
    MainToolBar {
        id:                 toolBar
302
        height:             ScreenTools.toolbarHeight
303
        visible:            !QGroundControl.videoManager.fullScreen
dogmaphobic's avatar
dogmaphobic committed
304 305 306
        anchors.left:       parent.left
        anchors.right:      parent.right
        anchors.top:        parent.top
307
        opacity:            planToolBar.visible || wimaToolBar.visible ? 0 : 1
Gus Grubba's avatar
Gus Grubba committed
308
        z:                  QGroundControl.zOrderTopMost
309

Don Gagne's avatar
Don Gagne committed
310 311 312 313
        Component.onCompleted:  ScreenTools.availableHeight = parent.height - toolBar.height
        onShowSettingsView:     mainWindow.showSettingsView()
        onShowSetupView:        mainWindow.showSetupView()
        onShowFlyView:          mainWindow.showFlyView()
Valentin Platzgummer's avatar
Valentin Platzgummer committed
314
        onShowPlanView:         mainWindow.showPlanView()
Valentin Platzgummer's avatar
Valentin Platzgummer committed
315
        onShowWimaView:         mainWindow.showWimaView()
Don Gagne's avatar
Don Gagne committed
316
        onShowAnalyzeView:      mainWindow.showAnalyzeView()
317
        onArmVehicle:           flightView.guidedController.confirmAction(flightView.guidedController.actionArm)
318 319 320 321 322 323 324
        onDisarmVehicle: {
            if (flightView.guidedController.showEmergenyStop) {
                flightView.guidedController.confirmAction(flightView.guidedController.actionEmergencyStop)
            } else {
                flightView.guidedController.confirmAction(flightView.guidedController.actionDisarm)
            }
        }
325 326
        onVtolTransitionToFwdFlight:    flightView.guidedController.confirmAction(flightView.guidedController.actionVtolTransitionToFwdFlight)
        onVtolTransitionToMRFlight:     flightView.guidedController.confirmAction(flightView.guidedController.actionVtolTransitionToMRFlight)
327

328
        //-- Entire tool bar area disable on cammand
329
        DeadMouseArea {
330 331
            id:             toolbarBlocker
            enabled:        false
332
            anchors.fill:   parent
333
        }
334 335
    }

336 337
    WimaToolBar {
        id:                 wimaToolBar
338 339 340 341 342 343
        height:             ScreenTools.toolbarHeight
        anchors.left:       parent.left
        anchors.right:      parent.right
        anchors.top:        parent.top
        z:                  toolBar.z + 1

344
        onShowFlyView: {
345
            wimaToolBar.visible = false
346
            mainWindow.showFlyView()
347 348 349
        }
    }

350 351
    PlanToolBar {
        id:                 planToolBar
Valentin Platzgummer's avatar
Valentin Platzgummer committed
352 353 354 355 356 357 358
        height:             ScreenTools.toolbarHeight
        anchors.left:       parent.left
        anchors.right:      parent.right
        anchors.top:        parent.top
        z:                  toolBar.z + 1

        onShowFlyView: {
359
            planToolBar.visible = false
Valentin Platzgummer's avatar
Valentin Platzgummer committed
360 361 362 363
            mainWindow.showFlyView()
        }
    }

364
    Loader {
Don Gagne's avatar
Don Gagne committed
365 366 367 368 369
        id:                 settingsViewLoader
        anchors.left:       parent.left
        anchors.right:      parent.right
        anchors.top:        toolBar.bottom
        anchors.bottom:     parent.bottom
370
        visible:            false
371
/*
Don Gagne's avatar
Don Gagne committed
372 373 374 375 376
        onVisibleChanged: {
            if (!visible) {
                // Free up the memory for this when not shown. No need to persist.
                source = ""
            }
377
        }*/
378 379 380 381
    }

    Loader {
        id:                 setupViewLoader
382 383 384 385
        anchors.left:       parent.left
        anchors.right:      parent.right
        anchors.top:        toolBar.bottom
        anchors.bottom:     parent.bottom
386
        visible:            false
387

388
        property var planToolBar:        planToolBar
389
        property var wBridge:            wimaBridge
390
    }
391

dogmaphobic's avatar
dogmaphobic committed
392

393
    Loader {
Don Gagne's avatar
Don Gagne committed
394 395 396
        id:                 planViewLoader
        anchors.fill:       parent
        visible:            false
397 398

        property var toolbar: planToolBar
Don Gagne's avatar
Don Gagne committed
399 400
    }

Valentin Platzgummer's avatar
Valentin Platzgummer committed
401
    Loader {
Valentin Platzgummer's avatar
Valentin Platzgummer committed
402
        id:                 wimaViewLoader
Valentin Platzgummer's avatar
Valentin Platzgummer committed
403 404 405
        anchors.fill:       parent
        visible:            false

406
        property var toolbar:               wimaToolBar
407
        property var wBridge:               wimaBridge
Valentin Platzgummer's avatar
Valentin Platzgummer committed
408 409
    }

410

Don Gagne's avatar
Don Gagne committed
411 412 413 414
    FlightDisplayView {
        id:                 flightView
        anchors.fill:       parent
        visible:            true
415

416
        property var wBridge:  wimaBridge
417
       //-------------------------------------------------------------------------
418 419 420 421 422 423
        //-- Loader helper for any child, no matter how deep can display an element
        //   on top of the video window.
        Loader {
            id:             rootVideoLoader
            anchors.centerIn: parent
        }
Don Gagne's avatar
Don Gagne committed
424 425 426 427
    }

    Loader {
        id:                 analyzeViewLoader
428 429 430 431 432
        anchors.left:       parent.left
        anchors.right:      parent.right
        anchors.top:        toolBar.bottom
        anchors.bottom:     parent.bottom
        visible:            false
Don Gagne's avatar
Don Gagne committed
433
    }
434

435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460
    //-------------------------------------------------------------------------
    //-- Dismiss Pop Up Messages
    MouseArea {
        visible:        currentPopUp != null
        enabled:        currentPopUp != null
        anchors.fill:   parent
        onClicked: {
            currentPopUp.close()
        }
    }

    //-------------------------------------------------------------------------
    //-- Indicator Drop Down Info
    Loader {
        id: indicatorDropdown
        visible: false
        property real centerX: 0
        function close() {
            sourceComponent = null
            mainWindow.currentPopUp = null
        }
    }

    //-------------------------------------------------------------------------
    //-- System Message Area
    Rectangle {
461 462 463 464 465 466 467 468 469 470 471
        id:                         messageArea
        width:                      mainWindow.width  * 0.5
        height:                     mainWindow.height * 0.5
        anchors.horizontalCenter:   parent.horizontalCenter
        anchors.top:                parent.top
        anchors.topMargin:          toolBar.height + ScreenTools.defaultFontPixelHeight
        radius:                     ScreenTools.defaultFontPixelHeight * 0.5
        color:                      qgcPal.window
        border.color:               qgcPal.text
        visible:                    false

472 473 474 475 476
        function close() {
            currentPopUp = null
            messageText.text    = ""
            messageArea.visible = false
        }
dogmaphobic's avatar
dogmaphobic committed
477 478 479 480 481 482 483
        MouseArea {
            // This MouseArea prevents the Map below it from getting Mouse events. Without this
            // things like mousewheel will scroll the Flickable and then scroll the map as well.
            anchors.fill:       parent
            preventStealing:    true
            onWheel:            wheel.accepted = true
        }
Don Gagne's avatar
Don Gagne committed
484
        QGCFlickable {
485 486 487 488 489 490 491 492
            id:                 messageFlick
            anchors.margins:    ScreenTools.defaultFontPixelHeight
            anchors.fill:       parent
            contentHeight:      messageText.height
            contentWidth:       messageText.width
            pixelAligned:       true
            clip:               true
            TextEdit {
493 494 495
                id:             messageText
                readOnly:       true
                textFormat:     TextEdit.RichText
496
                color:          qgcPal.text
497 498 499
            }
        }
        //-- Dismiss System Message
500
        QGCColoredImage {
dogmaphobic's avatar
dogmaphobic committed
501
            anchors.margins:    ScreenTools.defaultFontPixelHeight * 0.5
502 503
            anchors.top:        parent.top
            anchors.right:      parent.right
dogmaphobic's avatar
dogmaphobic committed
504
            width:              ScreenTools.isMobile ? ScreenTools.defaultFontPixelHeight * 1.5 : ScreenTools.defaultFontPixelHeight
505
            height:             width
506
            sourceSize.height:  width
507 508 509 510
            source:             "/res/XDelete.svg"
            fillMode:           Image.PreserveAspectFit
            mipmap:             true
            smooth:             true
511
            color:              qgcPal.text
512
            MouseArea {
dogmaphobic's avatar
dogmaphobic committed
513 514
                anchors.fill:       parent
                anchors.margins:    ScreenTools.isMobile ? -ScreenTools.defaultFontPixelHeight : 0
515 516 517 518 519
                onClicked: {
                    messageArea.close()
                }
            }
        }
dogmaphobic's avatar
dogmaphobic committed
520
        //-- Clear Messages
521
        QGCColoredImage {
dogmaphobic's avatar
dogmaphobic committed
522 523 524
            anchors.bottom:     parent.bottom
            anchors.right:      parent.right
            anchors.margins:    ScreenTools.defaultFontPixelHeight * 0.5
dogmaphobic's avatar
dogmaphobic committed
525
            height:             ScreenTools.isMobile ? ScreenTools.defaultFontPixelHeight * 1.5 : ScreenTools.defaultFontPixelHeight
dogmaphobic's avatar
dogmaphobic committed
526 527 528 529 530 531
            width:              height
            sourceSize.height:   height
            source:             "/res/TrashDelete.svg"
            fillMode:           Image.PreserveAspectFit
            mipmap:             true
            smooth:             true
532
            color:              qgcPal.text
dogmaphobic's avatar
dogmaphobic committed
533 534 535 536 537 538 539 540 541 542
            MouseArea {
                anchors.fill:   parent
                onClicked: {
                    if(QGroundControl.multiVehicleManager.activeVehicleAvailable) {
                        activeVehicle.clearMessages();
                        messageArea.close()
                    }
                }
            }
        }
543
    }
dogmaphobic's avatar
dogmaphobic committed
544

545 546 547
    //-------------------------------------------------------------------------
    //-- Critical Message Area
    Rectangle {
Don Gagne's avatar
Don Gagne committed
548 549 550
        id:                         criticalMmessageArea
        width:                      mainWindow.width  * 0.55
        height:                     Math.min(criticalMessageText.height + _textMargins * 2, ScreenTools.defaultFontPixelHeight * 6)
Gus Grubba's avatar
Gus Grubba committed
551
        color:                      qgcPal.alertBackground
Don Gagne's avatar
Don Gagne committed
552 553 554 555
        visible:                    false
        radius:                     ScreenTools.defaultFontPixelHeight * 0.5
        anchors.horizontalCenter:   parent.horizontalCenter
        anchors.top:                parent.top
Don Gagne's avatar
Don Gagne committed
556
        anchors.topMargin:          toolBar.height + ScreenTools.defaultFontPixelHeight / 2
Gus Grubba's avatar
Gus Grubba committed
557
        border.color:               qgcPal.alertBorder
Don Gagne's avatar
Don Gagne committed
558 559 560
        border.width:               2

        readonly property real _textMargins: ScreenTools.defaultFontPixelHeight
561 562 563 564 565 566 567

        function close() {
            //-- Are there messages in the waiting queue?
            if(mainWindow.messageQueue.length) {
                criticalMessageText.text = ""
                //-- Show all messages in queue
                for (var i = 0; i < mainWindow.messageQueue.length; i++) {
568 569
                    var text = mainWindow.messageQueue[i]
                    criticalMessageText.append(text)
570 571 572 573 574 575 576 577 578
                }
                //-- Clear it
                mainWindow.messageQueue = []
            } else {
                criticalMessageText.text = ""
                criticalMmessageArea.visible = false
            }
        }

579 580 581 582 583 584 585 586
        MouseArea {
            // This MouseArea prevents the Map below it from getting Mouse events. Without this
            // things like mousewheel will scroll the Flickable and then scroll the map as well.
            anchors.fill:       parent
            preventStealing:    true
            onWheel:            wheel.accepted = true
        }

587 588
        Flickable {
            id:                 criticalMessageFlick
Don Gagne's avatar
Don Gagne committed
589
            anchors.margins:    parent._textMargins
590 591 592 593 594 595
            anchors.fill:       parent
            contentHeight:      criticalMessageText.height
            contentWidth:       criticalMessageText.width
            boundsBehavior:     Flickable.StopAtBounds
            pixelAligned:       true
            clip:               true
596

597 598 599 600 601 602
            TextEdit {
                id:             criticalMessageText
                width:          criticalMmessageArea.width - criticalClose.width - (ScreenTools.defaultFontPixelHeight * 2)
                anchors.left:   parent.left
                readOnly:       true
                textFormat:     TextEdit.RichText
603
                font.pointSize: ScreenTools.defaultFontPointSize
604
                font.family:    ScreenTools.demiboldFontFamily
605
                wrapMode:       TextEdit.WordWrap
Gus Grubba's avatar
Gus Grubba committed
606
                color:          qgcPal.alertText
607 608 609 610 611 612 613 614

                onTextChanged: {
                    if (lifetimeTimer.running) {
                        lifetimeTimer.restart()
                    } else {
                        lifetimeTimer.start() // has no effect if timer is running, hence the if clause
                    }
                }
615 616
            }
        }
617

618
        //-- Dismiss Critical Message
619
        QGCColoredImage {
620
            id:                 criticalClose
dogmaphobic's avatar
dogmaphobic committed
621
            anchors.margins:    ScreenTools.defaultFontPixelHeight * 0.5
622 623
            anchors.top:        parent.top
            anchors.right:      parent.right
dogmaphobic's avatar
dogmaphobic committed
624
            width:              ScreenTools.isMobile ? ScreenTools.defaultFontPixelHeight * 1.5 : ScreenTools.defaultFontPixelHeight
625
            height:             width
626
            sourceSize.height:  width
627 628
            source:             "/res/XDelete.svg"
            fillMode:           Image.PreserveAspectFit
Gus Grubba's avatar
Gus Grubba committed
629
            color:              qgcPal.alertText
630
            MouseArea {
dogmaphobic's avatar
dogmaphobic committed
631 632
                anchors.fill:       parent
                anchors.margins:    ScreenTools.isMobile ? -ScreenTools.defaultFontPixelHeight : 0
633 634 635 636 637
                onClicked: {
                    criticalMmessageArea.close()
                }
            }
        }
638

639
        //-- More text below indicator
640
        QGCColoredImage {
dogmaphobic's avatar
dogmaphobic committed
641
            anchors.margins:    ScreenTools.defaultFontPixelHeight * 0.5
642 643
            anchors.bottom:     parent.bottom
            anchors.right:      parent.right
dogmaphobic's avatar
dogmaphobic committed
644
            width:              ScreenTools.isMobile ? ScreenTools.defaultFontPixelHeight * 1.5 : ScreenTools.defaultFontPixelHeight
645 646
            height:             width
            sourceSize.height:  width
647 648 649
            source:             "/res/ArrowDown.svg"
            fillMode:           Image.PreserveAspectFit
            visible:            criticalMessageText.lineCount > 5
Gus Grubba's avatar
Gus Grubba committed
650
            color:              qgcPal.alertText
651 652 653 654 655 656 657
            MouseArea {
                anchors.fill:   parent
                onClicked: {
                    criticalMessageFlick.flick(0,-500)
                }
            }
        }
658 659 660 661

        // Message life-time timer
        Timer {
            id: lifetimeTimer
Valentin Platzgummer's avatar
Valentin Platzgummer committed
662
            interval: _messageLifeTime // ms
663 664 665 666 667 668
            repeat: false

            onTriggered: {
                criticalMmessageArea.close()
            }
        }
669
    }
670 671 672 673 674

    //-------------------------------------------------------------------------
    //-- Loader helper for any child, no matter how deep can display an element
    //   in the middle of the main window.
    Loader {
675
        id:         rootLoader
676 677 678
        anchors.centerIn: parent
    }

679
}
Don Gagne's avatar
Don Gagne committed
680