annotate framework/MainWindowBase.h @ 736:4b58b8f44be7

If a file that looks like audio can't be opened as audio, fail immediately - don't go trying to open .wav files or whatever as sessions or annotations. That only means the error shown to the user is less helpful.
author Chris Cannam
date Wed, 05 Feb 2020 10:45:03 +0000
parents 15da3ab3d416
children 48001ed9143b 7b1d30af4b38
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@574 53 class AudioCallbackRecordTarget;
Chris@45 54 class CommandHistory;
Chris@45 55 class QMenu;
Chris@45 56 class AudioDial;
Chris@541 57 class LevelPanWidget;
Chris@565 58 class LevelPanToolButton;
Chris@45 59 class QLabel;
Chris@45 60 class QCheckBox;
Chris@45 61 class PreferencesDialog;
Chris@45 62 class QTreeView;
Chris@45 63 class QPushButton;
Chris@45 64 class OSCMessage;
Chris@654 65 class OSCScript;
Chris@157 66 class MIDIInput;
Chris@45 67 class KeyReference;
Chris@45 68 class Labeller;
Chris@123 69 class ModelDataTableDialog;
Chris@391 70 class QSignalMapper;
Chris@391 71 class QShortcut;
Chris@429 72 class AlignmentModel;
Chris@729 73 class LayerGeometryProvider;
Chris@45 74
Chris@468 75 namespace breakfastquay {
Chris@551 76 class SystemPlaybackTarget;
Chris@551 77 class SystemAudioIO;
Chris@551 78 class ResamplerWrapper;
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@551 416 breakfastquay::ResamplerWrapper *m_resamplerWrapper;
Chris@475 417 breakfastquay::SystemPlaybackTarget *m_playTarget; // only one of this...
Chris@475 418 breakfastquay::SystemAudioIO *m_audioIO; // ... and this exists
Chris@45 419
Chris@113 420 class OSCQueueStarter : public QThread
Chris@113 421 {
Chris@113 422 public:
Chris@658 423 OSCQueueStarter(MainWindowBase *mwb, bool withNetworkPort) :
Chris@658 424 QThread(mwb), m_mwb(mwb), m_withPort(withNetworkPort) { }
Chris@658 425
Chris@634 426 void run() override {
Chris@658 427 // NB creating the queue object can take a long time
Chris@658 428 OSCQueue *queue = new OSCQueue(m_withPort);
Chris@113 429 m_mwb->m_oscQueue = queue;
Chris@113 430 }
Chris@658 431
Chris@113 432 private:
Chris@113 433 MainWindowBase *m_mwb;
Chris@658 434 bool m_withPort;
Chris@113 435 };
Chris@113 436
Chris@45 437 OSCQueue *m_oscQueue;
Chris@113 438 OSCQueueStarter *m_oscQueueStarter;
Chris@654 439 OSCScript *m_oscScript;
Chris@654 440 QString m_oscScriptFile;
Chris@654 441
Chris@658 442 void startOSCQueue(bool withNetworkPort);
Chris@654 443 void startOSCScript();
Chris@45 444
Chris@157 445 MIDIInput *m_midiInput;
Chris@157 446
Chris@45 447 RecentFiles m_recentFiles;
Chris@54 448 RecentFiles m_recentTransforms;
Chris@45 449
Chris@45 450 bool m_documentModified;
Chris@45 451 bool m_openingAudioFile;
Chris@45 452
Chris@45 453 Labeller *m_labeller;
Chris@45 454
Chris@45 455 int m_lastPlayStatusSec;
Chris@45 456 mutable QString m_myStatusMessage;
Chris@45 457
Chris@45 458 bool m_initialDarkBackground;
Chris@45 459
Chris@357 460 RealTime m_defaultFfwdRwdStep;
Chris@357 461
Chris@483 462 AudioRecordMode m_audioRecordMode;
Chris@571 463
Chris@378 464 mutable QLabel *m_statusLabel;
Chris@378 465 QLabel *getStatusLabel() const;
Chris@378 466
Chris@685 467 ModelId getMainModelId() const;
Chris@685 468 std::shared_ptr<WaveFileModel> getMainModel() const;
Chris@45 469 void createDocument();
Chris@45 470
Chris@604 471 FileOpenStatus addOpenedAudioModel(FileSource source,
Chris@684 472 ModelId model,
Chris@604 473 AudioFileOpenMode mode,
Chris@604 474 QString templateName,
Chris@604 475 bool registerSource);
Chris@604 476
Chris@597 477 sv_frame_t getModelsStartFrame() const; // earliest across all views
Chris@597 478 sv_frame_t getModelsEndFrame() const; // latest across all views
Chris@597 479
Chris@45 480 Pane *addPaneToStack();
Chris@45 481 Layer *getSnapLayer() const;
Chris@45 482
Chris@126 483 typedef std::map<Layer *, QPointer<ModelDataTableDialog> > LayerDataDialogMap;
Chris@126 484 typedef std::set<QPointer<ModelDataTableDialog> > DataDialogSet;
Chris@123 485 typedef std::map<View *, DataDialogSet> ViewDataDialogMap;
Chris@123 486
Chris@123 487 LayerDataDialogMap m_layerDataDialogMap;
Chris@123 488 ViewDataDialogMap m_viewDataDialogMap;
Chris@123 489
Chris@128 490 void removeLayerEditDialog(Layer *);
Chris@128 491
Chris@45 492 class PaneCallback : public SVFileReaderPaneCallback
Chris@45 493 {
Chris@45 494 public:
Chris@595 495 PaneCallback(MainWindowBase *mw) : m_mw(mw) { }
Chris@634 496 Pane *addPane() override { return m_mw->addPaneToStack(); }
Chris@634 497 void setWindowSize(int width, int height) override {
Chris@595 498 m_mw->resizeConstrained(QSize(width, height));
Chris@595 499 }
Chris@634 500 void addSelection(sv_frame_t start, sv_frame_t end) override {
Chris@595 501 m_mw->m_viewManager->addSelectionQuietly(Selection(start, end));
Chris@595 502 }
Chris@45 503 protected:
Chris@595 504 MainWindowBase *m_mw;
Chris@45 505 };
Chris@45 506
Chris@45 507 class AddPaneCommand : public Command
Chris@45 508 {
Chris@45 509 public:
Chris@595 510 AddPaneCommand(MainWindowBase *mw);
Chris@595 511 virtual ~AddPaneCommand();
Chris@595 512
Chris@634 513 void execute() override;
Chris@634 514 void unexecute() override;
Chris@634 515 QString getName() const override;
Chris@45 516
Chris@595 517 Pane *getPane() { return m_pane; }
Chris@45 518
Chris@45 519 protected:
Chris@595 520 MainWindowBase *m_mw;
Chris@595 521 Pane *m_pane; // Main window owns this, but I determine its lifespan
Chris@595 522 Pane *m_prevCurrentPane; // I don't own this
Chris@595 523 bool m_added;
Chris@45 524 };
Chris@45 525
Chris@45 526 class RemovePaneCommand : public Command
Chris@45 527 {
Chris@45 528 public:
Chris@595 529 RemovePaneCommand(MainWindowBase *mw, Pane *pane);
Chris@595 530 virtual ~RemovePaneCommand();
Chris@595 531
Chris@634 532 void execute() override;
Chris@634 533 void unexecute() override;
Chris@634 534 QString getName() const override;
Chris@45 535
Chris@45 536 protected:
Chris@595 537 MainWindowBase *m_mw;
Chris@595 538 Pane *m_pane; // Main window owns this, but I determine its lifespan
Chris@595 539 Pane *m_prevCurrentPane; // I don't own this
Chris@595 540 bool m_added;
Chris@45 541 };
Chris@45 542
Chris@45 543 virtual bool checkSaveModified() = 0;
Chris@45 544
Chris@45 545 virtual QString getOpenFileName(FileFinder::FileType type);
Chris@45 546 virtual QString getSaveFileName(FileFinder::FileType type);
Chris@45 547 virtual void registerLastOpenedFilePath(FileFinder::FileType type, QString path);
Chris@45 548
Chris@222 549 virtual QString getDefaultSessionTemplate() const;
Chris@251 550 virtual void setDefaultSessionTemplate(QString);
Chris@222 551
Chris@577 552 virtual void findTimeRulerLayer();
Chris@577 553
Chris@475 554 virtual void createAudioIO();
Chris@556 555 virtual void deleteAudioIO();
Chris@556 556
Chris@45 557 virtual void openHelpUrl(QString url);
Chris@483 558 virtual void openLocalFolder(QString path);
Chris@45 559
Chris@45 560 virtual void setupMenus() = 0;
Chris@45 561 virtual void updateVisibleRangeDisplay(Pane *p) const = 0;
Chris@187 562 virtual void updatePositionStatusDisplays() const = 0;
Chris@45 563
Chris@354 564 // Call this after setting up the menu bar, to fix up single-key
Chris@426 565 // shortcuts on OS/X and do any other platform-specific tidying
Chris@354 566 virtual void finaliseMenus();
Chris@354 567 virtual void finaliseMenu(QMenu *);
Chris@394 568
Chris@426 569 // Call before finaliseMenus if you wish to have a say in this question
Chris@426 570 void setIconsVisibleInMenus(bool visible) { m_iconsVisibleInMenus = visible; }
Chris@426 571 bool m_iconsVisibleInMenus;
Chris@426 572
Chris@394 573 // Only used on OS/X to work around a Qt/Cocoa bug, see finaliseMenus
Chris@391 574 QSignalMapper *m_menuShortcutMapper;
Chris@391 575 QList<QShortcut *> m_appShortcuts;
Chris@354 576
Chris@147 577 virtual bool shouldCreateNewSessionForRDFAudio(bool *) { return true; }
Chris@145 578
Chris@128 579 virtual void connectLayerEditDialog(ModelDataTableDialog *dialog);
Chris@128 580
Chris@226 581 virtual void toXml(QTextStream &stream, bool asTemplate);
Chris@45 582 };
Chris@45 583
Chris@45 584
Chris@45 585 #endif