annotate layer/Colour3DPlotLayer.h @ 561:aced8ec09bc8

* Complete the overhaul of CSV file import; now you can pick the purpose for each column in the file, and SV should do the rest. The most significant practical improvement here is that we can now handle files in which time and duration do not necessarily appear in known columns.
author Chris Cannam
date Mon, 19 Jul 2010 17:08:56 +0000
parents 78f9436195b1
children 5b72899d692b
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@182 7 This file copyright 2006 Chris Cannam and QMUL.
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@0 16 #ifndef _COLOUR_3D_PLOT_H_
Chris@0 17 #define _COLOUR_3D_PLOT_H_
Chris@0 18
Chris@193 19 #include "SliceableLayer.h"
Chris@0 20
Chris@128 21 #include "data/model/DenseThreeDimensionalModel.h"
Chris@0 22
Chris@0 23 class View;
Chris@0 24 class QPainter;
Chris@0 25 class QImage;
Chris@0 26
Chris@0 27 /**
Chris@0 28 * This is a view that displays dense 3-D data (time, some sort of
Chris@0 29 * binned y-axis range, value) as a colour plot with value mapped to
Chris@0 30 * colour range. Its source is a DenseThreeDimensionalModel.
Chris@0 31 *
Chris@0 32 * This was the original implementation for the spectrogram view, but
Chris@0 33 * it was replaced with a more efficient implementation that derived
Chris@0 34 * the spectrogram itself from a DenseTimeValueModel instead of using
Chris@0 35 * a three-dimensional model. This class is retained in case it
Chris@0 36 * becomes useful, but it will probably need some cleaning up if it's
Chris@0 37 * ever actually used.
Chris@0 38 */
Chris@0 39
Chris@193 40 class Colour3DPlotLayer : public SliceableLayer
Chris@0 41 {
Chris@0 42 Q_OBJECT
Chris@0 43
Chris@0 44 public:
Chris@44 45 Colour3DPlotLayer();
Chris@0 46 ~Colour3DPlotLayer();
Chris@0 47
Chris@156 48 virtual const ZoomConstraint *getZoomConstraint() const {
Chris@156 49 return m_model ? m_model->getZoomConstraint() : 0;
Chris@156 50 }
Chris@0 51 virtual const Model *getModel() const { return m_model; }
Chris@44 52 virtual void paint(View *v, QPainter &paint, QRect rect) const;
Chris@0 53
Chris@44 54 virtual int getVerticalScaleWidth(View *v, QPainter &) const;
Chris@44 55 virtual void paintVerticalScale(View *v, QPainter &paint, QRect rect) const;
Chris@25 56
Chris@44 57 virtual QString getFeatureDescription(View *v, QPoint &) const;
Chris@25 58
Chris@44 59 virtual bool snapToFeatureFrame(View *v, int &frame,
Chris@28 60 size_t &resolution,
Chris@28 61 SnapType snap) const;
Chris@24 62
Chris@475 63 virtual void setLayerDormant(const View *v, bool dormant);
Chris@475 64
Chris@44 65 virtual bool isLayerScrollable(const View *v) const;
Chris@25 66
Chris@287 67 virtual ColourSignificance getLayerColourSignificance() const {
Chris@287 68 return ColourHasMeaningfulValue;
Chris@287 69 }
Chris@183 70
Chris@0 71 void setModel(const DenseThreeDimensionalModel *model);
Chris@0 72
Chris@115 73 virtual int getCompletion(View *) const { return m_model->getCompletion(); }
Chris@24 74
Chris@0 75 virtual PropertyList getProperties() const;
Chris@0 76 virtual PropertyType getPropertyType(const PropertyName &) const;
Chris@159 77 virtual QString getPropertyLabel(const PropertyName &) const;
Chris@346 78 virtual QString getPropertyIconName(const PropertyName &) const;
Chris@159 79 virtual QString getPropertyGroupName(const PropertyName &) const;
Chris@0 80 virtual int getPropertyRangeAndValue(const PropertyName &,
Chris@216 81 int *min, int *max, int *deflt) const;
Chris@0 82 virtual QString getPropertyValueLabel(const PropertyName &,
Chris@0 83 int value) const;
Chris@534 84 virtual RangeMapper *getNewPropertyRangeMapper(const PropertyName &) const;
Chris@0 85 virtual void setProperty(const PropertyName &, int value);
Chris@197 86 virtual void setProperties(const QXmlAttributes &);
Chris@11 87
Chris@509 88 enum ColourScale {
Chris@509 89 LinearScale,
Chris@509 90 LogScale,
Chris@509 91 PlusMinusOneScale,
Chris@509 92 AbsoluteScale
Chris@509 93 };
Chris@159 94
Chris@159 95 void setColourScale(ColourScale);
Chris@159 96 ColourScale getColourScale() const { return m_colourScale; }
Chris@159 97
Chris@197 98 void setColourMap(int map);
Chris@197 99 int getColourMap() const;
Chris@197 100
Chris@534 101 /**
Chris@534 102 * Set the gain multiplier for sample values in this view.
Chris@534 103 * The default is 1.0.
Chris@534 104 */
Chris@534 105 void setGain(float gain);
Chris@534 106 float getGain() const;
Chris@534 107
Chris@531 108 enum BinScale {
Chris@531 109 LinearBinScale,
Chris@531 110 LogBinScale
Chris@531 111 };
Chris@531 112
Chris@531 113 /**
Chris@531 114 * Specify the scale for the y axis.
Chris@531 115 */
Chris@531 116 void setBinScale(BinScale);
Chris@531 117 BinScale getBinScale() const;
Chris@531 118
Chris@197 119 void setNormalizeColumns(bool n);
Chris@197 120 bool getNormalizeColumns() const;
Chris@197 121
Chris@197 122 void setNormalizeVisibleArea(bool n);
Chris@197 123 bool getNormalizeVisibleArea() const;
Chris@197 124
Chris@357 125 void setInvertVertical(bool i);
Chris@357 126 bool getInvertVertical() const;
Chris@357 127
Chris@465 128 void setOpaque(bool i);
Chris@465 129 bool getOpaque() const;
Chris@465 130
Chris@535 131 void setSmooth(bool i);
Chris@535 132 bool getSmooth() const;
Chris@535 133
Chris@444 134 virtual bool getValueExtents(float &min, float &max,
Chris@444 135 bool &logarithmic, QString &unit) const;
Chris@444 136
Chris@444 137 virtual bool getDisplayExtents(float &min, float &max) const;
Chris@444 138 virtual bool setDisplayExtents(float min, float max);
Chris@444 139
Chris@444 140 virtual int getVerticalZoomSteps(int &defaultStep) const;
Chris@444 141 virtual int getCurrentVerticalZoomStep() const;
Chris@444 142 virtual void setVerticalZoomStep(int);
Chris@444 143 virtual RangeMapper *getNewVerticalZoomRangeMapper() const;
Chris@444 144
Chris@193 145 virtual const Model *getSliceableModel() const { return m_model; }
Chris@193 146
Chris@316 147 virtual void toXml(QTextStream &stream, QString indent = "",
Chris@316 148 QString extraAttributes = "") const;
Chris@197 149
Chris@0 150 protected slots:
Chris@0 151 void cacheInvalid();
Chris@0 152 void cacheInvalid(size_t startFrame, size_t endFrame);
Chris@461 153 void modelChanged();
Chris@461 154 void modelChanged(size_t, size_t);
Chris@0 155
Chris@0 156 protected:
Chris@0 157 const DenseThreeDimensionalModel *m_model; // I do not own this
Chris@0 158
Chris@0 159 mutable QImage *m_cache;
Chris@469 160 mutable QImage *m_peaksCache;
Chris@461 161 mutable size_t m_cacheValidStart;
Chris@461 162 mutable size_t m_cacheValidEnd;
Chris@98 163
Chris@159 164 ColourScale m_colourScale;
Chris@461 165 bool m_colourScaleSet;
Chris@197 166 int m_colourMap;
Chris@534 167 float m_gain;
Chris@531 168 BinScale m_binScale;
Chris@197 169 bool m_normalizeColumns;
Chris@197 170 bool m_normalizeVisibleArea;
Chris@357 171 bool m_invertVertical;
Chris@465 172 bool m_opaque;
Chris@535 173 bool m_smooth;
Chris@469 174 size_t m_peakResolution;
Chris@197 175
Chris@444 176 int m_miny;
Chris@444 177 int m_maxy;
Chris@444 178
Chris@467 179 DenseThreeDimensionalModel::Column getColumn(size_t col) const;
Chris@159 180
Chris@469 181 int getColourScaleWidth(QPainter &) const;
Chris@469 182 void fillCache(size_t firstBin, size_t lastBin) const;
Chris@469 183 void paintDense(View *v, QPainter &paint, QRect rect) const;
Chris@532 184
Chris@532 185 float getYForBin(View *, float bin) const;
Chris@532 186 float getBinForY(View *, float y) const;
Chris@0 187 };
Chris@0 188
Chris@0 189 #endif