ParameterEditor.qml 14.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 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 48
    QGCPalette { id: __qgcPal; colorGroupEnabled: true }
    ParameterEditorController { id: __controller }
    QGCLabel { id: __textMeasure; text: "X"; visible: false }
    property Fact __editorDialogFact: Fact { }
Don Gagne's avatar
Don Gagne committed
49 50


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

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

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

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

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

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

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

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

Don Gagne's avatar
Don Gagne committed
84 85
                    Repeater {
                        model: __controller.getFactsForGroup(componentId, group)
Don Gagne's avatar
Don Gagne committed
86

Don Gagne's avatar
Don Gagne committed
87 88 89 90 91
                        Column {
                            Item {
                                x:			__leftMargin
                                width:      parent.width
                                height:		__textHeight + (ScreenTools.pixelSizeFactor * (9))
Don Gagne's avatar
Don Gagne committed
92

Don Gagne's avatar
Don Gagne committed
93 94
                                Fact {
                                    id: modelFact
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 132 133 134 135 136
                                    Component.onCompleted: {
                                        name = modelData + ":" + componentId
                                    }
                                }

                                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
137

Don Gagne's avatar
Don Gagne committed
138 139 140 141 142 143 144 145 146 147
                            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
148

Don Gagne's avatar
Don Gagne committed
149 150
            Column {
                anchors.fill: parent
Don Gagne's avatar
Don Gagne committed
151

Don Gagne's avatar
Don Gagne committed
152 153 154
                Item {
                    width:  parent.width
                    height: firstButton.height
Don Gagne's avatar
Don Gagne committed
155

Don Gagne's avatar
Don Gagne committed
156 157 158 159
                    QGCLabel {
                        font.pointSize: ScreenTools.fontPointFactor * (20)
                        visible:        fullMode
                        text:           "PARAMETER EDITOR"
Don Gagne's avatar
Don Gagne committed
160 161 162
                    }

                    Row {
Don Gagne's avatar
Don Gagne committed
163 164 165
                        spacing:            10
                        layoutDirection:    Qt.RightToLeft
                        width:              parent.width
166

Don Gagne's avatar
Don Gagne committed
167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185
                        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()
                        }
186
                    }
Don Gagne's avatar
Don Gagne committed
187
                }
188

Don Gagne's avatar
Don Gagne committed
189 190 191 192
                Item {
                    id:		lastSpacer
                    height: 10
                    width:	5
193
                }
194

Don Gagne's avatar
Don Gagne committed
195 196 197
                Item {
                    width:  parent.width
                    height: parent.height - (lastSpacer.y + lastSpacer.height)
198

Don Gagne's avatar
Don Gagne committed
199 200 201 202
                    ScrollView {
                        id :	groupScroll
                        width:	__textWidth * 25
                        height: parent.height
Don Gagne's avatar
Don Gagne committed
203

Don Gagne's avatar
Don Gagne committed
204 205 206
                        Column {
                            Repeater {
                                model: __controller.componentIds
Don Gagne's avatar
Don Gagne committed
207

Don Gagne's avatar
Don Gagne committed
208 209
                                Column {
                                    id: componentColumn
Don Gagne's avatar
Don Gagne committed
210

Don Gagne's avatar
Don Gagne committed
211
                                    readonly property int componentId: parseInt(modelData)
Don Gagne's avatar
Don Gagne committed
212

Don Gagne's avatar
Don Gagne committed
213 214 215 216 217 218
                                    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
219

Don Gagne's avatar
Don Gagne committed
220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242
                                    Repeater {
                                        model: __controller.getGroupsForComponent(componentColumn.componentId)

                                        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
243

Don Gagne's avatar
Don Gagne committed
244 245 246 247 248 249 250 251
                                    Item {
                                        height: 10
                                        width:	10
                                    }
                                } // Column - Component
                            } // Repeater - Components
                        } // Column - Component
                    } // ScrollView - Groups
Don Gagne's avatar
Don Gagne committed
252

Don Gagne's avatar
Don Gagne committed
253 254 255 256 257
                    ScrollView {
                        id:             factScrollView
                        anchors.left:   groupScroll.right
                        anchors.right:  parent.right
                        height:         parent.height
Don Gagne's avatar
Don Gagne committed
258

Don Gagne's avatar
Don Gagne committed
259 260 261
                        Loader {
                            id:     factRowsLoader
                            width:  factScrollView.width
Don Gagne's avatar
Don Gagne committed
262

Don Gagne's avatar
Don Gagne committed
263 264 265
                            property int componentId:   __controller.componentIds[0]
                            property string group:      __controller.getGroupsForComponent(__controller.componentIds[0])[0]
                            sourceComponent:            factRowsComponent
Don Gagne's avatar
Don Gagne committed
266
                        }
Don Gagne's avatar
Don Gagne committed
267 268 269 270 271
                    } // ScrollView - Facts
                } // Item - Group ScrollView + Facts
            } // Column - Outer
        }
    } // Component - Parameter List
Don Gagne's avatar
Don Gagne committed
272

Don Gagne's avatar
Don Gagne committed
273 274
    Component {
        id: editorDialogComponent
Don Gagne's avatar
Don Gagne committed
275

Don Gagne's avatar
Don Gagne committed
276 277
        QGCViewDialog {
            id:             editorDialog
Don Gagne's avatar
Don Gagne committed
278

Don Gagne's avatar
Don Gagne committed
279
            property bool fullMode: true
Don Gagne's avatar
Don Gagne committed
280

Don Gagne's avatar
Don Gagne committed
281 282 283
            function accept() {
                __editorDialogFact.value = valueField.text
                editorDialog.hideDialog()
Don Gagne's avatar
Don Gagne committed
284
            }
Don Gagne's avatar
Don Gagne committed
285

Don Gagne's avatar
Don Gagne committed
286 287 288 289
            Column {
                spacing:        __textHeight
                anchors.left:   parent.left
                anchors.right:  parent.right
Don Gagne's avatar
Don Gagne committed
290

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

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

Don Gagne's avatar
Don Gagne committed
304 305 306 307
                QGCTextField {
                    id:     valueField
                    text:   __editorDialogFact.valueString
                }
Don Gagne's avatar
Don Gagne committed
308

Don Gagne's avatar
Don Gagne committed
309
                QGCLabel { text: __editorDialogFact.name }
Don Gagne's avatar
Don Gagne committed
310

Don Gagne's avatar
Don Gagne committed
311 312
                Row {
                    spacing: __textWidth
Don Gagne's avatar
Don Gagne committed
313

Don Gagne's avatar
Don Gagne committed
314 315 316
                    QGCLabel { text: "Units:" }
                    QGCLabel { text: __editorDialogFact.units ? __editorDialogFact.units : "none" }
                }
Don Gagne's avatar
Don Gagne committed
317

Don Gagne's avatar
Don Gagne committed
318 319
                Row {
                    spacing: __textWidth
Don Gagne's avatar
Don Gagne committed
320

Don Gagne's avatar
Don Gagne committed
321 322 323
                    QGCLabel { text: "Minimum value:" }
                    QGCLabel { text: __editorDialogFact.min }
                }
Don Gagne's avatar
Don Gagne committed
324

Don Gagne's avatar
Don Gagne committed
325 326
                Row {
                    spacing: __textWidth
Don Gagne's avatar
Don Gagne committed
327

Don Gagne's avatar
Don Gagne committed
328 329 330
                    QGCLabel { text: "Maxmimum value:" }
                    QGCLabel { text: __editorDialogFact.max }
                }
Don Gagne's avatar
Don Gagne committed
331

Don Gagne's avatar
Don Gagne committed
332 333
                Row {
                    spacing: __textWidth
Don Gagne's avatar
Don Gagne committed
334

Don Gagne's avatar
Don Gagne committed
335 336 337
                    QGCLabel { text: "Default value:" }
                    QGCLabel { text: __editorDialogFact.defaultValueAvailable ? __editorDialogFact.defaultValue : "none" }
                }
Don Gagne's avatar
Don Gagne committed
338

Don Gagne's avatar
Don Gagne committed
339 340 341 342 343 344 345
                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
346 347


Don Gagne's avatar
Don Gagne committed
348 349 350 351 352 353
            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
354

Don Gagne's avatar
Don Gagne committed
355 356 357
                onClicked: {
                    __editorDialogFact.value = __editorDialogFact.defaultValue
                    editorDialog.hideDialog()
Don Gagne's avatar
Don Gagne committed
358
                }
Don Gagne's avatar
Don Gagne committed
359 360 361 362 363 364 365 366 367 368 369 370 371
            }

            QGCButton {
                id:             rcButton
                anchors.right:  parent.right
                anchors.bottom: parent.bottom
                visible:        __editorDialogFact.defaultValueAvailable
                text:           "Set RC to Param..."
                onClicked:      __controller.setRCToParam(__editorDialogFact.name)
            }
        } // Rectangle - editorDialog
    } // Component - Editor Dialog
} // QGCView