changeset 240:6ac45eb0f4c7

Implement "Form Note from Selection"; remove Snap Notes to Pitch Track because every other editing operation *should* now be doing that automatically
author Chris Cannam
date Thu, 27 Mar 2014 18:12:38 +0000
parents d40c6cdb30a4
children 322287c4ed1f
files .hgsubstate src/MainWindow.cpp src/MainWindow.h
diffstat 3 files changed, 44 insertions(+), 25 deletions(-) [+]
line wrap: on
line diff
--- a/.hgsubstate	Thu Mar 27 18:02:12 2014 +0000
+++ b/.hgsubstate	Thu Mar 27 18:12:38 2014 +0000
@@ -4,4 +4,4 @@
 27d4e7152c954bf3c4387319db088fb3cd02436b sv-dependency-builds
 3144af512ea3447e6cf1775f02b5b54b5a5ddeb5 svapp
 0c8218b2d84a172049d966c82c2064f5aa59c503 svcore
-84e4cf88965959a34e8675138d6bef66ad5ec261 svgui
+03423269a9d0c39b0ad2e39bd9435d0a353546ce svgui
--- a/src/MainWindow.cpp	Thu Mar 27 18:02:12 2014 +0000
+++ b/src/MainWindow.cpp	Thu Mar 27 18:12:38 2014 +0000
@@ -591,17 +591,16 @@
     menu->addSeparator();
     m_rightButtonMenu->addSeparator();
     
-    action = new QAction(tr("Split Notes at Selection Boundaries"), this);
+    action = new QAction(tr("Split Note"), this);
     action->setShortcut(tr("Ctrl+/"));
-    action->setStatusTip(tr("If any notes overlap the start or end of the selected region, split them at those points"));
+    action->setStatusTip(tr("Split the note at the current playback position into two"));
     m_keyReference->registerShortcut(action);
-    connect(action, SIGNAL(triggered()), this, SLOT(splitNotesAtSelection()));
-    connect(this, SIGNAL(canSnapNotes(bool)), action, SLOT(setEnabled(bool)));
+    connect(action, SIGNAL(triggered()), this, SLOT(splitNote()));
+    connect(this, SIGNAL(canExportNotes(bool)), action, SLOT(setEnabled(bool)));
     menu->addAction(action);
     m_rightButtonMenu->addAction(action);
 
     action = new QAction(tr("Merge Notes"), this);
-    action->setShortcut(tr("Ctrl+."));
     action->setStatusTip(tr("Merge all notes within the selected region into a single note"));
     m_keyReference->registerShortcut(action);
     connect(action, SIGNAL(triggered()), this, SLOT(mergeNotes()));
@@ -609,6 +608,14 @@
     menu->addAction(action);
     m_rightButtonMenu->addAction(action);
     
+    action = new QAction(tr("Form Note from Selection"), this);
+    action->setStatusTip(tr("Form a note spanning the selected region, splitting any existing notes at its boundaries"));
+    m_keyReference->registerShortcut(action);
+    connect(action, SIGNAL(triggered()), this, SLOT(formNoteFromSelection()));
+    connect(this, SIGNAL(canSnapNotes(bool)), action, SLOT(setEnabled(bool)));
+    menu->addAction(action);
+    m_rightButtonMenu->addAction(action);
+/*    
     action = new QAction(tr("Snap Notes to Pitch Track"), this);
     action->setShortcut(tr("Ctrl+="));
     action->setStatusTip(tr("Set notes within the selected region to the median frequency of their underlying pitches, or remove them if there are no underlying pitches"));
@@ -617,7 +624,7 @@
     connect(this, SIGNAL(canSnapNotes(bool)), action, SLOT(setEnabled(bool)));
     menu->addAction(action);
     m_rightButtonMenu->addAction(action);
-    
+*/    
 }
 
 void
@@ -2097,27 +2104,13 @@
 }    
 
 void
-MainWindow::splitNotesAtSelection()
+MainWindow::splitNote()
 {
     FlexiNoteLayer *layer =
         qobject_cast<FlexiNoteLayer *>(m_analyser->getLayer(Analyser::Notes));
     if (!layer) return;
 
-    MultiSelection::SelectionList selections = m_viewManager->getSelections();
-
-    if (!selections.empty()) {
-
-        CommandHistory::getInstance()->startCompoundOperation
-            (tr("Split Notes at Selection Boundaries"), true);
-                
-        for (MultiSelection::SelectionList::iterator k = selections.begin();
-             k != selections.end(); ++k) {
-            layer->splitNotesAt(m_analyser->getPane(), k->getStartFrame());
-            layer->splitNotesAt(m_analyser->getPane(), k->getEndFrame());
-        }
-        
-        CommandHistory::getInstance()->endCompoundOperation();
-    }
+    layer->splitNotesAt(m_analyser->getPane(), m_viewManager->getPlaybackFrame());
 }
 
 void
@@ -2136,7 +2129,7 @@
                 
         for (MultiSelection::SelectionList::iterator k = selections.begin();
              k != selections.end(); ++k) {
-            layer->mergeNotes(m_analyser->getPane(), *k);
+            layer->mergeNotes(m_analyser->getPane(), *k, true);
         }
         
         CommandHistory::getInstance()->endCompoundOperation();
@@ -2144,6 +2137,31 @@
 }
 
 void
+MainWindow::formNoteFromSelection()
+{
+    FlexiNoteLayer *layer =
+        qobject_cast<FlexiNoteLayer *>(m_analyser->getLayer(Analyser::Notes));
+    if (!layer) return;
+
+    MultiSelection::SelectionList selections = m_viewManager->getSelections();
+
+    if (!selections.empty()) {
+    
+        CommandHistory::getInstance()->startCompoundOperation
+            (tr("Form Note from Selection"), true);
+                
+        for (MultiSelection::SelectionList::iterator k = selections.begin();
+             k != selections.end(); ++k) {
+            layer->splitNotesAt(m_analyser->getPane(), k->getStartFrame());
+            layer->splitNotesAt(m_analyser->getPane(), k->getEndFrame());
+            layer->mergeNotes(m_analyser->getPane(), *k, false);
+        }
+
+        CommandHistory::getInstance()->endCompoundOperation();
+    }
+}
+
+void
 MainWindow::playSpeedChanged(int position)
 {
     PlaySpeedRangeMapper mapper(0, 200);
--- a/src/MainWindow.h	Thu Mar 27 18:02:12 2014 +0000
+++ b/src/MainWindow.h	Thu Mar 27 18:12:38 2014 +0000
@@ -60,8 +60,9 @@
     virtual void switchPitchDown();
 
     virtual void snapNotesToPitches();
-    virtual void splitNotesAtSelection();
+    virtual void splitNote();
     virtual void mergeNotes();
+    virtual void formNoteFromSelection();
 
     virtual void showAudioToggled();
     virtual void showSpectToggled();