annotate framework/MainWindowBase.h @ 530:066d8c5f3b21 project-file-rework

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