annotate framework/MainWindowBase.h @ 496:4f1d280903ad tony-2.0-integration

Update analysis stuff when recording starts (and when model is added) rather than when it ends. Not continuing to update during recording though...
author Chris Cannam
date Mon, 12 Oct 2015 17:10:43 +0100
parents 21d3cf5c8f21
children 51befd6165a3
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@475 49 class AudioRecordTarget;
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@391 63 class QSignalMapper;
Chris@391 64 class QShortcut;
Chris@45 65
Chris@468 66 namespace breakfastquay {
Chris@468 67 class SystemPlaybackTarget;
Chris@475 68 class SystemAudioIO;
Chris@468 69 }
Chris@468 70
Chris@45 71 /**
Chris@45 72 * The base class for the SV main window. This includes everything to
Chris@45 73 * do with general document and pane stack management, but nothing
Chris@45 74 * that involves user interaction -- this doesn't create the widget or
Chris@45 75 * menu structures or editing tools, and if a function needs to open a
Chris@45 76 * dialog, it shouldn't be in here. This permits "variations on SV"
Chris@45 77 * to use different subclasses retaining the same general structure.
Chris@45 78 */
Chris@45 79
Chris@161 80 class MainWindowBase : public QMainWindow, public FrameTimer
Chris@45 81 {
Chris@45 82 Q_OBJECT
Chris@45 83
Chris@45 84 public:
Chris@475 85 enum SoundOption {
Chris@475 86 WithAudioOutput = 0x01,
Chris@475 87 WithAudioInput = 0x02,
Chris@475 88 WithMIDIInput = 0x04,
Chris@475 89 WithEverything = 0xff
Chris@475 90 };
Chris@475 91 typedef int SoundOptions;
Chris@475 92
Chris@475 93 MainWindowBase(SoundOptions options = WithEverything);
Chris@45 94 virtual ~MainWindowBase();
Chris@45 95
Chris@45 96 enum AudioFileOpenMode {
Chris@221 97 ReplaceSession,
Chris@45 98 ReplaceMainModel,
Chris@45 99 CreateAdditionalModel,
Chris@45 100 ReplaceCurrentPane,
Chris@45 101 AskUser
Chris@45 102 };
Chris@45 103
Chris@45 104 enum FileOpenStatus {
Chris@45 105 FileOpenSucceeded,
Chris@45 106 FileOpenFailed,
Chris@45 107 FileOpenCancelled,
Chris@45 108 FileOpenWrongMode // attempted to open layer when no main model present
Chris@45 109 };
Chris@45 110
Chris@483 111 enum AudioRecordMode {
Chris@483 112 RecordReplaceSession,
Chris@483 113 RecordCreateAdditionalModel
Chris@483 114 };
Chris@483 115
Chris@45 116 virtual FileOpenStatus open(FileSource source, AudioFileOpenMode = AskUser);
Chris@373 117 virtual FileOpenStatus openPath(QString fileOrUrl, AudioFileOpenMode = AskUser);
dan@210 118 virtual FileOpenStatus openAudio(FileSource source, AudioFileOpenMode = AskUser, QString templateName = "");
Chris@45 119 virtual FileOpenStatus openPlaylist(FileSource source, AudioFileOpenMode = AskUser);
Chris@45 120 virtual FileOpenStatus openLayer(FileSource source);
Chris@45 121 virtual FileOpenStatus openImage(FileSource source);
Chris@45 122
Chris@45 123 virtual FileOpenStatus openSession(FileSource source);
Chris@373 124 virtual FileOpenStatus openSessionPath(QString fileOrUrl);
Chris@230 125 virtual FileOpenStatus openSessionTemplate(QString templateName);
Chris@227 126 virtual FileOpenStatus openSessionTemplate(FileSource source);
Chris@45 127
Chris@45 128 virtual bool saveSessionFile(QString path);
Chris@224 129 virtual bool saveSessionTemplate(QString path);
Chris@45 130
Chris@161 131 /// Implementation of FrameTimer interface method
Chris@435 132 virtual sv_frame_t getFrame() const;
Chris@161 133
Chris@357 134 void setDefaultFfwdRwdStep(RealTime step) {
Chris@357 135 m_defaultFfwdRwdStep = step;
Chris@357 136 }
Chris@357 137
Chris@483 138 void setAudioRecordMode(AudioRecordMode mode) {
Chris@483 139 m_audioRecordMode = mode;
Chris@483 140 }
Chris@483 141
Chris@45 142 signals:
Chris@45 143 // Used to toggle the availability of menu actions
Chris@45 144 void canAddPane(bool);
Chris@45 145 void canDeleteCurrentPane(bool);
Chris@45 146 void canAddLayer(bool);
Chris@45 147 void canImportMoreAudio(bool);
Chris@259 148 void canReplaceMainAudio(bool);
Chris@45 149 void canImportLayer(bool);
Chris@289 150 void canChangeSessionTemplate(bool);
Chris@45 151 void canExportAudio(bool);
Chris@45 152 void canExportLayer(bool);
Chris@45 153 void canExportImage(bool);
Chris@45 154 void canRenameLayer(bool);
Chris@45 155 void canEditLayer(bool);
Chris@146 156 void canEditLayerTabular(bool);
Chris@45 157 void canMeasureLayer(bool);
Chris@45 158 void canSelect(bool);
Chris@45 159 void canClearSelection(bool);
Chris@45 160 void canEditSelection(bool);
Chris@45 161 void canDeleteSelection(bool);
Chris@45 162 void canPaste(bool);
Chris@45 163 void canInsertInstant(bool);
Chris@45 164 void canInsertInstantsAtBoundaries(bool);
Chris@184 165 void canInsertItemAtSelection(bool);
Chris@45 166 void canRenumberInstants(bool);
Chris@45 167 void canDeleteCurrentLayer(bool);
Chris@45 168 void canZoom(bool);
Chris@45 169 void canScroll(bool);
Chris@45 170 void canPlay(bool);
Chris@475 171 void canRecord(bool);
Chris@45 172 void canFfwd(bool);
Chris@45 173 void canRewind(bool);
Chris@45 174 void canPlaySelection(bool);
Chris@45 175 void canSpeedUpPlayback(bool);
Chris@45 176 void canSlowDownPlayback(bool);
Chris@45 177 void canChangePlaybackSpeed(bool);
Chris@73 178 void canSelectPreviousPane(bool);
Chris@73 179 void canSelectNextPane(bool);
Chris@73 180 void canSelectPreviousLayer(bool);
Chris@73 181 void canSelectNextLayer(bool);
Chris@45 182 void canSave(bool);
Chris@359 183 void canSaveAs(bool);
Chris@104 184 void hideSplash();
Chris@452 185 void hideSplash(QWidget *);
Chris@342 186 void sessionLoaded();
Chris@342 187 void audioFileLoaded();
Chris@160 188 void replacedDocument();
Chris@164 189 void activity(QString);
Chris@45 190
Chris@45 191 public slots:
Chris@45 192 virtual void preferenceChanged(PropertyContainer::PropertyName);
Chris@168 193 virtual void resizeConstrained(QSize);
Chris@45 194
Chris@45 195 protected slots:
Chris@45 196 virtual void zoomIn();
Chris@45 197 virtual void zoomOut();
Chris@45 198 virtual void zoomToFit();
Chris@45 199 virtual void zoomDefault();
Chris@45 200 virtual void scrollLeft();
Chris@45 201 virtual void scrollRight();
Chris@45 202 virtual void jumpLeft();
Chris@45 203 virtual void jumpRight();
Chris@162 204 virtual void peekLeft();
Chris@162 205 virtual void peekRight();
Chris@45 206
Chris@45 207 virtual void showNoOverlays();
Chris@45 208 virtual void showMinimalOverlays();
Chris@45 209 virtual void showAllOverlays();
Chris@45 210
Chris@211 211 virtual void toggleTimeRulers();
Chris@45 212 virtual void toggleZoomWheels();
Chris@45 213 virtual void togglePropertyBoxes();
Chris@45 214 virtual void toggleStatusBar();
Chris@256 215 virtual void toggleCentreLine();
Chris@45 216
Chris@45 217 virtual void play();
Chris@45 218 virtual void ffwd();
Chris@45 219 virtual void ffwdEnd();
Chris@45 220 virtual void rewind();
Chris@45 221 virtual void rewindStart();
Chris@477 222 virtual void record();
Chris@45 223 virtual void stop();
Chris@45 224
Chris@166 225 virtual void ffwdSimilar();
Chris@166 226 virtual void rewindSimilar();
Chris@166 227
Chris@45 228 virtual void deleteCurrentPane();
Chris@45 229 virtual void deleteCurrentLayer();
Chris@123 230 virtual void editCurrentLayer();
Chris@45 231
Chris@73 232 virtual void previousPane();
Chris@73 233 virtual void nextPane();
Chris@73 234 virtual void previousLayer();
Chris@73 235 virtual void nextLayer();
Chris@73 236
Chris@45 237 virtual void playLoopToggled();
Chris@45 238 virtual void playSelectionToggled();
Chris@45 239 virtual void playSoloToggled();
Chris@45 240
Chris@436 241 virtual void sampleRateMismatch(sv_samplerate_t, sv_samplerate_t, bool) = 0;
Chris@45 242 virtual void audioOverloadPluginDisabled() = 0;
Chris@130 243 virtual void audioTimeStretchMultiChannelDisabled() = 0;
Chris@45 244
Chris@435 245 virtual void playbackFrameChanged(sv_frame_t);
Chris@435 246 virtual void globalCentreFrameChanged(sv_frame_t);
Chris@435 247 virtual void viewCentreFrameChanged(View *, sv_frame_t);
Chris@366 248 virtual void viewZoomLevelChanged(View *, int, bool);
Chris@45 249 virtual void outputLevelsChanged(float, float) = 0;
Chris@485 250 virtual void recordDurationChanged(sv_frame_t, sv_samplerate_t);
Chris@45 251
Chris@45 252 virtual void currentPaneChanged(Pane *);
Chris@45 253 virtual void currentLayerChanged(Pane *, Layer *);
Chris@45 254
Chris@45 255 virtual void selectAll();
Chris@45 256 virtual void selectToStart();
Chris@45 257 virtual void selectToEnd();
Chris@45 258 virtual void selectVisible();
Chris@45 259 virtual void clearSelection();
Chris@45 260
Chris@45 261 virtual void cut();
Chris@45 262 virtual void copy();
Chris@45 263 virtual void paste();
Chris@215 264 virtual void pasteAtPlaybackPosition();
Chris@435 265 virtual void pasteRelative(sv_frame_t offset);
Chris@45 266 virtual void deleteSelected();
Chris@45 267
Chris@45 268 virtual void insertInstant();
Chris@435 269 virtual void insertInstantAt(sv_frame_t);
Chris@45 270 virtual void insertInstantsAtBoundaries();
Chris@184 271 virtual void insertItemAtSelection();
Chris@435 272 virtual void insertItemAt(sv_frame_t, sv_frame_t);
Chris@45 273 virtual void renumberInstants();
Chris@45 274
Chris@45 275 virtual void documentModified();
Chris@45 276 virtual void documentRestored();
Chris@45 277
Chris@45 278 virtual void layerAdded(Layer *);
Chris@45 279 virtual void layerRemoved(Layer *);
Chris@45 280 virtual void layerAboutToBeDeleted(Layer *);
Chris@45 281 virtual void layerInAView(Layer *, bool);
Chris@45 282
Chris@45 283 virtual void mainModelChanged(WaveFileModel *);
Chris@45 284 virtual void modelAdded(Model *);
Chris@45 285 virtual void modelAboutToBeDeleted(Model *);
Chris@45 286
Chris@45 287 virtual void updateMenuStates();
Chris@45 288 virtual void updateDescriptionLabel() = 0;
Chris@45 289
Chris@78 290 virtual void modelGenerationFailed(QString, QString) = 0;
Chris@78 291 virtual void modelGenerationWarning(QString, QString) = 0;
Chris@78 292 virtual void modelRegenerationFailed(QString, QString, QString) = 0;
Chris@78 293 virtual void modelRegenerationWarning(QString, QString, QString) = 0;
Chris@78 294 virtual void alignmentFailed(QString, QString) = 0;
Chris@45 295
Chris@45 296 virtual void rightButtonMenuRequested(Pane *, QPoint point) = 0;
Chris@45 297
Chris@45 298 virtual void paneAdded(Pane *) = 0;
Chris@45 299 virtual void paneHidden(Pane *) = 0;
Chris@45 300 virtual void paneAboutToBeDeleted(Pane *) = 0;
Chris@45 301 virtual void paneDropAccepted(Pane *, QStringList) = 0;
Chris@45 302 virtual void paneDropAccepted(Pane *, QString) = 0;
Chris@55 303 virtual void paneDeleteButtonClicked(Pane *);
Chris@45 304
Chris@113 305 virtual void oscReady();
Chris@45 306 virtual void pollOSC();
Chris@45 307 virtual void handleOSCMessage(const OSCMessage &) = 0;
Chris@45 308
Chris@45 309 virtual void contextHelpChanged(const QString &);
Chris@45 310 virtual void inProgressSelectionChanged();
Chris@45 311
Chris@141 312 virtual FileOpenStatus openSessionFromRDF(FileSource source);
Chris@145 313 virtual FileOpenStatus openLayersFromRDF(FileSource source);
Chris@141 314
Chris@45 315 virtual void closeSession() = 0;
Chris@45 316
Chris@452 317 virtual void emitHideSplash();
Chris@452 318
Chris@180 319 virtual void newerVersionAvailable(QString) { }
Chris@180 320
Chris@354 321 virtual void menuActionMapperInvoked(QObject *);
Chris@354 322
Chris@45 323 protected:
Chris@45 324 QString m_sessionFile;
Chris@45 325 QString m_audioFile;
Chris@45 326 Document *m_document;
Chris@45 327
Chris@45 328 PaneStack *m_paneStack;
Chris@45 329 ViewManager *m_viewManager;
Chris@45 330 Layer *m_timeRulerLayer;
Chris@45 331
Chris@475 332 SoundOptions m_soundOptions;
Chris@475 333
Chris@45 334 AudioCallbackPlaySource *m_playSource;
Chris@475 335 AudioRecordTarget *m_recordTarget;
Chris@475 336 breakfastquay::SystemPlaybackTarget *m_playTarget; // only one of this...
Chris@475 337 breakfastquay::SystemAudioIO *m_audioIO; // ... and this exists
Chris@45 338
Chris@113 339 class OSCQueueStarter : public QThread
Chris@113 340 {
Chris@113 341 public:
Chris@113 342 OSCQueueStarter(MainWindowBase *mwb) : QThread(mwb), m_mwb(mwb) { }
Chris@113 343 virtual void run() {
Chris@113 344 OSCQueue *queue = new OSCQueue(); // can take a long time
Chris@113 345 m_mwb->m_oscQueue = queue;
Chris@113 346 }
Chris@113 347 private:
Chris@113 348 MainWindowBase *m_mwb;
Chris@113 349 };
Chris@113 350
Chris@45 351 OSCQueue *m_oscQueue;
Chris@113 352 OSCQueueStarter *m_oscQueueStarter;
Chris@304 353 void startOSCQueue();
Chris@45 354
Chris@157 355 MIDIInput *m_midiInput;
Chris@157 356
Chris@45 357 RecentFiles m_recentFiles;
Chris@54 358 RecentFiles m_recentTransforms;
Chris@45 359
Chris@45 360 bool m_documentModified;
Chris@45 361 bool m_openingAudioFile;
Chris@45 362 bool m_abandoning;
Chris@45 363
Chris@45 364 Labeller *m_labeller;
Chris@45 365
Chris@45 366 int m_lastPlayStatusSec;
Chris@45 367 mutable QString m_myStatusMessage;
Chris@45 368
Chris@45 369 bool m_initialDarkBackground;
Chris@45 370
Chris@357 371 RealTime m_defaultFfwdRwdStep;
Chris@357 372
Chris@483 373 AudioRecordMode m_audioRecordMode;
Chris@483 374
Chris@378 375 mutable QLabel *m_statusLabel;
Chris@378 376 QLabel *getStatusLabel() const;
Chris@378 377
Chris@45 378 WaveFileModel *getMainModel();
Chris@45 379 const WaveFileModel *getMainModel() const;
Chris@45 380 void createDocument();
Chris@45 381
Chris@45 382 Pane *addPaneToStack();
Chris@45 383 Layer *getSnapLayer() const;
Chris@45 384
Chris@126 385 typedef std::map<Layer *, QPointer<ModelDataTableDialog> > LayerDataDialogMap;
Chris@126 386 typedef std::set<QPointer<ModelDataTableDialog> > DataDialogSet;
Chris@123 387 typedef std::map<View *, DataDialogSet> ViewDataDialogMap;
Chris@123 388
Chris@123 389 LayerDataDialogMap m_layerDataDialogMap;
Chris@123 390 ViewDataDialogMap m_viewDataDialogMap;
Chris@123 391
Chris@128 392 void removeLayerEditDialog(Layer *);
Chris@128 393
Chris@45 394 class PaneCallback : public SVFileReaderPaneCallback
Chris@45 395 {
Chris@45 396 public:
Chris@45 397 PaneCallback(MainWindowBase *mw) : m_mw(mw) { }
Chris@45 398 virtual Pane *addPane() { return m_mw->addPaneToStack(); }
Chris@45 399 virtual void setWindowSize(int width, int height) {
Chris@168 400 m_mw->resizeConstrained(QSize(width, height));
Chris@45 401 }
Chris@435 402 virtual void addSelection(sv_frame_t start, sv_frame_t end) {
Chris@344 403 m_mw->m_viewManager->addSelectionQuietly(Selection(start, end));
Chris@45 404 }
Chris@45 405 protected:
Chris@45 406 MainWindowBase *m_mw;
Chris@45 407 };
Chris@45 408
Chris@45 409 class AddPaneCommand : public Command
Chris@45 410 {
Chris@45 411 public:
Chris@45 412 AddPaneCommand(MainWindowBase *mw);
Chris@45 413 virtual ~AddPaneCommand();
Chris@45 414
Chris@45 415 virtual void execute();
Chris@45 416 virtual void unexecute();
Chris@45 417 virtual QString getName() const;
Chris@45 418
Chris@45 419 Pane *getPane() { return m_pane; }
Chris@45 420
Chris@45 421 protected:
Chris@45 422 MainWindowBase *m_mw;
Chris@45 423 Pane *m_pane; // Main window owns this, but I determine its lifespan
Chris@45 424 Pane *m_prevCurrentPane; // I don't own this
Chris@45 425 bool m_added;
Chris@45 426 };
Chris@45 427
Chris@45 428 class RemovePaneCommand : public Command
Chris@45 429 {
Chris@45 430 public:
Chris@45 431 RemovePaneCommand(MainWindowBase *mw, Pane *pane);
Chris@45 432 virtual ~RemovePaneCommand();
Chris@45 433
Chris@45 434 virtual void execute();
Chris@45 435 virtual void unexecute();
Chris@45 436 virtual QString getName() const;
Chris@45 437
Chris@45 438 protected:
Chris@45 439 MainWindowBase *m_mw;
Chris@45 440 Pane *m_pane; // Main window owns this, but I determine its lifespan
Chris@45 441 Pane *m_prevCurrentPane; // I don't own this
Chris@45 442 bool m_added;
Chris@45 443 };
Chris@45 444
Chris@45 445 virtual bool checkSaveModified() = 0;
Chris@45 446
Chris@45 447 virtual QString getOpenFileName(FileFinder::FileType type);
Chris@45 448 virtual QString getSaveFileName(FileFinder::FileType type);
Chris@45 449 virtual void registerLastOpenedFilePath(FileFinder::FileType type, QString path);
Chris@45 450
Chris@222 451 virtual QString getDefaultSessionTemplate() const;
Chris@251 452 virtual void setDefaultSessionTemplate(QString);
Chris@222 453
Chris@475 454 virtual void createAudioIO();
Chris@45 455 virtual void openHelpUrl(QString url);
Chris@483 456 virtual void openLocalFolder(QString path);
Chris@45 457
Chris@45 458 virtual void setupMenus() = 0;
Chris@45 459 virtual void updateVisibleRangeDisplay(Pane *p) const = 0;
Chris@187 460 virtual void updatePositionStatusDisplays() const = 0;
Chris@45 461
Chris@354 462 // Call this after setting up the menu bar, to fix up single-key
Chris@354 463 // shortcuts on OS/X
Chris@354 464 virtual void finaliseMenus();
Chris@354 465 virtual void finaliseMenu(QMenu *);
Chris@394 466
Chris@394 467 // Only used on OS/X to work around a Qt/Cocoa bug, see finaliseMenus
Chris@391 468 QSignalMapper *m_menuShortcutMapper;
Chris@391 469 QList<QShortcut *> m_appShortcuts;
Chris@354 470
Chris@147 471 virtual bool shouldCreateNewSessionForRDFAudio(bool *) { return true; }
Chris@145 472
Chris@128 473 virtual void connectLayerEditDialog(ModelDataTableDialog *dialog);
Chris@128 474
Chris@226 475 virtual void toXml(QTextStream &stream, bool asTemplate);
Chris@45 476 };
Chris@45 477
Chris@45 478
Chris@45 479 #endif