annotate view/ViewManager.h @ 282:d9319859a4cf tip

(none)
author benoitrigolleau
date Fri, 31 Oct 2008 11:00:24 +0000
parents fc9323a41f5a
children
rev   line source
lbajardsilogic@0 1 /* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
lbajardsilogic@0 2
lbajardsilogic@0 3 /*
lbajardsilogic@0 4 Sonic Visualiser
lbajardsilogic@0 5 An audio file viewer and annotation editor.
lbajardsilogic@0 6 Centre for Digital Music, Queen Mary, University of London.
lbajardsilogic@0 7 This file copyright 2006 Chris Cannam and QMUL.
lbajardsilogic@0 8
lbajardsilogic@0 9 This program is free software; you can redistribute it and/or
lbajardsilogic@0 10 modify it under the terms of the GNU General Public License as
lbajardsilogic@0 11 published by the Free Software Foundation; either version 2 of the
lbajardsilogic@0 12 License, or (at your option) any later version. See the file
lbajardsilogic@0 13 COPYING included with this distribution for more information.
lbajardsilogic@0 14 */
lbajardsilogic@0 15
lbajardsilogic@0 16 #ifndef _VIEW_MANAGER_H_
lbajardsilogic@0 17 #define _VIEW_MANAGER_H_
lbajardsilogic@0 18
lbajardsilogic@0 19 #include <QObject>
lbajardsilogic@0 20 #include <QTimer>
lbajardsilogic@0 21
lbajardsilogic@0 22 #include <map>
lbajardsilogic@0 23
lbajardsilogic@0 24 #include "base/Selection.h"
lbajardsilogic@0 25 #include "base/Command.h"
lbajardsilogic@0 26 #include "base/Clipboard.h"
lbajardsilogic@0 27
lbajardsilogic@0 28 class AudioPlaySource;
lbajardsilogic@0 29 class Model;
lbajardsilogic@0 30
lbajardsilogic@0 31 enum PlaybackFollowMode {
lbajardsilogic@0 32 PlaybackScrollContinuous,
lbajardsilogic@0 33 PlaybackScrollPage,
lbajardsilogic@0 34 PlaybackIgnore
lbajardsilogic@0 35 };
lbajardsilogic@0 36
lbajardsilogic@0 37 class View;
lbajardsilogic@0 38
lbajardsilogic@0 39 /**
lbajardsilogic@0 40 * The ViewManager manages properties that may need to be synchronised
lbajardsilogic@0 41 * between separate Views. For example, it handles signals associated
lbajardsilogic@0 42 * with changes to the global pan and zoom, and it handles selections.
lbajardsilogic@0 43 *
lbajardsilogic@0 44 * Views should be implemented in such a way as to work
lbajardsilogic@0 45 * correctly whether they are supplied with a ViewManager or not.
lbajardsilogic@0 46 */
lbajardsilogic@0 47
lbajardsilogic@0 48 class ViewManager : public QObject
lbajardsilogic@0 49 {
lbajardsilogic@0 50 Q_OBJECT
lbajardsilogic@0 51
lbajardsilogic@0 52 public:
lbajardsilogic@0 53 ViewManager();
lbajardsilogic@0 54 virtual ~ViewManager();
lbajardsilogic@0 55
lbajardsilogic@0 56 void setAudioPlaySource(AudioPlaySource *source);
lbajardsilogic@0 57
lbajardsilogic@0 58 bool isPlaying() const;
lbajardsilogic@0 59
lbajardsilogic@0 60 unsigned long getGlobalCentreFrame() const;
lbajardsilogic@0 61 void setGlobalCentreFrame(unsigned long);
lbajardsilogic@0 62 unsigned long getGlobalZoom() const;
lbajardsilogic@0 63
lbajardsilogic@0 64 unsigned long getPlaybackFrame() const;
lbajardsilogic@0 65 void setPlaybackFrame(unsigned long frame);
lbajardsilogic@0 66
lbajardsilogic@0 67 bool haveInProgressSelection() const;
lbajardsilogic@0 68 const Selection &getInProgressSelection(bool &exclusive) const;
lbajardsilogic@0 69 void setInProgressSelection(const Selection &selection, bool exclusive);
lbajardsilogic@0 70 void clearInProgressSelection();
lbajardsilogic@0 71
lbajardsilogic@0 72 const MultiSelection &getSelection() const;
lbajardsilogic@0 73
lbajardsilogic@0 74 const MultiSelection::SelectionList &getSelections() const;
lbajardsilogic@0 75 void setSelection(const Selection &selection);
lbajardsilogic@0 76 void addSelection(const Selection &selection);
lbajardsilogic@0 77 void removeSelection(const Selection &selection);
lbajardsilogic@0 78 void clearSelections();
lbajardsilogic@0 79
lbajardsilogic@0 80 /**
lbajardsilogic@0 81 * Return the selection that contains a given frame.
lbajardsilogic@0 82 * If defaultToFollowing is true, and if the frame is not in a
lbajardsilogic@0 83 * selected area, return the next selection after the given frame.
lbajardsilogic@0 84 * Return the empty selection if no appropriate selection is found.
lbajardsilogic@0 85 */
lbajardsilogic@0 86 Selection getContainingSelection(size_t frame, bool defaultToFollowing) const;
lbajardsilogic@0 87
lbajardsilogic@0 88 Clipboard &getClipboard() { return m_clipboard; }
lbajardsilogic@0 89
lbajardsilogic@0 90 enum ToolMode {
lbajardsilogic@0 91 NavigateMode,
lbajardsilogic@0 92 SelectMode,
lbajardsilogic@0 93 EditMode,
lbajardsilogic@0 94 DrawMode
lbajardsilogic@0 95 };
lbajardsilogic@0 96 ToolMode getToolMode() const { return m_toolMode; }
lbajardsilogic@0 97 void setToolMode(ToolMode mode);
lbajardsilogic@0 98
lbajardsilogic@0 99 bool getPlayLoopMode() const { return m_playLoopMode; }
lbajardsilogic@0 100 void setPlayLoopMode(bool on);
lbajardsilogic@0 101
lbajardsilogic@0 102 bool getPlaySelectionMode() const { return m_playSelectionMode; }
lbajardsilogic@0 103 void setPlaySelectionMode(bool on);
lbajardsilogic@0 104
lbajardsilogic@0 105 /**
lbajardsilogic@0 106 * The sample rate that is used for playback. This is usually the
lbajardsilogic@0 107 * rate of the main model, but not always. Models whose rates
lbajardsilogic@0 108 * differ from this will play back at the wrong speed -- there is
lbajardsilogic@0 109 * no per-model resampler.
lbajardsilogic@0 110 */
lbajardsilogic@0 111 size_t getPlaybackSampleRate() const;
lbajardsilogic@0 112
lbajardsilogic@0 113 /**
lbajardsilogic@0 114 * The sample rate of the audio output device. If the playback
lbajardsilogic@0 115 * sample rate differs from this, everything will be resampled at
lbajardsilogic@0 116 * the output stage.
lbajardsilogic@0 117 */
lbajardsilogic@0 118 size_t getOutputSampleRate() const;
lbajardsilogic@0 119
lbajardsilogic@0 120 /**
lbajardsilogic@0 121 * The sample rate of the current main model. This may in theory
lbajardsilogic@0 122 * differ from the playback sample rate, in which case even the
lbajardsilogic@0 123 * main model will play at the wrong speed.
lbajardsilogic@0 124 */
lbajardsilogic@0 125 size_t getMainModelSampleRate() const { return m_mainModelSampleRate; }
lbajardsilogic@0 126
lbajardsilogic@0 127 void setMainModelSampleRate(size_t sr) { m_mainModelSampleRate = sr; }
lbajardsilogic@0 128
lbajardsilogic@0 129 enum OverlayMode {
lbajardsilogic@0 130 NoOverlays,
lbajardsilogic@0 131 MinimalOverlays,
lbajardsilogic@0 132 StandardOverlays,
lbajardsilogic@0 133 AllOverlays
lbajardsilogic@0 134 };
lbajardsilogic@0 135 void setOverlayMode(OverlayMode mode);
lbajardsilogic@0 136 OverlayMode getOverlayMode() const { return m_overlayMode; }
lbajardsilogic@0 137
lbajardsilogic@0 138 bool shouldShowCentreLine() const {
lbajardsilogic@0 139 return m_overlayMode != NoOverlays;
lbajardsilogic@0 140 }
lbajardsilogic@0 141 bool shouldShowFrameCount() const {
lbajardsilogic@0 142 return m_overlayMode != NoOverlays;
lbajardsilogic@0 143 }
lbajardsilogic@0 144 bool shouldShowDuration() const {
lbajardsilogic@0 145 return m_overlayMode > MinimalOverlays;
lbajardsilogic@0 146 }
lbajardsilogic@0 147 bool shouldShowVerticalScale() const {
lbajardsilogic@0 148 return m_overlayMode > MinimalOverlays;
lbajardsilogic@0 149 }
lbajardsilogic@0 150 bool shouldShowSelectionExtents() const {
lbajardsilogic@0 151 return m_overlayMode > MinimalOverlays;
lbajardsilogic@0 152 }
lbajardsilogic@0 153 bool shouldShowLayerNames() const {
lbajardsilogic@0 154 return m_overlayMode == AllOverlays;
lbajardsilogic@0 155 }
lbajardsilogic@0 156 bool shouldShowScaleGuides() const {
lbajardsilogic@0 157 return m_overlayMode != NoOverlays;
lbajardsilogic@0 158 }
lbajardsilogic@0 159
lbajardsilogic@0 160 void setZoomWheelsEnabled(bool enable);
lbajardsilogic@0 161 bool getZoomWheelsEnabled() const { return m_zoomWheelsEnabled; }
lbajardsilogic@0 162
lbajardsilogic@0 163 signals:
lbajardsilogic@0 164 /** Emitted when user causes the global centre frame to change. */
lbajardsilogic@0 165 void globalCentreFrameChanged(unsigned long frame);
lbajardsilogic@0 166
lbajardsilogic@0 167 /** Emitted when user scrolls a view, but doesn't affect global centre. */
lbajardsilogic@0 168 void viewCentreFrameChanged(View *v, unsigned long frame);
lbajardsilogic@0 169
lbajardsilogic@0 170 /** Emitted when a view zooms. */
lbajardsilogic@0 171 void viewZoomLevelChanged(View *v, unsigned long zoom, bool locked);
lbajardsilogic@0 172
lbajardsilogic@0 173 /** Emitted when the playback frame changes. */
lbajardsilogic@0 174 void playbackFrameChanged(unsigned long frame);
lbajardsilogic@0 175
lbajardsilogic@0 176 /** Emitted when the output levels change. Values in range 0.0 -> 1.0. */
lbajardsilogic@0 177 void outputLevelsChanged(float left, float right);
lbajardsilogic@0 178
lbajardsilogic@0 179 /** Emitted when the selection has changed. */
lbajardsilogic@0 180 void selectionChanged();
lbajardsilogic@0 181
lbajardsilogic@0 182 /** Emitted when the in-progress (rubberbanding) selection has changed. */
lbajardsilogic@0 183 void inProgressSelectionChanged();
lbajardsilogic@0 184
lbajardsilogic@0 185 /** Emitted when the tool mode has been changed. */
lbajardsilogic@0 186 void toolModeChanged();
lbajardsilogic@0 187
lbajardsilogic@0 188 /** Emitted when the play loop mode has been changed. */
lbajardsilogic@0 189 void playLoopModeChanged();
lbajardsilogic@0 190 void playLoopModeChanged(bool);
lbajardsilogic@0 191
lbajardsilogic@0 192 /** Emitted when the play selection mode has been changed. */
lbajardsilogic@0 193 void playSelectionModeChanged();
lbajardsilogic@0 194 void playSelectionModeChanged(bool);
lbajardsilogic@0 195
lbajardsilogic@0 196 /** Emitted when the overlay mode has been changed. */
lbajardsilogic@0 197 void overlayModeChanged();
lbajardsilogic@0 198
lbajardsilogic@0 199 /** Emitted when the zoom wheels have been toggled. */
lbajardsilogic@0 200 void zoomWheelsEnabledChanged();
lbajardsilogic@0 201
lbajardsilogic@0 202 public slots:
lbajardsilogic@0 203 void viewCentreFrameChanged(unsigned long, bool, PlaybackFollowMode);
lbajardsilogic@0 204 void viewZoomLevelChanged(unsigned long, bool);
lbajardsilogic@0 205
lbajardsilogic@0 206 protected slots:
lbajardsilogic@0 207 void checkPlayStatus();
lbajardsilogic@0 208 void playStatusChanged(bool playing);
lbajardsilogic@0 209 void seek(unsigned long);
lbajardsilogic@0 210 //!!! void considerZoomChange(void *, unsigned long, bool);
lbajardsilogic@0 211
lbajardsilogic@0 212 protected:
lbajardsilogic@0 213 AudioPlaySource *m_playSource;
lbajardsilogic@0 214 unsigned long m_globalCentreFrame;
lbajardsilogic@0 215 unsigned long m_globalZoom;
lbajardsilogic@0 216 mutable unsigned long m_playbackFrame;
lbajardsilogic@0 217 size_t m_mainModelSampleRate;
lbajardsilogic@0 218
lbajardsilogic@0 219 float m_lastLeft;
lbajardsilogic@0 220 float m_lastRight;
lbajardsilogic@0 221
lbajardsilogic@0 222 MultiSelection m_selections;
lbajardsilogic@0 223 Selection m_inProgressSelection;
lbajardsilogic@0 224 bool m_inProgressExclusive;
lbajardsilogic@0 225
lbajardsilogic@0 226 Clipboard m_clipboard;
lbajardsilogic@0 227
lbajardsilogic@0 228 ToolMode m_toolMode;
lbajardsilogic@0 229
lbajardsilogic@0 230 bool m_playLoopMode;
lbajardsilogic@0 231 bool m_playSelectionMode;
lbajardsilogic@0 232
lbajardsilogic@0 233 void setSelections(const MultiSelection &ms);
lbajardsilogic@0 234 void signalSelectionChange();
lbajardsilogic@0 235
lbajardsilogic@0 236 class SetSelectionCommand : public Command
lbajardsilogic@0 237 {
lbajardsilogic@0 238 public:
lbajardsilogic@0 239 SetSelectionCommand(ViewManager *vm, const MultiSelection &ms);
lbajardsilogic@0 240 virtual ~SetSelectionCommand();
lbajardsilogic@0 241 virtual void execute();
lbajardsilogic@0 242 virtual void unexecute();
lbajardsilogic@0 243 virtual QString getName() const;
lbajardsilogic@0 244
lbajardsilogic@0 245 protected:
lbajardsilogic@0 246 ViewManager *m_vm;
lbajardsilogic@0 247 MultiSelection m_oldSelection;
lbajardsilogic@0 248 MultiSelection m_newSelection;
lbajardsilogic@0 249 };
lbajardsilogic@0 250
lbajardsilogic@0 251 OverlayMode m_overlayMode;
lbajardsilogic@0 252 bool m_zoomWheelsEnabled;
lbajardsilogic@0 253 };
lbajardsilogic@0 254
lbajardsilogic@0 255 #endif
lbajardsilogic@0 256