Newer
Older
/****************************************************************************
*
* (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 1.0
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
property bool validate: false
property string validateValue
property real _editFieldWidth: ScreenTools.defaultFontPixelWidth * 20
property bool _longDescriptionAvailable: fact.longDescription != ""
property bool _editingParameter: fact.componentId != 0
property bool _allowForceSave: QGroundControl.corePlugin.showAdvancedUI || !_editingParameter
property bool _allowDefaultReset: fact.defaultValueAvailable && (QGroundControl.corePlugin.showAdvancedUI || !_editingParameter)
ParameterEditorController { id: controller; factPanel: parent }
QGCPalette { id: qgcPal; colorGroupEnabled: true }
if (bitmaskColumn.visible && !manualEntry.checked) {
fact.value = bitmaskValue();
fact.valueChanged(fact.value)
} else if (factCombo.visible && !manualEntry.checked) {
var errorString = fact.validate(valueField.text, forceSave.checked)
if (errorString === "") {
fact.value = valueField.text
fact.valueChanged(fact.value)
hideDialog()
} else {
validationError.text = errorString
if (_allowForceSave) {
forceSave.visible = true
}
function reject() {
fact.valueChanged(fact.value)
hideDialog();
}
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 */)
if (_allowForceSave) {
forceSave.visible = true
}
// set focus to the text field when becoming visible (in case of an Enum,
// the valueField is not visible, but it's not an issue because the combo
// box cannot have a focus)
onVisibleChanged: if (visible && !ScreenTools.isMobile) valueField.forceActiveFocus()
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 {
width: parent.width
wrapMode: Text.WordWrap
RowLayout {
spacing: defaultTextWidth
anchors.left: parent.left
anchors.right: parent.right
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: _allowDefaultReset
onClicked: {
fact.value = fact.defaultValue
fact.valueChanged(fact.value)
hideDialog()
}
}
}
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]
}
id: bitmaskColumn
spacing: ScreenTools.defaultFontPixelHeight / 2
visible: fact.bitmaskStrings.length > 0 ? true : false;
delegate : QGCCheckBox {
text : modelData
checked : fact.value & fact.bitmaskValues[index]
onClicked: {
valueField.text = bitmaskValue()
}
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
}
QGCLabel {
id: minValueDisplay
text: qsTr("Min: ") + fact.minString
visible: !fact.minIsDefaultForType
QGCLabel {
text: qsTr("Max: ") + fact.maxString
visible: !fact.maxIsDefaultForType
text: qsTr("Default: ") + fact.defaultValueString
visible: _allowDefaultReset
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!")
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
}
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
}
}
text: qsTr("Set RC to Param...")
visible: _advanced.checked && !validate && showRCToParam
onClicked: controller.setRCToParam(fact.name)
}
} // Column