changeset 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 322287c4ed1f
children 3ff0f36c8fc1
files .hgsubstate src/Analyser.cpp src/Analyser.h
diffstat 3 files changed, 40 insertions(+), 9 deletions(-) [+]
line wrap: on
line diff
--- a/.hgsubstate	Mon Mar 31 10:20:21 2014 +0100
+++ b/.hgsubstate	Tue Apr 01 13:17:53 2014 +0100
@@ -1,6 +1,6 @@
 0ca7c7e21991b7cf5c6c4306af64280947d0b357 chp
 236814e07bd07473958c1ff89103124536a0c3c8 dataquay
-60eb8771d34050e3bed8e715f5fcd0275de469ef pyin
+8180299e50873655869e3ee51390099632033a43 pyin
 27d4e7152c954bf3c4387319db088fb3cd02436b sv-dependency-builds
 3144af512ea3447e6cf1775f02b5b54b5a5ddeb5 svapp
 0c8218b2d84a172049d966c82c2064f5aa59c503 svcore
--- 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];
--- a/src/Analyser.h	Mon Mar 31 10:20:21 2014 +0100
+++ b/src/Analyser.h	Tue Apr 01 13:17:53 2014 +0100
@@ -55,10 +55,10 @@
     bool setDisplayFrequencyExtents(float min, float max);
 
     enum Component {
-        Audio,
-        PitchTrack,
-        Notes,
-        Spectrogram,
+        Audio = 0,
+        PitchTrack = 1,
+        Notes = 2,
+        Spectrogram = 3,
     };
 
     bool isVisible(Component c) const;
@@ -192,6 +192,9 @@
 signals:
     void layersChanged();
 
+protected slots:
+    void layerAboutToBeDeleted(Layer *);
+
 protected:
     Document *m_document;
     WaveFileModel *m_fileModel;