Chris@200: /* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ Chris@200: Chris@200: /* Chris@200: Sonic Visualiser Chris@200: An audio file viewer and annotation editor. Chris@200: Centre for Digital Music, Queen Mary, University of London. Chris@200: This file copyright 2006-2007 Chris Cannam and QMUL. Chris@200: Chris@200: This program is free software; you can redistribute it and/or Chris@200: modify it under the terms of the GNU General Public License as Chris@200: published by the Free Software Foundation; either version 2 of the Chris@200: License, or (at your option) any later version. See the file Chris@200: COPYING included with this distribution for more information. Chris@200: */ Chris@200: Chris@200: #ifndef _MAIN_WINDOW_BASE_H_ Chris@200: #define _MAIN_WINDOW_BASE_H_ Chris@200: Chris@200: #include Chris@200: #include Chris@200: #include Chris@200: #include Chris@200: #include Chris@200: Chris@200: #include "base/Command.h" Chris@200: #include "view/ViewManager.h" Chris@200: #include "base/PropertyContainer.h" Chris@200: #include "base/RecentFiles.h" Chris@200: #include "layer/LayerFactory.h" Chris@200: #include "transform/Transform.h" Chris@200: #include "document/SVFileReader.h" Chris@200: #include "data/fileio/FileFinder.h" Chris@200: #include "data/fileio/FileSource.h" Chris@200: #include Chris@200: Chris@200: class Document; Chris@200: class PaneStack; Chris@200: class Pane; Chris@200: class View; Chris@200: class Fader; Chris@200: class Overview; Chris@200: class Layer; Chris@200: class WaveformLayer; Chris@200: class WaveFileModel; Chris@200: class AudioCallbackPlaySource; Chris@200: class AudioCallbackPlayTarget; Chris@200: class CommandHistory; Chris@200: class QMenu; Chris@200: class AudioDial; Chris@200: class QLabel; Chris@200: class QCheckBox; Chris@200: class PreferencesDialog; Chris@200: class QTreeView; Chris@200: class QPushButton; Chris@200: class OSCQueue; Chris@200: class OSCMessage; Chris@200: class KeyReference; Chris@200: class Labeller; Chris@200: Chris@200: /** Chris@200: * The base class for the SV main window. This includes everything to Chris@200: * do with general document and pane stack management, but nothing Chris@200: * that involves user interaction -- this doesn't create the widget or Chris@200: * menu structures or editing tools, and if a function needs to open a Chris@200: * dialog, it shouldn't be in here. This permits "variations on SV" Chris@200: * to use different subclasses retaining the same general structure. Chris@200: */ Chris@200: Chris@200: class MainWindowBase : public QMainWindow Chris@200: { Chris@200: Q_OBJECT Chris@200: Chris@200: public: Chris@200: MainWindowBase(bool withAudioOutput, bool withOSCSupport); Chris@200: virtual ~MainWindowBase(); Chris@200: Chris@200: enum AudioFileOpenMode { Chris@200: ReplaceMainModel, Chris@200: CreateAdditionalModel, Chris@200: ReplaceCurrentPane, Chris@200: AskUser Chris@200: }; Chris@200: Chris@200: enum FileOpenStatus { Chris@200: FileOpenSucceeded, Chris@200: FileOpenFailed, Chris@200: FileOpenCancelled, Chris@200: FileOpenWrongMode // attempted to open layer when no main model present Chris@200: }; Chris@200: Chris@200: virtual FileOpenStatus open(QString fileOrUrl, AudioFileOpenMode = AskUser); Chris@200: virtual FileOpenStatus open(FileSource source, AudioFileOpenMode = AskUser); Chris@200: Chris@200: virtual FileOpenStatus openAudio(FileSource source, AudioFileOpenMode = AskUser); Chris@200: virtual FileOpenStatus openPlaylist(FileSource source, AudioFileOpenMode = AskUser); Chris@200: virtual FileOpenStatus openLayer(FileSource source); Chris@200: virtual FileOpenStatus openImage(FileSource source); Chris@200: Chris@200: virtual FileOpenStatus openSessionFile(QString fileOrUrl); Chris@200: virtual FileOpenStatus openSession(FileSource source); Chris@200: Chris@200: virtual bool saveSessionFile(QString path); Chris@200: Chris@200: signals: Chris@200: // Used to toggle the availability of menu actions Chris@200: void canAddPane(bool); Chris@200: void canDeleteCurrentPane(bool); Chris@200: void canAddLayer(bool); Chris@200: void canImportMoreAudio(bool); Chris@200: void canImportLayer(bool); Chris@200: void canExportAudio(bool); Chris@200: void canExportLayer(bool); Chris@200: void canExportImage(bool); Chris@200: void canRenameLayer(bool); Chris@200: void canEditLayer(bool); Chris@200: void canMeasureLayer(bool); Chris@200: void canSelect(bool); Chris@200: void canClearSelection(bool); Chris@200: void canEditSelection(bool); Chris@200: void canDeleteSelection(bool); Chris@200: void canPaste(bool); Chris@200: void canInsertInstant(bool); Chris@200: void canInsertInstantsAtBoundaries(bool); Chris@200: void canRenumberInstants(bool); Chris@200: void canDeleteCurrentLayer(bool); Chris@200: void canZoom(bool); Chris@200: void canScroll(bool); Chris@200: void canPlay(bool); Chris@200: void canFfwd(bool); Chris@200: void canRewind(bool); Chris@200: void canPlaySelection(bool); Chris@200: void canSpeedUpPlayback(bool); Chris@200: void canSlowDownPlayback(bool); Chris@200: void canChangePlaybackSpeed(bool); Chris@200: void canSave(bool); Chris@200: Chris@200: public slots: Chris@200: virtual void preferenceChanged(PropertyContainer::PropertyName); Chris@200: Chris@200: protected slots: Chris@200: virtual void zoomIn(); Chris@200: virtual void zoomOut(); Chris@200: virtual void zoomToFit(); Chris@200: virtual void zoomDefault(); Chris@200: virtual void scrollLeft(); Chris@200: virtual void scrollRight(); Chris@200: virtual void jumpLeft(); Chris@200: virtual void jumpRight(); Chris@200: Chris@200: virtual void showNoOverlays(); Chris@200: virtual void showMinimalOverlays(); Chris@200: virtual void showStandardOverlays(); Chris@200: virtual void showAllOverlays(); Chris@200: Chris@200: virtual void toggleZoomWheels(); Chris@200: virtual void togglePropertyBoxes(); Chris@200: virtual void toggleStatusBar(); Chris@200: Chris@200: virtual void play(); Chris@200: virtual void ffwd(); Chris@200: virtual void ffwdEnd(); Chris@200: virtual void rewind(); Chris@200: virtual void rewindStart(); Chris@200: virtual void stop(); Chris@200: Chris@200: virtual void deleteCurrentPane(); Chris@200: virtual void deleteCurrentLayer(); Chris@200: Chris@200: virtual void playLoopToggled(); Chris@200: virtual void playSelectionToggled(); Chris@200: virtual void playSoloToggled(); Chris@200: Chris@200: virtual void sampleRateMismatch(size_t, size_t, bool) = 0; Chris@200: virtual void audioOverloadPluginDisabled() = 0; Chris@200: Chris@200: virtual void playbackFrameChanged(unsigned long); Chris@200: virtual void globalCentreFrameChanged(unsigned long); Chris@200: virtual void viewCentreFrameChanged(View *, unsigned long); Chris@200: virtual void viewZoomLevelChanged(View *, unsigned long, bool); Chris@200: virtual void outputLevelsChanged(float, float) = 0; Chris@200: Chris@200: virtual void currentPaneChanged(Pane *); Chris@200: virtual void currentLayerChanged(Pane *, Layer *); Chris@200: Chris@200: virtual void selectAll(); Chris@200: virtual void selectToStart(); Chris@200: virtual void selectToEnd(); Chris@200: virtual void selectVisible(); Chris@200: virtual void clearSelection(); Chris@200: Chris@200: virtual void cut(); Chris@200: virtual void copy(); Chris@200: virtual void paste(); Chris@200: virtual void deleteSelected(); Chris@200: Chris@200: virtual void insertInstant(); Chris@200: virtual void insertInstantAt(size_t); Chris@200: virtual void insertInstantsAtBoundaries(); Chris@200: virtual void renumberInstants(); Chris@200: Chris@200: virtual void documentModified(); Chris@200: virtual void documentRestored(); Chris@200: Chris@200: virtual void layerAdded(Layer *); Chris@200: virtual void layerRemoved(Layer *); Chris@200: virtual void layerAboutToBeDeleted(Layer *); Chris@200: virtual void layerInAView(Layer *, bool); Chris@200: Chris@200: virtual void mainModelChanged(WaveFileModel *); Chris@200: virtual void modelAdded(Model *); Chris@200: virtual void modelAboutToBeDeleted(Model *); Chris@200: Chris@200: virtual void updateMenuStates(); Chris@200: virtual void updateDescriptionLabel() = 0; Chris@200: Chris@200: virtual void modelGenerationFailed(QString) = 0; Chris@200: virtual void modelRegenerationFailed(QString, QString) = 0; Chris@200: Chris@200: virtual void rightButtonMenuRequested(Pane *, QPoint point) = 0; Chris@200: Chris@200: virtual void paneAdded(Pane *) = 0; Chris@200: virtual void paneHidden(Pane *) = 0; Chris@200: virtual void paneAboutToBeDeleted(Pane *) = 0; Chris@200: virtual void paneDropAccepted(Pane *, QStringList) = 0; Chris@200: virtual void paneDropAccepted(Pane *, QString) = 0; Chris@200: Chris@200: virtual void pollOSC(); Chris@200: virtual void handleOSCMessage(const OSCMessage &) = 0; Chris@200: Chris@200: virtual void contextHelpChanged(const QString &); Chris@200: virtual void inProgressSelectionChanged(); Chris@200: Chris@200: virtual void closeSession() = 0; Chris@200: Chris@200: protected: Chris@200: QString m_sessionFile; Chris@200: QString m_audioFile; Chris@200: Document *m_document; Chris@200: Chris@200: QLabel *m_descriptionLabel; Chris@200: PaneStack *m_paneStack; Chris@200: ViewManager *m_viewManager; Chris@200: Layer *m_timeRulerLayer; Chris@200: Chris@200: bool m_audioOutput; Chris@200: AudioCallbackPlaySource *m_playSource; Chris@200: AudioCallbackPlayTarget *m_playTarget; Chris@200: Chris@200: OSCQueue *m_oscQueue; Chris@200: Chris@200: RecentFiles m_recentFiles; Chris@200: RecentFiles m_recentTransforms; Chris@200: Chris@200: bool m_documentModified; Chris@200: bool m_openingAudioFile; Chris@200: bool m_abandoning; Chris@200: Chris@200: Labeller *m_labeller; Chris@200: Chris@200: int m_lastPlayStatusSec; Chris@200: mutable QString m_myStatusMessage; Chris@200: Chris@200: bool m_initialDarkBackground; Chris@200: Chris@200: WaveFileModel *getMainModel(); Chris@200: const WaveFileModel *getMainModel() const; Chris@200: void createDocument(); Chris@200: Chris@200: Pane *addPaneToStack(); Chris@200: Layer *getSnapLayer() const; Chris@200: Chris@200: class PaneCallback : public SVFileReaderPaneCallback Chris@200: { Chris@200: public: Chris@200: PaneCallback(MainWindowBase *mw) : m_mw(mw) { } Chris@200: virtual Pane *addPane() { return m_mw->addPaneToStack(); } Chris@200: virtual void setWindowSize(int width, int height) { Chris@200: m_mw->resize(width, height); Chris@200: } Chris@200: virtual void addSelection(int start, int end) { Chris@200: m_mw->m_viewManager->addSelection(Selection(start, end)); Chris@200: } Chris@200: protected: Chris@200: MainWindowBase *m_mw; Chris@200: }; Chris@200: Chris@200: class AddPaneCommand : public Command Chris@200: { Chris@200: public: Chris@200: AddPaneCommand(MainWindowBase *mw); Chris@200: virtual ~AddPaneCommand(); Chris@200: Chris@200: virtual void execute(); Chris@200: virtual void unexecute(); Chris@200: virtual QString getName() const; Chris@200: Chris@200: Pane *getPane() { return m_pane; } Chris@200: Chris@200: protected: Chris@200: MainWindowBase *m_mw; Chris@200: Pane *m_pane; // Main window owns this, but I determine its lifespan Chris@200: Pane *m_prevCurrentPane; // I don't own this Chris@200: bool m_added; Chris@200: }; Chris@200: Chris@200: class RemovePaneCommand : public Command Chris@200: { Chris@200: public: Chris@200: RemovePaneCommand(MainWindowBase *mw, Pane *pane); Chris@200: virtual ~RemovePaneCommand(); Chris@200: Chris@200: virtual void execute(); Chris@200: virtual void unexecute(); Chris@200: virtual QString getName() const; Chris@200: Chris@200: protected: Chris@200: MainWindowBase *m_mw; Chris@200: Pane *m_pane; // Main window owns this, but I determine its lifespan Chris@200: Pane *m_prevCurrentPane; // I don't own this Chris@200: bool m_added; Chris@200: }; Chris@200: Chris@200: virtual bool checkSaveModified() = 0; Chris@200: Chris@200: virtual QString getOpenFileName(FileFinder::FileType type); Chris@200: virtual QString getSaveFileName(FileFinder::FileType type); Chris@200: virtual void registerLastOpenedFilePath(FileFinder::FileType type, QString path); Chris@200: Chris@200: virtual void createPlayTarget(); Chris@200: virtual void openHelpUrl(QString url); Chris@200: Chris@200: virtual void setupMenus() = 0; Chris@200: virtual void updateVisibleRangeDisplay(Pane *p) const = 0; Chris@200: Chris@200: virtual void toXml(QTextStream &stream); Chris@200: }; Chris@200: Chris@200: Chris@200: #endif