annotate view/ViewManager.h @ 378:22b72f0f6a4e

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