AirframeComponent.qml 9.59 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


dogmaphobic's avatar
dogmaphobic committed
11
import QtQuick 2.5
12 13
import QtQuick.Controls 1.2
import QtQuick.Controls.Styles 1.2
14
import QtQuick.Dialogs 1.2
15 16 17 18 19 20

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
21
import QGroundControl.ScreenTools 1.0
22

Don Gagne's avatar
Don Gagne committed
23
QGCView {
Don Gagne's avatar
Don Gagne committed
24
    id:         qgcView
25
    viewPanel:  panel
26

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

dogmaphobic's avatar
dogmaphobic committed
29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50
    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
        }
    }

51 52 53
    AirframeComponentController {
        id:         controller
        factPanel:  panel
54

55 56
        Component.onCompleted: {
            if (controller.showCustomConfigPanel) {
57
                showDialog(customConfigDialogComponent, qsTr("Custom Airframe Config"), qgcView.showDialogDefaultWidth, StandardButton.Reset)
58
            }
59 60
        }
    }
61

62 63
    Component {
        id: customConfigDialogComponent
64

65
        QGCViewMessage {
dogmaphobic's avatar
dogmaphobic committed
66
            id:       customConfigDialog
67 68
            message:  qsTr("Your vehicle is using a custom airframe configuration. ") +
                      qsTr("This configuration can only be modified through the Parameter Editor.\n\n") +
Don Gagne's avatar
Don Gagne committed
69
                      qsTr("If you want to reset your airframe configuration and select a standard configuration, click 'Reset' above.")
70

71
            property Fact sys_autostart: controller.getParameterFact(-1, "SYS_AUTOSTART")
72

73 74 75
            function accept() {
                sys_autostart.value = 0
                customConfigDialog.hideDialog()
76
            }
77 78
        }
    }
79

80 81
    Component {
        id: applyRestartDialogComponent
82

83 84
        QGCViewDialog {
            id: applyRestartDialog
85

86 87 88
            function accept() {
                controller.changeAutostart()
                applyRestartDialog.hideDialog()
89 90
            }

91 92 93
            QGCLabel {
                anchors.fill:   parent
                wrapMode:       Text.WordWrap
94 95
                text:           qsTr("Clicking “Apply” will save the changes you have made to your airframe configuration. ") +
                                qsTr("Your vehicle will also be restarted in order to complete the process.")
96 97 98 99 100 101 102 103
            }
        }
    }

    QGCViewPanel {
        id:             panel
        anchors.fill:   parent

104 105 106 107
        readonly property real spacerHeight: ScreenTools.defaultFontPixelHeight

        Item {
            id:             helpApplyRow
Don Gagne's avatar
Don Gagne committed
108 109 110
            anchors.top:    parent.top
            anchors.left:   parent.left
            anchors.right:  parent.right
111
            height:         Math.max(helpText.contentHeight, applyButton.height)
112

113 114 115
            QGCLabel {
                id:             helpText
                width:          parent.width - applyButton.width - 5
116
                text:           (controller.currentVehicleName != "" ?
117 118 119
                                    qsTr("You've connected a %1.").arg(controller.currentVehicleName) :
                                     qsTr("Airframe is not set.")) +
                                qsTr("To change this configuration, select the desired airframe below then click “Apply and Restart”.")
120
                font.family:    ScreenTools.demiboldFontFamily
121 122
                wrapMode:       Text.WordWrap
            }
123

124 125 126
            QGCButton {
                id:             applyButton
                anchors.right:  parent.right
127
                text:           qsTr("Apply and Restart")
128

129
                onClicked:      showDialog(applyRestartDialogComponent, qsTr("Apply and Restart"), qgcView.showDialogDefaultWidth, StandardButton.Apply | StandardButton.Cancel)
130
            }
131 132 133 134
        }

        Item {
            id:             lastSpacer
135 136
            anchors.top:    helpApplyRow.bottom
            height:         parent.spacerHeight
137 138 139
            width:          10
        }

Don Gagne's avatar
Don Gagne committed
140
        QGCFlickable {
dogmaphobic's avatar
dogmaphobic committed
141 142 143 144 145 146 147 148 149 150 151 152
            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()
            }
153 154

            Flow {
dogmaphobic's avatar
dogmaphobic committed
155
                id:         flowView
156
                width:      scroll.width
dogmaphobic's avatar
dogmaphobic committed
157
                spacing:    _boxSpace
158 159 160

                ExclusiveGroup {
                    id: airframeTypeExclusive
161
                }
162

163 164
                Repeater {
                    model: controller.airframeTypes
165

166 167
                    // Outer summary item rectangle
                    Rectangle {
dogmaphobic's avatar
dogmaphobic committed
168
                        width:  _boxWidth
dogmaphobic's avatar
dogmaphobic committed
169
                        height: ScreenTools.defaultFontPixelHeight * 14
Don Gagne's avatar
Don Gagne committed
170
                        color:  qgcPal.window
171

172 173 174
                        readonly property real titleHeight: ScreenTools.defaultFontPixelHeight * 1.75
                        readonly property real innerMargin: ScreenTools.defaultFontPixelWidth

175
                        MouseArea {
Don Gagne's avatar
Don Gagne committed
176 177 178 179 180
                            anchors.fill: parent

                            onClicked: {
                                applyButton.primary = true
                                airframeCheckBox.checked = true
181
                            }
Don Gagne's avatar
Don Gagne committed
182
                        }
183

Don Gagne's avatar
Don Gagne committed
184
                        QGCLabel {
185
                            id:     title
Don Gagne's avatar
Don Gagne committed
186
                            text:   modelData.name
187
                        }
188

Don Gagne's avatar
Don Gagne committed
189 190
                        Rectangle {
                            anchors.topMargin:  ScreenTools.defaultFontPixelHeight / 2
191
                            anchors.top:        title.bottom
Don Gagne's avatar
Don Gagne committed
192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208
                            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
                            }
209

Don Gagne's avatar
Don Gagne committed
210 211 212 213 214 215 216 217 218 219 220
                            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
                                    }
221
                                }
222
                            }
223

Don Gagne's avatar
Don Gagne committed
224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240
                            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
241 242 243
                                    controller.autostartId = modelData.airframes[index].autostartId
                                    airframeCheckBox.checked = true;
                                }
244
                            }
245 246 247 248 249 250
                        }
                    }
                } // Repeater - summary boxes
            } // Flow - summary boxes
        } // Scroll View - summary boxes
    } // QGCViewPanel
251
} // QGCView