annotate data/model/IntervalModel.h @ 282:d9319859a4cf tip

(none)
author benoitrigolleau
date Fri, 31 Oct 2008 11:00:24 +0000
parents 82d17c4d4b39
children
rev   line source
lbajardsilogic@16 1 /* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
lbajardsilogic@16 2
lbajardsilogic@16 3 /*
lbajardsilogic@16 4 Sound Access
lbajardsilogic@16 5 EASAIER client application.
lbajardsilogic@16 6 Silogic 2007. Luc Barthélémy.
lbajardsilogic@16 7
lbajardsilogic@16 8 This program is free software; you can redistribute it and/or
lbajardsilogic@16 9 modify it under the terms of the GNU General Public License as
lbajardsilogic@16 10 published by the Free Software Foundation; either version 2 of the
lbajardsilogic@16 11 License, or (at your option) any later version. See the file
lbajardsilogic@16 12 COPYING included with this distribution for more information.
lbajardsilogic@16 13 */
lbajardsilogic@16 14
lbajardsilogic@16 15 #ifndef _INTERVAL_MODEL_H_
lbajardsilogic@16 16 #define _INTERVAL_MODEL_H_
lbajardsilogic@16 17
lbajardsilogic@16 18 #include <QMutex>
lbajardsilogic@16 19
lbajardsilogic@16 20 #include "Model.h"
lbajardsilogic@16 21 #include "base/RealTime.h"
lbajardsilogic@16 22 #include "base/Command.h"
lbajardsilogic@16 23 #include "base/CommandHistory.h"
lbajardsilogic@16 24
lbajardsilogic@16 25 /**
lbajardsilogic@16 26 * TimeInterval SparseValueModel
lbajardsilogic@16 27 */
lbajardsilogic@16 28
lbajardsilogic@16 29 class TimeInterval
lbajardsilogic@16 30 {
lbajardsilogic@16 31 public:
lbajardsilogic@16 32
lbajardsilogic@16 33 TimeInterval(long start = 0, long end = 0, float value = 0.0f);
lbajardsilogic@16 34 TimeInterval(long start, long end, const QString& label, float value = 0.0f);
lbajardsilogic@16 35 virtual ~TimeInterval();
lbajardsilogic@16 36
lbajardsilogic@16 37 QString toXmlString(QString indent = "", QString extraAttributes = "") const;
lbajardsilogic@16 38 QString toDelimitedDataString(const QString& delimiter, size_t sampleRate) const;
lbajardsilogic@16 39
lbajardsilogic@16 40 long start() const {return m_start;}
lbajardsilogic@16 41 long end() const {return m_end;}
lbajardsilogic@16 42 float value() const {return m_value;}
lbajardsilogic@16 43 const QString& label() const { return m_label; }
lbajardsilogic@16 44
lbajardsilogic@16 45 void start(long start) { m_start = start;}
lbajardsilogic@16 46 void end(long end) { m_end = end;}
lbajardsilogic@16 47 void label(const QString& label) { m_label = label;}
lbajardsilogic@16 48 void value(float val) { m_value = val;}
lbajardsilogic@16 49
lbajardsilogic@16 50 private:
lbajardsilogic@16 51
lbajardsilogic@16 52 long m_start;
lbajardsilogic@16 53 long m_end;
lbajardsilogic@16 54 float m_value;
lbajardsilogic@16 55
lbajardsilogic@16 56 QString m_label;
lbajardsilogic@16 57 };
lbajardsilogic@16 58
lbajardsilogic@16 59 typedef TimeInterval* TimeIntervalPtr;
lbajardsilogic@16 60
lbajardsilogic@16 61 typedef std::list<TimeIntervalPtr> IntervalList;
lbajardsilogic@16 62 typedef IntervalList::iterator IntervalListIterator;
lbajardsilogic@16 63 typedef IntervalList::const_iterator IntervalListConstIterator;
lbajardsilogic@16 64
lbajardsilogic@16 65 /**
lbajardsilogic@16 66 * IntervalModel
lbajardsilogic@16 67 */
lbajardsilogic@16 68
lbajardsilogic@16 69 class IntervalModel : public Model
lbajardsilogic@16 70 {
lbajardsilogic@16 71 public:
lbajardsilogic@16 72
lbajardsilogic@16 73 IntervalModel(size_t sampleRate, size_t resolution,
lbajardsilogic@16 74 bool notifyOnAdd = true);
lbajardsilogic@16 75 ~IntervalModel();
lbajardsilogic@16 76
lbajardsilogic@16 77
lbajardsilogic@16 78 virtual bool isOK() const { return true; }
lbajardsilogic@16 79 virtual size_t getStartFrame() const;
lbajardsilogic@16 80 virtual size_t getEndFrame() const;
lbajardsilogic@16 81
lbajardsilogic@16 82 virtual size_t getSampleRate() const { return m_sampleRate; }
lbajardsilogic@16 83 virtual size_t getResolution() const { return m_resolution; }
lbajardsilogic@16 84
lbajardsilogic@16 85 virtual Model *clone() const;
lbajardsilogic@16 86
lbajardsilogic@48 87 virtual void toXml(QTextStream &out,
lbajardsilogic@48 88 QString indent = "",
lbajardsilogic@48 89 QString extraAttributes = "") const;
lbajardsilogic@16 90 virtual QString toXmlString(QString indent = "", QString extraAttributes = "") const;
lbajardsilogic@16 91 virtual QString toDelimitedDataString(QString) const;
lbajardsilogic@16 92
lbajardsilogic@16 93 virtual void addInterval(long start, long end, const QString& label, float value);
lbajardsilogic@16 94 virtual void addInterval(TimeIntervalPtr ti);
lbajardsilogic@16 95
lbajardsilogic@16 96 virtual void removeInterval(TimeIntervalPtr ti);
lbajardsilogic@16 97
lbajardsilogic@16 98 IntervalList& intervals() { return m_intervals; }
lbajardsilogic@16 99
lbajardsilogic@16 100 void changeInterval(TimeIntervalPtr ti, long start, long end, float value, const QString& label);
lbajardsilogic@16 101
lbajardsilogic@253 102 inline float getMeanValue() {return m_meanValue;};
lbajardsilogic@253 103 inline void setMeanValue(float value) {m_meanValue = value;};
lbajardsilogic@16 104 /**
lbajardsilogic@16 105 * Command to change an interval.
lbajardsilogic@16 106 */
lbajardsilogic@16 107 class IntervalCommand : public Command
lbajardsilogic@16 108 {
lbajardsilogic@16 109 public:
lbajardsilogic@16 110
lbajardsilogic@16 111 enum Mode {
lbajardsilogic@16 112 Creation,
lbajardsilogic@16 113 Edition,
lbajardsilogic@16 114 Deletion,
lbajardsilogic@16 115 };
lbajardsilogic@16 116
lbajardsilogic@16 117 IntervalCommand(IntervalModel* model,
lbajardsilogic@16 118 const TimeIntervalPtr& inter,
lbajardsilogic@16 119 Mode mode,
lbajardsilogic@16 120 long newStart,
lbajardsilogic@16 121 long newEnd,
lbajardsilogic@16 122 float newValue,
lbajardsilogic@16 123 const QString& newLabel) :
lbajardsilogic@16 124 m_model(model), m_interval(inter), m_mode(mode)
lbajardsilogic@16 125 {
lbajardsilogic@16 126 m_oldLabel = inter->label();
lbajardsilogic@16 127 m_oldStart = inter->start();
lbajardsilogic@16 128 m_oldEnd = inter->end();
lbajardsilogic@16 129 m_oldValue = inter->value();
lbajardsilogic@16 130 m_newLabel = newLabel;
lbajardsilogic@16 131 m_newStart = newStart;
lbajardsilogic@16 132 m_newEnd = newEnd;
lbajardsilogic@16 133 m_newValue = newValue;
lbajardsilogic@16 134 }
lbajardsilogic@16 135
lbajardsilogic@16 136 virtual QString getName() const { return tr("Edit Interval"); }
lbajardsilogic@16 137
lbajardsilogic@16 138 virtual void execute()
lbajardsilogic@16 139 {
lbajardsilogic@16 140 if (m_mode == Creation)
lbajardsilogic@16 141 {
lbajardsilogic@16 142 m_model->addInterval(m_interval);
lbajardsilogic@16 143 } else if (m_mode == Edition)
lbajardsilogic@16 144 {
lbajardsilogic@16 145 m_model->changeInterval(m_interval, m_newStart, m_newEnd, m_newValue, m_newLabel);
lbajardsilogic@16 146 } else if (m_mode == Deletion)
lbajardsilogic@16 147 {
lbajardsilogic@16 148 m_model->removeInterval(m_interval);
lbajardsilogic@16 149 }
lbajardsilogic@16 150 }
lbajardsilogic@16 151
lbajardsilogic@16 152 virtual void unexecute()
lbajardsilogic@16 153 {
lbajardsilogic@16 154 if (m_mode == Creation)
lbajardsilogic@16 155 {
lbajardsilogic@16 156 m_model->removeInterval(m_interval);
lbajardsilogic@16 157 } else if (m_mode == Edition)
lbajardsilogic@16 158 {
lbajardsilogic@16 159 m_model->changeInterval(m_interval, m_oldStart, m_oldEnd, m_oldValue, m_oldLabel);
lbajardsilogic@16 160 } else if (m_mode == Deletion)
lbajardsilogic@16 161 {
lbajardsilogic@16 162 m_model->addInterval(m_interval);
lbajardsilogic@16 163 }
lbajardsilogic@16 164 }
lbajardsilogic@16 165
lbajardsilogic@16 166 void newStart(long start)
lbajardsilogic@16 167 {
lbajardsilogic@16 168 if (m_newStart != start)
lbajardsilogic@16 169 {
lbajardsilogic@16 170 m_newStart = start;
lbajardsilogic@16 171 m_model->changeInterval(m_interval, m_newStart, m_newEnd, m_newValue, m_newLabel);
lbajardsilogic@16 172 }
lbajardsilogic@16 173 }
lbajardsilogic@16 174
lbajardsilogic@16 175 void newEnd(long end)
lbajardsilogic@16 176 {
lbajardsilogic@16 177 if (m_newEnd != end)
lbajardsilogic@16 178 {
lbajardsilogic@16 179 m_newEnd = end;
lbajardsilogic@16 180 m_model->changeInterval(m_interval, m_newStart, m_newEnd, m_newValue, m_newLabel);
lbajardsilogic@16 181 }
lbajardsilogic@16 182 }
lbajardsilogic@16 183
lbajardsilogic@16 184 void newLabel(QString label)
lbajardsilogic@16 185 {
lbajardsilogic@16 186 if (m_newLabel != label)
lbajardsilogic@16 187 {
lbajardsilogic@16 188 m_newLabel = label;
lbajardsilogic@16 189 m_model->changeInterval(m_interval, m_newStart, m_newEnd, m_newValue, m_newLabel);
lbajardsilogic@16 190 }
lbajardsilogic@16 191 }
lbajardsilogic@16 192
lbajardsilogic@16 193 private:
lbajardsilogic@16 194
lbajardsilogic@16 195 Mode m_mode;
lbajardsilogic@16 196
lbajardsilogic@16 197 IntervalModel* m_model;
lbajardsilogic@16 198 TimeIntervalPtr m_interval;
lbajardsilogic@16 199 QString m_newLabel;
lbajardsilogic@16 200 QString m_oldLabel;
lbajardsilogic@16 201 long m_newStart;
lbajardsilogic@16 202 long m_oldStart;
lbajardsilogic@16 203 long m_newEnd;
lbajardsilogic@16 204 long m_oldEnd;
lbajardsilogic@16 205 float m_newValue;
lbajardsilogic@16 206 float m_oldValue;
lbajardsilogic@16 207 };
lbajardsilogic@16 208
lbajardsilogic@16 209
lbajardsilogic@16 210 private:
lbajardsilogic@16 211
lbajardsilogic@16 212 size_t m_sampleRate;
lbajardsilogic@16 213 size_t m_resolution;
lbajardsilogic@16 214 bool m_notifyOnAdd;
lbajardsilogic@16 215
lbajardsilogic@16 216 IntervalList m_intervals;
lbajardsilogic@16 217 mutable QMutex m_mutex;
lbajardsilogic@16 218
lbajardsilogic@253 219 float m_meanValue;
lbajardsilogic@253 220
lbajardsilogic@16 221 };
lbajardsilogic@16 222
lbajardsilogic@16 223 #endif // _INTERVAL_MODEL_H_