Mercurial > hg > tony
diff src/MainWindow.cpp @ 192:431a95c9d14d
Calculate frequency constraint for region outlining (does not actually do the analysis correctly yet)
author | Chris Cannam |
---|---|
date | Wed, 05 Mar 2014 09:36:13 +0000 |
parents | add7468a7ca1 |
children | 34797795a76c |
line wrap: on
line diff
--- a/src/MainWindow.cpp Tue Mar 04 16:45:54 2014 +0000 +++ b/src/MainWindow.cpp Wed Mar 05 09:36:13 2014 +0000 @@ -34,6 +34,7 @@ #include "layer/WaveformLayer.h" #include "layer/TimeInstantLayer.h" #include "layer/TimeValueLayer.h" +#include "layer/SpectrogramLayer.h" #include "widgets/Fader.h" #include "view/Overview.h" #include "widgets/AudioDial.h" @@ -150,8 +151,8 @@ m_viewManager->setShowCentreLine(false); m_viewManager->setOverlayMode(ViewManager::MinimalOverlays); - connect(m_viewManager, SIGNAL(selectionChanged()), - this, SLOT(selectionChanged())); + connect(m_viewManager, SIGNAL(selectionChangedByUser()), + this, SLOT(selectionChangedByUser())); QFrame *frame = new QFrame; setCentralWidget(frame); @@ -1783,24 +1784,65 @@ } void -MainWindow::selectionChanged() +MainWindow::selectionChangedByUser() { MultiSelection::SelectionList selections = m_viewManager->getSelections(); - cerr << "MainWindow::selectionChanged" << endl; - - m_analyser->showPitchCandidates(false); + cerr << "MainWindow::selectionChangedByUser" << endl; + + m_analyser->showPitchCandidates(m_pendingConstraint.isConstrained()); if (!selections.empty()) { Selection sel = *selections.begin(); - cerr << "MainWindow::selectionChanged: have selection" << endl; - QString error = m_analyser->reAnalyseSelection(sel); + cerr << "MainWindow::selectionChangedByUser: have selection" << endl; + QString error = m_analyser->reAnalyseSelection + (sel, m_pendingConstraint); if (error != "") { QMessageBox::critical (this, tr("Failed to analyse selection"), tr("<b>Analysis failed</b><p>%2</p>").arg(error)); } } + + m_pendingConstraint = Analyser::FrequencyRange(); +} + +void +MainWindow::regionOutlined(QRect r) +{ + cerr << "MainWindow::regionOutlined(" << r.x() << "," << r.y() << "," << r.width() << "," << r.height() << ")" << endl; + + Pane *pane = qobject_cast<Pane *>(sender()); + if (!pane) { + cerr << "MainWindow::regionOutlined: not sent by pane, ignoring" << endl; + return; + } + + if (!m_analyser) { + cerr << "MainWindow::regionOutlined: no analyser, ignoring" << endl; + return; + } + + SpectrogramLayer *spectrogram = qobject_cast<SpectrogramLayer *> + (m_analyser->getLayer(Analyser::Spectrogram)); + if (!spectrogram) { + cerr << "MainWindow::regionOutlined: no spectrogram layer, ignoring" << endl; + return; + } + + int f0 = pane->getFrameForX(r.x()); + int f1 = pane->getFrameForX(r.x() + r.width()); + + float v0 = spectrogram->getFrequencyForY(pane, r.y() + r.height()); + float v1 = spectrogram->getFrequencyForY(pane, r.y()); + + cerr << "MainWindow::regionOutlined: frame " << f0 << " -> " << f1 + << ", frequency " << v0 << " -> " << v1 << endl; + + m_pendingConstraint = Analyser::FrequencyRange(v0, v1); + + Selection sel(f0, f1); + m_viewManager->setSelection(sel); } void @@ -2355,6 +2397,12 @@ } if (pane) { + + disconnect(pane, SIGNAL(regionOutlined(QRect)), + pane, SLOT(zoomToRegion(QRect))); + connect(pane, SIGNAL(regionOutlined(QRect)), + this, SLOT(regionOutlined(QRect))); + QString error = m_analyser->newFileLoaded (m_document, getMainModel(), m_paneStack, pane); if (error != "") {