| Chris@127 | 1 /* -*- c-basic-offset: 4 indent-tabs-mode: nil -*-  vi:set ts=8 sts=4 sw=4: */ | 
| Chris@127 | 2 | 
| Chris@127 | 3 /* | 
| Chris@127 | 4     Sonic Visualiser | 
| Chris@127 | 5     An audio file viewer and annotation editor. | 
| Chris@127 | 6     Centre for Digital Music, Queen Mary, University of London. | 
| Chris@182 | 7     This file copyright 2006 Chris Cannam and QMUL. | 
| Chris@127 | 8 | 
| Chris@127 | 9     This program is free software; you can redistribute it and/or | 
| Chris@127 | 10     modify it under the terms of the GNU General Public License as | 
| Chris@127 | 11     published by the Free Software Foundation; either version 2 of the | 
| Chris@127 | 12     License, or (at your option) any later version.  See the file | 
| Chris@127 | 13     COPYING included with this distribution for more information. | 
| Chris@127 | 14 */ | 
| Chris@127 | 15 | 
| Chris@127 | 16 #ifndef _VIEW_MANAGER_H_ | 
| Chris@127 | 17 #define _VIEW_MANAGER_H_ | 
| Chris@127 | 18 | 
| Chris@127 | 19 #include <QObject> | 
| Chris@127 | 20 #include <QTimer> | 
| Chris@127 | 21 | 
| Chris@127 | 22 #include <map> | 
| Chris@127 | 23 | 
| Chris@128 | 24 #include "base/Selection.h" | 
| Chris@128 | 25 #include "base/Command.h" | 
| Chris@128 | 26 #include "base/Clipboard.h" | 
| Chris@127 | 27 | 
| Chris@127 | 28 class AudioPlaySource; | 
| Chris@127 | 29 class Model; | 
| Chris@127 | 30 | 
| Chris@127 | 31 /** | 
| Chris@127 | 32  * The ViewManager manages properties that may need to be synchronised | 
| Chris@127 | 33  * between separate Views.  For example, it handles signals associated | 
| Chris@127 | 34  * with changes to the global pan and zoom, and it handles selections. | 
| Chris@127 | 35  * | 
| Chris@127 | 36  * Views should be implemented in such a way as to work | 
| Chris@127 | 37  * correctly whether they are supplied with a ViewManager or not. | 
| Chris@127 | 38  */ | 
| Chris@127 | 39 | 
| Chris@127 | 40 class ViewManager : public QObject | 
| Chris@127 | 41 { | 
| Chris@127 | 42     Q_OBJECT | 
| Chris@127 | 43 | 
| Chris@127 | 44 public: | 
| Chris@127 | 45     ViewManager(); | 
| Chris@127 | 46     virtual ~ViewManager(); | 
| Chris@127 | 47 | 
| Chris@127 | 48     void setAudioPlaySource(AudioPlaySource *source); | 
| Chris@127 | 49 | 
| Chris@127 | 50     bool isPlaying() const; | 
| Chris@127 | 51 | 
| Chris@127 | 52     unsigned long getGlobalCentreFrame() const; | 
| Chris@180 | 53     void setGlobalCentreFrame(unsigned long); | 
| Chris@127 | 54     unsigned long getGlobalZoom() const; | 
| Chris@127 | 55 | 
| Chris@127 | 56     unsigned long getPlaybackFrame() const; | 
| Chris@127 | 57     void setPlaybackFrame(unsigned long frame); | 
| Chris@127 | 58 | 
| Chris@127 | 59     bool haveInProgressSelection() const; | 
| Chris@127 | 60     const Selection &getInProgressSelection(bool &exclusive) const; | 
| Chris@127 | 61     void setInProgressSelection(const Selection &selection, bool exclusive); | 
| Chris@127 | 62     void clearInProgressSelection(); | 
| Chris@127 | 63 | 
| Chris@127 | 64     const MultiSelection &getSelection() const; | 
| Chris@127 | 65 | 
| Chris@127 | 66     const MultiSelection::SelectionList &getSelections() const; | 
| Chris@127 | 67     void setSelection(const Selection &selection); | 
| Chris@127 | 68     void addSelection(const Selection &selection); | 
| Chris@127 | 69     void removeSelection(const Selection &selection); | 
| Chris@127 | 70     void clearSelections(); | 
| Chris@127 | 71 | 
| Chris@127 | 72     /** | 
| Chris@127 | 73      * Return the selection that contains a given frame. | 
| Chris@127 | 74      * If defaultToFollowing is true, and if the frame is not in a | 
| Chris@127 | 75      * selected area, return the next selection after the given frame. | 
| Chris@127 | 76      * Return the empty selection if no appropriate selection is found. | 
| Chris@127 | 77      */ | 
| Chris@127 | 78     Selection getContainingSelection(size_t frame, bool defaultToFollowing) const; | 
| Chris@127 | 79 | 
| Chris@127 | 80     Clipboard &getClipboard() { return m_clipboard; } | 
| Chris@127 | 81 | 
| Chris@127 | 82     enum ToolMode { | 
| Chris@127 | 83 	NavigateMode, | 
| Chris@127 | 84 	SelectMode, | 
| Chris@127 | 85         EditMode, | 
| Chris@127 | 86 	DrawMode | 
| Chris@127 | 87     }; | 
| Chris@127 | 88     ToolMode getToolMode() const { return m_toolMode; } | 
| Chris@127 | 89     void setToolMode(ToolMode mode); | 
| Chris@127 | 90 | 
| Chris@127 | 91     bool getPlayLoopMode() const { return m_playLoopMode; } | 
| Chris@127 | 92     void setPlayLoopMode(bool on); | 
| Chris@127 | 93 | 
| Chris@127 | 94     bool getPlaySelectionMode() const { return m_playSelectionMode; } | 
| Chris@127 | 95     void setPlaySelectionMode(bool on); | 
| Chris@127 | 96 | 
| Chris@127 | 97     size_t getPlaybackSampleRate() const; | 
| Chris@127 | 98     size_t getMainModelSampleRate() const { return m_mainModelSampleRate; } | 
| Chris@127 | 99     void setMainModelSampleRate(size_t sr) { m_mainModelSampleRate = sr; } | 
| Chris@127 | 100 | 
| Chris@127 | 101     enum OverlayMode { | 
| Chris@127 | 102         NoOverlays, | 
| Chris@127 | 103         BasicOverlays, | 
| Chris@127 | 104         AllOverlays | 
| Chris@127 | 105     }; | 
| Chris@127 | 106     void setOverlayMode(OverlayMode mode); | 
| Chris@127 | 107     OverlayMode getOverlayMode() const { return m_overlayMode; } | 
| Chris@127 | 108 | 
| Chris@133 | 109     void setZoomWheelsEnabled(bool enable); | 
| Chris@133 | 110     bool getZoomWheelsEnabled() const { return m_zoomWheelsEnabled; } | 
| Chris@133 | 111 | 
| Chris@127 | 112 signals: | 
| Chris@127 | 113     /** Emitted when a widget pans.  The originator identifies the widget. */ | 
| Chris@127 | 114     void centreFrameChanged(void *originator, unsigned long frame, bool locked); | 
| Chris@127 | 115 | 
| Chris@127 | 116     /** Emitted when a widget zooms.  The originator identifies the widget. */ | 
| Chris@127 | 117     void zoomLevelChanged(void *originator, unsigned long zoom, bool locked); | 
| Chris@127 | 118 | 
| Chris@133 | 119     /** Emitted when a widget zooms. */ | 
| Chris@133 | 120     void zoomLevelChanged(); | 
| Chris@133 | 121 | 
| Chris@127 | 122     /** Emitted when the playback frame changes. */ | 
| Chris@127 | 123     void playbackFrameChanged(unsigned long frame); | 
| Chris@127 | 124 | 
| Chris@127 | 125     /** Emitted when the output levels change. Values in range 0.0 -> 1.0. */ | 
| Chris@127 | 126     void outputLevelsChanged(float left, float right); | 
| Chris@127 | 127 | 
| Chris@127 | 128     /** Emitted when the selection has changed. */ | 
| Chris@127 | 129     void selectionChanged(); | 
| Chris@127 | 130 | 
| Chris@127 | 131     /** Emitted when the in-progress (rubberbanding) selection has changed. */ | 
| Chris@127 | 132     void inProgressSelectionChanged(); | 
| Chris@127 | 133 | 
| Chris@127 | 134     /** Emitted when the tool mode has been changed. */ | 
| Chris@127 | 135     void toolModeChanged(); | 
| Chris@127 | 136 | 
| Chris@127 | 137     /** Emitted when the play loop mode has been changed. */ | 
| Chris@127 | 138     void playLoopModeChanged(); | 
| Chris@177 | 139     void playLoopModeChanged(bool); | 
| Chris@127 | 140 | 
| Chris@127 | 141     /** Emitted when the play selection mode has been changed. */ | 
| Chris@127 | 142     void playSelectionModeChanged(); | 
| Chris@177 | 143     void playSelectionModeChanged(bool); | 
| Chris@127 | 144 | 
| Chris@127 | 145     /** Emitted when the overlay mode has been changed. */ | 
| Chris@127 | 146     void overlayModeChanged(); | 
| Chris@127 | 147 | 
| Chris@133 | 148     /** Emitted when the zoom wheels have been toggled. */ | 
| Chris@133 | 149     void zoomWheelsEnabledChanged(); | 
| Chris@133 | 150 | 
| Chris@127 | 151 protected slots: | 
| Chris@127 | 152     void checkPlayStatus(); | 
| Chris@127 | 153     void playStatusChanged(bool playing); | 
| Chris@127 | 154     void considerSeek(void *, unsigned long, bool); | 
| Chris@127 | 155     void considerZoomChange(void *, unsigned long, bool); | 
| Chris@127 | 156 | 
| Chris@127 | 157 protected: | 
| Chris@127 | 158     AudioPlaySource *m_playSource; | 
| Chris@127 | 159     unsigned long m_globalCentreFrame; | 
| Chris@127 | 160     unsigned long m_globalZoom; | 
| Chris@127 | 161     mutable unsigned long m_playbackFrame; | 
| Chris@127 | 162     size_t m_mainModelSampleRate; | 
| Chris@127 | 163 | 
| Chris@127 | 164     float m_lastLeft; | 
| Chris@127 | 165     float m_lastRight; | 
| Chris@127 | 166 | 
| Chris@127 | 167     MultiSelection m_selections; | 
| Chris@127 | 168     Selection m_inProgressSelection; | 
| Chris@127 | 169     bool m_inProgressExclusive; | 
| Chris@127 | 170 | 
| Chris@127 | 171     Clipboard m_clipboard; | 
| Chris@127 | 172 | 
| Chris@127 | 173     ToolMode m_toolMode; | 
| Chris@127 | 174 | 
| Chris@127 | 175     bool m_playLoopMode; | 
| Chris@127 | 176     bool m_playSelectionMode; | 
| Chris@127 | 177 | 
| Chris@127 | 178     void setSelections(const MultiSelection &ms); | 
| Chris@127 | 179     void signalSelectionChange(); | 
| Chris@127 | 180 | 
| Chris@127 | 181     class SetSelectionCommand : public Command | 
| Chris@127 | 182     { | 
| Chris@127 | 183     public: | 
| Chris@127 | 184 	SetSelectionCommand(ViewManager *vm, const MultiSelection &ms); | 
| Chris@127 | 185 	virtual ~SetSelectionCommand(); | 
| Chris@127 | 186 	virtual void execute(); | 
| Chris@127 | 187 	virtual void unexecute(); | 
| Chris@127 | 188 	virtual QString getName() const; | 
| Chris@127 | 189 | 
| Chris@127 | 190     protected: | 
| Chris@127 | 191 	ViewManager *m_vm; | 
| Chris@127 | 192 	MultiSelection m_oldSelection; | 
| Chris@127 | 193 	MultiSelection m_newSelection; | 
| Chris@127 | 194     }; | 
| Chris@127 | 195 | 
| Chris@127 | 196     OverlayMode m_overlayMode; | 
| Chris@133 | 197     bool m_zoomWheelsEnabled; | 
| Chris@127 | 198 }; | 
| Chris@127 | 199 | 
| Chris@127 | 200 #endif | 
| Chris@127 | 201 |