annotate framework/MainWindowBase.h @ 180:84b2c1a4984a

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