Caf: Fixed issues regarding custom type in fields with multi selection

This commit is contained in:
Jacob Støren
2016-06-16 09:39:33 +02:00
parent ce2112fbc6
commit 214f013499
8 changed files with 22 additions and 15 deletions

View File

@@ -66,7 +66,7 @@ public:
PdmValueFieldSpecialization< cvf::Color3f >::setFromVariant(variantValue, value); PdmValueFieldSpecialization< cvf::Color3f >::setFromVariant(variantValue, value);
} }
static bool isEqual(const QVariant& variantValue, const QVariant& variantValue2) static bool isDataElementEqual(const QVariant& variantValue, const QVariant& variantValue2)
{ {
return PdmValueFieldSpecialization< cvf::Color3f >::isEqual(variantValue, variantValue2); return PdmValueFieldSpecialization< cvf::Color3f >::isEqual(variantValue, variantValue2);
} }

View File

@@ -64,7 +64,7 @@ public:
PdmValueFieldSpecialization< cvf::Mat4d >::setFromVariant(variantValue, value); PdmValueFieldSpecialization< cvf::Mat4d >::setFromVariant(variantValue, value);
} }
static bool isEqual(const QVariant& variantValue, const QVariant& variantValue2) static bool isDataElementEqual(const QVariant& variantValue, const QVariant& variantValue2)
{ {
return PdmValueFieldSpecialization< cvf::Mat4d >::isEqual(variantValue, variantValue2); return PdmValueFieldSpecialization< cvf::Mat4d >::isEqual(variantValue, variantValue2);
} }

View File

@@ -65,7 +65,7 @@ public:
PdmValueFieldSpecialization< cvf::Vec3d >::setFromVariant(variantValue, value); PdmValueFieldSpecialization< cvf::Vec3d >::setFromVariant(variantValue, value);
} }
static bool isEqual(const QVariant& variantValue, const QVariant& variantValue2) static bool isDataElementEqual(const QVariant& variantValue, const QVariant& variantValue2)
{ {
return PdmValueFieldSpecialization< cvf::Vec3d >::isEqual(variantValue, variantValue2); return PdmValueFieldSpecialization< cvf::Vec3d >::isEqual(variantValue, variantValue2);
} }

View File

@@ -37,7 +37,7 @@ public:
value.setRawPtr(variantValue.value<PdmPointer<PdmObjectHandle> >().rawPtr()); value.setRawPtr(variantValue.value<PdmPointer<PdmObjectHandle> >().rawPtr());
} }
static bool isEqual(const QVariant& variantValue, const QVariant& variantValue2) static bool isDataElementEqual(const QVariant& variantValue, const QVariant& variantValue2)
{ {
return variantValue.value<PdmPointer<PdmObjectHandle> >() == variantValue2.value<PdmPointer<PdmObjectHandle> >() ; return variantValue.value<PdmPointer<PdmObjectHandle> >() == variantValue2.value<PdmPointer<PdmObjectHandle> >() ;
} }
@@ -84,7 +84,7 @@ public:
} }
} }
static bool isEqual(const QVariant& variantValue, const QVariant& variantValue2) static bool isDataElementEqual(const QVariant& variantValue, const QVariant& variantValue2)
{ {
return variantValue.value<T>() == variantValue2.value<T>(); return variantValue.value<T>() == variantValue2.value<T>();
} }
@@ -121,7 +121,7 @@ public:
return PdmValueFieldSpecialization< std::vector<T> >::setFromVariant(variantValue, value); return PdmValueFieldSpecialization< std::vector<T> >::setFromVariant(variantValue, value);
} }
static bool isEqual(const QVariant& variantValue, const QVariant& variantValue2) static bool isDataElementEqual(const QVariant& variantValue, const QVariant& variantValue2)
{ {
return variantValue.value<T>() == variantValue2.value<T>(); return variantValue.value<T>() == variantValue2.value<T>();
} }
@@ -174,7 +174,7 @@ public:
#endif #endif
} }
static bool isEqual(const QVariant& variantValue, const QVariant& variantValue2) static bool isDataElementEqual(const QVariant& variantValue, const QVariant& variantValue2)
{ {
return variantValue == variantValue2; return variantValue == variantValue2;
} }

View File

@@ -116,7 +116,11 @@ QVariant caf::PdmFieldUiCap<FieldType>::uiValue() const
PdmOptionItemInfo::findValues<typename FieldType::FieldDataType>(m_optionEntryCache, uiBasedQVariant, indexesToFoundOptions); PdmOptionItemInfo::findValues<typename FieldType::FieldDataType>(m_optionEntryCache, uiBasedQVariant, indexesToFoundOptions);
if (uiBasedQVariant.type() == QVariant::List) if (uiBasedQVariant.type() == QVariant::List)
{ {
if (indexesToFoundOptions.size() == static_cast<size_t>(uiBasedQVariant.toList().size())) if (isAutoAddingOptionFromValue() && indexesToFoundOptions.size() != static_cast<size_t>(uiBasedQVariant.toList().size()))
{
assert(false); // Did not find all the field values among the options available, even though we should. The "core" data type in the field is probably not supported by QVariant::toString()
}
else
{ {
QList<QVariant> returnList; QList<QVariant> returnList;
for (size_t i = 0; i < indexesToFoundOptions.size(); ++i) for (size_t i = 0; i < indexesToFoundOptions.size(); ++i)
@@ -125,7 +129,6 @@ QVariant caf::PdmFieldUiCap<FieldType>::uiValue() const
} }
return QVariant(returnList); return QVariant(returnList);
} }
assert(false); // Did not find all the field values among the options available.
} }
else else
{ {
@@ -175,6 +178,7 @@ QList<PdmOptionItemInfo> caf::PdmFieldUiCap<FieldType>::valueOptions(bool* useOp
bool foundAllFieldValues = PdmOptionItemInfo::findValues<typename FieldType::FieldDataType>(m_optionEntryCache, uiBasedQVariant, foundIndexes); bool foundAllFieldValues = PdmOptionItemInfo::findValues<typename FieldType::FieldDataType>(m_optionEntryCache, uiBasedQVariant, foundIndexes);
// If not all are found, we have to add the missing to the list, to be able to show it // If not all are found, we have to add the missing to the list, to be able to show it
// This will only work if the field data type (or elemnt type for containers) is supported by QVariant.toString(). Custom classes don't
if (isAutoAddingOptionFromValue() && !foundAllFieldValues) if (isAutoAddingOptionFromValue() && !foundAllFieldValues)
{ {
@@ -193,7 +197,10 @@ QList<PdmOptionItemInfo> caf::PdmFieldUiCap<FieldType>::valueOptions(bool* useOp
bool isFound = false; bool isFound = false;
for (unsigned int opIdx = 0; opIdx < static_cast<unsigned int>(m_optionEntryCache.size()); ++opIdx) for (unsigned int opIdx = 0; opIdx < static_cast<unsigned int>(m_optionEntryCache.size()); ++opIdx)
{ {
if (valuesSelectedInField[i] == m_optionEntryCache[opIdx].value) isFound = true; if(PdmUiFieldSpecialization<typename FieldType::FieldDataType>::isDataElementEqual(valuesSelectedInField[i], m_optionEntryCache[opIdx].value))
{
isFound = true;
}
} }
if (!isFound && !valuesSelectedInField[i].toString().isEmpty()) if (!isFound && !valuesSelectedInField[i].toString().isEmpty())

View File

@@ -27,7 +27,7 @@ public:
virtual QVariant toUiBasedQVariant() const { return QVariant(); } virtual QVariant toUiBasedQVariant() const { return QVariant(); }
void notifyFieldChanged(const QVariant& oldUiBasedQVariant, const QVariant& newUiBasedQVariant); void notifyFieldChanged(const QVariant& oldUiBasedQVariant, const QVariant& newUiBasedQVariant);
bool isAutoAddingOptionFromValue() { return m_isAutoAddingOptionFromValue; } bool isAutoAddingOptionFromValue() const { return m_isAutoAddingOptionFromValue; }
void setAutoAddingOptionFromValue(bool isAddingValue) { m_isAutoAddingOptionFromValue = isAddingValue;} void setAutoAddingOptionFromValue(bool isAddingValue) { m_isAutoAddingOptionFromValue = isAddingValue;}
private: private:
PdmFieldHandle* m_owner; PdmFieldHandle* m_owner;

View File

@@ -43,7 +43,7 @@ public:
/// The == operator will normally work, but does not support custom types in the QVariant /// 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 /// See http://qt-project.org/doc/qt-4.8/qvariant.html#operator-eq-eq-64
/// This is needed for the lookup regarding OptionValues /// This is needed for the lookup regarding OptionValues
static bool isEqual(const QVariant& variantValue, const QVariant& variantValue2) static bool isDataElementEqual(const QVariant& variantValue, const QVariant& variantValue2)
{ {
return variantValue == variantValue2; return variantValue == variantValue2;
} }

View File

@@ -128,7 +128,7 @@ bool PdmOptionItemInfo::findValues(const QList<PdmOptionItemInfo>& optionList, Q
{ {
for (unsigned int opIdx = 0; opIdx < static_cast<unsigned int>(optionList.size()); ++opIdx) for (unsigned int opIdx = 0; opIdx < static_cast<unsigned int>(optionList.size()); ++opIdx)
{ {
if (PdmUiFieldSpecialization<T>::isEqual(valuesSelectedInField[i], optionList[opIdx].value)) if (PdmUiFieldSpecialization<T>::isDataElementEqual(valuesSelectedInField[i], optionList[opIdx].value))
{ {
foundIndexes.push_back(opIdx); foundIndexes.push_back(opIdx);
} }
@@ -142,7 +142,7 @@ bool PdmOptionItemInfo::findValues(const QList<PdmOptionItemInfo>& optionList, Q
{ {
for (unsigned int opIdx = 0; opIdx < static_cast<unsigned int>(optionList.size()); ++opIdx) for (unsigned int opIdx = 0; opIdx < static_cast<unsigned int>(optionList.size()); ++opIdx)
{ {
if (PdmUiFieldSpecialization<T>::isEqual(optionList[opIdx].value, fieldValue)) if (PdmUiFieldSpecialization<T>::isDataElementEqual(optionList[opIdx].value, fieldValue))
{ {
foundIndexes.push_back(opIdx); foundIndexes.push_back(opIdx);
break; break;