SetupView.qml 14.1 KB
Newer Older
1 2
/****************************************************************************
 *
Gus Grubba's avatar
Gus Grubba committed
3
 * (c) 2009-2020 QGROUNDCONTROL PROJECT <http://www.qgroundcontrol.org>
4 5 6 7 8
 *
 * 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()
    {
44
        if (mainWindow.preventViewSwitch()) {
45 46
            return
        }
Don Gagne's avatar
Don Gagne committed
47
        if (_fullParameterVehicleAvailable) {
Gus Grubba's avatar
Gus Grubba committed
48
            if (QGroundControl.multiVehicleManager.activeVehicle.autopilot.vehicleComponents.length === 0) {
49
                panelLoader.setSourceComponent(noComponentsVehicleSummaryComponent)
50
            } else {
51
                panelLoader.setSource("VehicleSummary.qml")
52
            }
53
        } else if (QGroundControl.multiVehicleManager.parameterReadyVehicleAvailable) {
54
            panelLoader.setSourceComponent(missingParametersVehicleSummaryComponent)
55
        } else {
56
            panelLoader.setSourceComponent(disconnectedVehicleSummaryComponent)
57
        }
58
        summaryButton.checked = true
59 60
    }

61
    function showPanel(button, qmlSource) {
62
        if (mainWindow.preventViewSwitch()) {
63
            return
64
        }
65 66
        button.checked = true
        panelLoader.setSource(qmlSource)
dogmaphobic's avatar
dogmaphobic committed
67 68
    }

Don Gagne's avatar
Don Gagne committed
69
    function showVehicleComponentPanel(vehicleComponent)
70
    {
71
        if (mainWindow.preventViewSwitch()) {
72 73
            return
        }
74 75 76
        var autopilotPlugin = QGroundControl.multiVehicleManager.activeVehicle.autopilot
        var prereq = autopilotPlugin.prerequisiteSetup(vehicleComponent)
        if (prereq !== "") {
Gus Grubba's avatar
Gus Grubba committed
77
            _messagePanelText = qsTr("%1 setup must be completed prior to %2 setup.").arg(prereq).arg(vehicleComponent.name)
78
            panelLoader.setSourceComponent(messagePanelComponent)
79
        } else {
80 81 82 83
            panelLoader.setSource(vehicleComponent.setupSource, vehicleComponent)
            for(var i = 0; i < componentRepeater.count; i++) {
                var obj = componentRepeater.itemAt(i);
                if (obj.text === vehicleComponent.name) {
84
                    obj.checked = true
85
                    break;
86
                }
Don Gagne's avatar
Don Gagne committed
87
            }
88 89 90
        }
    }

91 92
    Component.onCompleted: showSummaryPanel()

93
    Connections {
94 95 96 97 98 99 100
        target: QGroundControl.corePlugin
        onShowAdvancedUIChanged: {
            if(!QGroundControl.corePlugin.showAdvancedUI) {
                showSummaryPanel()
            }
        }
    }
101

102 103
    Connections {
        target: QGroundControl.multiVehicleManager
104
        onParameterReadyVehicleAvailableChanged: {
105
            if(!QGroundControl.skipSetupPage) {
Gus Grubba's avatar
Gus Grubba committed
106
                if (QGroundControl.multiVehicleManager.parameterReadyVehicleAvailable || summaryButton.checked || setupButtonGroup.current != firmwareButton) {
107 108 109 110 111 112 113
                    // 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()
                }
114
            }
115 116 117 118
        }
    }

    Component {
119
        id: noComponentsVehicleSummaryComponent
120
        Rectangle {
Don Gagne's avatar
Don Gagne committed
121
            color: qgcPal.windowShade
122
            QGCLabel {
Don Gagne's avatar
Don Gagne committed
123
                anchors.margins:        _defaultTextWidth * 2
124 125 126 127
                anchors.fill:           parent
                verticalAlignment:      Text.AlignVCenter
                horizontalAlignment:    Text.AlignHCenter
                wrapMode:               Text.WordWrap
128
                font.pointSize:         ScreenTools.mediumFontPointSize
Gus Grubba's avatar
Gus Grubba committed
129
                text:                   qsTr("%1 does not currently support setup of your vehicle type. ").arg(QGroundControl.appName) +
130
                                        "If your vehicle is already configured you can still Fly."
131 132 133 134 135
                onLinkActivated: Qt.openUrlExternally(link)
            }
        }
    }

136 137 138 139 140 141 142 143 144 145
    Component {
        id: disconnectedVehicleSummaryComponent
        Rectangle {
            color: qgcPal.windowShade
            QGCLabel {
                anchors.margins:        _defaultTextWidth * 2
                anchors.fill:           parent
                verticalAlignment:      Text.AlignVCenter
                horizontalAlignment:    Text.AlignHCenter
                wrapMode:               Text.WordWrap
146
                font.pointSize:         ScreenTools.largeFontPointSize
Gus Grubba's avatar
Gus Grubba committed
147
                text:                   qsTr("Vehicle settings and info will display after connecting your vehicle.") +
148
                                        (ScreenTools.isMobile || !_corePlugin.options.showFirmwareUpgrade ? "" : " Click Firmware on the left to upgrade your vehicle.")
149 150 151 152 153

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

155 156 157 158
    Component {
        id: missingParametersVehicleSummaryComponent

        Rectangle {
Don Gagne's avatar
Don Gagne committed
159
            color: qgcPal.windowShade
160 161

            QGCLabel {
Don Gagne's avatar
Don Gagne committed
162
                anchors.margins:        _defaultTextWidth * 2
163 164 165 166
                anchors.fill:           parent
                verticalAlignment:      Text.AlignVCenter
                horizontalAlignment:    Text.AlignHCenter
                wrapMode:               Text.WordWrap
167
                font.pointSize:         ScreenTools.mediumFontPointSize
Gus Grubba's avatar
Gus Grubba committed
168 169
                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.")
170 171 172 173 174 175

                onLinkActivated: Qt.openUrlExternally(link)
            }
        }
    }

176 177 178 179 180
    Component {
        id: messagePanelComponent

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

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

204
        ColumnLayout {
205 206
            id:         buttonColumn
            spacing:    _defaultTextHeight / 2
dogmaphobic's avatar
dogmaphobic committed
207

208
            QGCLabel {
209
                Layout.fillWidth:       true
210 211 212 213 214 215
                text:                   qsTr("Vehicle Setup")
                wrapMode:               Text.WordWrap
                horizontalAlignment:    Text.AlignHCenter
                visible:                !ScreenTools.isShortScreen
            }

216
            Repeater {
217 218
                model:                  _corePlugin ? _corePlugin.settingsPages : []
                visible:                _corePlugin && _corePlugin.options.combineSettingsAndSetup
219
                SubMenuButton {
220 221 222 223
                    imageResource:      modelData.icon
                    setupIndicator:     false
                    exclusiveGroup:     setupButtonGroup
                    text:               modelData.title
224
                    visible:            _corePlugin && _corePlugin.options.combineSettingsAndSetup
225
                    onClicked:          showPanel(this, modelData.url)
226
                    Layout.fillWidth:   true
227
                }
Gus Grubba's avatar
Gus Grubba committed
228 229
            }

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

239 240
                onClicked: showSummaryPanel()
            }
dogmaphobic's avatar
dogmaphobic committed
241

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

251
                onClicked: showPanel(this, "FirmwareUpgrade.qml")
252
            }
dogmaphobic's avatar
dogmaphobic committed
253

254
            SubMenuButton {
255 256
                id:                 px4FlowButton
                exclusiveGroup:     setupButtonGroup
257
                visible:            QGroundControl.multiVehicleManager.activeVehicle ? QGroundControl.multiVehicleManager.activeVehicle.priorityLink.isPX4Flow : false
258
                setupIndicator:     false
Gus Grubba's avatar
Gus Grubba committed
259
                text:               qsTr("PX4Flow")
260
                Layout.fillWidth:   true
DonLakeFlyer's avatar
DonLakeFlyer committed
261
                onClicked:          showPanel(this, "PX4FlowSensor.qml")
262
            }
Don Gagne's avatar
Don Gagne committed
263

264
            SubMenuButton {
265 266 267 268
                id:                 joystickButton
                setupIndicator:     true
                setupComplete:      joystickManager.activeJoystick ? joystickManager.activeJoystick.calibrated : false
                exclusiveGroup:     setupButtonGroup
Gus Grubba's avatar
Gus Grubba committed
269
                visible:            _fullParameterVehicleAvailable && joystickManager.joysticks.length !== 0
Gus Grubba's avatar
Gus Grubba committed
270
                text:               qsTr("Joystick")
271
                Layout.fillWidth:   true
DonLakeFlyer's avatar
DonLakeFlyer committed
272
                onClicked:          showPanel(this, "JoystickConfig.qml")
273
            }
Don Gagne's avatar
Don Gagne committed
274

275 276 277
            Repeater {
                id:     componentRepeater
                model:  _fullParameterVehicleAvailable ? QGroundControl.multiVehicleManager.activeVehicle.autopilot.vehicleComponents : 0
Don Gagne's avatar
Don Gagne committed
278

dogmaphobic's avatar
dogmaphobic committed
279
                SubMenuButton {
280 281 282 283 284
                    imageResource:      modelData.iconResource
                    setupIndicator:     modelData.requiresSetup
                    setupComplete:      modelData.setupComplete
                    exclusiveGroup:     setupButtonGroup
                    text:               modelData.name
Gus Grubba's avatar
Gus Grubba committed
285
                    visible:            modelData.setupSource.toString() !== ""
286
                    Layout.fillWidth:   true
287
                    onClicked:          showVehicleComponentPanel(modelData)
dogmaphobic's avatar
dogmaphobic committed
288
                }
289 290 291
            }

            SubMenuButton {
292 293
                setupIndicator:     false
                exclusiveGroup:     setupButtonGroup
294 295 296
                visible:            QGroundControl.multiVehicleManager.parameterReadyVehicleAvailable &&
                                    !QGroundControl.multiVehicleManager.activeVehicle.highLatencyLink &&
                                    _corePlugin.showAdvancedUI
Gus Grubba's avatar
Gus Grubba committed
297
                text:               qsTr("Parameters")
298
                Layout.fillWidth:   true
299
                onClicked:          showPanel(this, "SetupParameterEditor.qml")
Don Gagne's avatar
Don Gagne committed
300
            }
dogmaphobic's avatar
dogmaphobic committed
301 302

        }
303
    }
304

305 306 307 308 309 310 311 312 313 314 315 316
    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
    }

317 318
    Loader {
        id:                     panelLoader
319 320 321 322 323
        anchors.topMargin:      _verticalMargin
        anchors.bottomMargin:   _verticalMargin
        anchors.leftMargin:     _horizontalMargin
        anchors.rightMargin:    _horizontalMargin
        anchors.left:           divider.right
324 325 326
        anchors.right:          parent.right
        anchors.top:            parent.top
        anchors.bottom:         parent.bottom
Don Gagne's avatar
Don Gagne committed
327

328
        function setSource(source, vehicleComponent) {
329
            panelLoader.source = ""
330 331 332 333 334
            panelLoader.vehicleComponent = vehicleComponent
            panelLoader.source = source
        }

        function setSourceComponent(sourceComponent, vehicleComponent) {
335
            panelLoader.sourceComponent = undefined
336 337 338 339
            panelLoader.vehicleComponent = vehicleComponent
            panelLoader.sourceComponent = sourceComponent
        }

Don Gagne's avatar
Don Gagne committed
340
        property var vehicleComponent
341
    }
342
}