#2070 AppFwk : Disable default IO for proxy fields

Proxy fields usually reads and transforms data from other sources, usually other Pdm fields. This commit disables IO for proxy fields in the constructor. If XML serialization is required, this must be set on the proxy field, like this

field.xmlCapability()->setIOWritable(true)
field.xmlCapability()->setIOReadable(true)
This commit is contained in:
Magne Sjaastad committed 2026-01-19 16:10:14 +01:00
1 parent d4a64b4033
commit 9851afc621
30 files changed
+107 -32

No files matched your search

@@ -72,7 +72,6 @@ RimTextAnnotation::RimTextAnnotation()
CAF_PDM_InitFieldNoDefault( &m_nameProxy, "NameProxy", "Name Proxy" );
m_nameProxy.registerGetMethod( this, &RimTextAnnotation::extractNameFromText );
m_nameProxy.uiCapability()->setUiReadOnly( true );
m_nameProxy.xmlCapability()->disableIO();
m_anchorPointPickEventHandler = std::make_shared<RicVec3dPickEventHandler>( &m_anchorPointXyd );
m_labelPointPickEventHandler = std::make_shared<RicVec3dPickEventHandler>( &m_labelPointXyd, 0.1 );
@@ -71,7 +71,6 @@ RimCellFilter::RimCellFilter( FilterDefinitionType defType )
m_nameProxy.registerGetMethod( this, &RimCellFilter::fullName );
m_nameProxy.uiCapability()->setUiReadOnly( true );
m_nameProxy.uiCapability()->setUiHidden( true );
m_nameProxy.xmlCapability()->disableIO();
}
//--------------------------------------------------------------------------------------------------
@@ -88,13 +88,11 @@ RimEclipsePropertyFilter::RimEclipsePropertyFilter()
m_integerLowerBound.uiCapability()->setUiEditorTypeName( caf::PdmUiSliderEditor::uiEditorTypeName() );
m_integerLowerBound.registerGetMethod( this, &RimEclipsePropertyFilter::lowerBound );
m_integerLowerBound.registerSetMethod( this, &RimEclipsePropertyFilter::setLowerBound );
m_integerLowerBound.xmlCapability()->disableIO();
CAF_PDM_InitFieldNoDefault( &m_integerUpperBound, "IntegerUpperBound", "Max" );
m_integerUpperBound.uiCapability()->setUiEditorTypeName( caf::PdmUiSliderEditor::uiEditorTypeName() );
m_integerUpperBound.registerGetMethod( this, &RimEclipsePropertyFilter::upperBound );
m_integerUpperBound.registerSetMethod( this, &RimEclipsePropertyFilter::setUpperBound );
m_integerUpperBound.xmlCapability()->disableIO();
CAF_PDM_InitField( &m_useCategorySelection, "CategorySelection", false, "Category Selection" );
m_upperBound.uiCapability()->setUiEditorTypeName( caf::PdmUiDoubleSliderEditor::uiEditorTypeName() );
@@ -122,7 +122,6 @@ RimFracture::RimFracture()
CAF_PDM_InitFieldNoDefault( &m_uiAnchorPosition, "ui_positionAtWellpath", "Fracture Position" );
m_uiAnchorPosition.registerGetMethod( this, &RimFracture::fracturePositionForUi );
m_uiAnchorPosition.uiCapability()->setUiReadOnly( true );
m_uiAnchorPosition.xmlCapability()->disableIO();
CAF_PDM_InitField( &m_azimuth, "Azimuth", 0.0, "Azimuth" );
m_azimuth.uiCapability()->setUiEditorTypeName( caf::PdmUiDoubleSliderEditor::uiEditorTypeName() );
@@ -146,12 +145,10 @@ RimFracture::RimFracture()
CAF_PDM_InitFieldNoDefault( &m_uiWellPathAzimuth, "WellPathAzimuth", "Well Path Azimuth" );
m_uiWellPathAzimuth.registerGetMethod( this, &RimFracture::wellAzimuthAtFracturePositionText );
m_uiWellPathAzimuth.uiCapability()->setUiReadOnly( true );
m_uiWellPathAzimuth.xmlCapability()->disableIO();
CAF_PDM_InitFieldNoDefault( &m_uiWellFractureAzimuthDiff, "WellFractureAzimuthDiff", "Azimuth Difference Between\nFracture and Well" );
m_uiWellFractureAzimuthDiff.registerGetMethod( this, &RimFracture::wellFractureAzimuthDiffText );
m_uiWellFractureAzimuthDiff.uiCapability()->setUiReadOnly( true );
m_uiWellFractureAzimuthDiff.xmlCapability()->disableIO();
CAF_PDM_InitField( &m_wellFractureAzimuthAngleWarning,
"WellFractureAzimithAngleWarning",
@@ -119,7 +119,6 @@ RimFractureTemplate::RimFractureTemplate()
CAF_PDM_InitFieldNoDefault( &m_nameAndUnit, "NameAndUnit", "NameAndUnit" );
m_nameAndUnit.registerGetMethod( this, &RimFractureTemplate::nameAndUnit );
m_nameAndUnit.uiCapability()->setUiHidden( true );
m_nameAndUnit.xmlCapability()->disableIO();
CAF_PDM_InitField( &m_fractureTemplateUnit,
"UnitSystem",
@@ -192,14 +191,12 @@ RimFractureTemplate::RimFractureTemplate()
m_dFactorDisplayField.registerGetMethod( this, &RimFractureTemplate::dFactorForTemplate );
m_dFactorDisplayField.uiCapability()->setUiEditorTypeName( caf::PdmUiDoubleValueEditor::uiEditorTypeName() );
m_dFactorDisplayField.uiCapability()->setUiReadOnly( true );
m_dFactorDisplayField.xmlCapability()->disableIO();
CAF_PDM_InitFieldNoDefault( &m_dFactorSummaryText, "dFactorSummaryText", "D Factor Summary" );
m_dFactorSummaryText.registerGetMethod( this, &RimFractureTemplate::dFactorSummary );
m_dFactorSummaryText.uiCapability()->setUiReadOnly( true );
m_dFactorSummaryText.uiCapability()->setUiEditorTypeName( caf::PdmUiTextEditor::uiEditorTypeName() );
m_dFactorSummaryText.uiCapability()->setUiLabelPosition( caf::PdmUiItemInfo::LabelPosition::TOP );
m_dFactorSummaryText.xmlCapability()->disableIO();
CAF_PDM_InitScriptableField( &m_heightScaleFactor, "HeightScaleFactor", 1.0, "Height" );
CAF_PDM_InitScriptableField( &m_halfLengthScaleFactor, "WidthScaleFactor", 1.0, "Half Length" );
@@ -66,7 +66,6 @@ RimEnsembleFileSet::RimEnsembleFileSet()
CAF_PDM_InitFieldNoDefault( &m_ensembleInfo, "EnsembleInfo", "Info" );
m_ensembleInfo.registerGetMethod( this, &RimEnsembleFileSet::ensembleInfo );
m_ensembleInfo.uiCapability()->setUiReadOnly( true );
m_ensembleInfo.xmlCapability()->disableIO();
m_ensembleInfo.uiCapability()->setUiEditorTypeName( caf::PdmUiTextEditor::uiEditorTypeName() );
CAF_PDM_InitFieldNoDefault( &m_groupingMode, "GroupingMode", "Grouping Mode" );
@@ -47,7 +47,6 @@ RimWellRftEnsembleCurveSet::RimWellRftEnsembleCurveSet()
CAF_PDM_InitFieldNoDefault( &m_ensembleName, "NameAndUnit", "NameAndUnit" );
m_ensembleName.registerGetMethod( this, &RimWellRftEnsembleCurveSet::ensembleName );
m_ensembleName.uiCapability()->setUiHidden( true );
m_ensembleName.xmlCapability()->disableIO();
CAF_PDM_InitFieldNoDefault( &m_eclipseCase, "EclipseResultCase", "Eclipse Result Case" );
m_eclipseCase.uiCapability()->setUiHidden( true );
@@ -68,7 +68,6 @@ RimParameterGroup::RimParameterGroup()
m_labelProxy.registerGetMethod( this, &RimParameterGroup::labelOrName );
m_labelProxy.uiCapability()->setUiReadOnly( true );
m_labelProxy.uiCapability()->setUiHidden( true );
m_labelProxy.xmlCapability()->disableIO();
CAF_PDM_InitFieldNoDefault( &m_lists, "ParameterLists", "Parameter Lists" );
m_lists.uiCapability()->setUiHidden( true );
@@ -40,11 +40,9 @@ RimFieldQuickAccess::RimFieldQuickAccess()
CAF_PDM_InitFieldNoDefault( &m_selectObjectButton, "SelectObject", "...", ":/Select.svg", "Select Object in Property Editor" );
m_selectObjectButton.uiCapability()->setUiEditorTypeName( caf::PdmUiToolButtonCallbackEditor::uiEditorTypeName() );
m_selectObjectButton.xmlCapability()->disableIO();
CAF_PDM_InitFieldNoDefault( &m_removeItemButton, "RemoveItem", "...", ":/pinned-remove.svg", "Remove Quick Access" );
m_removeItemButton.uiCapability()->setUiEditorTypeName( caf::PdmUiToolButtonCallbackEditor::uiEditorTypeName() );
m_removeItemButton.xmlCapability()->disableIO();
m_markedForRemoval = false;
}
@@ -86,7 +86,6 @@ Rim2dIntersectionView::Rim2dIntersectionView()
CAF_PDM_InitField( &m_showAxisLines, "ShowAxisLines", false, "Show Axis Lines" );
CAF_PDM_InitFieldNoDefault( &m_nameProxy, "NameProxy", "Name" );
m_nameProxy.xmlCapability()->disableIO();
m_nameProxy.registerGetMethod( this, &Rim2dIntersectionView::getName );
m_nameProxy.registerSetMethod( this, &Rim2dIntersectionView::setName );
@@ -46,7 +46,6 @@ RimColorLegendItem::RimColorLegendItem()
CAF_PDM_InitFieldNoDefault( &m_nameProxy, "NameProxy", "Name Proxy" );
m_nameProxy.registerGetMethod( this, &RimColorLegendItem::itemName );
m_nameProxy.uiCapability()->setUiHidden( true );
m_nameProxy.xmlCapability()->disableIO();
setDeletable( true );
}
@@ -209,7 +209,6 @@ RimEclipseView::RimEclipseView()
CAF_PDM_InitField( &m_showInvalidCells, "ShowInvalidCells", false, "Show Invalid Cells" );
CAF_PDM_InitScriptableFieldNoDefault( &m_cellResultData, "CellResultData", "", "", "", "Current Eclipse Cell Result" );
m_cellResultData.xmlCapability()->disableIO();
m_cellResultData.registerGetMethod( this, &RimEclipseView::currentCellResultData );
m_cellResultData.registerSetMethod( this, &RimEclipseView::setCurrentCellResultData );
@@ -111,7 +111,6 @@ RimGridCalculation::RimGridCalculation()
CAF_PDM_InitFieldNoDefault( &m_nonVisibleResultText, "NonVisibleResultText", "" );
m_nonVisibleResultText.registerGetMethod( this, &RimGridCalculation::nonVisibleResultAddressText );
m_nonVisibleResultText.uiCapability()->setUiReadOnly( true );
m_nonVisibleResultText.xmlCapability()->disableIO();
CAF_PDM_InitFieldNoDefault( &m_selectedTimeSteps, "SelectedTimeSteps", "Time Step Selection" );
m_selectedTimeSteps.uiCapability()->setUiEditorTypeName( caf::PdmUiTreeSelectionEditor::uiEditorTypeName() );
@@ -38,7 +38,6 @@ RimNameConfig::RimNameConfig( const QString& customName )
CAF_PDM_InitFieldNoDefault( &m_customName, "CustomCurveName", "Custom Name Part" );
CAF_PDM_InitFieldNoDefault( &m_autoName, "AutoCurveName", "Full Name" );
m_autoName.registerGetMethod( this, &RimNameConfig::autoName );
m_autoName.xmlCapability()->disableIO();
m_autoName.uiCapability()->setUiReadOnly( true );
m_customName = customName;
@@ -39,7 +39,6 @@ RimObservedFmuRftData::RimObservedFmuRftData()
m_directoryPath_OBSOLETE.xmlCapability()->setIOWritable( false );
CAF_PDM_InitFieldNoDefault( &m_wells, "Wells", "Wells" );
m_wells.xmlCapability()->disableIO();
m_wells.uiCapability()->setUiReadOnly( true );
m_wells.registerGetMethod( this, &RimObservedFmuRftData::wells );
}
@@ -35,7 +35,6 @@ RimPressureDepthData::RimPressureDepthData()
m_filePath.uiCapability()->setUiReadOnly( true );
CAF_PDM_InitFieldNoDefault( &m_wells, "Wells", "Wells" );
m_wells.xmlCapability()->disableIO();
m_wells.uiCapability()->setUiReadOnly( true );
m_wells.registerGetMethod( this, &RimPressureDepthData::wellNames );
@@ -32,7 +32,6 @@ RimUserDefinedCalculationVariable::RimUserDefinedCalculationVariable()
CAF_PDM_InitFieldNoDefault( &m_addressUi, "AddressUi", "Address" );
m_addressUi.registerGetMethod( this, &RimUserDefinedCalculationVariable::displayString );
m_addressUi.xmlCapability()->disableIO();
m_addressUi.uiCapability()->setUiReadOnly( true );
}
@@ -72,7 +72,6 @@ RimSeismicDifferenceData::RimSeismicDifferenceData()
m_nameProxy.registerGetMethod( this, &RimSeismicDifferenceData::fullName );
m_nameProxy.uiCapability()->setUiReadOnly( true );
m_nameProxy.uiCapability()->setUiHidden( true );
m_nameProxy.xmlCapability()->disableIO();
CAF_PDM_InitFieldNoDefault( &m_seismicData1, "SeismicData1", "Seismic Data 1" );
CAF_PDM_InitFieldNoDefault( &m_seismicData2, "SeismicData2", "Seismic Data 2" );
@@ -77,7 +77,6 @@ RimSeismicSection::RimSeismicSection()
m_nameProxy.registerGetMethod( this, &RimSeismicSection::fullName );
m_nameProxy.uiCapability()->setUiReadOnly( true );
m_nameProxy.uiCapability()->setUiHidden( true );
m_nameProxy.xmlCapability()->disableIO();
CAF_PDM_InitFieldNoDefault( &m_type, "Type", "Type" );
@@ -183,7 +183,6 @@ RimStimPlanModel::RimStimPlanModel()
CAF_PDM_InitFieldNoDefault( &m_anchorPositionForUi, "AnchorPositionForUi", "Anchor Position" );
m_anchorPositionForUi.registerGetMethod( this, &RimStimPlanModel::anchorPositionForUi );
m_anchorPositionForUi.uiCapability()->setUiReadOnly( true );
m_anchorPositionForUi.xmlCapability()->disableIO();
CAF_PDM_InitScriptableFieldNoDefault( &m_thicknessDirection, "ThicknessDirection", "Thickness Direction" );
m_thicknessDirection.uiCapability()->setUiReadOnly( true );
@@ -247,7 +247,6 @@ RimEnsembleCurveSet::RimEnsembleCurveSet()
CAF_PDM_InitFieldNoDefault( &m_autoGeneratedName, "AutoGeneratedName", "Curve Set Name" );
m_autoGeneratedName.registerGetMethod( this, &RimEnsembleCurveSet::createAutoName );
m_autoGeneratedName.uiCapability()->setUiReadOnly( true );
m_autoGeneratedName.xmlCapability()->disableIO();
CAF_PDM_InitField( &m_isUsingAutoName, "AutoName", true, "Auto Name" );
CAF_PDM_InitFieldNoDefault( &m_summaryAddressNameTools, "SummaryAddressNameTools", "SummaryAddressNameTools" );
@@ -107,7 +107,6 @@ RimSummaryEnsemble::RimSummaryEnsemble()
m_ensembleDescription.registerGetMethod( this, &RimSummaryEnsemble::ensembleDescription );
m_ensembleDescription.uiCapability()->setUiLabelPosition( caf::PdmUiItemInfo::LabelPosition::TOP );
m_ensembleDescription.uiCapability()->setUiEditorTypeName( caf::PdmUiTextEditor::uiEditorTypeName() );
m_ensembleDescription.xmlCapability()->disableIO();
}
//--------------------------------------------------------------------------------------------------
@@ -72,7 +72,6 @@ RimSurface::RimSurface()
m_nameProxy.registerGetMethod( this, &RimSurface::fullName );
m_nameProxy.uiCapability()->setUiReadOnly( true );
m_nameProxy.uiCapability()->setUiHidden( true );
m_nameProxy.xmlCapability()->disableIO();
setDeletable( true );
}
@@ -47,7 +47,6 @@ RimSurfaceInViewCollection::RimSurfaceInViewCollection()
CAF_PDM_InitFieldNoDefault( &m_collectionName, "CollectionName", "Name" );
m_collectionName.registerGetMethod( this, &RimSurfaceInViewCollection::name );
m_collectionName.uiCapability()->setUiReadOnly( true );
m_collectionName.xmlCapability()->disableIO();
CAF_PDM_InitFieldNoDefault( &m_collectionsInView, "SurfacesInViewFieldCollections", "SurfacesInViewFieldCollections" );
@@ -125,7 +125,6 @@ RimEnsembleWellLogCurveSet::RimEnsembleWellLogCurveSet()
CAF_PDM_InitFieldNoDefault( &m_autoGeneratedName, "AutoGeneratedName", "Curve Set Name" );
m_autoGeneratedName.registerGetMethod( this, &RimEnsembleWellLogCurveSet::createAutoName );
m_autoGeneratedName.uiCapability()->setUiReadOnly( true );
m_autoGeneratedName.xmlCapability()->disableIO();
CAF_PDM_InitField( &m_isUsingAutoName, "AutoName", true, "Auto Name" );
@@ -86,7 +86,6 @@ RimWellIASettings::RimWellIASettings()
m_nameProxy.registerGetMethod( this, &RimWellIASettings::fullName );
m_nameProxy.uiCapability()->setUiReadOnly( true );
m_nameProxy.uiCapability()->setUiHidden( true );
m_nameProxy.xmlCapability()->disableIO();
CAF_PDM_InitField( &m_showBox, "showBox", false, "Show model box" );
@@ -1,6 +1,7 @@
#pragma once
#include "cafInternalPdmXmlFieldReaderWriter.h"
#include "cafPdmProxyValueField.h"
#include "cafPdmXmlFieldHandle.h"
#include <typeinfo>
@@ -195,6 +196,41 @@ private:
FieldType* m_field;
};
template <typename DataType>
class PdmFieldXmlCap<PdmProxyValueField<DataType>> : public PdmXmlFieldHandle
{
typedef PdmProxyValueField<DataType> FieldType;
public:
PdmFieldXmlCap( FieldType* field, bool giveOwnership )
: PdmXmlFieldHandle( field, giveOwnership )
{
m_field = field;
m_dataTypeName = QString( "%1" ).arg( typeid( DataType ).name() );
// Proxy fields should not be serialized by default
// If needed, this can be overridden by the user by enabling IO on the field:
//
// m_proxyDoubleField.xmlCapability()->setIOWritable( true );
// m_proxyDoubleField.xmlCapability()->setIOReadable( true );
disableIO();
}
// Xml Serializing
public:
std::vector<QString> readFieldData( QXmlStreamReader& xmlStream,
PdmObjectFactory* objectFactory,
const std::vector<caf::PdmDeprecation>& deprecations = {} ) 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 )
{
@@ -533,4 +533,53 @@ bool caf::PdmFieldXmlCap<caf::PdmField<std::vector<DataType>>>::resolveReference
return true;
}
//==================================================================================================
/// XML Implementation for PdmFieldXmlCap<PdmProxyValueField<>> methods
///
//==================================================================================================
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
template <typename DataType>
bool caf::PdmFieldXmlCap<caf::PdmProxyValueField<DataType>>::isVectorField() const
{
return m_field->isStreamingField();
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
template <typename DataType>
std::vector<QString>
caf::PdmFieldXmlCap<caf::PdmProxyValueField<DataType>>::readFieldData( QXmlStreamReader& xmlStream,
PdmObjectFactory*,
const std::vector<caf::PdmDeprecation>& )
{
this->assertValid();
DataType value;
PdmFieldReader<DataType>::readFieldData( value, xmlStream, m_field );
m_field->setValue( value );
return {};
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
template <typename DataType>
void caf::PdmFieldXmlCap<caf::PdmProxyValueField<DataType>>::writeFieldData( QXmlStreamWriter& xmlStream ) const
{
this->assertValid();
PdmFieldWriter<DataType>::writeFieldData( m_field->value(), xmlStream );
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
template <typename DataType>
bool caf::PdmFieldXmlCap<caf::PdmProxyValueField<DataType>>::resolveReferences()
{
return true;
}
} // End namespace caf
@@ -37,6 +37,8 @@ public:
CAF_PDM_XML_InitField( &m_proxyDoubleField, "BigNumber" );
m_proxyDoubleField.registerSetMethod( this, &DemoPdmObject::setDoubleMember );
m_proxyDoubleField.registerGetMethod( this, &DemoPdmObject::doubleMember );
m_proxyDoubleField.xmlCapability()->setIOWritable( true );
m_proxyDoubleField.xmlCapability()->setIOReadable( true );
CAF_PDM_XML_InitField( &m_proxyEnumField, "AppEnum" );
m_proxyEnumField.registerSetMethod( this, &DemoPdmObject::setEnumMember );
@@ -587,3 +589,20 @@ TEST( BaseTest, XmlImportClamping )
EXPECT_DOUBLE_EQ( -123.456, obj->m_unclampedField() );
}
}
//--------------------------------------------------------------------------------------------------
/// Test that proxy fields have IO disabled by default
//--------------------------------------------------------------------------------------------------
TEST( BaseTest, ProxyFieldIODisabled )
{
// Test with SimpleObj which has default proxy field IO behavior (disabled)
auto simpleObj = std::make_unique<SimpleObj>();
EXPECT_FALSE( simpleObj->m_proxyDouble.xmlCapability()->isIOReadable() );
EXPECT_FALSE( simpleObj->m_proxyDouble.xmlCapability()->isIOWritable() );
// Regular fields should still have IO enabled
EXPECT_TRUE( simpleObj->m_position.xmlCapability()->isIOReadable() );
EXPECT_TRUE( simpleObj->m_position.xmlCapability()->isIOWritable() );
// Note: DemoPdmObject explicitly enables IO for its proxy field for the ChildArrayFieldSerializing test
}
@@ -75,6 +75,9 @@ public:
addUiCapabilityToField( &m_proxyDouble );
addXmlCapabilityToField( &m_proxyDouble );
CAF_PDM_InitFieldNoDefault( &m_proxyDouble, "ProxyDouble", "ProxyDouble" );
m_proxyDouble.xmlCapability()->setIOWritable( true );
m_proxyDouble.xmlCapability()->setIOReadable( true );
m_proxyDouble.xmlCapability()->setCopyable( true );
#endif
}