annotate framework/MainWindowBase.h @ 403:eb84b06301da

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