annotate framework/MainWindowBase.h @ 141:9a8c73ffdce0

* Make it possible to import an entire session from an RDF document. However, at the moment the timings of events appear to be constrained by how far the audio decoder has got through its audio file at the time the event is queried -- need to investigate.
author Chris Cannam
date Fri, 21 Nov 2008 18:03:14 +0000
parents 4c9c04645685
children 937456ffe33e
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@45 30 #include "layer/LayerFactory.h"
Chris@106 31 #include "transform/Transform.h"
Chris@46 32 #include "SVFileReader.h"
Chris@109 33 #include "widgets/FileFinder.h"
Chris@45 34 #include "data/fileio/FileSource.h"
Chris@113 35 #include "data/osc/OSCQueue.h"
Chris@45 36 #include <map>
Chris@45 37
Chris@45 38 class Document;
Chris@45 39 class PaneStack;
Chris@45 40 class Pane;
Chris@45 41 class View;
Chris@45 42 class Fader;
Chris@45 43 class Overview;
Chris@45 44 class Layer;
Chris@45 45 class WaveformLayer;
Chris@45 46 class WaveFileModel;
Chris@45 47 class AudioCallbackPlaySource;
Chris@45 48 class AudioCallbackPlayTarget;
Chris@45 49 class CommandHistory;
Chris@45 50 class QMenu;
Chris@45 51 class AudioDial;
Chris@45 52 class QLabel;
Chris@45 53 class QCheckBox;
Chris@45 54 class PreferencesDialog;
Chris@45 55 class QTreeView;
Chris@45 56 class QPushButton;
Chris@45 57 class OSCMessage;
Chris@45 58 class KeyReference;
Chris@45 59 class Labeller;
Chris@123 60 class ModelDataTableDialog;
Chris@45 61
Chris@45 62 /**
Chris@45 63 * The base class for the SV main window. This includes everything to
Chris@45 64 * do with general document and pane stack management, but nothing
Chris@45 65 * that involves user interaction -- this doesn't create the widget or
Chris@45 66 * menu structures or editing tools, and if a function needs to open a
Chris@45 67 * dialog, it shouldn't be in here. This permits "variations on SV"
Chris@45 68 * to use different subclasses retaining the same general structure.
Chris@45 69 */
Chris@45 70
Chris@45 71 class MainWindowBase : public QMainWindow
Chris@45 72 {
Chris@45 73 Q_OBJECT
Chris@45 74
Chris@45 75 public:
Chris@45 76 MainWindowBase(bool withAudioOutput, bool withOSCSupport);
Chris@45 77 virtual ~MainWindowBase();
Chris@45 78
Chris@45 79 enum AudioFileOpenMode {
Chris@45 80 ReplaceMainModel,
Chris@45 81 CreateAdditionalModel,
Chris@45 82 ReplaceCurrentPane,
Chris@45 83 AskUser
Chris@45 84 };
Chris@45 85
Chris@45 86 enum FileOpenStatus {
Chris@45 87 FileOpenSucceeded,
Chris@45 88 FileOpenFailed,
Chris@45 89 FileOpenCancelled,
Chris@45 90 FileOpenWrongMode // attempted to open layer when no main model present
Chris@45 91 };
Chris@45 92
Chris@45 93 virtual FileOpenStatus open(QString fileOrUrl, AudioFileOpenMode = AskUser);
Chris@45 94 virtual FileOpenStatus open(FileSource source, AudioFileOpenMode = AskUser);
Chris@45 95
Chris@45 96 virtual FileOpenStatus openAudio(FileSource source, AudioFileOpenMode = AskUser);
Chris@45 97 virtual FileOpenStatus openPlaylist(FileSource source, AudioFileOpenMode = AskUser);
Chris@45 98 virtual FileOpenStatus openLayer(FileSource source);
Chris@45 99 virtual FileOpenStatus openImage(FileSource source);
Chris@45 100
Chris@45 101 virtual FileOpenStatus openSessionFile(QString fileOrUrl);
Chris@45 102 virtual FileOpenStatus openSession(FileSource source);
Chris@45 103
Chris@45 104 virtual bool saveSessionFile(QString path);
Chris@45 105
Chris@45 106 signals:
Chris@45 107 // Used to toggle the availability of menu actions
Chris@45 108 void canAddPane(bool);
Chris@45 109 void canDeleteCurrentPane(bool);
Chris@45 110 void canAddLayer(bool);
Chris@45 111 void canImportMoreAudio(bool);
Chris@45 112 void canImportLayer(bool);
Chris@45 113 void canExportAudio(bool);
Chris@45 114 void canExportLayer(bool);
Chris@45 115 void canExportImage(bool);
Chris@45 116 void canRenameLayer(bool);
Chris@45 117 void canEditLayer(bool);
Chris@45 118 void canMeasureLayer(bool);
Chris@45 119 void canSelect(bool);
Chris@45 120 void canClearSelection(bool);
Chris@45 121 void canEditSelection(bool);
Chris@45 122 void canDeleteSelection(bool);
Chris@45 123 void canPaste(bool);
Chris@45 124 void canInsertInstant(bool);
Chris@45 125 void canInsertInstantsAtBoundaries(bool);
Chris@45 126 void canRenumberInstants(bool);
Chris@45 127 void canDeleteCurrentLayer(bool);
Chris@45 128 void canZoom(bool);
Chris@45 129 void canScroll(bool);
Chris@45 130 void canPlay(bool);
Chris@45 131 void canFfwd(bool);
Chris@45 132 void canRewind(bool);
Chris@45 133 void canPlaySelection(bool);
Chris@45 134 void canSpeedUpPlayback(bool);
Chris@45 135 void canSlowDownPlayback(bool);
Chris@45 136 void canChangePlaybackSpeed(bool);
Chris@73 137 void canSelectPreviousPane(bool);
Chris@73 138 void canSelectNextPane(bool);
Chris@73 139 void canSelectPreviousLayer(bool);
Chris@73 140 void canSelectNextLayer(bool);
Chris@45 141 void canSave(bool);
Chris@104 142 void hideSplash();
Chris@45 143
Chris@45 144 public slots:
Chris@45 145 virtual void preferenceChanged(PropertyContainer::PropertyName);
Chris@45 146
Chris@45 147 protected slots:
Chris@45 148 virtual void zoomIn();
Chris@45 149 virtual void zoomOut();
Chris@45 150 virtual void zoomToFit();
Chris@45 151 virtual void zoomDefault();
Chris@45 152 virtual void scrollLeft();
Chris@45 153 virtual void scrollRight();
Chris@45 154 virtual void jumpLeft();
Chris@45 155 virtual void jumpRight();
Chris@45 156
Chris@45 157 virtual void showNoOverlays();
Chris@45 158 virtual void showMinimalOverlays();
Chris@45 159 virtual void showStandardOverlays();
Chris@45 160 virtual void showAllOverlays();
Chris@45 161
Chris@45 162 virtual void toggleZoomWheels();
Chris@45 163 virtual void togglePropertyBoxes();
Chris@45 164 virtual void toggleStatusBar();
Chris@45 165
Chris@45 166 virtual void play();
Chris@45 167 virtual void ffwd();
Chris@45 168 virtual void ffwdEnd();
Chris@45 169 virtual void rewind();
Chris@45 170 virtual void rewindStart();
Chris@45 171 virtual void stop();
Chris@45 172
Chris@45 173 virtual void deleteCurrentPane();
Chris@45 174 virtual void deleteCurrentLayer();
Chris@123 175 virtual void editCurrentLayer();
Chris@45 176
Chris@73 177 virtual void previousPane();
Chris@73 178 virtual void nextPane();
Chris@73 179 virtual void previousLayer();
Chris@73 180 virtual void nextLayer();
Chris@73 181
Chris@45 182 virtual void playLoopToggled();
Chris@45 183 virtual void playSelectionToggled();
Chris@45 184 virtual void playSoloToggled();
Chris@45 185
Chris@45 186 virtual void sampleRateMismatch(size_t, size_t, bool) = 0;
Chris@45 187 virtual void audioOverloadPluginDisabled() = 0;
Chris@130 188 virtual void audioTimeStretchMultiChannelDisabled() = 0;
Chris@45 189
Chris@45 190 virtual void playbackFrameChanged(unsigned long);
Chris@45 191 virtual void globalCentreFrameChanged(unsigned long);
Chris@45 192 virtual void viewCentreFrameChanged(View *, unsigned long);
Chris@45 193 virtual void viewZoomLevelChanged(View *, unsigned long, bool);
Chris@45 194 virtual void outputLevelsChanged(float, float) = 0;
Chris@45 195
Chris@45 196 virtual void currentPaneChanged(Pane *);
Chris@45 197 virtual void currentLayerChanged(Pane *, Layer *);
Chris@45 198
Chris@45 199 virtual void selectAll();
Chris@45 200 virtual void selectToStart();
Chris@45 201 virtual void selectToEnd();
Chris@45 202 virtual void selectVisible();
Chris@45 203 virtual void clearSelection();
Chris@45 204
Chris@45 205 virtual void cut();
Chris@45 206 virtual void copy();
Chris@45 207 virtual void paste();
Chris@45 208 virtual void deleteSelected();
Chris@45 209
Chris@45 210 virtual void insertInstant();
Chris@45 211 virtual void insertInstantAt(size_t);
Chris@45 212 virtual void insertInstantsAtBoundaries();
Chris@45 213 virtual void renumberInstants();
Chris@45 214
Chris@45 215 virtual void documentModified();
Chris@45 216 virtual void documentRestored();
Chris@45 217
Chris@45 218 virtual void layerAdded(Layer *);
Chris@45 219 virtual void layerRemoved(Layer *);
Chris@45 220 virtual void layerAboutToBeDeleted(Layer *);
Chris@45 221 virtual void layerInAView(Layer *, bool);
Chris@45 222
Chris@45 223 virtual void mainModelChanged(WaveFileModel *);
Chris@45 224 virtual void modelAdded(Model *);
Chris@45 225 virtual void modelAboutToBeDeleted(Model *);
Chris@45 226
Chris@45 227 virtual void updateMenuStates();
Chris@45 228 virtual void updateDescriptionLabel() = 0;
Chris@45 229
Chris@78 230 virtual void modelGenerationFailed(QString, QString) = 0;
Chris@78 231 virtual void modelGenerationWarning(QString, QString) = 0;
Chris@78 232 virtual void modelRegenerationFailed(QString, QString, QString) = 0;
Chris@78 233 virtual void modelRegenerationWarning(QString, QString, QString) = 0;
Chris@78 234 virtual void alignmentFailed(QString, QString) = 0;
Chris@45 235
Chris@45 236 virtual void rightButtonMenuRequested(Pane *, QPoint point) = 0;
Chris@45 237
Chris@45 238 virtual void paneAdded(Pane *) = 0;
Chris@45 239 virtual void paneHidden(Pane *) = 0;
Chris@45 240 virtual void paneAboutToBeDeleted(Pane *) = 0;
Chris@45 241 virtual void paneDropAccepted(Pane *, QStringList) = 0;
Chris@45 242 virtual void paneDropAccepted(Pane *, QString) = 0;
Chris@55 243 virtual void paneDeleteButtonClicked(Pane *);
Chris@45 244
Chris@113 245 virtual void oscReady();
Chris@45 246 virtual void pollOSC();
Chris@45 247 virtual void handleOSCMessage(const OSCMessage &) = 0;
Chris@45 248
Chris@45 249 virtual void contextHelpChanged(const QString &);
Chris@45 250 virtual void inProgressSelectionChanged();
Chris@45 251
Chris@141 252 virtual FileOpenStatus openSessionFromRDF(FileSource source);
Chris@141 253
Chris@45 254 virtual void closeSession() = 0;
Chris@45 255
Chris@45 256 protected:
Chris@45 257 QString m_sessionFile;
Chris@45 258 QString m_audioFile;
Chris@45 259 Document *m_document;
Chris@45 260
Chris@45 261 QLabel *m_descriptionLabel;
Chris@45 262 PaneStack *m_paneStack;
Chris@45 263 ViewManager *m_viewManager;
Chris@45 264 Layer *m_timeRulerLayer;
Chris@45 265
Chris@45 266 bool m_audioOutput;
Chris@45 267 AudioCallbackPlaySource *m_playSource;
Chris@45 268 AudioCallbackPlayTarget *m_playTarget;
Chris@45 269
Chris@113 270 class OSCQueueStarter : public QThread
Chris@113 271 {
Chris@113 272 public:
Chris@113 273 OSCQueueStarter(MainWindowBase *mwb) : QThread(mwb), m_mwb(mwb) { }
Chris@113 274 virtual void run() {
Chris@113 275 OSCQueue *queue = new OSCQueue(); // can take a long time
Chris@113 276 m_mwb->m_oscQueue = queue;
Chris@113 277 }
Chris@113 278 private:
Chris@113 279 MainWindowBase *m_mwb;
Chris@113 280 };
Chris@113 281
Chris@45 282 OSCQueue *m_oscQueue;
Chris@113 283 OSCQueueStarter *m_oscQueueStarter;
Chris@45 284
Chris@45 285 RecentFiles m_recentFiles;
Chris@54 286 RecentFiles m_recentTransforms;
Chris@45 287
Chris@45 288 bool m_documentModified;
Chris@45 289 bool m_openingAudioFile;
Chris@45 290 bool m_abandoning;
Chris@45 291
Chris@45 292 Labeller *m_labeller;
Chris@45 293
Chris@45 294 int m_lastPlayStatusSec;
Chris@45 295 mutable QString m_myStatusMessage;
Chris@45 296
Chris@45 297 bool m_initialDarkBackground;
Chris@45 298
Chris@45 299 WaveFileModel *getMainModel();
Chris@45 300 const WaveFileModel *getMainModel() const;
Chris@45 301 void createDocument();
Chris@45 302
Chris@45 303 Pane *addPaneToStack();
Chris@45 304 Layer *getSnapLayer() const;
Chris@45 305
Chris@126 306 typedef std::map<Layer *, QPointer<ModelDataTableDialog> > LayerDataDialogMap;
Chris@126 307 typedef std::set<QPointer<ModelDataTableDialog> > DataDialogSet;
Chris@123 308 typedef std::map<View *, DataDialogSet> ViewDataDialogMap;
Chris@123 309
Chris@123 310 LayerDataDialogMap m_layerDataDialogMap;
Chris@123 311 ViewDataDialogMap m_viewDataDialogMap;
Chris@123 312
Chris@128 313 void removeLayerEditDialog(Layer *);
Chris@128 314
Chris@45 315 class PaneCallback : public SVFileReaderPaneCallback
Chris@45 316 {
Chris@45 317 public:
Chris@45 318 PaneCallback(MainWindowBase *mw) : m_mw(mw) { }
Chris@45 319 virtual Pane *addPane() { return m_mw->addPaneToStack(); }
Chris@45 320 virtual void setWindowSize(int width, int height) {
Chris@45 321 m_mw->resize(width, height);
Chris@45 322 }
Chris@45 323 virtual void addSelection(int start, int end) {
Chris@45 324 m_mw->m_viewManager->addSelection(Selection(start, end));
Chris@45 325 }
Chris@45 326 protected:
Chris@45 327 MainWindowBase *m_mw;
Chris@45 328 };
Chris@45 329
Chris@45 330 class AddPaneCommand : public Command
Chris@45 331 {
Chris@45 332 public:
Chris@45 333 AddPaneCommand(MainWindowBase *mw);
Chris@45 334 virtual ~AddPaneCommand();
Chris@45 335
Chris@45 336 virtual void execute();
Chris@45 337 virtual void unexecute();
Chris@45 338 virtual QString getName() const;
Chris@45 339
Chris@45 340 Pane *getPane() { return m_pane; }
Chris@45 341
Chris@45 342 protected:
Chris@45 343 MainWindowBase *m_mw;
Chris@45 344 Pane *m_pane; // Main window owns this, but I determine its lifespan
Chris@45 345 Pane *m_prevCurrentPane; // I don't own this
Chris@45 346 bool m_added;
Chris@45 347 };
Chris@45 348
Chris@45 349 class RemovePaneCommand : public Command
Chris@45 350 {
Chris@45 351 public:
Chris@45 352 RemovePaneCommand(MainWindowBase *mw, Pane *pane);
Chris@45 353 virtual ~RemovePaneCommand();
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 protected:
Chris@45 360 MainWindowBase *m_mw;
Chris@45 361 Pane *m_pane; // Main window owns this, but I determine its lifespan
Chris@45 362 Pane *m_prevCurrentPane; // I don't own this
Chris@45 363 bool m_added;
Chris@45 364 };
Chris@45 365
Chris@45 366 virtual bool checkSaveModified() = 0;
Chris@45 367
Chris@45 368 virtual QString getOpenFileName(FileFinder::FileType type);
Chris@45 369 virtual QString getSaveFileName(FileFinder::FileType type);
Chris@45 370 virtual void registerLastOpenedFilePath(FileFinder::FileType type, QString path);
Chris@45 371
Chris@45 372 virtual void createPlayTarget();
Chris@45 373 virtual void openHelpUrl(QString url);
Chris@45 374
Chris@45 375 virtual void setupMenus() = 0;
Chris@45 376 virtual void updateVisibleRangeDisplay(Pane *p) const = 0;
Chris@45 377
Chris@128 378 virtual void connectLayerEditDialog(ModelDataTableDialog *dialog);
Chris@128 379
Chris@45 380 virtual void toXml(QTextStream &stream);
Chris@45 381 };
Chris@45 382
Chris@45 383
Chris@45 384 #endif