From f996b5383adead3513f9727283ccf5aa56d17bc9 Mon Sep 17 00:00:00 2001 From: Kristian Bendiksen Date: Mon, 17 Jan 2022 15:22:27 +0100 Subject: [PATCH] #8453 Fix crash when changing plot type (QtCharts <-> Qwt). --- .../ProjectDataModel/RimPlotCurve.cpp | 7 +++++- .../ProjectDataModel/RimPlotCurve.h | 2 +- .../Summary/RimEnsembleCurveSet.cpp | 4 ++-- .../Summary/RimEnsembleCurveSet.h | 2 +- .../Summary/RimSummaryPlot.cpp | 23 +++++++++++++++++++ 5 files changed, 33 insertions(+), 5 deletions(-) diff --git a/ApplicationLibCode/ProjectDataModel/RimPlotCurve.cpp b/ApplicationLibCode/ProjectDataModel/RimPlotCurve.cpp index 6249b67cc1..4a51cbe128 100644 --- a/ApplicationLibCode/ProjectDataModel/RimPlotCurve.cpp +++ b/ApplicationLibCode/ProjectDataModel/RimPlotCurve.cpp @@ -1011,11 +1011,16 @@ void RimPlotCurve::attach( RiuPlotWidget* plotWidget ) //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- -void RimPlotCurve::detach() +void RimPlotCurve::detach( bool deletePlotCurve ) { if ( m_plotCurve ) { m_plotCurve->detach(); + if ( deletePlotCurve ) + { + delete m_plotCurve; + m_plotCurve = nullptr; + } } replotParentPlot(); diff --git a/ApplicationLibCode/ProjectDataModel/RimPlotCurve.h b/ApplicationLibCode/ProjectDataModel/RimPlotCurve.h index fac7435d08..fb034ad6c4 100644 --- a/ApplicationLibCode/ProjectDataModel/RimPlotCurve.h +++ b/ApplicationLibCode/ProjectDataModel/RimPlotCurve.h @@ -122,7 +122,7 @@ public: void setParentPlotAndReplot( RiuPlotWidget* ); void attach( RiuPlotWidget* ); - void detach(); + void detach( bool deletePlotCurve = false ); void reattach(); bool isSameCurve( const RiuPlotCurve* plotCurve ) const; diff --git a/ApplicationLibCode/ProjectDataModel/Summary/RimEnsembleCurveSet.cpp b/ApplicationLibCode/ProjectDataModel/Summary/RimEnsembleCurveSet.cpp index 0a027bf986..2973996fd1 100644 --- a/ApplicationLibCode/ProjectDataModel/Summary/RimEnsembleCurveSet.cpp +++ b/ApplicationLibCode/ProjectDataModel/Summary/RimEnsembleCurveSet.cpp @@ -310,11 +310,11 @@ void RimEnsembleCurveSet::setParentPlotNoReplot( RiuPlotWidget* plot ) //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- -void RimEnsembleCurveSet::detachPlotCurves() +void RimEnsembleCurveSet::detachPlotCurves( bool deletePlotCurve ) { for ( RimSummaryCurve* curve : m_curves ) { - curve->detach(); + curve->detach( deletePlotCurve ); } if ( m_plotCurveForLegendText ) diff --git a/ApplicationLibCode/ProjectDataModel/Summary/RimEnsembleCurveSet.h b/ApplicationLibCode/ProjectDataModel/Summary/RimEnsembleCurveSet.h index d8a648104e..2bb87b6688 100644 --- a/ApplicationLibCode/ProjectDataModel/Summary/RimEnsembleCurveSet.h +++ b/ApplicationLibCode/ProjectDataModel/Summary/RimEnsembleCurveSet.h @@ -95,7 +95,7 @@ public: void loadDataAndUpdate( bool updateParentPlot ); void setParentPlotNoReplot( RiuPlotWidget* plot ); - void detachPlotCurves(); + void detachPlotCurves( bool deletePlotCurve = false ); void reattachPlotCurves(); void addCurve( RimSummaryCurve* curve ); diff --git a/ApplicationLibCode/ProjectDataModel/Summary/RimSummaryPlot.cpp b/ApplicationLibCode/ProjectDataModel/Summary/RimSummaryPlot.cpp index 235bbce5a3..7923819e2f 100644 --- a/ApplicationLibCode/ProjectDataModel/Summary/RimSummaryPlot.cpp +++ b/ApplicationLibCode/ProjectDataModel/Summary/RimSummaryPlot.cpp @@ -1525,6 +1525,29 @@ void RimSummaryPlot::fieldChangedByUi( const caf::PdmFieldHandle* changedField, } } +#ifdef USE_QTCHARTS + if ( changedField == &m_useQtChartsPlot ) + { + // Hide window + setShowWindow( false ); + + // Detach and destroy plot curves + for ( auto c : summaryCurves() ) + { + c->detach( true ); + } + + for ( auto& curveSet : this->ensembleCurveSetCollection()->curveSets() ) + { + curveSet->detachPlotCurves( true ); + } + + // Destroy viewer + removeMdiWindowFromMdiArea(); + cleanupBeforeClose(); + } +#endif + if ( changedField == &m_normalizeCurveYValues ) { this->loadDataAndUpdate();