annotate framework/MainWindowBase.h @ 122:ab861544f998

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