Mercurial > hg > svcore
diff data/model/AggregateWaveModel.cpp @ 1389:770f80d9ccee
Invalidate an aggregate model when one of its components announces it's about to be deleted
author | Chris Cannam |
---|---|
date | Mon, 27 Feb 2017 15:43:30 +0000 |
parents | 54af1e21705c |
children | 1a572937ed8c |
line wrap: on
line diff
--- a/data/model/AggregateWaveModel.cpp Mon Feb 27 15:06:17 2017 +0000 +++ b/data/model/AggregateWaveModel.cpp Mon Feb 27 15:43:30 2017 +0000 @@ -25,10 +25,15 @@ AggregateWaveModel::m_zoomConstraint; AggregateWaveModel::AggregateWaveModel(ChannelSpecList channelSpecs) : - m_components(channelSpecs) + m_components(channelSpecs), + m_invalidated(false) { for (ChannelSpecList::const_iterator i = channelSpecs.begin(); i != channelSpecs.end(); ++i) { + + connect(i->model, SIGNAL(aboutToBeDeleted()), + this, SLOT(componentModelAboutToBeDeleted())); + if (i->model->getSampleRate() != channelSpecs.begin()->model->getSampleRate()) { SVDEBUG << "AggregateWaveModel::AggregateWaveModel: WARNING: Component models do not all have the same sample rate" << endl; @@ -41,12 +46,26 @@ { } +void +AggregateWaveModel::componentModelAboutToBeDeleted() +{ + SVDEBUG << "AggregateWaveModel::componentModelAboutToBeDeleted: invalidating" + << endl; + m_components.clear(); + m_invalidated = true; +} + bool AggregateWaveModel::isOK() const { + if (m_invalidated) { + return false; + } for (ChannelSpecList::const_iterator i = m_components.begin(); i != m_components.end(); ++i) { - if (!i->model->isOK()) return false; + if (!i->model->isOK()) { + return false; + } } return true; } @@ -55,6 +74,7 @@ AggregateWaveModel::isReady(int *completion) const { if (completion) *completion = 100; + bool ready = true; for (ChannelSpecList::const_iterator i = m_components.begin(); i != m_components.end(); ++i) { @@ -71,13 +91,12 @@ AggregateWaveModel::getFrameCount() const { sv_frame_t count = 0; - for (ChannelSpecList::const_iterator i = m_components.begin(); i != m_components.end(); ++i) { - sv_frame_t thisCount = i->model->getEndFrame() - i->model->getStartFrame(); + sv_frame_t thisCount = + i->model->getEndFrame() - i->model->getStartFrame(); if (thisCount > count) count = thisCount; } - return count; }