# HG changeset patch # User Chris Cannam # Date 1488210210 0 # Node ID 770f80d9cceea48f61f737b76f1a37d3845533c2 # Parent 246876022b354c7b83f819f8816b8c0cd628caba Invalidate an aggregate model when one of its components announces it's about to be deleted diff -r 246876022b35 -r 770f80d9ccee data/model/AggregateWaveModel.cpp --- 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; } diff -r 246876022b35 -r 770f80d9ccee data/model/AggregateWaveModel.h --- a/data/model/AggregateWaveModel.h Mon Feb 27 15:06:17 2017 +0000 +++ b/data/model/AggregateWaveModel.h Mon Feb 27 15:43:30 2017 +0000 @@ -84,10 +84,12 @@ void componentModelChanged(); void componentModelChangedWithin(sv_frame_t, sv_frame_t); void componentModelCompletionChanged(); + void componentModelAboutToBeDeleted(); protected: ChannelSpecList m_components; static PowerOfSqrtTwoZoomConstraint m_zoomConstraint; + bool m_invalidated; // because one of its component models is aboutToBeDeleted }; #endif