annotate framework/MainWindowBase.h @ 304:c837368b1faf

Remove OSC option from constructor -- call startOSCQueue() after construction if you want it. This needs to be handled this way in SV because we need to ask for network permission before opening the OSC port (that's the thing that gets the app blocked by e.g. Windows Firewall).
author Chris Cannam
date Thu, 12 Dec 2013 15:20:14 +0000
parents 2925a4bbca5e
children b3609adae921
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@304 78 MainWindowBase(bool withAudioOutput, 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@304 312 void startOSCQueue();
Chris@45 313
Chris@157 314 MIDIInput *m_midiInput;
Chris@157 315
Chris@45 316 RecentFiles m_recentFiles;
Chris@54 317 RecentFiles m_recentTransforms;
Chris@45 318
Chris@45 319 bool m_documentModified;
Chris@45 320 bool m_openingAudioFile;
Chris@45 321 bool m_abandoning;
Chris@45 322
Chris@45 323 Labeller *m_labeller;
Chris@45 324
Chris@45 325 int m_lastPlayStatusSec;
Chris@45 326 mutable QString m_myStatusMessage;
Chris@45 327
Chris@45 328 bool m_initialDarkBackground;
Chris@45 329
Chris@45 330 WaveFileModel *getMainModel();
Chris@45 331 const WaveFileModel *getMainModel() const;
Chris@45 332 void createDocument();
Chris@45 333
Chris@45 334 Pane *addPaneToStack();
Chris@45 335 Layer *getSnapLayer() const;
Chris@45 336
Chris@126 337 typedef std::map<Layer *, QPointer<ModelDataTableDialog> > LayerDataDialogMap;
Chris@126 338 typedef std::set<QPointer<ModelDataTableDialog> > DataDialogSet;
Chris@123 339 typedef std::map<View *, DataDialogSet> ViewDataDialogMap;
Chris@123 340
Chris@123 341 LayerDataDialogMap m_layerDataDialogMap;
Chris@123 342 ViewDataDialogMap m_viewDataDialogMap;
Chris@123 343
Chris@128 344 void removeLayerEditDialog(Layer *);
Chris@128 345
Chris@45 346 class PaneCallback : public SVFileReaderPaneCallback
Chris@45 347 {
Chris@45 348 public:
Chris@45 349 PaneCallback(MainWindowBase *mw) : m_mw(mw) { }
Chris@45 350 virtual Pane *addPane() { return m_mw->addPaneToStack(); }
Chris@45 351 virtual void setWindowSize(int width, int height) {
Chris@168 352 m_mw->resizeConstrained(QSize(width, height));
Chris@45 353 }
Chris@45 354 virtual void addSelection(int start, int end) {
Chris@45 355 m_mw->m_viewManager->addSelection(Selection(start, end));
Chris@45 356 }
Chris@45 357 protected:
Chris@45 358 MainWindowBase *m_mw;
Chris@45 359 };
Chris@45 360
Chris@45 361 class AddPaneCommand : public Command
Chris@45 362 {
Chris@45 363 public:
Chris@45 364 AddPaneCommand(MainWindowBase *mw);
Chris@45 365 virtual ~AddPaneCommand();
Chris@45 366
Chris@45 367 virtual void execute();
Chris@45 368 virtual void unexecute();
Chris@45 369 virtual QString getName() const;
Chris@45 370
Chris@45 371 Pane *getPane() { return m_pane; }
Chris@45 372
Chris@45 373 protected:
Chris@45 374 MainWindowBase *m_mw;
Chris@45 375 Pane *m_pane; // Main window owns this, but I determine its lifespan
Chris@45 376 Pane *m_prevCurrentPane; // I don't own this
Chris@45 377 bool m_added;
Chris@45 378 };
Chris@45 379
Chris@45 380 class RemovePaneCommand : public Command
Chris@45 381 {
Chris@45 382 public:
Chris@45 383 RemovePaneCommand(MainWindowBase *mw, Pane *pane);
Chris@45 384 virtual ~RemovePaneCommand();
Chris@45 385
Chris@45 386 virtual void execute();
Chris@45 387 virtual void unexecute();
Chris@45 388 virtual QString getName() const;
Chris@45 389
Chris@45 390 protected:
Chris@45 391 MainWindowBase *m_mw;
Chris@45 392 Pane *m_pane; // Main window owns this, but I determine its lifespan
Chris@45 393 Pane *m_prevCurrentPane; // I don't own this
Chris@45 394 bool m_added;
Chris@45 395 };
Chris@45 396
Chris@45 397 virtual bool checkSaveModified() = 0;
Chris@45 398
Chris@45 399 virtual QString getOpenFileName(FileFinder::FileType type);
Chris@45 400 virtual QString getSaveFileName(FileFinder::FileType type);
Chris@45 401 virtual void registerLastOpenedFilePath(FileFinder::FileType type, QString path);
Chris@45 402
Chris@222 403 virtual QString getDefaultSessionTemplate() const;
Chris@251 404 virtual void setDefaultSessionTemplate(QString);
Chris@222 405
Chris@45 406 virtual void createPlayTarget();
Chris@45 407 virtual void openHelpUrl(QString url);
Chris@45 408
Chris@45 409 virtual void setupMenus() = 0;
Chris@45 410 virtual void updateVisibleRangeDisplay(Pane *p) const = 0;
Chris@187 411 virtual void updatePositionStatusDisplays() const = 0;
Chris@45 412
Chris@147 413 virtual bool shouldCreateNewSessionForRDFAudio(bool *) { return true; }
Chris@145 414
Chris@128 415 virtual void connectLayerEditDialog(ModelDataTableDialog *dialog);
Chris@128 416
Chris@226 417 virtual void toXml(QTextStream &stream, bool asTemplate);
Chris@45 418 };
Chris@45 419
Chris@45 420
Chris@45 421 #endif