annotate main/MainWindow.h @ 88:51be0daa1386

Several changes related to referring to remote URLs for sessions and files: * Pull file dialog wrapper functions out from MainWindow into FileFinder * If a file referred to in a session is not found at its expected location, try a few other alternatives (same location as the session file or same location as the last audio file) before asking the user to locate it * Allow user to give a URL when locating an audio file, not just locate on the filesystem * Make wave file models remember the "original" location (e.g. URL) of the audio file, not just the actual location from which the data was loaded (e.g. local copy of that URL) -- when saving a session, use the original location so as not to refer to a temporary file * Clean up incompletely-downloaded local copies of files
author Chris Cannam
date Thu, 11 Jan 2007 13:29:58 +0000
parents 6113fdda2737
children 51ea003f8f99
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@26 52 class QPushButton;
Chris@69 53 class OSCQueue;
Chris@69 54 class OSCMessage;
Chris@0 55
Chris@0 56
Chris@0 57 class MainWindow : public QMainWindow
Chris@0 58 {
Chris@0 59 Q_OBJECT
Chris@0 60
Chris@0 61 public:
Chris@70 62 MainWindow(bool withAudioOutput = true,
Chris@70 63 bool withOSCSupport = true);
Chris@0 64 virtual ~MainWindow();
Chris@0 65
Chris@0 66 enum AudioFileOpenMode {
Chris@0 67 ReplaceMainModel,
Chris@0 68 CreateAdditionalModel,
Chris@0 69 AskUser
Chris@0 70 };
Chris@0 71
Chris@82 72 enum FileOpenStatus {
Chris@82 73 FileOpenSucceeded,
Chris@82 74 FileOpenFailed,
Chris@82 75 FileOpenCancelled
Chris@82 76 };
Chris@82 77
Chris@82 78 FileOpenStatus openSomeFile(QString path, AudioFileOpenMode = AskUser);
Chris@82 79 FileOpenStatus openAudioFile(QString path, AudioFileOpenMode = AskUser);
Chris@82 80 FileOpenStatus openLayerFile(QString path);
Chris@82 81 FileOpenStatus openSessionFile(QString path);
Chris@85 82 FileOpenStatus openURL(QUrl url);
Chris@82 83
Chris@0 84 bool saveSessionFile(QString path);
Chris@11 85 bool commitData(bool mayAskUser); // on session shutdown
Chris@0 86
Chris@0 87 signals:
Chris@0 88 // Used to toggle the availability of menu actions
Chris@0 89 void canAddPane(bool);
Chris@0 90 void canDeleteCurrentPane(bool);
Chris@0 91 void canAddLayer(bool);
Chris@0 92 void canImportMoreAudio(bool);
Chris@0 93 void canImportLayer(bool);
Chris@0 94 void canExportAudio(bool);
Chris@0 95 void canExportLayer(bool);
Chris@0 96 void canRenameLayer(bool);
Chris@0 97 void canEditLayer(bool);
Chris@0 98 void canSelect(bool);
Chris@0 99 void canClearSelection(bool);
Chris@0 100 void canEditSelection(bool);
Chris@0 101 void canPaste(bool);
Chris@0 102 void canInsertInstant(bool);
Chris@81 103 void canInsertInstantsAtBoundaries(bool);
Chris@0 104 void canDeleteCurrentLayer(bool);
Chris@0 105 void canZoom(bool);
Chris@0 106 void canScroll(bool);
Chris@0 107 void canPlay(bool);
Chris@0 108 void canFfwd(bool);
Chris@0 109 void canRewind(bool);
Chris@0 110 void canPlaySelection(bool);
Chris@0 111 void canSave(bool);
Chris@0 112
Chris@0 113 protected slots:
Chris@0 114 void openSession();
Chris@0 115 void importAudio();
Chris@0 116 void importMoreAudio();
Chris@0 117 void openSomething();
Chris@86 118 void openLocation();
Chris@0 119 void openRecentFile();
Chris@0 120 void exportAudio();
Chris@0 121 void importLayer();
Chris@0 122 void exportLayer();
Chris@0 123 void saveSession();
Chris@0 124 void saveSessionAs();
Chris@0 125 void newSession();
Chris@0 126 void closeSession();
Chris@0 127 void preferences();
Chris@0 128
Chris@0 129 void zoomIn();
Chris@0 130 void zoomOut();
Chris@0 131 void zoomToFit();
Chris@0 132 void zoomDefault();
Chris@0 133 void scrollLeft();
Chris@0 134 void scrollRight();
Chris@0 135 void jumpLeft();
Chris@0 136 void jumpRight();
Chris@0 137
Chris@0 138 void showNoOverlays();
Chris@0 139 void showBasicOverlays();
Chris@7 140 void showAllTextOverlays();
Chris@7 141
Chris@7 142 void toggleZoomWheels();
Chris@72 143 void togglePropertyBoxes();
Chris@0 144
Chris@0 145 void play();
Chris@0 146 void ffwd();
Chris@0 147 void ffwdEnd();
Chris@0 148 void rewind();
Chris@0 149 void rewindStart();
Chris@0 150 void stop();
Chris@0 151
Chris@0 152 void addPane();
Chris@0 153 void addLayer();
Chris@0 154 void deleteCurrentPane();
Chris@0 155 void renameCurrentLayer();
Chris@0 156 void deleteCurrentLayer();
Chris@0 157
Chris@0 158 void playLoopToggled();
Chris@0 159 void playSelectionToggled();
Chris@0 160 void playSpeedChanged(int);
Chris@16 161 void playSharpenToggled();
Chris@26 162 void playMonoToggled();
Chris@0 163 void sampleRateMismatch(size_t, size_t, bool);
Chris@42 164 void audioOverloadPluginDisabled();
Chris@0 165
Chris@0 166 void outputLevelsChanged(float, float);
Chris@0 167
Chris@0 168 void currentPaneChanged(Pane *);
Chris@0 169 void currentLayerChanged(Pane *, Layer *);
Chris@0 170
Chris@0 171 void toolNavigateSelected();
Chris@0 172 void toolSelectSelected();
Chris@0 173 void toolEditSelected();
Chris@0 174 void toolDrawSelected();
Chris@0 175
Chris@0 176 void selectAll();
Chris@0 177 void selectToStart();
Chris@0 178 void selectToEnd();
Chris@0 179 void selectVisible();
Chris@0 180 void clearSelection();
Chris@0 181 void cut();
Chris@0 182 void copy();
Chris@0 183 void paste();
Chris@0 184 void deleteSelected();
Chris@0 185 void insertInstant();
Chris@81 186 void insertInstantAt(size_t);
Chris@81 187 void insertInstantsAtBoundaries();
Chris@0 188
Chris@0 189 void documentModified();
Chris@0 190 void documentRestored();
Chris@0 191
Chris@0 192 void updateMenuStates();
Chris@0 193 void updateDescriptionLabel();
Chris@0 194
Chris@0 195 void layerAdded(Layer *);
Chris@0 196 void layerRemoved(Layer *);
Chris@0 197 void layerAboutToBeDeleted(Layer *);
Chris@0 198 void layerInAView(Layer *, bool);
Chris@0 199
Chris@0 200 void mainModelChanged(WaveFileModel *);
Chris@0 201 void modelAdded(Model *);
Chris@0 202 void modelAboutToBeDeleted(Model *);
Chris@0 203
Chris@0 204 void modelGenerationFailed(QString);
Chris@0 205 void modelRegenerationFailed(QString, QString);
Chris@0 206
Chris@0 207 void rightButtonMenuRequested(Pane *, QPoint point);
Chris@0 208
Chris@73 209 void propertyStacksResized();
Chris@73 210
Chris@0 211 void preferenceChanged(PropertyContainer::PropertyName);
Chris@0 212
Chris@0 213 void setupRecentFilesMenu();
Chris@34 214 void setupRecentTransformsMenu();
Chris@0 215
Chris@0 216 void showLayerTree();
Chris@0 217
Chris@69 218 void pollOSC();
Chris@69 219 void handleOSCMessage(const OSCMessage &);
Chris@69 220
Chris@0 221 void website();
Chris@0 222 void help();
Chris@0 223 void about();
Chris@0 224
Chris@0 225 protected:
Chris@0 226 QString m_sessionFile;
Chris@0 227 QString m_audioFile;
Chris@0 228 Document *m_document;
Chris@0 229
Chris@0 230 QLabel *m_descriptionLabel;
Chris@0 231 PaneStack *m_paneStack;
Chris@0 232 ViewManager *m_viewManager;
Chris@65 233 Overview *m_overview;
Chris@0 234 Fader *m_fader;
Chris@0 235 AudioDial *m_playSpeed;
Chris@26 236 QPushButton *m_playSharpen;
Chris@26 237 QPushButton *m_playMono;
Chris@0 238 WaveformLayer *m_panLayer;
Chris@0 239 Layer *m_timeRulerLayer;
Chris@0 240
Chris@46 241 bool m_audioOutput;
Chris@0 242 AudioCallbackPlaySource *m_playSource;
Chris@0 243 AudioCallbackPlayTarget *m_playTarget;
Chris@0 244
Chris@69 245 OSCQueue *m_oscQueue;
Chris@69 246
Chris@34 247 RecentFiles m_recentFiles;
Chris@34 248 RecentFiles m_recentTransforms;
Chris@34 249
Chris@0 250 bool m_mainMenusCreated;
Chris@0 251 QMenu *m_paneMenu;
Chris@0 252 QMenu *m_layerMenu;
Chris@34 253 QMenu *m_transformsMenu;
Chris@0 254 QMenu *m_existingLayersMenu;
Chris@0 255 QMenu *m_recentFilesMenu;
Chris@34 256 QMenu *m_recentTransformsMenu;
Chris@0 257 QMenu *m_rightButtonMenu;
Chris@0 258 QMenu *m_rightButtonLayerMenu;
Chris@34 259 QMenu *m_rightButtonTransformsMenu;
Chris@0 260
Chris@0 261 bool m_documentModified;
Chris@70 262 bool m_openingAudioFile;
Chris@70 263 bool m_abandoning;
Chris@0 264
Chris@0 265 QPointer<PreferencesDialog> m_preferencesDialog;
Chris@0 266
Chris@0 267 WaveFileModel *getMainModel();
Chris@0 268 void createDocument();
Chris@0 269
Chris@0 270 struct PaneConfiguration {
Chris@0 271 PaneConfiguration(LayerFactory::LayerType _layer
Chris@0 272 = LayerFactory::TimeRuler,
Chris@66 273 Model *_source = 0,
Chris@0 274 int _channel = -1) :
Chris@66 275 layer(_layer), sourceModel(_source), channel(_channel) { }
Chris@0 276 LayerFactory::LayerType layer;
Chris@66 277 Model *sourceModel;
Chris@0 278 int channel;
Chris@0 279 };
Chris@0 280
Chris@0 281 typedef std::map<QAction *, PaneConfiguration> PaneActionMap;
Chris@0 282 PaneActionMap m_paneActions;
Chris@0 283
Chris@0 284 typedef std::map<QAction *, TransformName> TransformActionMap;
Chris@34 285 TransformActionMap m_transformActions;
Chris@34 286
Chris@34 287 typedef std::map<TransformName, QAction *> TransformActionReverseMap;
Chris@34 288 TransformActionReverseMap m_transformActionsReverse;
Chris@0 289
Chris@0 290 typedef std::map<QAction *, LayerFactory::LayerType> LayerActionMap;
Chris@0 291 LayerActionMap m_layerActions;
Chris@0 292
Chris@0 293 typedef std::map<QAction *, Layer *> ExistingLayerActionMap;
Chris@0 294 ExistingLayerActionMap m_existingLayerActions;
Chris@0 295
Chris@0 296 typedef std::map<ViewManager::ToolMode, QAction *> ToolActionMap;
Chris@0 297 ToolActionMap m_toolActions;
Chris@0 298
Chris@0 299 void setupMenus();
Chris@66 300 void setupFileMenu();
Chris@66 301 void setupEditMenu();
Chris@66 302 void setupViewMenu();
Chris@66 303 void setupPaneAndLayerMenus();
Chris@66 304 void setupTransformsMenu();
Chris@66 305 void setupHelpMenu();
Chris@0 306 void setupExistingLayersMenu();
Chris@0 307 void setupToolbars();
Chris@66 308
Chris@0 309 Pane *addPaneToStack();
Chris@0 310
Chris@69 311 void addPane(const PaneConfiguration &configuration, QString text);
Chris@69 312
Chris@0 313 class PaneCallback : public SVFileReaderPaneCallback
Chris@0 314 {
Chris@0 315 public:
Chris@0 316 PaneCallback(MainWindow *mw) : m_mw(mw) { }
Chris@0 317 virtual Pane *addPane() { return m_mw->addPaneToStack(); }
Chris@0 318 virtual void setWindowSize(int width, int height) {
Chris@0 319 m_mw->resize(width, height);
Chris@0 320 }
Chris@0 321 virtual void addSelection(int start, int end) {
Chris@0 322 m_mw->m_viewManager->addSelection(Selection(start, end));
Chris@0 323 }
Chris@0 324 protected:
Chris@0 325 MainWindow *m_mw;
Chris@0 326 };
Chris@0 327
Chris@0 328 class AddPaneCommand : public Command
Chris@0 329 {
Chris@0 330 public:
Chris@0 331 AddPaneCommand(MainWindow *mw);
Chris@0 332 virtual ~AddPaneCommand();
Chris@0 333
Chris@0 334 virtual void execute();
Chris@0 335 virtual void unexecute();
Chris@0 336 virtual QString getName() const;
Chris@0 337
Chris@0 338 Pane *getPane() { return m_pane; }
Chris@0 339
Chris@0 340 protected:
Chris@0 341 MainWindow *m_mw;
Chris@0 342 Pane *m_pane; // Main window owns this, but I determine its lifespan
Chris@0 343 Pane *m_prevCurrentPane; // I don't own this
Chris@0 344 bool m_added;
Chris@0 345 };
Chris@0 346
Chris@0 347 class RemovePaneCommand : public Command
Chris@0 348 {
Chris@0 349 public:
Chris@0 350 RemovePaneCommand(MainWindow *mw, Pane *pane);
Chris@0 351 virtual ~RemovePaneCommand();
Chris@0 352
Chris@0 353 virtual void execute();
Chris@0 354 virtual void unexecute();
Chris@0 355 virtual QString getName() const;
Chris@0 356
Chris@0 357 protected:
Chris@0 358 MainWindow *m_mw;
Chris@0 359 Pane *m_pane; // Main window owns this, but I determine its lifespan
Chris@0 360 Pane *m_prevCurrentPane; // I don't own this
Chris@0 361 bool m_added;
Chris@0 362 };
Chris@0 363
Chris@0 364 virtual void closeEvent(QCloseEvent *e);
Chris@0 365 bool checkSaveModified();
Chris@0 366
Chris@86 367 FileOpenStatus openSomeFile(QString path, QString location,
Chris@86 368 AudioFileOpenMode = AskUser);
Chris@86 369 FileOpenStatus openAudioFile(QString path, QString location,
Chris@86 370 AudioFileOpenMode = AskUser);
Chris@86 371 FileOpenStatus openLayerFile(QString path, QString location);
Chris@86 372 FileOpenStatus openSessionFile(QString path, QString location);
Chris@86 373
Chris@88 374 QString getOpenFileName(FileFinder::FileType type);
Chris@88 375 QString getSaveFileName(FileFinder::FileType type);
Chris@88 376 void registerLastOpenedFilePath(FileFinder::FileType type, QString path);
Chris@81 377
Chris@0 378 void createPlayTarget();
Chris@0 379
Chris@0 380 void openHelpUrl(QString url);
Chris@0 381
Chris@0 382 void toXml(QTextStream &stream);
Chris@0 383 };
Chris@0 384
Chris@0 385
Chris@0 386 #endif