Commit fb26f834 authored by Don Gagne's avatar Don Gagne

Parameter validation support

parent a9d84d8e
...@@ -106,6 +106,7 @@ ...@@ -106,6 +106,7 @@
<file alias="QGroundControl/Controls/QGCViewMessage.qml">src/QmlControls/QGCViewMessage.qml</file> <file alias="QGroundControl/Controls/QGCViewMessage.qml">src/QmlControls/QGCViewMessage.qml</file>
<file alias="QGroundControl/Controls/ParameterEditor.qml">src/QmlControls/ParameterEditor.qml</file> <file alias="QGroundControl/Controls/ParameterEditor.qml">src/QmlControls/ParameterEditor.qml</file>
<file alias="QGroundControl/Controls/ParameterEditorDialog.qml">src/QmlControls/ParameterEditorDialog.qml</file>
<file alias="ParameterEditorWidget.qml">src/ViewWidgets/ParameterEditorWidget.qml</file> <file alias="ParameterEditorWidget.qml">src/ViewWidgets/ParameterEditorWidget.qml</file>
<file alias="CustomCommandWidget.qml">src/ViewWidgets/CustomCommandWidget.qml</file> <file alias="CustomCommandWidget.qml">src/ViewWidgets/CustomCommandWidget.qml</file>
......
...@@ -51,34 +51,19 @@ Fact::Fact(int componentId, QString name, FactMetaData::ValueType_t type, QObjec ...@@ -51,34 +51,19 @@ Fact::Fact(int componentId, QString name, FactMetaData::ValueType_t type, QObjec
void Fact::setValue(const QVariant& value) void Fact::setValue(const QVariant& value)
{ {
QVariant newValue; if (_metaData) {
QVariant typedValue;
switch (type()) { QString errorString;
case FactMetaData::valueTypeInt8:
case FactMetaData::valueTypeInt16: if (_metaData->convertAndValidate(value, true /* convertOnly */, typedValue, errorString)) {
case FactMetaData::valueTypeInt32: if (typedValue != _value) {
newValue = QVariant(value.toInt()); _value.setValue(typedValue);
break; emit valueChanged(_value);
emit _containerValueChanged(_value);
case FactMetaData::valueTypeUint8: }
case FactMetaData::valueTypeUint16: }
case FactMetaData::valueTypeUint32: } else {
newValue = QVariant(value.toUInt()); qWarning() << "Meta data pointer missing";
break;
case FactMetaData::valueTypeFloat:
newValue = QVariant(value.toFloat());
break;
case FactMetaData::valueTypeDouble:
newValue = QVariant(value.toDouble());
break;
}
if (newValue != _value) {
_value.setValue(newValue);
emit valueChanged(_value);
emit _containerValueChanged(_value);
} }
} }
...@@ -110,11 +95,15 @@ QString Fact::valueString(void) const ...@@ -110,11 +95,15 @@ QString Fact::valueString(void) const
QVariant Fact::defaultValue(void) QVariant Fact::defaultValue(void)
{ {
Q_ASSERT(_metaData); if (_metaData) {
if (!_metaData->defaultValueAvailable()) { if (!_metaData->defaultValueAvailable()) {
qDebug() << "Access to unavailable default value"; qDebug() << "Access to unavailable default value";
}
return _metaData->defaultValue();
} else {
qWarning() << "Meta data pointer missing";
return QVariant(0);
} }
return _metaData->defaultValue();
} }
FactMetaData::ValueType_t Fact::type(void) FactMetaData::ValueType_t Fact::type(void)
...@@ -124,38 +113,82 @@ FactMetaData::ValueType_t Fact::type(void) ...@@ -124,38 +113,82 @@ FactMetaData::ValueType_t Fact::type(void)
QString Fact::shortDescription(void) QString Fact::shortDescription(void)
{ {
Q_ASSERT(_metaData); if (_metaData) {
return _metaData->shortDescription(); return _metaData->shortDescription();
} else {
qWarning() << "Meta data pointer missing";
return QString();
}
} }
QString Fact::longDescription(void) QString Fact::longDescription(void)
{ {
Q_ASSERT(_metaData); if (_metaData) {
return _metaData->longDescription(); return _metaData->longDescription();
} else {
qWarning() << "Meta data pointer missing";
return QString();
}
} }
QString Fact::units(void) QString Fact::units(void)
{ {
Q_ASSERT(_metaData); if (_metaData) {
return _metaData->units(); return _metaData->units();
} else {
qWarning() << "Meta data pointer missing";
return QString();
}
} }
QVariant Fact::min(void) QVariant Fact::min(void)
{ {
Q_ASSERT(_metaData); if (_metaData) {
return _metaData->min(); return _metaData->min();
} else {
qWarning() << "Meta data pointer missing";
return QVariant(0);
}
} }
QVariant Fact::max(void) QVariant Fact::max(void)
{ {
Q_ASSERT(_metaData); if (_metaData) {
return _metaData->max(); return _metaData->max();
} else {
qWarning() << "Meta data pointer missing";
return QVariant(0);
}
}
bool Fact::minIsDefaultForType(void)
{
if (_metaData) {
return _metaData->minIsDefaultForType();
} else {
qWarning() << "Meta data pointer missing";
return false;
}
}
bool Fact::maxIsDefaultForType(void)
{
if (_metaData) {
return _metaData->maxIsDefaultForType();
} else {
qWarning() << "Meta data pointer missing";
return false;
}
} }
QString Fact::group(void) QString Fact::group(void)
{ {
Q_ASSERT(_metaData); if (_metaData) {
return _metaData->group(); return _metaData->group();
} else {
qWarning() << "Meta data pointer missing";
return QString();
}
} }
void Fact::setMetaData(FactMetaData* metaData) void Fact::setMetaData(FactMetaData* metaData)
...@@ -165,16 +198,40 @@ void Fact::setMetaData(FactMetaData* metaData) ...@@ -165,16 +198,40 @@ void Fact::setMetaData(FactMetaData* metaData)
bool Fact::valueEqualsDefault(void) bool Fact::valueEqualsDefault(void)
{ {
Q_ASSERT(_metaData); if (_metaData) {
if (_metaData->defaultValueAvailable()) { if (_metaData->defaultValueAvailable()) {
return _metaData->defaultValue() == value(); return _metaData->defaultValue() == value();
} else {
return false;
}
} else { } else {
qWarning() << "Meta data pointer missing";
return false; return false;
} }
} }
bool Fact::defaultValueAvailable(void) bool Fact::defaultValueAvailable(void)
{ {
Q_ASSERT(_metaData); if (_metaData) {
return _metaData->defaultValueAvailable(); return _metaData->defaultValueAvailable();
} } else {
\ No newline at end of file qWarning() << "Meta data pointer missing";
return false;
}
}
QString Fact::validate(const QString& value, bool convertOnly)
{
if (_metaData) {
QVariant typedValue;
QString errorString;
_metaData->convertAndValidate(value, convertOnly, typedValue, errorString);
return errorString;
} else {
qWarning() << "Meta data pointer missing";
return QString("Internal error: Meta data pointer missing");
}
}
...@@ -55,9 +55,15 @@ public: ...@@ -55,9 +55,15 @@ public:
Q_PROPERTY(QString shortDescription READ shortDescription CONSTANT) Q_PROPERTY(QString shortDescription READ shortDescription CONSTANT)
Q_PROPERTY(QString longDescription READ longDescription CONSTANT) Q_PROPERTY(QString longDescription READ longDescription CONSTANT)
Q_PROPERTY(QVariant min READ min CONSTANT) Q_PROPERTY(QVariant min READ min CONSTANT)
Q_PROPERTY(bool minIsDefaultForType READ minIsDefaultForType CONSTANT)
Q_PROPERTY(QVariant max READ max CONSTANT) Q_PROPERTY(QVariant max READ max CONSTANT)
Q_PROPERTY(bool maxIsDefaultForType READ maxIsDefaultForType CONSTANT)
Q_PROPERTY(QString group READ group CONSTANT) Q_PROPERTY(QString group READ group CONSTANT)
/// Convert and validate value
/// @param convertOnly true: validate type conversion only, false: validate against meta data as well
Q_INVOKABLE QString validate(const QString& value, bool convertOnly);
// Property system methods // Property system methods
QString name(void) const; QString name(void) const;
...@@ -73,7 +79,9 @@ public: ...@@ -73,7 +79,9 @@ public:
QString longDescription(void); QString longDescription(void);
QString units(void); QString units(void);
QVariant min(void); QVariant min(void);
bool minIsDefaultForType(void);
QVariant max(void); QVariant max(void);
bool maxIsDefaultForType(void);
QString group(void); QString group(void);
/// Sets the meta data associated with the Fact. /// Sets the meta data associated with the Fact.
......
...@@ -39,7 +39,9 @@ FactMetaData::FactMetaData(ValueType_t type, QObject* parent) : ...@@ -39,7 +39,9 @@ FactMetaData::FactMetaData(ValueType_t type, QObject* parent) :
_defaultValue(0), _defaultValue(0),
_defaultValueAvailable(false), _defaultValueAvailable(false),
_min(_minForType()), _min(_minForType()),
_max(_maxForType()) _max(_maxForType()),
_minIsDefaultForType(true),
_maxIsDefaultForType(true)
{ {
} }
...@@ -68,6 +70,7 @@ void FactMetaData::setMin(const QVariant& min) ...@@ -68,6 +70,7 @@ void FactMetaData::setMin(const QVariant& min)
{ {
if (min > _minForType()) { if (min > _minForType()) {
_min = min; _min = min;
_minIsDefaultForType = false;
} else { } else {
qWarning() << "Attempt to set min below allowable value"; qWarning() << "Attempt to set min below allowable value";
_min = _minForType(); _min = _minForType();
...@@ -81,6 +84,7 @@ void FactMetaData::setMax(const QVariant& max) ...@@ -81,6 +84,7 @@ void FactMetaData::setMax(const QVariant& max)
_max = _maxForType(); _max = _maxForType();
} else { } else {
_max = max; _max = max;
_maxIsDefaultForType = false;
} }
} }
...@@ -133,3 +137,58 @@ QVariant FactMetaData::_maxForType(void) ...@@ -133,3 +137,58 @@ QVariant FactMetaData::_maxForType(void)
// Make windows compiler happy, even switch is full cased // Make windows compiler happy, even switch is full cased
return QVariant(); return QVariant();
} }
bool FactMetaData::convertAndValidate(const QVariant& value, bool convertOnly, QVariant& typedValue, QString& errorString)
{
bool convertOk;
errorString.clear();
switch (type()) {
case FactMetaData::valueTypeInt8:
case FactMetaData::valueTypeInt16:
case FactMetaData::valueTypeInt32:
typedValue = QVariant(value.toInt(&convertOk));
if (!convertOnly && convertOk) {
if (min() > typedValue || typedValue > max()) {
errorString = QString("Value must be within %1 and %2").arg(min().toInt()).arg(max().toInt());
}
}
break;
case FactMetaData::valueTypeUint8:
case FactMetaData::valueTypeUint16:
case FactMetaData::valueTypeUint32:
typedValue = QVariant(value.toUInt(&convertOk));
if (!convertOnly && convertOk) {
if (min() > typedValue || typedValue > max()) {
errorString = QString("Value must be within %1 and %2").arg(min().toUInt()).arg(max().toUInt());
}
}
break;
case FactMetaData::valueTypeFloat:
typedValue = QVariant(value.toFloat(&convertOk));
if (!convertOnly && convertOk) {
if (min() > typedValue || typedValue > max()) {
errorString = QString("Value must be within %1 and %2").arg(min().toFloat()).arg(max().toFloat());
}
}
break;
case FactMetaData::valueTypeDouble:
typedValue = QVariant(value.toDouble(&convertOk));
if (!convertOnly && convertOk) {
if (min() > typedValue || typedValue > max()) {
errorString = QString("Value must be within %1 and %2").arg(min().toDouble()).arg(max().toDouble());
}
}
break;
}
if (!convertOk) {
errorString = "Invalid number";
}
return convertOk && errorString.isEmpty();
}
...@@ -55,6 +55,7 @@ public: ...@@ -55,6 +55,7 @@ public:
FactMetaData(ValueType_t type, QObject* parent = NULL); FactMetaData(ValueType_t type, QObject* parent = NULL);
// Property accessors // Property accessors
QString name(void) { return _name; }
QString group(void) { return _group; } QString group(void) { return _group; }
ValueType_t type(void) { return _type; } ValueType_t type(void) { return _type; }
QVariant defaultValue(void); QVariant defaultValue(void);
...@@ -64,8 +65,11 @@ public: ...@@ -64,8 +65,11 @@ public:
QString units(void) { return _units; } QString units(void) { return _units; }
QVariant min(void) { return _min; } QVariant min(void) { return _min; }
QVariant max(void) { return _max; } QVariant max(void) { return _max; }
bool minIsDefaultForType(void) { return _minIsDefaultForType; }
bool maxIsDefaultForType(void) { return _maxIsDefaultForType; }
// Property setters // Property setters
void setName(const QString& name) { _name = name; }
void setGroup(const QString& group) { _group = group; } void setGroup(const QString& group) { _group = group; }
void setDefaultValue(const QVariant& defaultValue); void setDefaultValue(const QVariant& defaultValue);
void setShortDescription(const QString& shortDescription) { _shortDescription = shortDescription; } void setShortDescription(const QString& shortDescription) { _shortDescription = shortDescription; }
...@@ -73,11 +77,20 @@ public: ...@@ -73,11 +77,20 @@ public:
void setUnits(const QString& units) { _units = units; } void setUnits(const QString& units) { _units = units; }
void setMin(const QVariant& max); void setMin(const QVariant& max);
void setMax(const QVariant& max); void setMax(const QVariant& max);
/// Converts the specified value, validating against meta data
/// @param value Value to convert, can be string
/// @param convertOnly true: convert to correct type only, do not validate against meta data
/// @param typeValue Converted value, correctly typed
/// @param errorString Error string if convert fails
/// @returns false: Convert failed, errorString set
bool convertAndValidate(const QVariant& value, bool convertOnly, QVariant& typedValue, QString& errorString);
private: private:
QVariant _minForType(void); QVariant _minForType(void);
QVariant _maxForType(void); QVariant _maxForType(void);
QString _name;
QString _group; QString _group;
ValueType_t _type; ValueType_t _type;
QVariant _defaultValue; QVariant _defaultValue;
...@@ -87,6 +100,8 @@ private: ...@@ -87,6 +100,8 @@ private:
QString _units; QString _units;
QVariant _min; QVariant _min;
QVariant _max; QVariant _max;
bool _minIsDefaultForType;
bool _maxIsDefaultForType;
}; };
#endif #endif
\ No newline at end of file
...@@ -167,6 +167,11 @@ QGCApplication::QGCApplication(int &argc, char* argv[], bool unitTesting) ...@@ -167,6 +167,11 @@ QGCApplication::QGCApplication(int &argc, char* argv[], bool unitTesting)
if (fullLogging) { if (fullLogging) {
QLoggingCategory::setFilterRules(QStringLiteral("*Log=true")); QLoggingCategory::setFilterRules(QStringLiteral("*Log=true"));
} else { } else {
if (_runningUnitTests) {
// We need to turn off these warnings until the firmware meta data is cleaned up
QLoggingCategory::setFilterRules(QStringLiteral("PX4ParameterLoaderLog.warning=false"));
}
// First thing we want to do is set up the qtlogging.ini file. If it doesn't already exist we copy // First thing we want to do is set up the qtlogging.ini file. If it doesn't already exist we copy
// it to the correct location. This way default debug builds will have logging turned off. // it to the correct location. This way default debug builds will have logging turned off.
......
...@@ -51,88 +51,94 @@ QGCView { ...@@ -51,88 +51,94 @@ QGCView {
ParameterEditorController { id: controller; factPanel: panel } ParameterEditorController { id: controller; factPanel: panel }
QGCViewPanel { Component {
id: panel id: editorDialogComponent
anchors.fill: parent
Component { ParameterEditorDialog { fact: __editorDialogFact }
id: factRowsComponent } // Component - Editor Dialog
Column { Component {
id: factColumn id: factRowsComponent
x: __leftMargin
QGCLabel { Column {
height: defaultTextHeight + (ScreenTools.defaultFontPizelSize * 0.5) id: factColumn
text: group x: __leftMargin
verticalAlignment: Text.AlignVCenter
font.pixelSize: ScreenTools.mediumFontPixelSize
}
Rectangle { QGCLabel {
width: parent.width text: group
height: 1 verticalAlignment: Text.AlignVCenter
color: __qgcPal.text font.pixelSize: ScreenTools.mediumFontPixelSize
} }
Repeater { Rectangle {
model: controller.getFactsForGroup(componentId, group) width: parent.width
height: 1
color: __qgcPal.text
}
Column { Repeater {
property Fact modelFact: controller.getParameterFact(componentId, modelData) model: controller.getFactsForGroup(componentId, group)
Item {
x: __leftMargin
width: parent.width
height: defaultTextHeight + (ScreenTools.defaultFontPixelSize * 0.5)
QGCLabel {
id: nameLabel
width: defaultTextWidth * (__maxParamChars + 1)
height: parent.height
verticalAlignment: Text.AlignVCenter
text: modelFact.name
}
QGCLabel { Column {
id: valueLabel property Fact modelFact: controller.getParameterFact(componentId, modelData)
width: defaultTextWidth * 20
height: parent.height
anchors.left: nameLabel.right
verticalAlignment: Text.AlignVCenter
color: modelFact.valueEqualsDefault ? __qgcPal.text : "orange"
text: modelFact.valueString + " " + modelFact.units
}
QGCLabel { Item {
height: parent.height x: __leftMargin
anchors.left: valueLabel.right width: parent.width
verticalAlignment: Text.AlignVCenter height: ScreenTools.defaultFontPixelSize * 1.75
visible: fullMode
text: modelFact.shortDescription
}
MouseArea { QGCLabel {
anchors.fill: parent id: nameLabel
acceptedButtons: Qt.LeftButton width: defaultTextWidth * (__maxParamChars + 1)
height: parent.height
verticalAlignment: Text.AlignVCenter
text: modelFact.name
}
onClicked: { QGCLabel {
__editorDialogFact = modelFact id: valueLabel
showDialog(editorDialogComponent, "Parameter Editor", fullMode ? 50 : -1, StandardButton.Cancel | StandardButton.Save) width: defaultTextWidth * 20
} height: parent.height
} anchors.left: nameLabel.right
verticalAlignment: Text.AlignVCenter
color: modelFact.valueEqualsDefault ? __qgcPal.text : "orange"
text: modelFact.valueString + " " + modelFact.units
}
QGCLabel {
height: parent.height
anchors.left: valueLabel.right
verticalAlignment: Text.AlignVCenter
visible: fullMode
text: modelFact.shortDescription
} }
Rectangle { MouseArea {
x: __leftMargin anchors.fill: parent
width: factColumn.width - __leftMargin - __rightMargin acceptedButtons: Qt.LeftButton
height: 1
color: __qgcPal.windowShade onClicked: {
__editorDialogFact = modelFact
showDialog(editorDialogComponent, "Parameter Editor", fullMode ? 50 : -1, StandardButton.Cancel | StandardButton.Save)
}
} }
} // Column - Fact }
} // Repeater - Facts
} // Column - Facts Rectangle {
} // Component - factRowsComponent x: __leftMargin
width: factColumn.width - __leftMargin - __rightMargin
height: 1
color: __qgcPal.windowShade
}
} // Column - Fact
} // Repeater - Facts
} // Column - Facts
} // Component - factRowsComponent
QGCViewPanel {
id: panel
anchors.fill: parent
Column { Column {
anchors.fill: parent anchors.fill: parent
...@@ -255,106 +261,5 @@ QGCView { ...@@ -255,106 +261,5 @@ QGCView {
} // ScrollView - Facts } // ScrollView - Facts
} // Item - Group ScrollView + Facts } // Item - Group ScrollView + Facts
} // Column - Outer } // Column - Outer
} } // QGCViewPanel
Component {
id: editorDialogComponent
QGCViewDialog {
id: editorDialog
ParameterEditorController { id: controller; factPanel: editorDialog }
property bool fullMode: true
function accept() {
__editorDialogFact.value = valueField.text
editorDialog.hideDialog()
}
Column {
spacing: defaultTextHeight
anchors.left: parent.left
anchors.right: parent.right
QGCLabel {
width: parent.width
wrapMode: Text.WordWrap
text: __editorDialogFact.shortDescription ? __editorDialogFact.shortDescription : "Description missing"
}
QGCLabel {
width: parent.width
wrapMode: Text.WordWrap
visible: __editorDialogFact.longDescription
text: __editorDialogFact.longDescription
}
QGCTextField {
id: valueField
text: __editorDialogFact.valueString
}
QGCLabel { text: __editorDialogFact.name }
Row {
spacing: defaultTextWidth
QGCLabel { text: "Units:" }
QGCLabel { text: __editorDialogFact.units ? __editorDialogFact.units : "none" }
}
Row {
spacing: defaultTextWidth
QGCLabel { text: "Minimum value:" }
QGCLabel { text: __editorDialogFact.min }
}
Row {
spacing: defaultTextWidth
QGCLabel { text: "Maxmimum value:" }
QGCLabel { text: __editorDialogFact.max }
}
Row {
spacing: defaultTextWidth
QGCLabel { text: "Default value:" }
QGCLabel { text: __editorDialogFact.defaultValueAvailable ? __editorDialogFact.defaultValue : "none" }
}
QGCLabel {
width: parent.width
wrapMode: Text.WordWrap
text: "Warning: Modifying parameters while vehicle is in flight can lead to vehicle instability and possible vehicle loss. " +
"Make sure you know what you are doing and double-check your values before Save!"
}
} // Column - Fact information
QGCButton {
anchors.rightMargin: defaultTextWidth
anchors.right: rcButton.left
anchors.bottom: parent.bottom
visible: __editorDialogFact.defaultValueAvailable
text: "Reset to default"
onClicked: {
__editorDialogFact.value = __editorDialogFact.defaultValue
editorDialog.hideDialog()
}
}
QGCButton {
id: rcButton
anchors.right: parent.right
anchors.bottom: parent.bottom
visible: __editorDialogFact.defaultValueAvailable
text: "Set RC to Param..."
onClicked: controller.setRCToParam(__editorDialogFact.name)
}
} // Rectangle - editorDialog
} // Component - Editor Dialog
} // QGCView } // QGCView
/*=====================================================================
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/>.
======================================================================*/
/// @file
/// @author Don Gagne <don@thegagnes.com>
import QtQuick 2.3
import QtQuick.Controls 1.3
import QtQuick.Controls.Styles 1.2
import QtQuick.Dialogs 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
QGCViewDialog {
property Fact fact
property bool validate: false
property string validateValue
ParameterEditorController { id: controller; factPanel: parent }
function accept() {
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
}
}
Component.onCompleted: {
if (validate) {
validationError.text = fact.validate(validateValue, false /* convertOnly */)
forceSave.visible = true
}
}
Column {
spacing: defaultTextHeight
anchors.left: parent.left
anchors.right: parent.right
QGCLabel {
width: parent.width
wrapMode: Text.WordWrap
text: fact.shortDescription ? fact.shortDescription : "Description missing"
}
QGCLabel {
width: parent.width
wrapMode: Text.WordWrap
visible: fact.longDescription
text: fact.longDescription
}
QGCTextField {
id: valueField
text: validate ? validateValue : fact.valueString
}
QGCLabel { text: fact.name }
Row {
spacing: defaultTextWidth
QGCLabel { text: "Units:" }
QGCLabel { text: fact.units ? fact.units : "none" }
}
Row {
spacing: defaultTextWidth
visible: !fact.minIsDefaultForType
QGCLabel { text: "Minimum value:" }
QGCLabel { text: fact.min }
}
Row {
spacing: defaultTextWidth
visible: !fact.maxIsDefaultForType
QGCLabel { text: "Maximum value:" }
QGCLabel { text: fact.max }
}
Row {
spacing: defaultTextWidth
QGCLabel { text: "Default value:" }
QGCLabel { text: fact.defaultValueAvailable ? fact.defaultValue : "none" }
}
QGCLabel {
width: parent.width
wrapMode: Text.WordWrap
text: "Warning: Modifying parameters while vehicle is in flight can lead to vehicle instability and possible vehicle loss. " +
"Make sure you know what you are doing and double-check your values before Save!"
}
QGCLabel {
id: validationError
width: parent.width
wrapMode: Text.WordWrap
color: "yellow"
}
QGCCheckBox {
id: forceSave
visible: false
text: "Force save (dangerous!)"
}
} // Column - Fact information
QGCButton {
id: bottomButton
anchors.rightMargin: defaultTextWidth
anchors.right: rcButton.left
anchors.bottom: parent.bottom
visible: fact.defaultValueAvailable
text: "Reset to default"
onClicked: {
fact.value = fact.defaultValue
fact.valueChanged(fact.value)
hideDialog()
}
}
QGCButton {
id: rcButton
anchors.right: parent.right
anchors.bottom: parent.bottom
text: "Set RC to Param..."
visible: !validate
onClicked: controller.setRCToParam(fact.name)
}
} // QGCViewDialog
...@@ -14,9 +14,11 @@ SubMenuButton 1.0 SubMenuButton.qml ...@@ -14,9 +14,11 @@ SubMenuButton 1.0 SubMenuButton.qml
IndicatorButton 1.0 IndicatorButton.qml IndicatorButton 1.0 IndicatorButton.qml
VehicleRotationCal 1.0 VehicleRotationCal.qml VehicleRotationCal 1.0 VehicleRotationCal.qml
VehicleSummaryRow 1.0 VehicleSummaryRow.qml VehicleSummaryRow 1.0 VehicleSummaryRow.qml
ParameterEditor 1.0 ParameterEditor.qml
ViewWidget 1.0 ViewWidget.qml ViewWidget 1.0 ViewWidget.qml
ParameterEditor 1.0 ParameterEditor.qml
ParameterEditorDialog 1.0 ParameterEditorDialog.qml
QGCView 1.0 QGCView.qml QGCView 1.0 QGCView.qml
QGCViewPanel 1.0 QGCViewPanel.qml QGCViewPanel 1.0 QGCViewPanel.qml
QGCViewDialog 1.0 QGCViewDialog.qml QGCViewDialog 1.0 QGCViewDialog.qml
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment