annotate data/model/SparseValueModel.h @ 1455:ec9e65fcf749

The use of the begin/end pairs here just seems to cause too many rows to be deleted (from the visual representation, not the underlying model). Things apparently work better if we just modify the underlying model and let the change signals percolate back up again. To that end, update the change handlers so as to cover their proper ranges with dataChanged signals.
author Chris Cannam
date Mon, 23 Apr 2018 16:03:35 +0100
parents 48e9f538e6e9
children c01cbe41aeb5
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@147 16 #ifndef _SPARSE_VALUE_MODEL_H_
Chris@147 17 #define _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@345 56 QString getTypeName() const { 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@147 67 virtual void addPoint(const PointType &point)
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@147 87 virtual void deletePoint(const PointType &point)
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@318 116 virtual void toXml(QTextStream &stream,
Chris@318 117 QString indent = "",
Chris@314 118 QString extraAttributes = "") const
Chris@147 119 {
Chris@318 120 std::cerr << "SparseValueModel::toXml: extraAttributes = \""
Chris@318 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