converting value objects to/from QVariant

refs #81
This commit is contained in:
Klaus Basan
2013-12-13 19:58:51 +00:00
committed by Mathew Sutcliffe
parent 0518e680c3
commit 67a5dbfe48
31 changed files with 457 additions and 0 deletions

View File

@@ -104,6 +104,15 @@ namespace BlackMisc
return MeanSeaLevel == this->m_datum;
}
/*!
* \brief QVariant, required for DBus QVariant lists
* \return
*/
virtual QVariant toQVariant() const
{
return QVariant::fromValue(*this);
}
/*!
* \brief Get reference datum (MSL or AGL)
* \return

View File

@@ -72,6 +72,15 @@ namespace BlackMisc
*/
CHeading(CAngle heading, ReferenceNorth north) : CAngle(heading), m_north(north) {}
/*!
* \brief Virtual method to return QVariant, used with DBUS QVariant lists
* \return
*/
virtual QVariant toQVariant() const
{
return QVariant::fromValue(*this);
}
/*!
* \brief Equal operator ==
* \param other

View File

@@ -101,6 +101,14 @@ namespace BlackMisc
this->validate(true);
}
/*!
* \brief Virtual method to return QVariant, used with DBUS QVariant lists
* \return
*/
virtual QVariant toQVariant() const
{
return QVariant::fromValue(*this);
}
/*!
* \brief Set active frequency

View File

@@ -78,6 +78,15 @@ namespace BlackMisc
*/
CComSystem(const CComSystem &other) : CModulator(other) {}
/*!
* \brief QVariant, required for DBus QVariant lists
* \return
*/
virtual QVariant toQVariant() const
{
return QVariant::fromValue(*this);
}
/*!
* \brief Constructor
* \param name

View File

@@ -112,6 +112,14 @@ namespace BlackMisc
this->validate(true);
}
/*!
* \brief QVariant, required for DBus QVariant lists
* \return
*/
virtual QVariant toQVariant() const
{
return QVariant::fromValue(*this);
}
/*!
* \brief Set active frequency

View File

@@ -148,6 +148,15 @@ namespace BlackMisc
this->validate(true);
}
/*!
* \brief QVariant, required for DBus QVariant lists
* \return
*/
virtual QVariant toQVariant() const
{
return QVariant::fromValue(*this);
}
/*!
* \brief Transponder mode as string
* \return

View File

@@ -72,6 +72,15 @@ namespace BlackMisc
*/
CTrack(BlackMisc::PhysicalQuantities::CAngle track, ReferenceNorth north) : BlackMisc::PhysicalQuantities::CAngle(track), m_north(north) {}
/*!
* \brief As QVariant
* \return
*/
virtual QVariant toQVariant() const
{
return QVariant::fromValue(*this);
}
/*!
* \brief Equal operator ==
* \param other

View File

@@ -81,3 +81,88 @@ void BlackMisc::initResources()
{
initBlackMiscResources();
}
/*
* To string
*/
QString BlackMisc::qVariantToString(const QVariant &qv, bool i18n)
{
if (qv.type() != QVariant::UserType) return qv.toString();
const CValueObject *s = CValueObject::fromQVariant(qv);
if (s)
{
return s->toQString(i18n);
}
else
{
return "unknown";
}
}
/*
* Fix QVariant if it comes from DBus and contains QDBusArgument
*/
QVariant BlackMisc::fixQVariantFromDbusArgument(const QVariant &variant, int localUserType)
{
if (variant.canConvert<QDBusArgument>())
{
// complex, user type
// it has to be made sure, that the cast works
const QDBusArgument arg = variant.value<QDBusArgument>();
QVariant fixedVariant;
if (localUserType < static_cast<int>(QVariant::UserType))
{
// complex Qt type, e.g. QDateTime
fixedVariant = BlackMisc::complexQtTypeFromDbusArgument(arg, localUserType);
}
else
{
// http://qt-project.org/doc/qt-5.0/qtcore/qmetatype.html#create
void *obByMetaId = QMetaType::create(localUserType);
// own types, send as QDBusArgument
CValueObject *streamable = static_cast<CValueObject *>(obByMetaId);
arg >> (*streamable);
fixedVariant = streamable->toQVariant();
QMetaType::destroy(localUserType, obByMetaId);
}
return fixedVariant;
}
else
{
return variant;
}
}
/*
* Return QVariant based on QDBusArgument
*/
QVariant BlackMisc::complexQtTypeFromDbusArgument(const QDBusArgument &argument, int type)
{
// QDate = 14, QTime = 15, QDateTime = 16, QUrl = 17,
switch (type)
{
case QMetaType::QDateTime:
{
QDateTime dt;
argument >> dt;
return QVariant::fromValue(dt);
}
case QMetaType::QDate:
{
QDate date;
argument >> date;
return QVariant::fromValue(date);
}
case QMetaType::QTime:
{
QTime time;
argument >> time;
return QVariant::fromValue(time);
}
default:
qFatal("Type cannot be resolved");
}
return QVariant(); // suppress compiler warning
}

View File

@@ -7,6 +7,8 @@
#define BLACKMISC_FREEFUNCTIONS_H
#include <QDir> // for Q_INIT_RESOURCE
#include <QVariant>
#include <QDBusArgument>
/*!
* Workaround, to call initResource from namespace. Used in BlackMisc::initResources().
@@ -79,6 +81,34 @@ namespace BlackMisc
*/
void initResources();
/*!
* \brief QVariant to string, allows to stringify CValueObject
* \param qv
* \param i18n
* \return
*/
QString qVariantToString(const QVariant &qv, bool i18n = false);
/*!
* Fix variant. Required if a variant "comes in" via DBus,
* and represents a QDBusArgument rather than the real type.
* \param variant
* \param localUserType
* \return
*/
QVariant fixQVariantFromDbusArgument(const QVariant &variant, int localUserType);
/*!
* Convert a QDBusArgument back to a concrete type if required
* This is a workaround if a QVariant is sent via DBus, QDBusArgument is
* received and Qt is nor able to get the original QVariant back
* \param argument
* \param type
* \return
*/
// TODO: To be removed if a better solution is found
QVariant complexQtTypeFromDbusArgument(const QDBusArgument &argument, int type);
} // BlackMisc
#endif // guard

View File

@@ -37,6 +37,15 @@ namespace BlackMisc
*/
explicit CCoordinateEcef(const BlackMisc::Math::CVector3D vector) : CVector3DBase(vector.i(), vector.j(), vector.k()) {}
/*!
* \brief Virtual method to return QVariant, used with DBUS QVariant lists
* \return
*/
virtual QVariant toQVariant() const
{
return QVariant::fromValue(*this);
}
/*!
* \brief x
* \return

View File

@@ -144,6 +144,15 @@ namespace BlackMisc
return this->m_height;
}
/*!
* \brief Virtual method to return QVariant, used with DBUS QVariant lists
* \return
*/
virtual QVariant toQVariant() const
{
return QVariant::fromValue(*this);
}
/*!
* \brief Switch unit of latitude / longitude
* \param unit

View File

@@ -85,6 +85,15 @@ namespace BlackMisc
*/
CCoordinateNed(const CCoordinateGeodetic &referencePosition, const BlackMisc::Math::CVector3D &vector) : CVector3DBase(vector.i(), vector.j(), vector.k()), m_referencePosition(referencePosition), m_hasReferencePosition(true) {}
/*!
* \brief QVariant, required for DBus QVariant lists
* \return
*/
virtual QVariant toQVariant() const
{
return QVariant::fromValue(*this);
}
/*!
* \brief Equal operator ==
* \param other

View File

@@ -44,6 +44,15 @@ namespace BlackMisc
*/
CLatitude(double value, const BlackMisc::PhysicalQuantities::CAngleUnit &unit) : CEarthAngle(value, unit) {}
/*!
* \brief Virtual method to return QVariant, used with DBUS QVariant lists
* \return
*/
virtual QVariant toQVariant() const
{
return QVariant::fromValue(*this);
}
/*!
* \brief Virtual destructor
*/

View File

@@ -41,6 +41,15 @@ namespace BlackMisc
*/
CLongitude(double value, const BlackMisc::PhysicalQuantities::CAngleUnit &unit) : CEarthAngle(value, unit) {}
/*!
* \brief Virtual method to return QVariant, used with DBUS QVariant lists
* \return
*/
virtual QVariant toQVariant() const
{
return QVariant::fromValue(*this);
}
/*!
* \brief Virtual destructor
*/

View File

@@ -49,6 +49,15 @@ namespace BlackMisc
this->m_matrix(0, 1) = c2;
this->m_matrix(0, 2) = c3;
}
/*!
* \brief QVariant, required for DBus QVariant lists
* \return
*/
virtual QVariant toQVariant() const
{
return QVariant::fromValue(*this);
}
};
} // namespace

View File

@@ -54,6 +54,15 @@ namespace BlackMisc
*/
explicit CMatrix3x1(double fillValue) : CMatrixBase(fillValue) {}
/*!
* \brief QVariant, required for DBus QVariant lists
* \return
*/
virtual QVariant toQVariant() const
{
return QVariant::fromValue(*this);
}
/*!
* \brief Convert to vector

View File

@@ -64,6 +64,15 @@ namespace BlackMisc
this->setElement(2, 2, r3c3);
}
/*!
* \brief QVariant, required for DBus QVariant lists
* \return
*/
virtual QVariant toQVariant() const
{
return QVariant::fromValue(*this);
}
/*!
* \brief Calculates the determinant of the matrix
* \return

View File

@@ -39,6 +39,15 @@ namespace BlackMisc
*/
CVector3D(const CVector3D &other) : CVector3DBase(other) {}
/*!
* \brief QVariant, required for DBus QVariant lists
* \return
*/
virtual QVariant toQVariant() const
{
return QVariant::fromValue(*this);
}
/*!
* \brief i
* \return

View File

@@ -36,6 +36,15 @@ namespace BlackMisc
*/
CAcceleration(const CPhysicalQuantity &base) : CPhysicalQuantity(base) {}
/*!
* \brief QVariant, required for DBus QVariant lists
* \return
*/
virtual QVariant toQVariant() const
{
return QVariant::fromValue(*this);
}
/*!
* \brief Virtual destructor
*/

View File

@@ -54,6 +54,14 @@ namespace BlackMisc
degrees + minutes / 100.0,
CAngleUnit::sexagesimalDegMin()) {}
/*!
* \brief QVariant, required for DBus QVariant lists
* \return
*/
virtual QVariant toQVariant() const
{
return QVariant::fromValue(*this);
}
/*!
* \brief Virtual destructor

View File

@@ -257,6 +257,16 @@ namespace BlackMisc
CMeasurementUnit() : m_name("none"), m_symbol(""), m_epsilon(0), m_displayDigits(0), m_converter(new NilConverter())
{}
/*!
* \brief Virtual method to return QVariant, used with DBUS QVariant lists
* \return
*/
virtual QVariant toQVariant() const
{
// used with None!
return QVariant::fromValue(*this);
}
/*!
* \brief Equal operator ==
* \param other

View File

@@ -29,6 +29,15 @@ namespace BlackMisc
*/
CFrequency(double value, const CFrequencyUnit &unit) : CPhysicalQuantity(value, unit) {}
/*!
* \brief Virtual method to return QVariant, used with DBUS QVariant lists
* \return
*/
virtual QVariant toQVariant() const
{
return QVariant::fromValue(*this);
}
/*!
* \brief Virtual destructor
*/

View File

@@ -30,6 +30,15 @@ namespace BlackMisc
*/
CLength(double value, const CLengthUnit &unit) : CPhysicalQuantity(value, unit) {}
/*!
* \brief Virtual method to return QVariant, used with DBUS QVariant lists
* \return
*/
virtual QVariant toQVariant() const
{
return QVariant::fromValue(*this);
}
/*!
* \brief Virtual destructor
*/

View File

@@ -30,6 +30,15 @@ namespace BlackMisc
*/
CMass(double value, const CMassUnit &unit) : CPhysicalQuantity(value, unit) {}
/*!
* \brief QVariant, required for DBus QVariant lists
* \return
*/
virtual QVariant toQVariant() const
{
return QVariant::fromValue(*this);
}
/*!
* \brief Virtual destructor
*/

View File

@@ -32,6 +32,15 @@ namespace BlackMisc
*/
CPressure(double value, const CPressureUnit &unit) : CPhysicalQuantity(value, unit) {}
/*!
* \brief QVariant, required for DBus QVariant lists
* \return
*/
virtual QVariant toQVariant() const
{
return QVariant::fromValue(*this);
}
/*!
* \brief Virtual destructor
*/

View File

@@ -31,6 +31,15 @@ namespace BlackMisc
*/
CSpeed(double value, const CSpeedUnit &unit) : CPhysicalQuantity(value, unit) {}
/*!
* \brief QVariant, required for DBus QVariant lists
* \return
*/
virtual QVariant toQVariant() const
{
return QVariant::fromValue(*this);
}
/*!
* \brief Destructor
*/

View File

@@ -31,6 +31,15 @@ namespace BlackMisc
*/
CTemperature(double value, const CTemperatureUnit &unit): CPhysicalQuantity(value, unit) {}
/*!
* \brief QVariant, required for DBus QVariant lists
* \return
*/
virtual QVariant toQVariant() const
{
return QVariant::fromValue(*this);
}
/*!
* \brief Destructor
*/

View File

@@ -32,6 +32,15 @@ namespace BlackMisc
*/
CTime(double value, const CTimeUnit &unit) : CPhysicalQuantity(value, unit) {}
/*!
* \brief QVariant, required for DBus QVariant lists
* \return
*/
virtual QVariant toQVariant() const
{
return QVariant::fromValue(*this);
}
/*!
* \brief Destructor
*/

View File

@@ -47,6 +47,15 @@ namespace BlackMisc
*/
CLengthUnit() : CMeasurementUnit(defaultUnit()) {}
/*!
* \brief Virtual method to return QVariant, used with DBUS QVariant lists
* \return
*/
virtual QVariant toQVariant() const
{
return QVariant::fromValue(*this);
}
/*!
* \brief Default unit
* \return
@@ -176,6 +185,15 @@ namespace BlackMisc
*/
CAngleUnit() : CMeasurementUnit(defaultUnit()) {}
/*!
* \brief Virtual method to return QVariant, used with DBUS QVariant lists
* \return
*/
virtual QVariant toQVariant() const
{
return QVariant::fromValue(*this);
}
/*!
* \brief Default unit
* \return
@@ -284,6 +302,15 @@ namespace BlackMisc
*/
CFrequencyUnit() : CMeasurementUnit(defaultUnit()) {}
/*!
* \brief Virtual method to return QVariant, used with DBUS QVariant lists
* \return
*/
virtual QVariant toQVariant() const
{
return QVariant::fromValue(*this);
}
/*!
* \brief Default unit
* \return
@@ -380,6 +407,15 @@ namespace BlackMisc
*/
CMassUnit() : CMeasurementUnit(defaultUnit()) {}
/*!
* \brief Virtual method to return QVariant, used with DBUS QVariant lists
* \return
*/
virtual QVariant toQVariant() const
{
return QVariant::fromValue(*this);
}
/*!
* \brief Default unit
* \return
@@ -489,6 +525,15 @@ namespace BlackMisc
*/
CPressureUnit() : CMeasurementUnit(defaultUnit()) {}
/*!
* \brief Virtual method to return QVariant, used with DBUS QVariant lists
* \return
*/
virtual QVariant toQVariant() const
{
return QVariant::fromValue(*this);
}
/*!
* \brief Default unit
* \return
@@ -625,6 +670,15 @@ namespace BlackMisc
*/
CTemperatureUnit() : CMeasurementUnit(defaultUnit()) {}
/*!
* \brief Virtual method to return QVariant, used with DBUS QVariant lists
* \return
*/
virtual QVariant toQVariant() const
{
return QVariant::fromValue(*this);
}
/*!
* \brief Default unit
* \return
@@ -712,6 +766,15 @@ namespace BlackMisc
*/
CSpeedUnit() : CMeasurementUnit(defaultUnit()) {}
/*!
* \brief Virtual method to return QVariant, used with DBUS QVariant lists
* \return
*/
virtual QVariant toQVariant() const
{
return QVariant::fromValue(*this);
}
/*!
* Default unit
* \return
@@ -832,6 +895,15 @@ namespace BlackMisc
*/
CTimeUnit() : CMeasurementUnit(defaultUnit()) {}
/*!
* \brief Virtual method to return QVariant, used with DBUS QVariant lists
* \return
*/
virtual QVariant toQVariant() const
{
return QVariant::fromValue(*this);
}
/*!
* Default unit
* \return
@@ -980,6 +1052,15 @@ namespace BlackMisc
*/
CAccelerationUnit() : CMeasurementUnit(defaultUnit()) {}
/*!
* \brief Virtual method to return QVariant, used with DBUS QVariant lists
* \return
*/
virtual QVariant toQVariant() const
{
return QVariant::fromValue(*this);
}
/*!
* Default unit
* \return

View File

@@ -43,6 +43,23 @@ namespace BlackMisc
return this->convertToQString();
}
/*
* Return backing streamable object (if any)
*/
const CValueObject *CValueObject::fromQVariant(const QVariant &qv)
{
if (!qv.isValid()) return nullptr;
QVariant::Type t = qv.type();
uint ut = qv.userType();
if (t != QVariant::UserType) return nullptr; // not a user type
if (ut <= QVariant::UserType) return nullptr; // complex Qt type
if (qv.canConvert<QDBusArgument>()) return nullptr; // not unstreamed yet
// this cast cannot be dynamic, so the aboce conditions are crucical
const CValueObject *vo = static_cast<const CValueObject *>(qv.constData());
return vo;
}
/*
* from DBus
*/

View File

@@ -132,6 +132,18 @@ namespace BlackMisc
*/
std::string toStdString(bool i18n = false) const;
/*!
* \brief Virtual method to return QVariant, used with DBUS QVariant lists
* \return
*/
virtual QVariant toQVariant() const = 0;
/*!
* \brief The stored object as CValueObject
* \param qv
* \return
*/
static const CValueObject *fromQVariant(const QVariant &qv);
protected:
/*!