comparison main/MainWindowBase.h @ 200:1871581e4da9

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