annotate main/MainWindow.h @ 193:4e030ebb6b36

* Make it possible to drop audio files, layer files, session files and images onto SV panes. Need to do a bit more work on where we expect the dropped file to go, particularly in the case of audio files -- at the moment they're always opened in new panes, but it may be better to by default replace whatever is in the target pane.
author Chris Cannam
date Wed, 10 Oct 2007 15:18:02 +0000
parents d3477f673fb4
children c851c49c79fe
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@189 57 class Labeller;
Chris@0 58
Chris@0 59
Chris@0 60 class MainWindow : public QMainWindow
Chris@0 61 {
Chris@0 62 Q_OBJECT
Chris@0 63
Chris@0 64 public:
Chris@70 65 MainWindow(bool withAudioOutput = true,
Chris@70 66 bool withOSCSupport = true);
Chris@0 67 virtual ~MainWindow();
Chris@0 68
Chris@0 69 enum AudioFileOpenMode {
Chris@0 70 ReplaceMainModel,
Chris@0 71 CreateAdditionalModel,
Chris@0 72 AskUser
Chris@0 73 };
Chris@0 74
Chris@82 75 enum FileOpenStatus {
Chris@82 76 FileOpenSucceeded,
Chris@82 77 FileOpenFailed,
Chris@193 78 FileOpenCancelled,
Chris@193 79 FileOpenWrongMode // attempted to open layer when no main model present
Chris@82 80 };
Chris@82 81
Chris@82 82 FileOpenStatus openSomeFile(QString path, AudioFileOpenMode = AskUser);
Chris@82 83 FileOpenStatus openAudioFile(QString path, AudioFileOpenMode = AskUser);
Chris@180 84 FileOpenStatus openPlaylistFile(QString path, AudioFileOpenMode = AskUser);
Chris@82 85 FileOpenStatus openLayerFile(QString path);
Chris@193 86 FileOpenStatus openImageFile(QString path);
Chris@82 87 FileOpenStatus openSessionFile(QString path);
Chris@180 88 FileOpenStatus openURL(QUrl url, AudioFileOpenMode = AskUser);
Chris@180 89 FileOpenStatus openURL(QString url, AudioFileOpenMode = AskUser);
Chris@82 90
Chris@0 91 bool saveSessionFile(QString path);
Chris@11 92 bool commitData(bool mayAskUser); // on session shutdown
Chris@0 93
Chris@0 94 signals:
Chris@0 95 // Used to toggle the availability of menu actions
Chris@0 96 void canAddPane(bool);
Chris@0 97 void canDeleteCurrentPane(bool);
Chris@0 98 void canAddLayer(bool);
Chris@0 99 void canImportMoreAudio(bool);
Chris@0 100 void canImportLayer(bool);
Chris@0 101 void canExportAudio(bool);
Chris@0 102 void canExportLayer(bool);
Chris@121 103 void canExportImage(bool);
Chris@0 104 void canRenameLayer(bool);
Chris@0 105 void canEditLayer(bool);
Chris@169 106 void canMeasureLayer(bool);
Chris@0 107 void canSelect(bool);
Chris@0 108 void canClearSelection(bool);
Chris@0 109 void canEditSelection(bool);
Chris@164 110 void canDeleteSelection(bool);
Chris@0 111 void canPaste(bool);
Chris@0 112 void canInsertInstant(bool);
Chris@81 113 void canInsertInstantsAtBoundaries(bool);
Chris@189 114 void canRenumberInstants(bool);
Chris@0 115 void canDeleteCurrentLayer(bool);
Chris@0 116 void canZoom(bool);
Chris@0 117 void canScroll(bool);
Chris@0 118 void canPlay(bool);
Chris@0 119 void canFfwd(bool);
Chris@0 120 void canRewind(bool);
Chris@0 121 void canPlaySelection(bool);
Chris@155 122 void canSpeedUpPlayback(bool);
Chris@155 123 void canSlowDownPlayback(bool);
Chris@155 124 void canChangePlaybackSpeed(bool);
Chris@0 125 void canSave(bool);
Chris@0 126
Chris@118 127 public slots:
Chris@118 128 void preferenceChanged(PropertyContainer::PropertyName);
Chris@118 129
Chris@0 130 protected slots:
Chris@0 131 void openSession();
Chris@0 132 void importAudio();
Chris@0 133 void importMoreAudio();
Chris@0 134 void openSomething();
Chris@86 135 void openLocation();
Chris@0 136 void openRecentFile();
Chris@0 137 void exportAudio();
Chris@0 138 void importLayer();
Chris@0 139 void exportLayer();
Chris@121 140 void exportImage();
Chris@0 141 void saveSession();
Chris@0 142 void saveSessionAs();
Chris@0 143 void newSession();
Chris@0 144 void closeSession();
Chris@0 145 void preferences();
Chris@0 146
Chris@0 147 void zoomIn();
Chris@0 148 void zoomOut();
Chris@0 149 void zoomToFit();
Chris@0 150 void zoomDefault();
Chris@0 151 void scrollLeft();
Chris@0 152 void scrollRight();
Chris@0 153 void jumpLeft();
Chris@0 154 void jumpRight();
Chris@0 155
Chris@0 156 void showNoOverlays();
Chris@90 157 void showMinimalOverlays();
Chris@90 158 void showStandardOverlays();
Chris@90 159 void showAllOverlays();
Chris@7 160
Chris@7 161 void toggleZoomWheels();
Chris@72 162 void togglePropertyBoxes();
Chris@90 163 void toggleStatusBar();
Chris@0 164
Chris@0 165 void play();
Chris@0 166 void ffwd();
Chris@0 167 void ffwdEnd();
Chris@0 168 void rewind();
Chris@0 169 void rewindStart();
Chris@0 170 void stop();
Chris@0 171
Chris@0 172 void addPane();
Chris@0 173 void addLayer();
Chris@0 174 void deleteCurrentPane();
Chris@0 175 void renameCurrentLayer();
Chris@0 176 void deleteCurrentLayer();
Chris@0 177
Chris@0 178 void playLoopToggled();
Chris@0 179 void playSelectionToggled();
Chris@180 180 void playSoloToggled();
Chris@0 181 void playSpeedChanged(int);
Chris@16 182 void playSharpenToggled();
Chris@26 183 void playMonoToggled();
Chris@155 184 void speedUpPlayback();
Chris@155 185 void slowDownPlayback();
Chris@155 186 void restoreNormalPlayback();
Chris@0 187 void sampleRateMismatch(size_t, size_t, bool);
Chris@42 188 void audioOverloadPluginDisabled();
Chris@0 189
Chris@116 190 void playbackFrameChanged(unsigned long);
Chris@116 191 void globalCentreFrameChanged(unsigned long);
Chris@116 192 void viewCentreFrameChanged(View *, unsigned long);
Chris@116 193 void viewZoomLevelChanged(View *, unsigned long, bool);
Chris@0 194 void outputLevelsChanged(float, float);
Chris@0 195
Chris@0 196 void currentPaneChanged(Pane *);
Chris@0 197 void currentLayerChanged(Pane *, Layer *);
Chris@0 198
Chris@0 199 void toolNavigateSelected();
Chris@0 200 void toolSelectSelected();
Chris@0 201 void toolEditSelected();
Chris@0 202 void toolDrawSelected();
Chris@151 203 void toolMeasureSelected();
Chris@0 204
Chris@0 205 void selectAll();
Chris@0 206 void selectToStart();
Chris@0 207 void selectToEnd();
Chris@0 208 void selectVisible();
Chris@0 209 void clearSelection();
Chris@0 210 void cut();
Chris@0 211 void copy();
Chris@0 212 void paste();
Chris@0 213 void deleteSelected();
Chris@0 214 void insertInstant();
Chris@81 215 void insertInstantAt(size_t);
Chris@81 216 void insertInstantsAtBoundaries();
Chris@189 217 void setInstantsNumbering();
Chris@189 218 void setInstantsCounterCycle();
Chris@192 219 void resetInstantsCounters();
Chris@189 220 void renumberInstants();
Chris@0 221
Chris@0 222 void documentModified();
Chris@0 223 void documentRestored();
Chris@0 224
Chris@0 225 void updateMenuStates();
Chris@0 226 void updateDescriptionLabel();
Chris@0 227
Chris@0 228 void layerAdded(Layer *);
Chris@0 229 void layerRemoved(Layer *);
Chris@0 230 void layerAboutToBeDeleted(Layer *);
Chris@0 231 void layerInAView(Layer *, bool);
Chris@0 232
Chris@0 233 void mainModelChanged(WaveFileModel *);
Chris@0 234 void modelAdded(Model *);
Chris@0 235 void modelAboutToBeDeleted(Model *);
Chris@0 236
Chris@0 237 void modelGenerationFailed(QString);
Chris@0 238 void modelRegenerationFailed(QString, QString);
Chris@0 239
Chris@0 240 void rightButtonMenuRequested(Pane *, QPoint point);
Chris@0 241
Chris@73 242 void propertyStacksResized();
Chris@73 243
Chris@193 244 void paneDropAccepted(Pane *, QStringList);
Chris@193 245 void paneDropAccepted(Pane *, QString);
Chris@193 246
Chris@0 247 void setupRecentFilesMenu();
Chris@34 248 void setupRecentTransformsMenu();
Chris@0 249
Chris@0 250 void showLayerTree();
Chris@0 251
Chris@69 252 void pollOSC();
Chris@69 253 void handleOSCMessage(const OSCMessage &);
Chris@69 254
Chris@90 255 void mouseEnteredWidget();
Chris@90 256 void mouseLeftWidget();
Chris@116 257 void contextHelpChanged(const QString &);
Chris@117 258 void inProgressSelectionChanged();
Chris@90 259
Chris@0 260 void website();
Chris@0 261 void help();
Chris@0 262 void about();
Chris@162 263 void keyReference();
Chris@0 264
Chris@0 265 protected:
Chris@0 266 QString m_sessionFile;
Chris@0 267 QString m_audioFile;
Chris@0 268 Document *m_document;
Chris@0 269
Chris@0 270 QLabel *m_descriptionLabel;
Chris@0 271 PaneStack *m_paneStack;
Chris@0 272 ViewManager *m_viewManager;
Chris@65 273 Overview *m_overview;
Chris@0 274 Fader *m_fader;
Chris@0 275 AudioDial *m_playSpeed;
Chris@26 276 QPushButton *m_playSharpen;
Chris@26 277 QPushButton *m_playMono;
Chris@0 278 WaveformLayer *m_panLayer;
Chris@0 279 Layer *m_timeRulerLayer;
Chris@0 280
Chris@46 281 bool m_audioOutput;
Chris@0 282 AudioCallbackPlaySource *m_playSource;
Chris@0 283 AudioCallbackPlayTarget *m_playTarget;
Chris@0 284
Chris@69 285 OSCQueue *m_oscQueue;
Chris@69 286
Chris@34 287 RecentFiles m_recentFiles;
Chris@34 288 RecentFiles m_recentTransforms;
Chris@34 289
Chris@0 290 bool m_mainMenusCreated;
Chris@0 291 QMenu *m_paneMenu;
Chris@0 292 QMenu *m_layerMenu;
Chris@34 293 QMenu *m_transformsMenu;
Chris@155 294 QMenu *m_playbackMenu;
Chris@0 295 QMenu *m_existingLayersMenu;
Chris@95 296 QMenu *m_sliceMenu;
Chris@0 297 QMenu *m_recentFilesMenu;
Chris@34 298 QMenu *m_recentTransformsMenu;
Chris@0 299 QMenu *m_rightButtonMenu;
Chris@0 300 QMenu *m_rightButtonLayerMenu;
Chris@34 301 QMenu *m_rightButtonTransformsMenu;
Chris@155 302 QMenu *m_rightButtonPlaybackMenu;
Chris@155 303
Chris@164 304 QAction *m_deleteSelectedAction;
Chris@155 305 QAction *m_ffwdAction;
Chris@155 306 QAction *m_rwdAction;
Chris@0 307
Chris@0 308 bool m_documentModified;
Chris@70 309 bool m_openingAudioFile;
Chris@70 310 bool m_abandoning;
Chris@0 311
Chris@189 312 Labeller *m_labeller;
Chris@189 313
Chris@116 314 int m_lastPlayStatusSec;
Chris@116 315 mutable QString m_myStatusMessage;
Chris@116 316
Chris@0 317 QPointer<PreferencesDialog> m_preferencesDialog;
Chris@177 318 QPointer<QTreeView> m_layerTreeView;
Chris@0 319
Chris@180 320 bool m_initialDarkBackground;
Chris@180 321
Chris@162 322 KeyReference *m_keyReference;
Chris@162 323
Chris@0 324 WaveFileModel *getMainModel();
Chris@116 325 const WaveFileModel *getMainModel() const;
Chris@0 326 void createDocument();
Chris@0 327
Chris@0 328 struct PaneConfiguration {
Chris@0 329 PaneConfiguration(LayerFactory::LayerType _layer
Chris@0 330 = LayerFactory::TimeRuler,
Chris@66 331 Model *_source = 0,
Chris@0 332 int _channel = -1) :
Chris@66 333 layer(_layer), sourceModel(_source), channel(_channel) { }
Chris@0 334 LayerFactory::LayerType layer;
Chris@66 335 Model *sourceModel;
Chris@0 336 int channel;
Chris@0 337 };
Chris@0 338
Chris@0 339 typedef std::map<QAction *, PaneConfiguration> PaneActionMap;
Chris@0 340 PaneActionMap m_paneActions;
Chris@0 341
Chris@107 342 typedef std::map<QAction *, TransformId> TransformActionMap;
Chris@34 343 TransformActionMap m_transformActions;
Chris@34 344
Chris@107 345 typedef std::map<TransformId, QAction *> TransformActionReverseMap;
Chris@34 346 TransformActionReverseMap m_transformActionsReverse;
Chris@0 347
Chris@0 348 typedef std::map<QAction *, LayerFactory::LayerType> LayerActionMap;
Chris@0 349 LayerActionMap m_layerActions;
Chris@0 350
Chris@0 351 typedef std::map<QAction *, Layer *> ExistingLayerActionMap;
Chris@0 352 ExistingLayerActionMap m_existingLayerActions;
Chris@95 353 ExistingLayerActionMap m_sliceActions;
Chris@0 354
Chris@0 355 typedef std::map<ViewManager::ToolMode, QAction *> ToolActionMap;
Chris@0 356 ToolActionMap m_toolActions;
Chris@0 357
Chris@189 358 typedef std::map<QAction *, int> NumberingActionMap;
Chris@189 359 NumberingActionMap m_numberingActions;
Chris@189 360
Chris@0 361 void setupMenus();
Chris@66 362 void setupFileMenu();
Chris@66 363 void setupEditMenu();
Chris@66 364 void setupViewMenu();
Chris@66 365 void setupPaneAndLayerMenus();
Chris@66 366 void setupTransformsMenu();
Chris@66 367 void setupHelpMenu();
Chris@95 368 void setupExistingLayersMenus();
Chris@0 369 void setupToolbars();
Chris@66 370
Chris@0 371 Pane *addPaneToStack();
Chris@0 372
Chris@69 373 void addPane(const PaneConfiguration &configuration, QString text);
Chris@69 374
Chris@155 375 Layer *getSnapLayer() const;
Chris@155 376
Chris@0 377 class PaneCallback : public SVFileReaderPaneCallback
Chris@0 378 {
Chris@0 379 public:
Chris@0 380 PaneCallback(MainWindow *mw) : m_mw(mw) { }
Chris@0 381 virtual Pane *addPane() { return m_mw->addPaneToStack(); }
Chris@0 382 virtual void setWindowSize(int width, int height) {
Chris@0 383 m_mw->resize(width, height);
Chris@0 384 }
Chris@0 385 virtual void addSelection(int start, int end) {
Chris@0 386 m_mw->m_viewManager->addSelection(Selection(start, end));
Chris@0 387 }
Chris@0 388 protected:
Chris@0 389 MainWindow *m_mw;
Chris@0 390 };
Chris@0 391
Chris@0 392 class AddPaneCommand : public Command
Chris@0 393 {
Chris@0 394 public:
Chris@0 395 AddPaneCommand(MainWindow *mw);
Chris@0 396 virtual ~AddPaneCommand();
Chris@0 397
Chris@0 398 virtual void execute();
Chris@0 399 virtual void unexecute();
Chris@0 400 virtual QString getName() const;
Chris@0 401
Chris@0 402 Pane *getPane() { return m_pane; }
Chris@0 403
Chris@0 404 protected:
Chris@0 405 MainWindow *m_mw;
Chris@0 406 Pane *m_pane; // Main window owns this, but I determine its lifespan
Chris@0 407 Pane *m_prevCurrentPane; // I don't own this
Chris@0 408 bool m_added;
Chris@0 409 };
Chris@0 410
Chris@0 411 class RemovePaneCommand : public Command
Chris@0 412 {
Chris@0 413 public:
Chris@0 414 RemovePaneCommand(MainWindow *mw, Pane *pane);
Chris@0 415 virtual ~RemovePaneCommand();
Chris@0 416
Chris@0 417 virtual void execute();
Chris@0 418 virtual void unexecute();
Chris@0 419 virtual QString getName() const;
Chris@0 420
Chris@0 421 protected:
Chris@0 422 MainWindow *m_mw;
Chris@0 423 Pane *m_pane; // Main window owns this, but I determine its lifespan
Chris@0 424 Pane *m_prevCurrentPane; // I don't own this
Chris@0 425 bool m_added;
Chris@0 426 };
Chris@0 427
Chris@0 428 virtual void closeEvent(QCloseEvent *e);
Chris@0 429 bool checkSaveModified();
Chris@0 430
Chris@86 431 FileOpenStatus openSomeFile(QString path, QString location,
Chris@86 432 AudioFileOpenMode = AskUser);
Chris@86 433 FileOpenStatus openAudioFile(QString path, QString location,
Chris@86 434 AudioFileOpenMode = AskUser);
Chris@180 435 FileOpenStatus openPlaylistFile(QString path, QString location,
Chris@180 436 AudioFileOpenMode = AskUser);
Chris@86 437 FileOpenStatus openLayerFile(QString path, QString location);
Chris@193 438 FileOpenStatus openImageFile(QString path, QString location);
Chris@86 439 FileOpenStatus openSessionFile(QString path, QString location);
Chris@86 440
Chris@88 441 QString getOpenFileName(FileFinder::FileType type);
Chris@88 442 QString getSaveFileName(FileFinder::FileType type);
Chris@88 443 void registerLastOpenedFilePath(FileFinder::FileType type, QString path);
Chris@81 444
Chris@0 445 void createPlayTarget();
Chris@0 446
Chris@0 447 void openHelpUrl(QString url);
Chris@0 448
Chris@116 449 void updateVisibleRangeDisplay(Pane *p) const;
Chris@116 450
Chris@0 451 void toXml(QTextStream &stream);
Chris@0 452 };
Chris@0 453
Chris@0 454
Chris@0 455 #endif