annotate framework/MainWindowBase.h @ 256:f3f9e3d647c1

Give a dedicated key to toggling the centre line, and move it out of the overlay level setting -- reducing number of overlay levels to 3. Introduce two distinct vertical scale types (so that we can hide the spectrogram colour scale part easily)
author Chris Cannam
date Mon, 30 Jan 2012 16:02:14 +0000
parents c469f8d8208e
children 7ee215c095dd
rev   line source
Chris@45 1 /* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
Chris@45 2
Chris@45 3 /*
Chris@45 4 Sonic Visualiser
Chris@45 5 An audio file viewer and annotation editor.
Chris@45 6 Centre for Digital Music, Queen Mary, University of London.
Chris@45 7 This file copyright 2006-2007 Chris Cannam and QMUL.
Chris@45 8
Chris@45 9 This program is free software; you can redistribute it and/or
Chris@45 10 modify it under the terms of the GNU General Public License as
Chris@45 11 published by the Free Software Foundation; either version 2 of the
Chris@45 12 License, or (at your option) any later version. See the file
Chris@45 13 COPYING included with this distribution for more information.
Chris@45 14 */
Chris@45 15
Chris@45 16 #ifndef _MAIN_WINDOW_BASE_H_
Chris@45 17 #define _MAIN_WINDOW_BASE_H_
Chris@45 18
Chris@45 19 #include <QFrame>
Chris@45 20 #include <QString>
Chris@45 21 #include <QUrl>
Chris@45 22 #include <QMainWindow>
Chris@45 23 #include <QPointer>
Chris@113 24 #include <QThread>
Chris@45 25
Chris@45 26 #include "base/Command.h"
Chris@45 27 #include "view/ViewManager.h"
Chris@45 28 #include "base/PropertyContainer.h"
Chris@45 29 #include "base/RecentFiles.h"
Chris@161 30 #include "base/FrameTimer.h"
Chris@45 31 #include "layer/LayerFactory.h"
Chris@106 32 #include "transform/Transform.h"
Chris@46 33 #include "SVFileReader.h"
Chris@170 34 #include "data/fileio/FileFinder.h"
Chris@45 35 #include "data/fileio/FileSource.h"
Chris@113 36 #include "data/osc/OSCQueue.h"
Chris@45 37 #include <map>
Chris@45 38
Chris@45 39 class Document;
Chris@45 40 class PaneStack;
Chris@45 41 class Pane;
Chris@45 42 class View;
Chris@45 43 class Fader;
Chris@45 44 class Overview;
Chris@45 45 class Layer;
Chris@45 46 class WaveformLayer;
Chris@45 47 class WaveFileModel;
Chris@45 48 class AudioCallbackPlaySource;
Chris@45 49 class AudioCallbackPlayTarget;
Chris@45 50 class CommandHistory;
Chris@45 51 class QMenu;
Chris@45 52 class AudioDial;
Chris@45 53 class QLabel;
Chris@45 54 class QCheckBox;
Chris@45 55 class PreferencesDialog;
Chris@45 56 class QTreeView;
Chris@45 57 class QPushButton;
Chris@45 58 class OSCMessage;
Chris@157 59 class MIDIInput;
Chris@45 60 class KeyReference;
Chris@45 61 class Labeller;
Chris@123 62 class ModelDataTableDialog;
Chris@45 63
Chris@45 64 /**
Chris@45 65 * The base class for the SV main window. This includes everything to
Chris@45 66 * do with general document and pane stack management, but nothing
Chris@45 67 * that involves user interaction -- this doesn't create the widget or
Chris@45 68 * menu structures or editing tools, and if a function needs to open a
Chris@45 69 * dialog, it shouldn't be in here. This permits "variations on SV"
Chris@45 70 * to use different subclasses retaining the same general structure.
Chris@45 71 */
Chris@45 72
Chris@161 73 class MainWindowBase : public QMainWindow, public FrameTimer
Chris@45 74 {
Chris@45 75 Q_OBJECT
Chris@45 76
Chris@45 77 public:
Chris@161 78 MainWindowBase(bool withAudioOutput, bool withOSCSupport, bool withMIDIInput);
Chris@45 79 virtual ~MainWindowBase();
Chris@45 80
Chris@45 81 enum AudioFileOpenMode {
Chris@221 82 ReplaceSession,
Chris@45 83 ReplaceMainModel,
Chris@45 84 CreateAdditionalModel,
Chris@45 85 ReplaceCurrentPane,
Chris@45 86 AskUser
Chris@45 87 };
Chris@45 88
Chris@45 89 enum FileOpenStatus {
Chris@45 90 FileOpenSucceeded,
Chris@45 91 FileOpenFailed,
Chris@45 92 FileOpenCancelled,
Chris@45 93 FileOpenWrongMode // attempted to open layer when no main model present
Chris@45 94 };
Chris@45 95
Chris@45 96 virtual FileOpenStatus open(QString fileOrUrl, AudioFileOpenMode = AskUser);
Chris@45 97 virtual FileOpenStatus open(FileSource source, AudioFileOpenMode = AskUser);
Chris@45 98
dan@210 99 virtual FileOpenStatus openAudio(FileSource source, AudioFileOpenMode = AskUser, QString templateName = "");
Chris@45 100 virtual FileOpenStatus openPlaylist(FileSource source, AudioFileOpenMode = AskUser);
Chris@45 101 virtual FileOpenStatus openLayer(FileSource source);
Chris@45 102 virtual FileOpenStatus openImage(FileSource source);
Chris@45 103
Chris@45 104 virtual FileOpenStatus openSessionFile(QString fileOrUrl);
Chris@45 105 virtual FileOpenStatus openSession(FileSource source);
Chris@230 106 virtual FileOpenStatus openSessionTemplate(QString templateName);
Chris@227 107 virtual FileOpenStatus openSessionTemplate(FileSource source);
Chris@45 108
Chris@45 109 virtual bool saveSessionFile(QString path);
Chris@224 110 virtual bool saveSessionTemplate(QString path);
Chris@45 111
Chris@161 112 /// Implementation of FrameTimer interface method
Chris@161 113 virtual unsigned long getFrame() const;
Chris@161 114
Chris@45 115 signals:
Chris@45 116 // Used to toggle the availability of menu actions
Chris@45 117 void canAddPane(bool);
Chris@45 118 void canDeleteCurrentPane(bool);
Chris@45 119 void canAddLayer(bool);
Chris@45 120 void canImportMoreAudio(bool);
Chris@45 121 void canImportLayer(bool);
Chris@45 122 void canExportAudio(bool);
Chris@45 123 void canExportLayer(bool);
Chris@45 124 void canExportImage(bool);
Chris@45 125 void canRenameLayer(bool);
Chris@45 126 void canEditLayer(bool);
Chris@146 127 void canEditLayerTabular(bool);
Chris@45 128 void canMeasureLayer(bool);
Chris@45 129 void canSelect(bool);
Chris@45 130 void canClearSelection(bool);
Chris@45 131 void canEditSelection(bool);
Chris@45 132 void canDeleteSelection(bool);
Chris@45 133 void canPaste(bool);
Chris@45 134 void canInsertInstant(bool);
Chris@45 135 void canInsertInstantsAtBoundaries(bool);
Chris@184 136 void canInsertItemAtSelection(bool);
Chris@45 137 void canRenumberInstants(bool);
Chris@45 138 void canDeleteCurrentLayer(bool);
Chris@45 139 void canZoom(bool);
Chris@45 140 void canScroll(bool);
Chris@45 141 void canPlay(bool);
Chris@45 142 void canFfwd(bool);
Chris@45 143 void canRewind(bool);
Chris@45 144 void canPlaySelection(bool);
Chris@45 145 void canSpeedUpPlayback(bool);
Chris@45 146 void canSlowDownPlayback(bool);
Chris@45 147 void canChangePlaybackSpeed(bool);
Chris@73 148 void canSelectPreviousPane(bool);
Chris@73 149 void canSelectNextPane(bool);
Chris@73 150 void canSelectPreviousLayer(bool);
Chris@73 151 void canSelectNextLayer(bool);
Chris@45 152 void canSave(bool);
Chris@104 153 void hideSplash();
Chris@160 154 void replacedDocument();
Chris@164 155 void activity(QString);
Chris@45 156
Chris@45 157 public slots:
Chris@45 158 virtual void preferenceChanged(PropertyContainer::PropertyName);
Chris@168 159 virtual void resizeConstrained(QSize);
Chris@45 160
Chris@45 161 protected slots:
Chris@45 162 virtual void zoomIn();
Chris@45 163 virtual void zoomOut();
Chris@45 164 virtual void zoomToFit();
Chris@45 165 virtual void zoomDefault();
Chris@45 166 virtual void scrollLeft();
Chris@45 167 virtual void scrollRight();
Chris@45 168 virtual void jumpLeft();
Chris@45 169 virtual void jumpRight();
Chris@162 170 virtual void peekLeft();
Chris@162 171 virtual void peekRight();
Chris@45 172
Chris@45 173 virtual void showNoOverlays();
Chris@45 174 virtual void showMinimalOverlays();
Chris@45 175 virtual void showAllOverlays();
Chris@45 176
Chris@211 177 virtual void toggleTimeRulers();
Chris@45 178 virtual void toggleZoomWheels();
Chris@45 179 virtual void togglePropertyBoxes();
Chris@45 180 virtual void toggleStatusBar();
Chris@256 181 virtual void toggleCentreLine();
Chris@45 182
Chris@45 183 virtual void play();
Chris@45 184 virtual void ffwd();
Chris@45 185 virtual void ffwdEnd();
Chris@45 186 virtual void rewind();
Chris@45 187 virtual void rewindStart();
Chris@45 188 virtual void stop();
Chris@45 189
Chris@166 190 virtual void ffwdSimilar();
Chris@166 191 virtual void rewindSimilar();
Chris@166 192
Chris@45 193 virtual void deleteCurrentPane();
Chris@45 194 virtual void deleteCurrentLayer();
Chris@123 195 virtual void editCurrentLayer();
Chris@45 196
Chris@73 197 virtual void previousPane();
Chris@73 198 virtual void nextPane();
Chris@73 199 virtual void previousLayer();
Chris@73 200 virtual void nextLayer();
Chris@73 201
Chris@45 202 virtual void playLoopToggled();
Chris@45 203 virtual void playSelectionToggled();
Chris@45 204 virtual void playSoloToggled();
Chris@45 205
Chris@45 206 virtual void sampleRateMismatch(size_t, size_t, bool) = 0;
Chris@45 207 virtual void audioOverloadPluginDisabled() = 0;
Chris@130 208 virtual void audioTimeStretchMultiChannelDisabled() = 0;
Chris@45 209
Chris@45 210 virtual void playbackFrameChanged(unsigned long);
Chris@45 211 virtual void globalCentreFrameChanged(unsigned long);
Chris@45 212 virtual void viewCentreFrameChanged(View *, unsigned long);
Chris@45 213 virtual void viewZoomLevelChanged(View *, unsigned long, bool);
Chris@45 214 virtual void outputLevelsChanged(float, float) = 0;
Chris@45 215
Chris@45 216 virtual void currentPaneChanged(Pane *);
Chris@45 217 virtual void currentLayerChanged(Pane *, Layer *);
Chris@45 218
Chris@45 219 virtual void selectAll();
Chris@45 220 virtual void selectToStart();
Chris@45 221 virtual void selectToEnd();
Chris@45 222 virtual void selectVisible();
Chris@45 223 virtual void clearSelection();
Chris@45 224
Chris@45 225 virtual void cut();
Chris@45 226 virtual void copy();
Chris@45 227 virtual void paste();
Chris@215 228 virtual void pasteAtPlaybackPosition();
Chris@215 229 virtual void pasteRelative(int offset);
Chris@45 230 virtual void deleteSelected();
Chris@45 231
Chris@45 232 virtual void insertInstant();
Chris@45 233 virtual void insertInstantAt(size_t);
Chris@45 234 virtual void insertInstantsAtBoundaries();
Chris@184 235 virtual void insertItemAtSelection();
Chris@184 236 virtual void insertItemAt(size_t, size_t);
Chris@45 237 virtual void renumberInstants();
Chris@45 238
Chris@45 239 virtual void documentModified();
Chris@45 240 virtual void documentRestored();
Chris@45 241
Chris@45 242 virtual void layerAdded(Layer *);
Chris@45 243 virtual void layerRemoved(Layer *);
Chris@45 244 virtual void layerAboutToBeDeleted(Layer *);
Chris@45 245 virtual void layerInAView(Layer *, bool);
Chris@45 246
Chris@45 247 virtual void mainModelChanged(WaveFileModel *);
Chris@45 248 virtual void modelAdded(Model *);
Chris@45 249 virtual void modelAboutToBeDeleted(Model *);
Chris@45 250
Chris@45 251 virtual void updateMenuStates();
Chris@45 252 virtual void updateDescriptionLabel() = 0;
Chris@45 253
Chris@78 254 virtual void modelGenerationFailed(QString, QString) = 0;
Chris@78 255 virtual void modelGenerationWarning(QString, QString) = 0;
Chris@78 256 virtual void modelRegenerationFailed(QString, QString, QString) = 0;
Chris@78 257 virtual void modelRegenerationWarning(QString, QString, QString) = 0;
Chris@78 258 virtual void alignmentFailed(QString, QString) = 0;
Chris@45 259
Chris@45 260 virtual void rightButtonMenuRequested(Pane *, QPoint point) = 0;
Chris@45 261
Chris@45 262 virtual void paneAdded(Pane *) = 0;
Chris@45 263 virtual void paneHidden(Pane *) = 0;
Chris@45 264 virtual void paneAboutToBeDeleted(Pane *) = 0;
Chris@45 265 virtual void paneDropAccepted(Pane *, QStringList) = 0;
Chris@45 266 virtual void paneDropAccepted(Pane *, QString) = 0;
Chris@55 267 virtual void paneDeleteButtonClicked(Pane *);
Chris@45 268
Chris@113 269 virtual void oscReady();
Chris@45 270 virtual void pollOSC();
Chris@45 271 virtual void handleOSCMessage(const OSCMessage &) = 0;
Chris@45 272
Chris@45 273 virtual void contextHelpChanged(const QString &);
Chris@45 274 virtual void inProgressSelectionChanged();
Chris@45 275
Chris@141 276 virtual FileOpenStatus openSessionFromRDF(FileSource source);
Chris@145 277 virtual FileOpenStatus openLayersFromRDF(FileSource source);
Chris@141 278
Chris@45 279 virtual void closeSession() = 0;
Chris@45 280
Chris@180 281 virtual void newerVersionAvailable(QString) { }
Chris@180 282
Chris@45 283 protected:
Chris@45 284 QString m_sessionFile;
Chris@45 285 QString m_audioFile;
Chris@45 286 Document *m_document;
Chris@45 287
Chris@45 288 QLabel *m_descriptionLabel;
Chris@45 289 PaneStack *m_paneStack;
Chris@45 290 ViewManager *m_viewManager;
Chris@45 291 Layer *m_timeRulerLayer;
Chris@45 292
Chris@45 293 bool m_audioOutput;
Chris@45 294 AudioCallbackPlaySource *m_playSource;
Chris@45 295 AudioCallbackPlayTarget *m_playTarget;
Chris@45 296
Chris@113 297 class OSCQueueStarter : public QThread
Chris@113 298 {
Chris@113 299 public:
Chris@113 300 OSCQueueStarter(MainWindowBase *mwb) : QThread(mwb), m_mwb(mwb) { }
Chris@113 301 virtual void run() {
Chris@113 302 OSCQueue *queue = new OSCQueue(); // can take a long time
Chris@113 303 m_mwb->m_oscQueue = queue;
Chris@113 304 }
Chris@113 305 private:
Chris@113 306 MainWindowBase *m_mwb;
Chris@113 307 };
Chris@113 308
Chris@45 309 OSCQueue *m_oscQueue;
Chris@113 310 OSCQueueStarter *m_oscQueueStarter;
Chris@45 311
Chris@157 312 MIDIInput *m_midiInput;
Chris@157 313
Chris@45 314 RecentFiles m_recentFiles;
Chris@54 315 RecentFiles m_recentTransforms;
Chris@45 316
Chris@45 317 bool m_documentModified;
Chris@45 318 bool m_openingAudioFile;
Chris@45 319 bool m_abandoning;
Chris@45 320
Chris@45 321 Labeller *m_labeller;
Chris@45 322
Chris@45 323 int m_lastPlayStatusSec;
Chris@45 324 mutable QString m_myStatusMessage;
Chris@45 325
Chris@45 326 bool m_initialDarkBackground;
Chris@45 327
Chris@45 328 WaveFileModel *getMainModel();
Chris@45 329 const WaveFileModel *getMainModel() const;
Chris@45 330 void createDocument();
Chris@45 331
Chris@45 332 Pane *addPaneToStack();
Chris@45 333 Layer *getSnapLayer() const;
Chris@45 334
Chris@126 335 typedef std::map<Layer *, QPointer<ModelDataTableDialog> > LayerDataDialogMap;
Chris@126 336 typedef std::set<QPointer<ModelDataTableDialog> > DataDialogSet;
Chris@123 337 typedef std::map<View *, DataDialogSet> ViewDataDialogMap;
Chris@123 338
Chris@123 339 LayerDataDialogMap m_layerDataDialogMap;
Chris@123 340 ViewDataDialogMap m_viewDataDialogMap;
Chris@123 341
Chris@128 342 void removeLayerEditDialog(Layer *);
Chris@128 343
Chris@45 344 class PaneCallback : public SVFileReaderPaneCallback
Chris@45 345 {
Chris@45 346 public:
Chris@45 347 PaneCallback(MainWindowBase *mw) : m_mw(mw) { }
Chris@45 348 virtual Pane *addPane() { return m_mw->addPaneToStack(); }
Chris@45 349 virtual void setWindowSize(int width, int height) {
Chris@168 350 m_mw->resizeConstrained(QSize(width, height));
Chris@45 351 }
Chris@45 352 virtual void addSelection(int start, int end) {
Chris@45 353 m_mw->m_viewManager->addSelection(Selection(start, end));
Chris@45 354 }
Chris@45 355 protected:
Chris@45 356 MainWindowBase *m_mw;
Chris@45 357 };
Chris@45 358
Chris@45 359 class AddPaneCommand : public Command
Chris@45 360 {
Chris@45 361 public:
Chris@45 362 AddPaneCommand(MainWindowBase *mw);
Chris@45 363 virtual ~AddPaneCommand();
Chris@45 364
Chris@45 365 virtual void execute();
Chris@45 366 virtual void unexecute();
Chris@45 367 virtual QString getName() const;
Chris@45 368
Chris@45 369 Pane *getPane() { return m_pane; }
Chris@45 370
Chris@45 371 protected:
Chris@45 372 MainWindowBase *m_mw;
Chris@45 373 Pane *m_pane; // Main window owns this, but I determine its lifespan
Chris@45 374 Pane *m_prevCurrentPane; // I don't own this
Chris@45 375 bool m_added;
Chris@45 376 };
Chris@45 377
Chris@45 378 class RemovePaneCommand : public Command
Chris@45 379 {
Chris@45 380 public:
Chris@45 381 RemovePaneCommand(MainWindowBase *mw, Pane *pane);
Chris@45 382 virtual ~RemovePaneCommand();
Chris@45 383
Chris@45 384 virtual void execute();
Chris@45 385 virtual void unexecute();
Chris@45 386 virtual QString getName() const;
Chris@45 387
Chris@45 388 protected:
Chris@45 389 MainWindowBase *m_mw;
Chris@45 390 Pane *m_pane; // Main window owns this, but I determine its lifespan
Chris@45 391 Pane *m_prevCurrentPane; // I don't own this
Chris@45 392 bool m_added;
Chris@45 393 };
Chris@45 394
Chris@45 395 virtual bool checkSaveModified() = 0;
Chris@45 396
Chris@45 397 virtual QString getOpenFileName(FileFinder::FileType type);
Chris@45 398 virtual QString getSaveFileName(FileFinder::FileType type);
Chris@45 399 virtual void registerLastOpenedFilePath(FileFinder::FileType type, QString path);
Chris@45 400
Chris@222 401 virtual QString getDefaultSessionTemplate() const;
Chris@251 402 virtual void setDefaultSessionTemplate(QString);
Chris@222 403
Chris@45 404 virtual void createPlayTarget();
Chris@45 405 virtual void openHelpUrl(QString url);
Chris@45 406
Chris@45 407 virtual void setupMenus() = 0;
Chris@45 408 virtual void updateVisibleRangeDisplay(Pane *p) const = 0;
Chris@187 409 virtual void updatePositionStatusDisplays() const = 0;
Chris@45 410
Chris@147 411 virtual bool shouldCreateNewSessionForRDFAudio(bool *) { return true; }
Chris@145 412
Chris@128 413 virtual void connectLayerEditDialog(ModelDataTableDialog *dialog);
Chris@128 414
Chris@226 415 virtual void toXml(QTextStream &stream, bool asTemplate);
Chris@45 416 };
Chris@45 417
Chris@45 418
Chris@45 419 #endif