annotate framework/MainWindowBase.h @ 570:6f54789f3127 3.0-integration

Fix race condition in first-time recording, where adding the recording wave model would prompt the audio play source to note that its channel count had increased (from 0 to, say, 2) and thus to cause the audio device to be reopened, stopping recording. Fix is to make this only happen if channel count increases beyond that of the device, which shouldn't happen in the recording case
author Chris Cannam
date Wed, 04 Jan 2017 11:48:03 +0000
parents be83e81d9156
children 5369359351cb
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@161 30 #include "base/FrameTimer.h"
Chris@45 31 #include "layer/LayerFactory.h"
Chris@106 32 #include "transform/Transform.h"
Chris@46 33 #include "SVFileReader.h"
Chris@170 34 #include "data/fileio/FileFinder.h"
Chris@45 35 #include "data/fileio/FileSource.h"
Chris@113 36 #include "data/osc/OSCQueue.h"
Chris@45 37 #include <map>
Chris@45 38
Chris@45 39 class Document;
Chris@45 40 class PaneStack;
Chris@45 41 class Pane;
Chris@45 42 class View;
Chris@45 43 class Fader;
Chris@45 44 class Overview;
Chris@45 45 class Layer;
Chris@45 46 class WaveformLayer;
Chris@45 47 class WaveFileModel;
Chris@45 48 class AudioCallbackPlaySource;
Chris@475 49 class AudioRecordTarget;
Chris@45 50 class CommandHistory;
Chris@45 51 class QMenu;
Chris@45 52 class AudioDial;
Chris@541 53 class LevelPanWidget;
Chris@565 54 class LevelPanToolButton;
Chris@45 55 class QLabel;
Chris@45 56 class QCheckBox;
Chris@45 57 class PreferencesDialog;
Chris@45 58 class QTreeView;
Chris@45 59 class QPushButton;
Chris@45 60 class OSCMessage;
Chris@157 61 class MIDIInput;
Chris@45 62 class KeyReference;
Chris@45 63 class Labeller;
Chris@123 64 class ModelDataTableDialog;
Chris@391 65 class QSignalMapper;
Chris@391 66 class QShortcut;
Chris@429 67 class AlignmentModel;
Chris@45 68
Chris@468 69 namespace breakfastquay {
Chris@551 70 class SystemPlaybackTarget;
Chris@551 71 class SystemAudioIO;
Chris@551 72 class ResamplerWrapper;
Chris@468 73 }
Chris@468 74
Chris@45 75 /**
Chris@45 76 * The base class for the SV main window. This includes everything to
Chris@45 77 * do with general document and pane stack management, but nothing
Chris@45 78 * that involves user interaction -- this doesn't create the widget or
Chris@45 79 * menu structures or editing tools, and if a function needs to open a
Chris@45 80 * dialog, it shouldn't be in here. This permits "variations on SV"
Chris@45 81 * to use different subclasses retaining the same general structure.
Chris@45 82 */
Chris@45 83
Chris@161 84 class MainWindowBase : public QMainWindow, public FrameTimer
Chris@45 85 {
Chris@45 86 Q_OBJECT
Chris@45 87
Chris@45 88 public:
Chris@475 89 enum SoundOption {
Chris@475 90 WithAudioOutput = 0x01,
Chris@475 91 WithAudioInput = 0x02,
Chris@475 92 WithMIDIInput = 0x04,
Chris@515 93 WithEverything = 0xff,
Chris@515 94 WithNothing = 0x00
Chris@475 95 };
Chris@475 96 typedef int SoundOptions;
Chris@475 97
Chris@475 98 MainWindowBase(SoundOptions options = WithEverything);
Chris@45 99 virtual ~MainWindowBase();
Chris@45 100
Chris@45 101 enum AudioFileOpenMode {
Chris@221 102 ReplaceSession,
Chris@45 103 ReplaceMainModel,
Chris@45 104 CreateAdditionalModel,
Chris@45 105 ReplaceCurrentPane,
Chris@45 106 AskUser
Chris@45 107 };
Chris@45 108
Chris@45 109 enum FileOpenStatus {
Chris@45 110 FileOpenSucceeded,
Chris@45 111 FileOpenFailed,
Chris@45 112 FileOpenCancelled,
Chris@45 113 FileOpenWrongMode // attempted to open layer when no main model present
Chris@45 114 };
Chris@45 115
Chris@483 116 enum AudioRecordMode {
Chris@483 117 RecordReplaceSession,
Chris@483 118 RecordCreateAdditionalModel
Chris@483 119 };
Chris@483 120
Chris@45 121 virtual FileOpenStatus open(FileSource source, AudioFileOpenMode = AskUser);
Chris@373 122 virtual FileOpenStatus openPath(QString fileOrUrl, AudioFileOpenMode = AskUser);
dan@210 123 virtual FileOpenStatus openAudio(FileSource source, AudioFileOpenMode = AskUser, QString templateName = "");
Chris@45 124 virtual FileOpenStatus openPlaylist(FileSource source, AudioFileOpenMode = AskUser);
Chris@45 125 virtual FileOpenStatus openLayer(FileSource source);
Chris@45 126 virtual FileOpenStatus openImage(FileSource source);
Chris@45 127
Chris@427 128 virtual FileOpenStatus openDirOfAudio(QString dirPath);
Chris@427 129
Chris@45 130 virtual FileOpenStatus openSession(FileSource source);
Chris@373 131 virtual FileOpenStatus openSessionPath(QString fileOrUrl);
Chris@230 132 virtual FileOpenStatus openSessionTemplate(QString templateName);
Chris@227 133 virtual FileOpenStatus openSessionTemplate(FileSource source);
Chris@45 134
Chris@45 135 virtual bool saveSessionFile(QString path);
Chris@224 136 virtual bool saveSessionTemplate(QString path);
Chris@45 137
Chris@161 138 /// Implementation of FrameTimer interface method
Chris@435 139 virtual sv_frame_t getFrame() const;
Chris@161 140
Chris@357 141 void setDefaultFfwdRwdStep(RealTime step) {
Chris@357 142 m_defaultFfwdRwdStep = step;
Chris@357 143 }
Chris@357 144
Chris@483 145 void setAudioRecordMode(AudioRecordMode mode) {
Chris@483 146 m_audioRecordMode = mode;
Chris@483 147 }
Chris@483 148
Chris@45 149 signals:
Chris@45 150 // Used to toggle the availability of menu actions
Chris@45 151 void canAddPane(bool);
Chris@45 152 void canDeleteCurrentPane(bool);
Chris@45 153 void canAddLayer(bool);
Chris@45 154 void canImportMoreAudio(bool);
Chris@259 155 void canReplaceMainAudio(bool);
Chris@45 156 void canImportLayer(bool);
Chris@289 157 void canChangeSessionTemplate(bool);
Chris@45 158 void canExportAudio(bool);
Chris@45 159 void canExportLayer(bool);
Chris@45 160 void canExportImage(bool);
Chris@45 161 void canRenameLayer(bool);
Chris@45 162 void canEditLayer(bool);
Chris@146 163 void canEditLayerTabular(bool);
Chris@45 164 void canMeasureLayer(bool);
Chris@45 165 void canSelect(bool);
Chris@45 166 void canClearSelection(bool);
Chris@45 167 void canEditSelection(bool);
Chris@45 168 void canDeleteSelection(bool);
Chris@45 169 void canPaste(bool);
Chris@45 170 void canInsertInstant(bool);
Chris@45 171 void canInsertInstantsAtBoundaries(bool);
Chris@184 172 void canInsertItemAtSelection(bool);
Chris@45 173 void canRenumberInstants(bool);
Chris@537 174 void canSubdivideInstants(bool);
Chris@538 175 void canWinnowInstants(bool);
Chris@45 176 void canDeleteCurrentLayer(bool);
Chris@45 177 void canZoom(bool);
Chris@45 178 void canScroll(bool);
Chris@45 179 void canPlay(bool);
Chris@475 180 void canRecord(bool);
Chris@45 181 void canFfwd(bool);
Chris@45 182 void canRewind(bool);
Chris@45 183 void canPlaySelection(bool);
Chris@45 184 void canSpeedUpPlayback(bool);
Chris@45 185 void canSlowDownPlayback(bool);
Chris@45 186 void canChangePlaybackSpeed(bool);
Chris@73 187 void canSelectPreviousPane(bool);
Chris@73 188 void canSelectNextPane(bool);
Chris@73 189 void canSelectPreviousLayer(bool);
Chris@73 190 void canSelectNextLayer(bool);
Chris@45 191 void canSave(bool);
Chris@359 192 void canSaveAs(bool);
Chris@104 193 void hideSplash();
Chris@452 194 void hideSplash(QWidget *);
Chris@342 195 void sessionLoaded();
Chris@342 196 void audioFileLoaded();
Chris@160 197 void replacedDocument();
Chris@164 198 void activity(QString);
Chris@45 199
Chris@45 200 public slots:
Chris@45 201 virtual void preferenceChanged(PropertyContainer::PropertyName);
Chris@168 202 virtual void resizeConstrained(QSize);
Chris@556 203 virtual void recreateAudioIO();
Chris@45 204
Chris@45 205 protected slots:
Chris@45 206 virtual void zoomIn();
Chris@45 207 virtual void zoomOut();
Chris@45 208 virtual void zoomToFit();
Chris@45 209 virtual void zoomDefault();
Chris@45 210 virtual void scrollLeft();
Chris@45 211 virtual void scrollRight();
Chris@45 212 virtual void jumpLeft();
Chris@45 213 virtual void jumpRight();
Chris@162 214 virtual void peekLeft();
Chris@162 215 virtual void peekRight();
Chris@45 216
Chris@45 217 virtual void showNoOverlays();
Chris@45 218 virtual void showMinimalOverlays();
Chris@45 219 virtual void showAllOverlays();
Chris@45 220
Chris@211 221 virtual void toggleTimeRulers();
Chris@45 222 virtual void toggleZoomWheels();
Chris@45 223 virtual void togglePropertyBoxes();
Chris@45 224 virtual void toggleStatusBar();
Chris@256 225 virtual void toggleCentreLine();
Chris@45 226
Chris@45 227 virtual void play();
Chris@45 228 virtual void ffwd();
Chris@45 229 virtual void ffwdEnd();
Chris@45 230 virtual void rewind();
Chris@45 231 virtual void rewindStart();
Chris@477 232 virtual void record();
Chris@45 233 virtual void stop();
Chris@45 234
Chris@166 235 virtual void ffwdSimilar();
Chris@166 236 virtual void rewindSimilar();
Chris@166 237
Chris@45 238 virtual void deleteCurrentPane();
Chris@45 239 virtual void deleteCurrentLayer();
Chris@123 240 virtual void editCurrentLayer();
Chris@45 241
Chris@73 242 virtual void previousPane();
Chris@73 243 virtual void nextPane();
Chris@73 244 virtual void previousLayer();
Chris@73 245 virtual void nextLayer();
Chris@73 246
Chris@45 247 virtual void playLoopToggled();
Chris@45 248 virtual void playSelectionToggled();
Chris@45 249 virtual void playSoloToggled();
Chris@45 250
Chris@570 251 virtual void audioChannelCountIncreased(int count);
Chris@570 252
Chris@436 253 virtual void sampleRateMismatch(sv_samplerate_t, sv_samplerate_t, bool) = 0;
Chris@45 254 virtual void audioOverloadPluginDisabled() = 0;
Chris@130 255 virtual void audioTimeStretchMultiChannelDisabled() = 0;
Chris@45 256
Chris@435 257 virtual void playbackFrameChanged(sv_frame_t);
Chris@435 258 virtual void globalCentreFrameChanged(sv_frame_t);
Chris@435 259 virtual void viewCentreFrameChanged(View *, sv_frame_t);
Chris@366 260 virtual void viewZoomLevelChanged(View *, int, bool);
Chris@45 261 virtual void outputLevelsChanged(float, float) = 0;
Chris@485 262 virtual void recordDurationChanged(sv_frame_t, sv_samplerate_t);
Chris@45 263
Chris@45 264 virtual void currentPaneChanged(Pane *);
Chris@45 265 virtual void currentLayerChanged(Pane *, Layer *);
Chris@45 266
Chris@45 267 virtual void selectAll();
Chris@45 268 virtual void selectToStart();
Chris@45 269 virtual void selectToEnd();
Chris@45 270 virtual void selectVisible();
Chris@45 271 virtual void clearSelection();
Chris@45 272
Chris@45 273 virtual void cut();
Chris@45 274 virtual void copy();
Chris@45 275 virtual void paste();
Chris@215 276 virtual void pasteAtPlaybackPosition();
Chris@435 277 virtual void pasteRelative(sv_frame_t offset);
Chris@45 278 virtual void deleteSelected();
Chris@45 279
Chris@45 280 virtual void insertInstant();
Chris@435 281 virtual void insertInstantAt(sv_frame_t);
Chris@45 282 virtual void insertInstantsAtBoundaries();
Chris@184 283 virtual void insertItemAtSelection();
Chris@435 284 virtual void insertItemAt(sv_frame_t, sv_frame_t);
Chris@45 285 virtual void renumberInstants();
Chris@537 286 virtual void subdivideInstantsBy(int);
Chris@538 287 virtual void winnowInstantsBy(int);
Chris@45 288
Chris@45 289 virtual void documentModified();
Chris@45 290 virtual void documentRestored();
Chris@45 291
Chris@45 292 virtual void layerAdded(Layer *);
Chris@45 293 virtual void layerRemoved(Layer *);
Chris@45 294 virtual void layerAboutToBeDeleted(Layer *);
Chris@45 295 virtual void layerInAView(Layer *, bool);
Chris@45 296
Chris@45 297 virtual void mainModelChanged(WaveFileModel *);
Chris@45 298 virtual void modelAdded(Model *);
Chris@45 299 virtual void modelAboutToBeDeleted(Model *);
Chris@45 300
Chris@45 301 virtual void updateMenuStates();
Chris@45 302 virtual void updateDescriptionLabel() = 0;
Chris@45 303
Chris@78 304 virtual void modelGenerationFailed(QString, QString) = 0;
Chris@78 305 virtual void modelGenerationWarning(QString, QString) = 0;
Chris@78 306 virtual void modelRegenerationFailed(QString, QString, QString) = 0;
Chris@78 307 virtual void modelRegenerationWarning(QString, QString, QString) = 0;
Chris@429 308
Chris@429 309 virtual void alignmentComplete(AlignmentModel *);
Chris@420 310 virtual void alignmentFailed(QString) = 0;
Chris@45 311
Chris@45 312 virtual void rightButtonMenuRequested(Pane *, QPoint point) = 0;
Chris@45 313
Chris@45 314 virtual void paneAdded(Pane *) = 0;
Chris@45 315 virtual void paneHidden(Pane *) = 0;
Chris@45 316 virtual void paneAboutToBeDeleted(Pane *) = 0;
Chris@45 317 virtual void paneDropAccepted(Pane *, QStringList) = 0;
Chris@45 318 virtual void paneDropAccepted(Pane *, QString) = 0;
Chris@55 319 virtual void paneDeleteButtonClicked(Pane *);
Chris@45 320
Chris@113 321 virtual void oscReady();
Chris@45 322 virtual void pollOSC();
Chris@45 323 virtual void handleOSCMessage(const OSCMessage &) = 0;
Chris@45 324
Chris@45 325 virtual void contextHelpChanged(const QString &);
Chris@45 326 virtual void inProgressSelectionChanged();
Chris@45 327
Chris@141 328 virtual FileOpenStatus openSessionFromRDF(FileSource source);
Chris@145 329 virtual FileOpenStatus openLayersFromRDF(FileSource source);
Chris@141 330
Chris@45 331 virtual void closeSession() = 0;
Chris@45 332
Chris@452 333 virtual void emitHideSplash();
Chris@452 334
Chris@180 335 virtual void newerVersionAvailable(QString) { }
Chris@180 336
Chris@354 337 virtual void menuActionMapperInvoked(QObject *);
Chris@354 338
Chris@45 339 protected:
Chris@45 340 QString m_sessionFile;
Chris@45 341 QString m_audioFile;
Chris@45 342 Document *m_document;
Chris@45 343
Chris@45 344 PaneStack *m_paneStack;
Chris@45 345 ViewManager *m_viewManager;
Chris@45 346 Layer *m_timeRulerLayer;
Chris@45 347
Chris@475 348 SoundOptions m_soundOptions;
Chris@475 349
Chris@45 350 AudioCallbackPlaySource *m_playSource;
Chris@475 351 AudioRecordTarget *m_recordTarget;
Chris@551 352 breakfastquay::ResamplerWrapper *m_resamplerWrapper;
Chris@475 353 breakfastquay::SystemPlaybackTarget *m_playTarget; // only one of this...
Chris@475 354 breakfastquay::SystemAudioIO *m_audioIO; // ... and this exists
Chris@45 355
Chris@113 356 class OSCQueueStarter : public QThread
Chris@113 357 {
Chris@113 358 public:
Chris@113 359 OSCQueueStarter(MainWindowBase *mwb) : QThread(mwb), m_mwb(mwb) { }
Chris@113 360 virtual void run() {
Chris@113 361 OSCQueue *queue = new OSCQueue(); // can take a long time
Chris@113 362 m_mwb->m_oscQueue = queue;
Chris@113 363 }
Chris@113 364 private:
Chris@113 365 MainWindowBase *m_mwb;
Chris@113 366 };
Chris@113 367
Chris@45 368 OSCQueue *m_oscQueue;
Chris@113 369 OSCQueueStarter *m_oscQueueStarter;
Chris@304 370 void startOSCQueue();
Chris@45 371
Chris@157 372 MIDIInput *m_midiInput;
Chris@157 373
Chris@45 374 RecentFiles m_recentFiles;
Chris@54 375 RecentFiles m_recentTransforms;
Chris@45 376
Chris@45 377 bool m_documentModified;
Chris@45 378 bool m_openingAudioFile;
Chris@45 379 bool m_abandoning;
Chris@45 380
Chris@45 381 Labeller *m_labeller;
Chris@45 382
Chris@45 383 int m_lastPlayStatusSec;
Chris@45 384 mutable QString m_myStatusMessage;
Chris@45 385
Chris@45 386 bool m_initialDarkBackground;
Chris@45 387
Chris@357 388 RealTime m_defaultFfwdRwdStep;
Chris@357 389
Chris@483 390 AudioRecordMode m_audioRecordMode;
Chris@483 391
Chris@378 392 mutable QLabel *m_statusLabel;
Chris@378 393 QLabel *getStatusLabel() const;
Chris@378 394
Chris@45 395 WaveFileModel *getMainModel();
Chris@45 396 const WaveFileModel *getMainModel() const;
Chris@45 397 void createDocument();
Chris@45 398
Chris@45 399 Pane *addPaneToStack();
Chris@45 400 Layer *getSnapLayer() const;
Chris@45 401
Chris@126 402 typedef std::map<Layer *, QPointer<ModelDataTableDialog> > LayerDataDialogMap;
Chris@126 403 typedef std::set<QPointer<ModelDataTableDialog> > DataDialogSet;
Chris@123 404 typedef std::map<View *, DataDialogSet> ViewDataDialogMap;
Chris@123 405
Chris@123 406 LayerDataDialogMap m_layerDataDialogMap;
Chris@123 407 ViewDataDialogMap m_viewDataDialogMap;
Chris@123 408
Chris@128 409 void removeLayerEditDialog(Layer *);
Chris@128 410
Chris@45 411 class PaneCallback : public SVFileReaderPaneCallback
Chris@45 412 {
Chris@45 413 public:
Chris@45 414 PaneCallback(MainWindowBase *mw) : m_mw(mw) { }
Chris@45 415 virtual Pane *addPane() { return m_mw->addPaneToStack(); }
Chris@45 416 virtual void setWindowSize(int width, int height) {
Chris@168 417 m_mw->resizeConstrained(QSize(width, height));
Chris@45 418 }
Chris@435 419 virtual void addSelection(sv_frame_t start, sv_frame_t end) {
Chris@344 420 m_mw->m_viewManager->addSelectionQuietly(Selection(start, end));
Chris@45 421 }
Chris@45 422 protected:
Chris@45 423 MainWindowBase *m_mw;
Chris@45 424 };
Chris@45 425
Chris@45 426 class AddPaneCommand : public Command
Chris@45 427 {
Chris@45 428 public:
Chris@45 429 AddPaneCommand(MainWindowBase *mw);
Chris@45 430 virtual ~AddPaneCommand();
Chris@45 431
Chris@45 432 virtual void execute();
Chris@45 433 virtual void unexecute();
Chris@45 434 virtual QString getName() const;
Chris@45 435
Chris@45 436 Pane *getPane() { return m_pane; }
Chris@45 437
Chris@45 438 protected:
Chris@45 439 MainWindowBase *m_mw;
Chris@45 440 Pane *m_pane; // Main window owns this, but I determine its lifespan
Chris@45 441 Pane *m_prevCurrentPane; // I don't own this
Chris@45 442 bool m_added;
Chris@45 443 };
Chris@45 444
Chris@45 445 class RemovePaneCommand : public Command
Chris@45 446 {
Chris@45 447 public:
Chris@45 448 RemovePaneCommand(MainWindowBase *mw, Pane *pane);
Chris@45 449 virtual ~RemovePaneCommand();
Chris@45 450
Chris@45 451 virtual void execute();
Chris@45 452 virtual void unexecute();
Chris@45 453 virtual QString getName() const;
Chris@45 454
Chris@45 455 protected:
Chris@45 456 MainWindowBase *m_mw;
Chris@45 457 Pane *m_pane; // Main window owns this, but I determine its lifespan
Chris@45 458 Pane *m_prevCurrentPane; // I don't own this
Chris@45 459 bool m_added;
Chris@45 460 };
Chris@45 461
Chris@45 462 virtual bool checkSaveModified() = 0;
Chris@45 463
Chris@45 464 virtual QString getOpenFileName(FileFinder::FileType type);
Chris@45 465 virtual QString getSaveFileName(FileFinder::FileType type);
Chris@45 466 virtual void registerLastOpenedFilePath(FileFinder::FileType type, QString path);
Chris@45 467
Chris@222 468 virtual QString getDefaultSessionTemplate() const;
Chris@251 469 virtual void setDefaultSessionTemplate(QString);
Chris@222 470
Chris@475 471 virtual void createAudioIO();
Chris@556 472 virtual void deleteAudioIO();
Chris@556 473
Chris@45 474 virtual void openHelpUrl(QString url);
Chris@483 475 virtual void openLocalFolder(QString path);
Chris@45 476
Chris@45 477 virtual void setupMenus() = 0;
Chris@45 478 virtual void updateVisibleRangeDisplay(Pane *p) const = 0;
Chris@187 479 virtual void updatePositionStatusDisplays() const = 0;
Chris@45 480
Chris@354 481 // Call this after setting up the menu bar, to fix up single-key
Chris@426 482 // shortcuts on OS/X and do any other platform-specific tidying
Chris@354 483 virtual void finaliseMenus();
Chris@354 484 virtual void finaliseMenu(QMenu *);
Chris@394 485
Chris@426 486 // Call before finaliseMenus if you wish to have a say in this question
Chris@426 487 void setIconsVisibleInMenus(bool visible) { m_iconsVisibleInMenus = visible; }
Chris@426 488 bool m_iconsVisibleInMenus;
Chris@426 489
Chris@394 490 // Only used on OS/X to work around a Qt/Cocoa bug, see finaliseMenus
Chris@391 491 QSignalMapper *m_menuShortcutMapper;
Chris@391 492 QList<QShortcut *> m_appShortcuts;
Chris@354 493
Chris@147 494 virtual bool shouldCreateNewSessionForRDFAudio(bool *) { return true; }
Chris@145 495
Chris@128 496 virtual void connectLayerEditDialog(ModelDataTableDialog *dialog);
Chris@128 497
Chris@226 498 virtual void toXml(QTextStream &stream, bool asTemplate);
Chris@45 499 };
Chris@45 500
Chris@45 501
Chris@45 502 #endif