annotate main/MainWindowBase.h @ 202:738968d96e19

...
author Chris Cannam
date Wed, 24 Oct 2007 16:00:30 +0000
parents 1871581e4da9
children
rev   line source
Chris@200 1 /* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
Chris@200 2
Chris@200 3 /*
Chris@200 4 Sonic Visualiser
Chris@200 5 An audio file viewer and annotation editor.
Chris@200 6 Centre for Digital Music, Queen Mary, University of London.
Chris@200 7 This file copyright 2006-2007 Chris Cannam and QMUL.
Chris@200 8
Chris@200 9 This program is free software; you can redistribute it and/or
Chris@200 10 modify it under the terms of the GNU General Public License as
Chris@200 11 published by the Free Software Foundation; either version 2 of the
Chris@200 12 License, or (at your option) any later version. See the file
Chris@200 13 COPYING included with this distribution for more information.
Chris@200 14 */
Chris@200 15
Chris@200 16 #ifndef _MAIN_WINDOW_BASE_H_
Chris@200 17 #define _MAIN_WINDOW_BASE_H_
Chris@200 18
Chris@200 19 #include <QFrame>
Chris@200 20 #include <QString>
Chris@200 21 #include <QUrl>
Chris@200 22 #include <QMainWindow>
Chris@200 23 #include <QPointer>
Chris@200 24
Chris@200 25 #include "base/Command.h"
Chris@200 26 #include "view/ViewManager.h"
Chris@200 27 #include "base/PropertyContainer.h"
Chris@200 28 #include "base/RecentFiles.h"
Chris@200 29 #include "layer/LayerFactory.h"
Chris@200 30 #include "transform/Transform.h"
Chris@200 31 #include "document/SVFileReader.h"
Chris@200 32 #include "data/fileio/FileFinder.h"
Chris@200 33 #include "data/fileio/FileSource.h"
Chris@200 34 #include <map>
Chris@200 35
Chris@200 36 class Document;
Chris@200 37 class PaneStack;
Chris@200 38 class Pane;
Chris@200 39 class View;
Chris@200 40 class Fader;
Chris@200 41 class Overview;
Chris@200 42 class Layer;
Chris@200 43 class WaveformLayer;
Chris@200 44 class WaveFileModel;
Chris@200 45 class AudioCallbackPlaySource;
Chris@200 46 class AudioCallbackPlayTarget;
Chris@200 47 class CommandHistory;
Chris@200 48 class QMenu;
Chris@200 49 class AudioDial;
Chris@200 50 class QLabel;
Chris@200 51 class QCheckBox;
Chris@200 52 class PreferencesDialog;
Chris@200 53 class QTreeView;
Chris@200 54 class QPushButton;
Chris@200 55 class OSCQueue;
Chris@200 56 class OSCMessage;
Chris@200 57 class KeyReference;
Chris@200 58 class Labeller;
Chris@200 59
Chris@200 60 /**
Chris@200 61 * The base class for the SV main window. This includes everything to
Chris@200 62 * do with general document and pane stack management, but nothing
Chris@200 63 * that involves user interaction -- this doesn't create the widget or
Chris@200 64 * menu structures or editing tools, and if a function needs to open a
Chris@200 65 * dialog, it shouldn't be in here. This permits "variations on SV"
Chris@200 66 * to use different subclasses retaining the same general structure.
Chris@200 67 */
Chris@200 68
Chris@200 69 class MainWindowBase : public QMainWindow
Chris@200 70 {
Chris@200 71 Q_OBJECT
Chris@200 72
Chris@200 73 public:
Chris@200 74 MainWindowBase(bool withAudioOutput, bool withOSCSupport);
Chris@200 75 virtual ~MainWindowBase();
Chris@200 76
Chris@200 77 enum AudioFileOpenMode {
Chris@200 78 ReplaceMainModel,
Chris@200 79 CreateAdditionalModel,
Chris@200 80 ReplaceCurrentPane,
Chris@200 81 AskUser
Chris@200 82 };
Chris@200 83
Chris@200 84 enum FileOpenStatus {
Chris@200 85 FileOpenSucceeded,
Chris@200 86 FileOpenFailed,
Chris@200 87 FileOpenCancelled,
Chris@200 88 FileOpenWrongMode // attempted to open layer when no main model present
Chris@200 89 };
Chris@200 90
Chris@200 91 virtual FileOpenStatus open(QString fileOrUrl, AudioFileOpenMode = AskUser);
Chris@200 92 virtual FileOpenStatus open(FileSource source, AudioFileOpenMode = AskUser);
Chris@200 93
Chris@200 94 virtual FileOpenStatus openAudio(FileSource source, AudioFileOpenMode = AskUser);
Chris@200 95 virtual FileOpenStatus openPlaylist(FileSource source, AudioFileOpenMode = AskUser);
Chris@200 96 virtual FileOpenStatus openLayer(FileSource source);
Chris@200 97 virtual FileOpenStatus openImage(FileSource source);
Chris@200 98
Chris@200 99 virtual FileOpenStatus openSessionFile(QString fileOrUrl);
Chris@200 100 virtual FileOpenStatus openSession(FileSource source);
Chris@200 101
Chris@200 102 virtual bool saveSessionFile(QString path);
Chris@200 103
Chris@200 104 signals:
Chris@200 105 // Used to toggle the availability of menu actions
Chris@200 106 void canAddPane(bool);
Chris@200 107 void canDeleteCurrentPane(bool);
Chris@200 108 void canAddLayer(bool);
Chris@200 109 void canImportMoreAudio(bool);
Chris@200 110 void canImportLayer(bool);
Chris@200 111 void canExportAudio(bool);
Chris@200 112 void canExportLayer(bool);
Chris@200 113 void canExportImage(bool);
Chris@200 114 void canRenameLayer(bool);
Chris@200 115 void canEditLayer(bool);
Chris@200 116 void canMeasureLayer(bool);
Chris@200 117 void canSelect(bool);
Chris@200 118 void canClearSelection(bool);
Chris@200 119 void canEditSelection(bool);
Chris@200 120 void canDeleteSelection(bool);
Chris@200 121 void canPaste(bool);
Chris@200 122 void canInsertInstant(bool);
Chris@200 123 void canInsertInstantsAtBoundaries(bool);
Chris@200 124 void canRenumberInstants(bool);
Chris@200 125 void canDeleteCurrentLayer(bool);
Chris@200 126 void canZoom(bool);
Chris@200 127 void canScroll(bool);
Chris@200 128 void canPlay(bool);
Chris@200 129 void canFfwd(bool);
Chris@200 130 void canRewind(bool);
Chris@200 131 void canPlaySelection(bool);
Chris@200 132 void canSpeedUpPlayback(bool);
Chris@200 133 void canSlowDownPlayback(bool);
Chris@200 134 void canChangePlaybackSpeed(bool);
Chris@200 135 void canSave(bool);
Chris@200 136
Chris@200 137 public slots:
Chris@200 138 virtual void preferenceChanged(PropertyContainer::PropertyName);
Chris@200 139
Chris@200 140 protected slots:
Chris@200 141 virtual void zoomIn();
Chris@200 142 virtual void zoomOut();
Chris@200 143 virtual void zoomToFit();
Chris@200 144 virtual void zoomDefault();
Chris@200 145 virtual void scrollLeft();
Chris@200 146 virtual void scrollRight();
Chris@200 147 virtual void jumpLeft();
Chris@200 148 virtual void jumpRight();
Chris@200 149
Chris@200 150 virtual void showNoOverlays();
Chris@200 151 virtual void showMinimalOverlays();
Chris@200 152 virtual void showStandardOverlays();
Chris@200 153 virtual void showAllOverlays();
Chris@200 154
Chris@200 155 virtual void toggleZoomWheels();
Chris@200 156 virtual void togglePropertyBoxes();
Chris@200 157 virtual void toggleStatusBar();
Chris@200 158
Chris@200 159 virtual void play();
Chris@200 160 virtual void ffwd();
Chris@200 161 virtual void ffwdEnd();
Chris@200 162 virtual void rewind();
Chris@200 163 virtual void rewindStart();
Chris@200 164 virtual void stop();
Chris@200 165
Chris@200 166 virtual void deleteCurrentPane();
Chris@200 167 virtual void deleteCurrentLayer();
Chris@200 168
Chris@200 169 virtual void playLoopToggled();
Chris@200 170 virtual void playSelectionToggled();
Chris@200 171 virtual void playSoloToggled();
Chris@200 172
Chris@200 173 virtual void sampleRateMismatch(size_t, size_t, bool) = 0;
Chris@200 174 virtual void audioOverloadPluginDisabled() = 0;
Chris@200 175
Chris@200 176 virtual void playbackFrameChanged(unsigned long);
Chris@200 177 virtual void globalCentreFrameChanged(unsigned long);
Chris@200 178 virtual void viewCentreFrameChanged(View *, unsigned long);
Chris@200 179 virtual void viewZoomLevelChanged(View *, unsigned long, bool);
Chris@200 180 virtual void outputLevelsChanged(float, float) = 0;
Chris@200 181
Chris@200 182 virtual void currentPaneChanged(Pane *);
Chris@200 183 virtual void currentLayerChanged(Pane *, Layer *);
Chris@200 184
Chris@200 185 virtual void selectAll();
Chris@200 186 virtual void selectToStart();
Chris@200 187 virtual void selectToEnd();
Chris@200 188 virtual void selectVisible();
Chris@200 189 virtual void clearSelection();
Chris@200 190
Chris@200 191 virtual void cut();
Chris@200 192 virtual void copy();
Chris@200 193 virtual void paste();
Chris@200 194 virtual void deleteSelected();
Chris@200 195
Chris@200 196 virtual void insertInstant();
Chris@200 197 virtual void insertInstantAt(size_t);
Chris@200 198 virtual void insertInstantsAtBoundaries();
Chris@200 199 virtual void renumberInstants();
Chris@200 200
Chris@200 201 virtual void documentModified();
Chris@200 202 virtual void documentRestored();
Chris@200 203
Chris@200 204 virtual void layerAdded(Layer *);
Chris@200 205 virtual void layerRemoved(Layer *);
Chris@200 206 virtual void layerAboutToBeDeleted(Layer *);
Chris@200 207 virtual void layerInAView(Layer *, bool);
Chris@200 208
Chris@200 209 virtual void mainModelChanged(WaveFileModel *);
Chris@200 210 virtual void modelAdded(Model *);
Chris@200 211 virtual void modelAboutToBeDeleted(Model *);
Chris@200 212
Chris@200 213 virtual void updateMenuStates();
Chris@200 214 virtual void updateDescriptionLabel() = 0;
Chris@200 215
Chris@200 216 virtual void modelGenerationFailed(QString) = 0;
Chris@200 217 virtual void modelRegenerationFailed(QString, QString) = 0;
Chris@200 218
Chris@200 219 virtual void rightButtonMenuRequested(Pane *, QPoint point) = 0;
Chris@200 220
Chris@200 221 virtual void paneAdded(Pane *) = 0;
Chris@200 222 virtual void paneHidden(Pane *) = 0;
Chris@200 223 virtual void paneAboutToBeDeleted(Pane *) = 0;
Chris@200 224 virtual void paneDropAccepted(Pane *, QStringList) = 0;
Chris@200 225 virtual void paneDropAccepted(Pane *, QString) = 0;
Chris@200 226
Chris@200 227 virtual void pollOSC();
Chris@200 228 virtual void handleOSCMessage(const OSCMessage &) = 0;
Chris@200 229
Chris@200 230 virtual void contextHelpChanged(const QString &);
Chris@200 231 virtual void inProgressSelectionChanged();
Chris@200 232
Chris@200 233 virtual void closeSession() = 0;
Chris@200 234
Chris@200 235 protected:
Chris@200 236 QString m_sessionFile;
Chris@200 237 QString m_audioFile;
Chris@200 238 Document *m_document;
Chris@200 239
Chris@200 240 QLabel *m_descriptionLabel;
Chris@200 241 PaneStack *m_paneStack;
Chris@200 242 ViewManager *m_viewManager;
Chris@200 243 Layer *m_timeRulerLayer;
Chris@200 244
Chris@200 245 bool m_audioOutput;
Chris@200 246 AudioCallbackPlaySource *m_playSource;
Chris@200 247 AudioCallbackPlayTarget *m_playTarget;
Chris@200 248
Chris@200 249 OSCQueue *m_oscQueue;
Chris@200 250
Chris@200 251 RecentFiles m_recentFiles;
Chris@200 252 RecentFiles m_recentTransforms;
Chris@200 253
Chris@200 254 bool m_documentModified;
Chris@200 255 bool m_openingAudioFile;
Chris@200 256 bool m_abandoning;
Chris@200 257
Chris@200 258 Labeller *m_labeller;
Chris@200 259
Chris@200 260 int m_lastPlayStatusSec;
Chris@200 261 mutable QString m_myStatusMessage;
Chris@200 262
Chris@200 263 bool m_initialDarkBackground;
Chris@200 264
Chris@200 265 WaveFileModel *getMainModel();
Chris@200 266 const WaveFileModel *getMainModel() const;
Chris@200 267 void createDocument();
Chris@200 268
Chris@200 269 Pane *addPaneToStack();
Chris@200 270 Layer *getSnapLayer() const;
Chris@200 271
Chris@200 272 class PaneCallback : public SVFileReaderPaneCallback
Chris@200 273 {
Chris@200 274 public:
Chris@200 275 PaneCallback(MainWindowBase *mw) : m_mw(mw) { }
Chris@200 276 virtual Pane *addPane() { return m_mw->addPaneToStack(); }
Chris@200 277 virtual void setWindowSize(int width, int height) {
Chris@200 278 m_mw->resize(width, height);
Chris@200 279 }
Chris@200 280 virtual void addSelection(int start, int end) {
Chris@200 281 m_mw->m_viewManager->addSelection(Selection(start, end));
Chris@200 282 }
Chris@200 283 protected:
Chris@200 284 MainWindowBase *m_mw;
Chris@200 285 };
Chris@200 286
Chris@200 287 class AddPaneCommand : public Command
Chris@200 288 {
Chris@200 289 public:
Chris@200 290 AddPaneCommand(MainWindowBase *mw);
Chris@200 291 virtual ~AddPaneCommand();
Chris@200 292
Chris@200 293 virtual void execute();
Chris@200 294 virtual void unexecute();
Chris@200 295 virtual QString getName() const;
Chris@200 296
Chris@200 297 Pane *getPane() { return m_pane; }
Chris@200 298
Chris@200 299 protected:
Chris@200 300 MainWindowBase *m_mw;
Chris@200 301 Pane *m_pane; // Main window owns this, but I determine its lifespan
Chris@200 302 Pane *m_prevCurrentPane; // I don't own this
Chris@200 303 bool m_added;
Chris@200 304 };
Chris@200 305
Chris@200 306 class RemovePaneCommand : public Command
Chris@200 307 {
Chris@200 308 public:
Chris@200 309 RemovePaneCommand(MainWindowBase *mw, Pane *pane);
Chris@200 310 virtual ~RemovePaneCommand();
Chris@200 311
Chris@200 312 virtual void execute();
Chris@200 313 virtual void unexecute();
Chris@200 314 virtual QString getName() const;
Chris@200 315
Chris@200 316 protected:
Chris@200 317 MainWindowBase *m_mw;
Chris@200 318 Pane *m_pane; // Main window owns this, but I determine its lifespan
Chris@200 319 Pane *m_prevCurrentPane; // I don't own this
Chris@200 320 bool m_added;
Chris@200 321 };
Chris@200 322
Chris@200 323 virtual bool checkSaveModified() = 0;
Chris@200 324
Chris@200 325 virtual QString getOpenFileName(FileFinder::FileType type);
Chris@200 326 virtual QString getSaveFileName(FileFinder::FileType type);
Chris@200 327 virtual void registerLastOpenedFilePath(FileFinder::FileType type, QString path);
Chris@200 328
Chris@200 329 virtual void createPlayTarget();
Chris@200 330 virtual void openHelpUrl(QString url);
Chris@200 331
Chris@200 332 virtual void setupMenus() = 0;
Chris@200 333 virtual void updateVisibleRangeDisplay(Pane *p) const = 0;
Chris@200 334
Chris@200 335 virtual void toXml(QTextStream &stream);
Chris@200 336 };
Chris@200 337
Chris@200 338
Chris@200 339 #endif