Refactor: migrate five collections to caf::PdmObjectCollection<T>

RimEnsembleFileSetCollection, RimJobCollection, RimQuickAccessCollection,
RimRefinementRegionCollection and RimFractureTemplateCollection now inherit
from the templated caf::PdmObjectCollection<T> base, reusing the shared
add/insert/delete/items plumbing introduced for RimValveTemplateCollection.

XML field keywords are preserved on every collection so existing project
files continue to load.
This commit is contained in:
Kristian Bendiksen
2026-05-11 13:42:13 +02:00
parent 8f4008db0f
commit ddd413cb0b
10 changed files with 59 additions and 96 deletions
@@ -50,7 +50,7 @@ RimFractureTemplateCollection::RimFractureTemplateCollection()
caf::AppEnum<RiaDefines::EclipseUnitSystem>( RiaDefines::EclipseUnitSystem::UNITS_METRIC ),
"Default unit system for fracture templates" );
CAF_PDM_InitFieldNoDefault( &m_fractureDefinitions, "FractureDefinitions", "" );
CAF_PDM_InitFieldNoDefault( &m_items, "FractureDefinitions", "" );
CAF_PDM_InitField( &m_nextValidFractureTemplateId_OBSOLETE, "NextValidFractureTemplateId", 0, "" );
m_nextValidFractureTemplateId_OBSOLETE.xmlCapability()->setIOWritable( false );
@@ -62,7 +62,7 @@ RimFractureTemplateCollection::RimFractureTemplateCollection()
//--------------------------------------------------------------------------------------------------
RimFractureTemplate* RimFractureTemplateCollection::fractureTemplate( int id ) const
{
for ( const auto& templ : m_fractureDefinitions )
for ( const auto& templ : m_items )
{
if ( templ->id() == id ) return templ;
}
@@ -75,7 +75,7 @@ RimFractureTemplate* RimFractureTemplateCollection::fractureTemplate( int id ) c
std::vector<RimFractureTemplate*> RimFractureTemplateCollection::fractureTemplates() const
{
std::vector<RimFractureTemplate*> templates;
for ( auto& templ : m_fractureDefinitions )
for ( auto& templ : m_items )
{
templates.push_back( templ );
}
@@ -104,7 +104,7 @@ RimEllipseFractureTemplate* RimFractureTemplateCollection::addDefaultEllipseTemp
void RimFractureTemplateCollection::addFractureTemplate( RimFractureTemplate* templ )
{
templ->setId( nextFractureTemplateId() );
m_fractureDefinitions.push_back( templ );
addItem( templ );
}
//--------------------------------------------------------------------------------------------------
@@ -134,7 +134,7 @@ void RimFractureTemplateCollection::setDefaultUnitSystemBasedOnLoadedCases()
//--------------------------------------------------------------------------------------------------
RimFractureTemplate* RimFractureTemplateCollection::firstFractureOfUnit( RiaDefines::EclipseUnitSystem unitSet ) const
{
for ( RimFractureTemplate* f : m_fractureDefinitions() )
for ( RimFractureTemplate* f : m_items() )
{
if ( f->fractureTemplateUnit() == unitSet )
{
@@ -152,7 +152,7 @@ std::vector<std::pair<QString, QString>> RimFractureTemplateCollection::resultNa
{
std::set<std::pair<QString, QString>> nameSet;
for ( const RimFractureTemplate* f : m_fractureDefinitions() )
for ( const RimFractureTemplate* f : m_items() )
{
std::vector<std::pair<QString, QString>> namesAndUnits = f->uiResultNamesWithUnit();
@@ -180,7 +180,7 @@ void RimFractureTemplateCollection::computeMinMax( const QString& uiResultName,
MinMaxAccumulator minMaxAccumulator;
PosNegAccumulator posNegAccumulator;
for ( const RimFractureTemplate* f : m_fractureDefinitions() )
for ( const RimFractureTemplate* f : m_items() )
{
if ( f )
{
@@ -203,7 +203,7 @@ void RimFractureTemplateCollection::createAndAssignTemplateCopyForNonMatchingUni
std::vector<RimFractureTemplate*> templatesToBeAdded;
for ( RimFractureTemplate* fractureTemplate : m_fractureDefinitions() )
for ( RimFractureTemplate* fractureTemplate : m_items() )
{
if ( fractureTemplate )
{
@@ -249,7 +249,7 @@ void RimFractureTemplateCollection::createAndAssignTemplateCopyForNonMatchingUni
for ( auto templateWithMatchingUnit : templatesToBeAdded )
{
m_fractureDefinitions.push_back( templateWithMatchingUnit );
addItem( templateWithMatchingUnit );
}
}
@@ -258,7 +258,7 @@ void RimFractureTemplateCollection::createAndAssignTemplateCopyForNonMatchingUni
//--------------------------------------------------------------------------------------------------
void RimFractureTemplateCollection::loadAndUpdateData()
{
for ( RimFractureTemplate* f : m_fractureDefinitions() )
for ( RimFractureTemplate* f : m_items() )
{
RimMeshFractureTemplate* stimPlanFracture = dynamic_cast<RimMeshFractureTemplate*>( f );
if ( stimPlanFracture )
@@ -280,7 +280,7 @@ void RimFractureTemplateCollection::loadAndUpdateData()
void RimFractureTemplateCollection::initAfterRead()
{
// Assign template id if not already assigned
for ( auto& templ : m_fractureDefinitions )
for ( auto& templ : m_items )
{
if ( templ->id() < 0 ) templ->setId( nextFractureTemplateId() );
}
@@ -292,7 +292,7 @@ void RimFractureTemplateCollection::initAfterRead()
int RimFractureTemplateCollection::nextFractureTemplateId()
{
int nextValidId = 0;
for ( const auto& templ : m_fractureDefinitions )
for ( const auto& templ : m_items )
{
nextValidId = std::max( nextValidId, templ->id() + 1 );
}
@@ -20,18 +20,18 @@
#include "RiaDefines.h"
#include "cafPdmChildArrayField.h"
#include "RimFractureTemplate.h"
#include "cafPdmField.h"
#include "cafPdmObject.h"
#include "cafPdmObjectCollection.h"
class RimEllipseFractureTemplate;
class RimFractureTemplate;
//==================================================================================================
///
///
//==================================================================================================
class RimFractureTemplateCollection : public caf::PdmObject
class RimFractureTemplateCollection : public caf::PdmObjectCollection<RimFractureTemplate>
{
CAF_PDM_HEADER_INIT;
@@ -67,7 +67,6 @@ protected:
private:
int nextFractureTemplateId();
caf::PdmChildArrayField<RimFractureTemplate*> m_fractureDefinitions;
caf::PdmField<caf::AppEnum<RiaDefines::EclipseUnitSystem>> m_defaultUnitsForFracTemplates;
caf::PdmField<int> m_nextValidFractureTemplateId_OBSOLETE;
};
@@ -18,7 +18,6 @@
#include "RimEnsembleFileSetCollection.h"
#include "RimEnsembleFileSet.h"
#include "RimTools.h"
#include "cafCmdFeatureMenuBuilder.h"
@@ -34,8 +33,8 @@ RimEnsembleFileSetCollection::RimEnsembleFileSetCollection()
{
CAF_PDM_InitObject( "Disc Data", ":/SummaryEnsemble.svg", "", "" );
CAF_PDM_InitFieldNoDefault( &m_fileSets, "FileSets", "File Sets", "", "", "" );
m_fileSets.uiCapability()->setUiHidden( true );
CAF_PDM_InitFieldNoDefault( &m_items, "FileSets", "File Sets", "", "", "" );
m_items.uiCapability()->setUiHidden( true );
}
//--------------------------------------------------------------------------------------------------
@@ -43,7 +42,7 @@ RimEnsembleFileSetCollection::RimEnsembleFileSetCollection()
//--------------------------------------------------------------------------------------------------
void RimEnsembleFileSetCollection::addFileSet( RimEnsembleFileSet* fileSet )
{
if ( fileSet ) m_fileSets.push_back( fileSet );
addItem( fileSet );
}
//--------------------------------------------------------------------------------------------------
@@ -51,7 +50,7 @@ void RimEnsembleFileSetCollection::addFileSet( RimEnsembleFileSet* fileSet )
//--------------------------------------------------------------------------------------------------
std::vector<RimEnsembleFileSet*> RimEnsembleFileSetCollection::fileSets() const
{
return m_fileSets.childrenByType();
return items();
}
//--------------------------------------------------------------------------------------------------
@@ -59,7 +58,7 @@ std::vector<RimEnsembleFileSet*> RimEnsembleFileSetCollection::fileSets() const
//--------------------------------------------------------------------------------------------------
void RimEnsembleFileSetCollection::deleteAllFileSets()
{
m_fileSets.deleteChildren();
deleteAllItems();
}
//--------------------------------------------------------------------------------------------------
@@ -73,10 +72,7 @@ void RimEnsembleFileSetCollection::deleteFileSetIfPossible( RimEnsembleFileSet*
auto connectedObjects = fileSet->objectsWithReferringPtrFields();
if ( connectedObjects.empty() )
{
m_fileSets.removeChild( fileSet );
delete fileSet;
updateConnectedEditors();
deleteItem( fileSet );
}
}
}
@@ -103,7 +99,7 @@ void RimEnsembleFileSetCollection::updateFilePathsFromProjectPath( const QString
QList<caf::PdmOptionItemInfo> RimEnsembleFileSetCollection::ensembleFileSetOptions() const
{
QList<caf::PdmOptionItemInfo> options;
for ( const auto& fileset : m_fileSets )
for ( const auto& fileset : m_items )
{
options.push_back( caf::PdmOptionItemInfo( fileset->name(), fileset, false, fileset->uiIconProvider() ) );
}
@@ -18,18 +18,16 @@
#pragma once
#include "cafPdmField.h"
#include "cafPdmObject.h"
#include "cafPdmPointer.h"
#include "RimEnsembleFileSet.h"
class RimEnsembleFileSet;
#include "cafPdmObjectCollection.h"
//==================================================================================================
///
/// Class to manage a collection of ensemble filesets
///
//==================================================================================================
class RimEnsembleFileSetCollection : public caf::PdmObject
class RimEnsembleFileSetCollection : public caf::PdmObjectCollection<RimEnsembleFileSet>
{
CAF_PDM_HEADER_INIT;
@@ -50,7 +48,4 @@ public:
private:
void appendMenuItems( caf::CmdFeatureMenuBuilder& menuBuilder ) const override;
void initAfterRead() override;
private:
caf::PdmChildArrayField<RimEnsembleFileSet*> m_fileSets;
};
@@ -21,7 +21,6 @@
#include "RiaLogging.h"
#include "Rim3dView.h"
#include "RimGenericJob.h"
#include "RimGridView.h"
#include "RimProject.h"
@@ -36,7 +35,7 @@ RimJobCollection::RimJobCollection()
{
CAF_PDM_InitObject( "Jobs", ":/gear_icon_16x16.png" );
CAF_PDM_InitFieldNoDefault( &m_jobs, "Jobs", "Jobs" );
CAF_PDM_InitFieldNoDefault( &m_items, "Jobs", "Jobs" );
setCustomContextMenuEnabled( true );
setDeletable( false );
@@ -54,7 +53,7 @@ RimJobCollection::~RimJobCollection()
//--------------------------------------------------------------------------------------------------
std::vector<RimGenericJob*> RimJobCollection::jobs() const
{
return m_jobs.childrenByType();
return items();
}
//--------------------------------------------------------------------------------------------------
@@ -75,20 +74,12 @@ std::vector<RimGenericJob*> RimJobCollection::jobsMatchingKeyValue( const QStrin
return foundJobs;
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
bool RimJobCollection::isEmpty()
{
return !m_jobs.hasChildren();
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
void RimJobCollection::addNewJob( RimGenericJob* newJob )
{
m_jobs.push_back( newJob );
addItem( newJob );
updateAllRequiredEditors();
}
@@ -119,7 +110,7 @@ void RimJobCollection::deleteAllJobs()
RiaLogging::info( "Stopped running job '" + job->name().toStdString() );
}
}
m_jobs.deleteChildren();
deleteAllItems();
}
//--------------------------------------------------------------------------------------------------
@@ -17,16 +17,13 @@
/////////////////////////////////////////////////////////////////////////////////
#pragma once
#include "cafPdmField.h"
#include "RimGenericJob.h"
#include "cafPdmChildArrayField.h"
#include "cafPdmObject.h"
#include "cafPdmObjectCollection.h"
#include <QString>
class RimGenericJob;
class RimJobCollection : public caf::PdmObject
class RimJobCollection : public caf::PdmObjectCollection<RimGenericJob>
{
CAF_PDM_HEADER_INIT;
@@ -36,8 +33,6 @@ public:
void addNewJob( RimGenericJob* newJob );
bool isEmpty();
int numberOfRunningJobs() const;
void deleteAllJobs();
@@ -48,7 +43,4 @@ public:
protected:
void appendMenuItems( caf::CmdFeatureMenuBuilder& menuBuilder ) const override;
private:
caf::PdmChildArrayField<RimGenericJob*> m_jobs;
};
@@ -38,7 +38,7 @@ RimQuickAccessCollection::RimQuickAccessCollection()
{
CAF_PDM_InitObject( "Field Reference Collection" );
CAF_PDM_InitFieldNoDefault( &m_fieldQuickAccesGroups, "FieldReferencesGroup", "Field References Group" );
CAF_PDM_InitFieldNoDefault( &m_items, "FieldReferencesGroup", "Field References Group" );
}
//--------------------------------------------------------------------------------------------------
@@ -134,7 +134,7 @@ void RimQuickAccessCollection::defineUiOrdering( QString uiConfigName, caf::PdmU
std::vector<RimFieldQuickAccessGroup*> groupsForView;
for ( auto group : m_fieldQuickAccesGroups )
for ( auto group : m_items )
{
if ( group->ownerView() == activeView )
{
@@ -177,7 +177,7 @@ void RimQuickAccessCollection::deleteMarkedObjects()
{
std::set<RimFieldQuickAccess*> toBeDeleted;
for ( auto group : m_fieldQuickAccesGroups.childrenByType() )
for ( auto group : items() )
{
for ( auto quickAccess : group->fieldQuickAccesses() )
{
@@ -190,7 +190,7 @@ void RimQuickAccessCollection::deleteMarkedObjects()
for ( auto quickAccess : toBeDeleted )
{
for ( auto group : m_fieldQuickAccesGroups )
for ( auto group : m_items )
{
group->removeFieldQuickAccess( quickAccess );
}
@@ -202,7 +202,7 @@ void RimQuickAccessCollection::deleteMarkedObjects()
// Delete groups with no quick access fields
{
std::set<RimFieldQuickAccessGroup*> toBeDeleted;
for ( auto group : m_fieldQuickAccesGroups.childrenByType() )
for ( auto group : items() )
{
if ( group->fieldQuickAccesses().empty() )
{
@@ -212,8 +212,7 @@ void RimQuickAccessCollection::deleteMarkedObjects()
for ( auto group : toBeDeleted )
{
m_fieldQuickAccesGroups.removeChild( group );
delete group;
deleteItem( group );
}
}
}
@@ -228,7 +227,7 @@ RimFieldQuickAccessGroup* RimQuickAccessCollection::findOrCreateGroup( caf::PdmO
auto parentView = object->firstAncestorOrThisOfType<RimGridView>();
if ( !parentView ) return nullptr;
for ( auto group : m_fieldQuickAccesGroups )
for ( auto group : m_items )
{
if ( !group ) continue;
@@ -244,7 +243,7 @@ RimFieldQuickAccessGroup* RimQuickAccessCollection::findOrCreateGroup( caf::PdmO
auto group = new RimFieldQuickAccessGroup();
group->setName( groupName );
group->setOwnerView( parentView );
m_fieldQuickAccesGroups.push_back( group );
addItem( group );
return group;
}
@@ -18,20 +18,18 @@
#pragma once
#include "cafPdmChildArrayField.h"
#include "cafPdmField.h"
#include "cafPdmObject.h"
#include "cafPdmPtrArrayField.h"
#include "RimFieldQuickAccessGroup.h"
#include "cafPdmObjectCollection.h"
class RimFieldQuickAccess;
class RimFieldQuickAccessGroup;
class RimFieldReference;
//==================================================================================================
///
///
//==================================================================================================
class RimQuickAccessCollection : public caf::PdmObject
class RimQuickAccessCollection : public caf::PdmObjectCollection<RimFieldQuickAccessGroup>
{
CAF_PDM_HEADER_INIT;
@@ -54,7 +52,4 @@ private:
static void updateGroupName( RimFieldQuickAccessGroup* group );
static QString defaultGroupName();
private:
caf::PdmChildArrayField<RimFieldQuickAccessGroup*> m_fieldQuickAccesGroups;
};
@@ -40,7 +40,7 @@ RimRefinementRegionCollection::RimRefinementRegionCollection()
CAF_PDM_InitField( &m_isActive, "IsActive", true, "Show Regions in 3D View" );
m_isActive.uiCapability()->setUiHidden( true );
CAF_PDM_InitFieldNoDefault( &m_regions, "Regions", "Regions" );
CAF_PDM_InitFieldNoDefault( &m_items, "Regions", "Regions" );
}
//--------------------------------------------------------------------------------------------------
@@ -56,7 +56,7 @@ bool RimRefinementRegionCollection::isActive() const
//--------------------------------------------------------------------------------------------------
bool RimRefinementRegionCollection::shouldBeVisibleInTree() const
{
return !m_regions.empty();
return !isEmpty();
}
//--------------------------------------------------------------------------------------------------
@@ -64,7 +64,7 @@ bool RimRefinementRegionCollection::shouldBeVisibleInTree() const
//--------------------------------------------------------------------------------------------------
std::vector<RimRefinementRegion*> RimRefinementRegionCollection::regions() const
{
return m_regions.childrenByType();
return items();
}
//--------------------------------------------------------------------------------------------------
@@ -73,7 +73,7 @@ std::vector<RimRefinementRegion*> RimRefinementRegionCollection::regions() const
std::vector<RimRefinementRegion*> RimRefinementRegionCollection::activeRegions() const
{
std::vector<RimRefinementRegion*> result;
for ( auto r : m_regions )
for ( auto r : m_items )
{
if ( r && r->isActive() ) result.push_back( r );
}
@@ -86,15 +86,14 @@ std::vector<RimRefinementRegion*> RimRefinementRegionCollection::activeRegions()
RimRefinementRegion* RimRefinementRegionCollection::addNewRegion( RimEclipseCase* eclipseCase )
{
auto* region = new RimRefinementRegion();
region->setRegionName( QString( "Region %1" ).arg( m_regions.size() + 1 ) );
m_regions.push_back( region );
region->setRegionName( QString( "Region %1" ).arg( count() + 1 ) );
addItem( region );
// Defaults depend on the case's grid; set after the region is inserted into the tree so
// that view/case ancestor lookups work inside the region.
region->setDefaultsFromCase( eclipseCase );
updateConnectedEditors();
// Visibility of this collection in the parent view's tree depends on m_regions being non-empty,
// Visibility of this collection in the parent view's tree depends on m_items being non-empty,
// so refresh the parent so the folder appears when the first region is added.
if ( auto* view = firstAncestorOrThisOfType<Rim3dView>() ) view->updateConnectedEditors();
return region;
@@ -105,7 +104,7 @@ RimRefinementRegion* RimRefinementRegionCollection::addNewRegion( RimEclipseCase
//--------------------------------------------------------------------------------------------------
void RimRefinementRegionCollection::addRegion( RimRefinementRegion* region )
{
if ( region ) m_regions.push_back( region );
addItem( region );
}
//--------------------------------------------------------------------------------------------------
@@ -114,9 +113,7 @@ void RimRefinementRegionCollection::addRegion( RimRefinementRegion* region )
void RimRefinementRegionCollection::removeRegion( RimRefinementRegion* region )
{
if ( !region ) return;
m_regions.removeChild( region );
delete region;
updateConnectedEditors();
deleteItem( region );
if ( auto* view = firstAncestorOrThisOfType<Rim3dView>() ) view->updateConnectedEditors();
}
@@ -18,9 +18,10 @@
#pragma once
#include "cafPdmChildArrayField.h"
#include "RimRefinementRegion.h"
#include "cafPdmField.h"
#include "cafPdmObject.h"
#include "cafPdmObjectCollection.h"
#include "cafVecIjk.h"
#include <expected>
@@ -32,7 +33,6 @@
class RigRefinement;
class RimEclipseCase;
class RimRefinementRegion;
//==================================================================================================
///
@@ -40,7 +40,7 @@ class RimRefinementRegion;
/// regions into a single RigRefinement for use in sector-model export.
///
//==================================================================================================
class RimRefinementRegionCollection : public caf::PdmObject
class RimRefinementRegionCollection : public caf::PdmObjectCollection<RimRefinementRegion>
{
CAF_PDM_HEADER_INIT;
@@ -72,6 +72,5 @@ protected:
void onChildDeleted( caf::PdmChildArrayFieldHandle* childArray, std::vector<caf::PdmObjectHandle*>& referringObjects ) override;
private:
caf::PdmField<bool> m_isActive;
caf::PdmChildArrayField<RimRefinementRegion*> m_regions;
caf::PdmField<bool> m_isActive;
};