annotate main/MainWindow.h @ 25:e74f508db18c

* Add setRatio method to the time stretcher, and make it possible to change the ratio without having to construct and replace the time stretcher. This means we can do it seamlessly. Add a lot more ratios to the time stretch control in the main window
author Chris Cannam
date Fri, 15 Sep 2006 15:35:06 +0000
parents 3715efc38f95
children d88d117e0c34
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@0 7 This file copyright 2006 Chris Cannam.
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@0 21 #include <QMainWindow>
Chris@0 22 #include <QPointer>
Chris@0 23
Chris@0 24 #include "base/Command.h"
Chris@1 25 #include "view/ViewManager.h"
Chris@0 26 #include "base/PropertyContainer.h"
Chris@0 27 #include "layer/LayerFactory.h"
Chris@0 28 #include "transform/Transform.h"
Chris@1 29 #include "document/SVFileReader.h"
Chris@0 30 #include <map>
Chris@0 31
Chris@0 32 class Document;
Chris@0 33 class PaneStack;
Chris@0 34 class Pane;
Chris@0 35 class View;
Chris@0 36 class Fader;
Chris@0 37 class Panner;
Chris@0 38 class Layer;
Chris@0 39 class WaveformLayer;
Chris@0 40 class WaveFileModel;
Chris@0 41 class AudioCallbackPlaySource;
Chris@0 42 class AudioCallbackPlayTarget;
Chris@0 43 class CommandHistory;
Chris@0 44 class QMenu;
Chris@0 45 class AudioDial;
Chris@0 46 class QLabel;
Chris@16 47 class QCheckBox;
Chris@0 48 class PreferencesDialog;
Chris@0 49
Chris@0 50
Chris@0 51 class MainWindow : public QMainWindow
Chris@0 52 {
Chris@0 53 Q_OBJECT
Chris@0 54
Chris@0 55 public:
Chris@0 56 MainWindow();
Chris@0 57 virtual ~MainWindow();
Chris@0 58
Chris@0 59 enum AudioFileOpenMode {
Chris@0 60 ReplaceMainModel,
Chris@0 61 CreateAdditionalModel,
Chris@0 62 AskUser
Chris@0 63 };
Chris@0 64
Chris@0 65 bool openSomeFile(QString path);
Chris@0 66 bool openAudioFile(QString path, AudioFileOpenMode = AskUser);
Chris@0 67 bool openLayerFile(QString path);
Chris@0 68 bool openSessionFile(QString path);
Chris@0 69 bool saveSessionFile(QString path);
Chris@11 70 bool commitData(bool mayAskUser); // on session shutdown
Chris@0 71
Chris@0 72 signals:
Chris@0 73 // Used to toggle the availability of menu actions
Chris@0 74 void canAddPane(bool);
Chris@0 75 void canDeleteCurrentPane(bool);
Chris@0 76 void canAddLayer(bool);
Chris@0 77 void canImportMoreAudio(bool);
Chris@0 78 void canImportLayer(bool);
Chris@0 79 void canExportAudio(bool);
Chris@0 80 void canExportLayer(bool);
Chris@0 81 void canRenameLayer(bool);
Chris@0 82 void canEditLayer(bool);
Chris@0 83 void canSelect(bool);
Chris@0 84 void canClearSelection(bool);
Chris@0 85 void canEditSelection(bool);
Chris@0 86 void canPaste(bool);
Chris@0 87 void canInsertInstant(bool);
Chris@0 88 void canDeleteCurrentLayer(bool);
Chris@0 89 void canZoom(bool);
Chris@0 90 void canScroll(bool);
Chris@0 91 void canPlay(bool);
Chris@0 92 void canFfwd(bool);
Chris@0 93 void canRewind(bool);
Chris@0 94 void canPlaySelection(bool);
Chris@0 95 void canSave(bool);
Chris@0 96
Chris@0 97 protected slots:
Chris@0 98 void openSession();
Chris@0 99 void importAudio();
Chris@0 100 void importMoreAudio();
Chris@0 101 void openSomething();
Chris@0 102 void openRecentFile();
Chris@0 103 void exportAudio();
Chris@0 104 void importLayer();
Chris@0 105 void exportLayer();
Chris@0 106 void saveSession();
Chris@0 107 void saveSessionAs();
Chris@0 108 void newSession();
Chris@0 109 void closeSession();
Chris@0 110 void preferences();
Chris@0 111
Chris@0 112 void zoomIn();
Chris@0 113 void zoomOut();
Chris@0 114 void zoomToFit();
Chris@0 115 void zoomDefault();
Chris@0 116 void scrollLeft();
Chris@0 117 void scrollRight();
Chris@0 118 void jumpLeft();
Chris@0 119 void jumpRight();
Chris@0 120
Chris@0 121 void showNoOverlays();
Chris@0 122 void showBasicOverlays();
Chris@7 123 void showAllTextOverlays();
Chris@7 124
Chris@7 125 void toggleZoomWheels();
Chris@0 126
Chris@0 127 void play();
Chris@0 128 void ffwd();
Chris@0 129 void ffwdEnd();
Chris@0 130 void rewind();
Chris@0 131 void rewindStart();
Chris@0 132 void stop();
Chris@0 133
Chris@0 134 void addPane();
Chris@0 135 void addLayer();
Chris@0 136 void deleteCurrentPane();
Chris@0 137 void renameCurrentLayer();
Chris@0 138 void deleteCurrentLayer();
Chris@0 139
Chris@0 140 void playLoopToggled();
Chris@0 141 void playSelectionToggled();
Chris@0 142 void playSpeedChanged(int);
Chris@16 143 void playSharpenToggled();
Chris@0 144 void sampleRateMismatch(size_t, size_t, bool);
Chris@0 145
Chris@0 146 void outputLevelsChanged(float, float);
Chris@0 147
Chris@0 148 void currentPaneChanged(Pane *);
Chris@0 149 void currentLayerChanged(Pane *, Layer *);
Chris@0 150
Chris@0 151 void toolNavigateSelected();
Chris@0 152 void toolSelectSelected();
Chris@0 153 void toolEditSelected();
Chris@0 154 void toolDrawSelected();
Chris@0 155
Chris@0 156 void selectAll();
Chris@0 157 void selectToStart();
Chris@0 158 void selectToEnd();
Chris@0 159 void selectVisible();
Chris@0 160 void clearSelection();
Chris@0 161 void cut();
Chris@0 162 void copy();
Chris@0 163 void paste();
Chris@0 164 void deleteSelected();
Chris@0 165 void insertInstant();
Chris@0 166
Chris@0 167 void documentModified();
Chris@0 168 void documentRestored();
Chris@0 169
Chris@0 170 void updateMenuStates();
Chris@0 171 void updateDescriptionLabel();
Chris@0 172
Chris@0 173 void layerAdded(Layer *);
Chris@0 174 void layerRemoved(Layer *);
Chris@0 175 void layerAboutToBeDeleted(Layer *);
Chris@0 176 void layerInAView(Layer *, bool);
Chris@0 177
Chris@0 178 void mainModelChanged(WaveFileModel *);
Chris@0 179 void modelAdded(Model *);
Chris@0 180 void modelAboutToBeDeleted(Model *);
Chris@0 181
Chris@0 182 void modelGenerationFailed(QString);
Chris@0 183 void modelRegenerationFailed(QString, QString);
Chris@0 184
Chris@0 185 void rightButtonMenuRequested(Pane *, QPoint point);
Chris@0 186
Chris@0 187 void preferenceChanged(PropertyContainer::PropertyName);
Chris@0 188
Chris@0 189 void setupRecentFilesMenu();
Chris@0 190
Chris@0 191 void showLayerTree();
Chris@0 192
Chris@0 193 void website();
Chris@0 194 void help();
Chris@0 195 void about();
Chris@0 196
Chris@0 197 protected:
Chris@0 198 QString m_sessionFile;
Chris@0 199 QString m_audioFile;
Chris@0 200 Document *m_document;
Chris@0 201
Chris@0 202 QLabel *m_descriptionLabel;
Chris@0 203 PaneStack *m_paneStack;
Chris@0 204 ViewManager *m_viewManager;
Chris@0 205 Panner *m_panner;
Chris@0 206 Fader *m_fader;
Chris@0 207 AudioDial *m_playSpeed;
Chris@16 208 QCheckBox *m_playSharpen;
Chris@0 209 WaveformLayer *m_panLayer;
Chris@0 210 Layer *m_timeRulerLayer;
Chris@0 211
Chris@0 212 AudioCallbackPlaySource *m_playSource;
Chris@0 213 AudioCallbackPlayTarget *m_playTarget;
Chris@0 214
Chris@0 215 bool m_mainMenusCreated;
Chris@0 216 QMenu *m_paneMenu;
Chris@0 217 QMenu *m_layerMenu;
Chris@0 218 QMenu *m_existingLayersMenu;
Chris@0 219 QMenu *m_recentFilesMenu;
Chris@0 220 QMenu *m_rightButtonMenu;
Chris@0 221 QMenu *m_rightButtonLayerMenu;
Chris@0 222
Chris@0 223 bool m_documentModified;
Chris@0 224
Chris@0 225 QPointer<PreferencesDialog> m_preferencesDialog;
Chris@0 226
Chris@0 227 WaveFileModel *getMainModel();
Chris@0 228 void createDocument();
Chris@0 229
Chris@0 230 struct PaneConfiguration {
Chris@0 231 PaneConfiguration(LayerFactory::LayerType _layer
Chris@0 232 = LayerFactory::TimeRuler,
Chris@0 233 int _channel = -1) :
Chris@0 234 layer(_layer), channel(_channel) { }
Chris@0 235 LayerFactory::LayerType layer;
Chris@0 236 int channel;
Chris@0 237 };
Chris@0 238
Chris@0 239 typedef std::map<QAction *, PaneConfiguration> PaneActionMap;
Chris@0 240 PaneActionMap m_paneActions;
Chris@0 241
Chris@0 242 typedef std::map<QAction *, TransformName> TransformActionMap;
Chris@0 243 TransformActionMap m_layerTransformActions;
Chris@0 244
Chris@0 245 typedef std::map<QAction *, LayerFactory::LayerType> LayerActionMap;
Chris@0 246 LayerActionMap m_layerActions;
Chris@0 247
Chris@0 248 typedef std::map<QAction *, Layer *> ExistingLayerActionMap;
Chris@0 249 ExistingLayerActionMap m_existingLayerActions;
Chris@0 250
Chris@0 251 typedef std::map<ViewManager::ToolMode, QAction *> ToolActionMap;
Chris@0 252 ToolActionMap m_toolActions;
Chris@0 253
Chris@0 254 void setupMenus();
Chris@0 255 void setupExistingLayersMenu();
Chris@0 256 void setupToolbars();
Chris@0 257 Pane *addPaneToStack();
Chris@0 258
Chris@0 259 class PaneCallback : public SVFileReaderPaneCallback
Chris@0 260 {
Chris@0 261 public:
Chris@0 262 PaneCallback(MainWindow *mw) : m_mw(mw) { }
Chris@0 263 virtual Pane *addPane() { return m_mw->addPaneToStack(); }
Chris@0 264 virtual void setWindowSize(int width, int height) {
Chris@0 265 m_mw->resize(width, height);
Chris@0 266 }
Chris@0 267 virtual void addSelection(int start, int end) {
Chris@0 268 m_mw->m_viewManager->addSelection(Selection(start, end));
Chris@0 269 }
Chris@0 270 protected:
Chris@0 271 MainWindow *m_mw;
Chris@0 272 };
Chris@0 273
Chris@0 274 class AddPaneCommand : public Command
Chris@0 275 {
Chris@0 276 public:
Chris@0 277 AddPaneCommand(MainWindow *mw);
Chris@0 278 virtual ~AddPaneCommand();
Chris@0 279
Chris@0 280 virtual void execute();
Chris@0 281 virtual void unexecute();
Chris@0 282 virtual QString getName() const;
Chris@0 283
Chris@0 284 Pane *getPane() { return m_pane; }
Chris@0 285
Chris@0 286 protected:
Chris@0 287 MainWindow *m_mw;
Chris@0 288 Pane *m_pane; // Main window owns this, but I determine its lifespan
Chris@0 289 Pane *m_prevCurrentPane; // I don't own this
Chris@0 290 bool m_added;
Chris@0 291 };
Chris@0 292
Chris@0 293 class RemovePaneCommand : public Command
Chris@0 294 {
Chris@0 295 public:
Chris@0 296 RemovePaneCommand(MainWindow *mw, Pane *pane);
Chris@0 297 virtual ~RemovePaneCommand();
Chris@0 298
Chris@0 299 virtual void execute();
Chris@0 300 virtual void unexecute();
Chris@0 301 virtual QString getName() const;
Chris@0 302
Chris@0 303 protected:
Chris@0 304 MainWindow *m_mw;
Chris@0 305 Pane *m_pane; // Main window owns this, but I determine its lifespan
Chris@0 306 Pane *m_prevCurrentPane; // I don't own this
Chris@0 307 bool m_added;
Chris@0 308 };
Chris@0 309
Chris@0 310 virtual void closeEvent(QCloseEvent *e);
Chris@0 311 bool checkSaveModified();
Chris@0 312
Chris@0 313 void createPlayTarget();
Chris@0 314
Chris@0 315 void openHelpUrl(QString url);
Chris@0 316
Chris@0 317 void toXml(QTextStream &stream);
Chris@0 318 };
Chris@0 319
Chris@0 320
Chris@0 321 #endif