Mercurial > hg > svapp
comparison framework/MainWindowBase.cpp @ 450:d9d132c0e240 alignment_view
Merge from default branch
| author | Chris Cannam | 
|---|---|
| date | Mon, 20 Apr 2015 09:21:32 +0100 | 
| parents | a9141963b580 ba789baf642b | 
| children | 74d575708e06 | 
   comparison
  equal
  deleted
  inserted
  replaced
| 430:adfb2948fabf | 450:d9d132c0e240 | 
|---|---|
| 52 #include "audioio/AudioTargetFactory.h" | 52 #include "audioio/AudioTargetFactory.h" | 
| 53 #include "audioio/PlaySpeedRangeMapper.h" | 53 #include "audioio/PlaySpeedRangeMapper.h" | 
| 54 #include "data/fileio/DataFileReaderFactory.h" | 54 #include "data/fileio/DataFileReaderFactory.h" | 
| 55 #include "data/fileio/PlaylistFileReader.h" | 55 #include "data/fileio/PlaylistFileReader.h" | 
| 56 #include "data/fileio/WavFileWriter.h" | 56 #include "data/fileio/WavFileWriter.h" | 
| 57 #include "data/fileio/CSVFileWriter.h" | |
| 58 #include "data/fileio/MIDIFileWriter.h" | 57 #include "data/fileio/MIDIFileWriter.h" | 
| 59 #include "data/fileio/BZipFileDevice.h" | 58 #include "data/fileio/BZipFileDevice.h" | 
| 60 #include "data/fileio/FileSource.h" | 59 #include "data/fileio/FileSource.h" | 
| 61 #include "data/fileio/AudioFileReaderFactory.h" | 60 #include "data/fileio/AudioFileReaderFactory.h" | 
| 62 #include "rdf/RDFImporter.h" | 61 #include "rdf/RDFImporter.h" | 
| 88 #include <QTreeView> | 87 #include <QTreeView> | 
| 89 #include <QFile> | 88 #include <QFile> | 
| 90 #include <QFileInfo> | 89 #include <QFileInfo> | 
| 91 #include <QDir> | 90 #include <QDir> | 
| 92 #include <QTextStream> | 91 #include <QTextStream> | 
| 92 #include <QTextCodec> | |
| 93 #include <QProcess> | 93 #include <QProcess> | 
| 94 #include <QShortcut> | 94 #include <QShortcut> | 
| 95 #include <QSettings> | 95 #include <QSettings> | 
| 96 #include <QDateTime> | 96 #include <QDateTime> | 
| 97 #include <QProcess> | 97 #include <QProcess> | 
| 102 #include <QSignalMapper> | 102 #include <QSignalMapper> | 
| 103 | 103 | 
| 104 #include <iostream> | 104 #include <iostream> | 
| 105 #include <cstdio> | 105 #include <cstdio> | 
| 106 #include <errno.h> | 106 #include <errno.h> | 
| 107 | |
| 108 | |
| 109 | |
| 110 | 107 | 
| 111 using std::vector; | 108 using std::vector; | 
| 112 using std::map; | 109 using std::map; | 
| 113 using std::set; | 110 using std::set; | 
| 114 | 111 | 
| 159 m_iconsVisibleInMenus(true), | 156 m_iconsVisibleInMenus(true), | 
| 160 m_menuShortcutMapper(0) | 157 m_menuShortcutMapper(0) | 
| 161 { | 158 { | 
| 162 Profiler profiler("MainWindowBase::MainWindowBase"); | 159 Profiler profiler("MainWindowBase::MainWindowBase"); | 
| 163 | 160 | 
| 161 qRegisterMetaType<sv_frame_t>("sv_frame_t"); | |
| 162 qRegisterMetaType<sv_samplerate_t>("sv_samplerate_t"); | |
| 163 | |
| 164 #ifdef Q_WS_X11 | 164 #ifdef Q_WS_X11 | 
| 165 XSetErrorHandler(handle_x11_error); | 165 XSetErrorHandler(handle_x11_error); | 
| 166 #endif | 166 #endif | 
| 167 | 167 | 
| 168 connect(CommandHistory::getInstance(), SIGNAL(commandExecuted()), | 168 connect(CommandHistory::getInstance(), SIGNAL(commandExecuted()), | 
| 176 connect(m_viewManager, SIGNAL(inProgressSelectionChanged()), | 176 connect(m_viewManager, SIGNAL(inProgressSelectionChanged()), | 
| 177 this, SLOT(inProgressSelectionChanged())); | 177 this, SLOT(inProgressSelectionChanged())); | 
| 178 | 178 | 
| 179 // set a sensible default font size for views -- cannot do this | 179 // set a sensible default font size for views -- cannot do this | 
| 180 // in Preferences, which is in base and not supposed to use QtGui | 180 // in Preferences, which is in base and not supposed to use QtGui | 
| 181 int viewFontSize = QApplication::font().pointSize() * 0.9; | 181 int viewFontSize = int(QApplication::font().pointSize() * 0.9); | 
| 182 QSettings settings; | 182 QSettings settings; | 
| 183 settings.beginGroup("Preferences"); | 183 settings.beginGroup("Preferences"); | 
| 184 viewFontSize = settings.value("view-font-size", viewFontSize).toInt(); | 184 viewFontSize = settings.value("view-font-size", viewFontSize).toInt(); | 
| 185 settings.setValue("view-font-size", viewFontSize); | 185 settings.setValue("view-font-size", viewFontSize); | 
| 186 settings.endGroup(); | 186 settings.endGroup(); | 
| 216 this, SLOT(paneDeleteButtonClicked(Pane *))); | 216 this, SLOT(paneDeleteButtonClicked(Pane *))); | 
| 217 | 217 | 
| 218 m_playSource = new AudioCallbackPlaySource(m_viewManager, | 218 m_playSource = new AudioCallbackPlaySource(m_viewManager, | 
| 219 QApplication::applicationName()); | 219 QApplication::applicationName()); | 
| 220 | 220 | 
| 221 connect(m_playSource, SIGNAL(sampleRateMismatch(int, int, bool)), | 221 connect(m_playSource, SIGNAL(sampleRateMismatch(sv_samplerate_t, sv_samplerate_t, bool)), | 
| 222 this, SLOT(sampleRateMismatch(int, int, bool))); | 222 this, SLOT(sampleRateMismatch(sv_samplerate_t, sv_samplerate_t, bool))); | 
| 223 connect(m_playSource, SIGNAL(audioOverloadPluginDisabled()), | 223 connect(m_playSource, SIGNAL(audioOverloadPluginDisabled()), | 
| 224 this, SLOT(audioOverloadPluginDisabled())); | 224 this, SLOT(audioOverloadPluginDisabled())); | 
| 225 connect(m_playSource, SIGNAL(audioTimeStretchMultiChannelDisabled()), | 225 connect(m_playSource, SIGNAL(audioTimeStretchMultiChannelDisabled()), | 
| 226 this, SLOT(audioTimeStretchMultiChannelDisabled())); | 226 this, SLOT(audioTimeStretchMultiChannelDisabled())); | 
| 227 | 227 | 
| 228 connect(m_viewManager, SIGNAL(outputLevelsChanged(float, float)), | 228 connect(m_viewManager, SIGNAL(outputLevelsChanged(float, float)), | 
| 229 this, SLOT(outputLevelsChanged(float, float))); | 229 this, SLOT(outputLevelsChanged(float, float))); | 
| 230 | 230 | 
| 231 connect(m_viewManager, SIGNAL(playbackFrameChanged(int)), | 231 connect(m_viewManager, SIGNAL(playbackFrameChanged(sv_frame_t)), | 
| 232 this, SLOT(playbackFrameChanged(int))); | 232 this, SLOT(playbackFrameChanged(sv_frame_t))); | 
| 233 | 233 | 
| 234 connect(m_viewManager, SIGNAL(globalCentreFrameChanged(int)), | 234 connect(m_viewManager, SIGNAL(globalCentreFrameChanged(sv_frame_t)), | 
| 235 this, SLOT(globalCentreFrameChanged(int))); | 235 this, SLOT(globalCentreFrameChanged(sv_frame_t))); | 
| 236 | 236 | 
| 237 connect(m_viewManager, SIGNAL(viewCentreFrameChanged(View *, int)), | 237 connect(m_viewManager, SIGNAL(viewCentreFrameChanged(View *, sv_frame_t)), | 
| 238 this, SLOT(viewCentreFrameChanged(View *, int))); | 238 this, SLOT(viewCentreFrameChanged(View *, sv_frame_t))); | 
| 239 | 239 | 
| 240 connect(m_viewManager, SIGNAL(viewZoomLevelChanged(View *, int, bool)), | 240 connect(m_viewManager, SIGNAL(viewZoomLevelChanged(View *, int, bool)), | 
| 241 this, SLOT(viewZoomLevelChanged(View *, int, bool))); | 241 this, SLOT(viewZoomLevelChanged(View *, int, bool))); | 
| 242 | 242 | 
| 243 connect(Preferences::getInstance(), | 243 connect(Preferences::getInstance(), | 
| 343 // i.e. that will not otherwise work. The downside is that if this | 343 // i.e. that will not otherwise work. The downside is that if this | 
| 344 // bug is fixed in a future Qt release, we will start getting | 344 // bug is fixed in a future Qt release, we will start getting | 
| 345 // "ambiguous shortcut" errors from the menu entry actions and | 345 // "ambiguous shortcut" errors from the menu entry actions and | 
| 346 // will need to update the code.) | 346 // will need to update the code.) | 
| 347 | 347 | 
| 348 // Update: The bug was fixed in Qt 5.4 for shortcuts with no | |
| 349 // modifier, and I believe it is fixed in Qt 5.5 for shortcuts | |
| 350 // with Shift modifiers. The below reflects that | |
| 351 | |
| 352 #if (QT_VERSION < QT_VERSION_CHECK(5, 5, 0)) | |
| 353 | |
| 348 if (!m_menuShortcutMapper) { | 354 if (!m_menuShortcutMapper) { | 
| 349 m_menuShortcutMapper = new QSignalMapper(this); | 355 m_menuShortcutMapper = new QSignalMapper(this); | 
| 350 connect(m_menuShortcutMapper, SIGNAL(mapped(QObject *)), | 356 connect(m_menuShortcutMapper, SIGNAL(mapped(QObject *)), | 
| 351 this, SLOT(menuActionMapperInvoked(QObject *))); | 357 this, SLOT(menuActionMapperInvoked(QObject *))); | 
| 352 } | 358 } | 
| 372 | 378 | 
| 373 // Note that the set of "single-key shortcuts" that aren't | 379 // Note that the set of "single-key shortcuts" that aren't | 
| 374 // working and that we need to handle here includes those | 380 // working and that we need to handle here includes those | 
| 375 // with the Shift modifier mask as well as those with no | 381 // with the Shift modifier mask as well as those with no | 
| 376 // modifier at all | 382 // modifier at all | 
| 383 #if (QT_VERSION >= QT_VERSION_CHECK(5, 5, 0)) | |
| 384 // Nothing needed | |
| 385 if (false) { | |
| 386 #elif (QT_VERSION >= QT_VERSION_CHECK(5, 4, 0)) | |
| 387 if (sc.count() == 1 && | |
| 388 (sc[0] & Qt::KeyboardModifierMask) == Qt::ShiftModifier) { | |
| 389 #else | |
| 377 if (sc.count() == 1 && | 390 if (sc.count() == 1 && | 
| 378 ((sc[0] & Qt::KeyboardModifierMask) == Qt::NoModifier || | 391 ((sc[0] & Qt::KeyboardModifierMask) == Qt::NoModifier || | 
| 379 (sc[0] & Qt::KeyboardModifierMask) == Qt::ShiftModifier)) { | 392 (sc[0] & Qt::KeyboardModifierMask) == Qt::ShiftModifier)) { | 
| 393 #endif | |
| 380 QShortcut *newSc = new QShortcut(sc, a->parentWidget()); | 394 QShortcut *newSc = new QShortcut(sc, a->parentWidget()); | 
| 381 QObject::connect(newSc, SIGNAL(activated()), | 395 QObject::connect(newSc, SIGNAL(activated()), | 
| 382 m_menuShortcutMapper, SLOT(map())); | 396 m_menuShortcutMapper, SLOT(map())); | 
| 383 m_menuShortcutMapper->setMapping(newSc, a); | 397 m_menuShortcutMapper->setMapping(newSc, a); | 
| 384 m_appShortcuts.push_back(newSc); | 398 m_appShortcuts.push_back(newSc); | 
| 385 } | 399 } | 
| 386 } | 400 } | 
| 387 } | 401 } | 
| 402 #endif | |
| 388 #endif | 403 #endif | 
| 389 } | 404 } | 
| 390 | 405 | 
| 391 void | 406 void | 
| 392 MainWindowBase::menuActionMapperInvoked(QObject *o) | 407 MainWindowBase::menuActionMapperInvoked(QObject *o) | 
| 689 // we want is the frame that was last committed to the soundcard | 704 // we want is the frame that was last committed to the soundcard | 
| 690 // buffers, as the audio driver will continue playing up to that | 705 // buffers, as the audio driver will continue playing up to that | 
| 691 // frame before switching to whichever one we decide we want to | 706 // frame before switching to whichever one we decide we want to | 
| 692 // switch to, regardless of our efforts. | 707 // switch to, regardless of our efforts. | 
| 693 | 708 | 
| 694 int frame = m_playSource->getCurrentBufferedFrame(); | 709 sv_frame_t frame = m_playSource->getCurrentBufferedFrame(); | 
| 695 | 710 | 
| 696 cerr << "currentPaneChanged: current frame (in ref model) = " << frame << endl; | 711 cerr << "currentPaneChanged: current frame (in ref model) = " << frame << endl; | 
| 697 | 712 | 
| 698 View::ModelSet soloModels = p->getModels(); | 713 View::ModelSet soloModels = p->getModels(); | 
| 699 | 714 | 
| 778 if (!model) return; | 793 if (!model) return; | 
| 779 | 794 | 
| 780 Pane *currentPane = m_paneStack->getCurrentPane(); | 795 Pane *currentPane = m_paneStack->getCurrentPane(); | 
| 781 if (!currentPane) return; | 796 if (!currentPane) return; | 
| 782 | 797 | 
| 783 int startFrame, endFrame; | 798 sv_frame_t startFrame, endFrame; | 
| 784 | 799 | 
| 785 if (currentPane->getStartFrame() < 0) startFrame = 0; | 800 if (currentPane->getStartFrame() < 0) startFrame = 0; | 
| 786 else startFrame = currentPane->getStartFrame(); | 801 else startFrame = currentPane->getStartFrame(); | 
| 787 | 802 | 
| 788 if (currentPane->getEndFrame() > model->getEndFrame()) endFrame = model->getEndFrame(); | 803 if (currentPane->getEndFrame() > model->getEndFrame()) endFrame = model->getEndFrame(); | 
| 849 } | 864 } | 
| 850 | 865 | 
| 851 void | 866 void | 
| 852 MainWindowBase::pasteAtPlaybackPosition() | 867 MainWindowBase::pasteAtPlaybackPosition() | 
| 853 { | 868 { | 
| 854 int pos = getFrame(); | 869 sv_frame_t pos = getFrame(); | 
| 855 Clipboard &clipboard = m_viewManager->getClipboard(); | 870 Clipboard &clipboard = m_viewManager->getClipboard(); | 
| 856 if (!clipboard.empty()) { | 871 if (!clipboard.empty()) { | 
| 857 int firstEventFrame = clipboard.getPoints()[0].getFrame(); | 872 sv_frame_t firstEventFrame = clipboard.getPoints()[0].getFrame(); | 
| 858 int offset = 0; | 873 sv_frame_t offset = 0; | 
| 859 if (firstEventFrame < 0) { | 874 if (firstEventFrame < 0) { | 
| 860 offset = pos - firstEventFrame; | 875 offset = pos - firstEventFrame; | 
| 861 } else if (firstEventFrame < pos) { | 876 } else if (firstEventFrame < pos) { | 
| 862 offset = pos - firstEventFrame; | 877 offset = pos - firstEventFrame; | 
| 863 } else { | 878 } else { | 
| 866 pasteRelative(offset); | 881 pasteRelative(offset); | 
| 867 } | 882 } | 
| 868 } | 883 } | 
| 869 | 884 | 
| 870 void | 885 void | 
| 871 MainWindowBase::pasteRelative(int offset) | 886 MainWindowBase::pasteRelative(sv_frame_t offset) | 
| 872 { | 887 { | 
| 873 Pane *currentPane = m_paneStack->getCurrentPane(); | 888 Pane *currentPane = m_paneStack->getCurrentPane(); | 
| 874 if (!currentPane) return; | 889 if (!currentPane) return; | 
| 875 | 890 | 
| 876 Layer *layer = currentPane->getSelectedLayer(); | 891 Layer *layer = currentPane->getSelectedLayer(); | 
| 934 } | 949 } | 
| 935 } | 950 } | 
| 936 | 951 | 
| 937 // FrameTimer method | 952 // FrameTimer method | 
| 938 | 953 | 
| 939 int | 954 sv_frame_t | 
| 940 MainWindowBase::getFrame() const | 955 MainWindowBase::getFrame() const | 
| 941 { | 956 { | 
| 942 if (m_playSource && m_playSource->isPlaying()) { | 957 if (m_playSource && m_playSource->isPlaying()) { | 
| 943 return m_playSource->getCurrentPlayingFrame(); | 958 return m_playSource->getCurrentPlayingFrame(); | 
| 944 } else { | 959 } else { | 
| 956 MainWindowBase::insertInstantsAtBoundaries() | 971 MainWindowBase::insertInstantsAtBoundaries() | 
| 957 { | 972 { | 
| 958 MultiSelection::SelectionList selections = m_viewManager->getSelections(); | 973 MultiSelection::SelectionList selections = m_viewManager->getSelections(); | 
| 959 for (MultiSelection::SelectionList::iterator i = selections.begin(); | 974 for (MultiSelection::SelectionList::iterator i = selections.begin(); | 
| 960 i != selections.end(); ++i) { | 975 i != selections.end(); ++i) { | 
| 961 int start = i->getStartFrame(); | 976 sv_frame_t start = i->getStartFrame(); | 
| 962 int end = i->getEndFrame(); | 977 sv_frame_t end = i->getEndFrame(); | 
| 963 if (start != end) { | 978 if (start != end) { | 
| 964 insertInstantAt(start); | 979 insertInstantAt(start); | 
| 965 insertInstantAt(end); | 980 insertInstantAt(end); | 
| 966 } | 981 } | 
| 967 } | 982 } | 
| 968 } | 983 } | 
| 969 | 984 | 
| 970 void | 985 void | 
| 971 MainWindowBase::insertInstantAt(int frame) | 986 MainWindowBase::insertInstantAt(sv_frame_t frame) | 
| 972 { | 987 { | 
| 973 Pane *pane = m_paneStack->getCurrentPane(); | 988 Pane *pane = m_paneStack->getCurrentPane(); | 
| 974 if (!pane) { | 989 if (!pane) { | 
| 975 return; | 990 return; | 
| 976 } | 991 } | 
| 1058 MainWindowBase::insertItemAtSelection() | 1073 MainWindowBase::insertItemAtSelection() | 
| 1059 { | 1074 { | 
| 1060 MultiSelection::SelectionList selections = m_viewManager->getSelections(); | 1075 MultiSelection::SelectionList selections = m_viewManager->getSelections(); | 
| 1061 for (MultiSelection::SelectionList::iterator i = selections.begin(); | 1076 for (MultiSelection::SelectionList::iterator i = selections.begin(); | 
| 1062 i != selections.end(); ++i) { | 1077 i != selections.end(); ++i) { | 
| 1063 int start = i->getStartFrame(); | 1078 sv_frame_t start = i->getStartFrame(); | 
| 1064 int end = i->getEndFrame(); | 1079 sv_frame_t end = i->getEndFrame(); | 
| 1065 if (start < end) { | 1080 if (start < end) { | 
| 1066 insertItemAt(start, end - start); | 1081 insertItemAt(start, end - start); | 
| 1067 } | 1082 } | 
| 1068 } | 1083 } | 
| 1069 } | 1084 } | 
| 1070 | 1085 | 
| 1071 void | 1086 void | 
| 1072 MainWindowBase::insertItemAt(int frame, int duration) | 1087 MainWindowBase::insertItemAt(sv_frame_t frame, sv_frame_t duration) | 
| 1073 { | 1088 { | 
| 1074 Pane *pane = m_paneStack->getCurrentPane(); | 1089 Pane *pane = m_paneStack->getCurrentPane(); | 
| 1075 if (!pane) { | 1090 if (!pane) { | 
| 1076 return; | 1091 return; | 
| 1077 } | 1092 } | 
| 1078 | 1093 | 
| 1079 // ugh! | 1094 // ugh! | 
| 1080 | 1095 | 
| 1081 int alignedStart = pane->alignFromReference(frame); | 1096 sv_frame_t alignedStart = pane->alignFromReference(frame); | 
| 1082 int alignedEnd = pane->alignFromReference(frame + duration); | 1097 sv_frame_t alignedEnd = pane->alignFromReference(frame + duration); | 
| 1083 if (alignedStart >= alignedEnd) return; | 1098 if (alignedStart >= alignedEnd) return; | 
| 1084 int alignedDuration = alignedEnd - alignedStart; | 1099 sv_frame_t alignedDuration = alignedEnd - alignedStart; | 
| 1085 | 1100 | 
| 1086 Command *c = 0; | 1101 Command *c = 0; | 
| 1087 | 1102 | 
| 1088 QString name = tr("Add Item at %1 s") | 1103 QString name = tr("Add Item at %1 s") | 
| 1089 .arg(RealTime::frame2RealTime | 1104 .arg(RealTime::frame2RealTime | 
| 1279 | 1294 | 
| 1280 source.waitForData(); | 1295 source.waitForData(); | 
| 1281 | 1296 | 
| 1282 m_openingAudioFile = true; | 1297 m_openingAudioFile = true; | 
| 1283 | 1298 | 
| 1284 int rate = 0; | 1299 sv_samplerate_t rate = 0; | 
| 1285 | 1300 | 
| 1286 if (Preferences::getInstance()->getFixedSampleRate() != 0) { | 1301 if (Preferences::getInstance()->getFixedSampleRate() != 0) { | 
| 1287 rate = Preferences::getInstance()->getFixedSampleRate(); | 1302 rate = Preferences::getInstance()->getFixedSampleRate(); | 
| 1288 } else if (Preferences::getInstance()->getResampleOnLoad()) { | 1303 } else if (Preferences::getInstance()->getResampleOnLoad()) { | 
| 1289 rate = m_playSource->getSourceSampleRate(); | 1304 rate = m_playSource->getSourceSampleRate(); | 
| 2033 } | 2048 } | 
| 2034 | 2049 | 
| 2035 MainWindowBase::FileOpenStatus | 2050 MainWindowBase::FileOpenStatus | 
| 2036 MainWindowBase::openLayersFromRDF(FileSource source) | 2051 MainWindowBase::openLayersFromRDF(FileSource source) | 
| 2037 { | 2052 { | 
| 2038 int rate = 0; | 2053 sv_samplerate_t rate = 0; | 
| 2039 | 2054 | 
| 2040 SVDEBUG << "MainWindowBase::openLayersFromRDF" << endl; | 2055 SVDEBUG << "MainWindowBase::openLayersFromRDF" << endl; | 
| 2041 | 2056 | 
| 2042 ProgressDialog dialog(tr("Importing from RDF..."), true, 2000, this); | 2057 ProgressDialog dialog(tr("Importing from RDF..."), true, 2000, this); | 
| 2043 connect(&dialog, SIGNAL(showing()), this, SIGNAL(hideSplash())); | 2058 connect(&dialog, SIGNAL(showing()), this, SIGNAL(hideSplash())); | 
| 2281 } | 2296 } | 
| 2282 | 2297 | 
| 2283 QApplication::setOverrideCursor(QCursor(Qt::WaitCursor)); | 2298 QApplication::setOverrideCursor(QCursor(Qt::WaitCursor)); | 
| 2284 | 2299 | 
| 2285 QTextStream out(&bzFile); | 2300 QTextStream out(&bzFile); | 
| 2301 out.setCodec(QTextCodec::codecForName("UTF-8")); | |
| 2286 toXml(out, false); | 2302 toXml(out, false); | 
| 2287 out.flush(); | 2303 out.flush(); | 
| 2288 | 2304 | 
| 2289 QApplication::restoreOverrideCursor(); | 2305 QApplication::restoreOverrideCursor(); | 
| 2290 | 2306 | 
| 2326 } | 2342 } | 
| 2327 | 2343 | 
| 2328 QApplication::setOverrideCursor(QCursor(Qt::WaitCursor)); | 2344 QApplication::setOverrideCursor(QCursor(Qt::WaitCursor)); | 
| 2329 | 2345 | 
| 2330 QTextStream out(&file); | 2346 QTextStream out(&file); | 
| 2347 out.setCodec(QTextCodec::codecForName("UTF-8")); | |
| 2331 toXml(out, true); | 2348 toXml(out, true); | 
| 2332 out.flush(); | 2349 out.flush(); | 
| 2333 | 2350 | 
| 2334 QApplication::restoreOverrideCursor(); | 2351 QApplication::restoreOverrideCursor(); | 
| 2335 | 2352 | 
| 2413 if (!currentPane) return; | 2430 if (!currentPane) return; | 
| 2414 | 2431 | 
| 2415 Model *model = getMainModel(); | 2432 Model *model = getMainModel(); | 
| 2416 if (!model) return; | 2433 if (!model) return; | 
| 2417 | 2434 | 
| 2418 int start = model->getStartFrame(); | 2435 sv_frame_t start = model->getStartFrame(); | 
| 2419 int end = model->getEndFrame(); | 2436 sv_frame_t end = model->getEndFrame(); | 
| 2420 if (m_playSource) end = std::max(end, m_playSource->getPlayEndFrame()); | 2437 if (m_playSource) end = std::max(end, m_playSource->getPlayEndFrame()); | 
| 2421 int pixels = currentPane->width(); | 2438 int pixels = currentPane->width(); | 
| 2422 | 2439 | 
| 2423 int sw = currentPane->getVerticalScaleWidth(); | 2440 int sw = currentPane->getVerticalScaleWidth(); | 
| 2424 if (pixels > sw * 2) pixels -= sw * 2; | 2441 if (pixels > sw * 2) pixels -= sw * 2; | 
| 2425 else pixels = 1; | 2442 else pixels = 1; | 
| 2426 if (pixels > 4) pixels -= 4; | 2443 if (pixels > 4) pixels -= 4; | 
| 2427 | 2444 | 
| 2428 int zoomLevel = (end - start) / pixels; | 2445 int zoomLevel = int((end - start) / pixels); | 
| 2429 if (zoomLevel < 1) zoomLevel = 1; | 2446 if (zoomLevel < 1) zoomLevel = 1; | 
| 2430 | 2447 | 
| 2431 currentPane->setZoomLevel(zoomLevel); | 2448 currentPane->setZoomLevel(zoomLevel); | 
| 2432 currentPane->setCentreFrame((start + end) / 2); | 2449 currentPane->setCentreFrame((start + end) / 2); | 
| 2433 } | 2450 } | 
| 2652 void | 2669 void | 
| 2653 MainWindowBase::ffwd() | 2670 MainWindowBase::ffwd() | 
| 2654 { | 2671 { | 
| 2655 if (!getMainModel()) return; | 2672 if (!getMainModel()) return; | 
| 2656 | 2673 | 
| 2657 int frame = m_viewManager->getPlaybackFrame(); | 2674 sv_frame_t frame = m_viewManager->getPlaybackFrame(); | 
| 2658 ++frame; | 2675 ++frame; | 
| 2659 | 2676 | 
| 2660 Pane *pane = m_paneStack->getCurrentPane(); | 2677 Pane *pane = m_paneStack->getCurrentPane(); | 
| 2661 Layer *layer = getSnapLayer(); | 2678 Layer *layer = getSnapLayer(); | 
| 2662 int sr = getMainModel()->getSampleRate(); | 2679 sv_samplerate_t sr = getMainModel()->getSampleRate(); | 
| 2663 | 2680 | 
| 2664 if (!layer) { | 2681 if (!layer) { | 
| 2665 | 2682 | 
| 2666 frame = RealTime::realTime2Frame | 2683 frame = RealTime::realTime2Frame | 
| 2667 (RealTime::frame2RealTime(frame, sr) + m_defaultFfwdRwdStep, sr); | 2684 (RealTime::frame2RealTime(frame, sr) + m_defaultFfwdRwdStep, sr); | 
| 2668 if (frame > int(getMainModel()->getEndFrame())) { | 2685 if (frame > getMainModel()->getEndFrame()) { | 
| 2669 frame = getMainModel()->getEndFrame(); | 2686 frame = getMainModel()->getEndFrame(); | 
| 2670 } | 2687 } | 
| 2671 | 2688 | 
| 2672 } else { | 2689 } else { | 
| 2673 | 2690 | 
| 2682 } | 2699 } | 
| 2683 | 2700 | 
| 2684 if (frame < 0) frame = 0; | 2701 if (frame < 0) frame = 0; | 
| 2685 | 2702 | 
| 2686 if (m_viewManager->getPlaySelectionMode()) { | 2703 if (m_viewManager->getPlaySelectionMode()) { | 
| 2687 frame = m_viewManager->constrainFrameToSelection(int(frame)); | 2704 frame = m_viewManager->constrainFrameToSelection(frame); | 
| 2688 } | 2705 } | 
| 2689 | 2706 | 
| 2690 m_viewManager->setPlaybackFrame(frame); | 2707 m_viewManager->setPlaybackFrame(frame); | 
| 2691 | 2708 | 
| 2692 if (frame == (int)getMainModel()->getEndFrame() && | 2709 if (frame == getMainModel()->getEndFrame() && | 
| 2693 m_playSource && | 2710 m_playSource && | 
| 2694 m_playSource->isPlaying() && | 2711 m_playSource->isPlaying() && | 
| 2695 !m_viewManager->getPlayLoopMode()) { | 2712 !m_viewManager->getPlayLoopMode()) { | 
| 2696 stop(); | 2713 stop(); | 
| 2697 } | 2714 } | 
| 2706 m_playSource->isPlaying() && | 2723 m_playSource->isPlaying() && | 
| 2707 !m_viewManager->getPlayLoopMode()) { | 2724 !m_viewManager->getPlayLoopMode()) { | 
| 2708 stop(); | 2725 stop(); | 
| 2709 } | 2726 } | 
| 2710 | 2727 | 
| 2711 int frame = getMainModel()->getEndFrame(); | 2728 sv_frame_t frame = getMainModel()->getEndFrame(); | 
| 2712 | 2729 | 
| 2713 if (m_viewManager->getPlaySelectionMode()) { | 2730 if (m_viewManager->getPlaySelectionMode()) { | 
| 2714 frame = m_viewManager->constrainFrameToSelection(frame); | 2731 frame = m_viewManager->constrainFrameToSelection(frame); | 
| 2715 } | 2732 } | 
| 2716 | 2733 | 
| 2724 | 2741 | 
| 2725 Layer *layer = getSnapLayer(); | 2742 Layer *layer = getSnapLayer(); | 
| 2726 if (!layer) { ffwd(); return; } | 2743 if (!layer) { ffwd(); return; } | 
| 2727 | 2744 | 
| 2728 Pane *pane = m_paneStack->getCurrentPane(); | 2745 Pane *pane = m_paneStack->getCurrentPane(); | 
| 2729 int frame = m_viewManager->getPlaybackFrame(); | 2746 sv_frame_t frame = m_viewManager->getPlaybackFrame(); | 
| 2730 | 2747 | 
| 2731 int resolution = 0; | 2748 int resolution = 0; | 
| 2732 if (pane) frame = pane->alignFromReference(frame); | 2749 if (pane) frame = pane->alignFromReference(frame); | 
| 2733 if (layer->snapToSimilarFeature(m_paneStack->getCurrentPane(), | 2750 if (layer->snapToSimilarFeature(m_paneStack->getCurrentPane(), | 
| 2734 frame, resolution, Layer::SnapRight)) { | 2751 frame, resolution, Layer::SnapRight)) { | 
| 2738 } | 2755 } | 
| 2739 | 2756 | 
| 2740 if (frame < 0) frame = 0; | 2757 if (frame < 0) frame = 0; | 
| 2741 | 2758 | 
| 2742 if (m_viewManager->getPlaySelectionMode()) { | 2759 if (m_viewManager->getPlaySelectionMode()) { | 
| 2743 frame = m_viewManager->constrainFrameToSelection(int(frame)); | 2760 frame = m_viewManager->constrainFrameToSelection(frame); | 
| 2744 } | 2761 } | 
| 2745 | 2762 | 
| 2746 m_viewManager->setPlaybackFrame(frame); | 2763 m_viewManager->setPlaybackFrame(frame); | 
| 2747 | 2764 | 
| 2748 if (frame == (int)getMainModel()->getEndFrame() && | 2765 if (frame == getMainModel()->getEndFrame() && | 
| 2749 m_playSource && | 2766 m_playSource && | 
| 2750 m_playSource->isPlaying() && | 2767 m_playSource->isPlaying() && | 
| 2751 !m_viewManager->getPlayLoopMode()) { | 2768 !m_viewManager->getPlayLoopMode()) { | 
| 2752 stop(); | 2769 stop(); | 
| 2753 } | 2770 } | 
| 2756 void | 2773 void | 
| 2757 MainWindowBase::rewind() | 2774 MainWindowBase::rewind() | 
| 2758 { | 2775 { | 
| 2759 if (!getMainModel()) return; | 2776 if (!getMainModel()) return; | 
| 2760 | 2777 | 
| 2761 int frame = m_viewManager->getPlaybackFrame(); | 2778 sv_frame_t frame = m_viewManager->getPlaybackFrame(); | 
| 2762 if (frame > 0) --frame; | 2779 if (frame > 0) --frame; | 
| 2763 | 2780 | 
| 2764 Pane *pane = m_paneStack->getCurrentPane(); | 2781 Pane *pane = m_paneStack->getCurrentPane(); | 
| 2765 Layer *layer = getSnapLayer(); | 2782 Layer *layer = getSnapLayer(); | 
| 2766 int sr = getMainModel()->getSampleRate(); | 2783 sv_samplerate_t sr = getMainModel()->getSampleRate(); | 
| 2767 | 2784 | 
| 2768 // when rewinding during playback, we want to allow a period | 2785 // when rewinding during playback, we want to allow a period | 
| 2769 // following a rewind target point at which the rewind will go to | 2786 // following a rewind target point at which the rewind will go to | 
| 2770 // the prior point instead of the immediately neighbouring one | 2787 // the prior point instead of the immediately neighbouring one | 
| 2771 if (m_playSource && m_playSource->isPlaying()) { | 2788 if (m_playSource && m_playSource->isPlaying()) { | 
| 2777 | 2794 | 
| 2778 if (!layer) { | 2795 if (!layer) { | 
| 2779 | 2796 | 
| 2780 frame = RealTime::realTime2Frame | 2797 frame = RealTime::realTime2Frame | 
| 2781 (RealTime::frame2RealTime(frame, sr) - m_defaultFfwdRwdStep, sr); | 2798 (RealTime::frame2RealTime(frame, sr) - m_defaultFfwdRwdStep, sr); | 
| 2782 if (frame < int(getMainModel()->getStartFrame())) { | 2799 if (frame < getMainModel()->getStartFrame()) { | 
| 2783 frame = getMainModel()->getStartFrame(); | 2800 frame = getMainModel()->getStartFrame(); | 
| 2784 } | 2801 } | 
| 2785 | 2802 | 
| 2786 } else { | 2803 } else { | 
| 2787 | 2804 | 
| 2796 } | 2813 } | 
| 2797 | 2814 | 
| 2798 if (frame < 0) frame = 0; | 2815 if (frame < 0) frame = 0; | 
| 2799 | 2816 | 
| 2800 if (m_viewManager->getPlaySelectionMode()) { | 2817 if (m_viewManager->getPlaySelectionMode()) { | 
| 2801 frame = m_viewManager->constrainFrameToSelection(int(frame)); | 2818 frame = m_viewManager->constrainFrameToSelection(frame); | 
| 2802 } | 2819 } | 
| 2803 | 2820 | 
| 2804 m_viewManager->setPlaybackFrame(frame); | 2821 m_viewManager->setPlaybackFrame(frame); | 
| 2805 } | 2822 } | 
| 2806 | 2823 | 
| 2807 void | 2824 void | 
| 2808 MainWindowBase::rewindStart() | 2825 MainWindowBase::rewindStart() | 
| 2809 { | 2826 { | 
| 2810 if (!getMainModel()) return; | 2827 if (!getMainModel()) return; | 
| 2811 | 2828 | 
| 2812 int frame = getMainModel()->getStartFrame(); | 2829 sv_frame_t frame = getMainModel()->getStartFrame(); | 
| 2813 | 2830 | 
| 2814 if (m_viewManager->getPlaySelectionMode()) { | 2831 if (m_viewManager->getPlaySelectionMode()) { | 
| 2815 frame = m_viewManager->constrainFrameToSelection(frame); | 2832 frame = m_viewManager->constrainFrameToSelection(frame); | 
| 2816 } | 2833 } | 
| 2817 | 2834 | 
| 2825 | 2842 | 
| 2826 Layer *layer = getSnapLayer(); | 2843 Layer *layer = getSnapLayer(); | 
| 2827 if (!layer) { rewind(); return; } | 2844 if (!layer) { rewind(); return; } | 
| 2828 | 2845 | 
| 2829 Pane *pane = m_paneStack->getCurrentPane(); | 2846 Pane *pane = m_paneStack->getCurrentPane(); | 
| 2830 int frame = m_viewManager->getPlaybackFrame(); | 2847 sv_frame_t frame = m_viewManager->getPlaybackFrame(); | 
| 2831 | 2848 | 
| 2832 int resolution = 0; | 2849 int resolution = 0; | 
| 2833 if (pane) frame = pane->alignFromReference(frame); | 2850 if (pane) frame = pane->alignFromReference(frame); | 
| 2834 if (layer->snapToSimilarFeature(m_paneStack->getCurrentPane(), | 2851 if (layer->snapToSimilarFeature(m_paneStack->getCurrentPane(), | 
| 2835 frame, resolution, Layer::SnapLeft)) { | 2852 frame, resolution, Layer::SnapLeft)) { | 
| 2839 } | 2856 } | 
| 2840 | 2857 | 
| 2841 if (frame < 0) frame = 0; | 2858 if (frame < 0) frame = 0; | 
| 2842 | 2859 | 
| 2843 if (m_viewManager->getPlaySelectionMode()) { | 2860 if (m_viewManager->getPlaySelectionMode()) { | 
| 2844 frame = m_viewManager->constrainFrameToSelection(int(frame)); | 2861 frame = m_viewManager->constrainFrameToSelection(frame); | 
| 2845 } | 2862 } | 
| 2846 | 2863 | 
| 2847 m_viewManager->setPlaybackFrame(frame); | 2864 m_viewManager->setPlaybackFrame(frame); | 
| 2848 } | 2865 } | 
| 2849 | 2866 | 
| 3052 | 3069 | 
| 3053 void | 3070 void | 
| 3054 MainWindowBase::connectLayerEditDialog(ModelDataTableDialog *dialog) | 3071 MainWindowBase::connectLayerEditDialog(ModelDataTableDialog *dialog) | 
| 3055 { | 3072 { | 
| 3056 connect(m_viewManager, | 3073 connect(m_viewManager, | 
| 3057 SIGNAL(globalCentreFrameChanged(int)), | 3074 SIGNAL(globalCentreFrameChanged(sv_frame_t)), | 
| 3058 dialog, | 3075 dialog, | 
| 3059 SLOT(userScrolledToFrame(int))); | 3076 SLOT(userScrolledToFrame(sv_frame_t))); | 
| 3060 | 3077 | 
| 3061 connect(m_viewManager, | 3078 connect(m_viewManager, | 
| 3062 SIGNAL(playbackFrameChanged(int)), | 3079 SIGNAL(playbackFrameChanged(sv_frame_t)), | 
| 3063 dialog, | 3080 dialog, | 
| 3064 SLOT(playbackScrolledToFrame(int))); | 3081 SLOT(playbackScrolledToFrame(sv_frame_t))); | 
| 3065 | 3082 | 
| 3066 connect(dialog, | 3083 connect(dialog, | 
| 3067 SIGNAL(scrollToFrame(int)), | 3084 SIGNAL(scrollToFrame(sv_frame_t)), | 
| 3068 m_viewManager, | 3085 m_viewManager, | 
| 3069 SLOT(setGlobalCentreFrame(int))); | 3086 SLOT(setGlobalCentreFrame(sv_frame_t))); | 
| 3070 | 3087 | 
| 3071 connect(dialog, | 3088 connect(dialog, | 
| 3072 SIGNAL(scrollToFrame(int)), | 3089 SIGNAL(scrollToFrame(sv_frame_t)), | 
| 3073 m_viewManager, | 3090 m_viewManager, | 
| 3074 SLOT(setPlaybackFrame(int))); | 3091 SLOT(setPlaybackFrame(sv_frame_t))); | 
| 3075 } | 3092 } | 
| 3076 | 3093 | 
| 3077 void | 3094 void | 
| 3078 MainWindowBase::previousPane() | 3095 MainWindowBase::previousPane() | 
| 3079 { | 3096 { | 
| 3179 | 3196 | 
| 3180 updateMenuStates(); | 3197 updateMenuStates(); | 
| 3181 } | 3198 } | 
| 3182 | 3199 | 
| 3183 void | 3200 void | 
| 3184 MainWindowBase::playbackFrameChanged(int frame) | 3201 MainWindowBase::playbackFrameChanged(sv_frame_t frame) | 
| 3185 { | 3202 { | 
| 3186 if (!(m_playSource && m_playSource->isPlaying()) || !getMainModel()) return; | 3203 if (!(m_playSource && m_playSource->isPlaying()) || !getMainModel()) return; | 
| 3187 | 3204 | 
| 3188 updatePositionStatusDisplays(); | 3205 updatePositionStatusDisplays(); | 
| 3189 | 3206 | 
| 3215 | 3232 | 
| 3216 getStatusLabel()->setText(m_myStatusMessage); | 3233 getStatusLabel()->setText(m_myStatusMessage); | 
| 3217 } | 3234 } | 
| 3218 | 3235 | 
| 3219 void | 3236 void | 
| 3220 MainWindowBase::globalCentreFrameChanged(int ) | 3237 MainWindowBase::globalCentreFrameChanged(sv_frame_t ) | 
| 3221 { | 3238 { | 
| 3222 if ((m_playSource && m_playSource->isPlaying()) || !getMainModel()) return; | 3239 if ((m_playSource && m_playSource->isPlaying()) || !getMainModel()) return; | 
| 3223 Pane *p = 0; | 3240 Pane *p = 0; | 
| 3224 if (!m_paneStack || !(p = m_paneStack->getCurrentPane())) return; | 3241 if (!m_paneStack || !(p = m_paneStack->getCurrentPane())) return; | 
| 3225 if (!p->getFollowGlobalPan()) return; | 3242 if (!p->getFollowGlobalPan()) return; | 
| 3226 updateVisibleRangeDisplay(p); | 3243 updateVisibleRangeDisplay(p); | 
| 3227 } | 3244 } | 
| 3228 | 3245 | 
| 3229 void | 3246 void | 
| 3230 MainWindowBase::viewCentreFrameChanged(View *v, int frame) | 3247 MainWindowBase::viewCentreFrameChanged(View *v, sv_frame_t frame) | 
| 3231 { | 3248 { | 
| 3232 // SVDEBUG << "MainWindowBase::viewCentreFrameChanged(" << v << "," << frame << ")" << endl; | 3249 // SVDEBUG << "MainWindowBase::viewCentreFrameChanged(" << v << "," << frame << ")" << endl; | 
| 3233 | 3250 | 
| 3234 if (m_viewDataDialogMap.find(v) != m_viewDataDialogMap.end()) { | 3251 if (m_viewDataDialogMap.find(v) != m_viewDataDialogMap.end()) { | 
| 3235 for (DataDialogSet::iterator i = m_viewDataDialogMap[v].begin(); | 3252 for (DataDialogSet::iterator i = m_viewDataDialogMap[v].begin(); | 
