From 0b7abb0cab0ae72b97d80e71efb62740e436ef2c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jacob=20St=C3=B8ren?= Date: Sun, 19 Jun 2016 21:31:57 +0200 Subject: [PATCH] Caf: Added specialization for PdmPointer. Preparations for PtrArrayField. Made isEqual use QVariant::value() --- .../cafInternalPdmValueFieldSpecializations.h | 30 ++++++++++++++++++- .../cafInternalPdmFieldTypeSpecializations.h | 4 +-- 2 files changed, 31 insertions(+), 3 deletions(-) diff --git a/Fwk/AppFwk/cafProjectDataModel/cafPdmCore/cafInternalPdmValueFieldSpecializations.h b/Fwk/AppFwk/cafProjectDataModel/cafPdmCore/cafInternalPdmValueFieldSpecializations.h index 7e37599b80..0e98212238 100644 --- a/Fwk/AppFwk/cafProjectDataModel/cafPdmCore/cafInternalPdmValueFieldSpecializations.h +++ b/Fwk/AppFwk/cafProjectDataModel/cafPdmCore/cafInternalPdmValueFieldSpecializations.h @@ -1,6 +1,7 @@ #pragma once #include "cafAppEnum.h" +#include "cafPdmPointer.h" #include @@ -39,9 +40,10 @@ public: /// Check equality between QVariants that carries a Field Value. /// The == operator will normally work, but does not support custom types in the QVariant /// See http://qt-project.org/doc/qt-4.8/qvariant.html#operator-eq-eq-64 + /// Using the == between the real types is more safe. static bool isEqual(const QVariant& variantValue, const QVariant& variantValue2) { - return variantValue == variantValue2; + return variantValue.value() == variantValue2.value(); } }; @@ -71,6 +73,31 @@ public: }; +//================================================================================================== +/// Partial specialization for caf::PdmPointer +/// Used internally to avoid havning to declare everything Q_DECLARE_METATYPE() +/// User must use PdmPtrField or PdmChildField +//================================================================================================== +template +class PdmValueFieldSpecialization > +{ +public: + static QVariant convert(const PdmPointer& value) + { + return QVariant::fromValue(PdmPointer(value.rawPtr())); + } + + static void setFromVariant(const QVariant& variantValue, caf::PdmPointer& value) + { + value.setRawPtr(variantValue.value >().rawPtr()); + } + + static bool isEqual(const QVariant& variantValue, const QVariant& variantValue2) + { + return variantValue.value >() == variantValue2.value >() ; + } +}; + //================================================================================================== /// Partial specialization for std::vector //================================================================================================== @@ -108,6 +135,7 @@ public: static bool isEqual(const QVariant& variantValue, const QVariant& variantValue2) { + assert(false); // Not sure this actually works JJS return variantValue == variantValue2; } }; diff --git a/Fwk/AppFwk/cafProjectDataModel/cafPdmUiCore/cafInternalPdmFieldTypeSpecializations.h b/Fwk/AppFwk/cafProjectDataModel/cafPdmUiCore/cafInternalPdmFieldTypeSpecializations.h index cabdfabf96..718fe185e2 100644 --- a/Fwk/AppFwk/cafProjectDataModel/cafPdmUiCore/cafInternalPdmFieldTypeSpecializations.h +++ b/Fwk/AppFwk/cafProjectDataModel/cafPdmUiCore/cafInternalPdmFieldTypeSpecializations.h @@ -86,7 +86,7 @@ public: static bool isDataElementEqual(const QVariant& variantValue, const QVariant& variantValue2) { - return variantValue.value() == variantValue2.value(); + return PdmValueFieldSpecialization::isEqual(variantValue, variantValue2); } /// Methods to get a list of options for a field, specialized for AppEnum @@ -123,7 +123,7 @@ public: static bool isDataElementEqual(const QVariant& variantValue, const QVariant& variantValue2) { - return variantValue.value() == variantValue2.value(); + return PdmValueFieldSpecialization::isEqual(variantValue, variantValue2); } /// Methods to get a list of options for a field, specialized for AppEnum