From 93baf776a139bc06d2e8e89e0619d977fe172bf7 Mon Sep 17 00:00:00 2001 From: Gaute Lindkvist Date: Wed, 16 Sep 2020 19:33:44 +0200 Subject: [PATCH] Fix crashes when dropping analysis plots into Multiplots --- .../Application/RiaApplication.cpp | 20 ++--- .../Application/Tools/RiaSummaryTools.cpp | 2 +- .../RicSummaryPlotTemplateTools.cpp | 2 +- .../Commands/RicCloseObservedDataFeature.cpp | 2 +- .../Commands/RicCloseSummaryCaseFeature.cpp | 2 +- .../Commands/RicDeleteSubItemsFeature.cpp | 4 +- .../RicDeleteSummaryCaseCollectionFeature.cpp | 2 +- .../Commands/RicReloadSummaryCaseFeature.cpp | 2 +- .../Commands/RicReplaceCaseFeature.cpp | 2 +- .../Commands/RicReplaceSummaryCaseFeature.cpp | 4 +- .../RicNewGridTimeHistoryCurveFeature.cpp | 4 +- .../RicNewSummaryCrossPlotFeature.cpp | 2 +- .../RicPasteAsciiDataToSummaryPlotFeature.cpp | 2 +- .../RicPasteSummaryCrossPlotFeature.cpp | 2 +- .../RicPasteSummaryPlotFeature.cpp | 2 +- .../RicSelectSummaryPlotUI.cpp | 2 +- .../RicSummaryPlotFeatureImpl.cpp | 2 +- .../AnalysisPlots/RimAnalysisPlot.h | 3 +- .../RimAnalysisPlotCollection.cpp | 37 +++++--- .../AnalysisPlots/RimAnalysisPlotCollection.h | 14 +-- .../ProjectDataModel/CMakeLists_files.cmake | 1 + .../RimAbstractCorrelationPlot.h | 1 - .../RimCorrelationPlotCollection.cpp | 40 ++++++--- .../RimCorrelationPlotCollection.h | 16 ++-- .../Flow/RimWellDistributionPlot.cpp | 8 -- .../Flow/RimWellDistributionPlot.h | 3 - .../GridCrossPlots/RimGridCrossPlot.cpp | 14 --- .../GridCrossPlots/RimGridCrossPlot.h | 1 - .../RimGridCrossPlotCollection.cpp | 16 ++-- .../RimGridCrossPlotCollection.h | 17 ++-- .../RimSaturationPressurePlotCollection.cpp | 10 ++- .../RimSaturationPressurePlotCollection.h | 3 +- .../RimAbstractPlotCollection.h | 68 ++++++++++++++ .../ProjectDataModel/RimDepthTrackPlot.cpp | 89 +++++++++---------- .../ProjectDataModel/RimDepthTrackPlot.h | 23 +++-- .../RimMainPlotCollection.cpp | 12 +-- ApplicationCode/ProjectDataModel/RimPlot.cpp | 10 ++- ApplicationCode/ProjectDataModel/RimPlot.h | 1 - .../ProjectDataModel/RimReloadCaseTools.cpp | 4 +- .../RimSummaryCalculation.cpp | 2 +- .../ProjectDataModel/RimWellLogTrack.cpp | 13 --- .../ProjectDataModel/RimWellLogTrack.h | 2 - .../Summary/RimSummaryCrossPlotCollection.cpp | 36 +++++--- .../Summary/RimSummaryCrossPlotCollection.h | 18 ++-- .../Summary/RimSummaryCurve.h | 2 +- .../Summary/RimSummaryPlot.cpp | 14 --- .../ProjectDataModel/Summary/RimSummaryPlot.h | 1 - .../Summary/RimSummaryPlotCollection.cpp | 57 ++++++++---- .../Summary/RimSummaryPlotCollection.h | 18 ++-- .../cafPdmCore/cafSignal.h | 3 +- 50 files changed, 360 insertions(+), 255 deletions(-) create mode 100644 ApplicationCode/ProjectDataModel/RimAbstractPlotCollection.h diff --git a/ApplicationCode/Application/RiaApplication.cpp b/ApplicationCode/Application/RiaApplication.cpp index 5260e8cca5..080254315c 100644 --- a/ApplicationCode/Application/RiaApplication.cpp +++ b/ApplicationCode/Application/RiaApplication.cpp @@ -1645,15 +1645,15 @@ void RiaApplication::loadAndUpdatePlotData() size_t plotCount = 0; plotCount += wlpColl ? wlpColl->wellLogPlots().size() : 0; - plotCount += spColl ? spColl->summaryPlots().size() : 0; - plotCount += scpColl ? scpColl->summaryPlots().size() : 0; + plotCount += spColl ? spColl->plots().size() : 0; + plotCount += scpColl ? scpColl->plots().size() : 0; plotCount += flowColl ? flowColl->plotCount() : 0; plotCount += rftColl ? rftColl->rftPlots().size() : 0; plotCount += pltColl ? pltColl->pltPlots().size() : 0; - plotCount += gcpColl ? gcpColl->gridCrossPlots().size() : 0; - plotCount += sppColl ? sppColl->plots().size() : 0; - plotCount += alsColl ? alsColl->plots().size() : 0; - plotCount += corrColl ? corrColl->plots().size() + corrColl->reports().size() : 0; + plotCount += gcpColl ? gcpColl->plotCount() : 0; + plotCount += sppColl ? sppColl->plotCount() : 0; + plotCount += alsColl ? alsColl->plotCount() : 0; + plotCount += corrColl ? corrColl->plotCount() + corrColl->reports().size() : 0; plotCount += gpwColl ? gpwColl->multiPlots().size() : 0; plotCount += frmColl ? frmColl->fractureModelPlots().size() : 0; @@ -1671,16 +1671,16 @@ void RiaApplication::loadAndUpdatePlotData() if ( spColl ) { - for ( size_t wlpIdx = 0; wlpIdx < spColl->summaryPlots().size(); ++wlpIdx ) + for ( auto plot : spColl->plots() ) { - spColl->summaryPlots[wlpIdx]->loadDataAndUpdate(); + plot->loadDataAndUpdate(); plotProgress.incrementProgress(); } } if ( scpColl ) { - for ( auto plot : scpColl->summaryPlots() ) + for ( auto plot : scpColl->plots() ) { plot->loadDataAndUpdate(); plotProgress.incrementProgress(); @@ -1714,7 +1714,7 @@ void RiaApplication::loadAndUpdatePlotData() if ( gcpColl ) { - for ( const auto& gcpPlot : gcpColl->gridCrossPlots() ) + for ( const auto& gcpPlot : gcpColl->plots() ) { gcpPlot->loadDataAndUpdate(); plotProgress.incrementProgress(); diff --git a/ApplicationCode/Application/Tools/RiaSummaryTools.cpp b/ApplicationCode/Application/Tools/RiaSummaryTools.cpp index 796cb0445c..0911646915 100644 --- a/ApplicationCode/Application/Tools/RiaSummaryTools.cpp +++ b/ApplicationCode/Application/Tools/RiaSummaryTools.cpp @@ -77,7 +77,7 @@ void RiaSummaryTools::notifyCalculatedCurveNameHasChanged( int calculationId, co { RimSummaryPlotCollection* summaryPlotColl = RiaSummaryTools::summaryPlotCollection(); - for ( RimSummaryPlot* plot : summaryPlotColl->summaryPlots() ) + for ( RimSummaryPlot* plot : summaryPlotColl->plots() ) { for ( RimSummaryCurve* curve : plot->summaryCurves() ) { diff --git a/ApplicationCode/Commands/PlotTemplateCommands/RicSummaryPlotTemplateTools.cpp b/ApplicationCode/Commands/PlotTemplateCommands/RicSummaryPlotTemplateTools.cpp index 4c59f91c20..a365a22895 100644 --- a/ApplicationCode/Commands/PlotTemplateCommands/RicSummaryPlotTemplateTools.cpp +++ b/ApplicationCode/Commands/PlotTemplateCommands/RicSummaryPlotTemplateTools.cpp @@ -93,7 +93,7 @@ void RicSummaryPlotTemplateTools::appendSummaryPlotToPlotCollection( RimSummaryPlotCollection* plotColl = RimProject::current()->mainPlotCollection()->summaryPlotCollection(); - plotColl->summaryPlots.push_back( summaryPlot ); + plotColl->addPlot( summaryPlot ); summaryPlot->resolveReferencesRecursively(); summaryPlot->initAfterReadRecursively(); diff --git a/ApplicationCode/Commands/RicCloseObservedDataFeature.cpp b/ApplicationCode/Commands/RicCloseObservedDataFeature.cpp index fa23de66f3..f046ada15d 100644 --- a/ApplicationCode/Commands/RicCloseObservedDataFeature.cpp +++ b/ApplicationCode/Commands/RicCloseObservedDataFeature.cpp @@ -56,7 +56,7 @@ void RicCloseObservedDataFeature::deleteObservedSummaryData( const std::vectorsummaryPlots ) + for ( RimSummaryPlot* summaryPlot : summaryPlotColl->plots() ) { summaryPlot->deleteCurvesAssosiatedWithCase( observedData ); } diff --git a/ApplicationCode/Commands/RicCloseSummaryCaseFeature.cpp b/ApplicationCode/Commands/RicCloseSummaryCaseFeature.cpp index 6351b707af..eb8b8c3a17 100644 --- a/ApplicationCode/Commands/RicCloseSummaryCaseFeature.cpp +++ b/ApplicationCode/Commands/RicCloseSummaryCaseFeature.cpp @@ -59,7 +59,7 @@ void RicCloseSummaryCaseFeature::deleteSummaryCases( std::vectorsummaryPlots ) + for ( RimSummaryPlot* summaryPlot : summaryPlotColl->plots() ) { summaryPlot->deleteCurvesAssosiatedWithCase( summaryCase ); } diff --git a/ApplicationCode/Commands/RicDeleteSubItemsFeature.cpp b/ApplicationCode/Commands/RicDeleteSubItemsFeature.cpp index 4525d1d725..d61fe8cccf 100644 --- a/ApplicationCode/Commands/RicDeleteSubItemsFeature.cpp +++ b/ApplicationCode/Commands/RicDeleteSubItemsFeature.cpp @@ -66,7 +66,7 @@ void RicDeleteSubItemsFeature::onActionTriggered( bool isChecked ) auto collection = dynamic_cast( item ); if ( collection ) { - collection->summaryPlots.deleteAllChildObjects(); + collection->deleteAllPlots(); collection->updateConnectedEditors(); } @@ -116,7 +116,7 @@ bool RicDeleteSubItemsFeature::hasDeletableSubItems( caf::PdmUiItem* uiItem ) { { auto collection = dynamic_cast( uiItem ); - if ( collection && !collection->summaryPlots().empty() ) + if ( collection && !collection->plots().empty() ) { return true; } diff --git a/ApplicationCode/Commands/RicDeleteSummaryCaseCollectionFeature.cpp b/ApplicationCode/Commands/RicDeleteSummaryCaseCollectionFeature.cpp index 8ecc7a19cf..d3b7916cbb 100644 --- a/ApplicationCode/Commands/RicDeleteSummaryCaseCollectionFeature.cpp +++ b/ApplicationCode/Commands/RicDeleteSummaryCaseCollectionFeature.cpp @@ -48,7 +48,7 @@ void RicDeleteSummaryCaseCollectionFeature::deleteSummaryCaseCollection( RimSumm for ( RimSummaryCase* summaryCase : caseCollection->allSummaryCases() ) { - for ( RimSummaryPlot* summaryPlot : summaryPlotColl->summaryPlots ) + for ( RimSummaryPlot* summaryPlot : summaryPlotColl->plots() ) { summaryPlot->deleteCurvesAssosiatedWithCase( summaryCase ); } diff --git a/ApplicationCode/Commands/RicReloadSummaryCaseFeature.cpp b/ApplicationCode/Commands/RicReloadSummaryCaseFeature.cpp index ec77ee77bc..b2cd0ea614 100644 --- a/ApplicationCode/Commands/RicReloadSummaryCaseFeature.cpp +++ b/ApplicationCode/Commands/RicReloadSummaryCaseFeature.cpp @@ -64,7 +64,7 @@ void RicReloadSummaryCaseFeature::onActionTriggered( bool isChecked ) RiaLogging::info( QString( "Reloaded data for %1" ).arg( summaryCase->summaryHeaderFilename() ) ); } - for ( RimSummaryPlot* summaryPlot : summaryPlotColl->summaryPlots ) + for ( RimSummaryPlot* summaryPlot : summaryPlotColl->plots() ) { summaryPlot->loadDataAndUpdate(); } diff --git a/ApplicationCode/Commands/RicReplaceCaseFeature.cpp b/ApplicationCode/Commands/RicReplaceCaseFeature.cpp index e7e4a8e257..3fe367eb48 100644 --- a/ApplicationCode/Commands/RicReplaceCaseFeature.cpp +++ b/ApplicationCode/Commands/RicReplaceCaseFeature.cpp @@ -111,7 +111,7 @@ void RicReplaceCaseFeature::onActionTriggered( bool isChecked ) gridSummaryCase->createRftReaderInterface(); RimSummaryPlotCollection* summaryPlotColl = RiaSummaryTools::summaryPlotCollection(); - for ( RimSummaryPlot* summaryPlot : summaryPlotColl->summaryPlots ) + for ( RimSummaryPlot* summaryPlot : summaryPlotColl->plots() ) { summaryPlot->loadDataAndUpdate(); } diff --git a/ApplicationCode/Commands/RicReplaceSummaryCaseFeature.cpp b/ApplicationCode/Commands/RicReplaceSummaryCaseFeature.cpp index 06acb00271..9bac9b6750 100644 --- a/ApplicationCode/Commands/RicReplaceSummaryCaseFeature.cpp +++ b/ApplicationCode/Commands/RicReplaceSummaryCaseFeature.cpp @@ -91,7 +91,7 @@ void RicReplaceSummaryCaseFeature::onActionTriggered( bool isChecked ) } RimSummaryPlotCollection* summaryPlotColl = RiaSummaryTools::summaryPlotCollection(); - for ( RimSummaryPlot* summaryPlot : summaryPlotColl->summaryPlots ) + for ( RimSummaryPlot* summaryPlot : summaryPlotColl->plots() ) { // Update summary curves on calculated data std::vector summaryCurves = summaryPlot->summaryCurves(); @@ -118,7 +118,7 @@ void RicReplaceSummaryCaseFeature::onActionTriggered( bool isChecked ) } RimSummaryCrossPlotCollection* summaryCrossPlotColl = RiaSummaryTools::summaryCrossPlotCollection(); - for ( RimSummaryPlot* summaryPlot : summaryCrossPlotColl->summaryPlots() ) + for ( RimSummaryPlot* summaryPlot : summaryCrossPlotColl->plots() ) { // Update summary curves on calculated data std::vector summaryCurves = summaryPlot->summaryCurves(); diff --git a/ApplicationCode/Commands/SummaryPlotCommands/RicNewGridTimeHistoryCurveFeature.cpp b/ApplicationCode/Commands/SummaryPlotCommands/RicNewGridTimeHistoryCurveFeature.cpp index 13ea4885b6..bf5d190909 100644 --- a/ApplicationCode/Commands/SummaryPlotCommands/RicNewGridTimeHistoryCurveFeature.cpp +++ b/ApplicationCode/Commands/SummaryPlotCommands/RicNewGridTimeHistoryCurveFeature.cpp @@ -103,9 +103,9 @@ RimSummaryPlot* RicNewGridTimeHistoryCurveFeature::userSelectedSummaryPlot() defaultSelectedPlot = dynamic_cast( app->activePlotWindow() ); } - if ( !defaultSelectedPlot && summaryPlotColl->summaryPlots().size() > 0 ) + if ( !defaultSelectedPlot && !summaryPlotColl->plots().empty() ) { - defaultSelectedPlot = summaryPlotColl->summaryPlots()[0]; + defaultSelectedPlot = summaryPlotColl->plots().front(); } } diff --git a/ApplicationCode/Commands/SummaryPlotCommands/RicNewSummaryCrossPlotFeature.cpp b/ApplicationCode/Commands/SummaryPlotCommands/RicNewSummaryCrossPlotFeature.cpp index db48c9d313..1021ff1fb7 100644 --- a/ApplicationCode/Commands/SummaryPlotCommands/RicNewSummaryCrossPlotFeature.cpp +++ b/ApplicationCode/Commands/SummaryPlotCommands/RicNewSummaryCrossPlotFeature.cpp @@ -83,7 +83,7 @@ void RicNewSummaryCrossPlotFeature::onActionTriggered( bool isChecked ) RimSummaryCrossPlotCollection* summaryCrossPlotColl = project->mainPlotCollection()->summaryCrossPlotCollection(); RimSummaryPlot* summaryPlot = summaryCrossPlotColl->createSummaryPlot(); - summaryCrossPlotColl->addSummaryPlot( summaryPlot ); + summaryCrossPlotColl->addPlot( summaryPlot ); if ( summaryPlot ) { summaryCrossPlotColl->updateConnectedEditors(); diff --git a/ApplicationCode/Commands/SummaryPlotCommands/RicPasteAsciiDataToSummaryPlotFeature.cpp b/ApplicationCode/Commands/SummaryPlotCommands/RicPasteAsciiDataToSummaryPlotFeature.cpp index 2e61f3c032..387ceabf03 100644 --- a/ApplicationCode/Commands/SummaryPlotCommands/RicPasteAsciiDataToSummaryPlotFeature.cpp +++ b/ApplicationCode/Commands/SummaryPlotCommands/RicPasteAsciiDataToSummaryPlotFeature.cpp @@ -257,7 +257,7 @@ RicPasteAsciiDataToSummaryPlotFeature::CurveType RimSummaryPlot* RicPasteAsciiDataToSummaryPlotFeature::createSummaryPlotAndAddToPlotCollection( RimSummaryPlotCollection* plotCollection ) { - QString name = QString( "Summary Plot %1" ).arg( plotCollection->summaryPlots.size() + 1 ); + QString name = QString( "Summary Plot %1" ).arg( plotCollection->plots().size() + 1 ); return plotCollection->createNamedSummaryPlot( name ); } diff --git a/ApplicationCode/Commands/SummaryPlotCommands/RicPasteSummaryCrossPlotFeature.cpp b/ApplicationCode/Commands/SummaryPlotCommands/RicPasteSummaryCrossPlotFeature.cpp index e262cf3f69..81c8355f83 100644 --- a/ApplicationCode/Commands/SummaryPlotCommands/RicPasteSummaryCrossPlotFeature.cpp +++ b/ApplicationCode/Commands/SummaryPlotCommands/RicPasteSummaryCrossPlotFeature.cpp @@ -47,7 +47,7 @@ void RicPasteSummaryCrossPlotFeature::copyPlotAndAddToCollection( RimSummaryCros sourcePlot->xmlCapability()->copyByXmlSerialization( caf::PdmDefaultObjectFactory::instance() ) ); CVF_ASSERT( newSummaryPlot ); - plotColl->addSummaryPlot( newSummaryPlot ); + plotColl->addPlot( newSummaryPlot ); // Resolve references after object has been inserted into the data model newSummaryPlot->resolveReferencesRecursively(); diff --git a/ApplicationCode/Commands/SummaryPlotCommands/RicPasteSummaryPlotFeature.cpp b/ApplicationCode/Commands/SummaryPlotCommands/RicPasteSummaryPlotFeature.cpp index c3c0e59b74..fac6d8be81 100644 --- a/ApplicationCode/Commands/SummaryPlotCommands/RicPasteSummaryPlotFeature.cpp +++ b/ApplicationCode/Commands/SummaryPlotCommands/RicPasteSummaryPlotFeature.cpp @@ -47,7 +47,7 @@ void RicPasteSummaryPlotFeature::copyPlotAndAddToCollection( RimSummaryPlot* sou sourcePlot->xmlCapability()->copyByXmlSerialization( caf::PdmDefaultObjectFactory::instance() ) ); CVF_ASSERT( newSummaryPlot ); - plotColl->summaryPlots.push_back( newSummaryPlot ); + plotColl->addPlot( newSummaryPlot ); // Resolve references after object has been inserted into the data model newSummaryPlot->resolveReferencesRecursively(); diff --git a/ApplicationCode/Commands/SummaryPlotCommands/RicSelectSummaryPlotUI.cpp b/ApplicationCode/Commands/SummaryPlotCommands/RicSelectSummaryPlotUI.cpp index 298304558a..5bfa492adf 100644 --- a/ApplicationCode/Commands/SummaryPlotCommands/RicSelectSummaryPlotUI.cpp +++ b/ApplicationCode/Commands/SummaryPlotCommands/RicSelectSummaryPlotUI.cpp @@ -104,7 +104,7 @@ QList //-------------------------------------------------------------------------------------------------- void RicSelectSummaryPlotUI::defineUiOrdering( QString uiConfigName, caf::PdmUiOrdering& uiOrdering ) { - if ( RiaSummaryTools::summaryPlotCollection()->summaryPlots().size() == 0 ) + if ( RiaSummaryTools::summaryPlotCollection()->plots().empty() ) { m_createNewPlot = true; } diff --git a/ApplicationCode/Commands/SummaryPlotCommands/RicSummaryPlotFeatureImpl.cpp b/ApplicationCode/Commands/SummaryPlotCommands/RicSummaryPlotFeatureImpl.cpp index 416cc81ded..05e5eaf3b4 100644 --- a/ApplicationCode/Commands/SummaryPlotCommands/RicSummaryPlotFeatureImpl.cpp +++ b/ApplicationCode/Commands/SummaryPlotCommands/RicSummaryPlotFeatureImpl.cpp @@ -129,7 +129,7 @@ void RicSummaryPlotFeatureImpl::ensureAtLeastOnePlot( RimSummaryPlotCollection* { if ( summaryPlotCollection && summaryCase ) { - if ( summaryPlotCollection->summaryPlots.empty() ) + if ( summaryPlotCollection->plots().empty() ) { auto objectToSelect = createDefaultSummaryPlot( summaryCase ); if ( objectToSelect ) diff --git a/ApplicationCode/ProjectDataModel/AnalysisPlots/RimAnalysisPlot.h b/ApplicationCode/ProjectDataModel/AnalysisPlots/RimAnalysisPlot.h index 26a03c9c2c..1ffcf91923 100644 --- a/ApplicationCode/ProjectDataModel/AnalysisPlots/RimAnalysisPlot.h +++ b/ApplicationCode/ProjectDataModel/AnalysisPlots/RimAnalysisPlot.h @@ -135,7 +135,6 @@ private: void detachAllCurves() override; void reattachAllCurves() override {} - void doRemoveFromCollection() override {} void updateAxes() override; void onAxisSelected( int axis, bool toggle ) override; void updateZoomInQwt() override {} @@ -176,7 +175,7 @@ private: void buildTestPlot( RiuGroupedBarChartBuilder& chartBuilder ); int barTextFontSize() const; - void initAfterRead(); + void initAfterRead() override; private: void onCaseRemoved( const SignalEmitter* emitter, RimSummaryCase* summaryCase ); diff --git a/ApplicationCode/ProjectDataModel/AnalysisPlots/RimAnalysisPlotCollection.cpp b/ApplicationCode/ProjectDataModel/AnalysisPlots/RimAnalysisPlotCollection.cpp index 05c3ac6f4e..8a22dd054b 100644 --- a/ApplicationCode/ProjectDataModel/AnalysisPlots/RimAnalysisPlotCollection.cpp +++ b/ApplicationCode/ProjectDataModel/AnalysisPlots/RimAnalysisPlotCollection.cpp @@ -53,7 +53,7 @@ RimAnalysisPlot* RimAnalysisPlotCollection::createAnalysisPlot() applyFirstEnsembleFieldAddressesToPlot( plot, "FOPT" ); // plot->enableAutoPlotTitle( true ); - m_analysisPlots.push_back( plot ); + addPlot( plot ); plot->loadDataAndUpdate(); @@ -79,7 +79,7 @@ RimAnalysisPlot* RimAnalysisPlotCollection::createAnalysisPlot( RimSummaryCaseCo applyEnsembleFieldAndTimeStepToPlot( plot, ensemble, quantityName.toStdString(), timeStep ); // plot->enableAutoPlotTitle( true ); - m_analysisPlots.push_back( plot ); + addPlot( plot ); plot->loadDataAndUpdate(); @@ -106,15 +106,7 @@ void RimAnalysisPlotCollection::updateSummaryNameHasChanged() //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- -void RimAnalysisPlotCollection::removeSummaryPlot( RimAnalysisPlot* analysisPlot ) -{ - m_analysisPlots.removeChildObject( analysisPlot ); -} - -//-------------------------------------------------------------------------------------------------- -/// -//-------------------------------------------------------------------------------------------------- -std::vector RimAnalysisPlotCollection::plots() +std::vector RimAnalysisPlotCollection::plots() const { return m_analysisPlots.childObjects(); } @@ -122,9 +114,9 @@ std::vector RimAnalysisPlotCollection::plots() //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- -void RimAnalysisPlotCollection::deleteAllChildObjects() +size_t RimAnalysisPlotCollection::plotCount() const { - m_analysisPlots.deleteAllChildObjects(); + return m_analysisPlots.size(); } //-------------------------------------------------------------------------------------------------- @@ -156,6 +148,9 @@ void RimAnalysisPlotCollection::applyFirstEnsembleFieldAddressesToPlot( RimAnaly } } +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- void RimAnalysisPlotCollection::applyEnsembleFieldAndTimeStepToPlot( RimAnalysisPlot* plot, RimSummaryCaseCollection* ensemble, const std::string& quantityName, @@ -182,3 +177,19 @@ void RimAnalysisPlotCollection::applyEnsembleFieldAndTimeStepToPlot( RimAnalysis plot->setTimeSteps( {timeStep} ); } } + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RimAnalysisPlotCollection::insertPlot( RimAnalysisPlot* analysisPlot, size_t index ) +{ + m_analysisPlots.insert( index, analysisPlot ); +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RimAnalysisPlotCollection::removePlot( RimAnalysisPlot* analysisPlot ) +{ + m_analysisPlots.removeChildObject( analysisPlot ); +} diff --git a/ApplicationCode/ProjectDataModel/AnalysisPlots/RimAnalysisPlotCollection.h b/ApplicationCode/ProjectDataModel/AnalysisPlots/RimAnalysisPlotCollection.h index 5f5ee55e48..4bd80c39a4 100644 --- a/ApplicationCode/ProjectDataModel/AnalysisPlots/RimAnalysisPlotCollection.h +++ b/ApplicationCode/ProjectDataModel/AnalysisPlots/RimAnalysisPlotCollection.h @@ -18,19 +18,21 @@ #pragma once +#include "RimAbstractPlotCollection.h" +#include "RimAnalysisPlot.h" + #include "cafPdmChildArrayField.h" #include "cafPdmObject.h" #include -class RimAnalysisPlot; class RimSummaryCaseCollection; //================================================================================================== /// /// //================================================================================================== -class RimAnalysisPlotCollection : public caf::PdmObject +class RimAnalysisPlotCollection : public caf::PdmObject, public RimTypedPlotCollection { CAF_PDM_HEADER_INIT; @@ -43,11 +45,11 @@ public: createAnalysisPlot( RimSummaryCaseCollection* ensemble, const QString& quantityName, std::time_t timeStep ); void updateSummaryNameHasChanged(); - void removeSummaryPlot( RimAnalysisPlot* analysisPlot ); - std::vector plots(); - - void deleteAllChildObjects(); + std::vector plots() const final; + size_t plotCount() const final; + void insertPlot( RimAnalysisPlot* analysisPlot, size_t index ) final; + void removePlot( RimAnalysisPlot* analysisPlot ) final; private: void applyFirstEnsembleFieldAddressesToPlot( RimAnalysisPlot* plot, const std::string& quantityName = "" ); diff --git a/ApplicationCode/ProjectDataModel/CMakeLists_files.cmake b/ApplicationCode/ProjectDataModel/CMakeLists_files.cmake index e2f76a5ee0..6242635682 100644 --- a/ApplicationCode/ProjectDataModel/CMakeLists_files.cmake +++ b/ApplicationCode/ProjectDataModel/CMakeLists_files.cmake @@ -164,6 +164,7 @@ ${CMAKE_CURRENT_LIST_DIR}/RimElasticProperties.h ${CMAKE_CURRENT_LIST_DIR}/RimElasticPropertiesCurve.h ${CMAKE_CURRENT_LIST_DIR}/RimLayerCurve.h ${CMAKE_CURRENT_LIST_DIR}/RimFractureModelStressCurve.h +${CMAKE_CURRENT_LIST_DIR}/RimAbstractPlotCollection.h ${CMAKE_CURRENT_LIST_DIR}/RimFractureModelPropertyCurve.h ) diff --git a/ApplicationCode/ProjectDataModel/CorrelationPlots/RimAbstractCorrelationPlot.h b/ApplicationCode/ProjectDataModel/CorrelationPlots/RimAbstractCorrelationPlot.h index 67fa9cdfd9..c075afa7cb 100644 --- a/ApplicationCode/ProjectDataModel/CorrelationPlots/RimAbstractCorrelationPlot.h +++ b/ApplicationCode/ProjectDataModel/CorrelationPlots/RimAbstractCorrelationPlot.h @@ -98,7 +98,6 @@ protected: RiuQwtPlotWidget* doCreatePlotViewWidget( QWidget* mainWindowParent = nullptr ) override; void reattachAllCurves() override {} - void doRemoveFromCollection() override {} void updateZoomInQwt() override {} void updateZoomFromQwt() override {} void setAutoScaleXEnabled( bool enabled ) override {} diff --git a/ApplicationCode/ProjectDataModel/CorrelationPlots/RimCorrelationPlotCollection.cpp b/ApplicationCode/ProjectDataModel/CorrelationPlots/RimCorrelationPlotCollection.cpp index c307848eac..d5ae8aa8bd 100644 --- a/ApplicationCode/ProjectDataModel/CorrelationPlots/RimCorrelationPlotCollection.cpp +++ b/ApplicationCode/ProjectDataModel/CorrelationPlots/RimCorrelationPlotCollection.cpp @@ -59,7 +59,7 @@ RimCorrelationPlot* RimCorrelationPlotCollection::createCorrelationPlot( bool de if ( defaultToFirstEnsembleFopt ) applyFirstEnsembleFieldAddressesToPlot( plot, {"FOPT"} ); plot->selectAllParameters(); - m_correlationPlots.push_back( plot ); + addPlot( plot ); return plot; } @@ -77,7 +77,7 @@ RimCorrelationPlot* RimCorrelationPlotCollection::createCorrelationPlot( RimSumm applyEnsembleFieldAndTimeStepToPlot( plot, ensemble, {quantityName}, timeStep ); plot->selectAllParameters(); - m_correlationPlots.push_back( plot ); + addPlot( plot ); return plot; } @@ -92,7 +92,7 @@ RimCorrelationMatrixPlot* RimCorrelationPlotCollection::createCorrelationMatrixP if ( defaultToFirstEnsembleField ) applyFirstEnsembleFieldAddressesToPlot( plot, {"FOPT", "FWPT", "FGPT"} ); plot->selectAllParameters(); - m_correlationPlots.push_back( plot ); + addPlot( plot ); return plot; } @@ -109,7 +109,7 @@ RimCorrelationMatrixPlot* RimCorrelationPlotCollection::createCorrelationMatrixP applyEnsembleFieldAndTimeStepToPlot( plot, ensemble, quantityNames, timeStep ); plot->selectAllParameters(); - m_correlationPlots.push_back( plot ); + addPlot( plot ); return plot; } @@ -123,7 +123,7 @@ RimParameterResultCrossPlot* RimCorrelationPlotCollection::createParameterResult plot->setAsPlotMdiWindow(); if ( defaultToFirstEnsembleFopt ) applyFirstEnsembleFieldAddressesToPlot( plot, {"FOPT"} ); - m_correlationPlots.push_back( plot ); + addPlot( plot ); return plot; } @@ -140,7 +140,7 @@ RimParameterResultCrossPlot* RimCorrelationPlotCollection::createParameterResult applyEnsembleFieldAndTimeStepToPlot( plot, ensemble, {quantityName}, timeStep ); plot->setEnsembleParameter( paramName ); - m_correlationPlots.push_back( plot ); + addPlot( plot ); return plot; } @@ -181,15 +181,23 @@ RimCorrelationReportPlot* //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- -void RimCorrelationPlotCollection::removePlot( RimAbstractCorrelationPlot* correlationPlot ) +void RimCorrelationPlotCollection::insertPlot( RimAbstractCorrelationPlot* plot, size_t index ) { - m_correlationPlots.removeChildObject( correlationPlot ); + m_correlationPlots.insert( index, plot ); } //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- -std::vector RimCorrelationPlotCollection::plots() +void RimCorrelationPlotCollection::removePlot( RimAbstractCorrelationPlot* plot ) +{ + m_correlationPlots.removeChildObject( plot ); +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +std::vector RimCorrelationPlotCollection::plots() const { return m_correlationPlots.childObjects(); } @@ -197,7 +205,15 @@ std::vector RimCorrelationPlotCollection::plots() //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- -std::vector RimCorrelationPlotCollection::reports() +size_t RimCorrelationPlotCollection::plotCount() const +{ + return m_correlationPlots.size(); +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +std::vector RimCorrelationPlotCollection::reports() const { return m_correlationReports.childObjects(); } @@ -205,9 +221,9 @@ std::vector RimCorrelationPlotCollection::reports() //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- -void RimCorrelationPlotCollection::deleteAllChildObjects() +void RimCorrelationPlotCollection::deleteAllPlots() { - m_correlationPlots.deleteAllChildObjects(); + RimTypedPlotCollection::deleteAllPlots(); m_correlationReports.deleteAllChildObjects(); } diff --git a/ApplicationCode/ProjectDataModel/CorrelationPlots/RimCorrelationPlotCollection.h b/ApplicationCode/ProjectDataModel/CorrelationPlots/RimCorrelationPlotCollection.h index e3a9b7ebe4..13badc98cc 100644 --- a/ApplicationCode/ProjectDataModel/CorrelationPlots/RimCorrelationPlotCollection.h +++ b/ApplicationCode/ProjectDataModel/CorrelationPlots/RimCorrelationPlotCollection.h @@ -18,13 +18,15 @@ #pragma once +#include "RimAbstractCorrelationPlot.h" +#include "RimAbstractPlotCollection.h" + #include "cafPdmChildArrayField.h" #include "cafPdmObject.h" #include #include -class RimAbstractCorrelationPlot; class RimCorrelationPlot; class RimCorrelationMatrixPlot; class RimCorrelationReportPlot; @@ -35,7 +37,7 @@ class RimSummaryCaseCollection; /// /// //================================================================================================== -class RimCorrelationPlotCollection : public caf::PdmObject +class RimCorrelationPlotCollection : public caf::PdmObject, public RimTypedPlotCollection { CAF_PDM_HEADER_INIT; @@ -64,13 +66,15 @@ public: const QString& tornadoAndCrossPlotQuantityName, std::time_t timeStep ); - void removePlot( RimAbstractCorrelationPlot* correlationPlot ); void removeReport( RimCorrelationReportPlot* correlationReport ); - std::vector plots(); - std::vector reports(); + std::vector plots() const final; + size_t plotCount() const final; + void insertPlot( RimAbstractCorrelationPlot* plot, size_t index ) final; + void removePlot( RimAbstractCorrelationPlot* correlationPlot ) final; + void deleteAllPlots() final; - void deleteAllChildObjects(); + std::vector reports() const; private: void applyFirstEnsembleFieldAddressesToPlot( RimAbstractCorrelationPlot* plot, diff --git a/ApplicationCode/ProjectDataModel/Flow/RimWellDistributionPlot.cpp b/ApplicationCode/ProjectDataModel/Flow/RimWellDistributionPlot.cpp index ee54a89404..478e035e53 100644 --- a/ApplicationCode/ProjectDataModel/Flow/RimWellDistributionPlot.cpp +++ b/ApplicationCode/ProjectDataModel/Flow/RimWellDistributionPlot.cpp @@ -282,14 +282,6 @@ void RimWellDistributionPlot::zoomAll() // cvf::Trace::show("RimWellDistributionPlot::zoomAll()"); } -//-------------------------------------------------------------------------------------------------- -/// -//-------------------------------------------------------------------------------------------------- -void RimWellDistributionPlot::doRemoveFromCollection() -{ - // cvf::Trace::show("RimWellDistributionPlot::doRemoveFromCollection()"); -} - //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- diff --git a/ApplicationCode/ProjectDataModel/Flow/RimWellDistributionPlot.h b/ApplicationCode/ProjectDataModel/Flow/RimWellDistributionPlot.h index e30b4b7f28..f3e05d96ae 100644 --- a/ApplicationCode/ProjectDataModel/Flow/RimWellDistributionPlot.h +++ b/ApplicationCode/ProjectDataModel/Flow/RimWellDistributionPlot.h @@ -71,9 +71,6 @@ public: void zoomAll() override; private: - // RimPlot implementations - void doRemoveFromCollection() override; - // RimViewWindow implementations void deleteViewWidget() override; void onLoadDataAndUpdate() override; diff --git a/ApplicationCode/ProjectDataModel/GridCrossPlots/RimGridCrossPlot.cpp b/ApplicationCode/ProjectDataModel/GridCrossPlots/RimGridCrossPlot.cpp index ba107fab25..5b2d2d1f5a 100644 --- a/ApplicationCode/ProjectDataModel/GridCrossPlots/RimGridCrossPlot.cpp +++ b/ApplicationCode/ProjectDataModel/GridCrossPlots/RimGridCrossPlot.cpp @@ -391,20 +391,6 @@ void RimGridCrossPlot::onAxisSelected( int axis, bool toggle ) } } -//-------------------------------------------------------------------------------------------------- -/// -//-------------------------------------------------------------------------------------------------- -void RimGridCrossPlot::doRemoveFromCollection() -{ - RimGridCrossPlotCollection* crossPlotCollection = nullptr; - this->firstAncestorOrThisOfType( crossPlotCollection ); - if ( crossPlotCollection ) - { - crossPlotCollection->removeGridCrossPlot( this ); - crossPlotCollection->updateAllRequiredEditors(); - } -} - //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- diff --git a/ApplicationCode/ProjectDataModel/GridCrossPlots/RimGridCrossPlot.h b/ApplicationCode/ProjectDataModel/GridCrossPlots/RimGridCrossPlot.h index f75e9e0eda..fa6f2a7166 100644 --- a/ApplicationCode/ProjectDataModel/GridCrossPlots/RimGridCrossPlot.h +++ b/ApplicationCode/ProjectDataModel/GridCrossPlots/RimGridCrossPlot.h @@ -141,7 +141,6 @@ private: void doUpdateLayout() override; void cleanupBeforeClose(); - void doRemoveFromCollection() override; QString generateInfoBoxText() const; void connectAxisSignals( RimPlotAxisProperties* axis ); diff --git a/ApplicationCode/ProjectDataModel/GridCrossPlots/RimGridCrossPlotCollection.cpp b/ApplicationCode/ProjectDataModel/GridCrossPlots/RimGridCrossPlotCollection.cpp index 6b2a571cb4..ea846e60a8 100644 --- a/ApplicationCode/ProjectDataModel/GridCrossPlots/RimGridCrossPlotCollection.cpp +++ b/ApplicationCode/ProjectDataModel/GridCrossPlots/RimGridCrossPlotCollection.cpp @@ -43,17 +43,17 @@ RimGridCrossPlotCollection::~RimGridCrossPlotCollection() //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- -void RimGridCrossPlotCollection::deleteAllChildObjects() +std::vector RimGridCrossPlotCollection::plots() const { - m_gridCrossPlots.deleteAllChildObjects(); + return m_gridCrossPlots.childObjects(); } //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- -std::vector RimGridCrossPlotCollection::gridCrossPlots() const +size_t RimGridCrossPlotCollection::plotCount() const { - return m_gridCrossPlots.childObjects(); + return m_gridCrossPlots.size(); } //-------------------------------------------------------------------------------------------------- @@ -65,22 +65,22 @@ RimGridCrossPlot* RimGridCrossPlotCollection::createGridCrossPlot() plot->setAsPlotMdiWindow(); // plot->setDescription(QString("Summary Cross Plot %1").arg(m_gridCrossPlots.size())); - addGridCrossPlot( plot ); + addPlot( plot ); return plot; } //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- -void RimGridCrossPlotCollection::addGridCrossPlot( RimGridCrossPlot* plot ) +void RimGridCrossPlotCollection::insertPlot( RimGridCrossPlot* plot, size_t index ) { - m_gridCrossPlots().push_back( plot ); + m_gridCrossPlots.insert( index, plot ); } //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- -void RimGridCrossPlotCollection::removeGridCrossPlot( RimGridCrossPlot* plot ) +void RimGridCrossPlotCollection::removePlot( RimGridCrossPlot* plot ) { m_gridCrossPlots.removeChildObject( plot ); } diff --git a/ApplicationCode/ProjectDataModel/GridCrossPlots/RimGridCrossPlotCollection.h b/ApplicationCode/ProjectDataModel/GridCrossPlots/RimGridCrossPlotCollection.h index cc7d98fb09..57e8a3618a 100644 --- a/ApplicationCode/ProjectDataModel/GridCrossPlots/RimGridCrossPlotCollection.h +++ b/ApplicationCode/ProjectDataModel/GridCrossPlots/RimGridCrossPlotCollection.h @@ -17,16 +17,17 @@ ///////////////////////////////////////////////////////////////////////////////// #pragma once +#include "RimAbstractPlotCollection.h" +#include "RimGridCrossPlot.h" + #include "cafPdmChildArrayField.h" #include "cafPdmObject.h" -class RimGridCrossPlot; - //================================================================================================== /// /// //================================================================================================== -class RimGridCrossPlotCollection : public caf::PdmObject +class RimGridCrossPlotCollection : public caf::PdmObject, public RimTypedPlotCollection { CAF_PDM_HEADER_INIT; @@ -34,12 +35,12 @@ public: RimGridCrossPlotCollection(); ~RimGridCrossPlotCollection() override; - void deleteAllChildObjects(); + std::vector plots() const final; + size_t plotCount() const final; + void insertPlot( RimGridCrossPlot* plot, size_t index ) final; + void removePlot( RimGridCrossPlot* plot ) final; - std::vector gridCrossPlots() const; - RimGridCrossPlot* createGridCrossPlot(); - void addGridCrossPlot( RimGridCrossPlot* plot ); - void removeGridCrossPlot( RimGridCrossPlot* plot ); + RimGridCrossPlot* createGridCrossPlot(); private: caf::PdmChildArrayField m_gridCrossPlots; diff --git a/ApplicationCode/ProjectDataModel/GridCrossPlots/RimSaturationPressurePlotCollection.cpp b/ApplicationCode/ProjectDataModel/GridCrossPlots/RimSaturationPressurePlotCollection.cpp index 5081315df1..0a2f0c590d 100644 --- a/ApplicationCode/ProjectDataModel/GridCrossPlots/RimSaturationPressurePlotCollection.cpp +++ b/ApplicationCode/ProjectDataModel/GridCrossPlots/RimSaturationPressurePlotCollection.cpp @@ -108,11 +108,19 @@ std::vector //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- -std::vector RimSaturationPressurePlotCollection::plots() +std::vector RimSaturationPressurePlotCollection::plots() const { return m_saturationPressurePlots.childObjects(); } +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +size_t RimSaturationPressurePlotCollection::plotCount() const +{ + return m_saturationPressurePlots.size(); +} + //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- diff --git a/ApplicationCode/ProjectDataModel/GridCrossPlots/RimSaturationPressurePlotCollection.h b/ApplicationCode/ProjectDataModel/GridCrossPlots/RimSaturationPressurePlotCollection.h index 334863966c..183a079217 100644 --- a/ApplicationCode/ProjectDataModel/GridCrossPlots/RimSaturationPressurePlotCollection.h +++ b/ApplicationCode/ProjectDataModel/GridCrossPlots/RimSaturationPressurePlotCollection.h @@ -38,7 +38,8 @@ public: std::vector createSaturationPressurePlots( RimEclipseResultCase* eclipseResultCase, int timeStep ); - std::vector plots(); + std::vector plots() const; + size_t plotCount() const; void deleteAllChildObjects(); private: diff --git a/ApplicationCode/ProjectDataModel/RimAbstractPlotCollection.h b/ApplicationCode/ProjectDataModel/RimAbstractPlotCollection.h new file mode 100644 index 0000000000..f6785dcfae --- /dev/null +++ b/ApplicationCode/ProjectDataModel/RimAbstractPlotCollection.h @@ -0,0 +1,68 @@ +///////////////////////////////////////////////////////////////////////////////// +// +// Copyright (C) 2020- 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 +// for more details. +// +///////////////////////////////////////////////////////////////////////////////// +#pragma once + +#include "RimPlot.h" + +#include "cafPdmObject.h" + +class RimAbstractPlotCollection +{ +public: + virtual ~RimAbstractPlotCollection() = default; + + virtual size_t plotCount() const = 0; + virtual void deleteAllPlots() = 0; + virtual void removeRimPlot( RimPlot* plot ) = 0; +}; + +//================================================================================================== +/// Templated Base class of all plot collections. +/// Specialize on plot type (has to derive from RimPlot) and the base class of the collection. +//================================================================================================== +template +class RimTypedPlotCollection : public RimAbstractPlotCollection +{ + static_assert( std::is_base_of::value, "RimPlotType must inherit from RimPlot" ); + +public: + ~RimTypedPlotCollection() override = default; + + virtual std::vector plots() const = 0; + + void deleteAllPlots() override + { + for ( auto plot : plots() ) + { + removePlot( plot ); + delete plot; + } + } + + void addPlot( RimPlotType* plot ) { insertPlot( plot, plotCount() ); } + virtual void insertPlot( RimPlotType* plot, size_t index ) = 0; + virtual void removePlot( RimPlotType* plot ) = 0; + void removeRimPlot( RimPlot* rimPlot ) + { + auto typedPlot = dynamic_cast( rimPlot ); + if ( typedPlot ) + { + removePlot( typedPlot ); + } + } +}; \ No newline at end of file diff --git a/ApplicationCode/ProjectDataModel/RimDepthTrackPlot.cpp b/ApplicationCode/ProjectDataModel/RimDepthTrackPlot.cpp index 2e181d3932..e795b6492f 100644 --- a/ApplicationCode/ProjectDataModel/RimDepthTrackPlot.cpp +++ b/ApplicationCode/ProjectDataModel/RimDepthTrackPlot.cpp @@ -214,52 +214,6 @@ QString RimDepthTrackPlot::description() const return m_plotWindowTitle; } -//-------------------------------------------------------------------------------------------------- -/// -//-------------------------------------------------------------------------------------------------- -void RimDepthTrackPlot::addPlot( RimPlot* plot ) -{ - insertPlot( plot, m_plots.size() ); -} - -//-------------------------------------------------------------------------------------------------- -/// -//-------------------------------------------------------------------------------------------------- -void RimDepthTrackPlot::insertPlot( RimPlot* plot, size_t index ) -{ - if ( plot ) - { - m_plots.insert( index, plot ); - - if ( m_viewer ) - { - plot->createPlotWidget(); - m_viewer->insertPlot( plot->viewer(), index ); - } - plot->setShowWindow( true ); - plot->setLegendsVisible( false ); - - onPlotAdditionOrRemoval(); - } -} - -//-------------------------------------------------------------------------------------------------- -/// -//-------------------------------------------------------------------------------------------------- -void RimDepthTrackPlot::removePlot( RimPlot* plot ) -{ - if ( plot ) - { - if ( m_viewer ) - { - m_viewer->removePlot( plot->viewer() ); - } - m_plots.removeChildObject( plot ); - - onPlotAdditionOrRemoval(); - } -} - //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- @@ -755,7 +709,6 @@ void RimDepthTrackPlot::onPlotsReordered( const SignalEmitter* emitter ) recreatePlotWidgets(); loadDataAndUpdate(); } - //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- @@ -945,7 +898,6 @@ void RimDepthTrackPlot::initAfterRead() { m_nameConfig->setCustomName( m_plotWindowTitle ); } - performAutoNameUpdate(); } @@ -1001,6 +953,44 @@ caf::PdmFieldHandle* RimDepthTrackPlot::userDescriptionField() return &m_plotWindowTitle; } +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RimDepthTrackPlot::insertPlot( RimPlot* plot, size_t index ) +{ + if ( plot ) + { + m_plots.insert( index, plot ); + + if ( m_viewer ) + { + plot->createPlotWidget(); + m_viewer->insertPlot( plot->viewer(), index ); + } + plot->setShowWindow( true ); + plot->setLegendsVisible( false ); + + onPlotAdditionOrRemoval(); + } +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RimDepthTrackPlot::removePlot( RimPlot* plot ) +{ + if ( plot ) + { + if ( m_viewer ) + { + m_viewer->removePlot( plot->viewer() ); + } + m_plots.removeChildObject( plot ); + + onPlotAdditionOrRemoval(); + } +} + //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- @@ -1129,6 +1119,9 @@ void RimDepthTrackPlot::setDepthUnit( RiaDefines::DepthUnitType depthUnit ) updateLayout(); } +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- void RimDepthTrackPlot::onChildDeleted( caf::PdmChildArrayFieldHandle* childArray, std::vector& referringObjects ) { diff --git a/ApplicationCode/ProjectDataModel/RimDepthTrackPlot.h b/ApplicationCode/ProjectDataModel/RimDepthTrackPlot.h index 7933a9c334..89ec129fa2 100644 --- a/ApplicationCode/ProjectDataModel/RimDepthTrackPlot.h +++ b/ApplicationCode/ProjectDataModel/RimDepthTrackPlot.h @@ -19,6 +19,11 @@ #pragma once +#include "RiaDefines.h" +#include "RimAbstractPlotCollection.h" +#include "RimPlotWindow.h" +#include "RimWellLogPlotNameConfig.h" + #include "cafAppEnum.h" #include "cafPdmChildArrayField.h" #include "cafPdmChildField.h" @@ -26,10 +31,6 @@ #include "cafPdmFieldHandle.h" #include "cafPdmObject.h" -#include "RiaDefines.h" -#include "RimPlotWindow.h" -#include "RimWellLogPlotNameConfig.h" - #include #include @@ -43,7 +44,7 @@ class QKeyEvent; /// /// //================================================================================================== -class RimDepthTrackPlot : public RimPlotWindow, public RimNameConfigHolderInterface +class RimDepthTrackPlot : public RimTypedPlotCollection, public RimPlotWindow, public RimNameConfigHolderInterface { CAF_PDM_HEADER_INIT; @@ -69,16 +70,14 @@ public: QWidget* createPlotWidget( QWidget* mainWindowParent = nullptr ); QString description() const override; - void addPlot( RimPlot* plot ); - void insertPlot( RimPlot* plot, size_t index ); - void removePlot( RimPlot* plot ); - - size_t plotCount() const; + size_t plotCount() const override; size_t plotIndex( const RimPlot* plot ) const; RimPlot* plotByIndex( size_t index ) const; - std::vector plots() const; + std::vector plots() const override; std::vector visiblePlots() const; + void insertPlot( RimPlot* plot, size_t index ) final; + void removePlot( RimPlot* plot ) final; DepthTypeEnum depthType() const; void setDepthType( DepthTypeEnum depthType ); @@ -154,7 +153,7 @@ private: void onPlotAdditionOrRemoval(); void doRenderWindowContent( QPaintDevice* paintDevice ) override; void doUpdateLayout() override; - void onPlotsReordered( const SignalEmitter* emitter ); + void onPlotsReordered( const caf::SignalEmitter* emitter ); protected: caf::PdmChildField m_commonDataSource; diff --git a/ApplicationCode/ProjectDataModel/RimMainPlotCollection.cpp b/ApplicationCode/ProjectDataModel/RimMainPlotCollection.cpp index da8a2cfc73..2b71e036d2 100644 --- a/ApplicationCode/ProjectDataModel/RimMainPlotCollection.cpp +++ b/ApplicationCode/ProjectDataModel/RimMainPlotCollection.cpp @@ -240,14 +240,14 @@ void RimMainPlotCollection::deleteAllContainedObjects() m_wellLogPlotCollection()->wellLogPlots.deleteAllChildObjects(); m_rftPlotCollection()->deleteAllPlots(); m_pltPlotCollection()->deleteAllPlots(); - m_summaryPlotCollection()->summaryPlots.deleteAllChildObjects(); - m_summaryCrossPlotCollection()->deleteAllChildObjects(); - m_gridCrossPlotCollection->deleteAllChildObjects(); + m_summaryPlotCollection()->deleteAllPlots(); + m_summaryCrossPlotCollection()->deleteAllPlots(); + m_gridCrossPlotCollection->deleteAllPlots(); m_flowPlotCollection()->closeDefaultPlotWindowAndDeletePlots(); m_saturationPressurePlotCollection()->deleteAllChildObjects(); m_multiPlotCollection()->deleteAllChildObjects(); - m_analysisPlotCollection()->deleteAllChildObjects(); - m_correlationPlotCollection()->deleteAllChildObjects(); + m_analysisPlotCollection()->deleteAllPlots(); + m_correlationPlotCollection()->deleteAllPlots(); m_fractureModelPlotCollection()->deleteAllPlots(); } @@ -295,7 +295,7 @@ void RimMainPlotCollection::updatePlotsWithFormations() if ( m_gridCrossPlotCollection ) { - for ( RimGridCrossPlot* crossPlot : m_gridCrossPlotCollection->gridCrossPlots() ) + for ( RimGridCrossPlot* crossPlot : m_gridCrossPlotCollection->plots() ) { crossPlot->loadDataAndUpdate(); } diff --git a/ApplicationCode/ProjectDataModel/RimPlot.cpp b/ApplicationCode/ProjectDataModel/RimPlot.cpp index 38ced8f36d..31fbf715bb 100644 --- a/ApplicationCode/ProjectDataModel/RimPlot.cpp +++ b/ApplicationCode/ProjectDataModel/RimPlot.cpp @@ -1,6 +1,8 @@ #include "RimPlot.h" #include "RicfCommandObject.h" + +#include "RimAbstractPlotCollection.h" #include "RimMultiPlot.h" #include "RimPlotCurve.h" #include "RimPlotWindow.h" @@ -124,7 +126,13 @@ void RimPlot::removeFromMdiAreaAndCollection() { revokeMdiWindowStatus(); } - doRemoveFromCollection(); + + RimAbstractPlotCollection* plotCollection = nullptr; + this->firstAncestorOfType( plotCollection ); + if ( plotCollection ) + { + plotCollection->removeRimPlot( this ); + } } //-------------------------------------------------------------------------------------------------- diff --git a/ApplicationCode/ProjectDataModel/RimPlot.h b/ApplicationCode/ProjectDataModel/RimPlot.h index bedd2fbb00..d39500efaf 100644 --- a/ApplicationCode/ProjectDataModel/RimPlot.h +++ b/ApplicationCode/ProjectDataModel/RimPlot.h @@ -101,7 +101,6 @@ protected: void updateFonts() override; private: - virtual void doRemoveFromCollection() = 0; virtual void doRenderWindowContent( QPaintDevice* paintDevice ) override; virtual void handleKeyPressEvent( QKeyEvent* event ) {} virtual void handleWheelEvent( QWheelEvent* event ) {} diff --git a/ApplicationCode/ProjectDataModel/RimReloadCaseTools.cpp b/ApplicationCode/ProjectDataModel/RimReloadCaseTools.cpp index 85cdad7544..0d15c52b34 100644 --- a/ApplicationCode/ProjectDataModel/RimReloadCaseTools.cpp +++ b/ApplicationCode/ProjectDataModel/RimReloadCaseTools.cpp @@ -159,7 +159,7 @@ void RimReloadCaseTools::updateAllPlots() RimSummaryPlotCollection* summaryPlotCollection = project->mainPlotCollection()->summaryPlotCollection(); if ( summaryPlotCollection ) { - for ( RimSummaryPlot* summaryPlot : summaryPlotCollection->summaryPlots() ) + for ( RimSummaryPlot* summaryPlot : summaryPlotCollection->plots() ) { summaryPlot->loadDataAndUpdate(); } @@ -168,7 +168,7 @@ void RimReloadCaseTools::updateAllPlots() RimGridCrossPlotCollection* gridCrossPlotCollection = project->mainPlotCollection()->gridCrossPlotCollection(); if ( gridCrossPlotCollection ) { - for ( RimGridCrossPlot* crossPlot : gridCrossPlotCollection->gridCrossPlots() ) + for ( RimGridCrossPlot* crossPlot : gridCrossPlotCollection->plots() ) { crossPlot->loadDataAndUpdate(); } diff --git a/ApplicationCode/ProjectDataModel/RimSummaryCalculation.cpp b/ApplicationCode/ProjectDataModel/RimSummaryCalculation.cpp index cac66ba364..b2be657067 100644 --- a/ApplicationCode/ProjectDataModel/RimSummaryCalculation.cpp +++ b/ApplicationCode/ProjectDataModel/RimSummaryCalculation.cpp @@ -475,7 +475,7 @@ void RimSummaryCalculation::updateDependentCurvesAndPlots() calcColl->rebuildCaseMetaData(); RimSummaryPlotCollection* summaryPlotCollection = RiaSummaryTools::summaryPlotCollection(); - for ( RimSummaryPlot* sumPlot : summaryPlotCollection->summaryPlots() ) + for ( RimSummaryPlot* sumPlot : summaryPlotCollection->plots() ) { bool plotContainsCalculatedCurves = false; diff --git a/ApplicationCode/ProjectDataModel/RimWellLogTrack.cpp b/ApplicationCode/ProjectDataModel/RimWellLogTrack.cpp index e0710c085c..76800875ad 100644 --- a/ApplicationCode/ProjectDataModel/RimWellLogTrack.cpp +++ b/ApplicationCode/ProjectDataModel/RimWellLogTrack.cpp @@ -518,19 +518,6 @@ int RimWellLogTrack::axisFontSize() const return caf::FontTools::absolutePointSize( RiaPreferences::current()->defaultPlotFontSize(), m_axisFontSize() ); } -//-------------------------------------------------------------------------------------------------- -/// -//-------------------------------------------------------------------------------------------------- -void RimWellLogTrack::doRemoveFromCollection() -{ - RimDepthTrackPlot* wellLogPlot = nullptr; - this->firstAncestorOrThisOfType( wellLogPlot ); - if ( wellLogPlot ) - { - wellLogPlot->removePlot( this ); - } -} - //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- diff --git a/ApplicationCode/ProjectDataModel/RimWellLogTrack.h b/ApplicationCode/ProjectDataModel/RimWellLogTrack.h index 4038063be2..a808aefb9e 100644 --- a/ApplicationCode/ProjectDataModel/RimWellLogTrack.h +++ b/ApplicationCode/ProjectDataModel/RimWellLogTrack.h @@ -247,8 +247,6 @@ private: int axisFontSize() const; - void doRemoveFromCollection() override; - void fieldChangedByUi( const caf::PdmFieldHandle* changedField, const QVariant& oldValue, const QVariant& newValue ) override; void curveDataChanged( const caf::SignalEmitter* emitter ); void curveVisibilityChanged( const caf::SignalEmitter* emitter, bool visible ); diff --git a/ApplicationCode/ProjectDataModel/Summary/RimSummaryCrossPlotCollection.cpp b/ApplicationCode/ProjectDataModel/Summary/RimSummaryCrossPlotCollection.cpp index df80eddcb0..83618b8cb7 100644 --- a/ApplicationCode/ProjectDataModel/Summary/RimSummaryCrossPlotCollection.cpp +++ b/ApplicationCode/ProjectDataModel/Summary/RimSummaryCrossPlotCollection.cpp @@ -48,7 +48,7 @@ RimSummaryCrossPlotCollection::~RimSummaryCrossPlotCollection() //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- -void RimSummaryCrossPlotCollection::deleteAllChildObjects() +void RimSummaryCrossPlotCollection::deleteAllPlots() { m_summaryCrossPlots.deleteAllChildObjects(); } @@ -56,11 +56,19 @@ void RimSummaryCrossPlotCollection::deleteAllChildObjects() //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- -std::vector RimSummaryCrossPlotCollection::summaryPlots() const +std::vector RimSummaryCrossPlotCollection::plots() const { return m_summaryCrossPlots.childObjects(); } +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +size_t RimSummaryCrossPlotCollection::plotCount() const +{ + return m_summaryCrossPlots.size(); +} + //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- @@ -86,6 +94,22 @@ void RimSummaryCrossPlotCollection::summaryPlotItemInfos( QList { CAF_PDM_HEADER_INIT; @@ -35,11 +36,14 @@ public: RimSummaryCrossPlotCollection(); ~RimSummaryCrossPlotCollection() override; - void deleteAllChildObjects(); + void deleteAllPlots() final; - std::vector summaryPlots() const; - RimSummaryPlot* createSummaryPlot(); - void addSummaryPlot( RimSummaryPlot* plot ); + std::vector plots() const final; + size_t plotCount() const final; + void insertPlot( RimSummaryPlot* plot, size_t index ) final; + void removePlot( RimSummaryPlot* plot ) final; + + RimSummaryPlot* createSummaryPlot(); void updateSummaryNameHasChanged(); void summaryPlotItemInfos( QList* optionInfos ) const; diff --git a/ApplicationCode/ProjectDataModel/Summary/RimSummaryCurve.h b/ApplicationCode/ProjectDataModel/Summary/RimSummaryCurve.h index cb214f9b3c..51a707a9eb 100644 --- a/ApplicationCode/ProjectDataModel/Summary/RimSummaryCurve.h +++ b/ApplicationCode/ProjectDataModel/Summary/RimSummaryCurve.h @@ -106,7 +106,7 @@ protected: void updateLegendsInPlot() override; void defineUiTreeOrdering( caf::PdmUiTreeOrdering& uiTreeOrdering, QString uiConfigName = "" ) override; - void initAfterRead(); + void initAfterRead() override; private: RifSummaryReaderInterface* valuesSummaryReaderX() const; diff --git a/ApplicationCode/ProjectDataModel/Summary/RimSummaryPlot.cpp b/ApplicationCode/ProjectDataModel/Summary/RimSummaryPlot.cpp index 2eda6f15d7..97818eb640 100644 --- a/ApplicationCode/ProjectDataModel/Summary/RimSummaryPlot.cpp +++ b/ApplicationCode/ProjectDataModel/Summary/RimSummaryPlot.cpp @@ -1735,20 +1735,6 @@ void RimSummaryPlot::axisLogarithmicChanged( const caf::SignalEmitter* emitter, loadDataAndUpdate(); } -//-------------------------------------------------------------------------------------------------- -/// -//-------------------------------------------------------------------------------------------------- -void RimSummaryPlot::doRemoveFromCollection() -{ - RimSummaryPlotCollection* summaryCollection = nullptr; - this->firstAncestorOrThisOfType( summaryCollection ); - if ( summaryCollection ) - { - summaryCollection->removeSummaryPlot( this ); - summaryCollection->updateAllRequiredEditors(); - } -} - //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- diff --git a/ApplicationCode/ProjectDataModel/Summary/RimSummaryPlot.h b/ApplicationCode/ProjectDataModel/Summary/RimSummaryPlot.h index 9e6775e953..b291cc6881 100644 --- a/ApplicationCode/ProjectDataModel/Summary/RimSummaryPlot.h +++ b/ApplicationCode/ProjectDataModel/Summary/RimSummaryPlot.h @@ -190,7 +190,6 @@ private: void detachAllPlotItems(); - void doRemoveFromCollection() override; void handleKeyPressEvent( QKeyEvent* keyEvent ) override; void onCurvesReordered( const SignalEmitter* emitter ); diff --git a/ApplicationCode/ProjectDataModel/Summary/RimSummaryPlotCollection.cpp b/ApplicationCode/ProjectDataModel/Summary/RimSummaryPlotCollection.cpp index 0526e7bbf9..1db449cdf1 100644 --- a/ApplicationCode/ProjectDataModel/Summary/RimSummaryPlotCollection.cpp +++ b/ApplicationCode/ProjectDataModel/Summary/RimSummaryPlotCollection.cpp @@ -39,9 +39,9 @@ RimSummaryPlotCollection::RimSummaryPlotCollection() { CAF_PDM_InitScriptableObject( "Summary Plots", ":/SummaryPlotsLight16x16.png", "", "" ); - CAF_PDM_InitFieldNoDefault( &summaryPlots, "SummaryPlots", "Summary Plots", "", "", "" ); - summaryPlots.uiCapability()->setUiHidden( true ); - caf::PdmFieldReorderCapability::addToField( &summaryPlots ); + CAF_PDM_InitFieldNoDefault( &m_summaryPlots, "SummaryPlots", "Summary Plots", "", "", "" ); + m_summaryPlots.uiCapability()->setUiHidden( true ); + caf::PdmFieldReorderCapability::addToField( &m_summaryPlots ); } //-------------------------------------------------------------------------------------------------- @@ -49,7 +49,6 @@ RimSummaryPlotCollection::RimSummaryPlotCollection() //-------------------------------------------------------------------------------------------------- RimSummaryPlotCollection::~RimSummaryPlotCollection() { - summaryPlots.deleteAllChildObjects(); } //-------------------------------------------------------------------------------------------------- @@ -61,7 +60,8 @@ RimSummaryPlot* RimSummaryPlotCollection::createSummaryPlotWithAutoTitle() plot->setAsPlotMdiWindow(); plot->enableAutoPlotTitle( true ); - summaryPlots.push_back( plot ); + + addPlot( plot ); return plot; } @@ -74,7 +74,8 @@ RimSummaryPlot* RimSummaryPlotCollection::createNamedSummaryPlot( const QString& RimSummaryPlot* plot = new RimSummaryPlot(); plot->setAsPlotMdiWindow(); - summaryPlots.push_back( plot ); + addPlot( plot ); + plot->setDescription( name ); return plot; @@ -85,7 +86,7 @@ RimSummaryPlot* RimSummaryPlotCollection::createNamedSummaryPlot( const QString& //-------------------------------------------------------------------------------------------------- void RimSummaryPlotCollection::updateSummaryNameHasChanged() { - for ( RimSummaryPlot* plot : summaryPlots ) + for ( RimSummaryPlot* plot : plots() ) { plot->updateCaseNameHasChanged(); } @@ -96,21 +97,13 @@ void RimSummaryPlotCollection::updateSummaryNameHasChanged() //-------------------------------------------------------------------------------------------------- void RimSummaryPlotCollection::summaryPlotItemInfos( QList* optionInfos ) const { - for ( RimSummaryPlot* plot : summaryPlots() ) + for ( RimSummaryPlot* plot : plots() ) { QString displayName = plot->description(); optionInfos->push_back( caf::PdmOptionItemInfo( displayName, plot, false, plot->uiCapability()->uiIconProvider() ) ); } } -//-------------------------------------------------------------------------------------------------- -/// -//-------------------------------------------------------------------------------------------------- -void RimSummaryPlotCollection::removeSummaryPlot( RimSummaryPlot* summaryPlot ) -{ - summaryPlots.removeChildObject( summaryPlot ); -} - //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- @@ -121,3 +114,35 @@ void RimSummaryPlotCollection::onChildDeleted( caf::PdmChildArrayFieldHandle* RiuPlotMainWindow* mainPlotWindow = RiaGuiApplication::instance()->mainPlotWindow(); mainPlotWindow->updateSummaryPlotToolBar(); } + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +std::vector RimSummaryPlotCollection::plots() const +{ + return m_summaryPlots.childObjects(); +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +size_t RimSummaryPlotCollection::plotCount() const +{ + return m_summaryPlots.size(); +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RimSummaryPlotCollection::insertPlot( RimSummaryPlot* summaryPlot, size_t index ) +{ + m_summaryPlots.insert( index, summaryPlot ); +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RimSummaryPlotCollection::removePlot( RimSummaryPlot* summaryPlot ) +{ + m_summaryPlots.removeChildObject( summaryPlot ); +} diff --git a/ApplicationCode/ProjectDataModel/Summary/RimSummaryPlotCollection.h b/ApplicationCode/ProjectDataModel/Summary/RimSummaryPlotCollection.h index 84571883d8..93ce7f6ec9 100644 --- a/ApplicationCode/ProjectDataModel/Summary/RimSummaryPlotCollection.h +++ b/ApplicationCode/ProjectDataModel/Summary/RimSummaryPlotCollection.h @@ -18,6 +18,9 @@ #pragma once +#include "RimAbstractPlotCollection.h" +#include "RimSummaryPlot.h" + #include "cafPdmChildArrayField.h" #include "cafPdmObject.h" #include "cafPdmPtrArrayField.h" @@ -28,7 +31,7 @@ class RimSummaryPlot; /// /// //================================================================================================== -class RimSummaryPlotCollection : public caf::PdmObject +class RimSummaryPlotCollection : public caf::PdmObject, public RimTypedPlotCollection { CAF_PDM_HEADER_INIT; @@ -36,16 +39,19 @@ public: RimSummaryPlotCollection(); ~RimSummaryPlotCollection() override; - caf::PdmChildArrayField summaryPlots; - RimSummaryPlot* createSummaryPlotWithAutoTitle(); RimSummaryPlot* createNamedSummaryPlot( const QString& name ); void updateSummaryNameHasChanged(); void summaryPlotItemInfos( QList* optionInfos ) const; - - void removeSummaryPlot( RimSummaryPlot* summaryPlot ); - void onChildDeleted( caf::PdmChildArrayFieldHandle* childArray, std::vector& referringObjects ) override; + + std::vector plots() const final; + size_t plotCount() const final; + void insertPlot( RimSummaryPlot* summaryPlot, size_t index ) final; + void removePlot( RimSummaryPlot* summaryPlot ) final; + +private: + caf::PdmChildArrayField m_summaryPlots; }; diff --git a/Fwk/AppFwk/cafProjectDataModel/cafPdmCore/cafSignal.h b/Fwk/AppFwk/cafProjectDataModel/cafPdmCore/cafSignal.h index 75adee3daf..61c6a99661 100644 --- a/Fwk/AppFwk/cafProjectDataModel/cafPdmCore/cafSignal.h +++ b/Fwk/AppFwk/cafProjectDataModel/cafPdmCore/cafSignal.h @@ -150,7 +150,8 @@ public: void send( Args... args ) const { - for ( auto observerCallbackPair : m_observerCallbacks ) + auto observerCallBacksCopy = m_observerCallbacks; + for ( auto observerCallbackPair : observerCallBacksCopy ) { if ( observerCallbackPair.second.second ) {