annotate framework/MainWindowBase.h @ 738:48001ed9143b audio-source-refactor

Introduce TimeStretchWrapper; some work towards making the AudioCallbackPlaySource not actually try to be an ApplicationPlaybackSource itself but only return one that is constructed from wrappers that it controls the lifespan of
author Chris Cannam
date Wed, 18 Mar 2020 12:51:41 +0000
parents 15da3ab3d416
children 771ec060c1d2
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@571 16 #ifndef SV_MAIN_WINDOW_BASE_H
Chris@571 17 #define SV_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@712 28 #include "view/PaneStack.h"
Chris@45 29 #include "base/PropertyContainer.h"
Chris@45 30 #include "base/RecentFiles.h"
Chris@161 31 #include "base/FrameTimer.h"
Chris@45 32 #include "layer/LayerFactory.h"
Chris@106 33 #include "transform/Transform.h"
Chris@46 34 #include "SVFileReader.h"
Chris@170 35 #include "data/fileio/FileFinder.h"
Chris@45 36 #include "data/fileio/FileSource.h"
Chris@113 37 #include "data/osc/OSCQueue.h"
Chris@654 38 #include "data/osc/OSCMessageCallback.h"
Chris@684 39 #include "data/model/Model.h"
Chris@684 40
Chris@45 41 #include <map>
Chris@45 42
Chris@45 43 class Document;
Chris@45 44 class PaneStack;
Chris@45 45 class Pane;
Chris@45 46 class View;
Chris@45 47 class Fader;
Chris@45 48 class Overview;
Chris@45 49 class Layer;
Chris@45 50 class WaveformLayer;
Chris@45 51 class WaveFileModel;
Chris@45 52 class AudioCallbackPlaySource;
Chris@738 53 class TimeStretchWrapper;
Chris@574 54 class AudioCallbackRecordTarget;
Chris@45 55 class CommandHistory;
Chris@45 56 class QMenu;
Chris@45 57 class AudioDial;
Chris@541 58 class LevelPanWidget;
Chris@565 59 class LevelPanToolButton;
Chris@45 60 class QLabel;
Chris@45 61 class QCheckBox;
Chris@45 62 class PreferencesDialog;
Chris@45 63 class QTreeView;
Chris@45 64 class QPushButton;
Chris@45 65 class OSCMessage;
Chris@654 66 class OSCScript;
Chris@157 67 class MIDIInput;
Chris@45 68 class KeyReference;
Chris@45 69 class Labeller;
Chris@123 70 class ModelDataTableDialog;
Chris@391 71 class QSignalMapper;
Chris@391 72 class QShortcut;
Chris@429 73 class AlignmentModel;
Chris@729 74 class LayerGeometryProvider;
Chris@45 75
Chris@468 76 namespace breakfastquay {
Chris@551 77 class SystemPlaybackTarget;
Chris@551 78 class SystemAudioIO;
Chris@468 79 }
Chris@468 80
Chris@45 81 /**
Chris@45 82 * The base class for the SV main window. This includes everything to
Chris@45 83 * do with general document and pane stack management, but nothing
Chris@45 84 * that involves user interaction -- this doesn't create the widget or
Chris@45 85 * menu structures or editing tools, and if a function needs to open a
Chris@45 86 * dialog, it shouldn't be in here. This permits "variations on SV"
Chris@45 87 * to use different subclasses retaining the same general structure.
Chris@45 88 */
Chris@45 89
Chris@654 90 class MainWindowBase : public QMainWindow,
Chris@654 91 public FrameTimer,
Chris@654 92 public OSCMessageCallback
Chris@45 93 {
Chris@45 94 Q_OBJECT
Chris@45 95
Chris@45 96 public:
Chris@714 97 /**
Chris@714 98 * Determine what kind of audio device to open when the first
Chris@714 99 * model is loaded or record() is called.
Chris@714 100 */
Chris@714 101 enum AudioMode {
Chris@714 102
Chris@714 103 /// Open no audio device, ever
Chris@714 104 AUDIO_NONE,
Chris@714 105
Chris@714 106 /// Open for playback, never for recording
Chris@714 107 AUDIO_PLAYBACK_ONLY,
Chris@714 108
Chris@714 109 /// Open for playback when model loaded, switch to I/O if record called
Chris@714 110 AUDIO_PLAYBACK_NOW_RECORD_LATER,
Chris@714 111
Chris@714 112 /// Open for I/O as soon as model loaded or record called
Chris@714 113 AUDIO_PLAYBACK_AND_RECORD
Chris@475 114 };
Chris@714 115
Chris@714 116 /**
Chris@714 117 * Determine whether to open a MIDI input device.
Chris@714 118 */
Chris@714 119 enum MIDIMode {
Chris@714 120
Chris@714 121 /// Open no MIDI device
Chris@714 122 MIDI_NONE,
Chris@714 123
Chris@714 124 /// Open a MIDI device and listen for MIDI input
Chris@714 125 MIDI_LISTEN
Chris@714 126 };
Chris@714 127
Chris@714 128 MainWindowBase(AudioMode audioMode, MIDIMode midiMode,
Chris@714 129 PaneStack::Options paneStackOptions);
Chris@45 130 virtual ~MainWindowBase();
Chris@45 131
Chris@45 132 enum AudioFileOpenMode {
Chris@221 133 ReplaceSession,
Chris@45 134 ReplaceMainModel,
Chris@45 135 CreateAdditionalModel,
Chris@45 136 ReplaceCurrentPane,
Chris@45 137 AskUser
Chris@45 138 };
Chris@45 139
Chris@45 140 enum FileOpenStatus {
Chris@45 141 FileOpenSucceeded,
Chris@45 142 FileOpenFailed,
Chris@45 143 FileOpenCancelled,
Chris@45 144 FileOpenWrongMode // attempted to open layer when no main model present
Chris@45 145 };
Chris@45 146
Chris@483 147 enum AudioRecordMode {
Chris@483 148 RecordReplaceSession,
Chris@483 149 RecordCreateAdditionalModel
Chris@483 150 };
Chris@483 151
Chris@45 152 virtual FileOpenStatus open(FileSource source, AudioFileOpenMode = AskUser);
Chris@373 153 virtual FileOpenStatus openPath(QString fileOrUrl, AudioFileOpenMode = AskUser);
dan@210 154 virtual FileOpenStatus openAudio(FileSource source, AudioFileOpenMode = AskUser, QString templateName = "");
Chris@45 155 virtual FileOpenStatus openPlaylist(FileSource source, AudioFileOpenMode = AskUser);
Chris@45 156 virtual FileOpenStatus openLayer(FileSource source);
Chris@45 157 virtual FileOpenStatus openImage(FileSource source);
Chris@45 158
Chris@427 159 virtual FileOpenStatus openDirOfAudio(QString dirPath);
Chris@427 160
Chris@45 161 virtual FileOpenStatus openSession(FileSource source);
Chris@373 162 virtual FileOpenStatus openSessionPath(QString fileOrUrl);
Chris@230 163 virtual FileOpenStatus openSessionTemplate(QString templateName);
Chris@227 164 virtual FileOpenStatus openSessionTemplate(FileSource source);
Chris@45 165
Chris@45 166 virtual bool saveSessionFile(QString path);
Chris@224 167 virtual bool saveSessionTemplate(QString path);
Chris@45 168
Chris@729 169 virtual bool exportLayerToSVL(Layer *layer,
Chris@729 170 QString toPath, QString &error);
Chris@729 171
Chris@729 172 virtual bool exportLayerToMIDI(Layer *layer,
Chris@729 173 MultiSelection *selectionsToWrite, // or null
Chris@729 174 QString toPath, QString &error);
Chris@729 175
Chris@729 176 virtual bool exportLayerToRDF(Layer *layer,
Chris@729 177 QString toPath, QString &error);
Chris@729 178
Chris@729 179 virtual bool exportLayerToCSV(Layer *layer, LayerGeometryProvider *provider,
Chris@729 180 MultiSelection *selectionsToWrite, // or null
Chris@729 181 QString delimiter,
Chris@729 182 DataExportOptions options,
Chris@729 183 QString toPath, QString &error);
Chris@729 184
Chris@729 185 // Delegate to one of the above depending on extension of path,
Chris@729 186 // using the default export options
Chris@729 187 virtual bool exportLayerTo(Layer *layer, LayerGeometryProvider *provider,
Chris@724 188 MultiSelection *selectionsToWrite, // or null
Chris@721 189 QString toPath, QString &error);
Chris@729 190
Chris@654 191 void cueOSCScript(QString filename);
Chris@654 192
Chris@161 193 /// Implementation of FrameTimer interface method
Chris@634 194 sv_frame_t getFrame() const override;
Chris@161 195
Chris@357 196 void setDefaultFfwdRwdStep(RealTime step) {
Chris@357 197 m_defaultFfwdRwdStep = step;
Chris@357 198 }
Chris@357 199
Chris@483 200 void setAudioRecordMode(AudioRecordMode mode) {
Chris@483 201 m_audioRecordMode = mode;
Chris@483 202 }
Chris@483 203
Chris@45 204 signals:
Chris@45 205 // Used to toggle the availability of menu actions
Chris@45 206 void canAddPane(bool);
Chris@45 207 void canDeleteCurrentPane(bool);
Chris@45 208 void canAddLayer(bool);
Chris@45 209 void canImportMoreAudio(bool);
Chris@259 210 void canReplaceMainAudio(bool);
Chris@45 211 void canImportLayer(bool);
Chris@289 212 void canChangeSessionTemplate(bool);
Chris@45 213 void canExportAudio(bool);
Chris@45 214 void canExportLayer(bool);
Chris@45 215 void canExportImage(bool);
Chris@45 216 void canRenameLayer(bool);
Chris@45 217 void canEditLayer(bool);
Chris@146 218 void canEditLayerTabular(bool);
Chris@45 219 void canMeasureLayer(bool);
Chris@45 220 void canSelect(bool);
Chris@45 221 void canClearSelection(bool);
Chris@45 222 void canEditSelection(bool);
Chris@45 223 void canDeleteSelection(bool);
Chris@45 224 void canPaste(bool);
Chris@45 225 void canInsertInstant(bool);
Chris@45 226 void canInsertInstantsAtBoundaries(bool);
Chris@184 227 void canInsertItemAtSelection(bool);
Chris@45 228 void canRenumberInstants(bool);
Chris@537 229 void canSubdivideInstants(bool);
Chris@538 230 void canWinnowInstants(bool);
Chris@45 231 void canDeleteCurrentLayer(bool);
Chris@45 232 void canZoom(bool);
Chris@45 233 void canScroll(bool);
Chris@45 234 void canPlay(bool);
Chris@475 235 void canRecord(bool);
Chris@45 236 void canFfwd(bool);
Chris@45 237 void canRewind(bool);
Chris@45 238 void canPlaySelection(bool);
Chris@45 239 void canSpeedUpPlayback(bool);
Chris@45 240 void canSlowDownPlayback(bool);
Chris@45 241 void canChangePlaybackSpeed(bool);
Chris@73 242 void canSelectPreviousPane(bool);
Chris@73 243 void canSelectNextPane(bool);
Chris@73 244 void canSelectPreviousLayer(bool);
Chris@73 245 void canSelectNextLayer(bool);
Chris@45 246 void canSave(bool);
Chris@359 247 void canSaveAs(bool);
Chris@104 248 void hideSplash();
Chris@452 249 void hideSplash(QWidget *);
Chris@342 250 void sessionLoaded();
Chris@342 251 void audioFileLoaded();
Chris@160 252 void replacedDocument();
Chris@164 253 void activity(QString);
Chris@45 254
Chris@45 255 public slots:
Chris@45 256 virtual void preferenceChanged(PropertyContainer::PropertyName);
Chris@168 257 virtual void resizeConstrained(QSize);
Chris@556 258 virtual void recreateAudioIO();
Chris@45 259
Chris@45 260 protected slots:
Chris@45 261 virtual void zoomIn();
Chris@45 262 virtual void zoomOut();
Chris@45 263 virtual void zoomToFit();
Chris@45 264 virtual void zoomDefault();
Chris@45 265 virtual void scrollLeft();
Chris@45 266 virtual void scrollRight();
Chris@45 267 virtual void jumpLeft();
Chris@45 268 virtual void jumpRight();
Chris@162 269 virtual void peekLeft();
Chris@162 270 virtual void peekRight();
Chris@45 271
Chris@45 272 virtual void showNoOverlays();
Chris@45 273 virtual void showMinimalOverlays();
Chris@45 274 virtual void showAllOverlays();
Chris@45 275
Chris@211 276 virtual void toggleTimeRulers();
Chris@45 277 virtual void toggleZoomWheels();
Chris@45 278 virtual void togglePropertyBoxes();
Chris@45 279 virtual void toggleStatusBar();
Chris@256 280 virtual void toggleCentreLine();
Chris@45 281
Chris@45 282 virtual void play();
Chris@45 283 virtual void ffwd();
Chris@45 284 virtual void ffwdEnd();
Chris@45 285 virtual void rewind();
Chris@45 286 virtual void rewindStart();
Chris@477 287 virtual void record();
Chris@45 288 virtual void stop();
Chris@45 289
Chris@166 290 virtual void ffwdSimilar();
Chris@166 291 virtual void rewindSimilar();
Chris@166 292
Chris@45 293 virtual void deleteCurrentPane();
Chris@45 294 virtual void deleteCurrentLayer();
Chris@123 295 virtual void editCurrentLayer();
Chris@45 296
Chris@73 297 virtual void previousPane();
Chris@73 298 virtual void nextPane();
Chris@73 299 virtual void previousLayer();
Chris@73 300 virtual void nextLayer();
Chris@73 301
Chris@45 302 virtual void playLoopToggled();
Chris@45 303 virtual void playSelectionToggled();
Chris@45 304 virtual void playSoloToggled();
Chris@45 305
Chris@570 306 virtual void audioChannelCountIncreased(int count);
Chris@570 307
Chris@436 308 virtual void sampleRateMismatch(sv_samplerate_t, sv_samplerate_t, bool) = 0;
Chris@45 309 virtual void audioOverloadPluginDisabled() = 0;
Chris@130 310 virtual void audioTimeStretchMultiChannelDisabled() = 0;
Chris@45 311
Chris@435 312 virtual void playbackFrameChanged(sv_frame_t);
Chris@435 313 virtual void globalCentreFrameChanged(sv_frame_t);
Chris@435 314 virtual void viewCentreFrameChanged(View *, sv_frame_t);
Chris@624 315 virtual void viewZoomLevelChanged(View *, ZoomLevel, bool);
Chris@574 316 virtual void monitoringLevelsChanged(float, float) = 0;
Chris@485 317 virtual void recordDurationChanged(sv_frame_t, sv_samplerate_t);
Chris@45 318
Chris@45 319 virtual void currentPaneChanged(Pane *);
Chris@45 320 virtual void currentLayerChanged(Pane *, Layer *);
Chris@45 321
Chris@45 322 virtual void selectAll();
Chris@45 323 virtual void selectToStart();
Chris@45 324 virtual void selectToEnd();
Chris@45 325 virtual void selectVisible();
Chris@45 326 virtual void clearSelection();
Chris@45 327
Chris@45 328 virtual void cut();
Chris@45 329 virtual void copy();
Chris@45 330 virtual void paste();
Chris@215 331 virtual void pasteAtPlaybackPosition();
Chris@435 332 virtual void pasteRelative(sv_frame_t offset);
Chris@45 333 virtual void deleteSelected();
Chris@45 334
Chris@45 335 virtual void insertInstant();
Chris@435 336 virtual void insertInstantAt(sv_frame_t);
Chris@45 337 virtual void insertInstantsAtBoundaries();
Chris@184 338 virtual void insertItemAtSelection();
Chris@435 339 virtual void insertItemAt(sv_frame_t, sv_frame_t);
Chris@45 340 virtual void renumberInstants();
Chris@537 341 virtual void subdivideInstantsBy(int);
Chris@538 342 virtual void winnowInstantsBy(int);
Chris@45 343
Chris@45 344 virtual void documentModified();
Chris@45 345 virtual void documentRestored();
Chris@45 346
Chris@45 347 virtual void layerAdded(Layer *);
Chris@45 348 virtual void layerRemoved(Layer *);
Chris@45 349 virtual void layerAboutToBeDeleted(Layer *);
Chris@45 350 virtual void layerInAView(Layer *, bool);
Chris@45 351
Chris@684 352 virtual void mainModelChanged(ModelId);
Chris@684 353 virtual void modelAdded(ModelId);
Chris@45 354
Chris@45 355 virtual void updateMenuStates();
Chris@45 356 virtual void updateDescriptionLabel() = 0;
Chris@669 357 virtual void updateWindowTitle();
Chris@45 358
Chris@78 359 virtual void modelGenerationFailed(QString, QString) = 0;
Chris@78 360 virtual void modelGenerationWarning(QString, QString) = 0;
Chris@78 361 virtual void modelRegenerationFailed(QString, QString, QString) = 0;
Chris@78 362 virtual void modelRegenerationWarning(QString, QString, QString) = 0;
Chris@429 363
Chris@684 364 virtual void alignmentComplete(ModelId);
Chris@420 365 virtual void alignmentFailed(QString) = 0;
Chris@45 366
Chris@45 367 virtual void rightButtonMenuRequested(Pane *, QPoint point) = 0;
Chris@45 368
Chris@45 369 virtual void paneAdded(Pane *) = 0;
Chris@45 370 virtual void paneHidden(Pane *) = 0;
Chris@45 371 virtual void paneAboutToBeDeleted(Pane *) = 0;
Chris@45 372 virtual void paneDropAccepted(Pane *, QStringList) = 0;
Chris@45 373 virtual void paneDropAccepted(Pane *, QString) = 0;
Chris@55 374 virtual void paneDeleteButtonClicked(Pane *);
Chris@45 375
Chris@113 376 virtual void oscReady();
Chris@45 377 virtual void pollOSC();
Chris@654 378 virtual void oscScriptFinished();
Chris@45 379
Chris@45 380 virtual void contextHelpChanged(const QString &);
Chris@45 381 virtual void inProgressSelectionChanged();
Chris@45 382
Chris@141 383 virtual FileOpenStatus openSessionFromRDF(FileSource source);
Chris@145 384 virtual FileOpenStatus openLayersFromRDF(FileSource source);
Chris@141 385
Chris@45 386 virtual void closeSession() = 0;
Chris@45 387
Chris@452 388 virtual void emitHideSplash();
Chris@452 389
Chris@180 390 virtual void newerVersionAvailable(QString) { }
Chris@180 391
Chris@354 392 virtual void menuActionMapperInvoked(QObject *);
Chris@354 393
Chris@45 394 protected:
Chris@669 395 QString m_sessionFile;
Chris@669 396 QString m_audioFile;
Chris@669 397 Document *m_document;
Chris@45 398
Chris@669 399 // This is used in the window title. It's the upstream location
Chris@669 400 // (maybe a URL) the user provided as source of the main model. It
Chris@669 401 // should be set in cases where there is no current session file
Chris@669 402 // and m_sessionFile is empty, or where a new main model has been
Chris@669 403 // imported into an existing session. It should be used only for
Chris@669 404 // user presentation, never parsed - treat it as an opaque label
Chris@669 405 QString m_originalLocation;
Chris@45 406
Chris@669 407 PaneStack *m_paneStack;
Chris@669 408 ViewManager *m_viewManager;
Chris@669 409 Layer *m_timeRulerLayer;
Chris@669 410
Chris@714 411 AudioMode m_audioMode;
Chris@714 412 MIDIMode m_midiMode;
Chris@475 413
Chris@45 414 AudioCallbackPlaySource *m_playSource;
Chris@574 415 AudioCallbackRecordTarget *m_recordTarget;
Chris@475 416 breakfastquay::SystemPlaybackTarget *m_playTarget; // only one of this...
Chris@475 417 breakfastquay::SystemAudioIO *m_audioIO; // ... and this exists
Chris@45 418
Chris@113 419 class OSCQueueStarter : public QThread
Chris@113 420 {
Chris@113 421 public:
Chris@658 422 OSCQueueStarter(MainWindowBase *mwb, bool withNetworkPort) :
Chris@658 423 QThread(mwb), m_mwb(mwb), m_withPort(withNetworkPort) { }
Chris@658 424
Chris@634 425 void run() override {
Chris@658 426 // NB creating the queue object can take a long time
Chris@658 427 OSCQueue *queue = new OSCQueue(m_withPort);
Chris@113 428 m_mwb->m_oscQueue = queue;
Chris@113 429 }
Chris@658 430
Chris@113 431 private:
Chris@113 432 MainWindowBase *m_mwb;
Chris@658 433 bool m_withPort;
Chris@113 434 };
Chris@113 435
Chris@45 436 OSCQueue *m_oscQueue;
Chris@113 437 OSCQueueStarter *m_oscQueueStarter;
Chris@654 438 OSCScript *m_oscScript;
Chris@654 439 QString m_oscScriptFile;
Chris@654 440
Chris@658 441 void startOSCQueue(bool withNetworkPort);
Chris@654 442 void startOSCScript();
Chris@45 443
Chris@157 444 MIDIInput *m_midiInput;
Chris@157 445
Chris@45 446 RecentFiles m_recentFiles;
Chris@54 447 RecentFiles m_recentTransforms;
Chris@45 448
Chris@45 449 bool m_documentModified;
Chris@45 450 bool m_openingAudioFile;
Chris@45 451
Chris@45 452 Labeller *m_labeller;
Chris@45 453
Chris@45 454 int m_lastPlayStatusSec;
Chris@45 455 mutable QString m_myStatusMessage;
Chris@45 456
Chris@45 457 bool m_initialDarkBackground;
Chris@45 458
Chris@357 459 RealTime m_defaultFfwdRwdStep;
Chris@357 460
Chris@483 461 AudioRecordMode m_audioRecordMode;
Chris@571 462
Chris@378 463 mutable QLabel *m_statusLabel;
Chris@378 464 QLabel *getStatusLabel() const;
Chris@378 465
Chris@685 466 ModelId getMainModelId() const;
Chris@685 467 std::shared_ptr<WaveFileModel> getMainModel() const;
Chris@45 468 void createDocument();
Chris@45 469
Chris@604 470 FileOpenStatus addOpenedAudioModel(FileSource source,
Chris@684 471 ModelId model,
Chris@604 472 AudioFileOpenMode mode,
Chris@604 473 QString templateName,
Chris@604 474 bool registerSource);
Chris@604 475
Chris@597 476 sv_frame_t getModelsStartFrame() const; // earliest across all views
Chris@597 477 sv_frame_t getModelsEndFrame() const; // latest across all views
Chris@597 478
Chris@45 479 Pane *addPaneToStack();
Chris@45 480 Layer *getSnapLayer() const;
Chris@45 481
Chris@126 482 typedef std::map<Layer *, QPointer<ModelDataTableDialog> > LayerDataDialogMap;
Chris@126 483 typedef std::set<QPointer<ModelDataTableDialog> > DataDialogSet;
Chris@123 484 typedef std::map<View *, DataDialogSet> ViewDataDialogMap;
Chris@123 485
Chris@123 486 LayerDataDialogMap m_layerDataDialogMap;
Chris@123 487 ViewDataDialogMap m_viewDataDialogMap;
Chris@123 488
Chris@128 489 void removeLayerEditDialog(Layer *);
Chris@128 490
Chris@45 491 class PaneCallback : public SVFileReaderPaneCallback
Chris@45 492 {
Chris@45 493 public:
Chris@595 494 PaneCallback(MainWindowBase *mw) : m_mw(mw) { }
Chris@634 495 Pane *addPane() override { return m_mw->addPaneToStack(); }
Chris@634 496 void setWindowSize(int width, int height) override {
Chris@595 497 m_mw->resizeConstrained(QSize(width, height));
Chris@595 498 }
Chris@634 499 void addSelection(sv_frame_t start, sv_frame_t end) override {
Chris@595 500 m_mw->m_viewManager->addSelectionQuietly(Selection(start, end));
Chris@595 501 }
Chris@45 502 protected:
Chris@595 503 MainWindowBase *m_mw;
Chris@45 504 };
Chris@45 505
Chris@45 506 class AddPaneCommand : public Command
Chris@45 507 {
Chris@45 508 public:
Chris@595 509 AddPaneCommand(MainWindowBase *mw);
Chris@595 510 virtual ~AddPaneCommand();
Chris@595 511
Chris@634 512 void execute() override;
Chris@634 513 void unexecute() override;
Chris@634 514 QString getName() const override;
Chris@45 515
Chris@595 516 Pane *getPane() { return m_pane; }
Chris@45 517
Chris@45 518 protected:
Chris@595 519 MainWindowBase *m_mw;
Chris@595 520 Pane *m_pane; // Main window owns this, but I determine its lifespan
Chris@595 521 Pane *m_prevCurrentPane; // I don't own this
Chris@595 522 bool m_added;
Chris@45 523 };
Chris@45 524
Chris@45 525 class RemovePaneCommand : public Command
Chris@45 526 {
Chris@45 527 public:
Chris@595 528 RemovePaneCommand(MainWindowBase *mw, Pane *pane);
Chris@595 529 virtual ~RemovePaneCommand();
Chris@595 530
Chris@634 531 void execute() override;
Chris@634 532 void unexecute() override;
Chris@634 533 QString getName() const override;
Chris@45 534
Chris@45 535 protected:
Chris@595 536 MainWindowBase *m_mw;
Chris@595 537 Pane *m_pane; // Main window owns this, but I determine its lifespan
Chris@595 538 Pane *m_prevCurrentPane; // I don't own this
Chris@595 539 bool m_added;
Chris@45 540 };
Chris@45 541
Chris@45 542 virtual bool checkSaveModified() = 0;
Chris@45 543
Chris@45 544 virtual QString getOpenFileName(FileFinder::FileType type);
Chris@45 545 virtual QString getSaveFileName(FileFinder::FileType type);
Chris@45 546 virtual void registerLastOpenedFilePath(FileFinder::FileType type, QString path);
Chris@45 547
Chris@222 548 virtual QString getDefaultSessionTemplate() const;
Chris@251 549 virtual void setDefaultSessionTemplate(QString);
Chris@222 550
Chris@577 551 virtual void findTimeRulerLayer();
Chris@577 552
Chris@475 553 virtual void createAudioIO();
Chris@556 554 virtual void deleteAudioIO();
Chris@556 555
Chris@45 556 virtual void openHelpUrl(QString url);
Chris@483 557 virtual void openLocalFolder(QString path);
Chris@45 558
Chris@45 559 virtual void setupMenus() = 0;
Chris@45 560 virtual void updateVisibleRangeDisplay(Pane *p) const = 0;
Chris@187 561 virtual void updatePositionStatusDisplays() const = 0;
Chris@45 562
Chris@354 563 // Call this after setting up the menu bar, to fix up single-key
Chris@426 564 // shortcuts on OS/X and do any other platform-specific tidying
Chris@354 565 virtual void finaliseMenus();
Chris@354 566 virtual void finaliseMenu(QMenu *);
Chris@394 567
Chris@426 568 // Call before finaliseMenus if you wish to have a say in this question
Chris@426 569 void setIconsVisibleInMenus(bool visible) { m_iconsVisibleInMenus = visible; }
Chris@426 570 bool m_iconsVisibleInMenus;
Chris@426 571
Chris@394 572 // Only used on OS/X to work around a Qt/Cocoa bug, see finaliseMenus
Chris@391 573 QSignalMapper *m_menuShortcutMapper;
Chris@391 574 QList<QShortcut *> m_appShortcuts;
Chris@354 575
Chris@147 576 virtual bool shouldCreateNewSessionForRDFAudio(bool *) { return true; }
Chris@145 577
Chris@128 578 virtual void connectLayerEditDialog(ModelDataTableDialog *dialog);
Chris@128 579
Chris@226 580 virtual void toXml(QTextStream &stream, bool asTemplate);
Chris@45 581 };
Chris@45 582
Chris@45 583
Chris@45 584 #endif