Files
ResInsight/Fwk/AppFwk/cafProjectDataModel/cafPdmXml/cafInternalPdmXmlFieldCapability.h
Magne Sjaastad 1d57b9032b Custom vfp plot (#11450)
* AppFwk: When clearing a tree selection, make sure all values are cleared
* Fix deprecated implicit lambda
* Add support for using the closest value in addition to exact match
* Add table data source object and add plot with multiple data sources
Delete the temporary RimVfpDeck class
Add RimVfpTable to represent a table in a data source
Add plot able to show data from multiple tables

* AppFwk: Make it possible to call resolveReferences multiple times
Use case: Vfp tables are stored in files. Multiple tables can be present in one file. Pdm table objects are created after resolve references is done as part of parsing file. When the Pdm object are created, resolveReferences can be called once more.

* Call resolveReferencesRecursively() after RimVfpTable objects are created
2024-05-29 12:55:45 +02:00

204 lines
5.3 KiB
C++

#pragma once
#include "cafInternalPdmXmlFieldReaderWriter.h"
#include "cafPdmXmlFieldHandle.h"
#include <typeinfo>
namespace caf
{
template <typename FieldType>
class PdmFieldXmlCap : public PdmXmlFieldHandle
{
public:
// Type traits magic to check if a template argument is a vector
template <typename T>
struct is_vector : public std::false_type
{
};
template <typename T, typename A>
struct is_vector<std::vector<T, A>> : public std::true_type
{
};
PdmFieldXmlCap( FieldType* field, bool giveOwnership )
: PdmXmlFieldHandle( field, giveOwnership )
{
m_field = field;
m_dataTypeName = QString( "%1" ).arg( typeid( typename FieldType::FieldDataType ).name() );
}
// Xml Serializing
public:
void readFieldData( QXmlStreamReader& xmlStream, PdmObjectFactory* objectFactory ) override;
void writeFieldData( QXmlStreamWriter& xmlStream ) const override;
bool resolveReferences() override;
bool isVectorField() const override;
private:
FieldType* m_field;
};
template <typename DataType>
class PdmPtrField;
template <typename DataType>
class PdmFieldXmlCap<PdmPtrField<DataType*>> : public PdmXmlFieldHandle
{
typedef PdmPtrField<DataType*> FieldType;
public:
PdmFieldXmlCap( FieldType* field, bool giveOwnership )
: PdmXmlFieldHandle( field, giveOwnership )
{
m_field = field;
m_dataTypeName = DataType::classKeywordStatic();
m_referenceString = "";
}
// Xml Serializing
public:
void readFieldData( QXmlStreamReader& xmlStream, PdmObjectFactory* objectFactory ) override;
void writeFieldData( QXmlStreamWriter& xmlStream ) const override;
bool resolveReferences() override;
QString referenceString() const override;
private:
FieldType* m_field;
// Resolving
QString m_referenceString;
};
template <typename DataType>
class PdmPtrArrayField;
template <typename DataType>
class PdmFieldXmlCap<PdmPtrArrayField<DataType*>> : public PdmXmlFieldHandle
{
typedef PdmPtrArrayField<DataType*> FieldType;
public:
PdmFieldXmlCap( FieldType* field, bool giveOwnership )
: PdmXmlFieldHandle( field, giveOwnership )
{
m_field = field;
m_dataTypeName = DataType::classKeywordStatic();
m_referenceString = "";
}
// Xml Serializing
public:
void readFieldData( QXmlStreamReader& xmlStream, PdmObjectFactory* objectFactory ) override;
void writeFieldData( QXmlStreamWriter& xmlStream ) const override;
bool resolveReferences() override;
bool isVectorField() const override;
private:
FieldType* m_field;
// Resolving
QString m_referenceString;
};
template <typename DataType>
class PdmChildField;
template <typename DataType>
class PdmFieldXmlCap<PdmChildField<DataType*>> : public PdmXmlFieldHandle
{
typedef PdmChildField<DataType*> FieldType;
public:
PdmFieldXmlCap( FieldType* field, bool giveOwnership )
: PdmXmlFieldHandle( field, giveOwnership )
{
m_field = field;
m_dataTypeName = DataType::classKeywordStatic();
}
// Xml Serializing
public:
void readFieldData( QXmlStreamReader& xmlStream, PdmObjectFactory* objectFactory ) override;
void writeFieldData( QXmlStreamWriter& xmlStream ) const override;
bool resolveReferences() override;
private:
FieldType* m_field;
};
template <typename DataType>
class PdmChildArrayField;
template <typename DataType>
class PdmFieldXmlCap<PdmChildArrayField<DataType*>> : public PdmXmlFieldHandle
{
typedef PdmChildArrayField<DataType*> FieldType;
public:
PdmFieldXmlCap( FieldType* field, bool giveOwnership )
: PdmXmlFieldHandle( field, giveOwnership )
{
m_field = field;
m_dataTypeName = DataType::classKeywordStatic();
}
// Xml Serializing
public:
void readFieldData( QXmlStreamReader& xmlStream, PdmObjectFactory* objectFactory ) override;
void writeFieldData( QXmlStreamWriter& xmlStream ) const override;
bool resolveReferences() override;
bool isVectorField() const override;
private:
FieldType* m_field;
};
template <typename DataType>
class PdmField;
template <typename DataType>
class PdmFieldXmlCap<PdmField<std::vector<DataType>>> : public PdmXmlFieldHandle
{
typedef PdmField<std::vector<DataType>> FieldType;
public:
PdmFieldXmlCap( FieldType* field, bool giveOwnership )
: PdmXmlFieldHandle( field, giveOwnership )
{
m_field = field;
m_dataTypeName = QString( "%1" ).arg( typeid( DataType ).name() );
}
// Xml Serializing
public:
void readFieldData( QXmlStreamReader& xmlStream, PdmObjectFactory* objectFactory ) override;
void writeFieldData( QXmlStreamWriter& xmlStream ) const override;
bool resolveReferences() override;
bool isVectorField() const override;
private:
FieldType* m_field;
};
template <typename FieldType>
void addXmlCapabilityToField( FieldType* field )
{
if ( field->template capability<PdmFieldXmlCap<FieldType>>() == NULL )
{
new PdmFieldXmlCap<FieldType>( field, true );
}
}
template <typename FieldType>
void registerClassWithField( const QString& classKeyword, FieldType* field )
{
field->setOwnerClass( classKeyword );
}
} // End of namespace caf
#include "cafInternalPdmXmlFieldCapability.inl"