From 67a5dbfe48fd16e3db284170b62c9a449c69fee3 Mon Sep 17 00:00:00 2001 From: Klaus Basan Date: Fri, 13 Dec 2013 19:58:51 +0000 Subject: [PATCH] converting value objects to/from QVariant refs #81 --- src/blackmisc/avaltitude.h | 9 +++ src/blackmisc/avheading.h | 9 +++ src/blackmisc/avioadfsystem.h | 8 +++ src/blackmisc/aviocomsystem.h | 9 +++ src/blackmisc/avionavsystem.h | 8 +++ src/blackmisc/aviotransponder.h | 9 +++ src/blackmisc/avtrack.h | 9 +++ src/blackmisc/blackmiscfreefunctions.cpp | 85 ++++++++++++++++++++++++ src/blackmisc/blackmiscfreefunctions.h | 30 +++++++++ src/blackmisc/coordinateecef.h | 9 +++ src/blackmisc/coordinategeodetic.h | 9 +++ src/blackmisc/coordinatened.h | 9 +++ src/blackmisc/geolatitude.h | 9 +++ src/blackmisc/geolongitude.h | 9 +++ src/blackmisc/mathmatrix1x3.h | 9 +++ src/blackmisc/mathmatrix3x1.h | 9 +++ src/blackmisc/mathmatrix3x3.h | 9 +++ src/blackmisc/mathvector3d.h | 9 +++ src/blackmisc/pqacceleration.h | 9 +++ src/blackmisc/pqangle.h | 8 +++ src/blackmisc/pqbase.h | 10 +++ src/blackmisc/pqfrequency.h | 9 +++ src/blackmisc/pqlength.h | 9 +++ src/blackmisc/pqmass.h | 9 +++ src/blackmisc/pqpressure.h | 9 +++ src/blackmisc/pqspeed.h | 9 +++ src/blackmisc/pqtemperature.h | 9 +++ src/blackmisc/pqtime.h | 9 +++ src/blackmisc/pqunits.h | 81 ++++++++++++++++++++++ src/blackmisc/valueobject.cpp | 17 +++++ src/blackmisc/valueobject.h | 12 ++++ 31 files changed, 457 insertions(+) diff --git a/src/blackmisc/avaltitude.h b/src/blackmisc/avaltitude.h index 87e5b6fbd..fbca318cc 100644 --- a/src/blackmisc/avaltitude.h +++ b/src/blackmisc/avaltitude.h @@ -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 diff --git a/src/blackmisc/avheading.h b/src/blackmisc/avheading.h index e8d0c7468..1cd3f1c6e 100644 --- a/src/blackmisc/avheading.h +++ b/src/blackmisc/avheading.h @@ -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 diff --git a/src/blackmisc/avioadfsystem.h b/src/blackmisc/avioadfsystem.h index 47f6c1adf..32bc57e54 100644 --- a/src/blackmisc/avioadfsystem.h +++ b/src/blackmisc/avioadfsystem.h @@ -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 diff --git a/src/blackmisc/aviocomsystem.h b/src/blackmisc/aviocomsystem.h index 97a02e55d..31cfcbcdb 100644 --- a/src/blackmisc/aviocomsystem.h +++ b/src/blackmisc/aviocomsystem.h @@ -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 diff --git a/src/blackmisc/avionavsystem.h b/src/blackmisc/avionavsystem.h index c3d126ea0..39ebf57f8 100644 --- a/src/blackmisc/avionavsystem.h +++ b/src/blackmisc/avionavsystem.h @@ -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 diff --git a/src/blackmisc/aviotransponder.h b/src/blackmisc/aviotransponder.h index 86c4a7fad..b87c51cd2 100644 --- a/src/blackmisc/aviotransponder.h +++ b/src/blackmisc/aviotransponder.h @@ -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 diff --git a/src/blackmisc/avtrack.h b/src/blackmisc/avtrack.h index 758a5e182..539b7a601 100644 --- a/src/blackmisc/avtrack.h +++ b/src/blackmisc/avtrack.h @@ -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 diff --git a/src/blackmisc/blackmiscfreefunctions.cpp b/src/blackmisc/blackmiscfreefunctions.cpp index 279e429c2..97fce7a45 100644 --- a/src/blackmisc/blackmiscfreefunctions.cpp +++ b/src/blackmisc/blackmiscfreefunctions.cpp @@ -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()) + { + // complex, user type + // it has to be made sure, that the cast works + const QDBusArgument arg = variant.value(); + QVariant fixedVariant; + if (localUserType < static_cast(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(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 +} + diff --git a/src/blackmisc/blackmiscfreefunctions.h b/src/blackmisc/blackmiscfreefunctions.h index 2c8b91b48..3e39680fc 100644 --- a/src/blackmisc/blackmiscfreefunctions.h +++ b/src/blackmisc/blackmiscfreefunctions.h @@ -7,6 +7,8 @@ #define BLACKMISC_FREEFUNCTIONS_H #include // for Q_INIT_RESOURCE +#include +#include /*! * 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 diff --git a/src/blackmisc/coordinateecef.h b/src/blackmisc/coordinateecef.h index 01c91b786..85b859ad9 100644 --- a/src/blackmisc/coordinateecef.h +++ b/src/blackmisc/coordinateecef.h @@ -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 diff --git a/src/blackmisc/coordinategeodetic.h b/src/blackmisc/coordinategeodetic.h index a2ac465c5..dfabb3ad4 100644 --- a/src/blackmisc/coordinategeodetic.h +++ b/src/blackmisc/coordinategeodetic.h @@ -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 diff --git a/src/blackmisc/coordinatened.h b/src/blackmisc/coordinatened.h index 71a38e282..bcb9a756e 100644 --- a/src/blackmisc/coordinatened.h +++ b/src/blackmisc/coordinatened.h @@ -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 diff --git a/src/blackmisc/geolatitude.h b/src/blackmisc/geolatitude.h index 7f805f94c..c51674282 100644 --- a/src/blackmisc/geolatitude.h +++ b/src/blackmisc/geolatitude.h @@ -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 */ diff --git a/src/blackmisc/geolongitude.h b/src/blackmisc/geolongitude.h index 2f09018c0..5e76ae2fc 100644 --- a/src/blackmisc/geolongitude.h +++ b/src/blackmisc/geolongitude.h @@ -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 */ diff --git a/src/blackmisc/mathmatrix1x3.h b/src/blackmisc/mathmatrix1x3.h index 872adf999..f987e6519 100644 --- a/src/blackmisc/mathmatrix1x3.h +++ b/src/blackmisc/mathmatrix1x3.h @@ -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 diff --git a/src/blackmisc/mathmatrix3x1.h b/src/blackmisc/mathmatrix3x1.h index d6578d1c9..8b4d65a78 100644 --- a/src/blackmisc/mathmatrix3x1.h +++ b/src/blackmisc/mathmatrix3x1.h @@ -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 diff --git a/src/blackmisc/mathmatrix3x3.h b/src/blackmisc/mathmatrix3x3.h index 9160c8dbc..e2e2b16fe 100644 --- a/src/blackmisc/mathmatrix3x3.h +++ b/src/blackmisc/mathmatrix3x3.h @@ -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 diff --git a/src/blackmisc/mathvector3d.h b/src/blackmisc/mathvector3d.h index 7c78fbc83..66f1219a4 100644 --- a/src/blackmisc/mathvector3d.h +++ b/src/blackmisc/mathvector3d.h @@ -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 diff --git a/src/blackmisc/pqacceleration.h b/src/blackmisc/pqacceleration.h index f40406d5f..d0e35dacc 100644 --- a/src/blackmisc/pqacceleration.h +++ b/src/blackmisc/pqacceleration.h @@ -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 */ diff --git a/src/blackmisc/pqangle.h b/src/blackmisc/pqangle.h index cdfc62b7c..1f4b6aec3 100644 --- a/src/blackmisc/pqangle.h +++ b/src/blackmisc/pqangle.h @@ -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 diff --git a/src/blackmisc/pqbase.h b/src/blackmisc/pqbase.h index 8277639cc..011ab449f 100644 --- a/src/blackmisc/pqbase.h +++ b/src/blackmisc/pqbase.h @@ -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 diff --git a/src/blackmisc/pqfrequency.h b/src/blackmisc/pqfrequency.h index 00882f40e..0edbc6978 100644 --- a/src/blackmisc/pqfrequency.h +++ b/src/blackmisc/pqfrequency.h @@ -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 */ diff --git a/src/blackmisc/pqlength.h b/src/blackmisc/pqlength.h index 75f44d801..543f99232 100644 --- a/src/blackmisc/pqlength.h +++ b/src/blackmisc/pqlength.h @@ -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 */ diff --git a/src/blackmisc/pqmass.h b/src/blackmisc/pqmass.h index e17002188..2e87998ed 100644 --- a/src/blackmisc/pqmass.h +++ b/src/blackmisc/pqmass.h @@ -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 */ diff --git a/src/blackmisc/pqpressure.h b/src/blackmisc/pqpressure.h index 09929932e..e8546b5b4 100644 --- a/src/blackmisc/pqpressure.h +++ b/src/blackmisc/pqpressure.h @@ -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 */ diff --git a/src/blackmisc/pqspeed.h b/src/blackmisc/pqspeed.h index b010d4103..28d36da8f 100644 --- a/src/blackmisc/pqspeed.h +++ b/src/blackmisc/pqspeed.h @@ -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 */ diff --git a/src/blackmisc/pqtemperature.h b/src/blackmisc/pqtemperature.h index 42c11decf..3eaf79f62 100644 --- a/src/blackmisc/pqtemperature.h +++ b/src/blackmisc/pqtemperature.h @@ -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 */ diff --git a/src/blackmisc/pqtime.h b/src/blackmisc/pqtime.h index eb5540514..98154eab3 100644 --- a/src/blackmisc/pqtime.h +++ b/src/blackmisc/pqtime.h @@ -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 */ diff --git a/src/blackmisc/pqunits.h b/src/blackmisc/pqunits.h index c34536489..ac705533a 100644 --- a/src/blackmisc/pqunits.h +++ b/src/blackmisc/pqunits.h @@ -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 diff --git a/src/blackmisc/valueobject.cpp b/src/blackmisc/valueobject.cpp index 4aadeb43d..b14b7e44d 100644 --- a/src/blackmisc/valueobject.cpp +++ b/src/blackmisc/valueobject.cpp @@ -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()) return nullptr; // not unstreamed yet + + // this cast cannot be dynamic, so the aboce conditions are crucical + const CValueObject *vo = static_cast(qv.constData()); + return vo; + } + /* * from DBus */ diff --git a/src/blackmisc/valueobject.h b/src/blackmisc/valueobject.h index a03b6aedb..553b6c66b 100644 --- a/src/blackmisc/valueobject.h +++ b/src/blackmisc/valueobject.h @@ -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: /*!