annotate framework/MainWindowBase.h @ 140:9ccaa8fd9b9f

* Add code to identify (usually) the type of an XML file that contains either SV session or layer data, and use it to permit loading files with plain .xml extension that contain complete uncompression sessions
author Chris Cannam
date Thu, 20 Nov 2008 10:59:14 +0000
parents 4c9c04645685
children 9a8c73ffdce0
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@45 252 virtual void closeSession() = 0;
Chris@45 253
Chris@45 254 protected:
Chris@45 255 QString m_sessionFile;
Chris@45 256 QString m_audioFile;
Chris@45 257 Document *m_document;
Chris@45 258
Chris@45 259 QLabel *m_descriptionLabel;
Chris@45 260 PaneStack *m_paneStack;
Chris@45 261 ViewManager *m_viewManager;
Chris@45 262 Layer *m_timeRulerLayer;
Chris@45 263
Chris@45 264 bool m_audioOutput;
Chris@45 265 AudioCallbackPlaySource *m_playSource;
Chris@45 266 AudioCallbackPlayTarget *m_playTarget;
Chris@45 267
Chris@113 268 class OSCQueueStarter : public QThread
Chris@113 269 {
Chris@113 270 public:
Chris@113 271 OSCQueueStarter(MainWindowBase *mwb) : QThread(mwb), m_mwb(mwb) { }
Chris@113 272 virtual void run() {
Chris@113 273 OSCQueue *queue = new OSCQueue(); // can take a long time
Chris@113 274 m_mwb->m_oscQueue = queue;
Chris@113 275 }
Chris@113 276 private:
Chris@113 277 MainWindowBase *m_mwb;
Chris@113 278 };
Chris@113 279
Chris@45 280 OSCQueue *m_oscQueue;
Chris@113 281 OSCQueueStarter *m_oscQueueStarter;
Chris@45 282
Chris@45 283 RecentFiles m_recentFiles;
Chris@54 284 RecentFiles m_recentTransforms;
Chris@45 285
Chris@45 286 bool m_documentModified;
Chris@45 287 bool m_openingAudioFile;
Chris@45 288 bool m_abandoning;
Chris@45 289
Chris@45 290 Labeller *m_labeller;
Chris@45 291
Chris@45 292 int m_lastPlayStatusSec;
Chris@45 293 mutable QString m_myStatusMessage;
Chris@45 294
Chris@45 295 bool m_initialDarkBackground;
Chris@45 296
Chris@45 297 WaveFileModel *getMainModel();
Chris@45 298 const WaveFileModel *getMainModel() const;
Chris@45 299 void createDocument();
Chris@45 300
Chris@45 301 Pane *addPaneToStack();
Chris@45 302 Layer *getSnapLayer() const;
Chris@45 303
Chris@126 304 typedef std::map<Layer *, QPointer<ModelDataTableDialog> > LayerDataDialogMap;
Chris@126 305 typedef std::set<QPointer<ModelDataTableDialog> > DataDialogSet;
Chris@123 306 typedef std::map<View *, DataDialogSet> ViewDataDialogMap;
Chris@123 307
Chris@123 308 LayerDataDialogMap m_layerDataDialogMap;
Chris@123 309 ViewDataDialogMap m_viewDataDialogMap;
Chris@123 310
Chris@128 311 void removeLayerEditDialog(Layer *);
Chris@128 312
Chris@45 313 class PaneCallback : public SVFileReaderPaneCallback
Chris@45 314 {
Chris@45 315 public:
Chris@45 316 PaneCallback(MainWindowBase *mw) : m_mw(mw) { }
Chris@45 317 virtual Pane *addPane() { return m_mw->addPaneToStack(); }
Chris@45 318 virtual void setWindowSize(int width, int height) {
Chris@45 319 m_mw->resize(width, height);
Chris@45 320 }
Chris@45 321 virtual void addSelection(int start, int end) {
Chris@45 322 m_mw->m_viewManager->addSelection(Selection(start, end));
Chris@45 323 }
Chris@45 324 protected:
Chris@45 325 MainWindowBase *m_mw;
Chris@45 326 };
Chris@45 327
Chris@45 328 class AddPaneCommand : public Command
Chris@45 329 {
Chris@45 330 public:
Chris@45 331 AddPaneCommand(MainWindowBase *mw);
Chris@45 332 virtual ~AddPaneCommand();
Chris@45 333
Chris@45 334 virtual void execute();
Chris@45 335 virtual void unexecute();
Chris@45 336 virtual QString getName() const;
Chris@45 337
Chris@45 338 Pane *getPane() { return m_pane; }
Chris@45 339
Chris@45 340 protected:
Chris@45 341 MainWindowBase *m_mw;
Chris@45 342 Pane *m_pane; // Main window owns this, but I determine its lifespan
Chris@45 343 Pane *m_prevCurrentPane; // I don't own this
Chris@45 344 bool m_added;
Chris@45 345 };
Chris@45 346
Chris@45 347 class RemovePaneCommand : public Command
Chris@45 348 {
Chris@45 349 public:
Chris@45 350 RemovePaneCommand(MainWindowBase *mw, Pane *pane);
Chris@45 351 virtual ~RemovePaneCommand();
Chris@45 352
Chris@45 353 virtual void execute();
Chris@45 354 virtual void unexecute();
Chris@45 355 virtual QString getName() const;
Chris@45 356
Chris@45 357 protected:
Chris@45 358 MainWindowBase *m_mw;
Chris@45 359 Pane *m_pane; // Main window owns this, but I determine its lifespan
Chris@45 360 Pane *m_prevCurrentPane; // I don't own this
Chris@45 361 bool m_added;
Chris@45 362 };
Chris@45 363
Chris@45 364 virtual bool checkSaveModified() = 0;
Chris@45 365
Chris@45 366 virtual QString getOpenFileName(FileFinder::FileType type);
Chris@45 367 virtual QString getSaveFileName(FileFinder::FileType type);
Chris@45 368 virtual void registerLastOpenedFilePath(FileFinder::FileType type, QString path);
Chris@45 369
Chris@45 370 virtual void createPlayTarget();
Chris@45 371 virtual void openHelpUrl(QString url);
Chris@45 372
Chris@45 373 virtual void setupMenus() = 0;
Chris@45 374 virtual void updateVisibleRangeDisplay(Pane *p) const = 0;
Chris@45 375
Chris@128 376 virtual void connectLayerEditDialog(ModelDataTableDialog *dialog);
Chris@128 377
Chris@45 378 virtual void toXml(QTextStream &stream);
Chris@45 379 };
Chris@45 380
Chris@45 381
Chris@45 382 #endif