annotate framework/MainWindowBase.h @ 109:2dd30a7cd21a

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