ParameterEditor.qml 13 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 39

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

Rectangle {
40 41 42 43 44 45 46
	/// true: show full information, false: for use in smaller widgets
	property bool fullMode: true

	QGCPalette { id: __qgcPal; colorGroupEnabled: true }
	ScreenTools { id: __screenTools }
	ParameterEditorController { id: __controller }
	QGCLabel { id: __charWidth; text: "X"; visible: false }
Don Gagne's avatar
Don Gagne committed
47

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
    color: __qgcPal.window
Don Gagne's avatar
Don Gagne committed
53 54 55

    // We use an ExclusiveGroup to maintain the visibility of a single editing control at a time
    ExclusiveGroup {
56
        id: __exclusiveEditorGroup
Don Gagne's avatar
Don Gagne committed
57 58
    }

59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 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
property Fact __propertiesDialogFact: Fact { }

    Dialog {

        id:         propertiesDialog
        visible:    false
        title:      "Parameter Properties"

        contentItem: Rectangle {
            color:          __qgcPal.window
            implicitWidth:  500
            implicitHeight: longDescription.y + longDescription.height + 20

                Grid {
                id:     grid
                x:      10
                y:      10
                columns: 2
                spacing: 5

                QGCLabel {
                    text: "Parameter:"
                }
                QGCLabel {
                    text: __propertiesDialogFact.name
                }
                QGCLabel {
                    text: "Group:"
                }
                QGCLabel {
                    text: __propertiesDialogFact.group
                }
                QGCLabel {
                    text: "Units:"
                }
                QGCLabel {
                    text: __propertiesDialogFact.units ? __propertiesDialogFact.units : "none"
                }
                QGCLabel {
                    text: "Default value:"
                }
                QGCLabel {
                    text: __propertiesDialogFact.defaultValueAvailable ? __propertiesDialogFact.defaultValue : "none"
                }
                QGCLabel {
                    text: "Minimum value:"
                }
                QGCLabel {
                    text: __propertiesDialogFact.min
                }
                QGCLabel {
                    text: "Maximum value:"
                }
                QGCLabel {
                    text: __propertiesDialogFact.max
                }
                QGCLabel {
                    text: "Description:"
                }
                QGCLabel {
                    text: __propertiesDialogFact.shortDescription ? __propertiesDialogFact.shortDescription : "none"
                }
                QGCLabel {
                    text: "Description (long):"
                }
                QGCLabel {
                    id:         longDescription
                    width:      500 - 20 - x
                    wrapMode:   Text.WordWrap
                    text:       __propertiesDialogFact.longDescription ? __propertiesDialogFact.longDescription : "none"
                }
            }
        }
    }

Don Gagne's avatar
Don Gagne committed
134 135 136 137 138 139 140 141 142
    Column {
        anchors.fill:parent

        Row {
            spacing:            10
            layoutDirection:    Qt.RightToLeft
            width:              parent.width

            QGCButton {
143 144
                text:		"Clear RC to Param"
                onClicked:	__controller.clearRCToParam()
Don Gagne's avatar
Don Gagne committed
145 146
            }
            QGCButton {
147 148 149
                text:		"Save to file"
				visible:	fullMode
                onClicked:	__controller.saveToFile()
Don Gagne's avatar
Don Gagne committed
150 151
            }
            QGCButton {
152 153 154
                text:		"Load from file"
				visible:	fullMode
                onClicked:	__controller.loadFromFile()
Don Gagne's avatar
Don Gagne committed
155 156
            }
            QGCButton {
157 158 159
                id:			firstButton
                text:		"Refresh"
                onClicked:	__controller.refresh()
Don Gagne's avatar
Don Gagne committed
160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175
            }
        }

        Item {
            id:		lastSpacer
            height: 10
            width:	5
        }

        ScrollView {
            id :	scrollView
            width:	parent.width
            height: parent.height - (lastSpacer.y + lastSpacer.height)

            Column {
                Repeater {
176
                    model: __controller.componentIds
Don Gagne's avatar
Don Gagne committed
177 178 179 180 181 182 183 184

                    Column {
						id: componentColumn

						property int componentId: parseInt(modelData)

						QGCLabel {
							text: "Component #: " + componentId.toString()
185
                            font.pointSize: __screenTools.fontPointFactor * (16);
Don Gagne's avatar
Don Gagne committed
186 187 188 189 190 191 192 193
						}

                        Item {
                            height: 10
                            width:	10
                        }

                        Repeater {
194
                            model: __controller.getGroupsForComponent(componentColumn.componentId)
Don Gagne's avatar
Don Gagne committed
195 196 197 198

                            Column {
                                Rectangle {
                                    id: groupRect
199
                                    color:	__qgcPal.windowShade
Don Gagne's avatar
Don Gagne committed
200
                                    height: groupBlock.height
201
                                    width:	scrollView.viewport.width - __rightMargin
Don Gagne's avatar
Don Gagne committed
202 203 204 205 206

                                    Column {
                                        id: groupBlock

                                        Rectangle {
207
                                            color:	__qgcPal.windowShadeDark
Don Gagne's avatar
Don Gagne committed
208 209 210 211 212 213
                                            height: groupLabel.height
                                            width:	groupRect.width

                                            QGCLabel {
                                                id:					groupLabel
                                                height:				contentHeight + 5
214
                                                x:					__leftMargin
Don Gagne's avatar
Don Gagne committed
215 216
                                                text:				modelData
                                                verticalAlignment:	Text.AlignVCenter
217
                                                font.pointSize:		__screenTools.fontPointFactor * (__qgcPal.defaultFontPointSize + 2);
Don Gagne's avatar
Don Gagne committed
218 219 220 221
                                            }
                                        }

                                        Repeater {
222
                                            model: __controller.getFactsForGroup(componentColumn.componentId, modelData)
Don Gagne's avatar
Don Gagne committed
223 224 225

                                            Row {
                                                spacing:	10
226
                                                x:			__leftMargin
Don Gagne's avatar
Don Gagne committed
227 228 229 230 231

												Fact { id: modelFact; name: modelData + ":" + componentColumn.componentId }

                                                QGCLabel {
                                                    text:	modelFact.name
232
                                                    width:	__charWidth.contentWidth * (__maxParamChars + 2)
Don Gagne's avatar
Don Gagne committed
233 234 235 236 237
                                                }

                                                QGCLabel {

                                                    text:   modelFact.valueString + " " + modelFact.units
238
                                                    width:  __charWidth.contentWidth * 20
Don Gagne's avatar
Don Gagne committed
239
                                                    height: contentHeight
240 241 242 243 244 245 246 247 248 249 250 251 252
													color:	modelFact.valueEqualsDefault ? __qgcPal.text : "orange"

                                                    Menu {
                                                        id:         rightClickMenu
                                                        visible:    false

                                                        MenuItem {
                                                            id:             resetToDefaultMenuItem
                                                            text:           "Reset to default"
                                                            enabled:        modelFact.defaultValueAvailable
                                                            onTriggered:    modelFact.value = modelFact.defaultValue
                                                        }
                                                        MenuItem {
Don Gagne's avatar
Don Gagne committed
253
                                                            text:           "Set RC to Param..."
254 255
                                                            onTriggered: 	__controller.setRCToParam(modelData)
                                                        }
Don Gagne's avatar
Don Gagne committed
256 257
                                                        MenuItem {
                                                            text:           "Properties..."
258
                                                            onTriggered: 	{ __propertiesDialogFact = modelFact; propertiesDialog.open() }
Don Gagne's avatar
Don Gagne committed
259
                                                        }
260
                                                    }
Don Gagne's avatar
Don Gagne committed
261 262 263 264 265 266 267 268 269 270

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

                                                        onClicked: {
															if (mouse.button == Qt.LeftButton) {
																editor.checked = true
																editor.focus = true
															} else if (mouse.button == Qt.RightButton) {
271
                                                                rightClickMenu.popup()
Don Gagne's avatar
Don Gagne committed
272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287
															}
                                                        }
                                                    }

                                                    FactTextField {
                                                        id:                 editor
                                                        y:                  (parent.height - height) / 2
                                                        width:              parent.width
                                                        visible:            checked
                                                        focus:              true
                                                        fact:               modelFact
                                                        showUnits:          true
                                                        onEditingFinished:  checked = false

                                                        // We use an ExclusiveGroup to manage visibility
                                                        property bool checked: false
288
                                                        property ExclusiveGroup exclusiveGroup: __exclusiveEditorGroup
Don Gagne's avatar
Don Gagne committed
289 290 291 292 293 294 295 296 297
                                                        onExclusiveGroupChanged: {
                                                            if (exclusiveGroup)
                                                                exclusiveGroup.bindCheckable(editor)
                                                        }
                                                    }
                                                }

                                                QGCLabel {
                                                    text: modelFact.shortDescription
298
													visible: fullMode
Don Gagne's avatar
Don Gagne committed
299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321
                                                }
                                            } // Row - Fact value
                                        } // Repeater - Facts
                                    } // Column - Fact rows
                                } // Rectangle - Group

                                Item {
                                    height: 10
                                    width:	10
                                }
                            } // Column - Group
                        } // Repeater - Groups

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