comparison framework/MainWindowBase.cpp @ 365:c32393c09304 tony_integration

Merge from branch "tonioni"
author Chris Cannam
date Tue, 17 Jun 2014 13:17:26 +0100
parents 88bf6cc73275
children f1cab64363d7
comparison
equal deleted inserted replaced
364:8b631ce73b1c 365:c32393c09304
150 m_recentTransforms("RecentTransforms", 20), 150 m_recentTransforms("RecentTransforms", 20),
151 m_documentModified(false), 151 m_documentModified(false),
152 m_openingAudioFile(false), 152 m_openingAudioFile(false),
153 m_abandoning(false), 153 m_abandoning(false),
154 m_labeller(0), 154 m_labeller(0),
155 m_lastPlayStatusSec(0) 155 m_lastPlayStatusSec(0),
156 m_initialDarkBackground(false),
157 m_defaultFfwdRwdStep(2, 0)
156 { 158 {
157 Profiler profiler("MainWindowBase::MainWindowBase"); 159 Profiler profiler("MainWindowBase::MainWindowBase");
158 160
159 #ifdef Q_WS_X11 161 #ifdef Q_WS_X11
160 XSetErrorHandler(handle_x11_error); 162 XSetErrorHandler(handle_x11_error);
279 if (menu) finaliseMenu(menu); 281 if (menu) finaliseMenu(menu);
280 } 282 }
281 } 283 }
282 284
283 void 285 void
284 MainWindowBase::finaliseMenu(QMenu *menu) 286 MainWindowBase::finaliseMenu(QMenu *
287 #ifdef Q_OS_MAC
288 menu
289 #endif
290 )
285 { 291 {
286 #ifdef Q_OS_MAC 292 #ifdef Q_OS_MAC
287 // See https://bugreports.qt-project.org/browse/QTBUG-38256 and 293 // See https://bugreports.qt-project.org/browse/QTBUG-38256 and
288 // our issue #890 http://code.soundsoftware.ac.uk/issues/890 -- 294 // our issue #890 http://code.soundsoftware.ac.uk/issues/890 --
289 // single-key shortcuts that are associated only with a menu 295 // single-key shortcuts that are associated only with a menu
366 372
367 QString 373 QString
368 MainWindowBase::getOpenFileName(FileFinder::FileType type) 374 MainWindowBase::getOpenFileName(FileFinder::FileType type)
369 { 375 {
370 FileFinder *ff = FileFinder::getInstance(); 376 FileFinder *ff = FileFinder::getInstance();
371 switch (type) { 377
372 case FileFinder::SessionFile: 378 if (type == FileFinder::AnyFile) {
373 return ff->getOpenFileName(type, m_sessionFile);
374 case FileFinder::AudioFile:
375 return ff->getOpenFileName(type, m_audioFile);
376 case FileFinder::LayerFile:
377 return ff->getOpenFileName(type, m_sessionFile);
378 case FileFinder::LayerFileNoMidi:
379 return ff->getOpenFileName(type, m_sessionFile);
380 case FileFinder::LayerFileNonSV:
381 return ff->getOpenFileName(type, m_sessionFile);
382 case FileFinder::LayerFileNoMidiNonSV:
383 return ff->getOpenFileName(type, m_sessionFile);
384 case FileFinder::SessionOrAudioFile:
385 return ff->getOpenFileName(type, m_sessionFile);
386 case FileFinder::ImageFile:
387 return ff->getOpenFileName(type, m_sessionFile);
388 case FileFinder::CSVFile:
389 return ff->getOpenFileName(type, m_sessionFile);
390 case FileFinder::AnyFile:
391 if (getMainModel() != 0 && 379 if (getMainModel() != 0 &&
392 m_paneStack != 0 && 380 m_paneStack != 0 &&
393 m_paneStack->getCurrentPane() != 0) { // can import a layer 381 m_paneStack->getCurrentPane() != 0) { // can import a layer
394 return ff->getOpenFileName(FileFinder::AnyFile, m_sessionFile); 382 return ff->getOpenFileName(FileFinder::AnyFile, m_sessionFile);
395 } else { 383 } else {
396 return ff->getOpenFileName(FileFinder::SessionOrAudioFile, 384 return ff->getOpenFileName(FileFinder::SessionOrAudioFile,
397 m_sessionFile); 385 m_sessionFile);
398 } 386 }
399 } 387 }
400 return ""; 388
389 QString lastPath = m_sessionFile;
390
391 if (type == FileFinder::AudioFile) {
392 lastPath = m_audioFile;
393 }
394
395 return ff->getOpenFileName(type, lastPath);
401 } 396 }
402 397
403 QString 398 QString
404 MainWindowBase::getSaveFileName(FileFinder::FileType type) 399 MainWindowBase::getSaveFileName(FileFinder::FileType type)
405 { 400 {
401 QString lastPath = m_sessionFile;
402
403 if (type == FileFinder::AudioFile) {
404 lastPath = m_audioFile;
405 }
406
406 FileFinder *ff = FileFinder::getInstance(); 407 FileFinder *ff = FileFinder::getInstance();
407 switch (type) { 408 return ff->getSaveFileName(type, lastPath);
408 case FileFinder::SessionFile:
409 return ff->getSaveFileName(type, m_sessionFile);
410 case FileFinder::AudioFile:
411 return ff->getSaveFileName(type, m_audioFile);
412 case FileFinder::LayerFile:
413 return ff->getSaveFileName(type, m_sessionFile);
414 case FileFinder::LayerFileNoMidi:
415 return ff->getSaveFileName(type, m_sessionFile);
416 case FileFinder::LayerFileNonSV:
417 return ff->getSaveFileName(type, m_sessionFile);
418 case FileFinder::LayerFileNoMidiNonSV:
419 return ff->getSaveFileName(type, m_sessionFile);
420 case FileFinder::SessionOrAudioFile:
421 return ff->getSaveFileName(type, m_sessionFile);
422 case FileFinder::ImageFile:
423 return ff->getSaveFileName(type, m_sessionFile);
424 case FileFinder::CSVFile:
425 return ff->getSaveFileName(type, m_sessionFile);
426 case FileFinder::AnyFile:
427 return ff->getSaveFileName(type, m_sessionFile);
428 }
429 return "";
430 } 409 }
431 410
432 void 411 void
433 MainWindowBase::registerLastOpenedFilePath(FileFinder::FileType type, QString path) 412 MainWindowBase::registerLastOpenedFilePath(FileFinder::FileType type, QString path)
434 { 413 {
547 emit canRenumberInstants(haveCurrentTimeInstantsLayer && haveSelection); 526 emit canRenumberInstants(haveCurrentTimeInstantsLayer && haveSelection);
548 emit canPlaySelection(haveMainModel && havePlayTarget && haveSelection); 527 emit canPlaySelection(haveMainModel && havePlayTarget && haveSelection);
549 emit canClearSelection(haveSelection); 528 emit canClearSelection(haveSelection);
550 emit canEditSelection(haveSelection && haveCurrentEditableLayer); 529 emit canEditSelection(haveSelection && haveCurrentEditableLayer);
551 emit canSave(m_sessionFile != "" && m_documentModified); 530 emit canSave(m_sessionFile != "" && m_documentModified);
531 emit canSaveAs(haveMainModel);
552 emit canSelectPreviousPane(havePrevPane); 532 emit canSelectPreviousPane(havePrevPane);
553 emit canSelectNextPane(haveNextPane); 533 emit canSelectNextPane(haveNextPane);
554 emit canSelectPreviousLayer(havePrevLayer); 534 emit canSelectPreviousLayer(havePrevLayer);
555 emit canSelectNextLayer(haveNextLayer); 535 emit canSelectNextLayer(haveNextLayer);
556 } 536 }
820 if (!clipboard.empty()) { 800 if (!clipboard.empty()) {
821 long firstEventFrame = clipboard.getPoints()[0].getFrame(); 801 long firstEventFrame = clipboard.getPoints()[0].getFrame();
822 long offset = 0; 802 long offset = 0;
823 if (firstEventFrame < 0) { 803 if (firstEventFrame < 0) {
824 offset = (long)pos - firstEventFrame; 804 offset = (long)pos - firstEventFrame;
825 } else if (firstEventFrame < pos) { 805 } else if ((unsigned long)firstEventFrame < pos) {
826 offset = pos - (unsigned long)firstEventFrame; 806 offset = pos - (unsigned long)firstEventFrame;
827 } else { 807 } else {
828 offset = -((unsigned long)firstEventFrame - pos); 808 offset = -((unsigned long)firstEventFrame - pos);
829 } 809 }
830 pasteRelative(offset); 810 pasteRelative(offset);
1237 1217
1238 m_openingAudioFile = true; 1218 m_openingAudioFile = true;
1239 1219
1240 size_t rate = 0; 1220 size_t rate = 0;
1241 1221
1242 if (Preferences::getInstance()->getResampleOnLoad()) { 1222 if (Preferences::getInstance()->getFixedSampleRate() != 0) {
1223 rate = Preferences::getInstance()->getFixedSampleRate();
1224 } else if (Preferences::getInstance()->getResampleOnLoad()) {
1243 rate = m_playSource->getSourceSampleRate(); 1225 rate = m_playSource->getSourceSampleRate();
1244 } 1226 }
1245 1227
1246 WaveFileModel *newModel = new WaveFileModel(source, rate); 1228 WaveFileModel *newModel = new WaveFileModel(source, rate);
1247 1229
1846 if (!source.isAvailable()) return FileOpenFailed; 1828 if (!source.isAvailable()) return FileOpenFailed;
1847 source.waitForData(); 1829 source.waitForData();
1848 1830
1849 QXmlInputSource *inputSource = 0; 1831 QXmlInputSource *inputSource = 0;
1850 QFile *file = 0; 1832 QFile *file = 0;
1851 bool isTemplate = false;
1852 1833
1853 file = new QFile(source.getLocalFilename()); 1834 file = new QFile(source.getLocalFilename());
1854 inputSource = new QXmlInputSource(file); 1835 inputSource = new QXmlInputSource(file);
1855 1836
1856 if (!checkSaveModified()) { 1837 if (!checkSaveModified()) {
2547 size_t sr = getMainModel()->getSampleRate(); 2528 size_t sr = getMainModel()->getSampleRate();
2548 2529
2549 if (!layer) { 2530 if (!layer) {
2550 2531
2551 frame = RealTime::realTime2Frame 2532 frame = RealTime::realTime2Frame
2552 (RealTime::frame2RealTime(frame, sr) + RealTime(2, 0), sr); 2533 (RealTime::frame2RealTime(frame, sr) + m_defaultFfwdRwdStep, sr);
2553 if (frame > int(getMainModel()->getEndFrame())) { 2534 if (frame > int(getMainModel()->getEndFrame())) {
2554 frame = getMainModel()->getEndFrame(); 2535 frame = getMainModel()->getEndFrame();
2555 } 2536 }
2556 2537
2557 } else { 2538 } else {
2572 frame = m_viewManager->constrainFrameToSelection(size_t(frame)); 2553 frame = m_viewManager->constrainFrameToSelection(size_t(frame));
2573 } 2554 }
2574 2555
2575 m_viewManager->setPlaybackFrame(frame); 2556 m_viewManager->setPlaybackFrame(frame);
2576 2557
2577 if (frame == getMainModel()->getEndFrame() && 2558 if (frame == (int)getMainModel()->getEndFrame() &&
2578 m_playSource && 2559 m_playSource &&
2579 m_playSource->isPlaying() && 2560 m_playSource->isPlaying() &&
2580 !m_viewManager->getPlayLoopMode()) { 2561 !m_viewManager->getPlayLoopMode()) {
2581 stop(); 2562 stop();
2582 } 2563 }
2609 2590
2610 Layer *layer = getSnapLayer(); 2591 Layer *layer = getSnapLayer();
2611 if (!layer) { ffwd(); return; } 2592 if (!layer) { ffwd(); return; }
2612 2593
2613 Pane *pane = m_paneStack->getCurrentPane(); 2594 Pane *pane = m_paneStack->getCurrentPane();
2614 size_t sr = getMainModel()->getSampleRate();
2615
2616 int frame = m_viewManager->getPlaybackFrame(); 2595 int frame = m_viewManager->getPlaybackFrame();
2617 2596
2618 size_t resolution = 0; 2597 size_t resolution = 0;
2619 if (pane) frame = pane->alignFromReference(frame); 2598 if (pane) frame = pane->alignFromReference(frame);
2620 if (layer->snapToSimilarFeature(m_paneStack->getCurrentPane(), 2599 if (layer->snapToSimilarFeature(m_paneStack->getCurrentPane(),
2630 frame = m_viewManager->constrainFrameToSelection(size_t(frame)); 2609 frame = m_viewManager->constrainFrameToSelection(size_t(frame));
2631 } 2610 }
2632 2611
2633 m_viewManager->setPlaybackFrame(frame); 2612 m_viewManager->setPlaybackFrame(frame);
2634 2613
2635 if (frame == getMainModel()->getEndFrame() && 2614 if (frame == (int)getMainModel()->getEndFrame() &&
2636 m_playSource && 2615 m_playSource &&
2637 m_playSource->isPlaying() && 2616 m_playSource->isPlaying() &&
2638 !m_viewManager->getPlayLoopMode()) { 2617 !m_viewManager->getPlayLoopMode()) {
2639 stop(); 2618 stop();
2640 } 2619 }
2647 2626
2648 int frame = m_viewManager->getPlaybackFrame(); 2627 int frame = m_viewManager->getPlaybackFrame();
2649 if (frame > 0) --frame; 2628 if (frame > 0) --frame;
2650 2629
2651 Pane *pane = m_paneStack->getCurrentPane(); 2630 Pane *pane = m_paneStack->getCurrentPane();
2631 size_t sr = getMainModel()->getSampleRate();
2632
2652 Layer *layer = getSnapLayer(); 2633 Layer *layer = getSnapLayer();
2653 size_t sr = getMainModel()->getSampleRate();
2654 2634
2655 // when rewinding during playback, we want to allow a period 2635 // when rewinding during playback, we want to allow a period
2656 // following a rewind target point at which the rewind will go to 2636 // following a rewind target point at which the rewind will go to
2657 // the prior point instead of the immediately neighbouring one 2637 // the prior point instead of the immediately neighbouring one
2658 if (m_playSource && m_playSource->isPlaying()) { 2638 if (m_playSource && m_playSource->isPlaying()) {
2659 RealTime ct = RealTime::frame2RealTime(frame, sr); 2639 RealTime ct = RealTime::frame2RealTime(frame, sr);
2660 ct = ct - RealTime::fromSeconds(0.25); 2640 ct = ct - RealTime::fromSeconds(0.15);
2661 if (ct < RealTime::zeroTime) ct = RealTime::zeroTime; 2641 if (ct < RealTime::zeroTime) ct = RealTime::zeroTime;
2662 frame = RealTime::realTime2Frame(ct, sr); 2642 frame = RealTime::realTime2Frame(ct, sr);
2663 } 2643 }
2664 2644
2665 if (!layer) { 2645 if (!layer) {
2666 2646
2667 frame = RealTime::realTime2Frame 2647 frame = RealTime::realTime2Frame
2668 (RealTime::frame2RealTime(frame, sr) - RealTime(2, 0), sr); 2648 (RealTime::frame2RealTime(frame, sr) - m_defaultFfwdRwdStep, sr);
2669 if (frame < int(getMainModel()->getStartFrame())) { 2649 if (frame < int(getMainModel()->getStartFrame())) {
2670 frame = getMainModel()->getStartFrame(); 2650 frame = getMainModel()->getStartFrame();
2671 } 2651 }
2672 2652
2673 } else { 2653 } else {
2712 2692
2713 Layer *layer = getSnapLayer(); 2693 Layer *layer = getSnapLayer();
2714 if (!layer) { rewind(); return; } 2694 if (!layer) { rewind(); return; }
2715 2695
2716 Pane *pane = m_paneStack->getCurrentPane(); 2696 Pane *pane = m_paneStack->getCurrentPane();
2717 size_t sr = getMainModel()->getSampleRate();
2718
2719 int frame = m_viewManager->getPlaybackFrame(); 2697 int frame = m_viewManager->getPlaybackFrame();
2720 2698
2721 size_t resolution = 0; 2699 size_t resolution = 0;
2722 if (pane) frame = pane->alignFromReference(frame); 2700 if (pane) frame = pane->alignFromReference(frame);
2723 if (layer->snapToSimilarFeature(m_paneStack->getCurrentPane(), 2701 if (layer->snapToSimilarFeature(m_paneStack->getCurrentPane(),
3211 MainWindowBase::mainModelChanged(WaveFileModel *model) 3189 MainWindowBase::mainModelChanged(WaveFileModel *model)
3212 { 3190 {
3213 // SVDEBUG << "MainWindowBase::mainModelChanged(" << model << ")" << endl; 3191 // SVDEBUG << "MainWindowBase::mainModelChanged(" << model << ")" << endl;
3214 updateDescriptionLabel(); 3192 updateDescriptionLabel();
3215 if (model) m_viewManager->setMainModelSampleRate(model->getSampleRate()); 3193 if (model) m_viewManager->setMainModelSampleRate(model->getSampleRate());
3216 if (model && !m_playTarget && m_audioOutput) createPlayTarget(); 3194 if (model && !m_playTarget && m_audioOutput) {
3195 createPlayTarget();
3196 }
3217 } 3197 }
3218 3198
3219 void 3199 void
3220 MainWindowBase::modelAboutToBeDeleted(Model *model) 3200 MainWindowBase::modelAboutToBeDeleted(Model *model)
3221 { 3201 {
3314 #ifdef Q_OS_MAC 3294 #ifdef Q_OS_MAC
3315 args.append(url); 3295 args.append(url);
3316 process->start("open", args); 3296 process->start("open", args);
3317 #else 3297 #else
3318 #ifdef Q_OS_WIN32 3298 #ifdef Q_OS_WIN32
3319 3299 QString pf(getenv("ProgramFiles"));
3320 QString pf(getenv("ProgramFiles")); 3300 QString command = pf + QString("\\Internet Explorer\\IEXPLORE.EXE");
3321 QString command = pf + QString("\\Internet Explorer\\IEXPLORE.EXE"); 3301
3322 3302 args.append(url);
3323 args.append(url); 3303 process->start(command, args);
3324 process->start(command, args);
3325
3326 #else 3304 #else
3327 #ifdef Q_WS_X11
3328 if (!qgetenv("KDE_FULL_SESSION").isEmpty()) { 3305 if (!qgetenv("KDE_FULL_SESSION").isEmpty()) {
3329 args.append("exec"); 3306 args.append("exec");
3330 args.append(url); 3307 args.append(url);
3331 process->start("kfmclient", args); 3308 process->start("kfmclient", args);
3332 } else if (!qgetenv("BROWSER").isEmpty()) { 3309 } else if (!qgetenv("BROWSER").isEmpty()) {
3336 args.append(url); 3313 args.append(url);
3337 process->start("firefox", args); 3314 process->start("firefox", args);
3338 } 3315 }
3339 #endif 3316 #endif
3340 #endif 3317 #endif
3341 #endif
3342 } 3318 }
3343 3319
3344 3320