# 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