AirframeComponent.qml 9.99 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
import QtQuick.Controls 1.2
import QtQuick.Controls.Styles 1.2
27
import QtQuick.Dialogs 1.2
28 29 30 31 32 33

import QGroundControl.FactSystem 1.0
import QGroundControl.FactControls 1.0
import QGroundControl.Palette 1.0
import QGroundControl.Controls 1.0
import QGroundControl.Controllers 1.0
Don Gagne's avatar
Don Gagne committed
34
import QGroundControl.ScreenTools 1.0
35

Don Gagne's avatar
Don Gagne committed
36
QGCView {
Don Gagne's avatar
Don Gagne committed
37
    id:         qgcView
38
    viewPanel:  panel
39

40
    QGCPalette { id: qgcPal; colorGroupEnabled: panel.enabled }
Don Gagne's avatar
Don Gagne committed
41

dogmaphobic's avatar
dogmaphobic committed
42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63
    property real _minW:        ScreenTools.defaultFontPixelWidth * 30
    property real _boxWidth:    _minW
    property real _boxSpace:    ScreenTools.defaultFontPixelWidth

    function computeDimensions() {
        var sw  = 0
        var rw  = 0
        var idx = Math.floor(scroll.width / (_minW + ScreenTools.defaultFontPixelWidth))
        if(idx < 1) {
            _boxWidth = scroll.width
            _boxSpace = 0
        } else {
            _boxSpace = 0
            if(idx > 1) {
                _boxSpace = ScreenTools.defaultFontPixelWidth
                sw = _boxSpace * (idx - 1)
            }
            rw = scroll.width - sw
            _boxWidth = rw / idx
        }
    }

64 65 66
    AirframeComponentController {
        id:         controller
        factPanel:  panel
67

68 69
        Component.onCompleted: {
            if (controller.showCustomConfigPanel) {
70
                showDialog(customConfigDialogComponent, "Custom Airframe Config", qgcView.showDialogDefaultWidth, StandardButton.Reset)
71
            }
72 73
        }
    }
74

75 76
    Component {
        id: customConfigDialogComponent
77

78
        QGCViewMessage {
dogmaphobic's avatar
dogmaphobic committed
79 80 81 82
            id:       customConfigDialog
            message:  "Your vehicle is using a custom airframe configuration. " +
                      "This configuration can only be modified through the Parameter Editor.\n\n" +
                      "If you want to Reset your airframe configuration and select a standard configuration, click 'Reset' above."
83

84
            property Fact sys_autostart: controller.getParameterFact(-1, "SYS_AUTOSTART")
85

86 87 88
            function accept() {
                sys_autostart.value = 0
                customConfigDialog.hideDialog()
89
            }
90 91
        }
    }
92

93 94
    Component {
        id: applyRestartDialogComponent
95

96 97
        QGCViewDialog {
            id: applyRestartDialog
98

99 100 101
            function accept() {
                controller.changeAutostart()
                applyRestartDialog.hideDialog()
102 103
            }

104 105 106
            QGCLabel {
                anchors.fill:   parent
                wrapMode:       Text.WordWrap
Don Gagne's avatar
Don Gagne committed
107 108
                text:           "Clicking “Apply” will save the changes you have made to your airframe configuration. " +
                                "Your vehicle will also be restarted in order to complete the process."
109 110 111 112 113 114 115 116
            }
        }
    }

    QGCViewPanel {
        id:             panel
        anchors.fill:   parent

117 118 119 120
        readonly property real spacerHeight: ScreenTools.defaultFontPixelHeight

        Item {
            id:             helpApplyRow
Don Gagne's avatar
Don Gagne committed
121 122 123
            anchors.top:    parent.top
            anchors.left:   parent.left
            anchors.right:  parent.right
124
            height:         Math.max(helpText.contentHeight, applyButton.height)
125

126 127 128
            QGCLabel {
                id:             helpText
                width:          parent.width - applyButton.width - 5
Don Gagne's avatar
Don Gagne committed
129 130 131
                text:           "You've connected a " +
                                controller.currentVehicleName +
                                ". If you’d like to change this configuration, select the desired airframe below then click “Apply and Restart”."
dogmaphobic's avatar
dogmaphobic committed
132
                font.weight:    Font.DemiBold
133 134
                wrapMode:       Text.WordWrap
            }
135

136 137 138 139 140
            QGCButton {
                id:             applyButton
                anchors.right:  parent.right
                text:           "Apply and Restart"

141
                onClicked:      showDialog(applyRestartDialogComponent, "Apply and Restart", qgcView.showDialogDefaultWidth, StandardButton.Apply | StandardButton.Cancel)
142
            }
143 144 145 146
        }

        Item {
            id:             lastSpacer
147 148
            anchors.top:    helpApplyRow.bottom
            height:         parent.spacerHeight
149 150 151
            width:          10
        }

Don Gagne's avatar
Don Gagne committed
152
        QGCFlickable {
dogmaphobic's avatar
dogmaphobic committed
153 154 155 156 157 158 159 160 161 162 163 164
            id:             scroll
            anchors.top:    lastSpacer.bottom
            anchors.bottom: parent.bottom
            width:          parent.width
            clip:           true
            contentHeight:  flowView.height
            contentWidth:   parent.width
            flickableDirection: Flickable.VerticalFlick

            onWidthChanged: {
                computeDimensions()
            }
165 166

            Flow {
dogmaphobic's avatar
dogmaphobic committed
167
                id:         flowView
168
                width:      scroll.width
dogmaphobic's avatar
dogmaphobic committed
169
                spacing:    _boxSpace
170 171 172

                ExclusiveGroup {
                    id: airframeTypeExclusive
173
                }
174

175 176
                Repeater {
                    model: controller.airframeTypes
177

178 179
                    // Outer summary item rectangle
                    Rectangle {
dogmaphobic's avatar
dogmaphobic committed
180
                        width:  _boxWidth
dogmaphobic's avatar
dogmaphobic committed
181
                        height: ScreenTools.defaultFontPixelHeight * 14
Don Gagne's avatar
Don Gagne committed
182
                        color:  qgcPal.window
183

184 185 186
                        readonly property real titleHeight: ScreenTools.defaultFontPixelHeight * 1.75
                        readonly property real innerMargin: ScreenTools.defaultFontPixelWidth

187
                        MouseArea {
Don Gagne's avatar
Don Gagne committed
188 189 190 191 192
                            anchors.fill: parent

                            onClicked: {
                                applyButton.primary = true
                                airframeCheckBox.checked = true
193
                            }
Don Gagne's avatar
Don Gagne committed
194
                        }
195

Don Gagne's avatar
Don Gagne committed
196
                        QGCLabel {
197
                            id:     title
Don Gagne's avatar
Don Gagne committed
198
                            text:   modelData.name
199
                        }
200

Don Gagne's avatar
Don Gagne committed
201 202
                        Rectangle {
                            anchors.topMargin:  ScreenTools.defaultFontPixelHeight / 2
203
                            anchors.top:        title.bottom
Don Gagne's avatar
Don Gagne committed
204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220
                            anchors.bottom:     parent.bottom
                            anchors.left:       parent.left
                            anchors.right:      parent.right
                            color:              airframeCheckBox.checked ? qgcPal.buttonHighlight : qgcPal.windowShade

                            Image {
                                id:                 image
                                anchors.margins:    innerMargin
                                anchors.top:        parent.top
                                anchors.bottom:     combo.top
                                anchors.left:       parent.left
                                anchors.right:      parent.right
                                fillMode:           Image.PreserveAspectFit
                                smooth:             true
                                mipmap:             true
                                source:             modelData.imageResource
                            }
221

Don Gagne's avatar
Don Gagne committed
222 223 224 225 226 227 228 229 230 231 232
                            QGCCheckBox {
                                // Although this item is invisible we still use it to manage state
                                id:             airframeCheckBox
                                checked:        modelData.name == controller.currentAirframeType
                                exclusiveGroup: airframeTypeExclusive
                                visible:        false

                                onCheckedChanged: {
                                    if (checked && combo.currentIndex != -1) {
                                        controller.autostartId = modelData.airframes[combo.currentIndex].autostartId
                                    }
233
                                }
234
                            }
235

Don Gagne's avatar
Don Gagne committed
236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252
                            QGCComboBox {
                                id:                 combo
                                objectName:         modelData.airframeType + "ComboBox"
                                anchors.margins:    innerMargin
                                anchors.bottom:     parent.bottom
                                anchors.left:       parent.left
                                anchors.right:      parent.right
                                model:              modelData.airframes

                                Component.onCompleted: {
                                    if (airframeCheckBox.checked) {
                                        currentIndex = controller.currentVehicleIndex
                                    }
                                }

                                onActivated: {
                                    applyButton.primary = true
253 254 255
                                    controller.autostartId = modelData.airframes[index].autostartId
                                    airframeCheckBox.checked = true;
                                }
256
                            }
257 258 259 260 261 262
                        }
                    }
                } // Repeater - summary boxes
            } // Flow - summary boxes
        } // Scroll View - summary boxes
    } // QGCViewPanel
263
} // QGCView