svapp  1.9
MainWindowBase.h
Go to the documentation of this file.
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