SetupView.qml 13.5 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 string _messagePanelText:              qsTr("missing message panel text")
38
    property bool   _fullParameterVehicleAvailable: QGroundControl.multiVehicleManager.parameterReadyVehicleAvailable && !QGroundControl.multiVehicleManager.activeVehicle.parameterManager.missingParameters
39
    property var    _corePlugin:                    QGroundControl.corePlugin
40

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

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

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

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

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

Don Gagne's avatar
Don Gagne committed
78
    function showVehicleComponentPanel(vehicleComponent)
79
    {
80 81 82 83 84
        var autopilotPlugin = QGroundControl.multiVehicleManager.activeVehicle.autopilot
        var prereq = autopilotPlugin.prerequisiteSetup(vehicleComponent)
        if (prereq !== "") {
            //-- TODO: This cannot be translated when built this way.
            _messagePanelText = prereq + " setup must be completed prior to " + vehicleComponent.name + " setup."
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 213 214 215 216 217 218 219 220
            QGCLabel {
                anchors.left:           parent.left
                anchors.right:          parent.right
                text:                   qsTr("Vehicle Setup")
                wrapMode:               Text.WordWrap
                horizontalAlignment:    Text.AlignHCenter
                visible:                !ScreenTools.isShortScreen
            }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        }
310
    }
311

312 313 314 315 316 317 318 319 320 321 322 323
    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
    }

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

335 336 337 338 339 340 341 342 343 344
        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
345
        property var vehicleComponent
346
    }
347
}