| Chris@0 | 1 /* -*- c-basic-offset: 4 -*-  vi:set ts=8 sts=4 sw=4: */ | 
| Chris@0 | 2 | 
| Chris@0 | 3 /* | 
| Chris@0 | 4     A waveform viewer and audio annotation editor. | 
| Chris@2 | 5     Chris Cannam, Queen Mary University of London, 2005-2006 | 
| Chris@0 | 6 | 
| Chris@0 | 7     This is experimental software.  Not for distribution. | 
| Chris@0 | 8 */ | 
| Chris@0 | 9 | 
| Chris@0 | 10 #ifndef _VIEW_MANAGER_H_ | 
| Chris@0 | 11 #define _VIEW_MANAGER_H_ | 
| Chris@0 | 12 | 
| Chris@0 | 13 #include <QObject> | 
| Chris@0 | 14 #include <QTimer> | 
| Chris@0 | 15 | 
| Chris@0 | 16 #include <map> | 
| Chris@8 | 17 | 
| Chris@8 | 18 #include "Selection.h" | 
| Chris@0 | 19 | 
| Chris@0 | 20 class AudioPlaySource; | 
| Chris@0 | 21 class PlayParameters; | 
| Chris@0 | 22 class Model; | 
| Chris@0 | 23 | 
| Chris@0 | 24 /** | 
| Chris@0 | 25  * The ViewManager manages properties that may need to be synchronised | 
| Chris@0 | 26  * between separate Views.  For example, it handles signals associated | 
| Chris@0 | 27  * with changes to the global pan and zoom.  It also handles playback | 
| Chris@0 | 28  * properties and play synchronisation. | 
| Chris@0 | 29  * | 
| Chris@0 | 30  * Views should be implemented in such a way as to work | 
| Chris@0 | 31  * correctly whether they are supplied with a ViewManager or not. | 
| Chris@0 | 32  */ | 
| Chris@0 | 33 | 
| Chris@0 | 34 class ViewManager : public QObject | 
| Chris@0 | 35 { | 
| Chris@0 | 36     Q_OBJECT | 
| Chris@0 | 37 | 
| Chris@0 | 38 public: | 
| Chris@0 | 39     ViewManager(); | 
| Chris@0 | 40 | 
| Chris@0 | 41     void setAudioPlaySource(AudioPlaySource *source); | 
| Chris@0 | 42 | 
| Chris@0 | 43 //!!! No way to remove a model! | 
| Chris@0 | 44     PlayParameters *getPlayParameters(const Model *model); | 
| Chris@0 | 45     void clearPlayParameters(); | 
| Chris@0 | 46 | 
| Chris@8 | 47     bool isPlaying() const; | 
| Chris@8 | 48 | 
| Chris@0 | 49     unsigned long getGlobalCentreFrame() const; | 
| Chris@0 | 50     unsigned long getGlobalZoom() const; | 
| Chris@0 | 51 | 
| Chris@24 | 52     unsigned long getPlaybackFrame() const; | 
| Chris@24 | 53     void setPlaybackFrame(unsigned long frame); | 
| Chris@8 | 54 | 
| Chris@8 | 55     bool haveInProgressSelection() const; | 
| Chris@8 | 56     const Selection &getInProgressSelection(bool &exclusive) const; | 
| Chris@8 | 57     void setInProgressSelection(const Selection &selection, bool exclusive); | 
| Chris@8 | 58     void clearInProgressSelection(); | 
| Chris@8 | 59 | 
| Chris@24 | 60     const MultiSelection &getSelection() const; | 
| Chris@24 | 61 | 
| Chris@24 | 62     const MultiSelection::SelectionList &getSelections() const; | 
| Chris@8 | 63     void setSelection(const Selection &selection); | 
| Chris@8 | 64     void addSelection(const Selection &selection); | 
| Chris@8 | 65     void removeSelection(const Selection &selection); | 
| Chris@8 | 66     void clearSelections(); | 
| Chris@8 | 67 | 
| Chris@9 | 68     /** | 
| Chris@9 | 69      * Return the selection that contains a given frame. | 
| Chris@9 | 70      * If defaultToFollowing is true, and if the frame is not in a | 
| Chris@9 | 71      * selected area, return the next selection after the given frame. | 
| Chris@9 | 72      * Return the empty selection if no appropriate selection is found. | 
| Chris@9 | 73      */ | 
| Chris@9 | 74     Selection getContainingSelection(size_t frame, bool defaultToFollowing); | 
| Chris@9 | 75 | 
| Chris@8 | 76     enum ToolMode { | 
| Chris@8 | 77 	NavigateMode, | 
| Chris@8 | 78 	SelectMode, | 
| Chris@8 | 79         EditMode, | 
| Chris@8 | 80 	DrawMode, | 
| Chris@8 | 81 	TextMode | 
| Chris@8 | 82     }; | 
| Chris@8 | 83     ToolMode getToolMode() const { return m_toolMode; } | 
| Chris@8 | 84     void setToolMode(ToolMode mode); | 
| Chris@8 | 85 | 
| Chris@9 | 86     bool getPlayLoopMode() const { return m_playLoopMode; } | 
| Chris@9 | 87     void setPlayLoopMode(bool on); | 
| Chris@9 | 88 | 
| Chris@9 | 89     bool getPlaySelectionMode() const { return m_playSelectionMode; } | 
| Chris@9 | 90     void setPlaySelectionMode(bool on); | 
| Chris@9 | 91 | 
| Chris@0 | 92 signals: | 
| Chris@0 | 93     /** Emitted when a widget pans.  The originator identifies the widget. */ | 
| Chris@0 | 94     void centreFrameChanged(void *originator, unsigned long frame, bool locked); | 
| Chris@0 | 95 | 
| Chris@0 | 96     /** Emitted when a widget zooms.  The originator identifies the widget. */ | 
| Chris@0 | 97     void zoomLevelChanged(void *originator, unsigned long zoom, bool locked); | 
| Chris@0 | 98 | 
| Chris@0 | 99     /** Emitted when the playback frame changes. */ | 
| Chris@0 | 100     void playbackFrameChanged(unsigned long frame); | 
| Chris@0 | 101 | 
| Chris@0 | 102     /** Emitted when the output levels change. Values in range 0.0 -> 1.0. */ | 
| Chris@0 | 103     void outputLevelsChanged(float left, float right); | 
| Chris@0 | 104 | 
| Chris@8 | 105     /** Emitted when the selection has changed. */ | 
| Chris@8 | 106     void selectionChanged(); | 
| Chris@8 | 107 | 
| Chris@9 | 108     /** Emitted when the in-progress (rubberbanding) selection has changed. */ | 
| Chris@9 | 109     void inProgressSelectionChanged(); | 
| Chris@9 | 110 | 
| Chris@8 | 111     /** Emitted when the tool mode has been changed. */ | 
| Chris@8 | 112     void toolModeChanged(); | 
| Chris@8 | 113 | 
| Chris@9 | 114     /** Emitted when the play loop mode has been changed. */ | 
| Chris@9 | 115     void playLoopModeChanged(); | 
| Chris@9 | 116 | 
| Chris@9 | 117     /** Emitted when the play selection mode has been changed. */ | 
| Chris@9 | 118     void playSelectionModeChanged(); | 
| Chris@9 | 119 | 
| Chris@0 | 120 protected slots: | 
| Chris@0 | 121     void checkPlayStatus(); | 
| Chris@10 | 122     void playStatusChanged(bool playing); | 
| Chris@0 | 123     void considerSeek(void *, unsigned long, bool); | 
| Chris@0 | 124     void considerZoomChange(void *, unsigned long, bool); | 
| Chris@0 | 125 | 
| Chris@0 | 126 protected: | 
| Chris@0 | 127     AudioPlaySource *m_playSource; | 
| Chris@0 | 128     unsigned long m_globalCentreFrame; | 
| Chris@0 | 129     unsigned long m_globalZoom; | 
| Chris@24 | 130     mutable unsigned long m_playbackFrame; | 
| Chris@0 | 131 | 
| Chris@0 | 132     float m_lastLeft; | 
| Chris@0 | 133     float m_lastRight; | 
| Chris@0 | 134 | 
| Chris@24 | 135     MultiSelection m_selections; | 
| Chris@8 | 136     Selection m_inProgressSelection; | 
| Chris@8 | 137     bool m_inProgressExclusive; | 
| Chris@8 | 138 | 
| Chris@8 | 139     ToolMode m_toolMode; | 
| Chris@8 | 140 | 
| Chris@9 | 141     bool m_playLoopMode; | 
| Chris@9 | 142     bool m_playSelectionMode; | 
| Chris@9 | 143 | 
| Chris@0 | 144     std::map<const Model *, PlayParameters *> m_playParameters; | 
| Chris@0 | 145 }; | 
| Chris@0 | 146 | 
| Chris@0 | 147 #endif | 
| Chris@0 | 148 |