annotate sv/document/Document.h @ 58:b3c3a5fa185f

frontend with easaier's look
author benoitrigolleau
date Fri, 25 May 2007 12:36:35 +0000
parents 2a6f70f97395
children afcf540ae3a2
rev   line source
lbajardsilogic@0 1 /* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
lbajardsilogic@0 2
lbajardsilogic@0 3 /*
lbajardsilogic@0 4 Sonic Visualiser
lbajardsilogic@0 5 An audio file viewer and annotation editor.
lbajardsilogic@0 6 Centre for Digital Music, Queen Mary, University of London.
lbajardsilogic@0 7 This file copyright 2006 Chris Cannam and QMUL.
lbajardsilogic@0 8
lbajardsilogic@0 9 This program is free software; you can redistribute it and/or
lbajardsilogic@0 10 modify it under the terms of the GNU General Public License as
lbajardsilogic@0 11 published by the Free Software Foundation; either version 2 of the
lbajardsilogic@0 12 License, or (at your option) any later version. See the file
lbajardsilogic@0 13 COPYING included with this distribution for more information.
lbajardsilogic@0 14 */
lbajardsilogic@0 15
lbajardsilogic@0 16 #ifndef _DOCUMENT_H_
lbajardsilogic@0 17 #define _DOCUMENT_H_
lbajardsilogic@0 18
lbajardsilogic@0 19 #include "layer/LayerFactory.h"
lbajardsilogic@0 20 #include "transform/Transform.h"
lbajardsilogic@0 21 #include "transform/PluginTransform.h"
lbajardsilogic@0 22 #include "base/Command.h"
lbajardsilogic@19 23 #include "data/model/AudioSourceInfoModel.h"
lbajardsilogic@0 24
lbajardsilogic@0 25 #include <map>
lbajardsilogic@0 26 #include <set>
lbajardsilogic@0 27
lbajardsilogic@0 28 class Model;
lbajardsilogic@0 29 class Layer;
lbajardsilogic@0 30 class View;
lbajardsilogic@0 31 class WaveFileModel;
lbajardsilogic@0 32
lbajardsilogic@0 33 /**
lbajardsilogic@0 34 * A Sonic Visualiser document consists of a set of data models, and
lbajardsilogic@0 35 * also the visualisation layers used to display them. Changes to the
lbajardsilogic@0 36 * layers and their layout need to be stored and managed in much the
lbajardsilogic@0 37 * same way as changes to the underlying data.
lbajardsilogic@0 38 *
lbajardsilogic@0 39 * The document manages:
lbajardsilogic@0 40 *
lbajardsilogic@0 41 * - A main data Model, which provides the underlying sample rate and
lbajardsilogic@0 42 * such like. This must be a WaveFileModel.
lbajardsilogic@0 43 *
lbajardsilogic@0 44 * - Any number of imported Model objects, which contain data without any
lbajardsilogic@0 45 * requirement to remember where the data came from or how to
lbajardsilogic@0 46 * regenerate it.
lbajardsilogic@0 47 *
lbajardsilogic@0 48 * - Any number of Model objects that were generated by a Transform
lbajardsilogic@0 49 * such as FeatureExtractionPluginTransform. For these, we also
lbajardsilogic@0 50 * record the source model and the name of the transform used to
lbajardsilogic@0 51 * generate the model so that we can regenerate it (potentially
lbajardsilogic@0 52 * from a different source) on demand.
lbajardsilogic@0 53 *
lbajardsilogic@0 54 * - A flat list of Layer objects. Elsewhere, the GUI may distribute these
lbajardsilogic@0 55 * across any number of View widgets. A layer may be viewable on more
lbajardsilogic@0 56 * than one view at once, in principle. A layer refers to one model,
lbajardsilogic@0 57 * but the same model can be in use in more than one layer.
lbajardsilogic@0 58 *
lbajardsilogic@0 59 * The document does *not* manage the existence or structure of Pane
lbajardsilogic@0 60 * and other view widgets. However, it does provide convenience
lbajardsilogic@0 61 * methods for reference-counted command-based management of the
lbajardsilogic@0 62 * association between layers and views (addLayerToView,
lbajardsilogic@0 63 * removeLayerFromView).
lbajardsilogic@0 64 */
lbajardsilogic@0 65
lbajardsilogic@0 66 class Document : public QObject,
lbajardsilogic@0 67 public XmlExportable
lbajardsilogic@0 68 {
lbajardsilogic@0 69 Q_OBJECT
lbajardsilogic@0 70
lbajardsilogic@0 71 public:
lbajardsilogic@0 72 Document();
lbajardsilogic@0 73 virtual ~Document();
lbajardsilogic@0 74
lbajardsilogic@0 75 /**
lbajardsilogic@0 76 * Create and return a new layer of the given type, associated
lbajardsilogic@0 77 * with no model. The caller may set any model on this layer, but
lbajardsilogic@0 78 * the model must also be registered with the document via the
lbajardsilogic@0 79 * add-model methods below.
lbajardsilogic@0 80 */
lbajardsilogic@0 81 Layer *createLayer(LayerFactory::LayerType);
lbajardsilogic@0 82
lbajardsilogic@0 83 /**
lbajardsilogic@0 84 * Create and return a new layer of the given type, associated
lbajardsilogic@0 85 * with the current main model (if appropriate to the layer type).
lbajardsilogic@0 86 */
lbajardsilogic@0 87 Layer *createMainModelLayer(LayerFactory::LayerType);
lbajardsilogic@0 88
lbajardsilogic@0 89 /**
lbajardsilogic@0 90 * Create and return a new layer associated with the given model,
lbajardsilogic@0 91 * and register the model as an imported model.
lbajardsilogic@0 92 */
lbajardsilogic@0 93 Layer *createImportedLayer(Model *);
lbajardsilogic@0 94
lbajardsilogic@0 95 /**
lbajardsilogic@0 96 * Create and return a new layer of the given type, with an
lbajardsilogic@0 97 * appropriate empty model. If the given type is not one for
lbajardsilogic@0 98 * which an empty model can meaningfully be created, return 0.
lbajardsilogic@0 99 */
lbajardsilogic@0 100 Layer *createEmptyLayer(LayerFactory::LayerType);
lbajardsilogic@0 101
lbajardsilogic@0 102 /**
lbajardsilogic@0 103 * Create and return a new layer of the given type, associated
lbajardsilogic@0 104 * with the given transform name. This method does not run the
lbajardsilogic@0 105 * transform itself, nor create a model. The caller can safely
lbajardsilogic@0 106 * add a model to the layer later, but note that all models used
lbajardsilogic@0 107 * by a transform layer _must_ be registered with the document
lbajardsilogic@0 108 * using addDerivedModel below.
lbajardsilogic@0 109 */
lbajardsilogic@0 110 Layer *createDerivedLayer(LayerFactory::LayerType, TransformId);
lbajardsilogic@0 111
lbajardsilogic@0 112 /**
lbajardsilogic@0 113 * Create and return a suitable layer for the given transform,
lbajardsilogic@0 114 * running the transform and associating the resulting model with
lbajardsilogic@0 115 * the new layer.
lbajardsilogic@0 116 */
lbajardsilogic@0 117 Layer *createDerivedLayer(TransformId,
lbajardsilogic@0 118 Model *inputModel,
lbajardsilogic@0 119 const PluginTransform::ExecutionContext &context,
lbajardsilogic@0 120 QString configurationXml);
lbajardsilogic@0 121
lbajardsilogic@0 122 /**
lbajardsilogic@0 123 * Set the main model (the source for playback sample rate, etc)
lbajardsilogic@0 124 * to the given wave file model. This will regenerate any derived
lbajardsilogic@0 125 * models that were based on the previous main model.
lbajardsilogic@0 126 */
lbajardsilogic@0 127 void setMainModel(WaveFileModel *);
lbajardsilogic@0 128
lbajardsilogic@0 129 /**
lbajardsilogic@0 130 * Get the main model (the source for playback sample rate, etc).
lbajardsilogic@0 131 */
lbajardsilogic@0 132 WaveFileModel *getMainModel() { return m_mainModel; }
lbajardsilogic@0 133
lbajardsilogic@0 134 /**
lbajardsilogic@0 135 * Get the main model (the source for playback sample rate, etc).
lbajardsilogic@0 136 */
lbajardsilogic@0 137 const WaveFileModel *getMainModel() const { return m_mainModel; }
lbajardsilogic@0 138
lbajardsilogic@0 139 std::vector<Model *> getTransformInputModels();
lbajardsilogic@0 140
lbajardsilogic@19 141 inline void setAudioSourceInfoFileName(const QString& name){m_audioSourceInfoFileName = name;}
lbajardsilogic@19 142 inline QString getAudioSourceInfoFileName() const { return m_audioSourceInfoFileName;}
lbajardsilogic@19 143
lbajardsilogic@19 144 void setAudioSourceInfoModel(AudioSourceInfoModel *infoModel);
lbajardsilogic@19 145
lbajardsilogic@0 146 /**
lbajardsilogic@0 147 * Add a derived model associated with the given transform,
lbajardsilogic@0 148 * running the transform and returning the resulting model.
lbajardsilogic@0 149 */
lbajardsilogic@0 150 Model *addDerivedModel(TransformId transform,
lbajardsilogic@0 151 Model *inputModel,
lbajardsilogic@0 152 const PluginTransform::ExecutionContext &context,
lbajardsilogic@0 153 QString configurationXml);
lbajardsilogic@0 154
lbajardsilogic@0 155 /**
lbajardsilogic@0 156 * Add a derived model associated with the given transform. This
lbajardsilogic@0 157 * is necessary to register any derived model that was not created
lbajardsilogic@0 158 * by the document using createDerivedModel or createDerivedLayer.
lbajardsilogic@0 159 */
lbajardsilogic@0 160 void addDerivedModel(TransformId,
lbajardsilogic@0 161 Model *inputModel,
lbajardsilogic@0 162 const PluginTransform::ExecutionContext &context,
lbajardsilogic@0 163 Model *outputModelToAdd,
lbajardsilogic@0 164 QString configurationXml);
lbajardsilogic@0 165
lbajardsilogic@0 166 /**
lbajardsilogic@0 167 * Add an imported (non-derived, non-main) model. This is
lbajardsilogic@0 168 * necessary to register any imported model that is associated
lbajardsilogic@0 169 * with a layer.
lbajardsilogic@0 170 */
lbajardsilogic@0 171 void addImportedModel(Model *);
lbajardsilogic@0 172
lbajardsilogic@0 173 /**
lbajardsilogic@0 174 * Associate the given model with the given layer. The model must
lbajardsilogic@0 175 * have already been registered using one of the addXXModel
lbajardsilogic@0 176 * methods above.
lbajardsilogic@0 177 */
lbajardsilogic@0 178 void setModel(Layer *, Model *);
lbajardsilogic@0 179
lbajardsilogic@0 180 /**
lbajardsilogic@0 181 * Set the given layer to use the given channel of its model (-1
lbajardsilogic@0 182 * means all available channels).
lbajardsilogic@0 183 */
lbajardsilogic@0 184 void setChannel(Layer *, int);
lbajardsilogic@0 185
lbajardsilogic@0 186 /**
lbajardsilogic@0 187 * Add the given layer to the given view. If the layer is
lbajardsilogic@0 188 * intended to show a particular model, the model should normally
lbajardsilogic@0 189 * be set using setModel before this method is called.
lbajardsilogic@0 190 */
lbajardsilogic@0 191 void addLayerToView(View *, Layer *);
lbajardsilogic@0 192
lbajardsilogic@0 193 /**
lbajardsilogic@0 194 * Remove the given layer from the given view.
lbajardsilogic@0 195 */
lbajardsilogic@0 196 void removeLayerFromView(View *, Layer *);
lbajardsilogic@0 197
lbajardsilogic@19 198 inline std::set<Layer *>& getLayers(){return m_layers;}
lbajardsilogic@19 199
lbajardsilogic@0 200 void toXml(QTextStream &, QString indent, QString extraAttributes) const;
lbajardsilogic@0 201 QString toXmlString(QString indent, QString extraAttributes) const;
lbajardsilogic@0 202
lbajardsilogic@19 203 QString toEasaierXmlString(QString indent, QString extraAttributes) const;
lbajardsilogic@19 204
lbajardsilogic@0 205 signals:
lbajardsilogic@0 206 void layerAdded(Layer *);
lbajardsilogic@0 207 void layerRemoved(Layer *);
lbajardsilogic@0 208 void layerAboutToBeDeleted(Layer *);
lbajardsilogic@0 209
lbajardsilogic@0 210 // Emitted when a layer is first added to a view, or when it is
lbajardsilogic@0 211 // last removed from a view
lbajardsilogic@0 212 void layerInAView(Layer *, bool);
lbajardsilogic@0 213
lbajardsilogic@0 214 void modelAdded(Model *);
lbajardsilogic@0 215 void mainModelChanged(WaveFileModel *); // emitted after modelAdded
lbajardsilogic@0 216 void modelAboutToBeDeleted(Model *);
lbajardsilogic@0 217
lbajardsilogic@0 218 void modelGenerationFailed(QString transformName);
lbajardsilogic@0 219 void modelRegenerationFailed(QString layerName, QString transformName);
lbajardsilogic@0 220
lbajardsilogic@19 221 void audioSourceInfoAdded(AudioSourceInfoModel *);
lbajardsilogic@19 222
lbajardsilogic@0 223 protected:
lbajardsilogic@0 224 void releaseModel(Model *model);
lbajardsilogic@0 225
lbajardsilogic@0 226 /**
lbajardsilogic@0 227 * Delete the given layer, and also its associated model if no
lbajardsilogic@0 228 * longer used by any other layer. In general, this should be the
lbajardsilogic@0 229 * only method used to delete layers -- doing so directly is a bit
lbajardsilogic@0 230 * of a social gaffe.
lbajardsilogic@0 231 */
lbajardsilogic@0 232 void deleteLayer(Layer *, bool force = false);
lbajardsilogic@0 233
lbajardsilogic@0 234 /*
lbajardsilogic@0 235 * Every model that is in use by a layer in the document must be
lbajardsilogic@0 236 * found in either m_mainModel, m_derivedModels or
lbajardsilogic@0 237 * m_importedModels. We own and control the lifespan of all of
lbajardsilogic@0 238 * these models.
lbajardsilogic@0 239 */
lbajardsilogic@0 240
lbajardsilogic@0 241 /**
lbajardsilogic@0 242 * The model that provides the underlying sample rate, etc. This
lbajardsilogic@0 243 * model is not reference counted for layers, and is not freed
lbajardsilogic@0 244 * unless it is replaced or the document is deleted.
lbajardsilogic@0 245 */
lbajardsilogic@0 246 WaveFileModel *m_mainModel;
lbajardsilogic@0 247
lbajardsilogic@19 248 /**
lbajardsilogic@19 249 * The name of the file on the easaier server that provides info on title, author...etc
lbajardsilogic@19 250 */
lbajardsilogic@19 251 QString m_audioSourceInfoFileName;
lbajardsilogic@19 252
lbajardsilogic@19 253 /**
lbajardsilogic@19 254 * The model that provides info on title, author...etc
lbajardsilogic@19 255 */
lbajardsilogic@19 256 AudioSourceInfoModel *m_audioSourceInfoModel;
lbajardsilogic@19 257
lbajardsilogic@0 258 struct ModelRecord
lbajardsilogic@0 259 {
lbajardsilogic@0 260 // Information associated with a non-main model. If this
lbajardsilogic@0 261 // model is derived from another, then source will be non-NULL
lbajardsilogic@0 262 // and the transform name will be set appropriately. If the
lbajardsilogic@0 263 // transform name is set but source is NULL, then there was a
lbajardsilogic@0 264 // transform involved but the (target) model has been modified
lbajardsilogic@0 265 // since being generated from it.
lbajardsilogic@0 266 const Model *source;
lbajardsilogic@0 267 TransformId transform;
lbajardsilogic@0 268 PluginTransform::ExecutionContext context;
lbajardsilogic@0 269 QString configurationXml;
lbajardsilogic@0 270
lbajardsilogic@0 271 // Count of the number of layers using this model.
lbajardsilogic@0 272 int refcount;
lbajardsilogic@0 273 };
lbajardsilogic@0 274
lbajardsilogic@0 275 typedef std::map<Model *, ModelRecord> ModelMap;
lbajardsilogic@0 276 ModelMap m_models;
lbajardsilogic@0 277
lbajardsilogic@0 278 class AddLayerCommand : public Command
lbajardsilogic@0 279 {
lbajardsilogic@0 280 public:
lbajardsilogic@0 281 AddLayerCommand(Document *d, View *view, Layer *layer);
lbajardsilogic@0 282 virtual ~AddLayerCommand();
lbajardsilogic@0 283
lbajardsilogic@0 284 virtual void execute();
lbajardsilogic@0 285 virtual void unexecute();
lbajardsilogic@0 286 virtual QString getName() const { return m_name; }
lbajardsilogic@0 287
lbajardsilogic@0 288 protected:
lbajardsilogic@0 289 Document *m_d;
lbajardsilogic@0 290 View *m_view; // I don't own this
lbajardsilogic@0 291 Layer *m_layer; // Document owns this, but I determine its lifespans
lbajardsilogic@0 292 QString m_name;
lbajardsilogic@0 293 bool m_added;
lbajardsilogic@0 294 };
lbajardsilogic@0 295
lbajardsilogic@0 296 class RemoveLayerCommand : public Command
lbajardsilogic@0 297 {
lbajardsilogic@0 298 public:
lbajardsilogic@0 299 RemoveLayerCommand(Document *d, View *view, Layer *layer);
lbajardsilogic@0 300 virtual ~RemoveLayerCommand();
lbajardsilogic@0 301
lbajardsilogic@0 302 virtual void execute();
lbajardsilogic@0 303 virtual void unexecute();
lbajardsilogic@0 304 virtual QString getName() const { return m_name; }
lbajardsilogic@0 305
lbajardsilogic@0 306 protected:
lbajardsilogic@0 307 Document *m_d;
lbajardsilogic@0 308 View *m_view; // I don't own this
lbajardsilogic@0 309 Layer *m_layer; // Document owns this, but I determine its lifespan
lbajardsilogic@0 310 QString m_name;
lbajardsilogic@0 311 bool m_added;
lbajardsilogic@0 312 };
lbajardsilogic@0 313
lbajardsilogic@0 314 typedef std::map<Layer *, std::set<View *> > LayerViewMap;
lbajardsilogic@0 315 LayerViewMap m_layerViewMap;
lbajardsilogic@0 316
lbajardsilogic@0 317 void addToLayerViewMap(Layer *, View *);
lbajardsilogic@0 318 void removeFromLayerViewMap(Layer *, View *);
lbajardsilogic@0 319
lbajardsilogic@0 320 QString getUniqueLayerName(QString candidate);
lbajardsilogic@0 321
lbajardsilogic@0 322 /**
lbajardsilogic@0 323 * And these are the layers. We also control the lifespans of
lbajardsilogic@0 324 * these (usually through the commands used to add and remove them).
lbajardsilogic@0 325 */
lbajardsilogic@0 326 typedef std::set<Layer *> LayerSet;
lbajardsilogic@0 327 LayerSet m_layers;
lbajardsilogic@0 328 };
lbajardsilogic@0 329
lbajardsilogic@0 330 #endif