diff --git a/ApplicationLibCode/ProjectDataModel/ContourMap/RimStatisticsContourMap.cpp b/ApplicationLibCode/ProjectDataModel/ContourMap/RimStatisticsContourMap.cpp index a31e3effc3..5eb38f534c 100644 --- a/ApplicationLibCode/ProjectDataModel/ContourMap/RimStatisticsContourMap.cpp +++ b/ApplicationLibCode/ProjectDataModel/ContourMap/RimStatisticsContourMap.cpp @@ -416,6 +416,15 @@ void RimStatisticsContourMap::fieldChangedByUi( const caf::PdmFieldHandle* chang view->wellCollection()->updateConnectedEditors(); } } + else if ( &m_dataFilter == changedField ) + { + // Refresh the filter label overlay immediately. The contour map data itself still requires + // an explicit "Compute Statistics" to reflect the new filter selection. + for ( auto& view : m_views ) + { + view->updateFilterLabel(); + } + } } //-------------------------------------------------------------------------------------------------- @@ -905,6 +914,14 @@ RimEclipseCase* RimStatisticsContourMap::eclipseCase() const return m_primaryCase(); } +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +RimCellFilter* RimStatisticsContourMap::dataFilter() const +{ + return m_dataFilter(); +} + //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- diff --git a/ApplicationLibCode/ProjectDataModel/ContourMap/RimStatisticsContourMap.h b/ApplicationLibCode/ProjectDataModel/ContourMap/RimStatisticsContourMap.h index 9ad229cdaa..5efebe6d9a 100644 --- a/ApplicationLibCode/ProjectDataModel/ContourMap/RimStatisticsContourMap.h +++ b/ApplicationLibCode/ProjectDataModel/ContourMap/RimStatisticsContourMap.h @@ -75,6 +75,8 @@ public: void setEclipseCase( RimEclipseCase* eclipseCase ); RimEclipseCase* eclipseCase() const; + RimCellFilter* dataFilter() const; + void setGridImportMode( GridImportMode mode ); QString ensembleName() const; diff --git a/ApplicationLibCode/ProjectDataModel/ContourMap/RimStatisticsContourMapView.cpp b/ApplicationLibCode/ProjectDataModel/ContourMap/RimStatisticsContourMapView.cpp index fba3742740..27d01ce957 100644 --- a/ApplicationLibCode/ProjectDataModel/ContourMap/RimStatisticsContourMapView.cpp +++ b/ApplicationLibCode/ProjectDataModel/ContourMap/RimStatisticsContourMapView.cpp @@ -26,12 +26,14 @@ #include "Rim3dOverlayInfoConfig.h" #include "RimAnnotationInViewCollection.h" #include "RimCase.h" +#include "RimCellFilter.h" #include "RimCellFilterCollection.h" #include "RimEclipseCaseEnsemble.h" #include "RimEclipseCellColors.h" #include "RimEclipseContourMapView.h" #include "RimEclipseFaultColors.h" #include "RimFaultInViewCollection.h" +#include "RimFilterDisplayUtil.h" #include "RimRegularLegendConfig.h" #include "RimSimWellInViewCollection.h" #include "RimStatisticsContourMap.h" @@ -175,6 +177,24 @@ RimStatisticsContourMap* RimStatisticsContourMapView::statisticsContourMap() con return m_statisticsContourMap; } +//-------------------------------------------------------------------------------------------------- +/// Show the ensemble data filter applied to the contour map, since it is not part of the view's own +/// (unused) cell/property filter collection. +//-------------------------------------------------------------------------------------------------- +QString RimStatisticsContourMapView::activeFiltersDisplayText() const +{ + if ( statisticsContourMap() ) + { + if ( auto* filter = statisticsContourMap()->dataFilter() ) + { + const QString text = RimFilterDisplayUtil::filterNamesJoined( { filter }, true ); + if ( !text.isEmpty() ) return text; + } + } + + return RimEclipseContourMapView::activeFiltersDisplayText(); +} + //-------------------------------------------------------------------------------------------------- /// Clamp the current timestep to actual possibilities //-------------------------------------------------------------------------------------------------- diff --git a/ApplicationLibCode/ProjectDataModel/ContourMap/RimStatisticsContourMapView.h b/ApplicationLibCode/ProjectDataModel/ContourMap/RimStatisticsContourMapView.h index c79dcc218a..1b85a4b0e3 100644 --- a/ApplicationLibCode/ProjectDataModel/ContourMap/RimStatisticsContourMapView.h +++ b/ApplicationLibCode/ProjectDataModel/ContourMap/RimStatisticsContourMapView.h @@ -35,6 +35,8 @@ public: QString createAutoName() const override; void setDefaultCustomName(); + QString activeFiltersDisplayText() const override; + protected: void defineUiTreeOrdering( caf::PdmUiTreeOrdering& uiTreeOrdering, QString uiConfigName = "" ) override; void defineUiOrdering( QString uiConfigName, caf::PdmUiOrdering& uiOrdering ) override; diff --git a/ApplicationLibCode/UnitTests/RimStatisticsContourMap-Test.cpp b/ApplicationLibCode/UnitTests/RimStatisticsContourMap-Test.cpp index 8fe8531071..3171f6a362 100644 --- a/ApplicationLibCode/UnitTests/RimStatisticsContourMap-Test.cpp +++ b/ApplicationLibCode/UnitTests/RimStatisticsContourMap-Test.cpp @@ -30,6 +30,7 @@ #include "RigMainGrid.h" #include "ContourMap/RimStatisticsContourMap.h" +#include "ContourMap/RimStatisticsContourMapView.h" #include "RiaResultNames.h" #include "RimCellRangeFilter.h" #include "RimDataFilterCollection.h" @@ -270,6 +271,33 @@ TEST( RimStatisticsContourMapTest, DataFilterSharedAndIndividualGridsAgree ) EXPECT_EQ( 0u, countDifferentValues( shared, individual ) ); } +//-------------------------------------------------------------------------------------------------- +/// An active data filter must be shown as overlay text in the contour map view (top left corner), +/// similar to the cell/property filter label shown in a regular 3d view. +//-------------------------------------------------------------------------------------------------- +TEST( RimStatisticsContourMapTest, ActiveDataFilterIsShownInViewOverlayText ) +{ + auto ensemble = createBruggeEnsemble( GridModeType::SHARED_GRID ); + ASSERT_TRUE( ensemble != nullptr ); + + auto* map = addPoroContourMap( ensemble.get(), GridImportMode::SHARED_GRID ); + ASSERT_TRUE( map != nullptr ); + + auto view = std::make_unique(); + view->setStatisticsContourMap( map ); + + EXPECT_TRUE( view->activeFiltersDisplayText().isEmpty() ); + + auto* filter = addTopLayerFilter( ensemble.get() ); + filter->setName( "Top Layer" ); + setDataFilter( map, filter ); + + EXPECT_EQ( QString( "Top Layer" ), view->activeFiltersDisplayText() ); + + filter->setActive( false ); + EXPECT_TRUE( view->activeFiltersDisplayText().isEmpty() ); +} + //-------------------------------------------------------------------------------------------------- /// A static mapped property (PORO) with an active dynamic filter (SWAT) must still produce a result /// per selected time step, since the filter's visible cells change over time even if PORO does not. diff --git a/ApplicationLibCode/UserInterface/RiuViewer.cpp b/ApplicationLibCode/UserInterface/RiuViewer.cpp index 328da93f29..02354b4ba8 100644 --- a/ApplicationLibCode/UserInterface/RiuViewer.cpp +++ b/ApplicationLibCode/UserInterface/RiuViewer.cpp @@ -659,7 +659,12 @@ void RiuViewer::setZScale( double scale ) //-------------------------------------------------------------------------------------------------- void RiuViewer::showFilterLabel( bool enable ) { + if ( m_showFilterLabel == enable ) return; + m_showFilterLabel = enable; + + // Redraw immediately, as the label may be toggled outside of a display model rebuild. + update(); } //-------------------------------------------------------------------------------------------------- @@ -667,7 +672,12 @@ void RiuViewer::showFilterLabel( bool enable ) //-------------------------------------------------------------------------------------------------- void RiuViewer::setFilterText( const QString& text ) { + if ( m_filterLabel->text() == text ) return; + m_filterLabel->setText( text ); + + // Redraw immediately, as the label may be updated outside of a display model rebuild. + update(); } //--------------------------------------------------------------------------------------------------