annotate view/ViewManager.h @ 738:d26545a2a02d tonioni

Rather than undrawing the bottom bit of the dial, don't draw it in the first place (necessary on shaded background)
author Chris Cannam
date Thu, 06 Mar 2014 13:52:33 +0000
parents f831ca41d4a5
children 56ba2b03508e
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@394 62 unsigned long getGlobalCentreFrame() const; // the set method is a slot
Chris@127 63 unsigned long getGlobalZoom() const;
Chris@127 64
Chris@394 65 unsigned long getPlaybackFrame() const; // the set method is a slot
Chris@127 66
Chris@301 67 // Only meaningful in solo mode, and used for optional alignment feature
Chris@301 68 Model *getPlaybackModel() const;
Chris@301 69 void setPlaybackModel(Model *);
Chris@301 70
Chris@333 71 size_t alignPlaybackFrameToReference(size_t) const;
Chris@333 72 size_t alignReferenceToPlaybackFrame(size_t) const;
Chris@333 73
Chris@127 74 bool haveInProgressSelection() const;
Chris@127 75 const Selection &getInProgressSelection(bool &exclusive) const;
Chris@127 76 void setInProgressSelection(const Selection &selection, bool exclusive);
Chris@127 77 void clearInProgressSelection();
Chris@127 78
Chris@127 79 const MultiSelection &getSelection() const;
Chris@127 80
Chris@127 81 const MultiSelection::SelectionList &getSelections() const;
Chris@127 82 void setSelection(const Selection &selection);
Chris@127 83 void addSelection(const Selection &selection);
Chris@127 84 void removeSelection(const Selection &selection);
Chris@127 85 void clearSelections();
Chris@271 86 size_t constrainFrameToSelection(size_t frame) const;
Chris@127 87
Chris@127 88 /**
Chris@127 89 * Return the selection that contains a given frame.
Chris@127 90 * If defaultToFollowing is true, and if the frame is not in a
Chris@127 91 * selected area, return the next selection after the given frame.
Chris@127 92 * Return the empty selection if no appropriate selection is found.
Chris@127 93 */
Chris@127 94 Selection getContainingSelection(size_t frame, bool defaultToFollowing) const;
Chris@127 95
Chris@127 96 Clipboard &getClipboard() { return m_clipboard; }
Chris@127 97
Chris@127 98 enum ToolMode {
Chris@127 99 NavigateMode,
Chris@127 100 SelectMode,
Chris@711 101 EditMode,
Chris@257 102 DrawMode,
Chris@335 103 EraseMode,
gyorgyf@645 104 MeasureMode,
gyorgyf@645 105 NoteEditMode //GF: Tonioni: this tool mode will be context sensitive.
Chris@127 106 };
Chris@127 107 ToolMode getToolMode() const { return m_toolMode; }
Chris@127 108 void setToolMode(ToolMode mode);
Chris@127 109
Chris@711 110 /// Override the tool mode for a specific view
Chris@711 111 void setToolModeFor(const View *v, ToolMode mode);
Chris@711 112 /// Return override mode if it exists for this view or global mode otherwise
Chris@711 113 ToolMode getToolModeFor(const View *v) const;
Chris@711 114 /// Clear all current view-specific overrides
Chris@711 115 void clearToolModeOverrides();
Chris@711 116
Chris@127 117 bool getPlayLoopMode() const { return m_playLoopMode; }
Chris@127 118 void setPlayLoopMode(bool on);
Chris@127 119
Chris@127 120 bool getPlaySelectionMode() const { return m_playSelectionMode; }
Chris@127 121 void setPlaySelectionMode(bool on);
Chris@127 122
Chris@301 123 bool getPlaySoloMode() const { return m_playSoloMode; }
Chris@301 124 void setPlaySoloMode(bool on);
Chris@301 125
Chris@314 126 bool getAlignMode() const { return m_alignMode; }
Chris@314 127 void setAlignMode(bool on);
Chris@314 128
Chris@326 129 void setIlluminateLocalFeatures(bool i) { m_illuminateLocalFeatures = i; }
Chris@326 130 void setShowWorkTitle(bool show) { m_showWorkTitle = show; }
Chris@326 131
Chris@224 132 /**
Chris@224 133 * The sample rate that is used for playback. This is usually the
Chris@224 134 * rate of the main model, but not always. Models whose rates
Chris@224 135 * differ from this will play back at the wrong speed -- there is
Chris@224 136 * no per-model resampler.
Chris@224 137 */
Chris@127 138 size_t getPlaybackSampleRate() const;
Chris@224 139
Chris@224 140 /**
Chris@224 141 * The sample rate of the audio output device. If the playback
Chris@224 142 * sample rate differs from this, everything will be resampled at
Chris@224 143 * the output stage.
Chris@224 144 */
Chris@224 145 size_t getOutputSampleRate() const;
Chris@224 146
Chris@224 147 /**
Chris@224 148 * The sample rate of the current main model. This may in theory
Chris@224 149 * differ from the playback sample rate, in which case even the
Chris@224 150 * main model will play at the wrong speed.
Chris@224 151 */
Chris@127 152 size_t getMainModelSampleRate() const { return m_mainModelSampleRate; }
Chris@224 153
Chris@127 154 void setMainModelSampleRate(size_t sr) { m_mainModelSampleRate = sr; }
Chris@127 155
Chris@127 156 enum OverlayMode {
Chris@127 157 NoOverlays,
Chris@189 158 MinimalOverlays,
Chris@127 159 AllOverlays
Chris@127 160 };
Chris@127 161 void setOverlayMode(OverlayMode mode);
Chris@127 162 OverlayMode getOverlayMode() const { return m_overlayMode; }
Chris@127 163
Chris@607 164 void setShowCentreLine(bool show);
Chris@607 165 bool shouldShowCentreLine() const { return m_showCentreLine; }
Chris@607 166
Chris@607 167 bool shouldShowDuration() const {
Chris@189 168 return m_overlayMode != NoOverlays;
Chris@189 169 }
Chris@189 170 bool shouldShowFrameCount() const {
Chris@607 171 return m_showCentreLine && shouldShowDuration();
Chris@607 172 }
Chris@607 173 bool shouldShowVerticalScale() const {
Chris@189 174 return m_overlayMode != NoOverlays;
Chris@189 175 }
Chris@607 176 bool shouldShowVerticalColourScale() const {
Chris@607 177 return m_overlayMode == AllOverlays;
Chris@189 178 }
Chris@189 179 bool shouldShowSelectionExtents() const {
Chris@607 180 return m_overlayMode != NoOverlays;
Chris@189 181 }
Chris@189 182 bool shouldShowLayerNames() const {
Chris@189 183 return m_overlayMode == AllOverlays;
Chris@189 184 }
Chris@195 185 bool shouldShowScaleGuides() const {
Chris@195 186 return m_overlayMode != NoOverlays;
Chris@195 187 }
Chris@326 188 bool shouldShowWorkTitle() const {
Chris@326 189 return m_showWorkTitle;
Chris@326 190 }
Chris@326 191 bool shouldIlluminateLocalFeatures() const {
Chris@326 192 return m_illuminateLocalFeatures;
Chris@326 193 }
Chris@189 194
Chris@133 195 void setZoomWheelsEnabled(bool enable);
Chris@133 196 bool getZoomWheelsEnabled() const { return m_zoomWheelsEnabled; }
Chris@133 197
Chris@292 198 void setGlobalDarkBackground(bool dark);
Chris@292 199 bool getGlobalDarkBackground() const;
Chris@292 200
Chris@127 201 signals:
Chris@211 202 /** Emitted when user causes the global centre frame to change. */
Chris@211 203 void globalCentreFrameChanged(unsigned long frame);
Chris@127 204
Chris@211 205 /** Emitted when user scrolls a view, but doesn't affect global centre. */
Chris@211 206 void viewCentreFrameChanged(View *v, unsigned long frame);
Chris@211 207
Chris@211 208 /** Emitted when a view zooms. */
Chris@222 209 void viewZoomLevelChanged(View *v, unsigned long zoom, bool locked);
Chris@133 210
Chris@127 211 /** Emitted when the playback frame changes. */
Chris@127 212 void playbackFrameChanged(unsigned long frame);
Chris@127 213
Chris@127 214 /** Emitted when the output levels change. Values in range 0.0 -> 1.0. */
Chris@127 215 void outputLevelsChanged(float left, float right);
Chris@127 216
Chris@731 217 /** Emitted whenever the selection has changed. */
Chris@127 218 void selectionChanged();
Chris@127 219
Chris@731 220 /** Emitted when the selection has been changed through an
Chris@731 221 * explicit selection-editing action. *Not* emitted when the
Chris@731 222 * selection has been changed through undo or redo. */
Chris@731 223 void selectionChangedByUser();
Chris@731 224
Chris@127 225 /** Emitted when the in-progress (rubberbanding) selection has changed. */
Chris@127 226 void inProgressSelectionChanged();
Chris@127 227
Chris@127 228 /** Emitted when the tool mode has been changed. */
Chris@127 229 void toolModeChanged();
Chris@127 230
Chris@127 231 /** Emitted when the play loop mode has been changed. */
Chris@127 232 void playLoopModeChanged();
Chris@177 233 void playLoopModeChanged(bool);
Chris@127 234
Chris@127 235 /** Emitted when the play selection mode has been changed. */
Chris@127 236 void playSelectionModeChanged();
Chris@177 237 void playSelectionModeChanged(bool);
Chris@127 238
Chris@301 239 /** Emitted when the play solo mode has been changed. */
Chris@301 240 void playSoloModeChanged();
Chris@301 241 void playSoloModeChanged(bool);
Chris@301 242
Chris@314 243 /** Emitted when the alignment mode has been changed. */
Chris@314 244 void alignModeChanged();
Chris@314 245 void alignModeChanged(bool);
Chris@314 246
Chris@127 247 /** Emitted when the overlay mode has been changed. */
Chris@127 248 void overlayModeChanged();
Chris@127 249
Chris@607 250 /** Emitted when the centre line visibility has been changed. */
Chris@607 251 void showCentreLineChanged();
Chris@607 252
Chris@133 253 /** Emitted when the zoom wheels have been toggled. */
Chris@133 254 void zoomWheelsEnabledChanged();
Chris@133 255
Chris@502 256 /** Emitted when any loggable activity has occurred. */
Chris@502 257 void activity(QString);
Chris@502 258
Chris@211 259 public slots:
Chris@211 260 void viewCentreFrameChanged(unsigned long, bool, PlaybackFollowMode);
Chris@222 261 void viewZoomLevelChanged(unsigned long, bool);
Chris@394 262 void setGlobalCentreFrame(unsigned long);
Chris@394 263 void setPlaybackFrame(unsigned long);
Chris@689 264 void playStatusChanged(bool playing);
Chris@211 265
Chris@127 266 protected slots:
Chris@127 267 void checkPlayStatus();
Chris@211 268 void seek(unsigned long);
Chris@222 269 //!!! void considerZoomChange(void *, unsigned long, bool);
Chris@127 270
Chris@127 271 protected:
Chris@127 272 AudioPlaySource *m_playSource;
Chris@127 273 unsigned long m_globalCentreFrame;
Chris@127 274 unsigned long m_globalZoom;
Chris@127 275 mutable unsigned long m_playbackFrame;
Chris@301 276 Model *m_playbackModel; //!!!
Chris@127 277 size_t m_mainModelSampleRate;
Chris@127 278
Chris@127 279 float m_lastLeft;
Chris@127 280 float m_lastRight;
Chris@127 281
Chris@127 282 MultiSelection m_selections;
Chris@127 283 Selection m_inProgressSelection;
Chris@127 284 bool m_inProgressExclusive;
Chris@127 285
Chris@127 286 Clipboard m_clipboard;
Chris@127 287
Chris@127 288 ToolMode m_toolMode;
Chris@711 289 std::map<const View *, ToolMode> m_toolModeOverrides;
Chris@127 290
Chris@127 291 bool m_playLoopMode;
Chris@127 292 bool m_playSelectionMode;
Chris@301 293 bool m_playSoloMode;
Chris@314 294 bool m_alignMode;
Chris@127 295
Chris@127 296 void setSelections(const MultiSelection &ms);
Chris@127 297 void signalSelectionChange();
Chris@127 298
Chris@127 299 class SetSelectionCommand : public Command
Chris@127 300 {
Chris@127 301 public:
Chris@127 302 SetSelectionCommand(ViewManager *vm, const MultiSelection &ms);
Chris@127 303 virtual ~SetSelectionCommand();
Chris@127 304 virtual void execute();
Chris@127 305 virtual void unexecute();
Chris@127 306 virtual QString getName() const;
Chris@127 307
Chris@127 308 protected:
Chris@127 309 ViewManager *m_vm;
Chris@127 310 MultiSelection m_oldSelection;
Chris@127 311 MultiSelection m_newSelection;
Chris@127 312 };
Chris@127 313
Chris@127 314 OverlayMode m_overlayMode;
Chris@133 315 bool m_zoomWheelsEnabled;
Chris@607 316 bool m_showCentreLine;
Chris@326 317 bool m_illuminateLocalFeatures;
Chris@326 318 bool m_showWorkTitle;
Chris@292 319
Chris@292 320 QPalette m_lightPalette;
Chris@292 321 QPalette m_darkPalette;
Chris@127 322 };
Chris@127 323
Chris@127 324 #endif
Chris@127 325