mirror of
https://github.com/OPM/ResInsight.git
synced 2026-10-26 07:00:17 -05:00
CellFilters: Unify view filter nodes under RimFilterInViewCollection
This commit is contained in:
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();
|
||||
|
||||
+2
-4
@@ -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();
|
||||
|
||||
+3
-7
@@ -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();
|
||||
|
||||
|
||||
+6
-7
@@ -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 );
|
||||
}
|
||||
}
|
||||
|
||||
+11
-2
@@ -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;
|
||||
|
||||
|
||||
+20
@@ -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;
|
||||
|
||||
Reference in new issue
Block a user