annotate view/ViewManager.h @ 317:e251c3599ea8

* Make RemoteFile far more pervasive, and use it for local files as well so that we can handle both transparently. Make it shallow copy with reference counting, so it can be used by value without having to worry about the cache file lifetime. Use RemoteFile for MainWindow file-open functions, etc
author Chris Cannam
date Thu, 18 Oct 2007 15:31:20 +0000
parents 7b96a3261e1c
children 4f4f38a11cd2
rev   line source
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@292 21 #include <QPalette>
Chris@127 22
Chris@127 23 #include <map>
Chris@127 24
Chris@128 25 #include "base/Selection.h"
Chris@128 26 #include "base/Command.h"
Chris@128 27 #include "base/Clipboard.h"
Chris@127 28
Chris@127 29 class AudioPlaySource;
Chris@127 30 class Model;
Chris@127 31
Chris@211 32 enum PlaybackFollowMode {
Chris@211 33 PlaybackScrollContinuous,
Chris@211 34 PlaybackScrollPage,
Chris@211 35 PlaybackIgnore
Chris@211 36 };
Chris@211 37
Chris@211 38 class View;
Chris@211 39
Chris@127 40 /**
Chris@127 41 * The ViewManager manages properties that may need to be synchronised
Chris@127 42 * between separate Views. For example, it handles signals associated
Chris@127 43 * with changes to the global pan and zoom, and it handles selections.
Chris@127 44 *
Chris@127 45 * Views should be implemented in such a way as to work
Chris@127 46 * correctly whether they are supplied with a ViewManager or not.
Chris@127 47 */
Chris@127 48
Chris@127 49 class ViewManager : public QObject
Chris@127 50 {
Chris@127 51 Q_OBJECT
Chris@127 52
Chris@127 53 public:
Chris@127 54 ViewManager();
Chris@127 55 virtual ~ViewManager();
Chris@127 56
Chris@127 57 void setAudioPlaySource(AudioPlaySource *source);
Chris@127 58
Chris@127 59 bool isPlaying() const;
Chris@127 60
Chris@127 61 unsigned long getGlobalCentreFrame() const;
Chris@180 62 void setGlobalCentreFrame(unsigned long);
Chris@127 63 unsigned long getGlobalZoom() const;
Chris@127 64
Chris@127 65 unsigned long getPlaybackFrame() const;
Chris@127 66 void setPlaybackFrame(unsigned long frame);
Chris@127 67
Chris@301 68 // Only meaningful in solo mode, and used for optional alignment feature
Chris@301 69 Model *getPlaybackModel() const;
Chris@301 70 void setPlaybackModel(Model *);
Chris@301 71
Chris@127 72 bool haveInProgressSelection() const;
Chris@127 73 const Selection &getInProgressSelection(bool &exclusive) const;
Chris@127 74 void setInProgressSelection(const Selection &selection, bool exclusive);
Chris@127 75 void clearInProgressSelection();
Chris@127 76
Chris@127 77 const MultiSelection &getSelection() const;
Chris@127 78
Chris@127 79 const MultiSelection::SelectionList &getSelections() const;
Chris@127 80 void setSelection(const Selection &selection);
Chris@127 81 void addSelection(const Selection &selection);
Chris@127 82 void removeSelection(const Selection &selection);
Chris@127 83 void clearSelections();
Chris@271 84 size_t constrainFrameToSelection(size_t frame) const;
Chris@127 85
Chris@127 86 /**
Chris@127 87 * Return the selection that contains a given frame.
Chris@127 88 * If defaultToFollowing is true, and if the frame is not in a
Chris@127 89 * selected area, return the next selection after the given frame.
Chris@127 90 * Return the empty selection if no appropriate selection is found.
Chris@127 91 */
Chris@127 92 Selection getContainingSelection(size_t frame, bool defaultToFollowing) const;
Chris@127 93
Chris@127 94 Clipboard &getClipboard() { return m_clipboard; }
Chris@127 95
Chris@127 96 enum ToolMode {
Chris@127 97 NavigateMode,
Chris@127 98 SelectMode,
Chris@127 99 EditMode,
Chris@257 100 DrawMode,
Chris@257 101 MeasureMode
Chris@127 102 };
Chris@127 103 ToolMode getToolMode() const { return m_toolMode; }
Chris@127 104 void setToolMode(ToolMode mode);
Chris@127 105
Chris@127 106 bool getPlayLoopMode() const { return m_playLoopMode; }
Chris@127 107 void setPlayLoopMode(bool on);
Chris@127 108
Chris@127 109 bool getPlaySelectionMode() const { return m_playSelectionMode; }
Chris@127 110 void setPlaySelectionMode(bool on);
Chris@127 111
Chris@301 112 bool getPlaySoloMode() const { return m_playSoloMode; }
Chris@301 113 void setPlaySoloMode(bool on);
Chris@301 114
Chris@314 115 bool getAlignMode() const { return m_alignMode; }
Chris@314 116 void setAlignMode(bool on);
Chris@314 117
Chris@224 118 /**
Chris@224 119 * The sample rate that is used for playback. This is usually the
Chris@224 120 * rate of the main model, but not always. Models whose rates
Chris@224 121 * differ from this will play back at the wrong speed -- there is
Chris@224 122 * no per-model resampler.
Chris@224 123 */
Chris@127 124 size_t getPlaybackSampleRate() const;
Chris@224 125
Chris@224 126 /**
Chris@224 127 * The sample rate of the audio output device. If the playback
Chris@224 128 * sample rate differs from this, everything will be resampled at
Chris@224 129 * the output stage.
Chris@224 130 */
Chris@224 131 size_t getOutputSampleRate() const;
Chris@224 132
Chris@224 133 /**
Chris@224 134 * The sample rate of the current main model. This may in theory
Chris@224 135 * differ from the playback sample rate, in which case even the
Chris@224 136 * main model will play at the wrong speed.
Chris@224 137 */
Chris@127 138 size_t getMainModelSampleRate() const { return m_mainModelSampleRate; }
Chris@224 139
Chris@127 140 void setMainModelSampleRate(size_t sr) { m_mainModelSampleRate = sr; }
Chris@127 141
Chris@127 142 enum OverlayMode {
Chris@127 143 NoOverlays,
Chris@189 144 MinimalOverlays,
Chris@189 145 StandardOverlays,
Chris@127 146 AllOverlays
Chris@127 147 };
Chris@127 148 void setOverlayMode(OverlayMode mode);
Chris@127 149 OverlayMode getOverlayMode() const { return m_overlayMode; }
Chris@127 150
Chris@189 151 bool shouldShowCentreLine() const {
Chris@189 152 return m_overlayMode != NoOverlays;
Chris@189 153 }
Chris@189 154 bool shouldShowFrameCount() const {
Chris@189 155 return m_overlayMode != NoOverlays;
Chris@189 156 }
Chris@189 157 bool shouldShowDuration() const {
Chris@189 158 return m_overlayMode > MinimalOverlays;
Chris@189 159 }
Chris@189 160 bool shouldShowVerticalScale() const {
Chris@189 161 return m_overlayMode > MinimalOverlays;
Chris@189 162 }
Chris@189 163 bool shouldShowSelectionExtents() const {
Chris@189 164 return m_overlayMode > MinimalOverlays;
Chris@189 165 }
Chris@189 166 bool shouldShowLayerNames() const {
Chris@189 167 return m_overlayMode == AllOverlays;
Chris@189 168 }
Chris@195 169 bool shouldShowScaleGuides() const {
Chris@195 170 return m_overlayMode != NoOverlays;
Chris@195 171 }
Chris@189 172
Chris@133 173 void setZoomWheelsEnabled(bool enable);
Chris@133 174 bool getZoomWheelsEnabled() const { return m_zoomWheelsEnabled; }
Chris@133 175
Chris@292 176 void setGlobalDarkBackground(bool dark);
Chris@292 177 bool getGlobalDarkBackground() const;
Chris@292 178
Chris@127 179 signals:
Chris@211 180 /** Emitted when user causes the global centre frame to change. */
Chris@211 181 void globalCentreFrameChanged(unsigned long frame);
Chris@127 182
Chris@211 183 /** Emitted when user scrolls a view, but doesn't affect global centre. */
Chris@211 184 void viewCentreFrameChanged(View *v, unsigned long frame);
Chris@211 185
Chris@211 186 /** Emitted when a view zooms. */
Chris@222 187 void viewZoomLevelChanged(View *v, unsigned long zoom, bool locked);
Chris@133 188
Chris@127 189 /** Emitted when the playback frame changes. */
Chris@127 190 void playbackFrameChanged(unsigned long frame);
Chris@127 191
Chris@127 192 /** Emitted when the output levels change. Values in range 0.0 -> 1.0. */
Chris@127 193 void outputLevelsChanged(float left, float right);
Chris@127 194
Chris@127 195 /** Emitted when the selection has changed. */
Chris@127 196 void selectionChanged();
Chris@127 197
Chris@127 198 /** Emitted when the in-progress (rubberbanding) selection has changed. */
Chris@127 199 void inProgressSelectionChanged();
Chris@127 200
Chris@127 201 /** Emitted when the tool mode has been changed. */
Chris@127 202 void toolModeChanged();
Chris@127 203
Chris@127 204 /** Emitted when the play loop mode has been changed. */
Chris@127 205 void playLoopModeChanged();
Chris@177 206 void playLoopModeChanged(bool);
Chris@127 207
Chris@127 208 /** Emitted when the play selection mode has been changed. */
Chris@127 209 void playSelectionModeChanged();
Chris@177 210 void playSelectionModeChanged(bool);
Chris@127 211
Chris@301 212 /** Emitted when the play solo mode has been changed. */
Chris@301 213 void playSoloModeChanged();
Chris@301 214 void playSoloModeChanged(bool);
Chris@301 215
Chris@314 216 /** Emitted when the alignment mode has been changed. */
Chris@314 217 void alignModeChanged();
Chris@314 218 void alignModeChanged(bool);
Chris@314 219
Chris@127 220 /** Emitted when the overlay mode has been changed. */
Chris@127 221 void overlayModeChanged();
Chris@127 222
Chris@133 223 /** Emitted when the zoom wheels have been toggled. */
Chris@133 224 void zoomWheelsEnabledChanged();
Chris@133 225
Chris@211 226 public slots:
Chris@211 227 void viewCentreFrameChanged(unsigned long, bool, PlaybackFollowMode);
Chris@222 228 void viewZoomLevelChanged(unsigned long, bool);
Chris@211 229
Chris@127 230 protected slots:
Chris@127 231 void checkPlayStatus();
Chris@127 232 void playStatusChanged(bool playing);
Chris@211 233 void seek(unsigned long);
Chris@222 234 //!!! void considerZoomChange(void *, unsigned long, bool);
Chris@127 235
Chris@127 236 protected:
Chris@127 237 AudioPlaySource *m_playSource;
Chris@127 238 unsigned long m_globalCentreFrame;
Chris@127 239 unsigned long m_globalZoom;
Chris@127 240 mutable unsigned long m_playbackFrame;
Chris@301 241 Model *m_playbackModel; //!!!
Chris@127 242 size_t m_mainModelSampleRate;
Chris@127 243
Chris@127 244 float m_lastLeft;
Chris@127 245 float m_lastRight;
Chris@127 246
Chris@127 247 MultiSelection m_selections;
Chris@127 248 Selection m_inProgressSelection;
Chris@127 249 bool m_inProgressExclusive;
Chris@127 250
Chris@127 251 Clipboard m_clipboard;
Chris@127 252
Chris@127 253 ToolMode m_toolMode;
Chris@127 254
Chris@127 255 bool m_playLoopMode;
Chris@127 256 bool m_playSelectionMode;
Chris@301 257 bool m_playSoloMode;
Chris@314 258 bool m_alignMode;
Chris@127 259
Chris@127 260 void setSelections(const MultiSelection &ms);
Chris@127 261 void signalSelectionChange();
Chris@127 262
Chris@127 263 class SetSelectionCommand : public Command
Chris@127 264 {
Chris@127 265 public:
Chris@127 266 SetSelectionCommand(ViewManager *vm, const MultiSelection &ms);
Chris@127 267 virtual ~SetSelectionCommand();
Chris@127 268 virtual void execute();
Chris@127 269 virtual void unexecute();
Chris@127 270 virtual QString getName() const;
Chris@127 271
Chris@127 272 protected:
Chris@127 273 ViewManager *m_vm;
Chris@127 274 MultiSelection m_oldSelection;
Chris@127 275 MultiSelection m_newSelection;
Chris@127 276 };
Chris@127 277
Chris@127 278 OverlayMode m_overlayMode;
Chris@133 279 bool m_zoomWheelsEnabled;
Chris@292 280
Chris@292 281 QPalette m_lightPalette;
Chris@292 282 QPalette m_darkPalette;
Chris@127 283 };
Chris@127 284
Chris@127 285 #endif
Chris@127 286