annotate view/ViewManager.h @ 299:5c59c433b358

* Show colour swatch next to layer name in pane (if available) * Fix for incorrect layer name prefix handling (was making some layers appear to have the same model name in cases where the model names differed by the final character only)
author Chris Cannam
date Wed, 05 Sep 2007 15:17:15 +0000
parents 24fc90078754
children 5636eeacc467
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@127 68 bool haveInProgressSelection() const;
Chris@127 69 const Selection &getInProgressSelection(bool &exclusive) const;
Chris@127 70 void setInProgressSelection(const Selection &selection, bool exclusive);
Chris@127 71 void clearInProgressSelection();
Chris@127 72
Chris@127 73 const MultiSelection &getSelection() const;
Chris@127 74
Chris@127 75 const MultiSelection::SelectionList &getSelections() const;
Chris@127 76 void setSelection(const Selection &selection);
Chris@127 77 void addSelection(const Selection &selection);
Chris@127 78 void removeSelection(const Selection &selection);
Chris@127 79 void clearSelections();
Chris@271 80 size_t constrainFrameToSelection(size_t frame) const;
Chris@127 81
Chris@127 82 /**
Chris@127 83 * Return the selection that contains a given frame.
Chris@127 84 * If defaultToFollowing is true, and if the frame is not in a
Chris@127 85 * selected area, return the next selection after the given frame.
Chris@127 86 * Return the empty selection if no appropriate selection is found.
Chris@127 87 */
Chris@127 88 Selection getContainingSelection(size_t frame, bool defaultToFollowing) const;
Chris@127 89
Chris@127 90 Clipboard &getClipboard() { return m_clipboard; }
Chris@127 91
Chris@127 92 enum ToolMode {
Chris@127 93 NavigateMode,
Chris@127 94 SelectMode,
Chris@127 95 EditMode,
Chris@257 96 DrawMode,
Chris@257 97 MeasureMode
Chris@127 98 };
Chris@127 99 ToolMode getToolMode() const { return m_toolMode; }
Chris@127 100 void setToolMode(ToolMode mode);
Chris@127 101
Chris@127 102 bool getPlayLoopMode() const { return m_playLoopMode; }
Chris@127 103 void setPlayLoopMode(bool on);
Chris@127 104
Chris@127 105 bool getPlaySelectionMode() const { return m_playSelectionMode; }
Chris@127 106 void setPlaySelectionMode(bool on);
Chris@127 107
Chris@224 108 /**
Chris@224 109 * The sample rate that is used for playback. This is usually the
Chris@224 110 * rate of the main model, but not always. Models whose rates
Chris@224 111 * differ from this will play back at the wrong speed -- there is
Chris@224 112 * no per-model resampler.
Chris@224 113 */
Chris@127 114 size_t getPlaybackSampleRate() const;
Chris@224 115
Chris@224 116 /**
Chris@224 117 * The sample rate of the audio output device. If the playback
Chris@224 118 * sample rate differs from this, everything will be resampled at
Chris@224 119 * the output stage.
Chris@224 120 */
Chris@224 121 size_t getOutputSampleRate() const;
Chris@224 122
Chris@224 123 /**
Chris@224 124 * The sample rate of the current main model. This may in theory
Chris@224 125 * differ from the playback sample rate, in which case even the
Chris@224 126 * main model will play at the wrong speed.
Chris@224 127 */
Chris@127 128 size_t getMainModelSampleRate() const { return m_mainModelSampleRate; }
Chris@224 129
Chris@127 130 void setMainModelSampleRate(size_t sr) { m_mainModelSampleRate = sr; }
Chris@127 131
Chris@127 132 enum OverlayMode {
Chris@127 133 NoOverlays,
Chris@189 134 MinimalOverlays,
Chris@189 135 StandardOverlays,
Chris@127 136 AllOverlays
Chris@127 137 };
Chris@127 138 void setOverlayMode(OverlayMode mode);
Chris@127 139 OverlayMode getOverlayMode() const { return m_overlayMode; }
Chris@127 140
Chris@189 141 bool shouldShowCentreLine() const {
Chris@189 142 return m_overlayMode != NoOverlays;
Chris@189 143 }
Chris@189 144 bool shouldShowFrameCount() const {
Chris@189 145 return m_overlayMode != NoOverlays;
Chris@189 146 }
Chris@189 147 bool shouldShowDuration() const {
Chris@189 148 return m_overlayMode > MinimalOverlays;
Chris@189 149 }
Chris@189 150 bool shouldShowVerticalScale() const {
Chris@189 151 return m_overlayMode > MinimalOverlays;
Chris@189 152 }
Chris@189 153 bool shouldShowSelectionExtents() const {
Chris@189 154 return m_overlayMode > MinimalOverlays;
Chris@189 155 }
Chris@189 156 bool shouldShowLayerNames() const {
Chris@189 157 return m_overlayMode == AllOverlays;
Chris@189 158 }
Chris@195 159 bool shouldShowScaleGuides() const {
Chris@195 160 return m_overlayMode != NoOverlays;
Chris@195 161 }
Chris@189 162
Chris@133 163 void setZoomWheelsEnabled(bool enable);
Chris@133 164 bool getZoomWheelsEnabled() const { return m_zoomWheelsEnabled; }
Chris@133 165
Chris@292 166 void setGlobalDarkBackground(bool dark);
Chris@292 167 bool getGlobalDarkBackground() const;
Chris@292 168
Chris@127 169 signals:
Chris@211 170 /** Emitted when user causes the global centre frame to change. */
Chris@211 171 void globalCentreFrameChanged(unsigned long frame);
Chris@127 172
Chris@211 173 /** Emitted when user scrolls a view, but doesn't affect global centre. */
Chris@211 174 void viewCentreFrameChanged(View *v, unsigned long frame);
Chris@211 175
Chris@211 176 /** Emitted when a view zooms. */
Chris@222 177 void viewZoomLevelChanged(View *v, unsigned long zoom, bool locked);
Chris@133 178
Chris@127 179 /** Emitted when the playback frame changes. */
Chris@127 180 void playbackFrameChanged(unsigned long frame);
Chris@127 181
Chris@127 182 /** Emitted when the output levels change. Values in range 0.0 -> 1.0. */
Chris@127 183 void outputLevelsChanged(float left, float right);
Chris@127 184
Chris@127 185 /** Emitted when the selection has changed. */
Chris@127 186 void selectionChanged();
Chris@127 187
Chris@127 188 /** Emitted when the in-progress (rubberbanding) selection has changed. */
Chris@127 189 void inProgressSelectionChanged();
Chris@127 190
Chris@127 191 /** Emitted when the tool mode has been changed. */
Chris@127 192 void toolModeChanged();
Chris@127 193
Chris@127 194 /** Emitted when the play loop mode has been changed. */
Chris@127 195 void playLoopModeChanged();
Chris@177 196 void playLoopModeChanged(bool);
Chris@127 197
Chris@127 198 /** Emitted when the play selection mode has been changed. */
Chris@127 199 void playSelectionModeChanged();
Chris@177 200 void playSelectionModeChanged(bool);
Chris@127 201
Chris@127 202 /** Emitted when the overlay mode has been changed. */
Chris@127 203 void overlayModeChanged();
Chris@127 204
Chris@133 205 /** Emitted when the zoom wheels have been toggled. */
Chris@133 206 void zoomWheelsEnabledChanged();
Chris@133 207
Chris@211 208 public slots:
Chris@211 209 void viewCentreFrameChanged(unsigned long, bool, PlaybackFollowMode);
Chris@222 210 void viewZoomLevelChanged(unsigned long, bool);
Chris@211 211
Chris@127 212 protected slots:
Chris@127 213 void checkPlayStatus();
Chris@127 214 void playStatusChanged(bool playing);
Chris@211 215 void seek(unsigned long);
Chris@222 216 //!!! void considerZoomChange(void *, unsigned long, bool);
Chris@127 217
Chris@127 218 protected:
Chris@127 219 AudioPlaySource *m_playSource;
Chris@127 220 unsigned long m_globalCentreFrame;
Chris@127 221 unsigned long m_globalZoom;
Chris@127 222 mutable unsigned long m_playbackFrame;
Chris@127 223 size_t m_mainModelSampleRate;
Chris@127 224
Chris@127 225 float m_lastLeft;
Chris@127 226 float m_lastRight;
Chris@127 227
Chris@127 228 MultiSelection m_selections;
Chris@127 229 Selection m_inProgressSelection;
Chris@127 230 bool m_inProgressExclusive;
Chris@127 231
Chris@127 232 Clipboard m_clipboard;
Chris@127 233
Chris@127 234 ToolMode m_toolMode;
Chris@127 235
Chris@127 236 bool m_playLoopMode;
Chris@127 237 bool m_playSelectionMode;
Chris@127 238
Chris@127 239 void setSelections(const MultiSelection &ms);
Chris@127 240 void signalSelectionChange();
Chris@127 241
Chris@127 242 class SetSelectionCommand : public Command
Chris@127 243 {
Chris@127 244 public:
Chris@127 245 SetSelectionCommand(ViewManager *vm, const MultiSelection &ms);
Chris@127 246 virtual ~SetSelectionCommand();
Chris@127 247 virtual void execute();
Chris@127 248 virtual void unexecute();
Chris@127 249 virtual QString getName() const;
Chris@127 250
Chris@127 251 protected:
Chris@127 252 ViewManager *m_vm;
Chris@127 253 MultiSelection m_oldSelection;
Chris@127 254 MultiSelection m_newSelection;
Chris@127 255 };
Chris@127 256
Chris@127 257 OverlayMode m_overlayMode;
Chris@133 258 bool m_zoomWheelsEnabled;
Chris@292 259
Chris@292 260 QPalette m_lightPalette;
Chris@292 261 QPalette m_darkPalette;
Chris@127 262 };
Chris@127 263
Chris@127 264 #endif
Chris@127 265