Mercurial > hg > svapp
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 |