annotate framework/MainWindowBase.h @ 60:7b71da2d0631

* Some work on correct alignment when moving panes during playback * Overhaul alignment for playback frame values (view manager now always refers to reference-timeline values, only the play source deals in playback model timeline values) * When making a selection, ensure the selection regions shown in other panes (and used for playback constraints if appropriate) are aligned correctly. This may be the coolest feature ever implemented in any program ever.
author Chris Cannam
date Thu, 22 Nov 2007 14:17:19 +0000
parents 9fa273598830
children ef8a3028c711 22bf057ea151
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@45 135 void canSave(bool);
Chris@45 136
Chris@45 137 public slots:
Chris@45 138 virtual void preferenceChanged(PropertyContainer::PropertyName);
Chris@45 139
Chris@45 140 protected slots:
Chris@45 141 virtual void zoomIn();
Chris@45 142 virtual void zoomOut();
Chris@45 143 virtual void zoomToFit();
Chris@45 144 virtual void zoomDefault();
Chris@45 145 virtual void scrollLeft();
Chris@45 146 virtual void scrollRight();
Chris@45 147 virtual void jumpLeft();
Chris@45 148 virtual void jumpRight();
Chris@45 149
Chris@45 150 virtual void showNoOverlays();
Chris@45 151 virtual void showMinimalOverlays();
Chris@45 152 virtual void showStandardOverlays();
Chris@45 153 virtual void showAllOverlays();
Chris@45 154
Chris@45 155 virtual void toggleZoomWheels();
Chris@45 156 virtual void togglePropertyBoxes();
Chris@45 157 virtual void toggleStatusBar();
Chris@45 158
Chris@45 159 virtual void play();
Chris@45 160 virtual void ffwd();
Chris@45 161 virtual void ffwdEnd();
Chris@45 162 virtual void rewind();
Chris@45 163 virtual void rewindStart();
Chris@45 164 virtual void stop();
Chris@45 165
Chris@45 166 virtual void deleteCurrentPane();
Chris@45 167 virtual void deleteCurrentLayer();
Chris@45 168
Chris@45 169 virtual void playLoopToggled();
Chris@45 170 virtual void playSelectionToggled();
Chris@45 171 virtual void playSoloToggled();
Chris@45 172
Chris@45 173 virtual void sampleRateMismatch(size_t, size_t, bool) = 0;
Chris@45 174 virtual void audioOverloadPluginDisabled() = 0;
Chris@45 175
Chris@45 176 virtual void playbackFrameChanged(unsigned long);
Chris@45 177 virtual void globalCentreFrameChanged(unsigned long);
Chris@45 178 virtual void viewCentreFrameChanged(View *, unsigned long);
Chris@45 179 virtual void viewZoomLevelChanged(View *, unsigned long, bool);
Chris@45 180 virtual void outputLevelsChanged(float, float) = 0;
Chris@45 181
Chris@45 182 virtual void currentPaneChanged(Pane *);
Chris@45 183 virtual void currentLayerChanged(Pane *, Layer *);
Chris@45 184
Chris@45 185 virtual void selectAll();
Chris@45 186 virtual void selectToStart();
Chris@45 187 virtual void selectToEnd();
Chris@45 188 virtual void selectVisible();
Chris@45 189 virtual void clearSelection();
Chris@45 190
Chris@45 191 virtual void cut();
Chris@45 192 virtual void copy();
Chris@45 193 virtual void paste();
Chris@45 194 virtual void deleteSelected();
Chris@45 195
Chris@45 196 virtual void insertInstant();
Chris@45 197 virtual void insertInstantAt(size_t);
Chris@45 198 virtual void insertInstantsAtBoundaries();
Chris@45 199 virtual void renumberInstants();
Chris@45 200
Chris@45 201 virtual void documentModified();
Chris@45 202 virtual void documentRestored();
Chris@45 203
Chris@45 204 virtual void layerAdded(Layer *);
Chris@45 205 virtual void layerRemoved(Layer *);
Chris@45 206 virtual void layerAboutToBeDeleted(Layer *);
Chris@45 207 virtual void layerInAView(Layer *, bool);
Chris@45 208
Chris@45 209 virtual void mainModelChanged(WaveFileModel *);
Chris@45 210 virtual void modelAdded(Model *);
Chris@45 211 virtual void modelAboutToBeDeleted(Model *);
Chris@45 212
Chris@45 213 virtual void updateMenuStates();
Chris@45 214 virtual void updateDescriptionLabel() = 0;
Chris@45 215
Chris@45 216 virtual void modelGenerationFailed(QString) = 0;
Chris@45 217 virtual void modelRegenerationFailed(QString, QString) = 0;
Chris@45 218
Chris@45 219 virtual void rightButtonMenuRequested(Pane *, QPoint point) = 0;
Chris@45 220
Chris@45 221 virtual void paneAdded(Pane *) = 0;
Chris@45 222 virtual void paneHidden(Pane *) = 0;
Chris@45 223 virtual void paneAboutToBeDeleted(Pane *) = 0;
Chris@45 224 virtual void paneDropAccepted(Pane *, QStringList) = 0;
Chris@45 225 virtual void paneDropAccepted(Pane *, QString) = 0;
Chris@55 226 virtual void paneDeleteButtonClicked(Pane *);
Chris@45 227
Chris@45 228 virtual void pollOSC();
Chris@45 229 virtual void handleOSCMessage(const OSCMessage &) = 0;
Chris@45 230
Chris@45 231 virtual void contextHelpChanged(const QString &);
Chris@45 232 virtual void inProgressSelectionChanged();
Chris@45 233
Chris@45 234 virtual void closeSession() = 0;
Chris@45 235
Chris@45 236 protected:
Chris@45 237 QString m_sessionFile;
Chris@45 238 QString m_audioFile;
Chris@45 239 Document *m_document;
Chris@45 240
Chris@45 241 QLabel *m_descriptionLabel;
Chris@45 242 PaneStack *m_paneStack;
Chris@45 243 ViewManager *m_viewManager;
Chris@45 244 Layer *m_timeRulerLayer;
Chris@45 245
Chris@45 246 bool m_audioOutput;
Chris@45 247 AudioCallbackPlaySource *m_playSource;
Chris@45 248 AudioCallbackPlayTarget *m_playTarget;
Chris@45 249
Chris@45 250 OSCQueue *m_oscQueue;
Chris@45 251
Chris@45 252 RecentFiles m_recentFiles;
Chris@54 253 RecentFiles m_recentTransforms;
Chris@45 254
Chris@45 255 bool m_documentModified;
Chris@45 256 bool m_openingAudioFile;
Chris@45 257 bool m_abandoning;
Chris@45 258
Chris@45 259 Labeller *m_labeller;
Chris@45 260
Chris@45 261 int m_lastPlayStatusSec;
Chris@45 262 mutable QString m_myStatusMessage;
Chris@45 263
Chris@45 264 bool m_initialDarkBackground;
Chris@45 265
Chris@45 266 WaveFileModel *getMainModel();
Chris@45 267 const WaveFileModel *getMainModel() const;
Chris@45 268 void createDocument();
Chris@45 269
Chris@45 270 Pane *addPaneToStack();
Chris@45 271 Layer *getSnapLayer() const;
Chris@45 272
Chris@45 273 class PaneCallback : public SVFileReaderPaneCallback
Chris@45 274 {
Chris@45 275 public:
Chris@45 276 PaneCallback(MainWindowBase *mw) : m_mw(mw) { }
Chris@45 277 virtual Pane *addPane() { return m_mw->addPaneToStack(); }
Chris@45 278 virtual void setWindowSize(int width, int height) {
Chris@45 279 m_mw->resize(width, height);
Chris@45 280 }
Chris@45 281 virtual void addSelection(int start, int end) {
Chris@45 282 m_mw->m_viewManager->addSelection(Selection(start, end));
Chris@45 283 }
Chris@45 284 protected:
Chris@45 285 MainWindowBase *m_mw;
Chris@45 286 };
Chris@45 287
Chris@45 288 class AddPaneCommand : public Command
Chris@45 289 {
Chris@45 290 public:
Chris@45 291 AddPaneCommand(MainWindowBase *mw);
Chris@45 292 virtual ~AddPaneCommand();
Chris@45 293
Chris@45 294 virtual void execute();
Chris@45 295 virtual void unexecute();
Chris@45 296 virtual QString getName() const;
Chris@45 297
Chris@45 298 Pane *getPane() { return m_pane; }
Chris@45 299
Chris@45 300 protected:
Chris@45 301 MainWindowBase *m_mw;
Chris@45 302 Pane *m_pane; // Main window owns this, but I determine its lifespan
Chris@45 303 Pane *m_prevCurrentPane; // I don't own this
Chris@45 304 bool m_added;
Chris@45 305 };
Chris@45 306
Chris@45 307 class RemovePaneCommand : public Command
Chris@45 308 {
Chris@45 309 public:
Chris@45 310 RemovePaneCommand(MainWindowBase *mw, Pane *pane);
Chris@45 311 virtual ~RemovePaneCommand();
Chris@45 312
Chris@45 313 virtual void execute();
Chris@45 314 virtual void unexecute();
Chris@45 315 virtual QString getName() const;
Chris@45 316
Chris@45 317 protected:
Chris@45 318 MainWindowBase *m_mw;
Chris@45 319 Pane *m_pane; // Main window owns this, but I determine its lifespan
Chris@45 320 Pane *m_prevCurrentPane; // I don't own this
Chris@45 321 bool m_added;
Chris@45 322 };
Chris@45 323
Chris@45 324 virtual bool checkSaveModified() = 0;
Chris@45 325
Chris@45 326 virtual QString getOpenFileName(FileFinder::FileType type);
Chris@45 327 virtual QString getSaveFileName(FileFinder::FileType type);
Chris@45 328 virtual void registerLastOpenedFilePath(FileFinder::FileType type, QString path);
Chris@45 329
Chris@45 330 virtual void createPlayTarget();
Chris@45 331 virtual void openHelpUrl(QString url);
Chris@45 332
Chris@45 333 virtual void setupMenus() = 0;
Chris@45 334 virtual void updateVisibleRangeDisplay(Pane *p) const = 0;
Chris@45 335
Chris@45 336 virtual void toXml(QTextStream &stream);
Chris@45 337 };
Chris@45 338
Chris@45 339
Chris@45 340 #endif