ParameterEditor.qml 15.9 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
    }

    Column {
        anchors.fill:parent

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

            QGCButton {
68 69
                text:		"Clear RC to Param"
                onClicked:	__controller.clearRCToParam()
Don Gagne's avatar
Don Gagne committed
70 71
            }
            QGCButton {
72 73 74
                text:		"Save to file"
				visible:	fullMode
                onClicked:	__controller.saveToFile()
Don Gagne's avatar
Don Gagne committed
75 76
            }
            QGCButton {
77 78 79
                text:		"Load from file"
				visible:	fullMode
                onClicked:	__controller.loadFromFile()
Don Gagne's avatar
Don Gagne committed
80 81
            }
            QGCButton {
82 83 84
                id:			firstButton
                text:		"Refresh"
                onClicked:	__controller.refresh()
Don Gagne's avatar
Don Gagne committed
85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100
            }
        }

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

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

            Column {
                Repeater {
101
                    model: __controller.componentIds
Don Gagne's avatar
Don Gagne committed
102 103 104 105 106 107 108 109

                    Column {
						id: componentColumn

						property int componentId: parseInt(modelData)

						QGCLabel {
							text: "Component #: " + componentId.toString()
110
							font.pointSize: __screenTools.dpiAdjustedPointSize(__qgcPal.defaultFontPointSize + 4);
Don Gagne's avatar
Don Gagne committed
111 112 113 114 115 116 117 118
						}

                        Item {
                            height: 10
                            width:	10
                        }

                        Repeater {
119
                            model: __controller.getGroupsForComponent(componentColumn.componentId)
Don Gagne's avatar
Don Gagne committed
120 121 122 123

                            Column {
                                Rectangle {
                                    id: groupRect
124
                                    color:	__qgcPal.windowShade
Don Gagne's avatar
Don Gagne committed
125
                                    height: groupBlock.height
126
                                    width:	scrollView.viewport.width - __rightMargin
Don Gagne's avatar
Don Gagne committed
127 128 129 130 131

                                    Column {
                                        id: groupBlock

                                        Rectangle {
132
                                            color:	__qgcPal.windowShadeDark
Don Gagne's avatar
Don Gagne committed
133 134 135 136 137 138
                                            height: groupLabel.height
                                            width:	groupRect.width

                                            QGCLabel {
                                                id:					groupLabel
                                                height:				contentHeight + 5
139
                                                x:					__leftMargin
Don Gagne's avatar
Don Gagne committed
140 141
                                                text:				modelData
                                                verticalAlignment:	Text.AlignVCenter
142
                                                font.pointSize:		__screenTools.dpiAdjustedPointSize(__qgcPal.defaultFontPointSize + 2);
Don Gagne's avatar
Don Gagne committed
143 144 145 146
                                            }
                                        }

                                        Repeater {
147
                                            model: __controller.getFactsForGroup(componentColumn.componentId, modelData)
Don Gagne's avatar
Don Gagne committed
148 149 150

                                            Row {
                                                spacing:	10
151
                                                x:			__leftMargin
Don Gagne's avatar
Don Gagne committed
152 153 154 155 156

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

                                                QGCLabel {
                                                    text:	modelFact.name
157
                                                    width:	__charWidth.contentWidth * (__maxParamChars + 2)
Don Gagne's avatar
Don Gagne committed
158 159 160 161 162
                                                }

                                                QGCLabel {

                                                    text:   modelFact.valueString + " " + modelFact.units
163
                                                    width:  __charWidth.contentWidth * 20
Don Gagne's avatar
Don Gagne committed
164
                                                    height: contentHeight
165 166 167 168 169 170 171 172 173 174 175 176 177
													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
178
                                                            text:           "Set RC to Param..."
179 180
                                                            onTriggered: 	__controller.setRCToParam(modelData)
                                                        }
Don Gagne's avatar
Don Gagne committed
181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256
                                                        MenuItem {
                                                            text:           "Properties..."
                                                            onTriggered: 	propertiesDialog.open()
                                                        }
                                                    }

                                                    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: modelFact.name
                                                                }
                                                                QGCLabel {
                                                                    text: "Group:"
                                                                }
                                                                QGCLabel {
                                                                    text: modelFact.group
                                                                }
                                                                QGCLabel {
                                                                    text: "Units:"
                                                                }
                                                                QGCLabel {
                                                                    text: modelFact.units ? modelFact.units : "none"
                                                                }
                                                                QGCLabel {
                                                                    text: "Default value:"
                                                                }
                                                                QGCLabel {
                                                                    text: modelFact.defaultValueAvailable ? modelFact.defaultValue : "none"
                                                                }
                                                                QGCLabel {
                                                                    text: "Minimum value:"
                                                                }
                                                                QGCLabel {
                                                                    text: modelFact.min
                                                                }
                                                                QGCLabel {
                                                                    text: "Maximum value:"
                                                                }
                                                                QGCLabel {
                                                                    text: modelFact.max
                                                                }
                                                                QGCLabel {
                                                                    text: "Description:"
                                                                }
                                                                QGCLabel {
                                                                    text: modelFact.shortDescription ? modelFact.shortDescription : "none"
                                                                }
                                                                QGCLabel {
                                                                    text: "Description (long):"
                                                                }
                                                                QGCLabel {
                                                                    id:         longDescription
                                                                    width:      500 - 20 - x
                                                                    wrapMode:   Text.WordWrap
                                                                    text:       modelFact.longDescription ? modelFact.longDescription : "none"
                                                                }
                                                            }
                                                        }
257
                                                    }
Don Gagne's avatar
Don Gagne committed
258 259 260 261 262 263 264 265 266 267

                                                    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) {
268
                                                                rightClickMenu.popup()
Don Gagne's avatar
Don Gagne committed
269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284
															}
                                                        }
                                                    }

                                                    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
285
                                                        property ExclusiveGroup exclusiveGroup: __exclusiveEditorGroup
Don Gagne's avatar
Don Gagne committed
286 287 288 289 290 291 292 293 294
                                                        onExclusiveGroupChanged: {
                                                            if (exclusiveGroup)
                                                                exclusiveGroup.bindCheckable(editor)
                                                        }
                                                    }
                                                }

                                                QGCLabel {
                                                    text: modelFact.shortDescription
295
													visible: fullMode
Don Gagne's avatar
Don Gagne committed
296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318
                                                }
                                            } // 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
}