Make caf::PdmPtrField inherit caf::PdmValueField and make it support QVariant.

This commit is contained in:
Gaute Lindkvist 2018-09-05 11:03:41 +02:00
parent b41fee3ee3
commit ac8a11c813
3 changed files with 36 additions and 9 deletions

View File

@ -92,13 +92,15 @@ public :
T* operator->() const { return static_cast<T*>(const_cast<PdmObjectHandle*>(m_object)); } T* operator->() const { return static_cast<T*>(const_cast<PdmObjectHandle*>(m_object)); }
PdmPointer<T> & operator= ( const PdmPointer<T>& p ) { if (this != &p) PdmPointerImpl::removeReference(&m_object); m_object = p.m_object; PdmPointerImpl::addReference(&m_object); return *this; } PdmPointer<T> & operator= ( const PdmPointer<T>& p ) { if (this != &p) PdmPointerImpl::removeReference(&m_object); m_object = p.m_object; PdmPointerImpl::addReference(&m_object); return *this; }
PdmPointer<T> & operator= ( T* p ) { if (m_object != p) PdmPointerImpl::removeReference(&m_object); m_object = p; PdmPointerImpl::addReference(&m_object); return *this; } PdmPointer<T> & operator= ( T* p ) { if (m_object != p) PdmPointerImpl::removeReference(&m_object); m_object = p; PdmPointerImpl::addReference(&m_object); return *this; }
template <class S>
bool operator==(const PdmPointer<S>& rhs) const { return m_object == rhs.rawPtr(); }
// Private methods used by PdmField<T*> and PdmPointersField<T*>. Do not use unless you mean it ! // Private methods used by PdmField<T*> and PdmPointersField<T*>. Do not use unless you mean it !
PdmObjectHandle* rawPtr() const { return m_object; } PdmObjectHandle* rawPtr() const { return m_object; }
void setRawPtr( PdmObjectHandle* p) { if (m_object != p) PdmPointerImpl::removeReference(&m_object); m_object = p; PdmPointerImpl::addReference(&m_object); } void setRawPtr( PdmObjectHandle* p) { if (m_object != p) PdmPointerImpl::removeReference(&m_object); m_object = p; PdmPointerImpl::addReference(&m_object); }
}; };
} // End of namespace caf } // End of namespace caf
#include <QMetaType>
Q_DECLARE_METATYPE(caf::PdmPointer<caf::PdmObjectHandle>);

View File

@ -3,7 +3,7 @@
#include "cafAssert.h" #include "cafAssert.h"
#include "cafPdmPointer.h" #include "cafPdmPointer.h"
#include "cafPdmFieldHandle.h" #include "cafPdmValueField.h"
namespace caf namespace caf
{ {
@ -21,7 +21,7 @@ template< typename T> class PdmFieldXmlCap;
//================================================================================================== //==================================================================================================
template<typename DataType> template<typename DataType>
class PdmPtrField : public PdmFieldHandle class PdmPtrField : public PdmValueField
{ {
public: public:
PdmPtrField() PdmPtrField()
@ -31,7 +31,7 @@ public:
}; };
template<typename DataType > template<typename DataType >
class PdmPtrField <DataType*> : public PdmFieldHandle class PdmPtrField <DataType*> : public PdmValueField
{ {
typedef DataType* DataTypePtr; typedef DataType* DataTypePtr;
public: public:
@ -51,6 +51,11 @@ public:
DataType* value() const { return m_fieldValue; } DataType* value() const { return m_fieldValue; }
void setValue(const DataTypePtr& fieldValue); void setValue(const DataTypePtr& fieldValue);
// QVariant access
virtual QVariant toQVariant() const override;
virtual void setFromQVariant(const QVariant& variant) override;
virtual bool isReadOnly() const override { return false; }
// Access operators // Access operators
/*Conversion*/ operator DataType* () const { return m_fieldValue; } /*Conversion*/ operator DataType* () const { return m_fieldValue; }
@ -80,6 +85,3 @@ private:
} // End of namespace caf } // End of namespace caf
#include "cafPdmPtrField.inl" #include "cafPdmPtrField.inl"
#include <QMetaType>
Q_DECLARE_METATYPE(caf::PdmPointer<caf::PdmObjectHandle>);

View File

@ -1,6 +1,29 @@
#include <QVariant>
namespace caf namespace caf
{ {
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
template<typename DataType >
QVariant caf::PdmPtrField<DataType*>::toQVariant() const
{
caf::PdmObjectHandle* objectHandle = m_fieldValue.rawPtr();
caf::PdmPointer<caf::PdmObjectHandle> ptrHandle(objectHandle);
return QVariant::fromValue(ptrHandle);
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
template<typename DataType >
void caf::PdmPtrField<DataType*>::setFromQVariant(const QVariant& variant)
{
caf::PdmPointer<caf::PdmObjectHandle> variantHandle = variant.value<caf::PdmPointer<caf::PdmObjectHandle>>();
m_fieldValue.setRawPtr(variantHandle.rawPtr());
}
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------
/// ///
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------