annotate framework/MainWindowBase.h @ 77:0535c49069ba

* Various fixes to object lifetime management, particularly in the spectrum layer and for notification of main model deletion. The main purpose of this is to improve the behaviour of the spectrum, but I think it may also help with #1840922 Various crashes in Layer Summary window.
author Chris Cannam
date Wed, 23 Jan 2008 15:43:27 +0000
parents ef8a3028c711
children 58bfaaed07ed
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@54 30 #include "plugin/transform/Transform.h"
Chris@46 31 #include "SVFileReader.h"
Chris@45 32 #include "data/fileio/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@45 140
Chris@45 141 public slots:
Chris@45 142 virtual void preferenceChanged(PropertyContainer::PropertyName);
Chris@45 143
Chris@45 144 protected slots:
Chris@45 145 virtual void zoomIn();
Chris@45 146 virtual void zoomOut();
Chris@45 147 virtual void zoomToFit();
Chris@45 148 virtual void zoomDefault();
Chris@45 149 virtual void scrollLeft();
Chris@45 150 virtual void scrollRight();
Chris@45 151 virtual void jumpLeft();
Chris@45 152 virtual void jumpRight();
Chris@45 153
Chris@45 154 virtual void showNoOverlays();
Chris@45 155 virtual void showMinimalOverlays();
Chris@45 156 virtual void showStandardOverlays();
Chris@45 157 virtual void showAllOverlays();
Chris@45 158
Chris@45 159 virtual void toggleZoomWheels();
Chris@45 160 virtual void togglePropertyBoxes();
Chris@45 161 virtual void toggleStatusBar();
Chris@45 162
Chris@45 163 virtual void play();
Chris@45 164 virtual void ffwd();
Chris@45 165 virtual void ffwdEnd();
Chris@45 166 virtual void rewind();
Chris@45 167 virtual void rewindStart();
Chris@45 168 virtual void stop();
Chris@45 169
Chris@45 170 virtual void deleteCurrentPane();
Chris@45 171 virtual void deleteCurrentLayer();
Chris@45 172
Chris@73 173 virtual void previousPane();
Chris@73 174 virtual void nextPane();
Chris@73 175 virtual void previousLayer();
Chris@73 176 virtual void nextLayer();
Chris@73 177
Chris@45 178 virtual void playLoopToggled();
Chris@45 179 virtual void playSelectionToggled();
Chris@45 180 virtual void playSoloToggled();
Chris@45 181
Chris@45 182 virtual void sampleRateMismatch(size_t, size_t, bool) = 0;
Chris@45 183 virtual void audioOverloadPluginDisabled() = 0;
Chris@45 184
Chris@45 185 virtual void playbackFrameChanged(unsigned long);
Chris@45 186 virtual void globalCentreFrameChanged(unsigned long);
Chris@45 187 virtual void viewCentreFrameChanged(View *, unsigned long);
Chris@45 188 virtual void viewZoomLevelChanged(View *, unsigned long, bool);
Chris@45 189 virtual void outputLevelsChanged(float, float) = 0;
Chris@45 190
Chris@45 191 virtual void currentPaneChanged(Pane *);
Chris@45 192 virtual void currentLayerChanged(Pane *, Layer *);
Chris@45 193
Chris@45 194 virtual void selectAll();
Chris@45 195 virtual void selectToStart();
Chris@45 196 virtual void selectToEnd();
Chris@45 197 virtual void selectVisible();
Chris@45 198 virtual void clearSelection();
Chris@45 199
Chris@45 200 virtual void cut();
Chris@45 201 virtual void copy();
Chris@45 202 virtual void paste();
Chris@45 203 virtual void deleteSelected();
Chris@45 204
Chris@45 205 virtual void insertInstant();
Chris@45 206 virtual void insertInstantAt(size_t);
Chris@45 207 virtual void insertInstantsAtBoundaries();
Chris@45 208 virtual void renumberInstants();
Chris@45 209
Chris@45 210 virtual void documentModified();
Chris@45 211 virtual void documentRestored();
Chris@45 212
Chris@45 213 virtual void layerAdded(Layer *);
Chris@45 214 virtual void layerRemoved(Layer *);
Chris@45 215 virtual void layerAboutToBeDeleted(Layer *);
Chris@45 216 virtual void layerInAView(Layer *, bool);
Chris@45 217
Chris@45 218 virtual void mainModelChanged(WaveFileModel *);
Chris@45 219 virtual void modelAdded(Model *);
Chris@45 220 virtual void modelAboutToBeDeleted(Model *);
Chris@45 221
Chris@45 222 virtual void updateMenuStates();
Chris@45 223 virtual void updateDescriptionLabel() = 0;
Chris@45 224
Chris@45 225 virtual void modelGenerationFailed(QString) = 0;
Chris@45 226 virtual void modelRegenerationFailed(QString, QString) = 0;
Chris@45 227
Chris@45 228 virtual void rightButtonMenuRequested(Pane *, QPoint point) = 0;
Chris@45 229
Chris@45 230 virtual void paneAdded(Pane *) = 0;
Chris@45 231 virtual void paneHidden(Pane *) = 0;
Chris@45 232 virtual void paneAboutToBeDeleted(Pane *) = 0;
Chris@45 233 virtual void paneDropAccepted(Pane *, QStringList) = 0;
Chris@45 234 virtual void paneDropAccepted(Pane *, QString) = 0;
Chris@55 235 virtual void paneDeleteButtonClicked(Pane *);
Chris@45 236
Chris@45 237 virtual void pollOSC();
Chris@45 238 virtual void handleOSCMessage(const OSCMessage &) = 0;
Chris@45 239
Chris@45 240 virtual void contextHelpChanged(const QString &);
Chris@45 241 virtual void inProgressSelectionChanged();
Chris@45 242
Chris@45 243 virtual void closeSession() = 0;
Chris@45 244
Chris@45 245 protected:
Chris@45 246 QString m_sessionFile;
Chris@45 247 QString m_audioFile;
Chris@45 248 Document *m_document;
Chris@45 249
Chris@45 250 QLabel *m_descriptionLabel;
Chris@45 251 PaneStack *m_paneStack;
Chris@45 252 ViewManager *m_viewManager;
Chris@45 253 Layer *m_timeRulerLayer;
Chris@45 254
Chris@45 255 bool m_audioOutput;
Chris@45 256 AudioCallbackPlaySource *m_playSource;
Chris@45 257 AudioCallbackPlayTarget *m_playTarget;
Chris@45 258
Chris@45 259 OSCQueue *m_oscQueue;
Chris@45 260
Chris@45 261 RecentFiles m_recentFiles;
Chris@54 262 RecentFiles m_recentTransforms;
Chris@45 263
Chris@45 264 bool m_documentModified;
Chris@45 265 bool m_openingAudioFile;
Chris@45 266 bool m_abandoning;
Chris@45 267
Chris@45 268 Labeller *m_labeller;
Chris@45 269
Chris@45 270 int m_lastPlayStatusSec;
Chris@45 271 mutable QString m_myStatusMessage;
Chris@45 272
Chris@45 273 bool m_initialDarkBackground;
Chris@45 274
Chris@45 275 WaveFileModel *getMainModel();
Chris@45 276 const WaveFileModel *getMainModel() const;
Chris@45 277 void createDocument();
Chris@45 278
Chris@45 279 Pane *addPaneToStack();
Chris@45 280 Layer *getSnapLayer() const;
Chris@45 281
Chris@45 282 class PaneCallback : public SVFileReaderPaneCallback
Chris@45 283 {
Chris@45 284 public:
Chris@45 285 PaneCallback(MainWindowBase *mw) : m_mw(mw) { }
Chris@45 286 virtual Pane *addPane() { return m_mw->addPaneToStack(); }
Chris@45 287 virtual void setWindowSize(int width, int height) {
Chris@45 288 m_mw->resize(width, height);
Chris@45 289 }
Chris@45 290 virtual void addSelection(int start, int end) {
Chris@45 291 m_mw->m_viewManager->addSelection(Selection(start, end));
Chris@45 292 }
Chris@45 293 protected:
Chris@45 294 MainWindowBase *m_mw;
Chris@45 295 };
Chris@45 296
Chris@45 297 class AddPaneCommand : public Command
Chris@45 298 {
Chris@45 299 public:
Chris@45 300 AddPaneCommand(MainWindowBase *mw);
Chris@45 301 virtual ~AddPaneCommand();
Chris@45 302
Chris@45 303 virtual void execute();
Chris@45 304 virtual void unexecute();
Chris@45 305 virtual QString getName() const;
Chris@45 306
Chris@45 307 Pane *getPane() { return m_pane; }
Chris@45 308
Chris@45 309 protected:
Chris@45 310 MainWindowBase *m_mw;
Chris@45 311 Pane *m_pane; // Main window owns this, but I determine its lifespan
Chris@45 312 Pane *m_prevCurrentPane; // I don't own this
Chris@45 313 bool m_added;
Chris@45 314 };
Chris@45 315
Chris@45 316 class RemovePaneCommand : public Command
Chris@45 317 {
Chris@45 318 public:
Chris@45 319 RemovePaneCommand(MainWindowBase *mw, Pane *pane);
Chris@45 320 virtual ~RemovePaneCommand();
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 protected:
Chris@45 327 MainWindowBase *m_mw;
Chris@45 328 Pane *m_pane; // Main window owns this, but I determine its lifespan
Chris@45 329 Pane *m_prevCurrentPane; // I don't own this
Chris@45 330 bool m_added;
Chris@45 331 };
Chris@45 332
Chris@45 333 virtual bool checkSaveModified() = 0;
Chris@45 334
Chris@45 335 virtual QString getOpenFileName(FileFinder::FileType type);
Chris@45 336 virtual QString getSaveFileName(FileFinder::FileType type);
Chris@45 337 virtual void registerLastOpenedFilePath(FileFinder::FileType type, QString path);
Chris@45 338
Chris@45 339 virtual void createPlayTarget();
Chris@45 340 virtual void openHelpUrl(QString url);
Chris@45 341
Chris@45 342 virtual void setupMenus() = 0;
Chris@45 343 virtual void updateVisibleRangeDisplay(Pane *p) const = 0;
Chris@45 344
Chris@45 345 virtual void toXml(QTextStream &stream);
Chris@45 346 };
Chris@45 347
Chris@45 348
Chris@45 349 #endif