MainWindowInner.qml 24.1 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 178
    }

    MessageDialog {
        id:                 unsavedMissionCloseDialog
179
        title:              qsTr("%1 close").arg(QGroundControl.appName)
Tomaz Canabrava's avatar
Tomaz Canabrava committed
180
        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?")
181 182 183 184 185 186
        standardButtons:    StandardButton.Yes | StandardButton.No
        modality:           Qt.ApplicationModal
        visible:            false

        onYes: activeConnectionsCloseDialog.check()

Valentin Platzgummer's avatar
Valentin Platzgummer committed
187
        // here what to do?
188
        function check() {
189
            if (planViewLoader.item && planViewLoader.item.dirty) {
190 191 192 193 194 195 196 197 198
                unsavedMissionCloseDialog.open()
            } else {
                activeConnectionsCloseDialog.check()
            }
        }
    }

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

206 207


208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227
        function check() {
            if (QGroundControl.multiVehicleManager.activeVehicle) {
                activeConnectionsCloseDialog.open()
            } else {
                finishCloseProcess()
            }
        }
    }

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

        onTriggered: {
            mainWindow.reallyClose()
        }
    }

228 229
    property var messageQueue: []

Don Gagne's avatar
Don Gagne committed
230
    function showMessage(message) {
231
        if(criticalMmessageArea.visible || QGroundControl.videoManager.fullScreen) {
232 233 234 235 236 237 238
            messageQueue.push(message)
        } else {
            criticalMessageText.text = message
            criticalMmessageArea.visible = true
        }
    }

239 240 241 242
    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;");
243 244 245
        return message;
    }

246 247
    onFormatedMessageChanged: {
        if(messageArea.visible) {
248
            messageText.append(formatMessage(formatedMessage))
249 250 251 252 253 254
            //-- Hack to scroll down
            messageFlick.flick(0,-500)
        }
    }

    function showMessageArea() {
255 256
        mainWindow.enableToolbar()
        rootLoader.sourceComponent = null
257
        var currentlyVisible = messageArea.visible
258 259 260
        if(currentPopUp) {
            currentPopUp.close()
        }
261 262 263 264 265 266 267 268 269 270 271 272
        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
273 274 275 276
        }
    }

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

dogmaphobic's avatar
dogmaphobic committed
293 294
    //-- Main UI

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

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

323
        //-- Entire tool bar area disable on cammand
324
        DeadMouseArea {
325 326
            id:             toolbarBlocker
            enabled:        false
327
            anchors.fill:   parent
328
        }
329 330
    }

331 332
    WimaToolBar {
        id:                 wimaToolBar
333 334 335 336 337 338
        height:             ScreenTools.toolbarHeight
        anchors.left:       parent.left
        anchors.right:      parent.right
        anchors.top:        parent.top
        z:                  toolBar.z + 1

339
        onShowFlyView: {
340
            wimaToolBar.visible = false
341
            mainWindow.showFlyView()
342 343 344
        }
    }

345 346
    PlanToolBar {
        id:                 planToolBar
Valentin Platzgummer's avatar
Valentin Platzgummer committed
347 348 349 350 351 352 353
        height:             ScreenTools.toolbarHeight
        anchors.left:       parent.left
        anchors.right:      parent.right
        anchors.top:        parent.top
        z:                  toolBar.z + 1

        onShowFlyView: {
354
            planToolBar.visible = false
Valentin Platzgummer's avatar
Valentin Platzgummer committed
355 356 357 358
            mainWindow.showFlyView()
        }
    }

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

    Loader {
        id:                 setupViewLoader
377 378 379 380
        anchors.left:       parent.left
        anchors.right:      parent.right
        anchors.top:        toolBar.bottom
        anchors.bottom:     parent.bottom
381
        visible:            false
382

383 384
        property var planToolBar:        planToolBar
    }
385

dogmaphobic's avatar
dogmaphobic committed
386

387
    Loader {
Don Gagne's avatar
Don Gagne committed
388 389 390
        id:                 planViewLoader
        anchors.fill:       parent
        visible:            false
391 392

        property var toolbar: planToolBar
Don Gagne's avatar
Don Gagne committed
393 394
    }

Valentin Platzgummer's avatar
Valentin Platzgummer committed
395
    Loader {
Valentin Platzgummer's avatar
Valentin Platzgummer committed
396
        id:                 wimaViewLoader
Valentin Platzgummer's avatar
Valentin Platzgummer committed
397 398 399
        anchors.fill:       parent
        visible:            false

400
        property var toolbar:               wimaToolBar
Valentin Platzgummer's avatar
Valentin Platzgummer committed
401 402
    }

403

Don Gagne's avatar
Don Gagne committed
404 405 406 407
    FlightDisplayView {
        id:                 flightView
        anchors.fill:       parent
        visible:            true
408

409
       //-------------------------------------------------------------------------
410 411 412 413 414 415
        //-- 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
416 417 418 419
    }

    Loader {
        id:                 analyzeViewLoader
420 421 422 423 424
        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
425
    }
426

427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452
    //-------------------------------------------------------------------------
    //-- 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 {
453 454 455 456 457 458 459 460 461 462 463
        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

464 465 466 467 468
        function close() {
            currentPopUp = null
            messageText.text    = ""
            messageArea.visible = false
        }
dogmaphobic's avatar
dogmaphobic committed
469 470 471 472 473 474 475
        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
476
        QGCFlickable {
477 478 479 480 481 482 483 484
            id:                 messageFlick
            anchors.margins:    ScreenTools.defaultFontPixelHeight
            anchors.fill:       parent
            contentHeight:      messageText.height
            contentWidth:       messageText.width
            pixelAligned:       true
            clip:               true
            TextEdit {
485 486 487
                id:             messageText
                readOnly:       true
                textFormat:     TextEdit.RichText
488
                color:          qgcPal.text
489 490 491
            }
        }
        //-- Dismiss System Message
492
        QGCColoredImage {
dogmaphobic's avatar
dogmaphobic committed
493
            anchors.margins:    ScreenTools.defaultFontPixelHeight * 0.5
494 495
            anchors.top:        parent.top
            anchors.right:      parent.right
dogmaphobic's avatar
dogmaphobic committed
496
            width:              ScreenTools.isMobile ? ScreenTools.defaultFontPixelHeight * 1.5 : ScreenTools.defaultFontPixelHeight
497
            height:             width
498
            sourceSize.height:  width
499 500 501 502
            source:             "/res/XDelete.svg"
            fillMode:           Image.PreserveAspectFit
            mipmap:             true
            smooth:             true
503
            color:              qgcPal.text
504
            MouseArea {
dogmaphobic's avatar
dogmaphobic committed
505 506
                anchors.fill:       parent
                anchors.margins:    ScreenTools.isMobile ? -ScreenTools.defaultFontPixelHeight : 0
507 508 509 510 511
                onClicked: {
                    messageArea.close()
                }
            }
        }
dogmaphobic's avatar
dogmaphobic committed
512
        //-- Clear Messages
513
        QGCColoredImage {
dogmaphobic's avatar
dogmaphobic committed
514 515 516
            anchors.bottom:     parent.bottom
            anchors.right:      parent.right
            anchors.margins:    ScreenTools.defaultFontPixelHeight * 0.5
dogmaphobic's avatar
dogmaphobic committed
517
            height:             ScreenTools.isMobile ? ScreenTools.defaultFontPixelHeight * 1.5 : ScreenTools.defaultFontPixelHeight
dogmaphobic's avatar
dogmaphobic committed
518 519 520 521 522 523
            width:              height
            sourceSize.height:   height
            source:             "/res/TrashDelete.svg"
            fillMode:           Image.PreserveAspectFit
            mipmap:             true
            smooth:             true
524
            color:              qgcPal.text
dogmaphobic's avatar
dogmaphobic committed
525 526 527 528 529 530 531 532 533 534
            MouseArea {
                anchors.fill:   parent
                onClicked: {
                    if(QGroundControl.multiVehicleManager.activeVehicleAvailable) {
                        activeVehicle.clearMessages();
                        messageArea.close()
                    }
                }
            }
        }
535
    }
dogmaphobic's avatar
dogmaphobic committed
536

537 538 539
    //-------------------------------------------------------------------------
    //-- Critical Message Area
    Rectangle {
Don Gagne's avatar
Don Gagne committed
540 541 542
        id:                         criticalMmessageArea
        width:                      mainWindow.width  * 0.55
        height:                     Math.min(criticalMessageText.height + _textMargins * 2, ScreenTools.defaultFontPixelHeight * 6)
Gus Grubba's avatar
Gus Grubba committed
543
        color:                      qgcPal.alertBackground
Don Gagne's avatar
Don Gagne committed
544 545 546 547
        visible:                    false
        radius:                     ScreenTools.defaultFontPixelHeight * 0.5
        anchors.horizontalCenter:   parent.horizontalCenter
        anchors.top:                parent.top
Don Gagne's avatar
Don Gagne committed
548
        anchors.topMargin:          toolBar.height + ScreenTools.defaultFontPixelHeight / 2
Gus Grubba's avatar
Gus Grubba committed
549
        border.color:               qgcPal.alertBorder
Don Gagne's avatar
Don Gagne committed
550 551 552
        border.width:               2

        readonly property real _textMargins: ScreenTools.defaultFontPixelHeight
553 554 555 556 557 558 559

        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++) {
560 561
                    var text = mainWindow.messageQueue[i]
                    criticalMessageText.append(text)
562 563 564 565 566 567 568 569 570
                }
                //-- Clear it
                mainWindow.messageQueue = []
            } else {
                criticalMessageText.text = ""
                criticalMmessageArea.visible = false
            }
        }

571 572 573 574 575 576 577 578
        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
        }

579 580
        Flickable {
            id:                 criticalMessageFlick
Don Gagne's avatar
Don Gagne committed
581
            anchors.margins:    parent._textMargins
582 583 584 585 586 587
            anchors.fill:       parent
            contentHeight:      criticalMessageText.height
            contentWidth:       criticalMessageText.width
            boundsBehavior:     Flickable.StopAtBounds
            pixelAligned:       true
            clip:               true
588

589 590 591 592 593 594
            TextEdit {
                id:             criticalMessageText
                width:          criticalMmessageArea.width - criticalClose.width - (ScreenTools.defaultFontPixelHeight * 2)
                anchors.left:   parent.left
                readOnly:       true
                textFormat:     TextEdit.RichText
595
                font.pointSize: ScreenTools.defaultFontPointSize
596
                font.family:    ScreenTools.demiboldFontFamily
597
                wrapMode:       TextEdit.WordWrap
Gus Grubba's avatar
Gus Grubba committed
598
                color:          qgcPal.alertText
599 600 601 602 603 604 605 606

                onTextChanged: {
                    if (lifetimeTimer.running) {
                        lifetimeTimer.restart()
                    } else {
                        lifetimeTimer.start() // has no effect if timer is running, hence the if clause
                    }
                }
607 608
            }
        }
609

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

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

        // Message life-time timer
        Timer {
            id: lifetimeTimer
Valentin Platzgummer's avatar
Valentin Platzgummer committed
654
            interval: _messageLifeTime // ms
655 656 657 658 659 660
            repeat: false

            onTriggered: {
                criticalMmessageArea.close()
            }
        }
661
    }
662 663 664 665 666

    //-------------------------------------------------------------------------
    //-- Loader helper for any child, no matter how deep can display an element
    //   in the middle of the main window.
    Loader {
667
        id:         rootLoader
668 669 670
        anchors.centerIn: parent
    }

671
}
Don Gagne's avatar
Don Gagne committed
672