1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
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
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
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
257
258
259
260
261
262
263
264
265
266
267
268
269
270
/****************************************************************************
*
* (c) 2009-2016 QGROUNDCONTROL PROJECT <http://www.qgroundcontrol.org>
*
* QGroundControl is licensed according to the terms in the file
* COPYING.md in the root of the source code directory.
*
****************************************************************************/
import QtQuick 2.3
import QtQuick.Controls 1.2
import QtQuick.Layouts 1.2
import QGroundControl.Controls 1.0
import QGroundControl.Palette 1.0
import QGroundControl.Controllers 1.0
import QGroundControl.FactSystem 1.0
import QGroundControl.FactControls 1.0
import QGroundControl.ScreenTools 1.0
QGCViewDialog {
id: root
property Fact fact
property bool showRCToParam: false
property bool validate: false
property string validateValue
property real _editFieldWidth: ScreenTools.defaultFontPixelWidth * 20
property bool _longDescriptionAvailable: fact.longDescription != ""
ParameterEditorController { id: controller; factPanel: parent }
QGCPalette { id: qgcPal; colorGroupEnabled: true }
function accept() {
if (bitmaskColumn.visible && !manualEntry.checked) {
fact.value = bitmaskValue();
fact.valueChanged(fact.value)
hideDialog();
} else if (factCombo.visible && !manualEntry.checked) {
fact.enumIndex = factCombo.currentIndex
hideDialog()
} else {
var errorString = fact.validate(valueField.text, forceSave.checked)
if (errorString === "") {
fact.value = valueField.text
fact.valueChanged(fact.value)
hideDialog()
} else {
validationError.text = errorString
forceSave.visible = true
}
}
}
function bitmaskValue() {
var value = 0;
for (var i = 0; i < fact.bitmaskValues.length; ++i) {
var checkbox = bitmaskRepeater.itemAt(i)
if (checkbox.checked) {
value |= fact.bitmaskValues[i];
}
}
return value
}
Component.onCompleted: {
if (validate) {
validationError.text = fact.validate(validateValue, false /* convertOnly */)
forceSave.visible = true
}
}
QGCFlickable {
anchors.fill: parent
contentHeight: _column.y + _column.height
flickableDirection: Flickable.VerticalFlick
Column {
id: _column
spacing: defaultTextHeight
anchors.left: parent.left
anchors.right: parent.right
QGCLabel {
id: validationError
width: parent.width
wrapMode: Text.WordWrap
color: qgcPal.warningText
}
RowLayout {
spacing: defaultTextWidth
anchors.left: parent.left
anchors.right: parent.right
QGCTextField {
id: valueField
text: validate ? validateValue : fact.valueString
visible: fact.enumStrings.length == 0 || validate || manualEntry.checked
unitsLabel: fact.units
showUnits: fact.units != ""
Layout.fillWidth: true
inputMethodHints: ScreenTools.isiOS ?
Qt.ImhNone : // iOS numeric keyboard has not done button, we can't use it
Qt.ImhFormattedNumbersOnly // Forces use of virtual numeric keyboard
}
QGCButton {
anchors.baseline: valueField.baseline
visible: fact.defaultValueAvailable
text: qsTr("Reset to default")
onClicked: {
fact.value = fact.defaultValue
fact.valueChanged(fact.value)
hideDialog()
}
}
}
QGCComboBox {
id: factCombo
anchors.left: parent.left
anchors.right: parent.right
visible: _showCombo
model: fact.enumStrings
property bool _showCombo: fact.enumStrings.length != 0 && fact.bitmaskStrings.length == 0 && !validate
Component.onCompleted: {
// We can't bind directly to fact.enumIndex since that would add an unknown value
// if there are no enum strings.
if (_showCombo) {
currentIndex = fact.enumIndex
}
}
onCurrentIndexChanged: {
if (currentIndex >=0 && currentIndex < model.length) {
valueField.text = fact.enumValues[currentIndex]
}
}
}
Column {
id: bitmaskColumn
spacing: ScreenTools.defaultFontPixelHeight / 2
visible: fact.bitmaskStrings.length > 0 ? true : false;
Repeater {
id: bitmaskRepeater
model: fact.bitmaskStrings
delegate : QGCCheckBox {
text : modelData
checked : fact.value & fact.bitmaskValues[index]
onClicked: {
valueField.text = bitmaskValue()
}
}
}
}
QGCLabel {
width: parent.width
wrapMode: Text.WordWrap
visible: !longDescriptionLabel.visible
text: fact.shortDescription
}
QGCLabel {
id: longDescriptionLabel
width: parent.width
wrapMode: Text.WordWrap
visible: fact.longDescription != ""
text: fact.longDescription
}
Row {
spacing: defaultTextWidth
QGCLabel {
id: minValueDisplay
text: qsTr("Min: ") + fact.minString
visible: !fact.minIsDefaultForType
}
QGCLabel {
text: qsTr("Max: ") + fact.maxString
visible: !fact.maxIsDefaultForType
}
QGCLabel {
text: qsTr("Default: ") + fact.defaultValueString
visible: fact.defaultValueAvailable
}
}
QGCLabel {
text: qsTr("Parameter name: ") + fact.name
visible: fact.componentId > 0 // > 0 means it's a parameter fact
}
QGCLabel {
visible: fact.rebootRequired
text: "Reboot required after change"
}
QGCLabel {
width: parent.width
wrapMode: Text.WordWrap
text: qsTr("Warning: Modifying values while vehicle is in flight can lead to vehicle instability and possible vehicle loss. ") +
qsTr("Make sure you know what you are doing and double-check your values before Save!")
visible: fact.componentId != -1
}
QGCCheckBox {
id: forceSave
visible: false
text: qsTr("Force save (dangerous!)")
}
Row {
width: parent.width
spacing: ScreenTools.defaultFontPixelWidth / 2
visible: showRCToParam || factCombo.visible || bitmaskColumn.visible
Rectangle {
height: 1
width: ScreenTools.defaultFontPixelWidth * 5
color: qgcPal.text
anchors.verticalCenter: _advanced.verticalCenter
}
QGCCheckBox {
id: _advanced
text: qsTr("Advanced settings")
}
Rectangle {
height: 1
width: ScreenTools.defaultFontPixelWidth * 5
color: qgcPal.text
anchors.verticalCenter: _advanced.verticalCenter
}
}
// Checkbox to allow manual entry of enumerated or bitmask parameters
QGCCheckBox {
id: manualEntry
visible: _advanced.checked && (factCombo.visible || bitmaskColumn.visible)
text: qsTr("Manual Entry")
onClicked: {
valueField.text = fact.valueString
}
}
QGCButton {
text: qsTr("Set RC to Param...")
width: _editFieldWidth
visible: _advanced.checked && !validate && showRCToParam
onClicked: controller.setRCToParam(fact.name)
}
} // Column
}
} // QGCViewDialog