annotate sv/main/MainWindow.h @ 0:fc9323a41f5a

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