annotate layer/LayerFactory.h @ 1496:d09345e578a7

Separate out handling of alignment progress bar from the layer progress bars and fix tendency to have them hanging around even when alignment has completed
author Chris Cannam
date Wed, 14 Aug 2019 10:58:24 +0100
parents b43ff1abdc02
children 0fa155b84bac
rev   line source
Chris@58 1 /* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
Chris@0 2
Chris@0 3 /*
Chris@59 4 Sonic Visualiser
Chris@59 5 An audio file viewer and annotation editor.
Chris@59 6 Centre for Digital Music, Queen Mary, University of London.
Chris@59 7 This file copyright 2006 Chris Cannam.
Chris@0 8
Chris@59 9 This program is free software; you can redistribute it and/or
Chris@59 10 modify it under the terms of the GNU General Public License as
Chris@59 11 published by the Free Software Foundation; either version 2 of the
Chris@59 12 License, or (at your option) any later version. See the file
Chris@59 13 COPYING included with this distribution for more information.
Chris@0 14 */
Chris@0 15
Chris@1311 16 #ifndef SV_LAYER_FACTORY_H
Chris@1311 17 #define SV_LAYER_FACTORY_H
Chris@0 18
Chris@0 19 #include <QString>
Chris@0 20 #include <set>
Chris@0 21
Chris@1471 22 #include "data/model/Model.h"
Chris@1471 23
Chris@0 24 class Layer;
Chris@360 25 class Clipboard;
Chris@0 26
Chris@0 27 class LayerFactory
Chris@0 28 {
Chris@0 29 public:
Chris@0 30 enum LayerType {
Chris@0 31
Chris@1266 32 // Standard layers
Chris@1266 33 Waveform,
Chris@1266 34 Spectrogram,
Chris@1266 35 TimeRuler,
Chris@1266 36 TimeInstants,
Chris@1266 37 TimeValues,
Chris@1266 38 Notes,
Chris@1266 39 FlexiNotes,
Chris@1266 40 Regions,
Chris@1266 41 Text,
Chris@303 42 Image,
Chris@1266 43 Colour3DPlot,
Chris@133 44 Spectrum,
Chris@193 45 Slice,
Chris@0 46
Chris@1266 47 // Layers with different initial parameters
Chris@1266 48 MelodicRangeSpectrogram,
Chris@1266 49 PeakFrequencySpectrogram,
Chris@0 50
Chris@1266 51 // Not-a-layer-type
Chris@1266 52 UnknownLayer = 255
Chris@0 53 };
Chris@0 54
Chris@125 55 static LayerFactory *getInstance();
Chris@0 56
Chris@0 57 virtual ~LayerFactory();
Chris@0 58
Chris@0 59 typedef std::set<LayerType> LayerTypeSet;
Chris@1471 60 LayerTypeSet getValidLayerTypes(ModelId modelId);
Chris@962 61
Chris@962 62 /**
Chris@962 63 * Return the set of layer types that an end user should be
Chris@962 64 * allowed to create, empty, for subsequent editing.
Chris@962 65 */
Chris@17 66 LayerTypeSet getValidEmptyLayerTypes();
Chris@0 67
Chris@6 68 LayerType getLayerType(const Layer *);
Chris@0 69
Chris@53 70 Layer *createLayer(LayerType type);
Chris@0 71
Chris@1455 72 /**
Chris@1455 73 * Set the default properties of a layer, from the XML string
Chris@1455 74 * contained in the LayerDefaults settings group for the given
Chris@1455 75 * layer type. Leave unchanged any properties not mentioned in the
Chris@1455 76 * settings.
Chris@1455 77 */
Chris@326 78 void setLayerDefaultProperties(LayerType type, Layer *layer);
Chris@326 79
Chris@1455 80 /**
Chris@1455 81 * Set the properties of a layer, from the XML string
Chris@1455 82 * provided. Leave unchanged any properties not mentioned.
Chris@1455 83 */
Chris@1455 84 void setLayerProperties(Layer *layer, QString xmlString);
Chris@1455 85
Chris@0 86 QString getLayerPresentationName(LayerType type);
Chris@0 87
Chris@193 88 bool isLayerSliceable(const Layer *);
Chris@193 89
Chris@1471 90 void setModel(Layer *layer, ModelId model);
Chris@1471 91 std::shared_ptr<Model> createEmptyModel(LayerType type, ModelId baseModel);
Chris@0 92
Chris@53 93 int getChannel(Layer *layer);
Chris@53 94 void setChannel(Layer *layer, int channel);
Chris@53 95
Chris@17 96 QString getLayerIconName(LayerType);
Chris@6 97 QString getLayerTypeName(LayerType);
Chris@6 98 LayerType getLayerTypeForName(QString);
Chris@6 99
Chris@360 100 LayerType getLayerTypeForClipboardContents(const Clipboard &);
Chris@360 101
Chris@0 102 protected:
Chris@0 103 template <typename LayerClass, typename ModelClass>
Chris@1471 104 bool trySetModel(Layer *layerBase, ModelId modelId) {
Chris@1266 105 LayerClass *layer = dynamic_cast<LayerClass *>(layerBase);
Chris@1266 106 if (!layer) return false;
Chris@1484 107 if (!modelId.isNone()) {
Chris@1484 108 auto model = ModelById::getAs<ModelClass>(modelId);
Chris@1484 109 if (!model) return false;
Chris@1484 110 }
Chris@1471 111 layer->setModel(modelId);
Chris@1266 112 return true;
Chris@0 113 }
Chris@0 114
Chris@0 115 static LayerFactory *m_instance;
Chris@0 116 };
Chris@0 117
Chris@0 118 #endif
Chris@0 119