CellFilters: Invert dependency in RimCombinedFilter

Replace the six typed addNewXxxFilter factories with a single generic
addNewFilter<T>(init) template. The combined filter no longer references
any concrete RimCellFilter subclass; callers supply the type and an init
lambda for type-specific configuration, while the combined filter handles
cycle checks, parent-case propagation, signal wiring, and host notification.

Addresses PR #13911 review feedback.
This commit is contained in:
Kristian Bendiksen committed 2026-04-29 11:40:18 +02:00
1 parent 9d5a8c28f4
commit 5989785daf
8 files changed
+42 -107

No files matched your search

@@ -26,7 +26,6 @@
#include "RimCombinedFilter.h"
#include "RimGeoMechCase.h"
#include "RimGridView.h"
#include "RimUserDefinedFilter.h"
#include "Riu3DMainWindowTools.h"
#include "cafSelectionManagerTools.h"
@@ -59,9 +58,9 @@ void RicNewCellIndexFilterFeature::onActionTriggered( bool isChecked )
if ( !combined.empty() )
{
RimCombinedFilter* target = combined.front();
if ( RimCase* srcCase = target->firstAncestorOrThisOfTypeAsserted<Rim3dView>()->ownerCase() )
if ( target->firstAncestorOrThisOfTypeAsserted<Rim3dView>()->ownerCase() )
{
RimCellIndexFilter* created = target->addNewCellIndexFilter( srcCase );
RimCellIndexFilter* created = target->addNewFilter<RimCellIndexFilter>( []( RimCellIndexFilter* ) {} );
if ( created ) Riu3DMainWindowTools::selectAsCurrentItem( created );
}
return;
@@ -75,16 +75,30 @@ void RicNewPolygonFilterFeature::onActionTriggered( bool isChecked )
RimCase* srcCase = combined->firstAncestorOrThisOfTypeAsserted<Rim3dView>()->ownerCase();
if ( !srcCase ) return;
auto addOne = [combined]( RimPolygon* polygon )
{
return combined->addNewFilter<RimPolygonFilter>(
[polygon]( RimPolygonFilter* f )
{
f->setPolygon( polygon );
f->configurePolygonEditor();
if ( polygon )
f->enableFilter( true );
else
f->enablePicking( true );
} );
};
RimPolygonFilter* lastItem = nullptr;
if ( polygons.empty() )
{
lastItem = combined->addNewPolygonFilter( srcCase, nullptr );
lastItem = addOne( nullptr );
}
else
{
for ( auto polygon : polygons )
{
lastItem = combined->addNewPolygonFilter( srcCase, polygon );
lastItem = addOne( polygon );
}
}
if ( lastItem ) Riu3DMainWindowTools::selectAsCurrentItem( lastItem );
@@ -58,7 +58,13 @@ void RicNewRangeFilterSliceFeature::onActionTriggered( bool isChecked )
RimCase* srcCase = target->firstAncestorOrThisOfTypeAsserted<Rim3dView>()->ownerCase();
if ( srcCase )
{
RimCellFilter* created = target->addNewCellRangeFilter( srcCase, 0, m_sliceDirection );
const int sliceDir = m_sliceDirection;
auto* created = target->addNewFilter<RimCellRangeFilter>(
[sliceDir]( RimCellRangeFilter* f )
{
f->setGridIndex( 0 );
f->setDefaultValues( sliceDir, -1 );
} );
if ( created ) Riu3DMainWindowTools::selectAsCurrentItem( created );
}
return;
@@ -45,7 +45,7 @@ void RicNewUserDefinedFilterFeature::onActionTriggered( bool isChecked )
RimCase* srcCase = target->firstAncestorOrThisOfTypeAsserted<Rim3dView>()->ownerCase();
if ( srcCase )
{
RimUserDefinedFilter* created = target->addNewUserDefinedFilter( srcCase );
RimUserDefinedFilter* created = target->addNewFilter<RimUserDefinedFilter>( []( RimUserDefinedFilter* ) {} );
if ( created ) Riu3DMainWindowTools::selectAsCurrentItem( created );
}
return;
@@ -45,7 +45,7 @@ void RicNewUserDefinedIndexFilterFeature::onActionTriggered( bool isChecked )
RimCase* srcCase = target->firstAncestorOrThisOfTypeAsserted<Rim3dView>()->ownerCase();
if ( srcCase )
{
auto* created = target->addNewUserDefinedIndexFilter( srcCase );
auto* created = target->addNewFilter<RimUserDefinedIndexFilter>( []( RimUserDefinedIndexFilter* ) {} );
if ( created ) Riu3DMainWindowTools::selectAsCurrentItem( created );
}
return;