Mercurial > hg > svgui
changeset 349:369a197737c7
* Various fixes to object lifetime management, particularly in the spectrum
layer and for notification of main model deletion.
The main purpose of this is to improve the behaviour of the spectrum, but I
think it may also help with #1840922 Various crashes in Layer Summary window.
author | Chris Cannam |
---|---|
date | Wed, 23 Jan 2008 15:43:27 +0000 |
parents | 0093f351641c |
children | 3a55cd576334 |
files | layer/LayerFactory.cpp layer/SpectrumLayer.cpp layer/SpectrumLayer.h |
diffstat | 3 files changed, 47 insertions(+), 34 deletions(-) [+] |
line wrap: on
line diff
--- a/layer/LayerFactory.cpp Wed Jan 23 11:38:34 2008 +0000 +++ b/layer/LayerFactory.cpp Wed Jan 23 15:43:27 2008 +0000 @@ -350,6 +350,10 @@ dynamic_cast<SpectrogramLayer *>(layer)->setChannel(channel); return; } + if (dynamic_cast<SpectrumLayer *>(layer)) { + dynamic_cast<SpectrumLayer *>(layer)->setChannel(channel); + return; + } } Layer *
--- a/layer/SpectrumLayer.cpp Wed Jan 23 11:38:34 2008 +0000 +++ b/layer/SpectrumLayer.cpp Wed Jan 23 15:43:27 2008 +0000 @@ -47,8 +47,11 @@ SpectrumLayer::~SpectrumLayer() { - //!!! delete parent's model -// for (size_t i = 0; i < m_fft.size(); ++i) delete m_fft[i]; + Model *m = const_cast<Model *> + (static_cast<const Model *>(m_sliceableModel)); + m->aboutToDelete(); + m_sliceableModel = 0; + delete m; } void @@ -57,27 +60,43 @@ std::cerr << "SpectrumLayer::setModel(" << model << ") from " << m_originModel << std::endl; if (m_originModel == model) return; + m_originModel = model; - if (m_sliceableModel) { - const Model *oldModel = m_sliceableModel; - setSliceableModel(0); - // surprised I'm allowed to delete a const pointer -- may be a - // source of future compiler rejection? - delete oldModel; - } -//!!! setupFFT(); + m_newFFTNeeded = true; + + emit layerParametersChanged(); +} + +void +SpectrumLayer::setChannel(int channel) +{ + std::cerr << "SpectrumLayer::setChannel(" << channel << ") from " << m_channel << std::endl; + + m_channelSet = true; + + if (m_channel == channel) return; + + m_channel = channel; + + m_newFFTNeeded = true; + + emit layerParametersChanged(); } void SpectrumLayer::setupFFT() { - FFTModel *oldFFT = dynamic_cast<FFTModel *> - (const_cast<DenseThreeDimensionalModel *>(m_sliceableModel)); - - if (oldFFT) { + if (m_sliceableModel) { + Model *m = const_cast<Model *> + (static_cast<const Model *>(m_sliceableModel)); + m->aboutToDelete(); setSliceableModel(0); - delete oldFFT; + delete m; + } + + if (!m_originModel) { + return; } FFTModel *newFFT = new FFTModel(m_originModel, @@ -99,24 +118,8 @@ } newFFT->resume(); -} -void -SpectrumLayer::setChannel(int channel) -{ - m_channelSet = true; - - FFTModel *fft = dynamic_cast<FFTModel *> - (const_cast<DenseThreeDimensionalModel *>(m_sliceableModel)); - - if (m_channel == channel) { - if (fft) fft->resume(); - return; - } - - m_channel = channel; - - emit layerParametersChanged(); + m_newFFTNeeded = false; } Layer::PropertyList @@ -642,11 +645,14 @@ SpectrumLayer::paint(View *v, QPainter &paint, QRect rect) const { if (!m_originModel || !m_originModel->isOK() || - !m_originModel->isReady()) return; + !m_originModel->isReady()) { + std::cerr << "SpectrumLayer::paint: no origin model" << std::endl; + return; + } if (m_newFFTNeeded) { + std::cerr << "SpectrumLayer::paint: new FFT needed, calling setupFFT" << std::endl; const_cast<SpectrumLayer *>(this)->setupFFT(); //ugh - m_newFFTNeeded = false; } FFTModel *fft = dynamic_cast<FFTModel *>
--- a/layer/SpectrumLayer.h Wed Jan 23 11:38:34 2008 +0000 +++ b/layer/SpectrumLayer.h Wed Jan 23 15:43:27 2008 +0000 @@ -24,6 +24,7 @@ #include "data/model/DenseTimeValueModel.h" #include <QColor> +#include <QMutex> class FFTModel; @@ -113,6 +114,8 @@ bool m_showPeaks; mutable bool m_newFFTNeeded; + mutable QMutex m_fftMutex; + void setupFFT(); virtual void getBiasCurve(BiasCurve &) const;