annotate data/model/SparseValueModel.h @ 1648:86bbccb79c9b single-point

Switch to a single external set of commands for modifying editables with events
author Chris Cannam
date Fri, 15 Mar 2019 10:57:35 +0000
parents 23a29e5dc0e9
children
rev   line source
Chris@147 1 /* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
Chris@147 2
Chris@147 3 /*
Chris@147 4 Sonic Visualiser
Chris@147 5 An audio file viewer and annotation editor.
Chris@147 6 Centre for Digital Music, Queen Mary, University of London.
Chris@147 7 This file copyright 2006 Chris Cannam.
Chris@147 8
Chris@147 9 This program is free software; you can redistribute it and/or
Chris@147 10 modify it under the terms of the GNU General Public License as
Chris@147 11 published by the Free Software Foundation; either version 2 of the
Chris@147 12 License, or (at your option) any later version. See the file
Chris@147 13 COPYING included with this distribution for more information.
Chris@147 14 */
Chris@147 15
Chris@1581 16 #ifndef SV_SPARSE_VALUE_MODEL_H
Chris@1581 17 #define SV_SPARSE_VALUE_MODEL_H
Chris@147 18
Chris@147 19 #include "SparseModel.h"
Chris@150 20 #include "base/UnitDatabase.h"
Chris@147 21
Chris@606 22 #include "system/System.h"
Chris@257 23
Chris@147 24 /**
Chris@147 25 * Model containing sparse data (points with some properties) of which
Chris@147 26 * one of the properties is an arbitrary float value. The other
Chris@147 27 * properties depend on the point type.
Chris@147 28 */
Chris@147 29
Chris@147 30 template <typename PointType>
Chris@147 31 class SparseValueModel : public SparseModel<PointType>
Chris@147 32 {
Chris@147 33 public:
Chris@1040 34 SparseValueModel(sv_samplerate_t sampleRate, int resolution,
Chris@1429 35 bool notifyOnAdd = true) :
Chris@1429 36 SparseModel<PointType>(sampleRate, resolution, notifyOnAdd),
Chris@1429 37 m_valueMinimum(0.f),
Chris@1429 38 m_valueMaximum(0.f),
Chris@256 39 m_haveExtents(false)
Chris@256 40 { }
Chris@256 41
Chris@1040 42 SparseValueModel(sv_samplerate_t sampleRate, int resolution,
Chris@1429 43 float valueMinimum, float valueMaximum,
Chris@1429 44 bool notifyOnAdd = true) :
Chris@1429 45 SparseModel<PointType>(sampleRate, resolution, notifyOnAdd),
Chris@1429 46 m_valueMinimum(valueMinimum),
Chris@1429 47 m_valueMaximum(valueMaximum),
Chris@256 48 m_haveExtents(true)
Chris@147 49 { }
Chris@147 50
Chris@147 51 using SparseModel<PointType>::m_points;
Chris@147 52 using SparseModel<PointType>::modelChanged;
Chris@301 53 using SparseModel<PointType>::getPoints;
Chris@345 54 using SparseModel<PointType>::tr;
Chris@345 55
Chris@1580 56 QString getTypeName() const override { return tr("Sparse Value"); }
Chris@147 57
Chris@147 58 virtual float getValueMinimum() const { return m_valueMinimum; }
Chris@147 59 virtual float getValueMaximum() const { return m_valueMaximum; }
Chris@147 60
Chris@147 61 virtual QString getScaleUnits() const { return m_units; }
Chris@147 62 virtual void setScaleUnits(QString units) {
Chris@147 63 m_units = units;
Chris@147 64 UnitDatabase::getInstance()->registerUnit(units);
Chris@147 65 }
Chris@147 66
Chris@1580 67 void addPoint(const PointType &point) override
Chris@147 68 {
Chris@1429 69 bool allChange = false;
Chris@256 70
Chris@606 71 if (!ISNAN(point.value) && !ISINF(point.value)) {
Chris@256 72 if (!m_haveExtents || point.value < m_valueMinimum) {
Chris@256 73 m_valueMinimum = point.value; allChange = true;
Chris@296 74 // std::cerr << "addPoint: value min = " << m_valueMinimum << std::endl;
Chris@256 75 }
Chris@256 76 if (!m_haveExtents || point.value > m_valueMaximum) {
Chris@256 77 m_valueMaximum = point.value; allChange = true;
Chris@296 78 // std::cerr << "addPoint: value max = " << m_valueMaximum << " (min = " << m_valueMinimum << ")" << std::endl;
Chris@256 79 }
Chris@256 80 m_haveExtents = true;
Chris@256 81 }
Chris@147 82
Chris@1429 83 SparseModel<PointType>::addPoint(point);
Chris@1429 84 if (allChange) emit modelChanged();
Chris@147 85 }
Chris@147 86
Chris@1580 87 void deletePoint(const PointType &point) override
Chris@147 88 {
Chris@1429 89 SparseModel<PointType>::deletePoint(point);
Chris@147 90
Chris@1429 91 if (point.value == m_valueMinimum ||
Chris@1429 92 point.value == m_valueMaximum) {
Chris@147 93
Chris@1429 94 float formerMin = m_valueMinimum, formerMax = m_valueMaximum;
Chris@147 95
Chris@1429 96 for (typename SparseModel<PointType>::PointList::const_iterator i
Chris@1429 97 = m_points.begin();
Chris@1429 98 i != m_points.end(); ++i) {
Chris@147 99
Chris@1429 100 if (i == m_points.begin() || i->value < m_valueMinimum) {
Chris@1429 101 m_valueMinimum = i->value;
Chris@296 102 // std::cerr << "deletePoint: value min = " << m_valueMinimum << std::endl;
Chris@1429 103 }
Chris@1429 104 if (i == m_points.begin() || i->value > m_valueMaximum) {
Chris@1429 105 m_valueMaximum = i->value;
Chris@296 106 // std::cerr << "deletePoint: value max = " << m_valueMaximum << std::endl;
Chris@1429 107 }
Chris@1429 108 }
Chris@147 109
Chris@1429 110 if (formerMin != m_valueMinimum || formerMax != m_valueMaximum) {
Chris@1429 111 emit modelChanged();
Chris@1429 112 }
Chris@1429 113 }
Chris@147 114 }
Chris@147 115
Chris@1580 116 void toXml(QTextStream &stream,
Chris@1608 117 QString indent = "",
Chris@1608 118 QString extraAttributes = "") const override
Chris@147 119 {
Chris@318 120 std::cerr << "SparseValueModel::toXml: extraAttributes = \""
Chris@1612 121 << extraAttributes.toStdString() << "\"" << std::endl;
Chris@318 122
Chris@1429 123 SparseModel<PointType>::toXml
Chris@1429 124 (stream,
Chris@318 125 indent,
Chris@1429 126 QString("%1 minimum=\"%2\" maximum=\"%3\" units=\"%4\"")
Chris@1429 127 .arg(extraAttributes).arg(m_valueMinimum).arg(m_valueMaximum)
Chris@147 128 .arg(this->encodeEntities(m_units)));
Chris@147 129 }
Chris@147 130
Chris@147 131 protected:
Chris@147 132 float m_valueMinimum;
Chris@147 133 float m_valueMaximum;
Chris@256 134 bool m_haveExtents;
Chris@147 135 QString m_units;
Chris@147 136 };
Chris@147 137
Chris@147 138
Chris@147 139 #endif
Chris@147 140