svapp
1.9
|
00001 /* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ 00002 00003 /* 00004 Sonic Visualiser 00005 An audio file viewer and annotation editor. 00006 Centre for Digital Music, Queen Mary, University of London. 00007 This file copyright 2006-2007 Chris Cannam and QMUL. 00008 00009 This program is free software; you can redistribute it and/or 00010 modify it under the terms of the GNU General Public License as 00011 published by the Free Software Foundation; either version 2 of the 00012 License, or (at your option) any later version. See the file 00013 COPYING included with this distribution for more information. 00014 */ 00015 00016 #ifndef _MAIN_WINDOW_BASE_H_ 00017 #define _MAIN_WINDOW_BASE_H_ 00018 00019 #include <QFrame> 00020 #include <QString> 00021 #include <QUrl> 00022 #include <QMainWindow> 00023 #include <QPointer> 00024 #include <QThread> 00025 00026 #include "base/Command.h" 00027 #include "view/ViewManager.h" 00028 #include "base/PropertyContainer.h" 00029 #include "base/RecentFiles.h" 00030 #include "base/FrameTimer.h" 00031 #include "layer/LayerFactory.h" 00032 #include "transform/Transform.h" 00033 #include "SVFileReader.h" 00034 #include "data/fileio/FileFinder.h" 00035 #include "data/fileio/FileSource.h" 00036 #include "data/osc/OSCQueue.h" 00037 #include <map> 00038 00039 class Document; 00040 class PaneStack; 00041 class Pane; 00042 class View; 00043 class Fader; 00044 class Overview; 00045 class Layer; 00046 class WaveformLayer; 00047 class WaveFileModel; 00048 class AudioCallbackPlaySource; 00049 class AudioCallbackPlayTarget; 00050 class CommandHistory; 00051 class QMenu; 00052 class AudioDial; 00053 class QLabel; 00054 class QCheckBox; 00055 class PreferencesDialog; 00056 class QTreeView; 00057 class QPushButton; 00058 class OSCMessage; 00059 class MIDIInput; 00060 class KeyReference; 00061 class Labeller; 00062 class ModelDataTableDialog; 00063 class QSignalMapper; 00064 class QShortcut; 00065 00075 class MainWindowBase : public QMainWindow, public FrameTimer 00076 { 00077 Q_OBJECT 00078 00079 public: 00080 MainWindowBase(bool withAudioOutput, bool withMIDIInput); 00081 virtual ~MainWindowBase(); 00082 00083 enum AudioFileOpenMode { 00084 ReplaceSession, 00085 ReplaceMainModel, 00086 CreateAdditionalModel, 00087 ReplaceCurrentPane, 00088 AskUser 00089 }; 00090 00091 enum FileOpenStatus { 00092 FileOpenSucceeded, 00093 FileOpenFailed, 00094 FileOpenCancelled, 00095 FileOpenWrongMode // attempted to open layer when no main model present 00096 }; 00097 00098 virtual FileOpenStatus open(FileSource source, AudioFileOpenMode = AskUser); 00099 virtual FileOpenStatus openPath(QString fileOrUrl, AudioFileOpenMode = AskUser); 00100 virtual FileOpenStatus openAudio(FileSource source, AudioFileOpenMode = AskUser, QString templateName = ""); 00101 virtual FileOpenStatus openPlaylist(FileSource source, AudioFileOpenMode = AskUser); 00102 virtual FileOpenStatus openLayer(FileSource source); 00103 virtual FileOpenStatus openImage(FileSource source); 00104 00105 virtual FileOpenStatus openSession(FileSource source); 00106 virtual FileOpenStatus openSessionPath(QString fileOrUrl); 00107 virtual FileOpenStatus openSessionTemplate(QString templateName); 00108 virtual FileOpenStatus openSessionTemplate(FileSource source); 00109 00110 virtual bool saveSessionFile(QString path); 00111 virtual bool saveSessionTemplate(QString path); 00112 00114 virtual int getFrame() const; 00115 00116 void setDefaultFfwdRwdStep(RealTime step) { 00117 m_defaultFfwdRwdStep = step; 00118 } 00119 00120 signals: 00121 // Used to toggle the availability of menu actions 00122 void canAddPane(bool); 00123 void canDeleteCurrentPane(bool); 00124 void canAddLayer(bool); 00125 void canImportMoreAudio(bool); 00126 void canReplaceMainAudio(bool); 00127 void canImportLayer(bool); 00128 void canChangeSessionTemplate(bool); 00129 void canExportAudio(bool); 00130 void canExportLayer(bool); 00131 void canExportImage(bool); 00132 void canRenameLayer(bool); 00133 void canEditLayer(bool); 00134 void canEditLayerTabular(bool); 00135 void canMeasureLayer(bool); 00136 void canSelect(bool); 00137 void canClearSelection(bool); 00138 void canEditSelection(bool); 00139 void canDeleteSelection(bool); 00140 void canPaste(bool); 00141 void canInsertInstant(bool); 00142 void canInsertInstantsAtBoundaries(bool); 00143 void canInsertItemAtSelection(bool); 00144 void canRenumberInstants(bool); 00145 void canDeleteCurrentLayer(bool); 00146 void canZoom(bool); 00147 void canScroll(bool); 00148 void canPlay(bool); 00149 void canFfwd(bool); 00150 void canRewind(bool); 00151 void canPlaySelection(bool); 00152 void canSpeedUpPlayback(bool); 00153 void canSlowDownPlayback(bool); 00154 void canChangePlaybackSpeed(bool); 00155 void canSelectPreviousPane(bool); 00156 void canSelectNextPane(bool); 00157 void canSelectPreviousLayer(bool); 00158 void canSelectNextLayer(bool); 00159 void canSave(bool); 00160 void canSaveAs(bool); 00161 void hideSplash(); 00162 void sessionLoaded(); 00163 void audioFileLoaded(); 00164 void replacedDocument(); 00165 void activity(QString); 00166 00167 public slots: 00168 virtual void preferenceChanged(PropertyContainer::PropertyName); 00169 virtual void resizeConstrained(QSize); 00170 00171 protected slots: 00172 virtual void zoomIn(); 00173 virtual void zoomOut(); 00174 virtual void zoomToFit(); 00175 virtual void zoomDefault(); 00176 virtual void scrollLeft(); 00177 virtual void scrollRight(); 00178 virtual void jumpLeft(); 00179 virtual void jumpRight(); 00180 virtual void peekLeft(); 00181 virtual void peekRight(); 00182 00183 virtual void showNoOverlays(); 00184 virtual void showMinimalOverlays(); 00185 virtual void showAllOverlays(); 00186 00187 virtual void toggleTimeRulers(); 00188 virtual void toggleZoomWheels(); 00189 virtual void togglePropertyBoxes(); 00190 virtual void toggleStatusBar(); 00191 virtual void toggleCentreLine(); 00192 00193 virtual void play(); 00194 virtual void ffwd(); 00195 virtual void ffwdEnd(); 00196 virtual void rewind(); 00197 virtual void rewindStart(); 00198 virtual void stop(); 00199 00200 virtual void ffwdSimilar(); 00201 virtual void rewindSimilar(); 00202 00203 virtual void deleteCurrentPane(); 00204 virtual void deleteCurrentLayer(); 00205 virtual void editCurrentLayer(); 00206 00207 virtual void previousPane(); 00208 virtual void nextPane(); 00209 virtual void previousLayer(); 00210 virtual void nextLayer(); 00211 00212 virtual void playLoopToggled(); 00213 virtual void playSelectionToggled(); 00214 virtual void playSoloToggled(); 00215 00216 virtual void sampleRateMismatch(int, int, bool) = 0; 00217 virtual void audioOverloadPluginDisabled() = 0; 00218 virtual void audioTimeStretchMultiChannelDisabled() = 0; 00219 00220 virtual void playbackFrameChanged(int); 00221 virtual void globalCentreFrameChanged(int); 00222 virtual void viewCentreFrameChanged(View *, int); 00223 virtual void viewZoomLevelChanged(View *, int, bool); 00224 virtual void outputLevelsChanged(float, float) = 0; 00225 00226 virtual void currentPaneChanged(Pane *); 00227 virtual void currentLayerChanged(Pane *, Layer *); 00228 00229 virtual void selectAll(); 00230 virtual void selectToStart(); 00231 virtual void selectToEnd(); 00232 virtual void selectVisible(); 00233 virtual void clearSelection(); 00234 00235 virtual void cut(); 00236 virtual void copy(); 00237 virtual void paste(); 00238 virtual void pasteAtPlaybackPosition(); 00239 virtual void pasteRelative(int offset); 00240 virtual void deleteSelected(); 00241 00242 virtual void insertInstant(); 00243 virtual void insertInstantAt(int); 00244 virtual void insertInstantsAtBoundaries(); 00245 virtual void insertItemAtSelection(); 00246 virtual void insertItemAt(int, int); 00247 virtual void renumberInstants(); 00248 00249 virtual void documentModified(); 00250 virtual void documentRestored(); 00251 00252 virtual void layerAdded(Layer *); 00253 virtual void layerRemoved(Layer *); 00254 virtual void layerAboutToBeDeleted(Layer *); 00255 virtual void layerInAView(Layer *, bool); 00256 00257 virtual void mainModelChanged(WaveFileModel *); 00258 virtual void modelAdded(Model *); 00259 virtual void modelAboutToBeDeleted(Model *); 00260 00261 virtual void updateMenuStates(); 00262 virtual void updateDescriptionLabel() = 0; 00263 00264 virtual void modelGenerationFailed(QString, QString) = 0; 00265 virtual void modelGenerationWarning(QString, QString) = 0; 00266 virtual void modelRegenerationFailed(QString, QString, QString) = 0; 00267 virtual void modelRegenerationWarning(QString, QString, QString) = 0; 00268 virtual void alignmentFailed(QString, QString) = 0; 00269 00270 virtual void rightButtonMenuRequested(Pane *, QPoint point) = 0; 00271 00272 virtual void paneAdded(Pane *) = 0; 00273 virtual void paneHidden(Pane *) = 0; 00274 virtual void paneAboutToBeDeleted(Pane *) = 0; 00275 virtual void paneDropAccepted(Pane *, QStringList) = 0; 00276 virtual void paneDropAccepted(Pane *, QString) = 0; 00277 virtual void paneDeleteButtonClicked(Pane *); 00278 00279 virtual void oscReady(); 00280 virtual void pollOSC(); 00281 virtual void handleOSCMessage(const OSCMessage &) = 0; 00282 00283 virtual void contextHelpChanged(const QString &); 00284 virtual void inProgressSelectionChanged(); 00285 00286 virtual FileOpenStatus openSessionFromRDF(FileSource source); 00287 virtual FileOpenStatus openLayersFromRDF(FileSource source); 00288 00289 virtual void closeSession() = 0; 00290 00291 virtual void newerVersionAvailable(QString) { } 00292 00293 virtual void menuActionMapperInvoked(QObject *); 00294 00295 protected: 00296 QString m_sessionFile; 00297 QString m_audioFile; 00298 Document *m_document; 00299 00300 PaneStack *m_paneStack; 00301 ViewManager *m_viewManager; 00302 Layer *m_timeRulerLayer; 00303 00304 bool m_audioOutput; 00305 AudioCallbackPlaySource *m_playSource; 00306 AudioCallbackPlayTarget *m_playTarget; 00307 00308 class OSCQueueStarter : public QThread 00309 { 00310 public: 00311 OSCQueueStarter(MainWindowBase *mwb) : QThread(mwb), m_mwb(mwb) { } 00312 virtual void run() { 00313 OSCQueue *queue = new OSCQueue(); // can take a long time 00314 m_mwb->m_oscQueue = queue; 00315 } 00316 private: 00317 MainWindowBase *m_mwb; 00318 }; 00319 00320 OSCQueue *m_oscQueue; 00321 OSCQueueStarter *m_oscQueueStarter; 00322 void startOSCQueue(); 00323 00324 MIDIInput *m_midiInput; 00325 00326 RecentFiles m_recentFiles; 00327 RecentFiles m_recentTransforms; 00328 00329 bool m_documentModified; 00330 bool m_openingAudioFile; 00331 bool m_abandoning; 00332 00333 Labeller *m_labeller; 00334 00335 int m_lastPlayStatusSec; 00336 mutable QString m_myStatusMessage; 00337 00338 bool m_initialDarkBackground; 00339 00340 RealTime m_defaultFfwdRwdStep; 00341 00342 mutable QLabel *m_statusLabel; 00343 QLabel *getStatusLabel() const; 00344 00345 WaveFileModel *getMainModel(); 00346 const WaveFileModel *getMainModel() const; 00347 void createDocument(); 00348 00349 Pane *addPaneToStack(); 00350 Layer *getSnapLayer() const; 00351 00352 typedef std::map<Layer *, QPointer<ModelDataTableDialog> > LayerDataDialogMap; 00353 typedef std::set<QPointer<ModelDataTableDialog> > DataDialogSet; 00354 typedef std::map<View *, DataDialogSet> ViewDataDialogMap; 00355 00356 LayerDataDialogMap m_layerDataDialogMap; 00357 ViewDataDialogMap m_viewDataDialogMap; 00358 00359 void removeLayerEditDialog(Layer *); 00360 00361 class PaneCallback : public SVFileReaderPaneCallback 00362 { 00363 public: 00364 PaneCallback(MainWindowBase *mw) : m_mw(mw) { } 00365 virtual Pane *addPane() { return m_mw->addPaneToStack(); } 00366 virtual void setWindowSize(int width, int height) { 00367 m_mw->resizeConstrained(QSize(width, height)); 00368 } 00369 virtual void addSelection(int start, int end) { 00370 m_mw->m_viewManager->addSelectionQuietly(Selection(start, end)); 00371 } 00372 protected: 00373 MainWindowBase *m_mw; 00374 }; 00375 00376 class AddPaneCommand : public Command 00377 { 00378 public: 00379 AddPaneCommand(MainWindowBase *mw); 00380 virtual ~AddPaneCommand(); 00381 00382 virtual void execute(); 00383 virtual void unexecute(); 00384 virtual QString getName() const; 00385 00386 Pane *getPane() { return m_pane; } 00387 00388 protected: 00389 MainWindowBase *m_mw; 00390 Pane *m_pane; // Main window owns this, but I determine its lifespan 00391 Pane *m_prevCurrentPane; // I don't own this 00392 bool m_added; 00393 }; 00394 00395 class RemovePaneCommand : public Command 00396 { 00397 public: 00398 RemovePaneCommand(MainWindowBase *mw, Pane *pane); 00399 virtual ~RemovePaneCommand(); 00400 00401 virtual void execute(); 00402 virtual void unexecute(); 00403 virtual QString getName() const; 00404 00405 protected: 00406 MainWindowBase *m_mw; 00407 Pane *m_pane; // Main window owns this, but I determine its lifespan 00408 Pane *m_prevCurrentPane; // I don't own this 00409 bool m_added; 00410 }; 00411 00412 virtual bool checkSaveModified() = 0; 00413 00414 virtual QString getOpenFileName(FileFinder::FileType type); 00415 virtual QString getSaveFileName(FileFinder::FileType type); 00416 virtual void registerLastOpenedFilePath(FileFinder::FileType type, QString path); 00417 00418 virtual QString getDefaultSessionTemplate() const; 00419 virtual void setDefaultSessionTemplate(QString); 00420 00421 virtual void createPlayTarget(); 00422 virtual void openHelpUrl(QString url); 00423 00424 virtual void setupMenus() = 0; 00425 virtual void updateVisibleRangeDisplay(Pane *p) const = 0; 00426 virtual void updatePositionStatusDisplays() const = 0; 00427 00428 // Call this after setting up the menu bar, to fix up single-key 00429 // shortcuts on OS/X 00430 virtual void finaliseMenus(); 00431 virtual void finaliseMenu(QMenu *); 00432 00433 // Only used on OS/X to work around a Qt/Cocoa bug, see finaliseMenus 00434 QSignalMapper *m_menuShortcutMapper; 00435 QList<QShortcut *> m_appShortcuts; 00436 00437 virtual bool shouldCreateNewSessionForRDFAudio(bool *) { return true; } 00438 00439 virtual void connectLayerEditDialog(ModelDataTableDialog *dialog); 00440 00441 virtual void toXml(QTextStream &stream, bool asTemplate); 00442 }; 00443 00444 00445 #endif