AirframeComponent.qml 10.2 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 70
        Component.onCompleted: {
            if (controller.showCustomConfigPanel) {
                showDialog(customConfigDialogComponent, "Custom Airframe Config", 50, 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 107 108 109 110 111 112 113 114 115 116 117
            QGCLabel {
                anchors.fill:   parent
                wrapMode:       Text.WordWrap
                text:           "Clicking Apply will save the changes you have made to your aiframe configuration. " +
                                "Your vehicle will also be rebooted in order to complete the process. " +
                                "After your vehicle reboots, you can reconnect it to QGroundControl."
            }
        }
    }

    QGCViewPanel {
        id:             panel
        anchors.fill:   parent

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

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

127 128 129 130
            QGCLabel {
                id:             helpText
                width:          parent.width - applyButton.width - 5
                text:           "Please select your airframe type. Click 'Apply and Restart' to reboot the autopilot. Please re-connect then manually."
dogmaphobic's avatar
dogmaphobic committed
131
                font.weight:    Font.DemiBold
132 133
                wrapMode:       Text.WordWrap
            }
134

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

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

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

dogmaphobic's avatar
dogmaphobic committed
151 152 153 154 155 156 157 158 159 160 161 162 163 164
        Flickable {
            id:             scroll
            anchors.top:    lastSpacer.bottom
            anchors.bottom: parent.bottom
            width:          parent.width
            clip:           true
            contentHeight:  flowView.height
            contentWidth:   parent.width
            boundsBehavior:     Flickable.StopAtBounds
            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 {
180
                        id:     airframeBackground
dogmaphobic's avatar
dogmaphobic committed
181
                        width:  _boxWidth
dogmaphobic's avatar
dogmaphobic committed
182
                        height: ScreenTools.defaultFontPixelHeight * 14
183 184
                        color:  (modelData.name != controller.currentAirframeType) ? qgcPal.windowShade : qgcPal.buttonHighlight

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

188
                        MouseArea {
189 190
                                anchors.fill:   parent
                                onClicked:      airframeCheckBox.checked = true
191
                            }
192

193 194 195 196 197
                        Rectangle {
                            id:     title
                            width:  parent.width
                            height: parent.titleHeight
                            color:  qgcPal.windowShadeDark
198

199 200 201
                            QGCLabel {
                                anchors.fill:           parent
                                color:                  qgcPal.buttonText
202 203
                                verticalAlignment:      TextEdit.AlignVCenter
                                horizontalAlignment:    TextEdit.AlignHCenter
204
                                text:                   modelData.name
205
                            }
206
                        }
207

208
                        Image {
209
                            id:                 image
210 211
                            anchors.topMargin:  innerMargin
                            anchors.top:        title.bottom
dogmaphobic's avatar
dogmaphobic committed
212
                            width:              parent.width * 0.75
213 214 215
                            height:             parent.height - title.height - combo.height - (innerMargin * 3)
                            fillMode:           Image.PreserveAspectFit
                            smooth:             true
dogmaphobic's avatar
dogmaphobic committed
216
                            mipmap:             true
217
                            source:             modelData.imageResource
dogmaphobic's avatar
dogmaphobic committed
218
                            anchors.horizontalCenter: parent.horizontalCenter
219
                        }
220

221 222 223 224
                        QGCCheckBox {
                            id:             airframeCheckBox
                            checked:        modelData.name == controller.currentAirframeType
                            exclusiveGroup: airframeTypeExclusive
dogmaphobic's avatar
dogmaphobic committed
225 226 227
                            anchors.bottom: image.bottom
                            anchors.right:  parent.right
                            anchors.rightMargin: innerMargin
228

229 230 231
                            onCheckedChanged: {
                                if (checked && combo.currentIndex != -1) {
                                    controller.autostartId = modelData.airframes[combo.currentIndex].autostartId
232 233 234
                                    airframeBackground.color = qgcPal.buttonHighlight;
                                } else {
                                    airframeBackground.color = qgcPal.windowShade;
235
                                }
236 237
                            }
                        }
238

239
                        QGCComboBox {
240 241 242 243 244 245 246 247
                            id:                 combo
                            objectName:         modelData.airframeType + "ComboBox"
                            x:                  innerMargin
                            anchors.topMargin:  innerMargin
                            anchors.top:        image.bottom
                            width:              parent.width - (innerMargin * 2)
                            currentIndex:       (modelData.name == controller.currentAirframeType) ? controller.currentVehicleIndex : -1
                            model:              modelData.airframes
248

249
                            onActivated: {
250 251 252 253 254
                                if (index != -1) {
                                    currentIndex = index
                                    controller.autostartId = modelData.airframes[index].autostartId
                                    airframeCheckBox.checked = true;
                                }
255
                            }
256 257 258 259 260 261
                        }
                    }
                } // Repeater - summary boxes
            } // Flow - summary boxes
        } // Scroll View - summary boxes
    } // QGCViewPanel
262
} // QGCView