lbajardsilogic@0: /* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ lbajardsilogic@0: lbajardsilogic@0: /* lbajardsilogic@0: Sonic Visualiser lbajardsilogic@0: An audio file viewer and annotation editor. lbajardsilogic@0: Centre for Digital Music, Queen Mary, University of London. lbajardsilogic@0: This file copyright 2006 Chris Cannam and QMUL. lbajardsilogic@0: lbajardsilogic@0: This program is free software; you can redistribute it and/or lbajardsilogic@0: modify it under the terms of the GNU General Public License as lbajardsilogic@0: published by the Free Software Foundation; either version 2 of the lbajardsilogic@0: License, or (at your option) any later version. See the file lbajardsilogic@0: COPYING included with this distribution for more information. lbajardsilogic@0: */ lbajardsilogic@0: lbajardsilogic@0: #ifndef _VIEW_MANAGER_H_ lbajardsilogic@0: #define _VIEW_MANAGER_H_ lbajardsilogic@0: lbajardsilogic@0: #include lbajardsilogic@0: #include lbajardsilogic@0: lbajardsilogic@0: #include lbajardsilogic@0: lbajardsilogic@0: #include "base/Selection.h" lbajardsilogic@0: #include "base/Command.h" lbajardsilogic@0: #include "base/Clipboard.h" lbajardsilogic@0: lbajardsilogic@0: class AudioPlaySource; lbajardsilogic@0: class Model; lbajardsilogic@0: lbajardsilogic@0: enum PlaybackFollowMode { lbajardsilogic@0: PlaybackScrollContinuous, lbajardsilogic@0: PlaybackScrollPage, lbajardsilogic@0: PlaybackIgnore lbajardsilogic@0: }; lbajardsilogic@0: lbajardsilogic@0: class View; lbajardsilogic@0: lbajardsilogic@0: /** lbajardsilogic@0: * The ViewManager manages properties that may need to be synchronised lbajardsilogic@0: * between separate Views. For example, it handles signals associated lbajardsilogic@0: * with changes to the global pan and zoom, and it handles selections. lbajardsilogic@0: * lbajardsilogic@0: * Views should be implemented in such a way as to work lbajardsilogic@0: * correctly whether they are supplied with a ViewManager or not. lbajardsilogic@0: */ lbajardsilogic@0: lbajardsilogic@0: class ViewManager : public QObject lbajardsilogic@0: { lbajardsilogic@0: Q_OBJECT lbajardsilogic@0: lbajardsilogic@0: public: lbajardsilogic@0: ViewManager(); lbajardsilogic@0: virtual ~ViewManager(); lbajardsilogic@0: lbajardsilogic@0: void setAudioPlaySource(AudioPlaySource *source); lbajardsilogic@0: lbajardsilogic@0: bool isPlaying() const; lbajardsilogic@0: lbajardsilogic@0: unsigned long getGlobalCentreFrame() const; lbajardsilogic@0: void setGlobalCentreFrame(unsigned long); lbajardsilogic@0: unsigned long getGlobalZoom() const; lbajardsilogic@0: lbajardsilogic@0: unsigned long getPlaybackFrame() const; lbajardsilogic@0: void setPlaybackFrame(unsigned long frame); lbajardsilogic@0: lbajardsilogic@0: bool haveInProgressSelection() const; lbajardsilogic@0: const Selection &getInProgressSelection(bool &exclusive) const; lbajardsilogic@0: void setInProgressSelection(const Selection &selection, bool exclusive); lbajardsilogic@0: void clearInProgressSelection(); lbajardsilogic@0: lbajardsilogic@0: const MultiSelection &getSelection() const; lbajardsilogic@0: lbajardsilogic@0: const MultiSelection::SelectionList &getSelections() const; lbajardsilogic@0: void setSelection(const Selection &selection); lbajardsilogic@0: void addSelection(const Selection &selection); lbajardsilogic@0: void removeSelection(const Selection &selection); lbajardsilogic@0: void clearSelections(); lbajardsilogic@0: lbajardsilogic@0: /** lbajardsilogic@0: * Return the selection that contains a given frame. lbajardsilogic@0: * If defaultToFollowing is true, and if the frame is not in a lbajardsilogic@0: * selected area, return the next selection after the given frame. lbajardsilogic@0: * Return the empty selection if no appropriate selection is found. lbajardsilogic@0: */ lbajardsilogic@0: Selection getContainingSelection(size_t frame, bool defaultToFollowing) const; lbajardsilogic@0: lbajardsilogic@0: Clipboard &getClipboard() { return m_clipboard; } lbajardsilogic@0: lbajardsilogic@0: enum ToolMode { lbajardsilogic@0: NavigateMode, lbajardsilogic@0: SelectMode, lbajardsilogic@0: EditMode, lbajardsilogic@0: DrawMode lbajardsilogic@0: }; lbajardsilogic@0: ToolMode getToolMode() const { return m_toolMode; } lbajardsilogic@0: void setToolMode(ToolMode mode); lbajardsilogic@0: lbajardsilogic@0: bool getPlayLoopMode() const { return m_playLoopMode; } lbajardsilogic@0: void setPlayLoopMode(bool on); lbajardsilogic@0: lbajardsilogic@0: bool getPlaySelectionMode() const { return m_playSelectionMode; } lbajardsilogic@0: void setPlaySelectionMode(bool on); lbajardsilogic@0: lbajardsilogic@0: /** lbajardsilogic@0: * The sample rate that is used for playback. This is usually the lbajardsilogic@0: * rate of the main model, but not always. Models whose rates lbajardsilogic@0: * differ from this will play back at the wrong speed -- there is lbajardsilogic@0: * no per-model resampler. lbajardsilogic@0: */ lbajardsilogic@0: size_t getPlaybackSampleRate() const; lbajardsilogic@0: lbajardsilogic@0: /** lbajardsilogic@0: * The sample rate of the audio output device. If the playback lbajardsilogic@0: * sample rate differs from this, everything will be resampled at lbajardsilogic@0: * the output stage. lbajardsilogic@0: */ lbajardsilogic@0: size_t getOutputSampleRate() const; lbajardsilogic@0: lbajardsilogic@0: /** lbajardsilogic@0: * The sample rate of the current main model. This may in theory lbajardsilogic@0: * differ from the playback sample rate, in which case even the lbajardsilogic@0: * main model will play at the wrong speed. lbajardsilogic@0: */ lbajardsilogic@0: size_t getMainModelSampleRate() const { return m_mainModelSampleRate; } lbajardsilogic@0: lbajardsilogic@0: void setMainModelSampleRate(size_t sr) { m_mainModelSampleRate = sr; } lbajardsilogic@0: lbajardsilogic@0: enum OverlayMode { lbajardsilogic@0: NoOverlays, lbajardsilogic@0: MinimalOverlays, lbajardsilogic@0: StandardOverlays, lbajardsilogic@0: AllOverlays lbajardsilogic@0: }; lbajardsilogic@0: void setOverlayMode(OverlayMode mode); lbajardsilogic@0: OverlayMode getOverlayMode() const { return m_overlayMode; } lbajardsilogic@0: lbajardsilogic@0: bool shouldShowCentreLine() const { lbajardsilogic@0: return m_overlayMode != NoOverlays; lbajardsilogic@0: } lbajardsilogic@0: bool shouldShowFrameCount() const { lbajardsilogic@0: return m_overlayMode != NoOverlays; lbajardsilogic@0: } lbajardsilogic@0: bool shouldShowDuration() const { lbajardsilogic@0: return m_overlayMode > MinimalOverlays; lbajardsilogic@0: } lbajardsilogic@0: bool shouldShowVerticalScale() const { lbajardsilogic@0: return m_overlayMode > MinimalOverlays; lbajardsilogic@0: } lbajardsilogic@0: bool shouldShowSelectionExtents() const { lbajardsilogic@0: return m_overlayMode > MinimalOverlays; lbajardsilogic@0: } lbajardsilogic@0: bool shouldShowLayerNames() const { lbajardsilogic@0: return m_overlayMode == AllOverlays; lbajardsilogic@0: } lbajardsilogic@0: bool shouldShowScaleGuides() const { lbajardsilogic@0: return m_overlayMode != NoOverlays; lbajardsilogic@0: } lbajardsilogic@0: lbajardsilogic@0: void setZoomWheelsEnabled(bool enable); lbajardsilogic@0: bool getZoomWheelsEnabled() const { return m_zoomWheelsEnabled; } lbajardsilogic@0: lbajardsilogic@0: signals: lbajardsilogic@0: /** Emitted when user causes the global centre frame to change. */ lbajardsilogic@0: void globalCentreFrameChanged(unsigned long frame); lbajardsilogic@0: lbajardsilogic@0: /** Emitted when user scrolls a view, but doesn't affect global centre. */ lbajardsilogic@0: void viewCentreFrameChanged(View *v, unsigned long frame); lbajardsilogic@0: lbajardsilogic@0: /** Emitted when a view zooms. */ lbajardsilogic@0: void viewZoomLevelChanged(View *v, unsigned long zoom, bool locked); lbajardsilogic@0: lbajardsilogic@0: /** Emitted when the playback frame changes. */ lbajardsilogic@0: void playbackFrameChanged(unsigned long frame); lbajardsilogic@0: lbajardsilogic@0: /** Emitted when the output levels change. Values in range 0.0 -> 1.0. */ lbajardsilogic@0: void outputLevelsChanged(float left, float right); lbajardsilogic@0: lbajardsilogic@0: /** Emitted when the selection has changed. */ lbajardsilogic@0: void selectionChanged(); lbajardsilogic@0: lbajardsilogic@0: /** Emitted when the in-progress (rubberbanding) selection has changed. */ lbajardsilogic@0: void inProgressSelectionChanged(); lbajardsilogic@0: lbajardsilogic@0: /** Emitted when the tool mode has been changed. */ lbajardsilogic@0: void toolModeChanged(); lbajardsilogic@0: lbajardsilogic@0: /** Emitted when the play loop mode has been changed. */ lbajardsilogic@0: void playLoopModeChanged(); lbajardsilogic@0: void playLoopModeChanged(bool); lbajardsilogic@0: lbajardsilogic@0: /** Emitted when the play selection mode has been changed. */ lbajardsilogic@0: void playSelectionModeChanged(); lbajardsilogic@0: void playSelectionModeChanged(bool); lbajardsilogic@0: lbajardsilogic@0: /** Emitted when the overlay mode has been changed. */ lbajardsilogic@0: void overlayModeChanged(); lbajardsilogic@0: lbajardsilogic@0: /** Emitted when the zoom wheels have been toggled. */ lbajardsilogic@0: void zoomWheelsEnabledChanged(); lbajardsilogic@0: lbajardsilogic@0: public slots: lbajardsilogic@0: void viewCentreFrameChanged(unsigned long, bool, PlaybackFollowMode); lbajardsilogic@0: void viewZoomLevelChanged(unsigned long, bool); lbajardsilogic@0: lbajardsilogic@0: protected slots: lbajardsilogic@0: void checkPlayStatus(); lbajardsilogic@0: void playStatusChanged(bool playing); lbajardsilogic@0: void seek(unsigned long); lbajardsilogic@0: //!!! void considerZoomChange(void *, unsigned long, bool); lbajardsilogic@0: lbajardsilogic@0: protected: lbajardsilogic@0: AudioPlaySource *m_playSource; lbajardsilogic@0: unsigned long m_globalCentreFrame; lbajardsilogic@0: unsigned long m_globalZoom; lbajardsilogic@0: mutable unsigned long m_playbackFrame; lbajardsilogic@0: size_t m_mainModelSampleRate; lbajardsilogic@0: lbajardsilogic@0: float m_lastLeft; lbajardsilogic@0: float m_lastRight; lbajardsilogic@0: lbajardsilogic@0: MultiSelection m_selections; lbajardsilogic@0: Selection m_inProgressSelection; lbajardsilogic@0: bool m_inProgressExclusive; lbajardsilogic@0: lbajardsilogic@0: Clipboard m_clipboard; lbajardsilogic@0: lbajardsilogic@0: ToolMode m_toolMode; lbajardsilogic@0: lbajardsilogic@0: bool m_playLoopMode; lbajardsilogic@0: bool m_playSelectionMode; lbajardsilogic@0: lbajardsilogic@0: void setSelections(const MultiSelection &ms); lbajardsilogic@0: void signalSelectionChange(); lbajardsilogic@0: lbajardsilogic@0: class SetSelectionCommand : public Command lbajardsilogic@0: { lbajardsilogic@0: public: lbajardsilogic@0: SetSelectionCommand(ViewManager *vm, const MultiSelection &ms); lbajardsilogic@0: virtual ~SetSelectionCommand(); lbajardsilogic@0: virtual void execute(); lbajardsilogic@0: virtual void unexecute(); lbajardsilogic@0: virtual QString getName() const; lbajardsilogic@0: lbajardsilogic@0: protected: lbajardsilogic@0: ViewManager *m_vm; lbajardsilogic@0: MultiSelection m_oldSelection; lbajardsilogic@0: MultiSelection m_newSelection; lbajardsilogic@0: }; lbajardsilogic@0: lbajardsilogic@0: OverlayMode m_overlayMode; lbajardsilogic@0: bool m_zoomWheelsEnabled; lbajardsilogic@0: }; lbajardsilogic@0: lbajardsilogic@0: #endif lbajardsilogic@0: