diff src/Analyser.cpp @ 242:3cb56556db72

Discard layer pointers when their layers are deleted; package up some more actions into compound commands
author Chris Cannam
date Tue, 01 Apr 2014 13:17:53 +0100
parents d40c6cdb30a4
children 3ff0f36c8fc1
line wrap: on
line diff
--- a/src/Analyser.cpp	Mon Mar 31 10:20:21 2014 +0100
+++ b/src/Analyser.cpp	Tue Apr 01 13:17:53 2014 +0100
@@ -75,6 +75,9 @@
     m_paneStack = paneStack;
     m_pane = pane;
 
+    connect(doc, SIGNAL(layerAboutToBeDeleted(Layer *)),
+            this, SLOT(layerAboutToBeDeleted(Layer *)));
+
     m_reAnalysingSelection = Selection();
     m_reAnalysisCandidates.clear();
     m_currentCandidate = -1;
@@ -128,6 +131,7 @@
 {
     if (!m_layers[Spectrogram]) return false;
     m_layers[Spectrogram]->setDisplayExtents(min, max);
+    return true;
 }
 
 QString
@@ -534,10 +538,18 @@
 void
 Analyser::discardPitchCandidates()
 {
-    foreach (Layer *layer, m_reAnalysisCandidates) {
-        // This will cause the layer to be deleted later (ownership is
-        // transferred to the remove command)
-        m_document->removeLayerFromView(m_pane, layer);
+    if (!m_reAnalysisCandidates.empty()) {
+
+        CommandHistory::getInstance()->startCompoundOperation
+            (tr("Discard Previous Candidates"), true);
+
+        foreach (Layer *layer, m_reAnalysisCandidates) {
+            // This will cause the layer to be deleted later (ownership is
+            // transferred to the remove command)
+            m_document->removeLayerFromView(m_pane, layer);
+        }
+
+        CommandHistory::getInstance()->endCompoundOperation();
     }
 
     m_reAnalysisCandidates.clear();
@@ -547,6 +559,22 @@
 }
 
 void
+Analyser::layerAboutToBeDeleted(Layer *doomed)
+{
+    cerr << "Analyser::layerAboutToBeDeleted(" << doomed << ")" << endl;
+    
+    vector<Layer *> notDoomed;
+
+    foreach (Layer *layer, m_reAnalysisCandidates) {
+        if (layer != doomed) {
+            notDoomed.push_back(layer);
+        }
+    }
+
+    m_reAnalysisCandidates = notDoomed;
+}
+
+void
 Analyser::takePitchTrackFrom(Layer *otherLayer)
 {
     Layer *myLayer = m_layers[PitchTrack];