ParameterEditor.qml 14.5 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 40
QGCView {
    viewComponent: parameterList
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 47
    QGCPalette { id: __qgcPal; colorGroupEnabled: true }
    QGCLabel { id: __textMeasure; text: "X"; visible: false }
    property Fact __editorDialogFact: Fact { }
Don Gagne's avatar
Don Gagne committed
48 49


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

Don Gagne's avatar
Don Gagne committed
54 55
    property real __textHeight: __textMeasure.contentHeight
    property real __textWidth:  __textMeasure.contentWidth
Don Gagne's avatar
Don Gagne committed
56

Don Gagne's avatar
Don Gagne committed
57 58
    Component {
        id: parameterList
Don Gagne's avatar
Don Gagne committed
59

Don Gagne's avatar
Don Gagne committed
60 61
        QGCViewPanel {
            id: panel
Don Gagne's avatar
Don Gagne committed
62

Don Gagne's avatar
Don Gagne committed
63 64
            ParameterEditorController { id: controller; factPanel: panel }

Don Gagne's avatar
Don Gagne committed
65 66
            Component {
                id: factRowsComponent
Don Gagne's avatar
Don Gagne committed
67 68

                Column {
Don Gagne's avatar
Don Gagne committed
69 70
                    id:     factColumn
                    x:      __leftMargin
Don Gagne's avatar
Don Gagne committed
71 72

                    QGCLabel {
Don Gagne's avatar
Don Gagne committed
73 74 75 76
                        height:				__textHeight + (ScreenTools.pixelSizeFactor * (9))
                        text:               group
                        verticalAlignment:	Text.AlignVCenter
                        font.pointSize:     ScreenTools.fontPointFactor * (16);
Don Gagne's avatar
Don Gagne committed
77 78
                    }

Don Gagne's avatar
Don Gagne committed
79 80 81 82
                    Rectangle {
                        width:  parent.width
                        height: 1
                        color:  __qgcPal.text
Don Gagne's avatar
Don Gagne committed
83 84
                    }

Don Gagne's avatar
Don Gagne committed
85
                    Repeater {
86
                        model: autopilot ? controller.getFactsForGroup(componentId, group) : 0
Don Gagne's avatar
Don Gagne committed
87

Don Gagne's avatar
Don Gagne committed
88
                        Column {
Don Gagne's avatar
Don Gagne committed
89 90
                            property Fact modelFact: controller.getParameterFact(componentId, modelData)

Don Gagne's avatar
Don Gagne committed
91 92 93 94
                            Item {
                                x:			__leftMargin
                                width:      parent.width
                                height:		__textHeight + (ScreenTools.pixelSizeFactor * (9))
Don Gagne's avatar
Don Gagne committed
95

Don Gagne's avatar
Don Gagne committed
96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131
                                QGCLabel {
                                    id:                 nameLabel
                                    width:              __textWidth * (__maxParamChars + 1)
                                    height:             parent.height
                                    verticalAlignment:	Text.AlignVCenter
                                    text:               modelFact.name
                                }

                                QGCLabel {
                                    id:                 valueLabel
                                    width:              __textWidth * 20
                                    height:             parent.height
                                    anchors.left:       nameLabel.right
                                    verticalAlignment:	Text.AlignVCenter
                                    color:              modelFact.valueEqualsDefault ? __qgcPal.text : "orange"
                                    text:               modelFact.valueString + " " + modelFact.units
                                }

                                QGCLabel {
                                    height:             parent.height
                                    anchors.left:       valueLabel.right
                                    verticalAlignment:	Text.AlignVCenter
                                    visible:            fullMode
                                    text:               modelFact.shortDescription
                                }

                                MouseArea {
                                    anchors.fill:       parent
                                     acceptedButtons:   Qt.LeftButton

                                    onClicked: {
                                        __editorDialogFact = modelFact
                                        panel.showDialog(editorDialogComponent, "Parameter Editor", fullMode ? 50 : -1, StandardButton.Cancel | StandardButton.Save)
                                    }
                                }
                            }
Don Gagne's avatar
Don Gagne committed
132

Don Gagne's avatar
Don Gagne committed
133 134 135 136 137 138 139 140 141 142
                            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
143

Don Gagne's avatar
Don Gagne committed
144 145
            Column {
                anchors.fill: parent
Don Gagne's avatar
Don Gagne committed
146

Don Gagne's avatar
Don Gagne committed
147 148 149
                Item {
                    width:  parent.width
                    height: firstButton.height
Don Gagne's avatar
Don Gagne committed
150

Don Gagne's avatar
Don Gagne committed
151 152 153 154
                    QGCLabel {
                        font.pointSize: ScreenTools.fontPointFactor * (20)
                        visible:        fullMode
                        text:           "PARAMETER EDITOR"
Don Gagne's avatar
Don Gagne committed
155 156 157
                    }

                    Row {
Don Gagne's avatar
Don Gagne committed
158 159 160
                        spacing:            10
                        layoutDirection:    Qt.RightToLeft
                        width:              parent.width
161

Don Gagne's avatar
Don Gagne committed
162 163
                        QGCButton {
                            text:		"Clear RC to Param"
Don Gagne's avatar
Don Gagne committed
164
                            onClicked:	controller.clearRCToParam()
Don Gagne's avatar
Don Gagne committed
165 166 167 168
                        }
                        QGCButton {
                            text:		"Save to file"
                            visible:	fullMode
Don Gagne's avatar
Don Gagne committed
169
                            onClicked:	controller.saveToFile()
Don Gagne's avatar
Don Gagne committed
170 171 172 173
                        }
                        QGCButton {
                            text:		"Load from file"
                            visible:	fullMode
Don Gagne's avatar
Don Gagne committed
174
                            onClicked:	controller.loadFromFile()
Don Gagne's avatar
Don Gagne committed
175 176 177 178
                        }
                        QGCButton {
                            id:			firstButton
                            text:		"Refresh"
Don Gagne's avatar
Don Gagne committed
179
                            onClicked:	controller.refresh()
Don Gagne's avatar
Don Gagne committed
180
                        }
181
                    }
Don Gagne's avatar
Don Gagne committed
182
                }
183

Don Gagne's avatar
Don Gagne committed
184 185 186 187
                Item {
                    id:		lastSpacer
                    height: 10
                    width:	5
188
                }
189

Don Gagne's avatar
Don Gagne committed
190 191 192
                Item {
                    width:  parent.width
                    height: parent.height - (lastSpacer.y + lastSpacer.height)
193

Don Gagne's avatar
Don Gagne committed
194 195 196 197
                    ScrollView {
                        id :	groupScroll
                        width:	__textWidth * 25
                        height: parent.height
Don Gagne's avatar
Don Gagne committed
198

Don Gagne's avatar
Don Gagne committed
199 200
                        Column {
                            Repeater {
Don Gagne's avatar
Don Gagne committed
201
                                model: controller.componentIds
Don Gagne's avatar
Don Gagne committed
202

Don Gagne's avatar
Don Gagne committed
203 204
                                Column {
                                    id: componentColumn
Don Gagne's avatar
Don Gagne committed
205

Don Gagne's avatar
Don Gagne committed
206
                                    readonly property int componentId: parseInt(modelData)
Don Gagne's avatar
Don Gagne committed
207

Don Gagne's avatar
Don Gagne committed
208 209 210 211 212 213
                                    QGCLabel {
                                        height:				contentHeight + (ScreenTools.pixelSizeFactor * (9))
                                        text:               "Component #: " + componentId.toString()
                                        verticalAlignment:	Text.AlignVCenter
                                        font.pointSize:     ScreenTools.fontPointFactor * (16);
                                    }
Don Gagne's avatar
Don Gagne committed
214

Don Gagne's avatar
Don Gagne committed
215
                                    Repeater {
Don Gagne's avatar
Don Gagne committed
216
                                        model: controller.getGroupsForComponent(componentColumn.componentId)
Don Gagne's avatar
Don Gagne committed
217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237

                                        Column {
                                            QGCButton {
                                                x:		__leftMargin
                                                width: groupScroll.width - __leftMargin - __rightMargin
                                                text:	modelData

                                                onClicked: {
                                                    factRowsLoader.sourceComponent = null
                                                    factRowsLoader.componentId = componentId
                                                    factRowsLoader.group = modelData
                                                    factRowsLoader.sourceComponent = factRowsComponent
                                                }
                                            }

                                            Item {
                                                width:  1
                                                height: ScreenTools.pixelSizeFactor * (3)
                                            }
                                        } // Column - Group
                                    } // Repeater - Groups
Don Gagne's avatar
Don Gagne committed
238

Don Gagne's avatar
Don Gagne committed
239 240 241 242 243 244 245 246
                                    Item {
                                        height: 10
                                        width:	10
                                    }
                                } // Column - Component
                            } // Repeater - Components
                        } // Column - Component
                    } // ScrollView - Groups
Don Gagne's avatar
Don Gagne committed
247

Don Gagne's avatar
Don Gagne committed
248 249 250 251 252
                    ScrollView {
                        id:             factScrollView
                        anchors.left:   groupScroll.right
                        anchors.right:  parent.right
                        height:         parent.height
Don Gagne's avatar
Don Gagne committed
253

Don Gagne's avatar
Don Gagne committed
254 255 256
                        Loader {
                            id:     factRowsLoader
                            width:  factScrollView.width
Don Gagne's avatar
Don Gagne committed
257

Don Gagne's avatar
Don Gagne committed
258 259
                            property int componentId:   controller.componentIds[0]
                            property string group:      controller.getGroupsForComponent(controller.componentIds[0])[0]
Don Gagne's avatar
Don Gagne committed
260
                            sourceComponent:            factRowsComponent
Don Gagne's avatar
Don Gagne committed
261
                        }
Don Gagne's avatar
Don Gagne committed
262 263 264 265 266
                    } // ScrollView - Facts
                } // Item - Group ScrollView + Facts
            } // Column - Outer
        }
    } // Component - Parameter List
Don Gagne's avatar
Don Gagne committed
267

Don Gagne's avatar
Don Gagne committed
268 269
    Component {
        id: editorDialogComponent
Don Gagne's avatar
Don Gagne committed
270

Don Gagne's avatar
Don Gagne committed
271 272
        QGCViewDialog {
            id:             editorDialog
Don Gagne's avatar
Don Gagne committed
273

Don Gagne's avatar
Don Gagne committed
274 275
            ParameterEditorController { id: controller; factPanel: editorDialog }

Don Gagne's avatar
Don Gagne committed
276
            property bool fullMode: true
Don Gagne's avatar
Don Gagne committed
277

Don Gagne's avatar
Don Gagne committed
278 279 280
            function accept() {
                __editorDialogFact.value = valueField.text
                editorDialog.hideDialog()
Don Gagne's avatar
Don Gagne committed
281
            }
Don Gagne's avatar
Don Gagne committed
282

Don Gagne's avatar
Don Gagne committed
283 284 285 286
            Column {
                spacing:        __textHeight
                anchors.left:   parent.left
                anchors.right:  parent.right
Don Gagne's avatar
Don Gagne committed
287

Don Gagne's avatar
Don Gagne committed
288 289 290 291
                QGCLabel {
                    width:      parent.width
                    wrapMode:   Text.WordWrap
                    text:       __editorDialogFact.shortDescription ? __editorDialogFact.shortDescription : "Description missing"
Don Gagne's avatar
Don Gagne committed
292
                }
Don Gagne's avatar
Don Gagne committed
293 294 295 296 297 298

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

Don Gagne's avatar
Don Gagne committed
301 302 303 304
                QGCTextField {
                    id:     valueField
                    text:   __editorDialogFact.valueString
                }
Don Gagne's avatar
Don Gagne committed
305

Don Gagne's avatar
Don Gagne committed
306
                QGCLabel { text: __editorDialogFact.name }
Don Gagne's avatar
Don Gagne committed
307

Don Gagne's avatar
Don Gagne committed
308 309
                Row {
                    spacing: __textWidth
Don Gagne's avatar
Don Gagne committed
310

Don Gagne's avatar
Don Gagne committed
311 312 313
                    QGCLabel { text: "Units:" }
                    QGCLabel { text: __editorDialogFact.units ? __editorDialogFact.units : "none" }
                }
Don Gagne's avatar
Don Gagne committed
314

Don Gagne's avatar
Don Gagne committed
315 316
                Row {
                    spacing: __textWidth
Don Gagne's avatar
Don Gagne committed
317

Don Gagne's avatar
Don Gagne committed
318 319 320
                    QGCLabel { text: "Minimum value:" }
                    QGCLabel { text: __editorDialogFact.min }
                }
Don Gagne's avatar
Don Gagne committed
321

Don Gagne's avatar
Don Gagne committed
322 323
                Row {
                    spacing: __textWidth
Don Gagne's avatar
Don Gagne committed
324

Don Gagne's avatar
Don Gagne committed
325 326 327
                    QGCLabel { text: "Maxmimum value:" }
                    QGCLabel { text: __editorDialogFact.max }
                }
Don Gagne's avatar
Don Gagne committed
328

Don Gagne's avatar
Don Gagne committed
329 330
                Row {
                    spacing: __textWidth
Don Gagne's avatar
Don Gagne committed
331

Don Gagne's avatar
Don Gagne committed
332 333 334
                    QGCLabel { text: "Default value:" }
                    QGCLabel { text: __editorDialogFact.defaultValueAvailable ? __editorDialogFact.defaultValue : "none" }
                }
Don Gagne's avatar
Don Gagne committed
335

Don Gagne's avatar
Don Gagne committed
336 337 338 339 340 341 342
                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
343 344


Don Gagne's avatar
Don Gagne committed
345 346 347 348 349 350
            QGCButton {
                anchors.rightMargin:    __textWidth
                anchors.right:          rcButton.left
                anchors.bottom:         parent.bottom
                visible:                __editorDialogFact.defaultValueAvailable
                text:                   "Reset to default"
Don Gagne's avatar
Don Gagne committed
351

Don Gagne's avatar
Don Gagne committed
352 353 354
                onClicked: {
                    __editorDialogFact.value = __editorDialogFact.defaultValue
                    editorDialog.hideDialog()
Don Gagne's avatar
Don Gagne committed
355
                }
Don Gagne's avatar
Don Gagne committed
356 357 358 359 360 361 362 363
            }

            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
364
                onClicked:      controller.setRCToParam(__editorDialogFact.name)
Don Gagne's avatar
Don Gagne committed
365 366 367 368
            }
        } // Rectangle - editorDialog
    } // Component - Editor Dialog
} // QGCView