changeset 194:34797795a76c

Clearing the selection by hitting Esc now restores the selected region of the pitch track to its contents from before the selection was made (and any alternate candidate chosen). Fixes feature #885
author Chris Cannam
date Wed, 05 Mar 2014 10:38:23 +0000
parents abfbe8c2883b
children 797395e56489
files .hgsubstate src/Analyser.cpp src/Analyser.h src/MainWindow.cpp src/MainWindow.h
diffstat 5 files changed, 44 insertions(+), 15 deletions(-) [+]
line wrap: on
line diff
--- a/.hgsubstate	Wed Mar 05 09:45:17 2014 +0000
+++ b/.hgsubstate	Wed Mar 05 10:38:23 2014 +0000
@@ -1,5 +1,5 @@
 236814e07bd07473958c1ff89103124536a0c3c8 dataquay
 27d4e7152c954bf3c4387319db088fb3cd02436b sv-dependency-builds
-151b7c5864e3dc05832b1d2ef496b9e4987a4dba svapp
+0c37405cf579c6cc87f5199044c2117baa977023 svapp
 d81c16e47e22b1c1a6600d3e9a8e0559fad8b539 svcore
 f831ca41d4a556cbc75aa5a180cf1e6a8d5598b5 svgui
--- a/src/Analyser.cpp	Wed Mar 05 09:45:17 2014 +0000
+++ b/src/Analyser.cpp	Wed Mar 05 10:38:23 2014 +0000
@@ -255,9 +255,16 @@
 {
     if (sel == m_reAnalysingSelection) return "";
 
-    clearReAnalysis();
+    showPitchCandidates(false);
+    m_reAnalysisCandidates.clear();
+    m_currentCandidate = -1;
+    m_reAnalysingSelection = sel;
 
-    m_reAnalysingSelection = sel;
+    m_preAnalysis = Clipboard();
+    Layer *myLayer = m_layers[PitchTrack];
+    if (myLayer) {
+        myLayer->copy(m_pane, sel, m_preAnalysis);
+    }
 
     TransformFactory *tf = TransformFactory::getInstance();
     
@@ -441,15 +448,18 @@
 }
 
 void
-Analyser::clearReAnalysis()
+Analyser::clearReAnalysis(Selection sel)
 {
-    foreach (Layer *layer, m_reAnalysisCandidates) {
-        m_document->removeLayerFromView(m_pane, layer);
-        m_document->deleteLayer(layer); // also releases its model
-    }
+    showPitchCandidates(false);
+
     m_reAnalysisCandidates.clear();
     m_reAnalysingSelection = Selection();
     m_currentCandidate = -1;
+
+    Layer *myLayer = m_layers[PitchTrack];
+    if (!myLayer) return;
+    myLayer->deleteSelection(sel);
+    myLayer->paste(m_pane, m_preAnalysis, 0, false);
 }    
 
 void
--- a/src/Analyser.h	Wed Mar 05 09:45:17 2014 +0000
+++ b/src/Analyser.h	Wed Mar 05 10:38:23 2014 +0000
@@ -24,6 +24,7 @@
 
 #include "framework/Document.h"
 #include "base/Selection.h"
+#include "base/Clipboard.h"
 
 class WaveFileModel;
 class Pane;
@@ -108,6 +109,8 @@
      * independent of whether any pitch candidates actually exist --
      * it's possible they might be shown but not have been created yet
      * because creation (through reAnalyseSelection) is asynchronous.
+     *
+     *!!! this interface is not right
      */
     bool arePitchCandidatesShown() const;
 
@@ -116,6 +119,8 @@
      * arePitchCandidatesShown, this is independent of whether the
      * candidate layers actually exist. Call reAnalyseSelection to
      * schedule creation of those layers.
+     *
+     *!!! this interface is not right
      */
     void showPitchCandidates(bool shown);
 
@@ -139,9 +144,12 @@
     void shiftOctave(Selection sel, bool up);
 
     /**
-     * Remove any re-analysis layers.
+     * Remove any re-analysis layers (equivalent to
+     * showPitchCandidates(false)) and also reset the pitch track in
+     * the given selection to its state prior to the last re-analysis,
+     * abandoning any changes made since then.
      */
-    void clearReAnalysis();
+    void clearReAnalysis(Selection sel);
 
     /**
      * Import the pitch track from the given layer into our
@@ -168,6 +176,7 @@
 
     mutable std::map<Component, Layer *> m_layers;
 
+    Clipboard m_preAnalysis;
     Selection m_reAnalysingSelection;
     std::vector<Layer *> m_reAnalysisCandidates;
     int m_currentCandidate;
--- a/src/MainWindow.cpp	Wed Mar 05 09:45:17 2014 +0000
+++ b/src/MainWindow.cpp	Wed Mar 05 10:38:23 2014 +0000
@@ -528,7 +528,7 @@
     action = new QAction(tr("C&lear Selection"), this);
     action->setShortcut(tr("Esc"));
     action->setStatusTip(tr("Clear the selection"));
-    connect(action, SIGNAL(triggered()), this, SLOT(clearSelection()));
+    connect(action, SIGNAL(triggered()), this, SLOT(abandonSelection()));
     connect(this, SIGNAL(canClearSelection(bool)), action, SLOT(setEnabled(bool)));
     m_keyReference->registerShortcut(action);
     menu->addAction(action);
@@ -1771,13 +1771,23 @@
 }
 
 void
-MainWindow::clearSelection()
+MainWindow::abandonSelection()
 {
-    cerr << "MainWindow::clearSelection()" << endl;
+    // Named abandonSelection rather than clearSelection to indicate
+    // that this is an active operation -- it restores the original
+    // content of the pitch track in the selected region rather than
+    // simply un-selecting.
+
+    cerr << "MainWindow::abandonSelection()" << endl;
 
     CommandHistory::getInstance()->startCompoundOperation(tr("Clear Selection"), true);
 
-    m_analyser->clearReAnalysis();
+    MultiSelection::SelectionList selections = m_viewManager->getSelections();
+    if (!selections.empty()) {
+        Selection sel = *selections.begin();
+        m_analyser->clearReAnalysis(sel);
+    }
+
     MainWindowBase::clearSelection();
 
     CommandHistory::getInstance()->endCompoundOperation();
--- a/src/MainWindow.h	Wed Mar 05 09:45:17 2014 +0000
+++ b/src/MainWindow.h	Wed Mar 05 10:38:23 2014 +0000
@@ -69,7 +69,7 @@
     virtual void playNotesToggled();
 
     virtual void doubleClickSelectInvoked(size_t);
-    virtual void clearSelection();
+    virtual void abandonSelection();
 
     virtual void paneAdded(Pane *);
     virtual void paneHidden(Pane *);