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

@@ -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;
};