ParameterEditor.qml 13.6 KB
Newer Older
Don Gagne's avatar
Don Gagne committed
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/>.

 ======================================================================*/

24 25 26
/// @file
///     @author Don Gagne <don@thegagnes.com>

Don Gagne's avatar
Don Gagne committed
27
import QtQuick 2.3
28
import QtQuick.Controls 1.3
Don Gagne's avatar
Don Gagne committed
29
import QtQuick.Controls.Styles 1.2
Don Gagne's avatar
Don Gagne committed
30
import QtQuick.Dialogs 1.2
Don Gagne's avatar
Don Gagne committed
31 32 33 34 35 36 37 38

import QGroundControl.Controls 1.0
import QGroundControl.Palette 1.0
import QGroundControl.ScreenTools 1.0
import QGroundControl.Controllers 1.0
import QGroundControl.FactSystem 1.0
import QGroundControl.FactControls 1.0

Don Gagne's avatar
Don Gagne committed
39
QGCView {
40
    viewPanel: panel
Don Gagne's avatar
Don Gagne committed
41

Don Gagne's avatar
Don Gagne committed
42 43
    /// true: show full information, false: for use in smaller widgets
    property bool fullMode: true
Don Gagne's avatar
Don Gagne committed
44

Don Gagne's avatar
Don Gagne committed
45 46
    QGCPalette { id: __qgcPal; colorGroupEnabled: true }
    property Fact __editorDialogFact: Fact { }
Don Gagne's avatar
Don Gagne committed
47

Don Gagne's avatar
Don Gagne committed
48 49 50
    readonly property real __leftMargin: 10
    readonly property real __rightMargin: 20
    readonly property int __maxParamChars: 16
Don Gagne's avatar
Don Gagne committed
51

52
    ParameterEditorController { id: controller; factPanel: panel }
Don Gagne's avatar
Don Gagne committed
53

54 55 56
    QGCViewPanel {
        id:             panel
        anchors.fill:   parent
Don Gagne's avatar
Don Gagne committed
57

58 59
        Component {
            id: factRowsComponent
Don Gagne's avatar
Don Gagne committed
60

61 62 63
            Column {
                id:     factColumn
                x:      __leftMargin
Don Gagne's avatar
Don Gagne committed
64

65
                QGCLabel {
Don Gagne's avatar
Don Gagne committed
66
                    height:				defaultTextHeight + (ScreenTools.defaultFontPizelSize * 0.5)
67 68
                    text:               group
                    verticalAlignment:	Text.AlignVCenter
Don Gagne's avatar
Don Gagne committed
69
                    font.pixelSize:     ScreenTools.mediumFontPixelSize
70
                }
Don Gagne's avatar
Don Gagne committed
71

72 73 74 75 76
                Rectangle {
                    width:  parent.width
                    height: 1
                    color:  __qgcPal.text
                }
Don Gagne's avatar
Don Gagne committed
77

78 79
                Repeater {
                    model: controller.getFactsForGroup(componentId, group)
Don Gagne's avatar
Don Gagne committed
80

81 82
                    Column {
                        property Fact modelFact: controller.getParameterFact(componentId, modelData)
Don Gagne's avatar
Don Gagne committed
83

84 85 86
                        Item {
                            x:			__leftMargin
                            width:      parent.width
Don Gagne's avatar
Don Gagne committed
87
                            height:		defaultTextHeight + (ScreenTools.defaultFontPixelSize * 0.5)
Don Gagne's avatar
Don Gagne committed
88

89 90 91 92 93 94 95
                            QGCLabel {
                                id:                 nameLabel
                                width:              defaultTextWidth * (__maxParamChars + 1)
                                height:             parent.height
                                verticalAlignment:	Text.AlignVCenter
                                text:               modelFact.name
                            }
Don Gagne's avatar
Don Gagne committed
96

97 98 99 100 101 102 103 104 105
                            QGCLabel {
                                id:                 valueLabel
                                width:              defaultTextWidth * 20
                                height:             parent.height
                                anchors.left:       nameLabel.right
                                verticalAlignment:	Text.AlignVCenter
                                color:              modelFact.valueEqualsDefault ? __qgcPal.text : "orange"
                                text:               modelFact.valueString + " " + modelFact.units
                            }
Don Gagne's avatar
Don Gagne committed
106

107 108 109 110 111 112 113
                            QGCLabel {
                                height:             parent.height
                                anchors.left:       valueLabel.right
                                verticalAlignment:	Text.AlignVCenter
                                visible:            fullMode
                                text:               modelFact.shortDescription
                            }
Don Gagne's avatar
Don Gagne committed
114

115 116 117
                            MouseArea {
                                anchors.fill:       parent
                                 acceptedButtons:   Qt.LeftButton
Don Gagne's avatar
Don Gagne committed
118

119 120 121
                                onClicked: {
                                    __editorDialogFact = modelFact
                                    showDialog(editorDialogComponent, "Parameter Editor", fullMode ? 50 : -1, StandardButton.Cancel | StandardButton.Save)
Don Gagne's avatar
Don Gagne committed
122 123
                                }
                            }
124
                        }
Don Gagne's avatar
Don Gagne committed
125

126 127 128 129 130 131 132 133 134 135
                        Rectangle {
                            x:      __leftMargin
                            width:  factColumn.width - __leftMargin - __rightMargin
                            height: 1
                            color:  __qgcPal.windowShade
                        }
                    } // Column - Fact
                } // Repeater - Facts
            } // Column - Facts
        } // Component - factRowsComponent
Don Gagne's avatar
Don Gagne committed
136

137 138
        Column {
            anchors.fill: parent
Don Gagne's avatar
Don Gagne committed
139

140 141 142
            Item {
                width:  parent.width
                height: firstButton.height
Don Gagne's avatar
Don Gagne committed
143

144
                QGCLabel {
Don Gagne's avatar
Don Gagne committed
145
                    font.pixelSize: ScreenTools.largeFontPixelSize
146 147 148
                    visible:        fullMode
                    text:           "PARAMETER EDITOR"
                }
Don Gagne's avatar
Don Gagne committed
149

150 151 152 153
                Row {
                    spacing:            10
                    layoutDirection:    Qt.RightToLeft
                    width:              parent.width
154

155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172
                    QGCButton {
                        text:		"Clear RC to Param"
                        onClicked:	controller.clearRCToParam()
                    }
                    QGCButton {
                        text:		"Save to file"
                        visible:	fullMode
                        onClicked:	controller.saveToFile()
                    }
                    QGCButton {
                        text:		"Load from file"
                        visible:	fullMode
                        onClicked:	controller.loadFromFile()
                    }
                    QGCButton {
                        id:			firstButton
                        text:		"Refresh"
                        onClicked:	controller.refresh()
173
                    }
Don Gagne's avatar
Don Gagne committed
174
                }
175
            }
176

177 178 179 180 181
            Item {
                id:		lastSpacer
                height: 10
                width:	5
            }
182

183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201
            Item {
                width:  parent.width
                height: parent.height - (lastSpacer.y + lastSpacer.height)

                ScrollView {
                    id :	groupScroll
                    width:	defaultTextWidth * 25
                    height: parent.height

                    Column {
                        Repeater {
                            model: controller.componentIds

                            Column {
                                id: componentColumn

                                readonly property int componentId: parseInt(modelData)

                                QGCLabel {
Don Gagne's avatar
Don Gagne committed
202
                                    height:				contentHeight + (ScreenTools.defaultFontPixelHeight * 0.5)
203 204
                                    text:               "Component #: " + componentId.toString()
                                    verticalAlignment:	Text.AlignVCenter
Don Gagne's avatar
Don Gagne committed
205
                                    font.pixelSize:     ScreenTools.mediumFontPixelSize
206 207 208 209 210 211 212 213 214 215
                                }

                                Repeater {
                                    model: controller.getGroupsForComponent(componentColumn.componentId)

                                    Column {
                                        QGCButton {
                                            x:		__leftMargin
                                            width: groupScroll.width - __leftMargin - __rightMargin
                                            text:	modelData
Don Gagne's avatar
Don Gagne committed
216

217 218 219 220 221
                                            onClicked: {
                                                factRowsLoader.sourceComponent = null
                                                factRowsLoader.componentId = componentId
                                                factRowsLoader.group = modelData
                                                factRowsLoader.sourceComponent = factRowsComponent
Don Gagne's avatar
Don Gagne committed
222
                                            }
223 224 225 226
                                        }

                                        Item {
                                            width:  1
Don Gagne's avatar
Don Gagne committed
227
                                            height: ScreenTools.defaultFontPixelSize * 0.25
228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258
                                        }
                                    } // Column - Group
                                } // Repeater - Groups

                                Item {
                                    height: 10
                                    width:	10
                                }
                            } // Column - Component
                        } // Repeater - Components
                    } // Column - Component
                } // ScrollView - Groups

                ScrollView {
                    id:             factScrollView
                    anchors.left:   groupScroll.right
                    anchors.right:  parent.right
                    height:         parent.height

                    Loader {
                        id:     factRowsLoader
                        width:  factScrollView.width

                        property int componentId:   controller.componentIds[0]
                        property string group:      controller.getGroupsForComponent(controller.componentIds[0])[0]
                        sourceComponent:            factRowsComponent
                    }
                } // ScrollView - Facts
            } // Item - Group ScrollView + Facts
        } // Column - Outer
    }
Don Gagne's avatar
Don Gagne committed
259

Don Gagne's avatar
Don Gagne committed
260 261
    Component {
        id: editorDialogComponent
Don Gagne's avatar
Don Gagne committed
262

Don Gagne's avatar
Don Gagne committed
263 264
        QGCViewDialog {
            id:             editorDialog
Don Gagne's avatar
Don Gagne committed
265

Don Gagne's avatar
Don Gagne committed
266 267
            ParameterEditorController { id: controller; factPanel: editorDialog }

Don Gagne's avatar
Don Gagne committed
268
            property bool fullMode: true
Don Gagne's avatar
Don Gagne committed
269

Don Gagne's avatar
Don Gagne committed
270 271 272
            function accept() {
                __editorDialogFact.value = valueField.text
                editorDialog.hideDialog()
Don Gagne's avatar
Don Gagne committed
273
            }
Don Gagne's avatar
Don Gagne committed
274

Don Gagne's avatar
Don Gagne committed
275
            Column {
276
                spacing:        defaultTextHeight
Don Gagne's avatar
Don Gagne committed
277 278
                anchors.left:   parent.left
                anchors.right:  parent.right
Don Gagne's avatar
Don Gagne committed
279

Don Gagne's avatar
Don Gagne committed
280 281 282 283
                QGCLabel {
                    width:      parent.width
                    wrapMode:   Text.WordWrap
                    text:       __editorDialogFact.shortDescription ? __editorDialogFact.shortDescription : "Description missing"
Don Gagne's avatar
Don Gagne committed
284
                }
Don Gagne's avatar
Don Gagne committed
285 286 287 288 289 290

                QGCLabel {
                    width:      parent.width
                    wrapMode:   Text.WordWrap
                    visible:    __editorDialogFact.longDescription
                    text:       __editorDialogFact.longDescription
Don Gagne's avatar
Don Gagne committed
291
                }
Don Gagne's avatar
Don Gagne committed
292

Don Gagne's avatar
Don Gagne committed
293 294 295 296
                QGCTextField {
                    id:     valueField
                    text:   __editorDialogFact.valueString
                }
Don Gagne's avatar
Don Gagne committed
297

Don Gagne's avatar
Don Gagne committed
298
                QGCLabel { text: __editorDialogFact.name }
Don Gagne's avatar
Don Gagne committed
299

Don Gagne's avatar
Don Gagne committed
300
                Row {
301
                    spacing: defaultTextWidth
Don Gagne's avatar
Don Gagne committed
302

Don Gagne's avatar
Don Gagne committed
303 304 305
                    QGCLabel { text: "Units:" }
                    QGCLabel { text: __editorDialogFact.units ? __editorDialogFact.units : "none" }
                }
Don Gagne's avatar
Don Gagne committed
306

Don Gagne's avatar
Don Gagne committed
307
                Row {
308
                    spacing: defaultTextWidth
Don Gagne's avatar
Don Gagne committed
309

Don Gagne's avatar
Don Gagne committed
310 311 312
                    QGCLabel { text: "Minimum value:" }
                    QGCLabel { text: __editorDialogFact.min }
                }
Don Gagne's avatar
Don Gagne committed
313

Don Gagne's avatar
Don Gagne committed
314
                Row {
315
                    spacing: defaultTextWidth
Don Gagne's avatar
Don Gagne committed
316

Don Gagne's avatar
Don Gagne committed
317 318 319
                    QGCLabel { text: "Maxmimum value:" }
                    QGCLabel { text: __editorDialogFact.max }
                }
Don Gagne's avatar
Don Gagne committed
320

Don Gagne's avatar
Don Gagne committed
321
                Row {
322
                    spacing: defaultTextWidth
Don Gagne's avatar
Don Gagne committed
323

Don Gagne's avatar
Don Gagne committed
324 325 326
                    QGCLabel { text: "Default value:" }
                    QGCLabel { text: __editorDialogFact.defaultValueAvailable ? __editorDialogFact.defaultValue : "none" }
                }
Don Gagne's avatar
Don Gagne committed
327

Don Gagne's avatar
Don Gagne committed
328 329 330 331 332 333 334
                QGCLabel {
                    width:      parent.width
                    wrapMode:   Text.WordWrap
                    text:       "Warning: Modifying parameters while vehicle is in flight can lead to vehicle instability and possible vehicle loss. " +
                                    "Make sure you know what you are doing and double-check your values before Save!"
                }
            } // Column - Fact information
Don Gagne's avatar
Don Gagne committed
335 336


Don Gagne's avatar
Don Gagne committed
337
            QGCButton {
338
                anchors.rightMargin:    defaultTextWidth
Don Gagne's avatar
Don Gagne committed
339 340 341 342
                anchors.right:          rcButton.left
                anchors.bottom:         parent.bottom
                visible:                __editorDialogFact.defaultValueAvailable
                text:                   "Reset to default"
Don Gagne's avatar
Don Gagne committed
343

Don Gagne's avatar
Don Gagne committed
344 345 346
                onClicked: {
                    __editorDialogFact.value = __editorDialogFact.defaultValue
                    editorDialog.hideDialog()
Don Gagne's avatar
Don Gagne committed
347
                }
Don Gagne's avatar
Don Gagne committed
348 349 350 351 352 353 354 355
            }

            QGCButton {
                id:             rcButton
                anchors.right:  parent.right
                anchors.bottom: parent.bottom
                visible:        __editorDialogFact.defaultValueAvailable
                text:           "Set RC to Param..."
Don Gagne's avatar
Don Gagne committed
356
                onClicked:      controller.setRCToParam(__editorDialogFact.name)
Don Gagne's avatar
Don Gagne committed
357 358 359
            }
        } // Rectangle - editorDialog
    } // Component - Editor Dialog
360
} // QGCView