SetupView.qml 13.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
import QtQuick          2.3
import QtQuick.Controls 1.2
12
import QtQuick.Layouts  1.2
13

Gus Grubba's avatar
Gus Grubba committed
14
import QGroundControl                       1.0
15 16 17 18 19
import QGroundControl.AutoPilotPlugin       1.0
import QGroundControl.Palette               1.0
import QGroundControl.Controls              1.0
import QGroundControl.ScreenTools           1.0
import QGroundControl.MultiVehicleManager   1.0
20

21
Rectangle {
22
    id:     setupView
23 24
    color:  qgcPal.window
    z:      QGroundControl.zOrderTopMost
25

Don Gagne's avatar
Don Gagne committed
26
    QGCPalette { id: qgcPal; colorGroupEnabled: true }
27 28 29

    ExclusiveGroup { id: setupButtonGroup }

Don Gagne's avatar
Don Gagne committed
30 31
    readonly property real      _defaultTextHeight: ScreenTools.defaultFontPixelHeight
    readonly property real      _defaultTextWidth:  ScreenTools.defaultFontPixelWidth
32 33 34
    readonly property real      _horizontalMargin:  _defaultTextWidth / 2
    readonly property real      _verticalMargin:    _defaultTextHeight / 2
    readonly property real      _buttonWidth:       _defaultTextWidth * 18
Gus Grubba's avatar
Gus Grubba committed
35
    readonly property string    _armedVehicleText:  qsTr("This operation cannot be performed while the vehicle is armed.")
36

Gus Grubba's avatar
Gus Grubba committed
37
    property bool   _vehicleArmed:                  QGroundControl.multiVehicleManager.activeVehicle ? QGroundControl.multiVehicleManager.activeVehicle.armed : false
Gus Grubba's avatar
Gus Grubba committed
38
    property string _messagePanelText:              qsTr("missing message panel text")
39
    property bool   _fullParameterVehicleAvailable: QGroundControl.multiVehicleManager.parameterReadyVehicleAvailable && !QGroundControl.multiVehicleManager.activeVehicle.parameterManager.missingParameters
40
    property var    _corePlugin:                    QGroundControl.corePlugin
41

42 43
    function showSummaryPanel()
    {
Don Gagne's avatar
Don Gagne committed
44
        if (_fullParameterVehicleAvailable) {
Gus Grubba's avatar
Gus Grubba committed
45
            if (QGroundControl.multiVehicleManager.activeVehicle.autopilot.vehicleComponents.length === 0) {
46
                panelLoader.setSourceComponent(noComponentsVehicleSummaryComponent)
47
            } else {
48
                panelLoader.setSource("VehicleSummary.qml")
49
            }
50
        } else if (QGroundControl.multiVehicleManager.parameterReadyVehicleAvailable) {
51
            panelLoader.setSourceComponent(missingParametersVehicleSummaryComponent)
52
        } else {
53
            panelLoader.setSourceComponent(disconnectedVehicleSummaryComponent)
54 55 56 57 58
        }
    }

    function showFirmwarePanel()
    {
59
        if (!ScreenTools.isMobile) {
60
            panelLoader.setSource("FirmwareUpgrade.qml")
61 62 63
        }
    }

64 65
    function showJoystickPanel()
    {
66
        panelLoader.setSource("JoystickConfig.qml")
67 68
    }

69 70
    function showParametersPanel()
    {
71
        panelLoader.setSource("SetupParameterEditor.qml")
72 73
    }

dogmaphobic's avatar
dogmaphobic committed
74 75
    function showPX4FlowPanel()
    {
76
        panelLoader.setSource("PX4FlowSensor.qml")
dogmaphobic's avatar
dogmaphobic committed
77 78
    }

Don Gagne's avatar
Don Gagne committed
79
    function showVehicleComponentPanel(vehicleComponent)
80
    {
81 82 83
        var autopilotPlugin = QGroundControl.multiVehicleManager.activeVehicle.autopilot
        var prereq = autopilotPlugin.prerequisiteSetup(vehicleComponent)
        if (prereq !== "") {
Gus Grubba's avatar
Gus Grubba committed
84
            _messagePanelText = qsTr("%1 setup must be completed prior to %2 setup.").arg(prereq).arg(vehicleComponent.name)
85
            panelLoader.setSourceComponent(messagePanelComponent)
86
        } else {
87 88 89 90 91 92
            panelLoader.setSource(vehicleComponent.setupSource, vehicleComponent)
            for(var i = 0; i < componentRepeater.count; i++) {
                var obj = componentRepeater.itemAt(i);
                if (obj.text === vehicleComponent.name) {
                    obj.checked = true;
                    break;
93
                }
Don Gagne's avatar
Don Gagne committed
94
            }
95 96 97
        }
    }

98 99
    Component.onCompleted: showSummaryPanel()

100
    Connections {
101
        target: QGroundControl.multiVehicleManager
102

103
        onParameterReadyVehicleAvailableChanged: {
104 105 106 107 108 109 110 111 112
            if(!QGroundControl.skipSetupPage) {
                if (parameterReadyVehicleAvailable || summaryButton.checked || setupButtonGroup.current != firmwareButton) {
                    // Show/Reload the Summary panel when:
                    //      A new vehicle shows up
                    //      The summary panel is already showing and the active vehicle goes away
                    //      The active vehicle goes away and we are not on the Firmware panel.
                    summaryButton.checked = true
                    showSummaryPanel()
                }
113
            }
114 115 116 117
        }
    }

    Component {
118
        id: noComponentsVehicleSummaryComponent
119 120

        Rectangle {
Don Gagne's avatar
Don Gagne committed
121
            color: qgcPal.windowShade
122 123

            QGCLabel {
Don Gagne's avatar
Don Gagne committed
124
                anchors.margins:        _defaultTextWidth * 2
125 126 127 128
                anchors.fill:           parent
                verticalAlignment:      Text.AlignVCenter
                horizontalAlignment:    Text.AlignHCenter
                wrapMode:               Text.WordWrap
129
                font.pointSize:         ScreenTools.mediumFontPointSize
Gus Grubba's avatar
Gus Grubba committed
130
                text:                   qsTr("%1 does not currently support setup of your vehicle type. ").arg(QGroundControl.appName) +
131
                                        "If your vehicle is already configured you can still Fly."
132 133 134 135 136 137

                onLinkActivated: Qt.openUrlExternally(link)
            }
        }
    }

138 139 140 141 142 143 144 145 146 147 148 149
    Component {
        id: disconnectedVehicleSummaryComponent

        Rectangle {
            color: qgcPal.windowShade

            QGCLabel {
                anchors.margins:        _defaultTextWidth * 2
                anchors.fill:           parent
                verticalAlignment:      Text.AlignVCenter
                horizontalAlignment:    Text.AlignHCenter
                wrapMode:               Text.WordWrap
150
                font.pointSize:         ScreenTools.largeFontPointSize
Gus Grubba's avatar
Gus Grubba committed
151
                text:                   qsTr("Vehicle settings and info will display after connecting your vehicle.") +
152
                                        (ScreenTools.isMobile ? "" : " Click Firmware on the left to upgrade your vehicle.")
153 154 155 156 157

                onLinkActivated: Qt.openUrlExternally(link)
            }
        }
    }
158

159 160 161 162
    Component {
        id: missingParametersVehicleSummaryComponent

        Rectangle {
Don Gagne's avatar
Don Gagne committed
163
            color: qgcPal.windowShade
164 165

            QGCLabel {
Don Gagne's avatar
Don Gagne committed
166
                anchors.margins:        _defaultTextWidth * 2
167 168 169 170
                anchors.fill:           parent
                verticalAlignment:      Text.AlignVCenter
                horizontalAlignment:    Text.AlignHCenter
                wrapMode:               Text.WordWrap
171
                font.pointSize:         ScreenTools.mediumFontPointSize
Gus Grubba's avatar
Gus Grubba committed
172 173
                text:                   qsTr("You are currently connected to a vehicle but it did not return the full parameter list. ") +
                                        qsTr("As a result, the full set of vehicle setup options are not available.")
174 175 176 177 178 179

                onLinkActivated: Qt.openUrlExternally(link)
            }
        }
    }

180 181 182 183 184
    Component {
        id: messagePanelComponent

        Item {
            QGCLabel {
Don Gagne's avatar
Don Gagne committed
185
                anchors.margins:        _defaultTextWidth * 2
Don Gagne's avatar
Don Gagne committed
186 187 188 189
                anchors.fill:           parent
                verticalAlignment:      Text.AlignVCenter
                horizontalAlignment:    Text.AlignHCenter
                wrapMode:               Text.WordWrap
190
                font.pointSize:         ScreenTools.mediumFontPointSize
Don Gagne's avatar
Don Gagne committed
191
                text:                   _messagePanelText
192 193 194 195
            }
        }
    }

196 197 198 199 200
    QGCFlickable {
        id:                 buttonScroll
        width:              buttonColumn.width
        anchors.topMargin:  _defaultTextHeight / 2
        anchors.top:        parent.top
dogmaphobic's avatar
dogmaphobic committed
201
        anchors.bottom:     parent.bottom
202 203
        anchors.leftMargin: _horizontalMargin
        anchors.left:       parent.left
204 205
        contentHeight:      buttonColumn.height
        flickableDirection: Flickable.VerticalFlick
dogmaphobic's avatar
dogmaphobic committed
206
        clip:               true
dogmaphobic's avatar
dogmaphobic committed
207

208
        ColumnLayout {
209 210
            id:         buttonColumn
            spacing:    _defaultTextHeight / 2
dogmaphobic's avatar
dogmaphobic committed
211

212
            QGCLabel {
213
                Layout.fillWidth:       true
214 215 216 217 218 219
                text:                   qsTr("Vehicle Setup")
                wrapMode:               Text.WordWrap
                horizontalAlignment:    Text.AlignHCenter
                visible:                !ScreenTools.isShortScreen
            }

220
            Repeater {
221 222
                model:                  _corePlugin ? _corePlugin.settingsPages : []
                visible:                _corePlugin && _corePlugin.options.combineSettingsAndSetup
223
                SubMenuButton {
224 225 226 227
                    imageResource:      modelData.icon
                    setupIndicator:     false
                    exclusiveGroup:     setupButtonGroup
                    text:               modelData.title
228
                    visible:            _corePlugin && _corePlugin.options.combineSettingsAndSetup
229 230
                    onClicked:          panelLoader.setSource(modelData.url)
                    Layout.fillWidth:   true
231
                }
Gus Grubba's avatar
Gus Grubba committed
232 233
            }

234
            SubMenuButton {
235 236 237 238 239
                id:                 summaryButton
                imageResource:      "/qmlimages/VehicleSummaryIcon.png"
                setupIndicator:     false
                checked:            true
                exclusiveGroup:     setupButtonGroup
Gus Grubba's avatar
Gus Grubba committed
240
                text:               qsTr("Summary")
241
                Layout.fillWidth:   true
dogmaphobic's avatar
dogmaphobic committed
242

243 244
                onClicked: showSummaryPanel()
            }
dogmaphobic's avatar
dogmaphobic committed
245

246
            SubMenuButton {
247 248 249 250
                id:                 firmwareButton
                imageResource:      "/qmlimages/FirmwareUpgradeIcon.png"
                setupIndicator:     false
                exclusiveGroup:     setupButtonGroup
251
                visible:            !ScreenTools.isMobile && _corePlugin.options.showFirmwareUpgrade
Gus Grubba's avatar
Gus Grubba committed
252
                text:               qsTr("Firmware")
253
                Layout.fillWidth:   true
dogmaphobic's avatar
dogmaphobic committed
254

255 256
                onClicked: showFirmwarePanel()
            }
dogmaphobic's avatar
dogmaphobic committed
257

258
            SubMenuButton {
259 260
                id:                 px4FlowButton
                exclusiveGroup:     setupButtonGroup
261
                visible:            QGroundControl.multiVehicleManager.activeVehicle ? QGroundControl.multiVehicleManager.activeVehicle.priorityLink.isPX4Flow : false
262
                setupIndicator:     false
Gus Grubba's avatar
Gus Grubba committed
263
                text:               qsTr("PX4Flow")
264 265
                Layout.fillWidth:   true

266 267
                onClicked:      showPX4FlowPanel()
            }
Don Gagne's avatar
Don Gagne committed
268

269
            SubMenuButton {
270 271 272 273
                id:                 joystickButton
                setupIndicator:     true
                setupComplete:      joystickManager.activeJoystick ? joystickManager.activeJoystick.calibrated : false
                exclusiveGroup:     setupButtonGroup
Gus Grubba's avatar
Gus Grubba committed
274
                visible:            _fullParameterVehicleAvailable && joystickManager.joysticks.length !== 0
Gus Grubba's avatar
Gus Grubba committed
275
                text:               qsTr("Joystick")
276
                Layout.fillWidth:   true
277

278 279
                onClicked: showJoystickPanel()
            }
Don Gagne's avatar
Don Gagne committed
280

281 282 283
            Repeater {
                id:     componentRepeater
                model:  _fullParameterVehicleAvailable ? QGroundControl.multiVehicleManager.activeVehicle.autopilot.vehicleComponents : 0
Don Gagne's avatar
Don Gagne committed
284

dogmaphobic's avatar
dogmaphobic committed
285
                SubMenuButton {
286 287 288 289 290
                    imageResource:      modelData.iconResource
                    setupIndicator:     modelData.requiresSetup
                    setupComplete:      modelData.setupComplete
                    exclusiveGroup:     setupButtonGroup
                    text:               modelData.name
Gus Grubba's avatar
Gus Grubba committed
291
                    visible:            modelData.setupSource.toString() !== ""
292
                    Layout.fillWidth:   true
293 294

                    onClicked: showVehicleComponentPanel(modelData)
dogmaphobic's avatar
dogmaphobic committed
295
                }
296 297 298
            }

            SubMenuButton {
299 300
                setupIndicator:     false
                exclusiveGroup:     setupButtonGroup
301 302 303
                visible:            QGroundControl.multiVehicleManager.parameterReadyVehicleAvailable &&
                                    !QGroundControl.multiVehicleManager.activeVehicle.highLatencyLink &&
                                    _corePlugin.showAdvancedUI
Gus Grubba's avatar
Gus Grubba committed
304
                text:               qsTr("Parameters")
305
                Layout.fillWidth:   true
306

307
                onClicked: showParametersPanel()
Don Gagne's avatar
Don Gagne committed
308
            }
dogmaphobic's avatar
dogmaphobic committed
309 310

        }
311
    }
312

313 314 315 316 317 318 319 320 321 322 323 324
    Rectangle {
        id:                     divider
        anchors.topMargin:      _verticalMargin
        anchors.bottomMargin:   _verticalMargin
        anchors.leftMargin:     _horizontalMargin
        anchors.left:           buttonScroll.right
        anchors.top:            parent.top
        anchors.bottom:         parent.bottom
        width:                  1
        color:                  qgcPal.windowShade
    }

325 326
    Loader {
        id:                     panelLoader
327 328 329 330 331
        anchors.topMargin:      _verticalMargin
        anchors.bottomMargin:   _verticalMargin
        anchors.leftMargin:     _horizontalMargin
        anchors.rightMargin:    _horizontalMargin
        anchors.left:           divider.right
332 333 334
        anchors.right:          parent.right
        anchors.top:            parent.top
        anchors.bottom:         parent.bottom
Don Gagne's avatar
Don Gagne committed
335

336 337 338 339 340 341 342 343 344 345
        function setSource(source, vehicleComponent) {
            panelLoader.vehicleComponent = vehicleComponent
            panelLoader.source = source
        }

        function setSourceComponent(sourceComponent, vehicleComponent) {
            panelLoader.vehicleComponent = vehicleComponent
            panelLoader.sourceComponent = sourceComponent
        }

Don Gagne's avatar
Don Gagne committed
346
        property var vehicleComponent
347
    }
348
}