annotate data/model/EditableDenseThreeDimensionalModel.h @ 1833:21c792334c2e sensible-delimited-data-strings

Rewrite all the DelimitedDataString stuff so as to return vectors of individual cell strings rather than having the classes add the delimiters themselves. Rename accordingly to names based on StringExport. Take advantage of this in the CSV writer code so as to properly quote cells that contain delimiter characters.
author Chris Cannam
date Fri, 03 Apr 2020 17:11:05 +0100
parents c546429d4c2f
children
rev   line source
Chris@152 1 /* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
Chris@152 2
Chris@152 3 /*
Chris@152 4 Sonic Visualiser
Chris@152 5 An audio file viewer and annotation editor.
Chris@152 6 Centre for Digital Music, Queen Mary, University of London.
Chris@202 7 This file copyright 2006 Chris Cannam and QMUL.
Chris@152 8
Chris@152 9 This program is free software; you can redistribute it and/or
Chris@152 10 modify it under the terms of the GNU General Public License as
Chris@152 11 published by the Free Software Foundation; either version 2 of the
Chris@152 12 License, or (at your option) any later version. See the file
Chris@152 13 COPYING included with this distribution for more information.
Chris@152 14 */
Chris@152 15
Chris@1581 16 #ifndef SV_EDITABLE_DENSE_THREE_DIMENSIONAL_MODEL_H
Chris@1581 17 #define SV_EDITABLE_DENSE_THREE_DIMENSIONAL_MODEL_H
Chris@152 18
Chris@152 19 #include "DenseThreeDimensionalModel.h"
Chris@152 20
Chris@1777 21 #include <QMutex>
Chris@536 22
Chris@533 23 #include <vector>
Chris@533 24
Chris@152 25 class EditableDenseThreeDimensionalModel : public DenseThreeDimensionalModel
Chris@152 26 {
Chris@152 27 Q_OBJECT
Chris@152 28
Chris@152 29 public:
Chris@1040 30 EditableDenseThreeDimensionalModel(sv_samplerate_t sampleRate,
Chris@1429 31 int resolution,
Chris@1429 32 int height,
Chris@1429 33 bool notifyOnAdd = true);
Chris@152 34
Chris@1580 35 bool isOK() const override;
Chris@1701 36 bool isReady(int *completion = 0) const override;
Chris@1701 37 void setCompletion(int completion, bool update = true);
Chris@1701 38 int getCompletion() const override;
Chris@152 39
Chris@1580 40 sv_samplerate_t getSampleRate() const override;
Chris@1580 41 sv_frame_t getStartFrame() const override;
Chris@1725 42 sv_frame_t getTrueEndFrame() const override;
Chris@152 43
Chris@152 44 /**
Chris@611 45 * Set the frame offset of the first column.
Chris@611 46 */
Chris@1038 47 virtual void setStartFrame(sv_frame_t);
Chris@611 48
Chris@611 49 /**
Chris@152 50 * Return the number of sample frames covered by each set of bins.
Chris@152 51 */
Chris@1580 52 int getResolution() const override;
Chris@152 53
Chris@152 54 /**
Chris@152 55 * Set the number of sample frames covered by each set of bins.
Chris@152 56 */
Chris@929 57 virtual void setResolution(int sz);
Chris@152 58
Chris@152 59 /**
Chris@182 60 * Return the number of columns.
Chris@182 61 */
Chris@1580 62 int getWidth() const override;
Chris@182 63
Chris@182 64 /**
Chris@1252 65 * Return the number of bins in each column.
Chris@152 66 */
Chris@1580 67 int getHeight() const override;
Chris@152 68
Chris@152 69 /**
Chris@1252 70 * Set the number of bins in each column.
Chris@1252 71 *
Chris@1252 72 * You can set (via setColumn) a vector of any length as a column,
Chris@1252 73 * but any column being retrieved will be resized to this height
Chris@1252 74 * (or the height that was supplied to the constructor, if this is
Chris@1252 75 * never called) on retrieval. That is, the model owner determines
Chris@1252 76 * the height of the model at a single stroke; the columns
Chris@1252 77 * themselves don't have any effect on the height of the model.
Chris@152 78 */
Chris@929 79 virtual void setHeight(int sz);
Chris@152 80
Chris@152 81 /**
Chris@152 82 * Return the minimum value of the value in each bin.
Chris@152 83 */
Chris@1580 84 float getMinimumLevel() const override;
Chris@152 85
Chris@152 86 /**
Chris@152 87 * Set the minimum value of the value in a bin.
Chris@152 88 */
Chris@152 89 virtual void setMinimumLevel(float sz);
Chris@152 90
Chris@152 91 /**
Chris@152 92 * Return the maximum value of the value in each bin.
Chris@152 93 */
Chris@1580 94 float getMaximumLevel() const override;
Chris@152 95
Chris@152 96 /**
Chris@152 97 * Set the maximum value of the value in a bin.
Chris@152 98 */
Chris@152 99 virtual void setMaximumLevel(float sz);
Chris@152 100
Chris@182 101 /**
Chris@182 102 * Get the set of bin values at the given column.
Chris@152 103 */
Chris@1580 104 Column getColumn(int x) const override;
Chris@152 105
Chris@152 106 /**
Chris@182 107 * Get a single value, from the n'th bin of the given column.
Chris@152 108 */
Chris@1580 109 float getValueAt(int x, int n) const override;
Chris@152 110
Chris@152 111 /**
Chris@182 112 * Set the entire set of bin values at the given column.
Chris@152 113 */
Chris@929 114 virtual void setColumn(int x, const Column &values);
Chris@152 115
Chris@881 116 /**
Chris@881 117 * Return the name of bin n. This is a single label per bin that
Chris@881 118 * does not vary from one column to the next.
Chris@881 119 */
Chris@1580 120 QString getBinName(int n) const override;
Chris@881 121
Chris@881 122 /**
Chris@881 123 * Set the name of bin n.
Chris@881 124 */
Chris@929 125 virtual void setBinName(int n, QString);
Chris@881 126
Chris@881 127 /**
Chris@881 128 * Set the names of all bins.
Chris@881 129 */
Chris@152 130 virtual void setBinNames(std::vector<QString> names);
Chris@152 131
Chris@881 132 /**
Chris@886 133 * Return true if the bins have values as well as names. (The
Chris@886 134 * values may have been derived from the names, e.g. by parsing
Chris@886 135 * numbers from them.) If this returns true, getBinValue() may be
Chris@886 136 * used to retrieve the values.
Chris@886 137 */
Chris@1580 138 bool hasBinValues() const override;
Chris@886 139
Chris@886 140 /**
Chris@886 141 * Return the value of bin n, if any. This is a "vertical scale"
Chris@886 142 * value which does not vary from one column to the next. This is
Chris@886 143 * only meaningful if hasBinValues() returns true.
Chris@886 144 */
Chris@1580 145 float getBinValue(int n) const override;
Chris@886 146
Chris@886 147 /**
Chris@886 148 * Set the values of all bins (separate from their labels). These
Chris@886 149 * are "vertical scale" values which do not vary from one column
Chris@886 150 * to the next.
Chris@886 151 */
Chris@886 152 virtual void setBinValues(std::vector<float> values);
Chris@886 153
Chris@886 154 /**
Chris@886 155 * Obtain the name of the unit of the values returned from
Chris@886 156 * getBinValue(), if any.
Chris@886 157 */
Chris@1580 158 QString getBinValueUnit() const override;
Chris@886 159
Chris@886 160 /**
Chris@886 161 * Set the name of the unit of the values return from
Chris@886 162 * getBinValue() if any.
Chris@886 163 */
Chris@886 164 virtual void setBinValueUnit(QString unit);
Chris@886 165
Chris@886 166 /**
Chris@881 167 * Return true if the distribution of values in the bins is such
Chris@881 168 * as to suggest a log scale (mapping to colour etc) may be better
Chris@881 169 * than a linear one.
Chris@881 170 */
Chris@1580 171 bool shouldUseLogValueScale() const override;
Chris@478 172
Chris@1580 173 QString getTypeName() const override { return tr("Editable Dense 3-D"); }
Chris@345 174
Chris@1833 175 QVector<QString>
Chris@1833 176 getStringExportHeaders(DataExportOptions options) const override;
Chris@1815 177
Chris@1833 178 QVector<QVector<QString>>
Chris@1833 179 toStringExportRows(DataExportOptions options,
Chris@1833 180 sv_frame_t startFrame,
Chris@1833 181 sv_frame_t duration) const override;
Chris@318 182
Chris@1580 183 void toXml(QTextStream &out,
Chris@152 184 QString indent = "",
Chris@1580 185 QString extraAttributes = "") const override;
Chris@152 186
Chris@152 187 protected:
Chris@1154 188 typedef std::vector<Column> ValueMatrix;
Chris@152 189 ValueMatrix m_data;
Chris@152 190
Chris@152 191 std::vector<QString> m_binNames;
Chris@886 192 std::vector<float> m_binValues;
Chris@886 193 QString m_binValueUnit;
Chris@152 194
Chris@1038 195 sv_frame_t m_startFrame;
Chris@1040 196 sv_samplerate_t m_sampleRate;
Chris@929 197 int m_resolution;
Chris@929 198 int m_yBinCount;
Chris@152 199 float m_minimum;
Chris@152 200 float m_maximum;
Chris@256 201 bool m_haveExtents;
Chris@152 202 bool m_notifyOnAdd;
Chris@1110 203 sv_frame_t m_sinceLastNotifyMin;
Chris@1110 204 sv_frame_t m_sinceLastNotifyMax;
Chris@152 205 int m_completion;
Chris@152 206
Chris@1777 207 mutable QMutex m_mutex;
Chris@152 208 };
Chris@152 209
Chris@152 210 #endif