Mercurial > hg > svgui
diff layer/LayerFactory.cpp @ 0:2a4f26e85b4c
initial import
author | Chris Cannam |
---|---|
date | Tue, 10 Jan 2006 16:33:16 +0000 |
parents | |
children | 37b110168acf |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/layer/LayerFactory.cpp Tue Jan 10 16:33:16 2006 +0000 @@ -0,0 +1,180 @@ +/* -*- c-basic-offset: 4 -*- vi:set ts=8 sts=4 sw=4: */ + +/* + A waveform viewer and audio annotation editor. + Chris Cannam, Queen Mary University of London, 2005 + + This is experimental software. Not for distribution. +*/ + +#include "LayerFactory.h" + +#include "WaveformLayer.h" +#include "SpectrogramLayer.h" +#include "TimeRulerLayer.h" +#include "TimeInstantLayer.h" +#include "TimeValueLayer.h" +#include "Colour3DPlotLayer.h" + +#include "model/RangeSummarisableTimeValueModel.h" +#include "model/DenseTimeValueModel.h" +#include "model/SparseOneDimensionalModel.h" +#include "model/SparseTimeValueModel.h" +#include "model/DenseThreeDimensionalModel.h" + +LayerFactory * +LayerFactory::m_instance = new LayerFactory; + +LayerFactory * +LayerFactory::instance() +{ + return m_instance; +} + +LayerFactory::~LayerFactory() +{ +} + +QString +LayerFactory::getLayerPresentationName(LayerType type) +{ + switch (type) { + case Waveform: return Layer::tr("Waveform"); + case Spectrogram: return Layer::tr("Spectrogram"); + case TimeRuler: return Layer::tr("Ruler"); + case TimeInstants: return Layer::tr("Time Instants"); + case TimeValues: return Layer::tr("Time Values"); + case Colour3DPlot: return Layer::tr("Colour 3D Plot"); + + case MelodicRangeSpectrogram: + // The user can change all the parameters of this after the + // fact -- there's nothing permanently melodic-range about it + // that should be encoded in its name + return Layer::tr("Spectrogram"); + } + + return Layer::tr("Layer"); +} + +LayerFactory::LayerTypeSet +LayerFactory::getValidLayerTypes(Model *model) +{ + LayerTypeSet types; + + if (dynamic_cast<DenseThreeDimensionalModel *>(model)) { + types.insert(Colour3DPlot); + } + + if (dynamic_cast<DenseTimeValueModel *>(model)) { + types.insert(Spectrogram); + types.insert(MelodicRangeSpectrogram); + } + + if (dynamic_cast<RangeSummarisableTimeValueModel *>(model)) { + types.insert(Waveform); + } + + if (dynamic_cast<SparseOneDimensionalModel *>(model)) { + types.insert(TimeInstants); + } + + if (dynamic_cast<SparseTimeValueModel *>(model)) { + types.insert(TimeValues); + } + + // We don't count TimeRuler here as it doesn't actually display + // the data, although it can be backed by any model + + return types; +} + +LayerFactory::LayerType +LayerFactory::getLayerType(Layer *layer) +{ + if (dynamic_cast<WaveformLayer *>(layer)) return Waveform; + if (dynamic_cast<SpectrogramLayer *>(layer)) return Spectrogram; + if (dynamic_cast<TimeRulerLayer *>(layer)) return TimeRuler; + if (dynamic_cast<TimeInstantLayer *>(layer)) return TimeInstants; + if (dynamic_cast<TimeValueLayer *>(layer)) return TimeValues; + if (dynamic_cast<Colour3DPlotLayer *>(layer)) return Colour3DPlot; + return UnknownLayer; +} + +void +LayerFactory::setModel(Layer *layer, Model *model) +{ + if (trySetModel<WaveformLayer, RangeSummarisableTimeValueModel>(layer, model)) + return; + + if (trySetModel<SpectrogramLayer, DenseTimeValueModel>(layer, model)) + return; + + if (trySetModel<TimeRulerLayer, Model>(layer, model)) + return; + + if (trySetModel<TimeInstantLayer, SparseOneDimensionalModel>(layer, model)) + return; + + if (trySetModel<TimeValueLayer, SparseTimeValueModel>(layer, model)) + return; + + if (trySetModel<Colour3DPlotLayer, DenseThreeDimensionalModel>(layer, model)) + return; + + if (trySetModel<SpectrogramLayer, DenseTimeValueModel>(layer, model)) + return; +} + +Layer * +LayerFactory::createLayer(LayerType type, View *view, + Model *model, int channel) +{ + Layer *layer = 0; + + switch (type) { + + case Waveform: + layer = new WaveformLayer(view); + static_cast<WaveformLayer *>(layer)->setChannel(channel); + break; + + case Spectrogram: + layer = new SpectrogramLayer(view); + static_cast<SpectrogramLayer *>(layer)->setChannel(channel); + break; + + case TimeRuler: + layer = new TimeRulerLayer(view); + break; + + case TimeInstants: + layer = new TimeInstantLayer(view); + break; + + case TimeValues: + layer = new TimeValueLayer(view); + break; + + case Colour3DPlot: + layer = new Colour3DPlotLayer(view); + break; + + case MelodicRangeSpectrogram: + layer = new SpectrogramLayer(view, SpectrogramLayer::MelodicRange); + static_cast<SpectrogramLayer *>(layer)->setChannel(channel); + break; + } + + if (!layer) { + std::cerr << "LayerFactory::createLayer: Unknown layer type " + << type << std::endl; + } else { + setModel(layer, model); + std::cerr << "LayerFactory::createLayer: Setting object name " + << getLayerPresentationName(type).toStdString() << " on " << layer << std::endl; + layer->setObjectName(getLayerPresentationName(type)); + } + + return layer; +} +