Commit 3d9a4ce4 authored by Don Gagne's avatar Don Gagne

Add enum and translator support

parent 9195b9d8
...@@ -31,7 +31,7 @@ ...@@ -31,7 +31,7 @@
Fact::Fact(QObject* parent) Fact::Fact(QObject* parent)
: QObject(parent) : QObject(parent)
, _componentId(-1) , _componentId(-1)
, _value(0) , _rawValue(0)
, _type(FactMetaData::valueTypeInt32) , _type(FactMetaData::valueTypeInt32)
, _metaData(NULL) , _metaData(NULL)
{ {
...@@ -43,7 +43,7 @@ Fact::Fact(int componentId, QString name, FactMetaData::ValueType_t type, QObjec ...@@ -43,7 +43,7 @@ Fact::Fact(int componentId, QString name, FactMetaData::ValueType_t type, QObjec
: QObject(parent) : QObject(parent)
, _name(name) , _name(name)
, _componentId(componentId) , _componentId(componentId)
, _value(0) , _rawValue(0)
, _type(type) , _type(type)
, _metaData(NULL) , _metaData(NULL)
{ {
...@@ -61,7 +61,7 @@ const Fact& Fact::operator=(const Fact& other) ...@@ -61,7 +61,7 @@ const Fact& Fact::operator=(const Fact& other)
{ {
_name = other._name; _name = other._name;
_componentId = other._componentId; _componentId = other._componentId;
_value = other._value; _rawValue = other._rawValue;
_type = other._type; _type = other._type;
if (_metaData && other._metaData) { if (_metaData && other._metaData) {
...@@ -80,26 +80,26 @@ void Fact::forceSetValue(const QVariant& value) ...@@ -80,26 +80,26 @@ void Fact::forceSetValue(const QVariant& value)
QString errorString; QString errorString;
if (_metaData->convertAndValidate(value, true /* convertOnly */, typedValue, errorString)) { if (_metaData->convertAndValidate(value, true /* convertOnly */, typedValue, errorString)) {
_value.setValue(typedValue); _rawValue.setValue(_metaData->cookedTranslator()(typedValue));
emit valueChanged(_value); emit valueChanged(typedValue);
emit _containerValueChanged(_value); emit _containerValueChanged(typedValue);
} }
} else { } else {
qWarning() << "Meta data pointer missing"; qWarning() << "Meta data pointer missing";
} }
} }
void Fact::setValue(const QVariant& value) void Fact::setRawValue(const QVariant& value)
{ {
if (_metaData) { if (_metaData) {
QVariant typedValue; QVariant typedValue;
QString errorString; QString errorString;
if (_metaData->convertAndValidate(value, true /* convertOnly */, typedValue, errorString)) { if (_metaData->convertAndValidate(value, true /* convertOnly */, typedValue, errorString)) {
if (typedValue != _value) { if (typedValue != _rawValue) {
_value.setValue(typedValue); _rawValue.setValue(typedValue);
emit valueChanged(_value); emit valueChanged(this->value());
emit _containerValueChanged(_value); emit _containerValueChanged(this->value());
} }
} }
} else { } else {
...@@ -107,11 +107,41 @@ void Fact::setValue(const QVariant& value) ...@@ -107,11 +107,41 @@ void Fact::setValue(const QVariant& value)
} }
} }
void Fact::setValue(const QVariant& value)
{
if (_metaData) {
setRawValue(_metaData->cookedTranslator()(value));
} else {
qWarning() << "Meta data pointer missing";
}
}
void Fact::setEnumStringValue(const QString& value)
{
if (_metaData) {
int index = _metaData->enumStrings().indexOf(value);
if (index != -1) {
setValue(_metaData->enumValues()[index]);
}
} else {
qWarning() << "Meta data pointer missing";
}
}
void Fact::setEnumIndex(int index)
{
if (_metaData) {
setValue(_metaData->enumValues()[index]);
} else {
qWarning() << "Meta data pointer missing";
}
}
void Fact::_containerSetValue(const QVariant& value) void Fact::_containerSetValue(const QVariant& value)
{ {
_value = value; _rawValue = value;
emit valueChanged(_value); emit valueChanged(_rawValue);
emit vehicleUpdated(_value); emit vehicleUpdated(_rawValue);
} }
QString Fact::name(void) const QString Fact::name(void) const
...@@ -126,7 +156,63 @@ int Fact::componentId(void) const ...@@ -126,7 +156,63 @@ int Fact::componentId(void) const
QVariant Fact::value(void) const QVariant Fact::value(void) const
{ {
return _value; if (_metaData) {
return _metaData->rawTranslator()(_rawValue);
} else {
qWarning() << "Meta data pointer missing";
return _rawValue;
}
}
QString Fact::enumStringValue(void) const
{
if (_metaData) {
int enumIndex = this->enumIndex();
if (enumIndex > 0 && enumIndex < _metaData->enumStrings().count()) {
return _metaData->enumStrings()[enumIndex];
}
} else {
qWarning() << "Meta data pointer missing";
}
return QString();
}
int Fact::enumIndex(void) const
{
if (_metaData) {
int index = 0;
foreach (QVariant enumValue, _metaData->enumValues()) {
if (enumValue == value()) {
return index;
}
index ++;
}
} else {
qWarning() << "Meta data pointer missing";
}
return -1;
}
QStringList Fact::enumStrings(void) const
{
if (_metaData) {
return _metaData->enumStrings();
} else {
qWarning() << "Meta data pointer missing";
return QStringList();
}
}
QVariantList Fact::enumValues(void) const
{
if (_metaData) {
return _metaData->enumValues();
} else {
qWarning() << "Meta data pointer missing";
return QVariantList();
}
} }
QString Fact::_variantToString(const QVariant& variant) const QString Fact::_variantToString(const QVariant& variant) const
...@@ -279,6 +365,7 @@ QString Fact::group(void) const ...@@ -279,6 +365,7 @@ QString Fact::group(void) const
void Fact::setMetaData(FactMetaData* metaData) void Fact::setMetaData(FactMetaData* metaData)
{ {
_metaData = metaData; _metaData = metaData;
emit valueChanged(value());
} }
bool Fact::valueEqualsDefault(void) const bool Fact::valueEqualsDefault(void) const
......
...@@ -46,56 +46,67 @@ public: ...@@ -46,56 +46,67 @@ public:
const Fact& operator=(const Fact& other); const Fact& operator=(const Fact& other);
Q_PROPERTY(int componentId READ componentId CONSTANT) Q_PROPERTY(int componentId READ componentId CONSTANT)
Q_PROPERTY(QString group READ group CONSTANT) Q_PROPERTY(int decimalPlaces READ decimalPlaces CONSTANT)
Q_PROPERTY(QString name READ name CONSTANT) Q_PROPERTY(QVariant defaultValue READ defaultValue CONSTANT)
Q_PROPERTY(QVariant value READ value WRITE setValue NOTIFY valueChanged USER true) Q_PROPERTY(QString defaultValueString READ defaultValueString CONSTANT)
Q_PROPERTY(QVariant valueString READ valueString NOTIFY valueChanged) Q_PROPERTY(bool defaultValueAvailable READ defaultValueAvailable CONSTANT)
Q_PROPERTY(QString units READ units CONSTANT) Q_PROPERTY(int enumIndex READ enumIndex WRITE setEnumIndex NOTIFY valueChanged)
Q_PROPERTY(QVariant defaultValue READ defaultValue CONSTANT) Q_PROPERTY(QStringList enumStrings READ enumStrings CONSTANT)
Q_PROPERTY(QString defaultValueString READ defaultValueString CONSTANT) Q_PROPERTY(QString enumStringValue READ enumStringValue WRITE setEnumStringValue NOTIFY valueChanged)
Q_PROPERTY(bool defaultValueAvailable READ defaultValueAvailable CONSTANT) Q_PROPERTY(QVariantList enumValues READ enumValues CONSTANT)
Q_PROPERTY(bool valueEqualsDefault READ valueEqualsDefault NOTIFY valueChanged) Q_PROPERTY(QString group READ group CONSTANT)
Q_PROPERTY(FactMetaData::ValueType_t type READ type CONSTANT) Q_PROPERTY(QString longDescription READ longDescription CONSTANT)
Q_PROPERTY(QString shortDescription READ shortDescription CONSTANT) Q_PROPERTY(QVariant max READ max CONSTANT)
Q_PROPERTY(QString longDescription READ longDescription CONSTANT) Q_PROPERTY(QString maxString READ maxString CONSTANT)
Q_PROPERTY(QVariant min READ min CONSTANT) Q_PROPERTY(bool maxIsDefaultForType READ maxIsDefaultForType CONSTANT)
Q_PROPERTY(QString minString READ minString CONSTANT) Q_PROPERTY(QVariant min READ min CONSTANT)
Q_PROPERTY(bool minIsDefaultForType READ minIsDefaultForType CONSTANT) Q_PROPERTY(QString minString READ minString CONSTANT)
Q_PROPERTY(QVariant max READ max CONSTANT) Q_PROPERTY(bool minIsDefaultForType READ minIsDefaultForType CONSTANT)
Q_PROPERTY(QString maxString READ maxString CONSTANT) Q_PROPERTY(QString name READ name CONSTANT)
Q_PROPERTY(bool maxIsDefaultForType READ maxIsDefaultForType CONSTANT) Q_PROPERTY(QString shortDescription READ shortDescription CONSTANT)
Q_PROPERTY(int decimalPlaces READ decimalPlaces CONSTANT) Q_PROPERTY(FactMetaData::ValueType_t type READ type CONSTANT)
Q_PROPERTY(QString units READ units CONSTANT)
Q_PROPERTY(QVariant value READ value WRITE setValue NOTIFY valueChanged)
Q_PROPERTY(bool valueEqualsDefault READ valueEqualsDefault NOTIFY valueChanged)
Q_PROPERTY(QVariant valueString READ valueString NOTIFY valueChanged)
/// Convert and validate value /// Convert and validate value
/// @param convertOnly true: validate type conversion only, false: validate against meta data as well /// @param convertOnly true: validate type conversion only, false: validate against meta data as well
Q_INVOKABLE QString validate(const QString& value, bool convertOnly); Q_INVOKABLE QString validate(const QString& value, bool convertOnly);
// Property system methods int componentId (void) const;
int decimalPlaces (void) const;
QString name(void) const; QVariant defaultValue (void) const;
int componentId(void) const; bool defaultValueAvailable (void) const;
QVariant value(void) const; QString defaultValueString (void) const;
QString valueString(void) const; int enumIndex (void) const;
QVariant defaultValue(void) const; QStringList enumStrings (void) const;
QString defaultValueString(void) const; QString enumStringValue (void) const;
bool defaultValueAvailable(void) const; QVariantList enumValues (void) const;
bool valueEqualsDefault(void) const; QString group (void) const;
QString shortDescription(void) const; QString longDescription (void) const;
QString longDescription(void) const; QVariant max (void) const;
QString units(void) const; QString maxString (void) const;
QVariant min(void) const; bool maxIsDefaultForType (void) const;
QString minString(void) const; QVariant min (void) const;
bool minIsDefaultForType(void) const; QString minString (void) const;
QVariant max(void) const; bool minIsDefaultForType (void) const;
QString maxString(void) const; QString name (void) const;
bool maxIsDefaultForType(void) const; QVariant rawValue (void) const { return _rawValue; } /// value prior to translation, careful
QString group(void) const; QString shortDescription (void) const;
int decimalPlaces(void) const; FactMetaData::ValueType_t type (void) const;
QString units (void) const;
QVariant value (void) const;
QString valueString (void) const;
bool valueEqualsDefault (void) const;
FactMetaData::ValueType_t type(void) const; void setRawValue (const QVariant& value);
void setValue (const QVariant& value);
void setEnumIndex (int index);
void setEnumStringValue (const QString& value);
void setValue(const QVariant& value); // C++ methods
/// Sets and sends new value to vehicle even if value is the same /// Sets and sends new value to vehicle even if value is the same
void forceSetValue(const QVariant& value); void forceSetValue(const QVariant& value);
...@@ -127,7 +138,7 @@ private: ...@@ -127,7 +138,7 @@ private:
QString _name; QString _name;
int _componentId; int _componentId;
QVariant _value; QVariant _rawValue;
FactMetaData::ValueType_t _type; FactMetaData::ValueType_t _type;
FactMetaData* _metaData; FactMetaData* _metaData;
}; };
......
...@@ -8,6 +8,18 @@ import QGroundControl.Controls 1.0 ...@@ -8,6 +8,18 @@ import QGroundControl.Controls 1.0
QGCComboBox { QGCComboBox {
property Fact fact: Fact { } property Fact fact: Fact { }
currentIndex: fact.value property bool indexModel: true ///< true: model must be specifed, selected index is fact value, false: use enum meta data
onActivated: fact.value = index
model: fact.enumStrings
currentIndex: indexModel ? fact.value : fact.enumIndex
onActivated: {
if (indexModel) {
fact.value = index
} else {
console.log("setting enumIndex", index)
fact.enumIndex = index
}
}
} }
...@@ -34,30 +34,34 @@ ...@@ -34,30 +34,34 @@
FactMetaData::FactMetaData(QObject* parent) FactMetaData::FactMetaData(QObject* parent)
: QObject(parent) : QObject(parent)
, _group("*Default Group")
, _type(valueTypeInt32) , _type(valueTypeInt32)
, _decimalPlaces(defaultDecimalPlaces)
, _defaultValue(0) , _defaultValue(0)
, _defaultValueAvailable(false) , _defaultValueAvailable(false)
, _min(_minForType()) , _group("*Default Group")
, _max(_maxForType()) , _max(_maxForType())
, _minIsDefaultForType(true)
, _maxIsDefaultForType(true) , _maxIsDefaultForType(true)
, _decimalPlaces(defaultDecimalPlaces) , _min(_minForType())
, _minIsDefaultForType(true)
, _rawTranslator(defaultTranslator)
, _cookedTranslator(defaultTranslator)
{ {
} }
FactMetaData::FactMetaData(ValueType_t type, QObject* parent) FactMetaData::FactMetaData(ValueType_t type, QObject* parent)
: QObject(parent) : QObject(parent)
, _group("*Default Group")
, _type(type) , _type(type)
, _decimalPlaces(defaultDecimalPlaces)
, _defaultValue(0) , _defaultValue(0)
, _defaultValueAvailable(false) , _defaultValueAvailable(false)
, _min(_minForType()) , _group("*Default Group")
, _max(_maxForType()) , _max(_maxForType())
, _minIsDefaultForType(true)
, _maxIsDefaultForType(true) , _maxIsDefaultForType(true)
, _decimalPlaces(defaultDecimalPlaces) , _min(_minForType())
, _minIsDefaultForType(true)
, _rawTranslator(defaultTranslator)
, _cookedTranslator(defaultTranslator)
{ {
} }
...@@ -70,16 +74,24 @@ FactMetaData::FactMetaData(const FactMetaData& other, QObject* parent) ...@@ -70,16 +74,24 @@ FactMetaData::FactMetaData(const FactMetaData& other, QObject* parent)
const FactMetaData& FactMetaData::operator=(const FactMetaData& other) const FactMetaData& FactMetaData::operator=(const FactMetaData& other)
{ {
_group = other._group; _decimalPlaces = other._decimalPlaces;
_type = other._type;
_defaultValue = other._defaultValue; _defaultValue = other._defaultValue;
_defaultValueAvailable = other._defaultValueAvailable; _defaultValueAvailable = other._defaultValueAvailable;
_min = other._min; _enumStrings = other._enumStrings;
_enumValues = other._enumValues;
_group = other._group;
_longDescription = other._longDescription;
_max = other._max; _max = other._max;
_minIsDefaultForType = other._minIsDefaultForType;
_maxIsDefaultForType = other._maxIsDefaultForType; _maxIsDefaultForType = other._maxIsDefaultForType;
_decimalPlaces = other._decimalPlaces; _min = other._min;
_minIsDefaultForType = other._minIsDefaultForType;
_name = other._name;
_shortDescription = other._shortDescription;
_type = other._type;
_units = other._units;
_rawTranslator = other._rawTranslator;
_cookedTranslator = other._cookedTranslator;
return *this; return *this;
} }
...@@ -229,3 +241,20 @@ bool FactMetaData::convertAndValidate(const QVariant& value, bool convertOnly, Q ...@@ -229,3 +241,20 @@ bool FactMetaData::convertAndValidate(const QVariant& value, bool convertOnly, Q
return convertOk && errorString.isEmpty(); return convertOk && errorString.isEmpty();
} }
void FactMetaData::setEnumInfo(const QStringList& strings, const QVariantList& values)
{
if (strings.count() != values.count()) {
qWarning() << "Count mismatch strings:values" << strings.count() << values.count();
return;
}
_enumStrings = strings;
_enumValues = values;
}
void FactMetaData::setTranslators(Translator rawTranslator, Translator cookedTranslator)
{
_rawTranslator = rawTranslator;
_cookedTranslator = cookedTranslator;
}
...@@ -51,6 +51,8 @@ public: ...@@ -51,6 +51,8 @@ public:
valueTypeFloat, valueTypeFloat,
valueTypeDouble valueTypeDouble
} ValueType_t; } ValueType_t;
typedef QVariant (*Translator)(const QVariant& from);
FactMetaData(QObject* parent = NULL); FactMetaData(QObject* parent = NULL);
FactMetaData(ValueType_t type, QObject* parent = NULL); FactMetaData(ValueType_t type, QObject* parent = NULL);
...@@ -58,32 +60,39 @@ public: ...@@ -58,32 +60,39 @@ public:
const FactMetaData& operator=(const FactMetaData& other); const FactMetaData& operator=(const FactMetaData& other);
// Property accessors int decimalPlaces (void) const { return _decimalPlaces; }
QString name(void) const { return _name; } QVariant defaultValue (void) const;
QString group(void) const { return _group; } bool defaultValueAvailable (void) const { return _defaultValueAvailable; }
ValueType_t type(void) const { return _type; } QStringList enumStrings (void) const { return _enumStrings; }
QVariant defaultValue(void) const; QVariantList enumValues (void) const { return _enumValues; }
bool defaultValueAvailable(void) const { return _defaultValueAvailable; } QString group (void) const { return _group; }
QString shortDescription(void) const { return _shortDescription; } QString longDescription (void) const { return _longDescription;}
QString longDescription(void) const { return _longDescription;} QVariant max (void) const { return _max; }
QString units(void) const { return _units; } bool maxIsDefaultForType (void) const { return _maxIsDefaultForType; }
QVariant min(void) const { return _min; } QVariant min (void) const { return _min; }
QVariant max(void) const { return _max; } bool minIsDefaultForType (void) const { return _minIsDefaultForType; }
bool minIsDefaultForType(void) const { return _minIsDefaultForType; } QString name (void) const { return _name; }
bool maxIsDefaultForType(void) const { return _maxIsDefaultForType; } QString shortDescription (void) const { return _shortDescription; }
int decimalPlaces(void) const { return _decimalPlaces; } ValueType_t type (void) const { return _type; }
QString units (void) const { return _units; }
Translator rawTranslator (void) const { return _rawTranslator; }
Translator cookedTranslator (void) const { return _cookedTranslator; }
// Property setters void setDecimalPlaces (int decimalPlaces) { _decimalPlaces = decimalPlaces; }
void setName(const QString& name) { _name = name; } void setDefaultValue (const QVariant& defaultValue);
void setGroup(const QString& group) { _group = group; } void setEnumInfo (const QStringList& strings, const QVariantList& values);
void setDefaultValue(const QVariant& defaultValue); void setGroup (const QString& group) { _group = group; }
void setLongDescription (const QString& longDescription) { _longDescription = longDescription;}
void setMax (const QVariant& max);
void setMin (const QVariant& max);
void setName (const QString& name) { _name = name; }
void setShortDescription(const QString& shortDescription) { _shortDescription = shortDescription; } void setShortDescription(const QString& shortDescription) { _shortDescription = shortDescription; }
void setLongDescription(const QString& longDescription) { _longDescription = longDescription;} void setUnits (const QString& units) { _units = units; }
void setUnits(const QString& units) { _units = units; }
void setMin(const QVariant& max); void setTranslators(Translator rawTranslator, Translator cookedTranslator);
void setMax(const QVariant& max); static QVariant defaultTranslator(const QVariant& from) { return from; }
void setDecimalPlaces(int decimalPlaces) { _decimalPlaces = decimalPlaces; }
/// Converts the specified value, validating against meta data /// Converts the specified value, validating against meta data
/// @param value Value to convert, can be string /// @param value Value to convert, can be string
/// @param convertOnly true: convert to correct type only, do not validate against meta data /// @param convertOnly true: convert to correct type only, do not validate against meta data
...@@ -98,19 +107,23 @@ private: ...@@ -98,19 +107,23 @@ private:
QVariant _minForType(void) const; QVariant _minForType(void) const;
QVariant _maxForType(void) const; QVariant _maxForType(void) const;
QString _name; ValueType_t _type; // must be first for correct constructor init
QString _group; int _decimalPlaces;
ValueType_t _type; QVariant _defaultValue;
QVariant _defaultValue; bool _defaultValueAvailable;
bool _defaultValueAvailable; QStringList _enumStrings;
QString _shortDescription; QVariantList _enumValues;
QString _longDescription; QString _group;
QString _units; QString _longDescription;
QVariant _min; QVariant _max;
QVariant _max; bool _maxIsDefaultForType;
bool _minIsDefaultForType; QVariant _min;
bool _maxIsDefaultForType; bool _minIsDefaultForType;
int _decimalPlaces; QString _name;
QString _shortDescription;
QString _units;
Translator _rawTranslator;
Translator _cookedTranslator;
}; };
#endif #endif
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