CellFilters: Unify view filter nodes under RimFilterInViewCollection

This commit is contained in:
Kristian Bendiksen committed 2026-05-15 08:37:46 +02:00
1 parent b15c8d383c
commit 6edc17892f
21 files changed
+451 -64

No files matched your search

@@ -18,10 +18,15 @@
#pragma once
#include "RiaApplication.h"
#include "Rim3dView.h"
#include "RimCase.h"
#include "RimCellFilterCollection.h"
#include "RimCombinedFilter.h"
#include "RimDataFilterCollection.h"
#include "RimFilterInViewCollection.h"
#include "RimGridView.h"
#include "Riu3DMainWindowTools.h"
@@ -56,6 +61,27 @@ bool addNewFilterIfCombinedSelected( Init&& init )
return true;
}
//--------------------------------------------------------------------------------------------------
/// Resolve the per-view RimCellFilterCollection to target for a "New ... cell filter" command.
/// Looks at the current selection first (cell-filter collection or RimFilterInViewCollection facade),
/// then falls back to the active grid view. Returns nullptr if no view is active.
//--------------------------------------------------------------------------------------------------
inline RimCellFilterCollection* resolveTargetCellFilterCollection()
{
auto colls = caf::selectedObjectsByTypeStrict<RimCellFilterCollection*>();
if ( !colls.empty() ) return colls.front();
auto facades = caf::selectedObjectsByTypeStrict<RimFilterInViewCollection*>();
if ( !facades.empty() && facades.front()->cellFilters() ) return facades.front()->cellFilters();
if ( auto* view = RiaApplication::instance()->activeMainOrComparisonGridView() )
{
return view->cellFilterCollection();
}
return nullptr;
}
//--------------------------------------------------------------------------------------------------
/// If a RimDataFilterCollection (case-level) is the current selection, create a new T inside it,
/// configure it via init, and select the result. Returns true when a data-filter collection was the
@@ -57,10 +57,8 @@ void RicNewCellIndexFilterFeature::onActionTriggered( bool isChecked )
if ( RicCellFilterFeatureTools::addNewFilterIfCombinedSelected<RimCellIndexFilter>( []( RimCellIndexFilter* ) {} ) ) return;
if ( RicCellFilterFeatureTools::addNewFilterToDataCollectionIfSelected<RimCellIndexFilter>( []( RimCellIndexFilter* ) {} ) ) return;
// Find the selected Cell Filter Collection
std::vector<RimCellFilterCollection*> colls = caf::selectedObjectsByTypeStrict<RimCellFilterCollection*>();
if ( colls.empty() ) return;
RimCellFilterCollection* filtColl = colls[0];
RimCellFilterCollection* filtColl = RicCellFilterFeatureTools::resolveTargetCellFilterCollection();
if ( !filtColl ) return;
// and the case to use
if ( RimCase* sourceCase = filtColl->firstAncestorOrThisOfTypeAsserted<Rim3dView>()->ownerCase() )
@@ -18,6 +18,8 @@
#include "RicNewPolygonFilterFeature.h"
#include "RicCellFilterFeatureTools.h"
#include "RiaApplication.h"
#include "Polygons/RimPolygon.h"
@@ -119,15 +121,7 @@ void RicNewPolygonFilterFeature::onActionTriggered( bool isChecked )
return;
}
auto cellFilterCollection = caf::SelectionManager::instance()->selectedItemOfType<RimCellFilterCollection>();
if ( !cellFilterCollection )
{
RimGridView* activeView = RiaApplication::instance()->activeMainOrComparisonGridView();
if ( activeView )
{
cellFilterCollection = activeView->cellFilterCollection();
}
}
auto cellFilterCollection = RicCellFilterFeatureTools::resolveTargetCellFilterCollection();
if ( !cellFilterCollection ) return;
auto sourceCase = cellFilterCollection->firstAncestorOrThisOfTypeAsserted<Rim3dView>()->ownerCase();
@@ -61,25 +61,12 @@ void RicNewRangeFilterSliceFeature::onActionTriggered( bool isChecked )
if ( RicCellFilterFeatureTools::addNewFilterIfCombinedSelected<RimCellRangeFilter>( initSlice ) ) return;
if ( RicCellFilterFeatureTools::addNewFilterToDataCollectionIfSelected<RimCellRangeFilter>( initSlice ) ) return;
RimCellFilterCollection* filterCollection = nullptr;
RimCellFilterCollection* filterCollection = RicCellFilterFeatureTools::resolveTargetCellFilterCollection();
RimCase* sourceCase = nullptr;
std::vector<RimCellFilterCollection*> colls = caf::selectedObjectsByTypeStrict<RimCellFilterCollection*>();
if ( !colls.empty() )
if ( filterCollection )
{
filterCollection = colls.front();
sourceCase = filterCollection->firstAncestorOrThisOfTypeAsserted<Rim3dView>()->ownerCase();
}
if ( !filterCollection )
{
// Find filter collection for active view
RimGridView* viewOrComparisonView = RiaApplication::instance()->activeMainOrComparisonGridView();
if ( !viewOrComparisonView ) return;
filterCollection = viewOrComparisonView->cellFilterCollection();
sourceCase = viewOrComparisonView->ownerCase();
if ( auto* view = filterCollection->firstAncestorOrThisOfType<Rim3dView>() ) sourceCase = view->ownerCase();
}
if ( sourceCase && filterCollection )
@@ -42,10 +42,8 @@ void RicNewUserDefinedFilterFeature::onActionTriggered( bool isChecked )
if ( RicCellFilterFeatureTools::addNewFilterIfCombinedSelected<RimUserDefinedFilter>( []( RimUserDefinedFilter* ) {} ) ) return;
if ( RicCellFilterFeatureTools::addNewFilterToDataCollectionIfSelected<RimUserDefinedFilter>( []( RimUserDefinedFilter* ) {} ) ) return;
// Find the selected Cell Filter Collection
std::vector<RimCellFilterCollection*> colls = caf::selectedObjectsByTypeStrict<RimCellFilterCollection*>();
if ( colls.empty() ) return;
RimCellFilterCollection* filtColl = colls[0];
RimCellFilterCollection* filtColl = RicCellFilterFeatureTools::resolveTargetCellFilterCollection();
if ( !filtColl ) return;
// and the case to use
RimCase* sourceCase = filtColl->firstAncestorOrThisOfTypeAsserted<Rim3dView>()->ownerCase();
@@ -44,10 +44,8 @@ void RicNewUserDefinedIndexFilterFeature::onActionTriggered( bool isChecked )
if ( RicCellFilterFeatureTools::addNewFilterToDataCollectionIfSelected<RimUserDefinedIndexFilter>( []( RimUserDefinedIndexFilter* ) {} ) )
return;
// Find the selected Cell Filter Collection
std::vector<RimCellFilterCollection*> colls = caf::selectedObjectsByTypeStrict<RimCellFilterCollection*>();
if ( colls.empty() ) return;
RimCellFilterCollection* filtColl = colls[0];
RimCellFilterCollection* filtColl = RicCellFilterFeatureTools::resolveTargetCellFilterCollection();
if ( !filtColl ) return;
// and the case to use
RimCase* sourceCase = filtColl->firstAncestorOrThisOfTypeAsserted<Rim3dView>()->ownerCase();
@@ -34,10 +34,9 @@ CAF_CMD_SOURCE_INIT( RicAddLinkedEclipsePropertyFilterFeature, "RicAddLinkedEcli
//--------------------------------------------------------------------------------------------------
bool RicAddLinkedEclipsePropertyFilterFeature::isCommandEnabled() const
{
auto filterCollections = RicEclipsePropertyFilterFeatureImpl::selectedPropertyFilterCollections();
if ( filterCollections.size() == 1 )
if ( auto* target = RicEclipsePropertyFilterFeatureImpl::resolveTargetPropertyFilterCollection() )
{
return RicEclipsePropertyFilterFeatureImpl::isPropertyFilterCommandAvailable( filterCollections[0] );
return RicEclipsePropertyFilterFeatureImpl::isPropertyFilterCommandAvailable( target );
}
return false;
@@ -48,11 +47,8 @@ bool RicAddLinkedEclipsePropertyFilterFeature::isCommandEnabled() const
//--------------------------------------------------------------------------------------------------
void RicAddLinkedEclipsePropertyFilterFeature::onActionTriggered( bool isChecked )
{
auto filterCollections = RicEclipsePropertyFilterFeatureImpl::selectedPropertyFilterCollections();
if ( filterCollections.size() == 1 )
if ( auto* coll = RicEclipsePropertyFilterFeatureImpl::resolveTargetPropertyFilterCollection() )
{
auto coll = filterCollections[0];
auto filter = coll->addFilterLinkedToCellResult();
coll->updateAllRequiredEditors();
@@ -47,10 +47,9 @@ bool RicEclipseCombinedPropertyFilterNewFeature::isCommandEnabled() const
auto dataColls = caf::selectedObjectsByTypeStrict<RimDataFilterCollection*>();
if ( !dataColls.empty() ) return true;
auto filterCollections = RicEclipsePropertyFilterFeatureImpl::selectedPropertyFilterCollections();
if ( filterCollections.size() == 1 )
if ( auto* target = RicEclipsePropertyFilterFeatureImpl::resolveTargetPropertyFilterCollection() )
{
return RicEclipsePropertyFilterFeatureImpl::isPropertyFilterCommandAvailable( filterCollections[0] );
return RicEclipsePropertyFilterFeatureImpl::isPropertyFilterCommandAvailable( target );
}
return false;
}
@@ -82,11 +81,11 @@ void RicEclipseCombinedPropertyFilterNewFeature::onActionTriggered( bool isCheck
return;
}
auto filterCollections = RicEclipsePropertyFilterFeatureImpl::selectedPropertyFilterCollections();
if ( filterCollections.size() != 1 ) return;
auto* target = RicEclipsePropertyFilterFeatureImpl::resolveTargetPropertyFilterCollection();
if ( !target ) return;
RimCombinedFilter* created = filterCollections[0]->addNewCombinedFilter();
filterCollections[0]->updateConnectedEditors();
RimCombinedFilter* created = target->addNewCombinedFilter();
target->updateConnectedEditors();
if ( created )
{
Riu3DMainWindowTools::selectAsCurrentItem( created );
@@ -28,6 +28,7 @@
#include "RimEclipsePropertyFilterCollection.h"
#include "RimEclipseResultDefinition.h"
#include "RimEclipseView.h"
#include "RimFilterInViewCollection.h"
#include "RimViewController.h"
#include "Riu3DMainWindowTools.h"
@@ -52,6 +53,20 @@ std::vector<RimEclipsePropertyFilterCollection*> RicEclipsePropertyFilterFeature
return caf::SelectionManager::instance()->objectsByType<RimEclipsePropertyFilterCollection>();
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
RimEclipsePropertyFilterCollection* RicEclipsePropertyFilterFeatureImpl::resolveTargetPropertyFilterCollection()
{
auto direct = caf::SelectionManager::instance()->objectsByType<RimEclipsePropertyFilterCollection>();
if ( !direct.empty() ) return direct.front();
auto facades = caf::SelectionManager::instance()->objectsByType<RimFilterInViewCollection>();
if ( !facades.empty() && facades.front()->propertyFilters() ) return facades.front()->propertyFilters();
return nullptr;
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
@@ -40,6 +40,11 @@ public:
static std::vector<RimEclipsePropertyFilter*> selectedPropertyFilters();
static std::vector<RimEclipsePropertyFilterCollection*> selectedPropertyFilterCollections();
// Looks at the strict selection first, then at any selected RimFilterInViewCollection facade. Returns
// nullptr if neither is selected. Used by the property-filter "New ..." commands so they fire
// when invoked from the unified facade tree node.
static RimEclipsePropertyFilterCollection* resolveTargetPropertyFilterCollection();
static void addPropertyFilter( RimEclipsePropertyFilterCollection* propertyFilterCollection );
static RimEclipsePropertyFilter* addPropertyFilterToCombinedFilter( RimCombinedFilter* combined );
static void insertPropertyFilter( RimEclipsePropertyFilterCollection* propertyFilterCollection, size_t index );
@@ -50,11 +50,9 @@ bool RicEclipsePropertyFilterNewFeature::isCommandEnabled() const
auto dataColls = caf::selectedObjectsByTypeStrict<RimDataFilterCollection*>();
if ( !dataColls.empty() ) return true;
std::vector<RimEclipsePropertyFilterCollection*> filterCollections =
RicEclipsePropertyFilterFeatureImpl::selectedPropertyFilterCollections();
if ( filterCollections.size() == 1 )
if ( auto* target = RicEclipsePropertyFilterFeatureImpl::resolveTargetPropertyFilterCollection() )
{
return RicEclipsePropertyFilterFeatureImpl::isPropertyFilterCommandAvailable( filterCollections[0] );
return RicEclipsePropertyFilterFeatureImpl::isPropertyFilterCommandAvailable( target );
}
return false;
@@ -92,11 +90,9 @@ void RicEclipsePropertyFilterNewFeature::onActionTriggered( bool isChecked )
return;
}
std::vector<RimEclipsePropertyFilterCollection*> filterCollections =
RicEclipsePropertyFilterFeatureImpl::selectedPropertyFilterCollections();
if ( filterCollections.size() == 1 )
if ( auto* target = RicEclipsePropertyFilterFeatureImpl::resolveTargetPropertyFilterCollection() )
{
RicEclipsePropertyFilterNewExec* filterExec = new RicEclipsePropertyFilterNewExec( filterCollections[0] );
RicEclipsePropertyFilterNewExec* filterExec = new RicEclipsePropertyFilterNewExec( target );
caf::CmdExecCommandManager::instance()->processExecuteCommand( filterExec );
}
}
@@ -24,6 +24,7 @@
#include "RimCase.h"
#include "RimCellFilter.h"
#include "RimCellFilterCollection.h"
#include "RimFilterInViewCollection.h"
#include "cafPdmObjectGroup.h"
#include "cafPdmPointer.h"
@@ -45,7 +46,10 @@ bool RicPasteCellFiltersFeature::isCommandEnabled() const
objectGroup.objectsByType( &typedObjects );
if ( typedObjects.empty() ) return false;
return dynamic_cast<RimCellFilterCollection*>( caf::SelectionManager::instance()->selectedItem() ) != nullptr;
auto* selected = caf::SelectionManager::instance()->selectedItem();
if ( dynamic_cast<RimCellFilterCollection*>( selected ) ) return true;
if ( auto* facade = dynamic_cast<RimFilterInViewCollection*>( selected ) ) return facade->cellFilters() != nullptr;
return false;
}
//--------------------------------------------------------------------------------------------------
@@ -53,7 +57,12 @@ bool RicPasteCellFiltersFeature::isCommandEnabled() const
//--------------------------------------------------------------------------------------------------
void RicPasteCellFiltersFeature::onActionTriggered( bool isChecked )
{
auto cellFilterCollection = dynamic_cast<RimCellFilterCollection*>( caf::SelectionManager::instance()->selectedItem() );
auto* selected = caf::SelectionManager::instance()->selectedItem();
auto* cellFilterCollection = dynamic_cast<RimCellFilterCollection*>( selected );
if ( !cellFilterCollection )
{
if ( auto* facade = dynamic_cast<RimFilterInViewCollection*>( selected ) ) cellFilterCollection = facade->cellFilters();
}
if ( !cellFilterCollection ) return;
auto view = cellFilterCollection->firstAncestorOfType<Rim3dView>();
@@ -17,6 +17,7 @@ set(SOURCE_GROUP_HEADER_FILES
${CMAKE_CURRENT_LIST_DIR}/RimCellFilterIntervalTool.h
${CMAKE_CURRENT_LIST_DIR}/RimCellIndexFilter.h
${CMAKE_CURRENT_LIST_DIR}/RimUserDefinedIndexFilter.h
${CMAKE_CURRENT_LIST_DIR}/RimFilterInViewCollection.h
)
set(SOURCE_GROUP_SOURCE_FILES
@@ -38,6 +39,7 @@ set(SOURCE_GROUP_SOURCE_FILES
${CMAKE_CURRENT_LIST_DIR}/RimCellFilterIntervalTool.cpp
${CMAKE_CURRENT_LIST_DIR}/RimCellIndexFilter.cpp
${CMAKE_CURRENT_LIST_DIR}/RimUserDefinedIndexFilter.cpp
${CMAKE_CURRENT_LIST_DIR}/RimFilterInViewCollection.cpp
)
list(APPEND CODE_HEADER_FILES ${SOURCE_GROUP_HEADER_FILES})
@@ -33,6 +33,7 @@ CAF_PDM_SOURCE_INIT( RimDataFilterInViewCollection, "DataFilterInViewCollection"
///
//--------------------------------------------------------------------------------------------------
RimDataFilterInViewCollection::RimDataFilterInViewCollection()
: wrappersChanged( this )
{
CAF_PDM_InitObject( "Data Filters", ":/CellFilter.png" );
@@ -95,6 +96,7 @@ void RimDataFilterInViewCollection::syncWithSource()
{
m_wrappers.deleteChildren();
updateConnectedEditors();
wrappersChanged.send();
return;
}
@@ -118,6 +120,7 @@ void RimDataFilterInViewCollection::syncWithSource()
m_wrappers.push_back( w );
}
updateConnectedEditors();
wrappersChanged.send();
}
//--------------------------------------------------------------------------------------------------
@@ -22,6 +22,7 @@
#include "cafPdmChildArrayField.h"
#include "cafPdmPtrField.h"
#include "cafSignal.h"
class RimCellFilter;
class RimDataFilterCollection;
@@ -41,6 +42,8 @@ public:
RimDataFilterInViewCollection();
~RimDataFilterInViewCollection() override;
caf::Signal<> wrappersChanged;
void setSourceCollection( RimDataFilterCollection* sourceCollection );
RimDataFilterCollection* sourceCollection() const;
@@ -41,6 +41,7 @@ CAF_PDM_SOURCE_INIT( RimEclipsePropertyFilterCollection, "CellPropertyFilters" )
///
//--------------------------------------------------------------------------------------------------
RimEclipsePropertyFilterCollection::RimEclipsePropertyFilterCollection()
: filtersChanged( this )
{
CAF_PDM_InitObject( "Property Filters", ":/CellFilter_Values.png" );
@@ -296,6 +297,25 @@ void RimEclipsePropertyFilterCollection::appendMenuItems( caf::CmdFeatureMenuBui
menuBuilder << "RicEclipseCombinedPropertyFilterNewFeature";
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
void RimEclipsePropertyFilterCollection::onChildAdded( caf::PdmFieldHandle* containerForNewObject )
{
RimPropertyFilterCollection::onChildAdded( containerForNewObject );
filtersChanged.send();
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
void RimEclipsePropertyFilterCollection::onChildDeleted( caf::PdmChildArrayFieldHandle* childArray,
std::vector<caf::PdmObjectHandle*>& referringObjects )
{
RimPropertyFilterCollection::onChildDeleted( childArray, referringObjects );
filtersChanged.send();
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
@@ -23,6 +23,7 @@
#include "RimPropertyFilterCollection.h"
#include "cafPdmChildArrayField.h"
#include "cafSignal.h"
class RimCellFilter;
class RimCombinedFilter;
@@ -41,6 +42,8 @@ class RimEclipsePropertyFilterCollection : public RimPropertyFilterCollection
public:
RimEclipsePropertyFilterCollection();
caf::Signal<> filtersChanged;
RimEclipseView* reservoirView();
void setIsDuplicatedFromLinkedView();
@@ -64,6 +67,9 @@ public:
RimEclipsePropertyFilter* addFilterLinkedToCellResult();
RimCombinedFilter* addNewCombinedFilter();
void onChildAdded( caf::PdmFieldHandle* containerForNewObject ) override;
void onChildDeleted( caf::PdmChildArrayFieldHandle* childArray, std::vector<caf::PdmObjectHandle*>& referringObjects ) override;
protected:
void initAfterRead() override;
void appendMenuItems( caf::CmdFeatureMenuBuilder& menuBuilder ) const override;
@@ -0,0 +1,250 @@
/////////////////////////////////////////////////////////////////////////////////
//
// Copyright (C) 2026 Equinor ASA
//
// ResInsight is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// ResInsight is distributed in the hope that it will be useful, but WITHOUT ANY
// WARRANTY; without even the implied warranty of MERCHANTABILITY or
// FITNESS FOR A PARTICULAR PURPOSE.
//
// See the GNU General Public License at <http://www.gnu.org/licenses/gpl.html>
// for more details.
//
/////////////////////////////////////////////////////////////////////////////////
#include "RimFilterInViewCollection.h"
#include "Polygons/RimPolygon.h"
#include "Polygons/RimPolygonCollection.h"
#include "RimCellFilter.h"
#include "RimCellFilterCollection.h"
#include "RimDataFilterInView.h"
#include "RimDataFilterInViewCollection.h"
#include "RimEclipsePropertyFilterCollection.h"
#include "RimTools.h"
#include "cafCmdFeatureMenuBuilder.h"
#include "cafPdmUiTreeOrdering.h"
#include <QIcon>
#include <QVariant>
CAF_PDM_SOURCE_INIT( RimFilterInViewCollection, "FilterInViewCollection" );
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
RimFilterInViewCollection::RimFilterInViewCollection()
{
CAF_PDM_InitObject( "Filters", ":/CellFilter.png" );
CAF_PDM_InitFieldNoDefault( &m_cellFilters, "CellFilters", "Cell Filters" );
m_cellFilters.uiCapability()->setUiHidden( true );
CAF_PDM_InitFieldNoDefault( &m_propertyFilters, "PropertyFilters", "Property Filters" );
m_propertyFilters.uiCapability()->setUiHidden( true );
CAF_PDM_InitFieldNoDefault( &m_dataFiltersInView, "DataFiltersInView", "Data Filters" );
m_dataFiltersInView.uiCapability()->setUiHidden( true );
setName( "Filters" );
nameField()->uiCapability()->setUiHidden( true );
setCheckState( true );
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
RimFilterInViewCollection::~RimFilterInViewCollection()
{
disconnectSourceSignals();
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
void RimFilterInViewCollection::setSourceCollections( RimCellFilterCollection* cellFilters,
RimEclipsePropertyFilterCollection* propertyFilters,
RimDataFilterInViewCollection* dataFiltersInView )
{
disconnectSourceSignals();
m_cellFilters = cellFilters;
m_propertyFilters = propertyFilters;
m_dataFiltersInView = dataFiltersInView;
connectSourceSignals();
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
RimCellFilterCollection* RimFilterInViewCollection::cellFilters() const
{
return m_cellFilters();
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
RimEclipsePropertyFilterCollection* RimFilterInViewCollection::propertyFilters() const
{
return m_propertyFilters();
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
RimDataFilterInViewCollection* RimFilterInViewCollection::dataFiltersInView() const
{
return m_dataFiltersInView();
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
void RimFilterInViewCollection::defineUiTreeOrdering( caf::PdmUiTreeOrdering& uiTreeOrdering, QString /*uiConfigName*/ )
{
if ( m_cellFilters() )
{
for ( RimCellFilter* f : m_cellFilters()->filters() )
{
if ( f ) uiTreeOrdering.add( f );
}
}
if ( m_propertyFilters() )
{
for ( RimCellFilter* f : m_propertyFilters()->filtersForEvaluation() )
{
if ( f ) uiTreeOrdering.add( f );
}
}
if ( m_dataFiltersInView() )
{
for ( RimDataFilterInView* w : m_dataFiltersInView()->wrappers() )
{
if ( w ) uiTreeOrdering.add( w );
}
}
uiTreeOrdering.skipRemainingChildren( true );
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
void RimFilterInViewCollection::fieldChangedByUi( const caf::PdmFieldHandle* changedField, const QVariant& oldValue, const QVariant& newValue )
{
if ( changedField == objectToggleField() )
{
cascadeMasterToggle();
}
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
void RimFilterInViewCollection::appendMenuItems( caf::CmdFeatureMenuBuilder& menuBuilder ) const
{
// Cell-filter menu (mirrors RimCellFilterCollection::appendMenuItems).
menuBuilder << "RicPasteCellFiltersFeature";
menuBuilder << "Separator";
menuBuilder.subMenuStart( "Polygon Filter", QIcon( ":/CellFilter_Polygon.png" ) );
{
if ( auto* polygonCollection = RimTools::polygonCollection() )
{
for ( auto* p : polygonCollection->allPolygons() )
{
if ( !p ) continue;
menuBuilder.addCmdFeatureWithUserData( "RicNewPolygonFilterFeature", p->name(), QVariant::fromValue( static_cast<void*>( p ) ) );
}
}
}
menuBuilder.subMenuEnd();
menuBuilder << "RicNewPolygonFilterFeature";
menuBuilder << "Separator";
menuBuilder.subMenuStart( "Range Filter" );
menuBuilder << "RicNewRangeFilterSliceIFeature";
menuBuilder << "RicNewRangeFilterSliceJFeature";
menuBuilder << "RicNewRangeFilterSliceKFeature";
menuBuilder << "RicNewCellRangeFilterFeature";
menuBuilder.subMenuEnd();
menuBuilder << "RicNewCellIndexFilterFeature";
menuBuilder << "Separator";
menuBuilder << "RicNewUserDefinedFilterFeature";
menuBuilder << "RicNewUserDefinedIndexFilterFeature";
// Property-filter menu (mirrors RimEclipsePropertyFilterCollection::appendMenuItems).
menuBuilder << "Separator";
menuBuilder << "RicEclipsePropertyFilterNewFeature";
menuBuilder << "RicAddLinkedEclipsePropertyFilterFeature";
menuBuilder << "Separator";
menuBuilder << "RicEclipseCombinedPropertyFilterNewFeature";
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
void RimFilterInViewCollection::connectSourceSignals()
{
if ( m_cellFilters() )
{
m_cellFilters()->filtersChanged.connect( this, &RimFilterInViewCollection::onSourceFiltersChanged );
}
if ( m_propertyFilters() )
{
m_propertyFilters()->filtersChanged.connect( this, &RimFilterInViewCollection::onSourceFiltersChanged );
}
if ( m_dataFiltersInView() )
{
m_dataFiltersInView()->wrappersChanged.connect( this, &RimFilterInViewCollection::onSourceFiltersChanged );
}
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
void RimFilterInViewCollection::disconnectSourceSignals()
{
if ( m_cellFilters() ) m_cellFilters()->filtersChanged.disconnect( this );
if ( m_propertyFilters() ) m_propertyFilters()->filtersChanged.disconnect( this );
if ( m_dataFiltersInView() ) m_dataFiltersInView()->wrappersChanged.disconnect( this );
}
//--------------------------------------------------------------------------------------------------
/// Source-collection child set changed (filter added, removed, or reordered). Repaint just this
/// subtree by asking the framework to re-run our defineUiTreeOrdering.
//--------------------------------------------------------------------------------------------------
void RimFilterInViewCollection::onSourceFiltersChanged( const caf::SignalEmitter* /*emitter*/ )
{
updateConnectedEditors();
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
void RimFilterInViewCollection::cascadeMasterToggle()
{
const bool checked = isChecked();
if ( m_cellFilters() ) m_cellFilters()->setActive( checked );
if ( m_propertyFilters() )
{
m_propertyFilters()->isActive = checked;
m_propertyFilters()->updateConnectedEditors();
m_propertyFilters()->updateDisplayModelNotifyManagedViews( nullptr );
}
if ( m_dataFiltersInView() ) m_dataFiltersInView()->setCheckState( checked );
}
@@ -0,0 +1,71 @@
/////////////////////////////////////////////////////////////////////////////////
//
// Copyright (C) 2026 Equinor ASA
//
// ResInsight is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// ResInsight is distributed in the hope that it will be useful, but WITHOUT ANY
// WARRANTY; without even the implied warranty of MERCHANTABILITY or
// FITNESS FOR A PARTICULAR PURPOSE.
//
// See the GNU General Public License at <http://www.gnu.org/licenses/gpl.html>
// for more details.
//
/////////////////////////////////////////////////////////////////////////////////
#pragma once
#include "RimCheckableNamedObject.h"
#include "cafPdmPtrField.h"
class RimCellFilterCollection;
class RimDataFilterInViewCollection;
class RimEclipsePropertyFilterCollection;
namespace caf
{
class CmdFeatureMenuBuilder;
class SignalEmitter;
} // namespace caf
//==================================================================================================
/// View-level facade that aggregates the three filter collections (cell filters, eclipse property
/// filters, per-view data-filter wrappers) under a single tree node. Owns no children itself —
/// only holds non-owning pointers to the source collections, which remain owned by the parent view.
/// The master toggle on this node cascades to the three sources.
//==================================================================================================
class RimFilterInViewCollection : public RimCheckableNamedObject
{
CAF_PDM_HEADER_INIT;
public:
RimFilterInViewCollection();
~RimFilterInViewCollection() override;
void setSourceCollections( RimCellFilterCollection* cellFilters,
RimEclipsePropertyFilterCollection* propertyFilters,
RimDataFilterInViewCollection* dataFiltersInView );
RimCellFilterCollection* cellFilters() const;
RimEclipsePropertyFilterCollection* propertyFilters() const;
RimDataFilterInViewCollection* dataFiltersInView() const;
protected:
void defineUiTreeOrdering( caf::PdmUiTreeOrdering& uiTreeOrdering, QString uiConfigName = "" ) override;
void fieldChangedByUi( const caf::PdmFieldHandle* changedField, const QVariant& oldValue, const QVariant& newValue ) override;
void appendMenuItems( caf::CmdFeatureMenuBuilder& menuBuilder ) const override;
private:
void connectSourceSignals();
void disconnectSourceSignals();
void onSourceFiltersChanged( const caf::SignalEmitter* emitter );
void cascadeMasterToggle();
caf::PdmPtrField<RimCellFilterCollection*> m_cellFilters;
caf::PdmPtrField<RimEclipsePropertyFilterCollection*> m_propertyFilters;
caf::PdmPtrField<RimDataFilterInViewCollection*> m_dataFiltersInView;
};
@@ -51,6 +51,7 @@
#include "RimAnnotationInViewCollection.h"
#include "RimCameraPosition.h"
#include "RimCellEdgeColors.h"
#include "RimCellFilter.h"
#include "RimCellFilterCollection.h"
#include "RimCombinedFilter.h"
#include "RimDataFilterCollection.h"
@@ -67,6 +68,7 @@
#include "RimExtrudedCurveIntersection.h"
#include "RimFaultInViewCollection.h"
#include "RimFaultReactivationModelCollection.h"
#include "RimFilterInViewCollection.h"
#include "RimFlowCharacteristicsPlot.h"
#include "RimFlowDiagSolution.h"
#include "RimFracture.h"
@@ -214,6 +216,14 @@ RimEclipseView::RimEclipseView()
CAF_PDM_InitFieldNoDefault( &m_dataFiltersInView, "DataFiltersInView", "Data Filters" );
m_dataFiltersInView = new RimDataFilterInViewCollection();
CAF_PDM_InitFieldNoDefault( &m_filterInViewCollection, "FilterInViewCollection", "Filters" );
m_filterInViewCollection = new RimFilterInViewCollection();
m_filterInViewCollection->setSourceCollections( cellFilterCollection(), m_propertyFilterCollection(), m_dataFiltersInView() );
cellFilterCollection()->uiCapability()->setUiTreeHidden( true );
m_propertyFilterCollection()->uiCapability()->setUiTreeHidden( true );
m_dataFiltersInView()->uiCapability()->setUiTreeHidden( true );
// Visualization fields
CAF_PDM_InitField( &m_showInactiveCells, "ShowInactiveCells", false, "Show Inactive Cells" );
CAF_PDM_InitField( &m_showInvalidCells, "ShowInvalidCells", false, "Show Invalid Cells" );
@@ -2078,9 +2088,7 @@ void RimEclipseView::defineUiTreeOrdering( caf::PdmUiTreeOrdering& uiTreeOrderin
if ( m_refinementRegions() && m_refinementRegions()->shouldBeVisibleInTree() ) uiTreeOrdering.add( m_refinementRegions() );
uiTreeOrdering.add( cellResult() );
uiTreeOrdering.add( cellEdgeResult() );
uiTreeOrdering.add( cellFilterCollection() );
uiTreeOrdering.add( m_dataFiltersInView() );
uiTreeOrdering.add( m_propertyFilterCollection() );
uiTreeOrdering.add( m_filterInViewCollection() );
uiTreeOrdering.add( elementVectorResult() );
if ( m_streamlineCollection->shouldBeAvailable() ) uiTreeOrdering.add( &m_streamlineCollection );
@@ -54,6 +54,7 @@ class RimEclipseFaultColors;
class RimEclipsePropertyFilter;
class RimEclipsePropertyFilterCollection;
class RimFaultInViewCollection;
class RimFilterInViewCollection;
class RimReservoirCellResultsStorage;
class RimReservoirCellResultsStorage;
class RimSimWellInViewCollection;
@@ -275,6 +276,8 @@ private:
caf::PdmChildField<RimDataFilterInViewCollection*> m_dataFiltersInView;
caf::PdmChildField<RimFilterInViewCollection*> m_filterInViewCollection;
caf::PdmPtrField<RimEclipseCase*> m_customEclipseCase_OBSOLETE;
cvf::ref<RivReservoirViewPartMgr> m_reservoirGridPartManager;