annotate framework/MainWindowBase.h @ 332:151b7c5864e3 tonioni

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