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 
00025 #include "base/Command.h"
00026 #include "view/ViewManager.h"
00027 #include "base/PropertyContainer.h"
00028 #include "base/RecentFiles.h"
00029 #include "layer/LayerFactory.h"
00030 #include "plugin/transform/Transform.h"
00031 #include "SVFileReader.h"
00032 #include "data/fileio/FileFinder.h"
00033 #include "data/fileio/FileSource.h"
00034 #include <map>
00035 
00036 class Document;
00037 class PaneStack;
00038 class Pane;
00039 class View;
00040 class Fader;
00041 class Overview;
00042 class Layer;
00043 class WaveformLayer;
00044 class WaveFileModel;
00045 class AudioCallbackPlaySource;
00046 class AudioCallbackPlayTarget;
00047 class CommandHistory;
00048 class QMenu;
00049 class AudioDial;
00050 class QLabel;
00051 class QCheckBox;
00052 class PreferencesDialog;
00053 class QTreeView;
00054 class QPushButton;
00055 class OSCQueue;
00056 class OSCMessage;
00057 class KeyReference;
00058 class Labeller;
00059 
00069 class MainWindowBase : public QMainWindow
00070 {
00071     Q_OBJECT
00072 
00073 public:
00074     MainWindowBase(bool withAudioOutput, bool withOSCSupport);
00075     virtual ~MainWindowBase();
00076     
00077     enum AudioFileOpenMode {
00078         ReplaceMainModel,
00079         CreateAdditionalModel,
00080         ReplaceCurrentPane,
00081         AskUser
00082     };
00083 
00084     enum FileOpenStatus {
00085         FileOpenSucceeded,
00086         FileOpenFailed,
00087         FileOpenCancelled,
00088         FileOpenWrongMode // attempted to open layer when no main model present
00089     };
00090 
00091     virtual FileOpenStatus open(QString fileOrUrl, AudioFileOpenMode = AskUser);
00092     virtual FileOpenStatus open(FileSource source, AudioFileOpenMode = AskUser);
00093     
00094     virtual FileOpenStatus openAudio(FileSource source, AudioFileOpenMode = AskUser);
00095     virtual FileOpenStatus openPlaylist(FileSource source, AudioFileOpenMode = AskUser);
00096     virtual FileOpenStatus openLayer(FileSource source);
00097     virtual FileOpenStatus openImage(FileSource source);
00098 
00099     virtual FileOpenStatus openSessionFile(QString fileOrUrl);
00100     virtual FileOpenStatus openSession(FileSource source);
00101 
00102     virtual bool saveSessionFile(QString path);
00103 
00104 signals:
00105     // Used to toggle the availability of menu actions
00106     void canAddPane(bool);
00107     void canDeleteCurrentPane(bool);
00108     void canAddLayer(bool);
00109     void canImportMoreAudio(bool);
00110     void canImportLayer(bool);
00111     void canExportAudio(bool);
00112     void canExportLayer(bool);
00113     void canExportImage(bool);
00114     void canRenameLayer(bool);
00115     void canEditLayer(bool);
00116     void canMeasureLayer(bool);
00117     void canSelect(bool);
00118     void canClearSelection(bool);
00119     void canEditSelection(bool);
00120     void canDeleteSelection(bool);
00121     void canPaste(bool);
00122     void canInsertInstant(bool);
00123     void canInsertInstantsAtBoundaries(bool);
00124     void canRenumberInstants(bool);
00125     void canDeleteCurrentLayer(bool);
00126     void canZoom(bool);
00127     void canScroll(bool);
00128     void canPlay(bool);
00129     void canFfwd(bool);
00130     void canRewind(bool);
00131     void canPlaySelection(bool);
00132     void canSpeedUpPlayback(bool);
00133     void canSlowDownPlayback(bool);
00134     void canChangePlaybackSpeed(bool);
00135     void canSelectPreviousPane(bool);
00136     void canSelectNextPane(bool);
00137     void canSelectPreviousLayer(bool);
00138     void canSelectNextLayer(bool);
00139     void canSave(bool);
00140 
00141 public slots:
00142     virtual void preferenceChanged(PropertyContainer::PropertyName);
00143 
00144 protected slots:
00145     virtual void zoomIn();
00146     virtual void zoomOut();
00147     virtual void zoomToFit();
00148     virtual void zoomDefault();
00149     virtual void scrollLeft();
00150     virtual void scrollRight();
00151     virtual void jumpLeft();
00152     virtual void jumpRight();
00153 
00154     virtual void showNoOverlays();
00155     virtual void showMinimalOverlays();
00156     virtual void showStandardOverlays();
00157     virtual void showAllOverlays();
00158 
00159     virtual void toggleZoomWheels();
00160     virtual void togglePropertyBoxes();
00161     virtual void toggleStatusBar();
00162 
00163     virtual void play();
00164     virtual void ffwd();
00165     virtual void ffwdEnd();
00166     virtual void rewind();
00167     virtual void rewindStart();
00168     virtual void stop();
00169 
00170     virtual void deleteCurrentPane();
00171     virtual void deleteCurrentLayer();
00172 
00173     virtual void previousPane();
00174     virtual void nextPane();
00175     virtual void previousLayer();
00176     virtual void nextLayer();
00177 
00178     virtual void playLoopToggled();
00179     virtual void playSelectionToggled();
00180     virtual void playSoloToggled();
00181 
00182     virtual void sampleRateMismatch(size_t, size_t, bool) = 0;
00183     virtual void audioOverloadPluginDisabled() = 0;
00184 
00185     virtual void playbackFrameChanged(unsigned long);
00186     virtual void globalCentreFrameChanged(unsigned long);
00187     virtual void viewCentreFrameChanged(View *, unsigned long);
00188     virtual void viewZoomLevelChanged(View *, unsigned long, bool);
00189     virtual void outputLevelsChanged(float, float) = 0;
00190 
00191     virtual void currentPaneChanged(Pane *);
00192     virtual void currentLayerChanged(Pane *, Layer *);
00193 
00194     virtual void selectAll();
00195     virtual void selectToStart();
00196     virtual void selectToEnd();
00197     virtual void selectVisible();
00198     virtual void clearSelection();
00199 
00200     virtual void cut();
00201     virtual void copy();
00202     virtual void paste();
00203     virtual void deleteSelected();
00204 
00205     virtual void insertInstant();
00206     virtual void insertInstantAt(size_t);
00207     virtual void insertInstantsAtBoundaries();
00208     virtual void renumberInstants();
00209 
00210     virtual void documentModified();
00211     virtual void documentRestored();
00212 
00213     virtual void layerAdded(Layer *);
00214     virtual void layerRemoved(Layer *);
00215     virtual void layerAboutToBeDeleted(Layer *);
00216     virtual void layerInAView(Layer *, bool);
00217 
00218     virtual void mainModelChanged(WaveFileModel *);
00219     virtual void modelAdded(Model *);
00220     virtual void modelAboutToBeDeleted(Model *);
00221 
00222     virtual void updateMenuStates();
00223     virtual void updateDescriptionLabel() = 0;
00224 
00225     virtual void modelGenerationFailed(QString, QString) = 0;
00226     virtual void modelGenerationWarning(QString, QString) = 0;
00227     virtual void modelRegenerationFailed(QString, QString, QString) = 0;
00228     virtual void modelRegenerationWarning(QString, QString, QString) = 0;
00229     virtual void alignmentFailed(QString, QString) = 0;
00230 
00231     virtual void rightButtonMenuRequested(Pane *, QPoint point) = 0;
00232 
00233     virtual void paneAdded(Pane *) = 0;
00234     virtual void paneHidden(Pane *) = 0;
00235     virtual void paneAboutToBeDeleted(Pane *) = 0;
00236     virtual void paneDropAccepted(Pane *, QStringList) = 0;
00237     virtual void paneDropAccepted(Pane *, QString) = 0;
00238     virtual void paneDeleteButtonClicked(Pane *);
00239 
00240     virtual void pollOSC();
00241     virtual void handleOSCMessage(const OSCMessage &) = 0;
00242 
00243     virtual void contextHelpChanged(const QString &);
00244     virtual void inProgressSelectionChanged();
00245 
00246     virtual void closeSession() = 0;
00247 
00248 protected:
00249     QString                  m_sessionFile;
00250     QString                  m_audioFile;
00251     Document                *m_document;
00252 
00253     QLabel                  *m_descriptionLabel;
00254     PaneStack               *m_paneStack;
00255     ViewManager             *m_viewManager;
00256     Layer                   *m_timeRulerLayer;
00257 
00258     bool                     m_audioOutput;
00259     AudioCallbackPlaySource *m_playSource;
00260     AudioCallbackPlayTarget *m_playTarget;
00261 
00262     OSCQueue                *m_oscQueue;
00263 
00264     RecentFiles              m_recentFiles;
00265     RecentFiles              m_recentTransforms;
00266 
00267     bool                     m_documentModified;
00268     bool                     m_openingAudioFile;
00269     bool                     m_abandoning;
00270 
00271     Labeller                *m_labeller;
00272 
00273     int                      m_lastPlayStatusSec;
00274     mutable QString          m_myStatusMessage;
00275 
00276     bool                     m_initialDarkBackground;
00277 
00278     WaveFileModel *getMainModel();
00279     const WaveFileModel *getMainModel() const;
00280     void createDocument();
00281 
00282     Pane *addPaneToStack();
00283     Layer *getSnapLayer() const;
00284 
00285     class PaneCallback : public SVFileReaderPaneCallback
00286     {
00287     public:
00288         PaneCallback(MainWindowBase *mw) : m_mw(mw) { }
00289         virtual Pane *addPane() { return m_mw->addPaneToStack(); }
00290         virtual void setWindowSize(int width, int height) {
00291             m_mw->resize(width, height);
00292         }
00293         virtual void addSelection(int start, int end) {
00294             m_mw->m_viewManager->addSelection(Selection(start, end));
00295         }
00296     protected:
00297         MainWindowBase *m_mw;
00298     };
00299 
00300     class AddPaneCommand : public Command
00301     {
00302     public:
00303         AddPaneCommand(MainWindowBase *mw);
00304         virtual ~AddPaneCommand();
00305         
00306         virtual void execute();
00307         virtual void unexecute();
00308         virtual QString getName() const;
00309 
00310         Pane *getPane() { return m_pane; }
00311 
00312     protected:
00313         MainWindowBase *m_mw;
00314         Pane *m_pane; // Main window owns this, but I determine its lifespan
00315         Pane *m_prevCurrentPane; // I don't own this
00316         bool m_added;
00317     };
00318 
00319     class RemovePaneCommand : public Command
00320     {
00321     public:
00322         RemovePaneCommand(MainWindowBase *mw, Pane *pane);
00323         virtual ~RemovePaneCommand();
00324         
00325         virtual void execute();
00326         virtual void unexecute();
00327         virtual QString getName() const;
00328 
00329     protected:
00330         MainWindowBase *m_mw;
00331         Pane *m_pane; // Main window owns this, but I determine its lifespan
00332         Pane *m_prevCurrentPane; // I don't own this
00333         bool m_added;
00334     };
00335 
00336     virtual bool checkSaveModified() = 0;
00337 
00338     virtual QString getOpenFileName(FileFinder::FileType type);
00339     virtual QString getSaveFileName(FileFinder::FileType type);
00340     virtual void registerLastOpenedFilePath(FileFinder::FileType type, QString path);
00341 
00342     virtual void createPlayTarget();
00343     virtual void openHelpUrl(QString url);
00344 
00345     virtual void setupMenus() = 0;
00346     virtual void updateVisibleRangeDisplay(Pane *p) const = 0;
00347 
00348     virtual void toXml(QTextStream &stream);
00349 };
00350 
00351 
00352 #endif

Generated on Wed Feb 20 15:45:26 2008 for SonicVisualiser by  doxygen 1.5.1