annotate view/ViewManager.h @ 312:6de6f78b13a1

* Make it possible to drop audio files, layer files, session files and images onto SV panes. Need to do a bit more work on where we expect the dropped file to go, particularly in the case of audio files -- at the moment they're always opened in new panes, but it may be better to by default replace whatever is in the target pane.
author Chris Cannam
date Wed, 10 Oct 2007 15:18:02 +0000
parents 5636eeacc467
children 7b96a3261e1c
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@224 115 /**
Chris@224 116 * The sample rate that is used for playback. This is usually the
Chris@224 117 * rate of the main model, but not always. Models whose rates
Chris@224 118 * differ from this will play back at the wrong speed -- there is
Chris@224 119 * no per-model resampler.
Chris@224 120 */
Chris@127 121 size_t getPlaybackSampleRate() const;
Chris@224 122
Chris@224 123 /**
Chris@224 124 * The sample rate of the audio output device. If the playback
Chris@224 125 * sample rate differs from this, everything will be resampled at
Chris@224 126 * the output stage.
Chris@224 127 */
Chris@224 128 size_t getOutputSampleRate() const;
Chris@224 129
Chris@224 130 /**
Chris@224 131 * The sample rate of the current main model. This may in theory
Chris@224 132 * differ from the playback sample rate, in which case even the
Chris@224 133 * main model will play at the wrong speed.
Chris@224 134 */
Chris@127 135 size_t getMainModelSampleRate() const { return m_mainModelSampleRate; }
Chris@224 136
Chris@127 137 void setMainModelSampleRate(size_t sr) { m_mainModelSampleRate = sr; }
Chris@127 138
Chris@127 139 enum OverlayMode {
Chris@127 140 NoOverlays,
Chris@189 141 MinimalOverlays,
Chris@189 142 StandardOverlays,
Chris@127 143 AllOverlays
Chris@127 144 };
Chris@127 145 void setOverlayMode(OverlayMode mode);
Chris@127 146 OverlayMode getOverlayMode() const { return m_overlayMode; }
Chris@127 147
Chris@189 148 bool shouldShowCentreLine() const {
Chris@189 149 return m_overlayMode != NoOverlays;
Chris@189 150 }
Chris@189 151 bool shouldShowFrameCount() const {
Chris@189 152 return m_overlayMode != NoOverlays;
Chris@189 153 }
Chris@189 154 bool shouldShowDuration() const {
Chris@189 155 return m_overlayMode > MinimalOverlays;
Chris@189 156 }
Chris@189 157 bool shouldShowVerticalScale() const {
Chris@189 158 return m_overlayMode > MinimalOverlays;
Chris@189 159 }
Chris@189 160 bool shouldShowSelectionExtents() const {
Chris@189 161 return m_overlayMode > MinimalOverlays;
Chris@189 162 }
Chris@189 163 bool shouldShowLayerNames() const {
Chris@189 164 return m_overlayMode == AllOverlays;
Chris@189 165 }
Chris@195 166 bool shouldShowScaleGuides() const {
Chris@195 167 return m_overlayMode != NoOverlays;
Chris@195 168 }
Chris@189 169
Chris@133 170 void setZoomWheelsEnabled(bool enable);
Chris@133 171 bool getZoomWheelsEnabled() const { return m_zoomWheelsEnabled; }
Chris@133 172
Chris@292 173 void setGlobalDarkBackground(bool dark);
Chris@292 174 bool getGlobalDarkBackground() const;
Chris@292 175
Chris@127 176 signals:
Chris@211 177 /** Emitted when user causes the global centre frame to change. */
Chris@211 178 void globalCentreFrameChanged(unsigned long frame);
Chris@127 179
Chris@211 180 /** Emitted when user scrolls a view, but doesn't affect global centre. */
Chris@211 181 void viewCentreFrameChanged(View *v, unsigned long frame);
Chris@211 182
Chris@211 183 /** Emitted when a view zooms. */
Chris@222 184 void viewZoomLevelChanged(View *v, unsigned long zoom, bool locked);
Chris@133 185
Chris@127 186 /** Emitted when the playback frame changes. */
Chris@127 187 void playbackFrameChanged(unsigned long frame);
Chris@127 188
Chris@127 189 /** Emitted when the output levels change. Values in range 0.0 -> 1.0. */
Chris@127 190 void outputLevelsChanged(float left, float right);
Chris@127 191
Chris@127 192 /** Emitted when the selection has changed. */
Chris@127 193 void selectionChanged();
Chris@127 194
Chris@127 195 /** Emitted when the in-progress (rubberbanding) selection has changed. */
Chris@127 196 void inProgressSelectionChanged();
Chris@127 197
Chris@127 198 /** Emitted when the tool mode has been changed. */
Chris@127 199 void toolModeChanged();
Chris@127 200
Chris@127 201 /** Emitted when the play loop mode has been changed. */
Chris@127 202 void playLoopModeChanged();
Chris@177 203 void playLoopModeChanged(bool);
Chris@127 204
Chris@127 205 /** Emitted when the play selection mode has been changed. */
Chris@127 206 void playSelectionModeChanged();
Chris@177 207 void playSelectionModeChanged(bool);
Chris@127 208
Chris@301 209 /** Emitted when the play solo mode has been changed. */
Chris@301 210 void playSoloModeChanged();
Chris@301 211 void playSoloModeChanged(bool);
Chris@301 212
Chris@127 213 /** Emitted when the overlay mode has been changed. */
Chris@127 214 void overlayModeChanged();
Chris@127 215
Chris@133 216 /** Emitted when the zoom wheels have been toggled. */
Chris@133 217 void zoomWheelsEnabledChanged();
Chris@133 218
Chris@211 219 public slots:
Chris@211 220 void viewCentreFrameChanged(unsigned long, bool, PlaybackFollowMode);
Chris@222 221 void viewZoomLevelChanged(unsigned long, bool);
Chris@211 222
Chris@127 223 protected slots:
Chris@127 224 void checkPlayStatus();
Chris@127 225 void playStatusChanged(bool playing);
Chris@211 226 void seek(unsigned long);
Chris@222 227 //!!! void considerZoomChange(void *, unsigned long, bool);
Chris@127 228
Chris@127 229 protected:
Chris@127 230 AudioPlaySource *m_playSource;
Chris@127 231 unsigned long m_globalCentreFrame;
Chris@127 232 unsigned long m_globalZoom;
Chris@127 233 mutable unsigned long m_playbackFrame;
Chris@301 234 Model *m_playbackModel; //!!!
Chris@127 235 size_t m_mainModelSampleRate;
Chris@127 236
Chris@127 237 float m_lastLeft;
Chris@127 238 float m_lastRight;
Chris@127 239
Chris@127 240 MultiSelection m_selections;
Chris@127 241 Selection m_inProgressSelection;
Chris@127 242 bool m_inProgressExclusive;
Chris@127 243
Chris@127 244 Clipboard m_clipboard;
Chris@127 245
Chris@127 246 ToolMode m_toolMode;
Chris@127 247
Chris@127 248 bool m_playLoopMode;
Chris@127 249 bool m_playSelectionMode;
Chris@301 250 bool m_playSoloMode;
Chris@127 251
Chris@127 252 void setSelections(const MultiSelection &ms);
Chris@127 253 void signalSelectionChange();
Chris@127 254
Chris@127 255 class SetSelectionCommand : public Command
Chris@127 256 {
Chris@127 257 public:
Chris@127 258 SetSelectionCommand(ViewManager *vm, const MultiSelection &ms);
Chris@127 259 virtual ~SetSelectionCommand();
Chris@127 260 virtual void execute();
Chris@127 261 virtual void unexecute();
Chris@127 262 virtual QString getName() const;
Chris@127 263
Chris@127 264 protected:
Chris@127 265 ViewManager *m_vm;
Chris@127 266 MultiSelection m_oldSelection;
Chris@127 267 MultiSelection m_newSelection;
Chris@127 268 };
Chris@127 269
Chris@127 270 OverlayMode m_overlayMode;
Chris@133 271 bool m_zoomWheelsEnabled;
Chris@292 272
Chris@292 273 QPalette m_lightPalette;
Chris@292 274 QPalette m_darkPalette;
Chris@127 275 };
Chris@127 276
Chris@127 277 #endif
Chris@127 278