comparison src/MainWindow.cpp @ 402:a0eedd10dee3 cxx11-types

Merge from default branch
author Chris Cannam
date Mon, 23 Mar 2015 10:33:32 +0000
parents ffd1a89a68fa bed6493c3042
children cc33cdb114f6
comparison
equal deleted inserted replaced
400:4b9b7ff3f19c 402:a0eedd10dee3
86 #include <errno.h> 86 #include <errno.h>
87 87
88 using std::vector; 88 using std::vector;
89 89
90 90
91 MainWindow::MainWindow(bool withAudioOutput) : 91 MainWindow::MainWindow(bool withAudioOutput, bool withSonification, bool withSpectrogram) :
92 MainWindowBase(withAudioOutput, false), 92 MainWindowBase(withAudioOutput, false),
93 m_overview(0), 93 m_overview(0),
94 m_mainMenusCreated(false), 94 m_mainMenusCreated(false),
95 m_playbackMenu(0), 95 m_playbackMenu(0),
96 m_recentFilesMenu(0), 96 m_recentFilesMenu(0),
100 m_ffwdAction(0), 100 m_ffwdAction(0),
101 m_rwdAction(0), 101 m_rwdAction(0),
102 m_intelligentActionOn(true), //GF: !!! temporary 102 m_intelligentActionOn(true), //GF: !!! temporary
103 m_activityLog(new ActivityLog()), 103 m_activityLog(new ActivityLog()),
104 m_keyReference(new KeyReference()), 104 m_keyReference(new KeyReference()),
105 m_selectionAnchor(0) 105 m_selectionAnchor(0),
106 m_withSonification(withSonification),
107 m_withSpectrogram(withSpectrogram)
106 { 108 {
107 setWindowTitle(QApplication::applicationName()); 109 setWindowTitle(QApplication::applicationName());
108 110
109 #ifdef Q_OS_MAC 111 #ifdef Q_OS_MAC
110 #if (QT_VERSION >= QT_VERSION_CHECK(5, 2, 0)) 112 #if (QT_VERSION >= QT_VERSION_CHECK(5, 2, 0))
158 m_viewManager->setAlignMode(false); 160 m_viewManager->setAlignMode(false);
159 m_viewManager->setPlaySoloMode(false); 161 m_viewManager->setPlaySoloMode(false);
160 m_viewManager->setToolMode(ViewManager::NavigateMode); 162 m_viewManager->setToolMode(ViewManager::NavigateMode);
161 m_viewManager->setZoomWheelsEnabled(false); 163 m_viewManager->setZoomWheelsEnabled(false);
162 m_viewManager->setIlluminateLocalFeatures(true); 164 m_viewManager->setIlluminateLocalFeatures(true);
163 m_viewManager->setShowWorkTitle(true); 165 m_viewManager->setShowWorkTitle(false);
164 m_viewManager->setShowCentreLine(false); 166 m_viewManager->setShowCentreLine(false);
167 m_viewManager->setShowDuration(false);
165 m_viewManager->setOverlayMode(ViewManager::GlobalOverlays); 168 m_viewManager->setOverlayMode(ViewManager::GlobalOverlays);
166 169
167 connect(m_viewManager, SIGNAL(selectionChangedByUser()), 170 connect(m_viewManager, SIGNAL(selectionChangedByUser()),
168 this, SLOT(selectionChangedByUser())); 171 this, SLOT(selectionChangedByUser()));
169 172
185 connect(m_paneStack, SIGNAL(doubleClickSelectInvoked(sv_frame_t)), 188 connect(m_paneStack, SIGNAL(doubleClickSelectInvoked(sv_frame_t)),
186 this, SLOT(doubleClickSelectInvoked(sv_frame_t))); 189 this, SLOT(doubleClickSelectInvoked(sv_frame_t)));
187 scroll->setWidget(m_paneStack); 190 scroll->setWidget(m_paneStack);
188 191
189 m_overview = new Overview(frame); 192 m_overview = new Overview(frame);
193 m_overview->setPlaybackFollow(PlaybackScrollPage);
190 m_overview->setViewManager(m_viewManager); 194 m_overview->setViewManager(m_viewManager);
191 m_overview->setFixedHeight(40); 195 m_overview->setFixedHeight(60);
192 #ifndef _WIN32 196 #ifndef _WIN32
193 // For some reason, the contents of the overview never appear if we 197 // For some reason, the contents of the overview never appear if we
194 // make this setting on Windows. I have no inclination at the moment 198 // make this setting on Windows. I have no inclination at the moment
195 // to track down the reason why. 199 // to track down the reason why.
196 m_overview->setFrameStyle(QFrame::StyledPanel | QFrame::Sunken); 200 m_overview->setFrameStyle(QFrame::StyledPanel | QFrame::Sunken);
199 this, SLOT(contextHelpChanged(const QString &))); 203 this, SLOT(contextHelpChanged(const QString &)));
200 204
201 m_panLayer = new WaveformLayer; 205 m_panLayer = new WaveformLayer;
202 m_panLayer->setChannelMode(WaveformLayer::MergeChannels); 206 m_panLayer->setChannelMode(WaveformLayer::MergeChannels);
203 m_panLayer->setAggressiveCacheing(true); 207 m_panLayer->setAggressiveCacheing(true);
208 m_panLayer->setGain(0.5);
204 m_overview->addLayer(m_panLayer); 209 m_overview->addLayer(m_panLayer);
205 210
206 if (m_viewManager->getGlobalDarkBackground()) { 211 if (m_viewManager->getGlobalDarkBackground()) {
207 m_panLayer->setBaseColour 212 m_panLayer->setBaseColour
208 (ColourDatabase::getInstance()->getColourIndex(tr("Bright Green"))); 213 (ColourDatabase::getInstance()->getColourIndex(tr("Bright Green")));
251 connect(m_gainAudio, SIGNAL(valueChanged(int)), 256 connect(m_gainAudio, SIGNAL(valueChanged(int)),
252 this, SLOT(audioGainChanged(int))); 257 this, SLOT(audioGainChanged(int)));
253 connect(m_gainAudio, SIGNAL(mouseEntered()), this, SLOT(mouseEnteredWidget())); 258 connect(m_gainAudio, SIGNAL(mouseEntered()), this, SLOT(mouseEnteredWidget()));
254 connect(m_gainAudio, SIGNAL(mouseLeft()), this, SLOT(mouseLeftWidget())); 259 connect(m_gainAudio, SIGNAL(mouseLeft()), this, SLOT(mouseLeftWidget()));
255 260
256 m_gainPitch = new AudioDial(frame); 261 if (m_withSonification)
257 m_gainPitch->setMeterColor(Qt::darkRed); 262 {
258 m_gainPitch->setMinimum(-50); 263 m_gainPitch = new AudioDial(frame);
259 m_gainPitch->setMaximum(50); 264 m_gainPitch->setMeterColor(Qt::darkRed);
260 m_gainPitch->setValue(0); 265 m_gainPitch->setMinimum(-50);
261 m_gainPitch->setDefaultValue(0); 266 m_gainPitch->setMaximum(50);
262 m_gainPitch->setFixedWidth(24); 267 m_gainPitch->setValue(0);
263 m_gainPitch->setFixedHeight(24); 268 m_gainPitch->setDefaultValue(0);
264 m_gainPitch->setNotchesVisible(true); 269 m_gainPitch->setFixedWidth(24);
265 m_gainPitch->setPageStep(10); 270 m_gainPitch->setFixedHeight(24);
266 m_gainPitch->setObjectName(tr("Pitch Track Gain")); 271 m_gainPitch->setNotchesVisible(true);
267 m_gainPitch->setRangeMapper(new LinearRangeMapper(-50, 50, -25, 25, tr("dB"))); 272 m_gainPitch->setPageStep(10);
268 m_gainPitch->setShowToolTip(true); 273 m_gainPitch->setObjectName(tr("Pitch Track Gain"));
269 connect(m_gainPitch, SIGNAL(valueChanged(int)), 274 m_gainPitch->setRangeMapper(new LinearRangeMapper(-50, 50, -25, 25, tr("dB")));
270 this, SLOT(pitchGainChanged(int))); 275 m_gainPitch->setShowToolTip(true);
271 connect(m_gainPitch, SIGNAL(mouseEntered()), this, SLOT(mouseEnteredWidget())); 276 connect(m_gainPitch, SIGNAL(valueChanged(int)),
272 connect(m_gainPitch, SIGNAL(mouseLeft()), this, SLOT(mouseLeftWidget())); 277 this, SLOT(pitchGainChanged(int)));
273 278 connect(m_gainPitch, SIGNAL(mouseEntered()), this, SLOT(mouseEnteredWidget()));
274 m_gainNotes = new AudioDial(frame); 279 connect(m_gainPitch, SIGNAL(mouseLeft()), this, SLOT(mouseLeftWidget()));
275 m_gainNotes->setMeterColor(Qt::darkRed); 280
276 m_gainNotes->setMinimum(-50); 281 m_gainNotes = new AudioDial(frame);
277 m_gainNotes->setMaximum(50); 282 m_gainNotes->setMeterColor(Qt::darkRed);
278 m_gainNotes->setValue(0); 283 m_gainNotes->setMinimum(-50);
279 m_gainNotes->setDefaultValue(0); 284 m_gainNotes->setMaximum(50);
280 m_gainNotes->setFixedWidth(24); 285 m_gainNotes->setValue(0);
281 m_gainNotes->setFixedHeight(24); 286 m_gainNotes->setDefaultValue(0);
282 m_gainNotes->setNotchesVisible(true); 287 m_gainNotes->setFixedWidth(24);
283 m_gainNotes->setPageStep(10); 288 m_gainNotes->setFixedHeight(24);
284 m_gainNotes->setObjectName(tr("Pitch Track Gain")); 289 m_gainNotes->setNotchesVisible(true);
285 m_gainNotes->setRangeMapper(new LinearRangeMapper(-50, 50, -25, 25, tr("dB"))); 290 m_gainNotes->setPageStep(10);
286 m_gainNotes->setShowToolTip(true); 291 m_gainNotes->setObjectName(tr("Note Gain"));
287 connect(m_gainNotes, SIGNAL(valueChanged(int)), 292 m_gainNotes->setRangeMapper(new LinearRangeMapper(-50, 50, -25, 25, tr("dB")));
288 this, SLOT(notesGainChanged(int))); 293 m_gainNotes->setShowToolTip(true);
289 connect(m_gainNotes, SIGNAL(mouseEntered()), this, SLOT(mouseEnteredWidget())); 294 connect(m_gainNotes, SIGNAL(valueChanged(int)),
290 connect(m_gainNotes, SIGNAL(mouseLeft()), this, SLOT(mouseLeftWidget())); 295 this, SLOT(notesGainChanged(int)));
296 connect(m_gainNotes, SIGNAL(mouseEntered()), this, SLOT(mouseEnteredWidget()));
297 connect(m_gainNotes, SIGNAL(mouseLeft()), this, SLOT(mouseLeftWidget()));
298 }
291 // End of Gain controls 299 // End of Gain controls
292 300
293 // Pan controls 301 // Pan controls
294 m_panAudio = new AudioDial(frame); 302 m_panAudio = new AudioDial(frame);
295 m_panAudio->setMeterColor(Qt::darkGreen); 303 m_panAudio->setMeterColor(Qt::darkGreen);
308 connect(m_panAudio, SIGNAL(valueChanged(int)), 316 connect(m_panAudio, SIGNAL(valueChanged(int)),
309 this, SLOT(audioPanChanged(int))); 317 this, SLOT(audioPanChanged(int)));
310 connect(m_panAudio, SIGNAL(mouseEntered()), this, SLOT(mouseEnteredWidget())); 318 connect(m_panAudio, SIGNAL(mouseEntered()), this, SLOT(mouseEnteredWidget()));
311 connect(m_panAudio, SIGNAL(mouseLeft()), this, SLOT(mouseLeftWidget())); 319 connect(m_panAudio, SIGNAL(mouseLeft()), this, SLOT(mouseLeftWidget()));
312 320
313 m_panPitch = new AudioDial(frame); 321
314 m_panPitch->setMeterColor(Qt::darkGreen); 322
315 m_panPitch->setMinimum(-100); 323 if (m_withSonification)
316 m_panPitch->setMaximum(100); 324 {
317 m_panPitch->setValue(100); 325 m_panPitch = new AudioDial(frame);
318 m_panPitch->setDefaultValue(100); 326 m_panPitch->setMeterColor(Qt::darkGreen);
319 m_panPitch->setFixedWidth(24); 327 m_panPitch->setMinimum(-100);
320 m_panPitch->setFixedHeight(24); 328 m_panPitch->setMaximum(100);
321 m_panPitch->setNotchesVisible(true); 329 m_panPitch->setValue(100);
322 m_panPitch->setPageStep(10); 330 m_panPitch->setDefaultValue(100);
323 m_panPitch->setObjectName(tr("Pitch Track Pan")); 331 m_panPitch->setFixedWidth(24);
324 m_panPitch->setRangeMapper(new LinearRangeMapper(-100, 100, -100, 100, tr(""))); 332 m_panPitch->setFixedHeight(24);
325 m_panPitch->setShowToolTip(true); 333 m_panPitch->setNotchesVisible(true);
326 connect(m_panPitch, SIGNAL(valueChanged(int)), 334 m_panPitch->setPageStep(10);
327 this, SLOT(pitchPanChanged(int))); 335 m_panPitch->setObjectName(tr("Pitch Track Pan"));
328 connect(m_panPitch, SIGNAL(mouseEntered()), this, SLOT(mouseEnteredWidget())); 336 m_panPitch->setRangeMapper(new LinearRangeMapper(-100, 100, -100, 100, tr("")));
329 connect(m_panPitch, SIGNAL(mouseLeft()), this, SLOT(mouseLeftWidget())); 337 m_panPitch->setShowToolTip(true);
330 338 connect(m_panPitch, SIGNAL(valueChanged(int)),
331 m_panNotes = new AudioDial(frame); 339 this, SLOT(pitchPanChanged(int)));
332 m_panNotes->setMeterColor(Qt::darkGreen); 340 connect(m_panPitch, SIGNAL(mouseEntered()), this, SLOT(mouseEnteredWidget()));
333 m_panNotes->setMinimum(-100); 341 connect(m_panPitch, SIGNAL(mouseLeft()), this, SLOT(mouseLeftWidget()));
334 m_panNotes->setMaximum(100); 342
335 m_panNotes->setValue(100); 343 m_panNotes = new AudioDial(frame);
336 m_panNotes->setDefaultValue(100); 344 m_panNotes->setMeterColor(Qt::darkGreen);
337 m_panNotes->setFixedWidth(24); 345 m_panNotes->setMinimum(-100);
338 m_panNotes->setFixedHeight(24); 346 m_panNotes->setMaximum(100);
339 m_panNotes->setNotchesVisible(true); 347 m_panNotes->setValue(100);
340 m_panNotes->setPageStep(10); 348 m_panNotes->setDefaultValue(100);
341 m_panNotes->setObjectName(tr("Notes Track Pan")); 349 m_panNotes->setFixedWidth(24);
342 m_panNotes->setRangeMapper(new LinearRangeMapper(-100, 100, -100, 100, tr(""))); 350 m_panNotes->setFixedHeight(24);
343 m_panNotes->setShowToolTip(true); 351 m_panNotes->setNotchesVisible(true);
344 connect(m_panNotes, SIGNAL(valueChanged(int)), 352 m_panNotes->setPageStep(10);
345 this, SLOT(notesPanChanged(int))); 353 m_panNotes->setObjectName(tr("Note Pan"));
346 connect(m_panNotes, SIGNAL(mouseEntered()), this, SLOT(mouseEnteredWidget())); 354 m_panNotes->setRangeMapper(new LinearRangeMapper(-100, 100, -100, 100, tr("")));
347 connect(m_panNotes, SIGNAL(mouseLeft()), this, SLOT(mouseLeftWidget())); 355 m_panNotes->setShowToolTip(true);
356 connect(m_panNotes, SIGNAL(valueChanged(int)),
357 this, SLOT(notesPanChanged(int)));
358 connect(m_panNotes, SIGNAL(mouseEntered()), this, SLOT(mouseEnteredWidget()));
359 connect(m_panNotes, SIGNAL(mouseLeft()), this, SLOT(mouseLeftWidget()));
360 }
361
348 // End of Pan controls 362 // End of Pan controls
349 363
350 layout->setSpacing(4); 364 layout->setSpacing(4);
351 layout->addWidget(m_overview, 0, 1); 365 layout->addWidget(m_overview, 0, 1);
352 layout->addWidget(scroll, 1, 1); 366 layout->addWidget(scroll, 1, 1);
410 424
411 void 425 void
412 MainWindow::setupMenus() 426 MainWindow::setupMenus()
413 { 427 {
414 if (!m_mainMenusCreated) { 428 if (!m_mainMenusCreated) {
429
430 #ifdef Q_OS_LINUX
431 // In Ubuntu 14.04 the window's menu bar goes missing entirely
432 // if the user is running any desktop environment other than Unity
433 // (in which the faux single-menubar appears). The user has a
434 // workaround, to remove the appmenu-qt5 package, but that is
435 // awkward and the problem is so severe that it merits disabling
436 // the system menubar integration altogether. Like this:
437 menuBar()->setNativeMenuBar(false);
438 #endif
439
415 m_rightButtonMenu = new QMenu(); 440 m_rightButtonMenu = new QMenu();
416 } 441 }
417 442
418 if (!m_mainMenusCreated) { 443 if (!m_mainMenusCreated) {
419 CommandHistory::getInstance()->registerMenu(m_rightButtonMenu); 444 CommandHistory::getInstance()->registerMenu(m_rightButtonMenu);
916 m_keyReference->setCategory(tr("Help")); 941 m_keyReference->setCategory(tr("Help"));
917 942
918 IconLoader il; 943 IconLoader il;
919 944
920 QString name = QApplication::applicationName(); 945 QString name = QApplication::applicationName();
921 946 QAction *action;
922 QAction *action = new QAction(il.load("help"), 947
948 action = new QAction(tr("&Key and Mouse Reference"), this);
949 action->setShortcut(tr("F2"));
950 action->setStatusTip(tr("Open a window showing the keystrokes you can use in %1").arg(name));
951 connect(action, SIGNAL(triggered()), this, SLOT(keyReference()));
952 m_keyReference->registerShortcut(action);
953 menu->addAction(action);
954
955 action = new QAction(il.load("help"),
923 tr("&Help Reference"), this); 956 tr("&Help Reference"), this);
924 action->setShortcut(tr("F1")); 957 action->setShortcut(tr("F1"));
925 action->setStatusTip(tr("Open the %1 reference manual").arg(name)); 958 action->setStatusTip(tr("Open the %1 reference manual").arg(name));
926 connect(action, SIGNAL(triggered()), this, SLOT(help())); 959 connect(action, SIGNAL(triggered()), this, SLOT(help()));
927 m_keyReference->registerShortcut(action); 960 m_keyReference->registerShortcut(action);
928 menu->addAction(action); 961 menu->addAction(action);
929 962
930 action = new QAction(tr("&Key and Mouse Reference"), this);
931 action->setShortcut(tr("F2"));
932 action->setStatusTip(tr("Open a window showing the keystrokes you can use in %1").arg(name));
933 connect(action, SIGNAL(triggered()), this, SLOT(keyReference()));
934 m_keyReference->registerShortcut(action);
935 menu->addAction(action);
936 963
937 action = new QAction(tr("%1 on the &Web").arg(name), this); 964 action = new QAction(tr("%1 on the &Web").arg(name), this);
938 action->setStatusTip(tr("Open the %1 website").arg(name)); 965 action->setStatusTip(tr("Open the %1 website").arg(name));
939 connect(action, SIGNAL(triggered()), this, SLOT(website())); 966 connect(action, SIGNAL(triggered()), this, SLOT(website()));
940 menu->addAction(action); 967 menu->addAction(action);
1166 m_showPitch = toolbar->addAction(il.load("values"), tr("Show Pitch Track")); 1193 m_showPitch = toolbar->addAction(il.load("values"), tr("Show Pitch Track"));
1167 m_showPitch->setCheckable(true); 1194 m_showPitch->setCheckable(true);
1168 connect(m_showPitch, SIGNAL(triggered()), this, SLOT(showPitchToggled())); 1195 connect(m_showPitch, SIGNAL(triggered()), this, SLOT(showPitchToggled()));
1169 connect(this, SIGNAL(canPlay(bool)), m_showPitch, SLOT(setEnabled(bool))); 1196 connect(this, SIGNAL(canPlay(bool)), m_showPitch, SLOT(setEnabled(bool)));
1170 1197
1171 m_playPitch = toolbar->addAction(il.load("speaker"), tr("Play Pitch Track")); 1198 if (!m_withSonification)
1199 {
1200 m_playPitch = new QAction(tr("Play Pitch Track"), this);
1201 } else {
1202 m_playPitch = toolbar->addAction(il.load("speaker"), tr("Play Pitch Track"));
1203 toolbar->addWidget(m_gainPitch);
1204 toolbar->addWidget(m_panPitch);
1205 }
1172 m_playPitch->setCheckable(true); 1206 m_playPitch->setCheckable(true);
1173 connect(m_playPitch, SIGNAL(triggered()), this, SLOT(playPitchToggled())); 1207 connect(m_playPitch, SIGNAL(triggered()), this, SLOT(playPitchToggled()));
1174 connect(this, SIGNAL(canPlayPitch(bool)), m_playPitch, SLOT(setEnabled(bool))); 1208 connect(this, SIGNAL(canPlayPitch(bool)), m_playPitch, SLOT(setEnabled(bool)));
1175
1176 toolbar->addWidget(m_gainPitch);
1177 toolbar->addWidget(m_panPitch);
1178 1209
1179 // Notes 1210 // Notes
1180 spacer = new QLabel; 1211 spacer = new QLabel;
1181 spacer->setFixedWidth(40); 1212 spacer->setFixedWidth(40);
1182 toolbar->addWidget(spacer); 1213 toolbar->addWidget(spacer);
1184 m_showNotes = toolbar->addAction(il.load("notes"), tr("Show Notes")); 1215 m_showNotes = toolbar->addAction(il.load("notes"), tr("Show Notes"));
1185 m_showNotes->setCheckable(true); 1216 m_showNotes->setCheckable(true);
1186 connect(m_showNotes, SIGNAL(triggered()), this, SLOT(showNotesToggled())); 1217 connect(m_showNotes, SIGNAL(triggered()), this, SLOT(showNotesToggled()));
1187 connect(this, SIGNAL(canPlay(bool)), m_showNotes, SLOT(setEnabled(bool))); 1218 connect(this, SIGNAL(canPlay(bool)), m_showNotes, SLOT(setEnabled(bool)));
1188 1219
1189 m_playNotes = toolbar->addAction(il.load("speaker"), tr("Play Notes")); 1220 if (!m_withSonification)
1221 {
1222 m_playNotes = new QAction(tr("Play Notes"), this);
1223 } else {
1224 m_playNotes = toolbar->addAction(il.load("speaker"), tr("Play Notes"));
1225 toolbar->addWidget(m_gainNotes);
1226 toolbar->addWidget(m_panNotes);
1227 }
1190 m_playNotes->setCheckable(true); 1228 m_playNotes->setCheckable(true);
1191 connect(m_playNotes, SIGNAL(triggered()), this, SLOT(playNotesToggled())); 1229 connect(m_playNotes, SIGNAL(triggered()), this, SLOT(playNotesToggled()));
1192 connect(this, SIGNAL(canPlayNotes(bool)), m_playNotes, SLOT(setEnabled(bool))); 1230 connect(this, SIGNAL(canPlayNotes(bool)), m_playNotes, SLOT(setEnabled(bool)));
1193
1194 toolbar->addWidget(m_gainNotes);
1195 toolbar->addWidget(m_panNotes);
1196 1231
1197 // Spectrogram 1232 // Spectrogram
1198 spacer = new QLabel; 1233 spacer = new QLabel;
1199 spacer->setFixedWidth(40); 1234 spacer->setFixedWidth(40);
1200 toolbar->addWidget(spacer); 1235 toolbar->addWidget(spacer);
1201 1236
1202 m_showSpect = toolbar->addAction(il.load("spectrogram"), tr("Show Spectrogram")); 1237 if (!m_withSpectrogram)
1238 {
1239 m_showSpect = new QAction(tr("Show Spectrogram"), this);
1240 } else {
1241 m_showSpect = toolbar->addAction(il.load("spectrogram"), tr("Show Spectrogram"));
1242 }
1203 m_showSpect->setCheckable(true); 1243 m_showSpect->setCheckable(true);
1204 connect(m_showSpect, SIGNAL(triggered()), this, SLOT(showSpectToggled())); 1244 connect(m_showSpect, SIGNAL(triggered()), this, SLOT(showSpectToggled()));
1205 connect(this, SIGNAL(canPlay(bool)), m_showSpect, SLOT(setEnabled(bool))); 1245 connect(this, SIGNAL(canPlay(bool)), m_showSpect, SLOT(setEnabled(bool)));
1206 1246
1207 Pane::registerShortcuts(*m_keyReference); 1247 Pane::registerShortcuts(*m_keyReference);
1248
1208 } 1249 }
1209 1250
1210 1251
1211 void 1252 void
1212 MainWindow::moveOneNoteRight() 1253 MainWindow::moveOneNoteRight()
1439 // just switched layer on; check whether playback was also on previously 1480 // just switched layer on; check whether playback was also on previously
1440 playOn = settings.value("playpitchwas", true).toBool(); 1481 playOn = settings.value("playpitchwas", true).toBool();
1441 } else { 1482 } else {
1442 settings.setValue("playpitchwas", m_playPitch->isChecked()); 1483 settings.setValue("playpitchwas", m_playPitch->isChecked());
1443 } 1484 }
1444 m_analyser->setAudible(Analyser::PitchTrack, playOn); 1485 m_analyser->setAudible(Analyser::PitchTrack, playOn && m_withSonification);
1445 m_playPitch->setChecked(playOn); 1486 m_playPitch->setChecked(playOn);
1446 1487
1447 settings.endGroup(); 1488 settings.endGroup();
1448 1489
1449 updateMenuStates(); 1490 updateMenuStates();
1468 // just switched layer on; check whether playback was also on previously 1509 // just switched layer on; check whether playback was also on previously
1469 playOn = settings.value("playnoteswas", true).toBool(); 1510 playOn = settings.value("playnoteswas", true).toBool();
1470 } else { 1511 } else {
1471 settings.setValue("playnoteswas", m_playNotes->isChecked()); 1512 settings.setValue("playnoteswas", m_playNotes->isChecked());
1472 } 1513 }
1473 m_analyser->setAudible(Analyser::Notes, playOn); 1514 m_analyser->setAudible(Analyser::Notes, playOn && m_withSonification);
1474 m_playNotes->setChecked(playOn); 1515 m_playNotes->setChecked(playOn);
1475 1516
1476 settings.endGroup(); 1517 settings.endGroup();
1477 1518
1478 updateMenuStates(); 1519 updateMenuStates();
1566 closeSession(); 1607 closeSession();
1567 createDocument(); 1608 createDocument();
1568 m_document->setAutoAlignment(true); 1609 m_document->setAutoAlignment(true);
1569 1610
1570 Pane *pane = m_paneStack->addPane(); 1611 Pane *pane = m_paneStack->addPane();
1571 1612 pane->setPlaybackFollow(PlaybackScrollPage);
1613
1614 m_viewManager->setGlobalCentreFrame
1615 (pane->getFrameForX(width() / 2));
1616
1572 connect(pane, SIGNAL(contextHelpChanged(const QString &)), 1617 connect(pane, SIGNAL(contextHelpChanged(const QString &)),
1573 this, SLOT(contextHelpChanged(const QString &))); 1618 this, SLOT(contextHelpChanged(const QString &)));
1574 1619
1575 // Layer *waveform = m_document->createMainModelLayer(LayerFactory::Waveform); 1620 // Layer *waveform = m_document->createMainModelLayer(LayerFactory::Waveform);
1576 // m_document->addLayerToView(pane, waveform); 1621 // m_document->addLayerToView(pane, waveform);
1647 1692
1648 QString path = getOpenFileName(FileFinder::AnyFile); 1693 QString path = getOpenFileName(FileFinder::AnyFile);
1649 1694
1650 if (path.isEmpty()) return; 1695 if (path.isEmpty()) return;
1651 1696
1652 FileOpenStatus status = open(path, ReplaceSession); 1697 FileOpenStatus status = openPath(path, ReplaceSession);
1653 1698
1654 if (status == FileOpenFailed) { 1699 if (status == FileOpenFailed) {
1655 QMessageBox::critical(this, tr("Failed to open file"), 1700 QMessageBox::critical(this, tr("Failed to open file"),
1656 tr("<b>File open failed</b><p>File \"%1\" could not be opened").arg(path)); 1701 tr("<b>File open failed</b><p>File \"%1\" could not be opened").arg(path));
1657 } else if (status == FileOpenWrongMode) { 1702 } else if (status == FileOpenWrongMode) {
1677 1722
1678 settings.setValue("lastremote", text); 1723 settings.setValue("lastremote", text);
1679 1724
1680 if (text.isEmpty()) return; 1725 if (text.isEmpty()) return;
1681 1726
1682 FileOpenStatus status = open(text, ReplaceSession); 1727 FileOpenStatus status = openPath(text, ReplaceSession);
1683 1728
1684 if (status == FileOpenFailed) { 1729 if (status == FileOpenFailed) {
1685 QMessageBox::critical(this, tr("Failed to open location"), 1730 QMessageBox::critical(this, tr("Failed to open location"),
1686 tr("<b>Open failed</b><p>URL \"%1\" could not be opened").arg(text)); 1731 tr("<b>Open failed</b><p>URL \"%1\" could not be opened").arg(text));
1687 } else if (status == FileOpenWrongMode) { 1732 } else if (status == FileOpenWrongMode) {
1703 } 1748 }
1704 1749
1705 QString path = action->text(); 1750 QString path = action->text();
1706 if (path == "") return; 1751 if (path == "") return;
1707 1752
1708 FileOpenStatus status = open(path, ReplaceSession); 1753 FileOpenStatus status = openPath(path, ReplaceSession);
1709 1754
1710 if (status == FileOpenFailed) { 1755 if (status == FileOpenFailed) {
1711 QMessageBox::critical(this, tr("Failed to open location"), 1756 QMessageBox::critical(this, tr("Failed to open location"),
1712 tr("<b>Open failed</b><p>File or URL \"%1\" could not be opened").arg(path)); 1757 tr("<b>Open failed</b><p>File or URL \"%1\" could not be opened").arg(path));
1713 } else if (status == FileOpenWrongMode) { 1758 } else if (status == FileOpenWrongMode) {
1741 { 1786 {
1742 if (pane) m_paneStack->setCurrentPane(pane); 1787 if (pane) m_paneStack->setCurrentPane(pane);
1743 1788
1744 for (QStringList::iterator i = uriList.begin(); i != uriList.end(); ++i) { 1789 for (QStringList::iterator i = uriList.begin(); i != uriList.end(); ++i) {
1745 1790
1746 FileOpenStatus status = open(*i, ReplaceSession); 1791 FileOpenStatus status = openPath(*i, ReplaceSession);
1747 1792
1748 if (status == FileOpenFailed) { 1793 if (status == FileOpenFailed) {
1749 QMessageBox::critical(this, tr("Failed to open dropped URL"), 1794 QMessageBox::critical(this, tr("Failed to open dropped URL"),
1750 tr("<b>Open failed</b><p>Dropped URL \"%1\" could not be opened").arg(*i)); 1795 tr("<b>Open failed</b><p>Dropped URL \"%1\" could not be opened").arg(*i));
1751 } else if (status == FileOpenWrongMode) { 1796 } else if (status == FileOpenWrongMode) {
2893 if (!getMainModel() || !p) { 2938 if (!getMainModel() || !p) {
2894 return; 2939 return;
2895 } 2940 }
2896 2941
2897 bool haveSelection = false; 2942 bool haveSelection = false;
2898 size_t startFrame = 0, endFrame = 0; 2943 int startFrame = 0, endFrame = 0;
2899 2944
2900 if (m_viewManager && m_viewManager->haveInProgressSelection()) { 2945 if (m_viewManager && m_viewManager->haveInProgressSelection()) {
2901 2946
2902 bool exclusive = false; 2947 bool exclusive = false;
2903 Selection s = m_viewManager->getInProgressSelection(exclusive); 2948 Selection s = m_viewManager->getInProgressSelection(exclusive);
2933 } else { 2978 } else {
2934 m_myStatusMessage = tr("Visible: %1 to %2 (duration %3)") 2979 m_myStatusMessage = tr("Visible: %1 to %2 (duration %3)")
2935 .arg(startStr).arg(endStr).arg(durationStr); 2980 .arg(startStr).arg(endStr).arg(durationStr);
2936 } 2981 }
2937 2982
2938 statusBar()->showMessage(m_myStatusMessage); 2983 getStatusLabel()->setText(m_myStatusMessage);
2939 } 2984 }
2940 2985
2941 void 2986 void
2942 MainWindow::updatePositionStatusDisplays() const 2987 MainWindow::updatePositionStatusDisplays() const
2943 { 2988 {
3074 } else { 3119 } else {
3075 pane = m_paneStack->getPane(0); 3120 pane = m_paneStack->getPane(0);
3076 selectionStrip = m_paneStack->getPane(1); 3121 selectionStrip = m_paneStack->getPane(1);
3077 } 3122 }
3078 3123
3124 pane->setPlaybackFollow(PlaybackScrollPage);
3125
3079 if (selectionStrip) { 3126 if (selectionStrip) {
3127 selectionStrip->setPlaybackFollow(PlaybackScrollPage);
3080 selectionStrip->setFixedHeight(26); 3128 selectionStrip->setFixedHeight(26);
3081 m_paneStack->sizePanesEqually(); 3129 m_paneStack->sizePanesEqually();
3082 m_viewManager->clearToolModeOverrides(); 3130 m_viewManager->clearToolModeOverrides();
3083 m_viewManager->setToolModeFor(selectionStrip, 3131 m_viewManager->setToolModeFor(selectionStrip,
3084 ViewManager::SelectMode); 3132 ViewManager::SelectMode);
3098 (this, 3146 (this,
3099 tr("Failed to analyse audio"), 3147 tr("Failed to analyse audio"),
3100 tr("<b>Analysis failed</b><p>%1</p>").arg(error), 3148 tr("<b>Analysis failed</b><p>%1</p>").arg(error),
3101 QMessageBox::Ok); 3149 QMessageBox::Ok);
3102 } 3150 }
3151 }
3152
3153 if (!m_withSpectrogram)
3154 {
3155 m_analyser->setVisible(Analyser::Spectrogram, false);
3156 }
3157
3158 if (!m_withSonification)
3159 {
3160 m_analyser->setAudible(Analyser::PitchTrack, false);
3161 m_analyser->setAudible(Analyser::Notes, false);
3103 } 3162 }
3104 } 3163 }
3105 3164
3106 void 3165 void
3107 MainWindow::modelGenerationFailed(QString transformName, QString message) 3166 MainWindow::modelGenerationFailed(QString transformName, QString message)
3220 3279
3221 void 3280 void
3222 MainWindow::help() 3281 MainWindow::help()
3223 { 3282 {
3224 //!!! todo: help URL! 3283 //!!! todo: help URL!
3225 openHelpUrl(tr("http://code.soundsoftware.ac.uk/projects/tony/")); 3284 openHelpUrl(tr("http://code.soundsoftware.ac.uk/projects/tony/wiki/Reference"));
3226 } 3285 }
3227 3286
3228 void 3287 void
3229 MainWindow::about() 3288 MainWindow::about()
3230 { 3289 {
3278 settings.setValue(tag, false); 3337 settings.setValue(tag, false);
3279 } 3338 }
3280 settings.endGroup(); 3339 settings.endGroup();
3281 } 3340 }
3282 3341
3283 3342 void
3284 3343 MainWindow::ffwd()
3344 {
3345 if (!getMainModel()) return;
3346
3347 int frame = m_viewManager->getPlaybackFrame();
3348 ++frame;
3349
3350 size_t sr = getMainModel()->getSampleRate();
3351
3352 // The step is supposed to scale and be as wide as a step of
3353 // m_defaultFfwdRwdStep seconds at zoom level 720 and sr = 44100
3354 size_t framesPerPixel = m_viewManager->getGlobalZoom();
3355 size_t defaultZoom = (720 * 44100) / sr;
3356
3357 float scaler = (framesPerPixel * 1.0f) / defaultZoom;
3358
3359
3360 frame = RealTime::realTime2Frame
3361 (RealTime::frame2RealTime(frame, sr) + m_defaultFfwdRwdStep * scaler, sr);
3362 if (frame > int(getMainModel()->getEndFrame())) {
3363 frame = getMainModel()->getEndFrame();
3364 }
3365
3366 if (frame < 0) frame = 0;
3367
3368 if (m_viewManager->getPlaySelectionMode()) {
3369 frame = m_viewManager->constrainFrameToSelection(size_t(frame));
3370 }
3371
3372 m_viewManager->setPlaybackFrame(frame);
3373
3374 if (frame == (int)getMainModel()->getEndFrame() &&
3375 m_playSource &&
3376 m_playSource->isPlaying() &&
3377 !m_viewManager->getPlayLoopMode()) {
3378 stop();
3379 }
3380 }
3381
3382 void
3383 MainWindow::rewind()
3384 {
3385 if (!getMainModel()) return;
3386
3387 int frame = m_viewManager->getPlaybackFrame();
3388 if (frame > 0) --frame;
3389
3390 size_t sr = getMainModel()->getSampleRate();
3391
3392 // The step is supposed to scale and be as wide as a step of
3393 // m_defaultFfwdRwdStep seconds at zoom level 720 and sr = 44100
3394 size_t framesPerPixel = m_viewManager->getGlobalZoom();
3395 size_t defaultZoom = (720 * 44100) / sr;
3396
3397 float scaler = (framesPerPixel * 1.0f) / defaultZoom;
3398 frame = RealTime::realTime2Frame
3399 (RealTime::frame2RealTime(frame, sr) - m_defaultFfwdRwdStep * scaler, sr);
3400 if (frame < int(getMainModel()->getStartFrame())) {
3401 frame = getMainModel()->getStartFrame();
3402 }
3403
3404 if (frame < 0) frame = 0;
3405
3406 if (m_viewManager->getPlaySelectionMode()) {
3407 frame = m_viewManager->constrainFrameToSelection(size_t(frame));
3408 }
3409
3410 m_viewManager->setPlaybackFrame(frame);
3411 }