MainWindowInner.qml 23.7 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

32 33
    property var    currentPopUp:       null
    property real   currentCenterX:     0
34
    property var    activeVehicle:      QGroundControl.multiVehicleManager.activeVehicle
35
    property string formatedMessage:    activeVehicle ? activeVehicle.formatedMessage : ""
36

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

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

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

52

53 54 55 56 57 58 59 60
    function disableToolbar() {
        toolbarBlocker.enabled = true
    }

    function enableToolbar() {
        toolbarBlocker.enabled = false
    }

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

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

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

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

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

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

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

157 158 159 160 161 162 163 164 165 166
    /// 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
167 168 169 170 171
        if(ScreenTools.isWindows) {
            delayedWindowCloseTimer.start()
        } else {
            mainWindow.reallyClose()
        }
172 173
    }

174 175 176 177 178
    // Wima Data Container
    WimaDataContainer{
        id: wimaDataContainer
    }

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

        onYes: activeConnectionsCloseDialog.check()

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

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

208 209


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

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

        onTriggered: {
            mainWindow.reallyClose()
        }
    }

230 231
    property var messageQueue: []

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

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

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

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

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

dogmaphobic's avatar
dogmaphobic committed
295 296
    //-- Main UI

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

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

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

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

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

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

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

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

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

385 386 387
        property var planToolBar:        planToolBar
        property var dataContainer:      wimaDataContainer
    }
388

dogmaphobic's avatar
dogmaphobic committed
389

390
    Loader {
Don Gagne's avatar
Don Gagne committed
391 392 393
        id:                 planViewLoader
        anchors.fill:       parent
        visible:            false
394 395

        property var toolbar: planToolBar
Don Gagne's avatar
Don Gagne committed
396 397
    }

Valentin Platzgummer's avatar
Valentin Platzgummer committed
398
    Loader {
Valentin Platzgummer's avatar
Valentin Platzgummer committed
399
        id:                 wimaViewLoader
Valentin Platzgummer's avatar
Valentin Platzgummer committed
400 401 402
        anchors.fill:       parent
        visible:            false

403 404
        property var toolbar:               wimaToolBar
        property var dataContainer:         wimaDataContainer
Valentin Platzgummer's avatar
Valentin Platzgummer committed
405 406
    }

407

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

        property var dataContainer:         wimaDataContainer
414
       //-------------------------------------------------------------------------
415 416 417 418 419 420
        //-- 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
421 422 423 424
    }

    Loader {
        id:                 analyzeViewLoader
425 426 427 428 429
        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
430
    }
431

432 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
    //-------------------------------------------------------------------------
    //-- 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 {
458 459 460 461 462 463 464 465 466 467 468
        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

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

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

        readonly property real _textMargins: ScreenTools.defaultFontPixelHeight
558 559 560 561 562 563 564

        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++) {
565 566
                    var text = mainWindow.messageQueue[i]
                    criticalMessageText.append(text)
567 568 569 570 571 572 573 574 575
                }
                //-- Clear it
                mainWindow.messageQueue = []
            } else {
                criticalMessageText.text = ""
                criticalMmessageArea.visible = false
            }
        }

576 577 578 579 580 581 582 583
        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
        }

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

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

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

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

    //-------------------------------------------------------------------------
    //-- Loader helper for any child, no matter how deep can display an element
    //   in the middle of the main window.
    Loader {
653
        id:         rootLoader
654 655 656
        anchors.centerIn: parent
    }

657
}
Don Gagne's avatar
Don Gagne committed
658