annotate framework/MainWindowBase.h @ 725:16f6737fa557 spectrogram-export

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