annotate main/MainWindow.h @ 182:21a76c9ed5c3

* Merge transform directory from sv-match-alignment branch (the previous comment included notes for this stuff, but I missed it in the actual merge) * Fix crash when a transform fails to create an output model and the thread that created the transform then deletes its input model thinking it's no longer needed, even though the transform run thread is still using it -- fix is to wait() on the transform before returning the null output model
author Chris Cannam
date Fri, 28 Sep 2007 16:15:06 +0000
parents 98ba77e0d897
children 26397b84e6a2
rev   line source
Chris@0 1 /* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
Chris@0 2
Chris@0 3 /*
Chris@0 4 Sonic Visualiser
Chris@0 5 An audio file viewer and annotation editor.
Chris@0 6 Centre for Digital Music, Queen Mary, University of London.
Chris@77 7 This file copyright 2006 Chris Cannam and QMUL.
Chris@0 8
Chris@0 9 This program is free software; you can redistribute it and/or
Chris@0 10 modify it under the terms of the GNU General Public License as
Chris@0 11 published by the Free Software Foundation; either version 2 of the
Chris@0 12 License, or (at your option) any later version. See the file
Chris@0 13 COPYING included with this distribution for more information.
Chris@0 14 */
Chris@0 15
Chris@0 16 #ifndef _MAIN_WINDOW_H_
Chris@0 17 #define _MAIN_WINDOW_H_
Chris@0 18
Chris@0 19 #include <QFrame>
Chris@0 20 #include <QString>
Chris@85 21 #include <QUrl>
Chris@0 22 #include <QMainWindow>
Chris@0 23 #include <QPointer>
Chris@0 24
Chris@0 25 #include "base/Command.h"
Chris@1 26 #include "view/ViewManager.h"
Chris@0 27 #include "base/PropertyContainer.h"
Chris@34 28 #include "base/RecentFiles.h"
Chris@0 29 #include "layer/LayerFactory.h"
Chris@0 30 #include "transform/Transform.h"
Chris@1 31 #include "document/SVFileReader.h"
Chris@88 32 #include "data/fileio/FileFinder.h"
Chris@0 33 #include <map>
Chris@0 34
Chris@0 35 class Document;
Chris@0 36 class PaneStack;
Chris@0 37 class Pane;
Chris@0 38 class View;
Chris@0 39 class Fader;
Chris@65 40 class Overview;
Chris@0 41 class Layer;
Chris@0 42 class WaveformLayer;
Chris@0 43 class WaveFileModel;
Chris@0 44 class AudioCallbackPlaySource;
Chris@0 45 class AudioCallbackPlayTarget;
Chris@0 46 class CommandHistory;
Chris@0 47 class QMenu;
Chris@0 48 class AudioDial;
Chris@0 49 class QLabel;
Chris@16 50 class QCheckBox;
Chris@0 51 class PreferencesDialog;
Chris@177 52 class QTreeView;
Chris@26 53 class QPushButton;
Chris@69 54 class OSCQueue;
Chris@69 55 class OSCMessage;
Chris@162 56 class KeyReference;
Chris@0 57
Chris@0 58
Chris@0 59 class MainWindow : public QMainWindow
Chris@0 60 {
Chris@0 61 Q_OBJECT
Chris@0 62
Chris@0 63 public:
Chris@70 64 MainWindow(bool withAudioOutput = true,
Chris@70 65 bool withOSCSupport = true);
Chris@0 66 virtual ~MainWindow();
Chris@0 67
Chris@0 68 enum AudioFileOpenMode {
Chris@0 69 ReplaceMainModel,
Chris@0 70 CreateAdditionalModel,
Chris@0 71 AskUser
Chris@0 72 };
Chris@0 73
Chris@82 74 enum FileOpenStatus {
Chris@82 75 FileOpenSucceeded,
Chris@82 76 FileOpenFailed,
Chris@82 77 FileOpenCancelled
Chris@82 78 };
Chris@82 79
Chris@82 80 FileOpenStatus openSomeFile(QString path, AudioFileOpenMode = AskUser);
Chris@82 81 FileOpenStatus openAudioFile(QString path, AudioFileOpenMode = AskUser);
Chris@180 82 FileOpenStatus openPlaylistFile(QString path, AudioFileOpenMode = AskUser);
Chris@82 83 FileOpenStatus openLayerFile(QString path);
Chris@82 84 FileOpenStatus openSessionFile(QString path);
Chris@180 85 FileOpenStatus openURL(QUrl url, AudioFileOpenMode = AskUser);
Chris@180 86 FileOpenStatus openURL(QString url, AudioFileOpenMode = AskUser);
Chris@82 87
Chris@0 88 bool saveSessionFile(QString path);
Chris@11 89 bool commitData(bool mayAskUser); // on session shutdown
Chris@0 90
Chris@0 91 signals:
Chris@0 92 // Used to toggle the availability of menu actions
Chris@0 93 void canAddPane(bool);
Chris@0 94 void canDeleteCurrentPane(bool);
Chris@0 95 void canAddLayer(bool);
Chris@0 96 void canImportMoreAudio(bool);
Chris@0 97 void canImportLayer(bool);
Chris@0 98 void canExportAudio(bool);
Chris@0 99 void canExportLayer(bool);
Chris@121 100 void canExportImage(bool);
Chris@0 101 void canRenameLayer(bool);
Chris@0 102 void canEditLayer(bool);
Chris@169 103 void canMeasureLayer(bool);
Chris@0 104 void canSelect(bool);
Chris@0 105 void canClearSelection(bool);
Chris@0 106 void canEditSelection(bool);
Chris@164 107 void canDeleteSelection(bool);
Chris@0 108 void canPaste(bool);
Chris@0 109 void canInsertInstant(bool);
Chris@81 110 void canInsertInstantsAtBoundaries(bool);
Chris@0 111 void canDeleteCurrentLayer(bool);
Chris@0 112 void canZoom(bool);
Chris@0 113 void canScroll(bool);
Chris@0 114 void canPlay(bool);
Chris@0 115 void canFfwd(bool);
Chris@0 116 void canRewind(bool);
Chris@0 117 void canPlaySelection(bool);
Chris@155 118 void canSpeedUpPlayback(bool);
Chris@155 119 void canSlowDownPlayback(bool);
Chris@155 120 void canChangePlaybackSpeed(bool);
Chris@0 121 void canSave(bool);
Chris@0 122
Chris@118 123 public slots:
Chris@118 124 void preferenceChanged(PropertyContainer::PropertyName);
Chris@118 125
Chris@0 126 protected slots:
Chris@0 127 void openSession();
Chris@0 128 void importAudio();
Chris@0 129 void importMoreAudio();
Chris@0 130 void openSomething();
Chris@86 131 void openLocation();
Chris@0 132 void openRecentFile();
Chris@0 133 void exportAudio();
Chris@0 134 void importLayer();
Chris@0 135 void exportLayer();
Chris@121 136 void exportImage();
Chris@0 137 void saveSession();
Chris@0 138 void saveSessionAs();
Chris@0 139 void newSession();
Chris@0 140 void closeSession();
Chris@0 141 void preferences();
Chris@0 142
Chris@0 143 void zoomIn();
Chris@0 144 void zoomOut();
Chris@0 145 void zoomToFit();
Chris@0 146 void zoomDefault();
Chris@0 147 void scrollLeft();
Chris@0 148 void scrollRight();
Chris@0 149 void jumpLeft();
Chris@0 150 void jumpRight();
Chris@0 151
Chris@0 152 void showNoOverlays();
Chris@90 153 void showMinimalOverlays();
Chris@90 154 void showStandardOverlays();
Chris@90 155 void showAllOverlays();
Chris@7 156
Chris@7 157 void toggleZoomWheels();
Chris@72 158 void togglePropertyBoxes();
Chris@90 159 void toggleStatusBar();
Chris@0 160
Chris@0 161 void play();
Chris@0 162 void ffwd();
Chris@0 163 void ffwdEnd();
Chris@0 164 void rewind();
Chris@0 165 void rewindStart();
Chris@0 166 void stop();
Chris@0 167
Chris@0 168 void addPane();
Chris@0 169 void addLayer();
Chris@0 170 void deleteCurrentPane();
Chris@0 171 void renameCurrentLayer();
Chris@0 172 void deleteCurrentLayer();
Chris@0 173
Chris@0 174 void playLoopToggled();
Chris@0 175 void playSelectionToggled();
Chris@180 176 void playSoloToggled();
Chris@0 177 void playSpeedChanged(int);
Chris@16 178 void playSharpenToggled();
Chris@26 179 void playMonoToggled();
Chris@155 180 void speedUpPlayback();
Chris@155 181 void slowDownPlayback();
Chris@155 182 void restoreNormalPlayback();
Chris@0 183 void sampleRateMismatch(size_t, size_t, bool);
Chris@42 184 void audioOverloadPluginDisabled();
Chris@0 185
Chris@116 186 void playbackFrameChanged(unsigned long);
Chris@116 187 void globalCentreFrameChanged(unsigned long);
Chris@116 188 void viewCentreFrameChanged(View *, unsigned long);
Chris@116 189 void viewZoomLevelChanged(View *, unsigned long, bool);
Chris@0 190 void outputLevelsChanged(float, float);
Chris@0 191
Chris@0 192 void currentPaneChanged(Pane *);
Chris@0 193 void currentLayerChanged(Pane *, Layer *);
Chris@0 194
Chris@0 195 void toolNavigateSelected();
Chris@0 196 void toolSelectSelected();
Chris@0 197 void toolEditSelected();
Chris@0 198 void toolDrawSelected();
Chris@151 199 void toolMeasureSelected();
Chris@0 200
Chris@0 201 void selectAll();
Chris@0 202 void selectToStart();
Chris@0 203 void selectToEnd();
Chris@0 204 void selectVisible();
Chris@0 205 void clearSelection();
Chris@0 206 void cut();
Chris@0 207 void copy();
Chris@0 208 void paste();
Chris@0 209 void deleteSelected();
Chris@0 210 void insertInstant();
Chris@81 211 void insertInstantAt(size_t);
Chris@81 212 void insertInstantsAtBoundaries();
Chris@0 213
Chris@0 214 void documentModified();
Chris@0 215 void documentRestored();
Chris@0 216
Chris@0 217 void updateMenuStates();
Chris@0 218 void updateDescriptionLabel();
Chris@0 219
Chris@0 220 void layerAdded(Layer *);
Chris@0 221 void layerRemoved(Layer *);
Chris@0 222 void layerAboutToBeDeleted(Layer *);
Chris@0 223 void layerInAView(Layer *, bool);
Chris@0 224
Chris@0 225 void mainModelChanged(WaveFileModel *);
Chris@0 226 void modelAdded(Model *);
Chris@0 227 void modelAboutToBeDeleted(Model *);
Chris@0 228
Chris@0 229 void modelGenerationFailed(QString);
Chris@0 230 void modelRegenerationFailed(QString, QString);
Chris@0 231
Chris@0 232 void rightButtonMenuRequested(Pane *, QPoint point);
Chris@0 233
Chris@73 234 void propertyStacksResized();
Chris@73 235
Chris@0 236 void setupRecentFilesMenu();
Chris@34 237 void setupRecentTransformsMenu();
Chris@0 238
Chris@0 239 void showLayerTree();
Chris@0 240
Chris@69 241 void pollOSC();
Chris@69 242 void handleOSCMessage(const OSCMessage &);
Chris@69 243
Chris@90 244 void mouseEnteredWidget();
Chris@90 245 void mouseLeftWidget();
Chris@116 246 void contextHelpChanged(const QString &);
Chris@117 247 void inProgressSelectionChanged();
Chris@90 248
Chris@0 249 void website();
Chris@0 250 void help();
Chris@0 251 void about();
Chris@162 252 void keyReference();
Chris@0 253
Chris@0 254 protected:
Chris@0 255 QString m_sessionFile;
Chris@0 256 QString m_audioFile;
Chris@0 257 Document *m_document;
Chris@0 258
Chris@0 259 QLabel *m_descriptionLabel;
Chris@0 260 PaneStack *m_paneStack;
Chris@0 261 ViewManager *m_viewManager;
Chris@65 262 Overview *m_overview;
Chris@0 263 Fader *m_fader;
Chris@0 264 AudioDial *m_playSpeed;
Chris@26 265 QPushButton *m_playSharpen;
Chris@26 266 QPushButton *m_playMono;
Chris@0 267 WaveformLayer *m_panLayer;
Chris@0 268 Layer *m_timeRulerLayer;
Chris@0 269
Chris@46 270 bool m_audioOutput;
Chris@0 271 AudioCallbackPlaySource *m_playSource;
Chris@0 272 AudioCallbackPlayTarget *m_playTarget;
Chris@0 273
Chris@69 274 OSCQueue *m_oscQueue;
Chris@69 275
Chris@34 276 RecentFiles m_recentFiles;
Chris@34 277 RecentFiles m_recentTransforms;
Chris@34 278
Chris@0 279 bool m_mainMenusCreated;
Chris@0 280 QMenu *m_paneMenu;
Chris@0 281 QMenu *m_layerMenu;
Chris@34 282 QMenu *m_transformsMenu;
Chris@155 283 QMenu *m_playbackMenu;
Chris@0 284 QMenu *m_existingLayersMenu;
Chris@95 285 QMenu *m_sliceMenu;
Chris@0 286 QMenu *m_recentFilesMenu;
Chris@34 287 QMenu *m_recentTransformsMenu;
Chris@0 288 QMenu *m_rightButtonMenu;
Chris@0 289 QMenu *m_rightButtonLayerMenu;
Chris@34 290 QMenu *m_rightButtonTransformsMenu;
Chris@155 291 QMenu *m_rightButtonPlaybackMenu;
Chris@155 292
Chris@164 293 QAction *m_deleteSelectedAction;
Chris@155 294 QAction *m_ffwdAction;
Chris@155 295 QAction *m_rwdAction;
Chris@0 296
Chris@0 297 bool m_documentModified;
Chris@70 298 bool m_openingAudioFile;
Chris@70 299 bool m_abandoning;
Chris@0 300
Chris@116 301 int m_lastPlayStatusSec;
Chris@116 302 mutable QString m_myStatusMessage;
Chris@116 303
Chris@0 304 QPointer<PreferencesDialog> m_preferencesDialog;
Chris@177 305 QPointer<QTreeView> m_layerTreeView;
Chris@0 306
Chris@180 307 bool m_initialDarkBackground;
Chris@180 308
Chris@162 309 KeyReference *m_keyReference;
Chris@162 310
Chris@0 311 WaveFileModel *getMainModel();
Chris@116 312 const WaveFileModel *getMainModel() const;
Chris@0 313 void createDocument();
Chris@0 314
Chris@0 315 struct PaneConfiguration {
Chris@0 316 PaneConfiguration(LayerFactory::LayerType _layer
Chris@0 317 = LayerFactory::TimeRuler,
Chris@66 318 Model *_source = 0,
Chris@0 319 int _channel = -1) :
Chris@66 320 layer(_layer), sourceModel(_source), channel(_channel) { }
Chris@0 321 LayerFactory::LayerType layer;
Chris@66 322 Model *sourceModel;
Chris@0 323 int channel;
Chris@0 324 };
Chris@0 325
Chris@0 326 typedef std::map<QAction *, PaneConfiguration> PaneActionMap;
Chris@0 327 PaneActionMap m_paneActions;
Chris@0 328
Chris@107 329 typedef std::map<QAction *, TransformId> TransformActionMap;
Chris@34 330 TransformActionMap m_transformActions;
Chris@34 331
Chris@107 332 typedef std::map<TransformId, QAction *> TransformActionReverseMap;
Chris@34 333 TransformActionReverseMap m_transformActionsReverse;
Chris@0 334
Chris@0 335 typedef std::map<QAction *, LayerFactory::LayerType> LayerActionMap;
Chris@0 336 LayerActionMap m_layerActions;
Chris@0 337
Chris@0 338 typedef std::map<QAction *, Layer *> ExistingLayerActionMap;
Chris@0 339 ExistingLayerActionMap m_existingLayerActions;
Chris@95 340 ExistingLayerActionMap m_sliceActions;
Chris@0 341
Chris@0 342 typedef std::map<ViewManager::ToolMode, QAction *> ToolActionMap;
Chris@0 343 ToolActionMap m_toolActions;
Chris@0 344
Chris@0 345 void setupMenus();
Chris@66 346 void setupFileMenu();
Chris@66 347 void setupEditMenu();
Chris@66 348 void setupViewMenu();
Chris@66 349 void setupPaneAndLayerMenus();
Chris@66 350 void setupTransformsMenu();
Chris@66 351 void setupHelpMenu();
Chris@95 352 void setupExistingLayersMenus();
Chris@0 353 void setupToolbars();
Chris@66 354
Chris@0 355 Pane *addPaneToStack();
Chris@0 356
Chris@69 357 void addPane(const PaneConfiguration &configuration, QString text);
Chris@69 358
Chris@155 359 Layer *getSnapLayer() const;
Chris@155 360
Chris@0 361 class PaneCallback : public SVFileReaderPaneCallback
Chris@0 362 {
Chris@0 363 public:
Chris@0 364 PaneCallback(MainWindow *mw) : m_mw(mw) { }
Chris@0 365 virtual Pane *addPane() { return m_mw->addPaneToStack(); }
Chris@0 366 virtual void setWindowSize(int width, int height) {
Chris@0 367 m_mw->resize(width, height);
Chris@0 368 }
Chris@0 369 virtual void addSelection(int start, int end) {
Chris@0 370 m_mw->m_viewManager->addSelection(Selection(start, end));
Chris@0 371 }
Chris@0 372 protected:
Chris@0 373 MainWindow *m_mw;
Chris@0 374 };
Chris@0 375
Chris@0 376 class AddPaneCommand : public Command
Chris@0 377 {
Chris@0 378 public:
Chris@0 379 AddPaneCommand(MainWindow *mw);
Chris@0 380 virtual ~AddPaneCommand();
Chris@0 381
Chris@0 382 virtual void execute();
Chris@0 383 virtual void unexecute();
Chris@0 384 virtual QString getName() const;
Chris@0 385
Chris@0 386 Pane *getPane() { return m_pane; }
Chris@0 387
Chris@0 388 protected:
Chris@0 389 MainWindow *m_mw;
Chris@0 390 Pane *m_pane; // Main window owns this, but I determine its lifespan
Chris@0 391 Pane *m_prevCurrentPane; // I don't own this
Chris@0 392 bool m_added;
Chris@0 393 };
Chris@0 394
Chris@0 395 class RemovePaneCommand : public Command
Chris@0 396 {
Chris@0 397 public:
Chris@0 398 RemovePaneCommand(MainWindow *mw, Pane *pane);
Chris@0 399 virtual ~RemovePaneCommand();
Chris@0 400
Chris@0 401 virtual void execute();
Chris@0 402 virtual void unexecute();
Chris@0 403 virtual QString getName() const;
Chris@0 404
Chris@0 405 protected:
Chris@0 406 MainWindow *m_mw;
Chris@0 407 Pane *m_pane; // Main window owns this, but I determine its lifespan
Chris@0 408 Pane *m_prevCurrentPane; // I don't own this
Chris@0 409 bool m_added;
Chris@0 410 };
Chris@0 411
Chris@0 412 virtual void closeEvent(QCloseEvent *e);
Chris@0 413 bool checkSaveModified();
Chris@0 414
Chris@86 415 FileOpenStatus openSomeFile(QString path, QString location,
Chris@86 416 AudioFileOpenMode = AskUser);
Chris@86 417 FileOpenStatus openAudioFile(QString path, QString location,
Chris@86 418 AudioFileOpenMode = AskUser);
Chris@180 419 FileOpenStatus openPlaylistFile(QString path, QString location,
Chris@180 420 AudioFileOpenMode = AskUser);
Chris@86 421 FileOpenStatus openLayerFile(QString path, QString location);
Chris@86 422 FileOpenStatus openSessionFile(QString path, QString location);
Chris@86 423
Chris@88 424 QString getOpenFileName(FileFinder::FileType type);
Chris@88 425 QString getSaveFileName(FileFinder::FileType type);
Chris@88 426 void registerLastOpenedFilePath(FileFinder::FileType type, QString path);
Chris@81 427
Chris@0 428 void createPlayTarget();
Chris@0 429
Chris@0 430 void openHelpUrl(QString url);
Chris@0 431
Chris@116 432 void updateVisibleRangeDisplay(Pane *p) const;
Chris@116 433
Chris@0 434 void toXml(QTextStream &stream);
Chris@0 435 };
Chris@0 436
Chris@0 437
Chris@0 438 #endif