ParameterEditor.qml 12.6 KB
Newer Older
1 2
/****************************************************************************
 *
Gus Grubba's avatar
Gus Grubba committed
3
 * (c) 2009-2020 QGROUNDCONTROL PROJECT <http://www.qgroundcontrol.org>
4 5 6 7 8
 *
 * QGroundControl is licensed according to the terms in the file
 * COPYING.md in the root of the source code directory.
 *
 ****************************************************************************/
Don Gagne's avatar
Don Gagne committed
9

10 11
import QtQuick                      2.3
import QtQuick.Controls             1.2
12
import QtQuick.Dialogs              1.2
13
import QtQuick.Layouts              1.2
Don Gagne's avatar
Don Gagne committed
14

Don Gagne's avatar
Don Gagne committed
15 16 17 18 19 20 21
import QGroundControl               1.0
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
22

23 24
Item {
    id:         _root
Don Gagne's avatar
Don Gagne committed
25

26
    property Fact   _editorDialogFact: Fact { }
27
    property int    _rowHeight:         ScreenTools.defaultFontPixelHeight * 2
28
    property int    _rowWidth:          10 // Dynamic adjusted at runtime
29
    property bool   _searchFilter:      searchText.text.trim() != "" || controller.showModifiedOnly  ///< true: showing results of search
30
    property var    _searchResults      ///< List of parameter names from search results
DoinLakeFlyer's avatar
DoinLakeFlyer committed
31 32
    property var    _activeVehicle:     QGroundControl.multiVehicleManager.activeVehicle
    property bool   _showRCToParam:     _activeVehicle.px4Firmware
Don Gagne's avatar
Don Gagne committed
33
    property var    _appSettings:       QGroundControl.settingsManager.appSettings
34
    property var    _controller:        controller
Don Gagne's avatar
Don Gagne committed
35

36
    ParameterEditorController {
37
        id: controller
38
    }
Don Gagne's avatar
Don Gagne committed
39

40 41
    ExclusiveGroup { id: sectionGroup }

42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59
    //---------------------------------------------
    //-- Header
    Row {
        id:             header
        anchors.left:   parent.left
        anchors.right:  parent.right
        spacing:        ScreenTools.defaultFontPixelWidth

        Timer {
            id:         clearTimer
            interval:   100;
            running:    false;
            repeat:     false
            onTriggered: {
                searchText.text = ""
                controller.searchText = ""
            }
        }
Don Gagne's avatar
Don Gagne committed
60

61 62 63 64
        QGCLabel {
            anchors.verticalCenter: parent.verticalCenter
            text: qsTr("Search:")
        }
Don Gagne's avatar
Don Gagne committed
65

66 67 68 69 70 71 72 73 74 75 76 77
        QGCTextField {
            id:                 searchText
            text:               controller.searchText
            onDisplayTextChanged: controller.searchText = displayText
            anchors.verticalCenter: parent.verticalCenter
        }

        QGCButton {
            text: qsTr("Clear")
            onClicked: {
                if(ScreenTools.isMobile) {
                    Qt.inputMethod.hide();
78
                }
79
                clearTimer.start()
80
            }
81 82
            anchors.verticalCenter: parent.verticalCenter
        }
83

84
        QGCCheckBox {
85
            text:                   qsTr("Show modified only")
86
            anchors.verticalCenter: parent.verticalCenter
87 88 89
            checked:                controller.showModifiedOnly
            onClicked:              controller.showModifiedOnly = checked
            visible:                QGroundControl.multiVehicleManager.activeVehicle.px4Firmware
90 91 92 93 94 95 96 97 98
        }
    } // Row - Header

    QGCButton {
        anchors.top:    header.top
        anchors.bottom: header.bottom
        anchors.right:  parent.right
        text:           qsTr("Tools")
        visible:        !_searchFilter
99 100
        onClicked:      toolsMenu.popup()
    }
101

102
    QGCMenu {
103
        id:                 toolsMenu
104
        QGCMenuItem {
105 106 107
            text:           qsTr("Refresh")
            onTriggered:	controller.refresh()
        }
108
        QGCMenuItem {
109
            text:           qsTr("Reset all to firmware's defaults")
110
            onTriggered:    mainWindow.showComponentDialog(resetToDefaultConfirmComponent, qsTr("Reset All"), mainWindow.showDialogDefaultWidth, StandardButton.Cancel | StandardButton.Reset)
111
        }
112
        QGCMenuItem {
113
            text:           qsTr("Reset to vehicle's configuration defaults")
114
            visible:        !_activeVehicle.apmFirmware
115
            onTriggered:    mainWindow.showComponentDialog(resetToVehicleConfigurationConfirmComponent, qsTr("Reset All"), mainWindow.showDialogDefaultWidth, StandardButton.Cancel | StandardButton.Reset)
116
        }
117 118
        QGCMenuSeparator { }
        QGCMenuItem {
119 120 121 122 123
            text:           qsTr("Load from file...")
            onTriggered: {
                fileDialog.title =          qsTr("Load Parameters")
                fileDialog.selectExisting = true
                fileDialog.openForLoad()
124
            }
125
        }
126
        QGCMenuItem {
127 128 129 130 131
            text:           qsTr("Save to file...")
            onTriggered: {
                fileDialog.title =          qsTr("Save Parameters")
                fileDialog.selectExisting = false
                fileDialog.openForSave()
132
            }
Don Gagne's avatar
Don Gagne committed
133
        }
134 135
        QGCMenuSeparator { visible: _showRCToParam }
        QGCMenuItem {
DoinLakeFlyer's avatar
DoinLakeFlyer committed
136 137
            text:           qsTr("Clear all RC to Param")
            onTriggered:	_activeVehicle.clearAllParamMapRC()
138 139
            visible:        _showRCToParam
        }
140 141
        QGCMenuSeparator { }
        QGCMenuItem {
142
            text:           qsTr("Reboot Vehicle")
143
            onTriggered:    mainWindow.showComponentDialog(rebootVehicleConfirmComponent, qsTr("Reboot Vehicle"), mainWindow.showDialogDefaultWidth, StandardButton.Cancel | StandardButton.Ok)
144
        }
145
    }
Don Gagne's avatar
Don Gagne committed
146

147 148 149 150 151 152 153 154 155 156
    /// Group buttons
    QGCFlickable {
        id :                groupScroll
        width:              ScreenTools.defaultFontPixelWidth * 25
        anchors.top:        header.bottom
        anchors.bottom:     parent.bottom
        clip:               true
        pixelAligned:       true
        contentHeight:      groupedViewCategoryColumn.height
        flickableDirection: Flickable.VerticalFlick
157
        visible:            !_searchFilter
158 159 160 161 162 163

        ColumnLayout {
            id:             groupedViewCategoryColumn
            anchors.left:   parent.left
            anchors.right:  parent.right
            spacing:        Math.ceil(ScreenTools.defaultFontPixelHeight * 0.25)
164

165 166
            Repeater {
                model: controller.categories
167

168 169 170
                Column {
                    Layout.fillWidth:   true
                    spacing:            Math.ceil(ScreenTools.defaultFontPixelHeight * 0.25)
171 172


173 174
                    SectionHeader {
                        id:             categoryHeader
175 176
                        anchors.left:   parent.left
                        anchors.right:  parent.right
177 178
                        text:           object.name
                        checked:        object == controller.currentCategory
179
                        exclusiveGroup: sectionGroup
180

181 182
                        onCheckedChanged: {
                            if (checked) {
183
                                controller.currentCategory  = object
184
                            }
185
                        }
186
                    }
187

188
                    Repeater {
189
                        model: categoryHeader.checked ? object.groups : 0
190

191 192
                        QGCButton {
                            width:          ScreenTools.defaultFontPixelWidth * 25
193
                            text:           object.name
194
                            height:         _rowHeight
195
                            checked:        object == controller.currentGroup
196
                            autoExclusive:  true
197

198
                            onClicked: {
199
                                if (!checked) _rowWidth = 10
200
                                checked = true
201
                                controller.currentGroup = object
dogmaphobic's avatar
dogmaphobic committed
202 203 204 205 206 207
                            }
                        }
                    }
                }
            }
        }
208
    }
Don Gagne's avatar
Don Gagne committed
209

210 211 212 213
    /// Parameter list
    QGCListView {
        id:                 editorListView
        anchors.leftMargin: ScreenTools.defaultFontPixelWidth
214
        anchors.left:       _searchFilter ? parent.left : groupScroll.right
215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231
        anchors.right:      parent.right
        anchors.top:        header.bottom
        anchors.bottom:     parent.bottom
        orientation:        ListView.Vertical
        model:              controller.parameters
        cacheBuffer:        height > 0 ? height * 2 : 0
        clip:               true

        delegate: Rectangle {
            height: _rowHeight
            width:  _rowWidth
            color:  Qt.rgba(0,0,0,0)

            Row {
                id:     factRow
                spacing: Math.ceil(ScreenTools.defaultFontPixelWidth * 0.5)
                anchors.verticalCenter: parent.verticalCenter
232

233
                property Fact modelFact: object
234

235 236 237 238 239 240
                QGCLabel {
                    id:     nameLabel
                    width:  ScreenTools.defaultFontPixelWidth  * 20
                    text:   factRow.modelFact.name
                    clip:   true
                }
dogmaphobic's avatar
dogmaphobic committed
241

242 243 244 245 246 247 248
                QGCLabel {
                    id:     valueLabel
                    width:  ScreenTools.defaultFontPixelWidth  * 20
                    color:  factRow.modelFact.defaultValueAvailable ? (factRow.modelFact.valueEqualsDefault ? qgcPal.text : qgcPal.warningText) : qgcPal.text
                    text:   factRow.modelFact.enumStrings.length === 0 ? factRow.modelFact.valueString + " " + factRow.modelFact.units : factRow.modelFact.enumStringValue
                    clip:   true
                }
249

250 251 252
                QGCLabel {
                    text:   factRow.modelFact.shortDescription
                }
253

254 255 256
                Component.onCompleted: {
                    if(_rowWidth < factRow.width + ScreenTools.defaultFontPixelWidth) {
                        _rowWidth = factRow.width + ScreenTools.defaultFontPixelWidth
dogmaphobic's avatar
dogmaphobic committed
257 258
                    }
                }
259
            }
260

261 262 263 264 265 266 267 268
            Rectangle {
                width:  _rowWidth
                height: 1
                color:  qgcPal.text
                opacity: 0.15
                anchors.bottom: parent.bottom
                anchors.left:   parent.left
            }
269

270 271 272 273 274
            MouseArea {
                anchors.fill:       parent
                acceptedButtons:    Qt.LeftButton
                onClicked: {
                    _editorDialogFact = factRow.modelFact
275
                    mainWindow.showComponentDialog(editorDialogComponent, qsTr("Parameter Editor"), mainWindow.showDialogDefaultWidth, StandardButton.Cancel | StandardButton.Save)
276
                }
dogmaphobic's avatar
dogmaphobic committed
277 278
            }
        }
279
    }
dogmaphobic's avatar
dogmaphobic committed
280

281
    QGCFileDialog {
Don Gagne's avatar
Don Gagne committed
282 283 284
        id:             fileDialog
        folder:         _appSettings.parameterSavePath
        nameFilters:    [ qsTr("Parameter Files (*.%1)").arg(_appSettings.parameterFileExtension) , qsTr("All Files (*.*)") ]
285

286 287 288
        onAcceptedForSave: {
            controller.saveToFile(file)
            close()
289
        }
Don Gagne's avatar
Don Gagne committed
290

291 292
        onAcceptedForLoad: {
            close()
293 294 295
            if (controller.buildDiffFromFile(file)) {
                mainWindow.showPopupDialogFromComponent(parameterDiffDialog)
            }
Don Gagne's avatar
Don Gagne committed
296 297 298 299
        }
    }

    Component {
300
        id: editorDialogComponent
Don Gagne's avatar
Don Gagne committed
301

302 303 304
        ParameterEditorDialog {
            fact:           _editorDialogFact
            showRCToParam:  _showRCToParam
Don Gagne's avatar
Don Gagne committed
305 306
        }
    }
Don Gagne's avatar
Don Gagne committed
307 308 309 310 311 312 313 314 315 316 317

    Component {
        id: resetToDefaultConfirmComponent
        QGCViewDialog {
            function accept() {
                controller.resetAllToDefaults()
                hideDialog()
            }
            QGCLabel {
                width:              parent.width
                wrapMode:           Text.WordWrap
Gus Grubba's avatar
Gus Grubba committed
318
                text:               qsTr("Select Reset to reset all parameters to their defaults.\n\nNote that this will also completely reset everything, including UAVCAN nodes.")
Don Gagne's avatar
Don Gagne committed
319 320 321
            }
        }
    }
322

323 324 325 326 327 328 329 330 331 332
    Component {
        id: resetToVehicleConfigurationConfirmComponent
        QGCViewDialog {
            function accept() {
                controller.resetAllToVehicleConfiguration()
                hideDialog()
            }
            QGCLabel {
                width:              parent.width
                wrapMode:           Text.WordWrap
Gus Grubba's avatar
Gus Grubba committed
333
                text:               qsTr("Select Reset to reset all parameters to the vehicle's configuration defaults.")
334 335 336 337
            }
        }
    }

338 339 340 341 342 343
    Component {
        id: rebootVehicleConfirmComponent

        QGCViewDialog {
            function accept() {
                hideDialog()
344
                _activeVehicle.rebootVehicle()
345 346 347 348 349 350 351 352 353
            }

            QGCLabel {
                width:              parent.width
                wrapMode:           Text.WordWrap
                text:               qsTr("Select Ok to reboot vehicle.")
            }
        }
    }
354 355 356 357 358 359 360 361

    Component {
        id: parameterDiffDialog

        ParameterDiffDialog {
            paramController: _controller
        }
    }
362
}