comparison framework/MainWindowBase.cpp @ 371:dfcc5b355f33

Merge from branch warnfix_no_size_t
author Chris Cannam
date Wed, 18 Jun 2014 13:51:38 +0100
parents f1cab64363d7
children 024226dd9f51
comparison
equal deleted inserted replaced
355:e7a3fa8f4eec 371:dfcc5b355f33
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);
211 this, SLOT(paneDeleteButtonClicked(Pane *))); 213 this, SLOT(paneDeleteButtonClicked(Pane *)));
212 214
213 m_playSource = new AudioCallbackPlaySource(m_viewManager, 215 m_playSource = new AudioCallbackPlaySource(m_viewManager,
214 QApplication::applicationName()); 216 QApplication::applicationName());
215 217
216 connect(m_playSource, SIGNAL(sampleRateMismatch(size_t, size_t, bool)), 218 connect(m_playSource, SIGNAL(sampleRateMismatch(int, int, bool)),
217 this, SLOT(sampleRateMismatch(size_t, size_t, bool))); 219 this, SLOT(sampleRateMismatch(int, int, bool)));
218 connect(m_playSource, SIGNAL(audioOverloadPluginDisabled()), 220 connect(m_playSource, SIGNAL(audioOverloadPluginDisabled()),
219 this, SLOT(audioOverloadPluginDisabled())); 221 this, SLOT(audioOverloadPluginDisabled()));
220 connect(m_playSource, SIGNAL(audioTimeStretchMultiChannelDisabled()), 222 connect(m_playSource, SIGNAL(audioTimeStretchMultiChannelDisabled()),
221 this, SLOT(audioTimeStretchMultiChannelDisabled())); 223 this, SLOT(audioTimeStretchMultiChannelDisabled()));
222 224
223 connect(m_viewManager, SIGNAL(outputLevelsChanged(float, float)), 225 connect(m_viewManager, SIGNAL(outputLevelsChanged(float, float)),
224 this, SLOT(outputLevelsChanged(float, float))); 226 this, SLOT(outputLevelsChanged(float, float)));
225 227
226 connect(m_viewManager, SIGNAL(playbackFrameChanged(unsigned long)), 228 connect(m_viewManager, SIGNAL(playbackFrameChanged(int)),
227 this, SLOT(playbackFrameChanged(unsigned long))); 229 this, SLOT(playbackFrameChanged(int)));
228 230
229 connect(m_viewManager, SIGNAL(globalCentreFrameChanged(unsigned long)), 231 connect(m_viewManager, SIGNAL(globalCentreFrameChanged(int)),
230 this, SLOT(globalCentreFrameChanged(unsigned long))); 232 this, SLOT(globalCentreFrameChanged(int)));
231 233
232 connect(m_viewManager, SIGNAL(viewCentreFrameChanged(View *, unsigned long)), 234 connect(m_viewManager, SIGNAL(viewCentreFrameChanged(View *, int)),
233 this, SLOT(viewCentreFrameChanged(View *, unsigned long))); 235 this, SLOT(viewCentreFrameChanged(View *, int)));
234 236
235 connect(m_viewManager, SIGNAL(viewZoomLevelChanged(View *, unsigned long, bool)), 237 connect(m_viewManager, SIGNAL(viewZoomLevelChanged(View *, int, bool)),
236 this, SLOT(viewZoomLevelChanged(View *, unsigned long, bool))); 238 this, SLOT(viewZoomLevelChanged(View *, int, bool)));
237 239
238 connect(Preferences::getInstance(), 240 connect(Preferences::getInstance(),
239 SIGNAL(propertyChanged(PropertyContainer::PropertyName)), 241 SIGNAL(propertyChanged(PropertyContainer::PropertyName)),
240 this, 242 this,
241 SLOT(preferenceChanged(PropertyContainer::PropertyName))); 243 SLOT(preferenceChanged(PropertyContainer::PropertyName)));
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 }
742 if (!model) return; 722 if (!model) return;
743 723
744 Pane *currentPane = m_paneStack->getCurrentPane(); 724 Pane *currentPane = m_paneStack->getCurrentPane();
745 if (!currentPane) return; 725 if (!currentPane) return;
746 726
747 size_t startFrame, endFrame; 727 int startFrame, endFrame;
748 728
749 if (currentPane->getStartFrame() < 0) startFrame = 0; 729 if (currentPane->getStartFrame() < 0) startFrame = 0;
750 else startFrame = currentPane->getStartFrame(); 730 else startFrame = currentPane->getStartFrame();
751 731
752 if (currentPane->getEndFrame() > model->getEndFrame()) endFrame = model->getEndFrame(); 732 if (currentPane->getEndFrame() > model->getEndFrame()) endFrame = model->getEndFrame();
813 } 793 }
814 794
815 void 795 void
816 MainWindowBase::pasteAtPlaybackPosition() 796 MainWindowBase::pasteAtPlaybackPosition()
817 { 797 {
818 unsigned long pos = getFrame(); 798 int pos = getFrame();
819 Clipboard &clipboard = m_viewManager->getClipboard(); 799 Clipboard &clipboard = m_viewManager->getClipboard();
820 if (!clipboard.empty()) { 800 if (!clipboard.empty()) {
821 long firstEventFrame = clipboard.getPoints()[0].getFrame(); 801 int firstEventFrame = clipboard.getPoints()[0].getFrame();
822 long offset = 0; 802 int offset = 0;
823 if (firstEventFrame < 0) { 803 if (firstEventFrame < 0) {
824 offset = (long)pos - firstEventFrame; 804 offset = pos - firstEventFrame;
825 } else if (firstEventFrame < pos) { 805 } else if (firstEventFrame < pos) {
826 offset = pos - (unsigned long)firstEventFrame; 806 offset = pos - firstEventFrame;
827 } else { 807 } else {
828 offset = -((unsigned long)firstEventFrame - pos); 808 offset = -(firstEventFrame - pos);
829 } 809 }
830 pasteRelative(offset); 810 pasteRelative(offset);
831 } 811 }
832 } 812 }
833 813
896 } 876 }
897 } 877 }
898 878
899 // FrameTimer method 879 // FrameTimer method
900 880
901 unsigned long 881 int
902 MainWindowBase::getFrame() const 882 MainWindowBase::getFrame() const
903 { 883 {
904 if (m_playSource && m_playSource->isPlaying()) { 884 if (m_playSource && m_playSource->isPlaying()) {
905 return m_playSource->getCurrentPlayingFrame(); 885 return m_playSource->getCurrentPlayingFrame();
906 } else { 886 } else {
918 MainWindowBase::insertInstantsAtBoundaries() 898 MainWindowBase::insertInstantsAtBoundaries()
919 { 899 {
920 MultiSelection::SelectionList selections = m_viewManager->getSelections(); 900 MultiSelection::SelectionList selections = m_viewManager->getSelections();
921 for (MultiSelection::SelectionList::iterator i = selections.begin(); 901 for (MultiSelection::SelectionList::iterator i = selections.begin();
922 i != selections.end(); ++i) { 902 i != selections.end(); ++i) {
923 size_t start = i->getStartFrame(); 903 int start = i->getStartFrame();
924 size_t end = i->getEndFrame(); 904 int end = i->getEndFrame();
925 if (start != end) { 905 if (start != end) {
926 insertInstantAt(start); 906 insertInstantAt(start);
927 insertInstantAt(end); 907 insertInstantAt(end);
928 } 908 }
929 } 909 }
930 } 910 }
931 911
932 void 912 void
933 MainWindowBase::insertInstantAt(size_t frame) 913 MainWindowBase::insertInstantAt(int frame)
934 { 914 {
935 Pane *pane = m_paneStack->getCurrentPane(); 915 Pane *pane = m_paneStack->getCurrentPane();
936 if (!pane) { 916 if (!pane) {
937 return; 917 return;
938 } 918 }
1020 MainWindowBase::insertItemAtSelection() 1000 MainWindowBase::insertItemAtSelection()
1021 { 1001 {
1022 MultiSelection::SelectionList selections = m_viewManager->getSelections(); 1002 MultiSelection::SelectionList selections = m_viewManager->getSelections();
1023 for (MultiSelection::SelectionList::iterator i = selections.begin(); 1003 for (MultiSelection::SelectionList::iterator i = selections.begin();
1024 i != selections.end(); ++i) { 1004 i != selections.end(); ++i) {
1025 size_t start = i->getStartFrame(); 1005 int start = i->getStartFrame();
1026 size_t end = i->getEndFrame(); 1006 int end = i->getEndFrame();
1027 if (start < end) { 1007 if (start < end) {
1028 insertItemAt(start, end - start); 1008 insertItemAt(start, end - start);
1029 } 1009 }
1030 } 1010 }
1031 } 1011 }
1032 1012
1033 void 1013 void
1034 MainWindowBase::insertItemAt(size_t frame, size_t duration) 1014 MainWindowBase::insertItemAt(int frame, int duration)
1035 { 1015 {
1036 Pane *pane = m_paneStack->getCurrentPane(); 1016 Pane *pane = m_paneStack->getCurrentPane();
1037 if (!pane) { 1017 if (!pane) {
1038 return; 1018 return;
1039 } 1019 }
1040 1020
1041 // ugh! 1021 // ugh!
1042 1022
1043 size_t alignedStart = pane->alignFromReference(frame); 1023 int alignedStart = pane->alignFromReference(frame);
1044 size_t alignedEnd = pane->alignFromReference(frame + duration); 1024 int alignedEnd = pane->alignFromReference(frame + duration);
1045 if (alignedStart >= alignedEnd) return; 1025 if (alignedStart >= alignedEnd) return;
1046 size_t alignedDuration = alignedEnd - alignedStart; 1026 int alignedDuration = alignedEnd - alignedStart;
1047 1027
1048 Command *c = 0; 1028 Command *c = 0;
1049 1029
1050 QString name = tr("Add Item at %1 s") 1030 QString name = tr("Add Item at %1 s")
1051 .arg(RealTime::frame2RealTime 1031 .arg(RealTime::frame2RealTime
1235 if (!source.isAvailable()) return FileOpenFailed; 1215 if (!source.isAvailable()) return FileOpenFailed;
1236 source.waitForData(); 1216 source.waitForData();
1237 1217
1238 m_openingAudioFile = true; 1218 m_openingAudioFile = true;
1239 1219
1240 size_t rate = 0; 1220 int 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()) {
1936 } 1917 }
1937 1918
1938 MainWindowBase::FileOpenStatus 1919 MainWindowBase::FileOpenStatus
1939 MainWindowBase::openLayersFromRDF(FileSource source) 1920 MainWindowBase::openLayersFromRDF(FileSource source)
1940 { 1921 {
1941 size_t rate = 0; 1922 int rate = 0;
1942 1923
1943 SVDEBUG << "MainWindowBase::openLayersFromRDF" << endl; 1924 SVDEBUG << "MainWindowBase::openLayersFromRDF" << endl;
1944 1925
1945 ProgressDialog dialog(tr("Importing from RDF..."), true, 2000, this); 1926 ProgressDialog dialog(tr("Importing from RDF..."), true, 2000, this);
1946 connect(&dialog, SIGNAL(showing()), this, SIGNAL(hideSplash())); 1927 connect(&dialog, SIGNAL(showing()), this, SIGNAL(hideSplash()));
2314 if (!currentPane) return; 2295 if (!currentPane) return;
2315 2296
2316 Model *model = getMainModel(); 2297 Model *model = getMainModel();
2317 if (!model) return; 2298 if (!model) return;
2318 2299
2319 size_t start = model->getStartFrame(); 2300 int start = model->getStartFrame();
2320 size_t end = model->getEndFrame(); 2301 int end = model->getEndFrame();
2321 if (m_playSource) end = std::max(end, m_playSource->getPlayEndFrame()); 2302 if (m_playSource) end = std::max(end, m_playSource->getPlayEndFrame());
2322 size_t pixels = currentPane->width(); 2303 int pixels = currentPane->width();
2323 2304
2324 size_t sw = currentPane->getVerticalScaleWidth(); 2305 int sw = currentPane->getVerticalScaleWidth();
2325 if (pixels > sw * 2) pixels -= sw * 2; 2306 if (pixels > sw * 2) pixels -= sw * 2;
2326 else pixels = 1; 2307 else pixels = 1;
2327 if (pixels > 4) pixels -= 4; 2308 if (pixels > 4) pixels -= 4;
2328 2309
2329 size_t zoomLevel = (end - start) / pixels; 2310 int zoomLevel = (end - start) / pixels;
2330 if (zoomLevel < 1) zoomLevel = 1; 2311 if (zoomLevel < 1) zoomLevel = 1;
2331 2312
2332 currentPane->setZoomLevel(zoomLevel); 2313 currentPane->setZoomLevel(zoomLevel);
2333 currentPane->setCentreFrame((start + end) / 2); 2314 currentPane->setCentreFrame((start + end) / 2);
2334 } 2315 }
2542 int frame = m_viewManager->getPlaybackFrame(); 2523 int frame = m_viewManager->getPlaybackFrame();
2543 ++frame; 2524 ++frame;
2544 2525
2545 Pane *pane = m_paneStack->getCurrentPane(); 2526 Pane *pane = m_paneStack->getCurrentPane();
2546 Layer *layer = getSnapLayer(); 2527 Layer *layer = getSnapLayer();
2547 size_t sr = getMainModel()->getSampleRate(); 2528 int 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 {
2558 2539
2559 size_t resolution = 0; 2540 int resolution = 0;
2560 if (pane) frame = pane->alignFromReference(frame); 2541 if (pane) frame = pane->alignFromReference(frame);
2561 if (layer->snapToFeatureFrame(m_paneStack->getCurrentPane(), 2542 if (layer->snapToFeatureFrame(m_paneStack->getCurrentPane(),
2562 frame, resolution, Layer::SnapRight)) { 2543 frame, resolution, Layer::SnapRight)) {
2563 if (pane) frame = pane->alignToReference(frame); 2544 if (pane) frame = pane->alignToReference(frame);
2564 } else { 2545 } else {
2567 } 2548 }
2568 2549
2569 if (frame < 0) frame = 0; 2550 if (frame < 0) frame = 0;
2570 2551
2571 if (m_viewManager->getPlaySelectionMode()) { 2552 if (m_viewManager->getPlaySelectionMode()) {
2572 frame = m_viewManager->constrainFrameToSelection(size_t(frame)); 2553 frame = m_viewManager->constrainFrameToSelection(int(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 }
2591 m_playSource->isPlaying() && 2572 m_playSource->isPlaying() &&
2592 !m_viewManager->getPlayLoopMode()) { 2573 !m_viewManager->getPlayLoopMode()) {
2593 stop(); 2574 stop();
2594 } 2575 }
2595 2576
2596 size_t frame = getMainModel()->getEndFrame(); 2577 int frame = getMainModel()->getEndFrame();
2597 2578
2598 if (m_viewManager->getPlaySelectionMode()) { 2579 if (m_viewManager->getPlaySelectionMode()) {
2599 frame = m_viewManager->constrainFrameToSelection(frame); 2580 frame = m_viewManager->constrainFrameToSelection(frame);
2600 } 2581 }
2601 2582
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 int 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(),
2621 frame, resolution, Layer::SnapRight)) { 2600 frame, resolution, Layer::SnapRight)) {
2622 if (pane) frame = pane->alignToReference(frame); 2601 if (pane) frame = pane->alignToReference(frame);
2623 } else { 2602 } else {
2625 } 2604 }
2626 2605
2627 if (frame < 0) frame = 0; 2606 if (frame < 0) frame = 0;
2628 2607
2629 if (m_viewManager->getPlaySelectionMode()) { 2608 if (m_viewManager->getPlaySelectionMode()) {
2630 frame = m_viewManager->constrainFrameToSelection(size_t(frame)); 2609 frame = m_viewManager->constrainFrameToSelection(int(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 }
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();
2652 Layer *layer = getSnapLayer(); 2631 Layer *layer = getSnapLayer();
2653 size_t sr = getMainModel()->getSampleRate(); 2632 int sr = getMainModel()->getSampleRate();
2654 2633
2655 // when rewinding during playback, we want to allow a period 2634 // when rewinding during playback, we want to allow a period
2656 // following a rewind target point at which the rewind will go to 2635 // following a rewind target point at which the rewind will go to
2657 // the prior point instead of the immediately neighbouring one 2636 // the prior point instead of the immediately neighbouring one
2658 if (m_playSource && m_playSource->isPlaying()) { 2637 if (m_playSource && m_playSource->isPlaying()) {
2659 RealTime ct = RealTime::frame2RealTime(frame, sr); 2638 RealTime ct = RealTime::frame2RealTime(frame, sr);
2660 ct = ct - RealTime::fromSeconds(0.25); 2639 ct = ct - RealTime::fromSeconds(0.15);
2661 if (ct < RealTime::zeroTime) ct = RealTime::zeroTime; 2640 if (ct < RealTime::zeroTime) ct = RealTime::zeroTime;
2662 frame = RealTime::realTime2Frame(ct, sr); 2641 frame = RealTime::realTime2Frame(ct, sr);
2663 } 2642 }
2664 2643
2665 if (!layer) { 2644 if (!layer) {
2666 2645
2667 frame = RealTime::realTime2Frame 2646 frame = RealTime::realTime2Frame
2668 (RealTime::frame2RealTime(frame, sr) - RealTime(2, 0), sr); 2647 (RealTime::frame2RealTime(frame, sr) - m_defaultFfwdRwdStep, sr);
2669 if (frame < int(getMainModel()->getStartFrame())) { 2648 if (frame < int(getMainModel()->getStartFrame())) {
2670 frame = getMainModel()->getStartFrame(); 2649 frame = getMainModel()->getStartFrame();
2671 } 2650 }
2672 2651
2673 } else { 2652 } else {
2674 2653
2675 size_t resolution = 0; 2654 int resolution = 0;
2676 if (pane) frame = pane->alignFromReference(frame); 2655 if (pane) frame = pane->alignFromReference(frame);
2677 if (layer->snapToFeatureFrame(m_paneStack->getCurrentPane(), 2656 if (layer->snapToFeatureFrame(m_paneStack->getCurrentPane(),
2678 frame, resolution, Layer::SnapLeft)) { 2657 frame, resolution, Layer::SnapLeft)) {
2679 if (pane) frame = pane->alignToReference(frame); 2658 if (pane) frame = pane->alignToReference(frame);
2680 } else { 2659 } else {
2683 } 2662 }
2684 2663
2685 if (frame < 0) frame = 0; 2664 if (frame < 0) frame = 0;
2686 2665
2687 if (m_viewManager->getPlaySelectionMode()) { 2666 if (m_viewManager->getPlaySelectionMode()) {
2688 frame = m_viewManager->constrainFrameToSelection(size_t(frame)); 2667 frame = m_viewManager->constrainFrameToSelection(int(frame));
2689 } 2668 }
2690 2669
2691 m_viewManager->setPlaybackFrame(frame); 2670 m_viewManager->setPlaybackFrame(frame);
2692 } 2671 }
2693 2672
2694 void 2673 void
2695 MainWindowBase::rewindStart() 2674 MainWindowBase::rewindStart()
2696 { 2675 {
2697 if (!getMainModel()) return; 2676 if (!getMainModel()) return;
2698 2677
2699 size_t frame = getMainModel()->getStartFrame(); 2678 int frame = getMainModel()->getStartFrame();
2700 2679
2701 if (m_viewManager->getPlaySelectionMode()) { 2680 if (m_viewManager->getPlaySelectionMode()) {
2702 frame = m_viewManager->constrainFrameToSelection(frame); 2681 frame = m_viewManager->constrainFrameToSelection(frame);
2703 } 2682 }
2704 2683
2712 2691
2713 Layer *layer = getSnapLayer(); 2692 Layer *layer = getSnapLayer();
2714 if (!layer) { rewind(); return; } 2693 if (!layer) { rewind(); return; }
2715 2694
2716 Pane *pane = m_paneStack->getCurrentPane(); 2695 Pane *pane = m_paneStack->getCurrentPane();
2717 size_t sr = getMainModel()->getSampleRate();
2718
2719 int frame = m_viewManager->getPlaybackFrame(); 2696 int frame = m_viewManager->getPlaybackFrame();
2720 2697
2721 size_t resolution = 0; 2698 int resolution = 0;
2722 if (pane) frame = pane->alignFromReference(frame); 2699 if (pane) frame = pane->alignFromReference(frame);
2723 if (layer->snapToSimilarFeature(m_paneStack->getCurrentPane(), 2700 if (layer->snapToSimilarFeature(m_paneStack->getCurrentPane(),
2724 frame, resolution, Layer::SnapLeft)) { 2701 frame, resolution, Layer::SnapLeft)) {
2725 if (pane) frame = pane->alignToReference(frame); 2702 if (pane) frame = pane->alignToReference(frame);
2726 } else { 2703 } else {
2728 } 2705 }
2729 2706
2730 if (frame < 0) frame = 0; 2707 if (frame < 0) frame = 0;
2731 2708
2732 if (m_viewManager->getPlaySelectionMode()) { 2709 if (m_viewManager->getPlaySelectionMode()) {
2733 frame = m_viewManager->constrainFrameToSelection(size_t(frame)); 2710 frame = m_viewManager->constrainFrameToSelection(int(frame));
2734 } 2711 }
2735 2712
2736 m_viewManager->setPlaybackFrame(frame); 2713 m_viewManager->setPlaybackFrame(frame);
2737 } 2714 }
2738 2715
2940 2917
2941 void 2918 void
2942 MainWindowBase::connectLayerEditDialog(ModelDataTableDialog *dialog) 2919 MainWindowBase::connectLayerEditDialog(ModelDataTableDialog *dialog)
2943 { 2920 {
2944 connect(m_viewManager, 2921 connect(m_viewManager,
2945 SIGNAL(globalCentreFrameChanged(unsigned long)), 2922 SIGNAL(globalCentreFrameChanged(int)),
2946 dialog, 2923 dialog,
2947 SLOT(userScrolledToFrame(unsigned long))); 2924 SLOT(userScrolledToFrame(int)));
2948 2925
2949 connect(m_viewManager, 2926 connect(m_viewManager,
2950 SIGNAL(playbackFrameChanged(unsigned long)), 2927 SIGNAL(playbackFrameChanged(int)),
2951 dialog, 2928 dialog,
2952 SLOT(playbackScrolledToFrame(unsigned long))); 2929 SLOT(playbackScrolledToFrame(int)));
2953 2930
2954 connect(dialog, 2931 connect(dialog,
2955 SIGNAL(scrollToFrame(unsigned long)), 2932 SIGNAL(scrollToFrame(int)),
2956 m_viewManager, 2933 m_viewManager,
2957 SLOT(setGlobalCentreFrame(unsigned long))); 2934 SLOT(setGlobalCentreFrame(int)));
2958 2935
2959 connect(dialog, 2936 connect(dialog,
2960 SIGNAL(scrollToFrame(unsigned long)), 2937 SIGNAL(scrollToFrame(int)),
2961 m_viewManager, 2938 m_viewManager,
2962 SLOT(setPlaybackFrame(unsigned long))); 2939 SLOT(setPlaybackFrame(int)));
2963 } 2940 }
2964 2941
2965 void 2942 void
2966 MainWindowBase::previousPane() 2943 MainWindowBase::previousPane()
2967 { 2944 {
3045 } 3022 }
3046 } 3023 }
3047 } 3024 }
3048 3025
3049 void 3026 void
3050 MainWindowBase::playbackFrameChanged(unsigned long frame) 3027 MainWindowBase::playbackFrameChanged(int frame)
3051 { 3028 {
3052 if (!(m_playSource && m_playSource->isPlaying()) || !getMainModel()) return; 3029 if (!(m_playSource && m_playSource->isPlaying()) || !getMainModel()) return;
3053 3030
3054 updatePositionStatusDisplays(); 3031 updatePositionStatusDisplays();
3055 3032
3081 3058
3082 statusBar()->showMessage(m_myStatusMessage); 3059 statusBar()->showMessage(m_myStatusMessage);
3083 } 3060 }
3084 3061
3085 void 3062 void
3086 MainWindowBase::globalCentreFrameChanged(unsigned long ) 3063 MainWindowBase::globalCentreFrameChanged(int )
3087 { 3064 {
3088 if ((m_playSource && m_playSource->isPlaying()) || !getMainModel()) return; 3065 if ((m_playSource && m_playSource->isPlaying()) || !getMainModel()) return;
3089 Pane *p = 0; 3066 Pane *p = 0;
3090 if (!m_paneStack || !(p = m_paneStack->getCurrentPane())) return; 3067 if (!m_paneStack || !(p = m_paneStack->getCurrentPane())) return;
3091 if (!p->getFollowGlobalPan()) return; 3068 if (!p->getFollowGlobalPan()) return;
3092 updateVisibleRangeDisplay(p); 3069 updateVisibleRangeDisplay(p);
3093 } 3070 }
3094 3071
3095 void 3072 void
3096 MainWindowBase::viewCentreFrameChanged(View *v, unsigned long frame) 3073 MainWindowBase::viewCentreFrameChanged(View *v, int frame)
3097 { 3074 {
3098 // SVDEBUG << "MainWindowBase::viewCentreFrameChanged(" << v << "," << frame << ")" << endl; 3075 // SVDEBUG << "MainWindowBase::viewCentreFrameChanged(" << v << "," << frame << ")" << endl;
3099 3076
3100 if (m_viewDataDialogMap.find(v) != m_viewDataDialogMap.end()) { 3077 if (m_viewDataDialogMap.find(v) != m_viewDataDialogMap.end()) {
3101 for (DataDialogSet::iterator i = m_viewDataDialogMap[v].begin(); 3078 for (DataDialogSet::iterator i = m_viewDataDialogMap[v].begin();
3108 if (!m_paneStack || !(p = m_paneStack->getCurrentPane())) return; 3085 if (!m_paneStack || !(p = m_paneStack->getCurrentPane())) return;
3109 if (v == p) updateVisibleRangeDisplay(p); 3086 if (v == p) updateVisibleRangeDisplay(p);
3110 } 3087 }
3111 3088
3112 void 3089 void
3113 MainWindowBase::viewZoomLevelChanged(View *v, unsigned long , bool ) 3090 MainWindowBase::viewZoomLevelChanged(View *v, int , bool )
3114 { 3091 {
3115 if ((m_playSource && m_playSource->isPlaying()) || !getMainModel()) return; 3092 if ((m_playSource && m_playSource->isPlaying()) || !getMainModel()) return;
3116 Pane *p = 0; 3093 Pane *p = 0;
3117 if (!m_paneStack || !(p = m_paneStack->getCurrentPane())) return; 3094 if (!m_paneStack || !(p = m_paneStack->getCurrentPane())) return;
3118 if (v == p) updateVisibleRangeDisplay(p); 3095 if (v == p) updateVisibleRangeDisplay(p);
3211 MainWindowBase::mainModelChanged(WaveFileModel *model) 3188 MainWindowBase::mainModelChanged(WaveFileModel *model)
3212 { 3189 {
3213 // SVDEBUG << "MainWindowBase::mainModelChanged(" << model << ")" << endl; 3190 // SVDEBUG << "MainWindowBase::mainModelChanged(" << model << ")" << endl;
3214 updateDescriptionLabel(); 3191 updateDescriptionLabel();
3215 if (model) m_viewManager->setMainModelSampleRate(model->getSampleRate()); 3192 if (model) m_viewManager->setMainModelSampleRate(model->getSampleRate());
3216 if (model && !m_playTarget && m_audioOutput) createPlayTarget(); 3193 if (model && !m_playTarget && m_audioOutput) {
3194 createPlayTarget();
3195 }
3217 } 3196 }
3218 3197
3219 void 3198 void
3220 MainWindowBase::modelAboutToBeDeleted(Model *model) 3199 MainWindowBase::modelAboutToBeDeleted(Model *model)
3221 { 3200 {
3314 #ifdef Q_OS_MAC 3293 #ifdef Q_OS_MAC
3315 args.append(url); 3294 args.append(url);
3316 process->start("open", args); 3295 process->start("open", args);
3317 #else 3296 #else
3318 #ifdef Q_OS_WIN32 3297 #ifdef Q_OS_WIN32
3319 3298 QString pf(getenv("ProgramFiles"));
3320 QString pf(getenv("ProgramFiles")); 3299 QString command = pf + QString("\\Internet Explorer\\IEXPLORE.EXE");
3321 QString command = pf + QString("\\Internet Explorer\\IEXPLORE.EXE"); 3300
3322 3301 args.append(url);
3323 args.append(url); 3302 process->start(command, args);
3324 process->start(command, args);
3325
3326 #else 3303 #else
3327 #ifdef Q_WS_X11
3328 if (!qgetenv("KDE_FULL_SESSION").isEmpty()) { 3304 if (!qgetenv("KDE_FULL_SESSION").isEmpty()) {
3329 args.append("exec"); 3305 args.append("exec");
3330 args.append(url); 3306 args.append(url);
3331 process->start("kfmclient", args); 3307 process->start("kfmclient", args);
3332 } else if (!qgetenv("BROWSER").isEmpty()) { 3308 } else if (!qgetenv("BROWSER").isEmpty()) {
3336 args.append(url); 3312 args.append(url);
3337 process->start("firefox", args); 3313 process->start("firefox", args);
3338 } 3314 }
3339 #endif 3315 #endif
3340 #endif 3316 #endif
3341 #endif
3342 } 3317 }
3343 3318
3344 3319