ParameterEditor.qml 12.6 KB
Newer Older
1 2
/****************************************************************************
 *
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 12 13
import QtQuick                      2.3
import QtQuick.Controls             1.2
import QtQuick.Dialogs              1.2
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
31
    property var    _activeVehicle:     QGroundControl.multiVehicleManager.activeVehicle
32
    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
    //---------------------------------------------
    //-- 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 = ""
58
            }
59
        }
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
        QGCTextField {
            id:                 searchText
            text:               controller.searchText
            onDisplayTextChanged: controller.searchText = displayText
            anchors.verticalCenter: parent.verticalCenter
        }
72

73 74 75 76 77
        QGCButton {
            text: qsTr("Clear")
            onClicked: {
                if(ScreenTools.isMobile) {
                    Qt.inputMethod.hide();
78
                }
79
                clearTimer.start()
Don Gagne's avatar
Don Gagne committed
80
            }
81 82
            anchors.verticalCenter: parent.verticalCenter
        }
Don Gagne's avatar
Don Gagne committed
83

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

    QGCButton {
        anchors.top:    header.top
        anchors.bottom: header.bottom
        anchors.right:  parent.right
        text:           qsTr("Tools")
        visible:        !_searchFilter
        onClicked:      toolsMenu.popup()
    }
Don Gagne's avatar
Don Gagne committed
101

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

147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163
    /// 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
        visible:            !_searchFilter

        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 175 176 177 178 179
                    SectionHeader {
                        id:             categoryHeader
                        anchors.left:   parent.left
                        anchors.right:  parent.right
                        text:           object.name
                        checked:        object == controller.currentCategory
                        exclusiveGroup: sectionGroup
180

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

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

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

198 199 200 201
                            onClicked: {
                                if (!checked) _rowWidth = 10
                                checked = true
                                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 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231
    /// Parameter list
    QGCListView {
        id:                 editorListView
        anchors.leftMargin: ScreenTools.defaultFontPixelWidth
        anchors.left:       _searchFilter ? parent.left : groupScroll.right
        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 275
            MouseArea {
                anchors.fill:       parent
                acceptedButtons:    Qt.LeftButton
                onClicked: {
                    _editorDialogFact = factRow.modelFact
                    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

    Component {
        id: resetToDefaultConfirmComponent
        QGCViewDialog {
            function accept() {
                controller.resetAllToDefaults()
                hideDialog()
            }
315 316 317 318 319 320 321
            QGCLabel {
                width:              parent.width
                wrapMode:           Text.WordWrap
                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
322

323 324 325 326 327 328 329
    Component {
        id: resetToVehicleConfigurationConfirmComponent
        QGCViewDialog {
            function accept() {
                controller.resetAllToVehicleConfiguration()
                hideDialog()
            }
Don Gagne's avatar
Don Gagne committed
330 331 332
            QGCLabel {
                width:              parent.width
                wrapMode:           Text.WordWrap
333
                text:               qsTr("Select Reset to reset all parameters to the vehicle's configuration defaults.")
Don Gagne's avatar
Don Gagne committed
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 362

    Component {
        id: parameterDiffDialog

        ParameterDiffDialog {
            paramController: _controller
        }
    }
}