MainWindow.qml 10.4 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
/*=====================================================================

QGroundControl Open Source Ground Control Station

(c) 2009, 2015 QGROUNDCONTROL PROJECT <http://www.qgroundcontrol.org>

This file is part of the QGROUNDCONTROL project

QGROUNDCONTROL is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.

QGROUNDCONTROL is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
GNU General Public License for more details.

You should have received a copy of the GNU General Public License
along with QGROUNDCONTROL. If not, see <http://www.gnu.org/licenses/>.

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

dogmaphobic's avatar
dogmaphobic committed
24
import QtQuick          2.5
25 26 27
import QtQuick.Controls 1.2
import QtPositioning    5.2

28 29 30 31 32 33
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
34 35

/// Qml for MainWindow
36
Item {
dogmaphobic's avatar
dogmaphobic committed
37
    id: mainWindow
Don Gagne's avatar
Don Gagne committed
38

39 40 41
    readonly property string _planViewSource:   "MissionEditor.qml"
    readonly property string _setupViewSource:  "SetupView.qml"

dogmaphobic's avatar
dogmaphobic committed
42 43
    QGCPalette { id: __qgcPal; colorGroupEnabled: true }

44 45 46
    property real   tbHeight:           ScreenTools.isMobile ? (ScreenTools.isTinyScreen ? (mainWindow.width * 0.0666) : (mainWindow.width * 0.05)) : ScreenTools.defaultFontPixelSize * 4
    property int    tbCellHeight:       tbHeight * 0.75
    property real   tbSpacing:          ScreenTools.isMobile ? width * 0.00824 : 9.54
dogmaphobic's avatar
dogmaphobic committed
47
    property real   tbButtonWidth:      tbCellHeight * 1.35
48 49
    property real   availableHeight:    height - tbHeight
    property real   menuButtonWidth:    (tbButtonWidth * 2) + (tbSpacing * 4) + 1
dogmaphobic's avatar
dogmaphobic committed
50

51 52 53 54 55 56 57
    property var    defaultPosition:    QtPositioning.coordinate(37.803784, -122.462276)
    property var    tabletPosition:     defaultPosition

    property var    currentPopUp:       null
    property real   currentCenterX:     0
    property var    activeVehicle:      multiVehicleManager.activeVehicle
    property string formatedMessage:    activeVehicle ? activeVehicle.formatedMessage : ""
58

59
    Connections {
60

61 62 63
        target: controller

        onShowFlyView: {
dogmaphobic's avatar
dogmaphobic committed
64 65 66
            if(currentPopUp) {
                currentPopUp.close()
            }
67 68 69
            flightView.visible          = true
            setupViewLoader.visible     = false
            planViewLoader.visible      = false
70 71 72
        }

        onShowPlanView: {
dogmaphobic's avatar
dogmaphobic committed
73 74 75
            if(currentPopUp) {
                currentPopUp.close()
            }
76 77
            if (planViewLoader.source   != _planViewSource) {
                planViewLoader.source   = _planViewSource
78
            }
79 80 81
            flightView.visible          = false
            setupViewLoader.visible     = false
            planViewLoader.visible      = true
82 83 84
        }

        onShowSetupView: {
dogmaphobic's avatar
dogmaphobic committed
85 86 87
            if(currentPopUp) {
                currentPopUp.close()
            }
88 89
            if (setupViewLoader.source  != _setupViewSource) {
                setupViewLoader.source  = _setupViewSource
90
            }
91 92 93
            flightView.visible          = false
            setupViewLoader.visible     = true
            planViewLoader.visible      = false
94 95
        }

dogmaphobic's avatar
dogmaphobic committed
96
        onShowToolbarMessage: toolBar.showToolbarMessage(message)
97 98 99 100 101 102

        // The following are use for unit testing only

        onShowSetupFirmware:            setupViewLoader.item.showFirmwarePanel()
        onShowSetupParameters:          setupViewLoader.item.showParametersPanel()
        onShowSetupSummary:             setupViewLoader.item.showSummaryPanel()
Don Gagne's avatar
Don Gagne committed
103
        onShowSetupVehicleComponent:    setupViewLoader.item.showVehicleComponentPanel(vehicleComponent)
104 105
    }

dogmaphobic's avatar
dogmaphobic committed
106
    //-- Detect tablet position
107 108 109
    PositionSource {
        id:             positionSource
        updateInterval: 1000
110
        active:         false
111
        onPositionChanged: {
112 113 114 115 116 117 118 119 120 121 122 123
            if(positionSource.valid) {
                if(positionSource.position.coordinate.latitude) {
                    if(Math.abs(positionSource.position.coordinate.latitude)  > 0.001) {
                        if(positionSource.position.coordinate.longitude) {
                            if(Math.abs(positionSource.position.coordinate.longitude)  > 0.001) {
                                tabletPosition = positionSource.position.coordinate
                            }
                        }
                    }
                }
            }
            positionSource.stop()
dogmaphobic's avatar
dogmaphobic committed
124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139
        }
    }

    function showLeftMenu() {
        if(!leftPanel.visible && !leftPanel.item.animateShowDialog.running) {
            leftPanel.visible = true
            leftPanel.item.animateShowDialog.start()
        } else if(leftPanel.visible && !leftPanel.item.animateShowDialog.running) {
            //-- If open, toggle it closed
            hideLeftMenu()
        }
    }

    function hideLeftMenu() {
        if(leftPanel.visible && !leftPanel.item.animateHideDialog.running) {
            leftPanel.item.animateHideDialog.start()
140 141 142
        }
    }

dogmaphobic's avatar
dogmaphobic committed
143 144 145 146
    function setMapInteractive(enabled) {
        flightView.interactive = enabled
    }

147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182
    onFormatedMessageChanged: {
        if(messageArea.visible) {
            messageText.append(formatedMessage)
            //-- Hack to scroll down
            messageFlick.flick(0,-500)
        }
    }

    function showMessageArea() {
        if(currentPopUp) {
            currentPopUp.close()
        }
        if(multiVehicleManager.activeVehicleAvailable) {
            messageText.text = 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 = "No Messages"
        }
        currentPopUp = messageArea
        messageArea.visible = true
        mainWindow.setMapInteractive(false)
    }

    function showPopUp(dropItem, centerX) {
        if(currentPopUp) {
            currentPopUp.close()
        }
        indicatorDropdown.centerX = centerX
        indicatorDropdown.sourceComponent = dropItem
        indicatorDropdown.visible = true
        currentPopUp = indicatorDropdown
    }

dogmaphobic's avatar
dogmaphobic committed
183 184 185 186 187 188 189 190 191 192
    //-- Left Settings Menu
    Loader {
        id:                 leftPanel
        anchors.fill:       mainWindow
        visible:            false
        z:                  QGroundControl.zOrderTopMost + 100
    }

    //-- Main UI

dogmaphobic's avatar
dogmaphobic committed
193 194
    MainToolBar {
        id:                 toolBar
dogmaphobic's avatar
dogmaphobic committed
195
        height:             tbHeight
dogmaphobic's avatar
dogmaphobic committed
196 197 198
        anchors.left:       parent.left
        anchors.right:      parent.right
        anchors.top:        parent.top
dogmaphobic's avatar
dogmaphobic committed
199
        mainWindow:         mainWindow
dogmaphobic's avatar
dogmaphobic committed
200
        opaqueBackground:   leftPanel.visible
dogmaphobic's avatar
dogmaphobic committed
201
        isBackgroundDark:   flightView.isBackgroundDark
Gus Grubba's avatar
Gus Grubba committed
202
        z:                  QGroundControl.zOrderTopMost
dogmaphobic's avatar
dogmaphobic committed
203 204 205
        Component.onCompleted: {
            leftPanel.source = "MainWindowLeftPanel.qml"
        }
206 207 208
    }

    FlightDisplayView {
dogmaphobic's avatar
dogmaphobic committed
209 210
        id:                 flightView
        anchors.fill:       parent
Don Gagne's avatar
Don Gagne committed
211
        availableHeight:    mainWindow.availableHeight
dogmaphobic's avatar
dogmaphobic committed
212
        visible:            true
213 214 215
        Component.onCompleted: {
            positionSource.start()
        }
216 217 218
    }

    Loader {
219
        id:                 planViewLoader
dogmaphobic's avatar
dogmaphobic committed
220
        anchors.fill:       parent
221
        visible:            false
222 223 224 225
    }

    Loader {
        id:                 setupViewLoader
dogmaphobic's avatar
dogmaphobic committed
226
        anchors.fill:       parent
227 228
        visible:            false
    }
dogmaphobic's avatar
dogmaphobic committed
229

230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308
    //-------------------------------------------------------------------------
    //-- 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 {
        id:                 messageArea

        function close() {
            currentPopUp = null
            messageText.text    = ""
            mainWindow.setMapInteractive(true)
            messageArea.visible = false
        }

        width:              mainWindow.width  * 0.5
        height:             mainWindow.height * 0.5
        color:              Qt.rgba(0,0,0,0.75)
        visible:            false
        radius:             ScreenTools.defaultFontPixelHeight * 0.5
        anchors.horizontalCenter:   parent.horizontalCenter
        anchors.top:                parent.top
        anchors.topMargin:          tbHeight + ScreenTools.defaultFontPixelHeight
        Flickable {
            id:                 messageFlick
            anchors.margins:    ScreenTools.defaultFontPixelHeight
            anchors.fill:       parent
            contentHeight:      messageText.height
            contentWidth:       messageText.width
            boundsBehavior:     Flickable.StopAtBounds
            pixelAligned:       true
            clip:               true
            TextEdit {
                id:         messageText
                readOnly:   true
                textFormat: TextEdit.RichText
                color:      "white"
            }
        }
        //-- Dismiss System Message
        Image {
            anchors.margins:    ScreenTools.defaultFontPixelHeight
            anchors.top:        parent.top
            anchors.right:      parent.right
            width:              ScreenTools.defaultFontPixelHeight * 1.5
            height:             ScreenTools.defaultFontPixelHeight * 1.5
            source:             "/res/XDelete.svg"
            fillMode:           Image.PreserveAspectFit
            mipmap:             true
            smooth:             true
            MouseArea {
                anchors.fill:   parent
                onClicked: {
                    messageArea.close()
                }
            }
        }
    }

309
}