SetupView.qml 13.7 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
            Repeater {
209 210
                model:                  _corePlugin ? _corePlugin.settingsPages : []
                visible:                _corePlugin && _corePlugin.options.combineSettingsAndSetup
211
                SubMenuButton {
212 213 214 215
                    imageResource:      modelData.icon
                    setupIndicator:     false
                    exclusiveGroup:     setupButtonGroup
                    text:               modelData.title
216
                    visible:            _corePlugin && _corePlugin.options.combineSettingsAndSetup
217
                    onClicked:          showPanel(this, modelData.url)
218
                    Layout.fillWidth:   true
219
                }
Gus Grubba's avatar
Gus Grubba committed
220 221
            }

222
            SubMenuButton {
223 224 225 226 227
                id:                 summaryButton
                imageResource:      "/qmlimages/VehicleSummaryIcon.png"
                setupIndicator:     false
                checked:            true
                exclusiveGroup:     setupButtonGroup
Gus Grubba's avatar
Gus Grubba committed
228
                text:               qsTr("Summary")
229
                Layout.fillWidth:   true
dogmaphobic's avatar
dogmaphobic committed
230

231 232
                onClicked: showSummaryPanel()
            }
dogmaphobic's avatar
dogmaphobic committed
233

234
            SubMenuButton {
235 236 237 238
                id:                 firmwareButton
                imageResource:      "/qmlimages/FirmwareUpgradeIcon.png"
                setupIndicator:     false
                exclusiveGroup:     setupButtonGroup
239
                visible:            !ScreenTools.isMobile && _corePlugin.options.showFirmwareUpgrade
Gus Grubba's avatar
Gus Grubba committed
240
                text:               qsTr("Firmware")
241
                Layout.fillWidth:   true
dogmaphobic's avatar
dogmaphobic committed
242

243
                onClicked: showPanel(this, "FirmwareUpgrade.qml")
244
            }
dogmaphobic's avatar
dogmaphobic committed
245

246
            SubMenuButton {
247 248
                id:                 px4FlowButton
                exclusiveGroup:     setupButtonGroup
249
                visible:            QGroundControl.multiVehicleManager.activeVehicle ? QGroundControl.multiVehicleManager.activeVehicle.priorityLink.isPX4Flow : false
250
                setupIndicator:     false
Gus Grubba's avatar
Gus Grubba committed
251
                text:               qsTr("PX4Flow")
252
                Layout.fillWidth:   true
DonLakeFlyer's avatar
DonLakeFlyer committed
253
                onClicked:          showPanel(this, "PX4FlowSensor.qml")
254
            }
Don Gagne's avatar
Don Gagne committed
255

256
            SubMenuButton {
257 258 259 260
                id:                 joystickButton
                setupIndicator:     true
                setupComplete:      joystickManager.activeJoystick ? joystickManager.activeJoystick.calibrated : false
                exclusiveGroup:     setupButtonGroup
Gus Grubba's avatar
Gus Grubba committed
261
                visible:            _fullParameterVehicleAvailable && joystickManager.joysticks.length !== 0
Gus Grubba's avatar
Gus Grubba committed
262
                text:               qsTr("Joystick")
263
                Layout.fillWidth:   true
DonLakeFlyer's avatar
DonLakeFlyer committed
264
                onClicked:          showPanel(this, "JoystickConfig.qml")
265
            }
Don Gagne's avatar
Don Gagne committed
266

267 268 269
            Repeater {
                id:     componentRepeater
                model:  _fullParameterVehicleAvailable ? QGroundControl.multiVehicleManager.activeVehicle.autopilot.vehicleComponents : 0
Don Gagne's avatar
Don Gagne committed
270

dogmaphobic's avatar
dogmaphobic committed
271
                SubMenuButton {
272 273 274 275 276
                    imageResource:      modelData.iconResource
                    setupIndicator:     modelData.requiresSetup
                    setupComplete:      modelData.setupComplete
                    exclusiveGroup:     setupButtonGroup
                    text:               modelData.name
Gus Grubba's avatar
Gus Grubba committed
277
                    visible:            modelData.setupSource.toString() !== ""
278
                    Layout.fillWidth:   true
279
                    onClicked:          showVehicleComponentPanel(modelData)
dogmaphobic's avatar
dogmaphobic committed
280
                }
281 282 283
            }

            SubMenuButton {
284 285
                setupIndicator:     false
                exclusiveGroup:     setupButtonGroup
286 287 288
                visible:            QGroundControl.multiVehicleManager.parameterReadyVehicleAvailable &&
                                    !QGroundControl.multiVehicleManager.activeVehicle.highLatencyLink &&
                                    _corePlugin.showAdvancedUI
Gus Grubba's avatar
Gus Grubba committed
289
                text:               qsTr("Parameters")
290
                Layout.fillWidth:   true
291
                onClicked:          showPanel(this, "SetupParameterEditor.qml")
Don Gagne's avatar
Don Gagne committed
292
            }
dogmaphobic's avatar
dogmaphobic committed
293 294

        }
295
    }
296

297 298 299 300 301 302 303 304 305 306 307 308
    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
    }

309 310
    Loader {
        id:                     panelLoader
311 312 313 314 315
        anchors.topMargin:      _verticalMargin
        anchors.bottomMargin:   _verticalMargin
        anchors.leftMargin:     _horizontalMargin
        anchors.rightMargin:    _horizontalMargin
        anchors.left:           divider.right
316 317 318
        anchors.right:          parent.right
        anchors.top:            parent.top
        anchors.bottom:         parent.bottom
Don Gagne's avatar
Don Gagne committed
319

320
        function setSource(source, vehicleComponent) {
321
            panelLoader.source = ""
322 323 324 325 326
            panelLoader.vehicleComponent = vehicleComponent
            panelLoader.source = source
        }

        function setSourceComponent(sourceComponent, vehicleComponent) {
327
            panelLoader.sourceComponent = undefined
328 329 330 331
            panelLoader.vehicleComponent = vehicleComponent
            panelLoader.sourceComponent = sourceComponent
        }

Don Gagne's avatar
Don Gagne committed
332
        property var vehicleComponent
333
    }
334
}