annotate data/model/IntervalModel.h @ 150:c946c19e6329

(none)
author ivand_qmul
date Wed, 14 Nov 2007 15:11:46 +0000
parents a8dcc1ca82c4
children 82d17c4d4b39
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@16 102 /**
lbajardsilogic@16 103 * Command to change an interval.
lbajardsilogic@16 104 */
lbajardsilogic@16 105 class IntervalCommand : public Command
lbajardsilogic@16 106 {
lbajardsilogic@16 107 public:
lbajardsilogic@16 108
lbajardsilogic@16 109 enum Mode {
lbajardsilogic@16 110 Creation,
lbajardsilogic@16 111 Edition,
lbajardsilogic@16 112 Deletion,
lbajardsilogic@16 113 };
lbajardsilogic@16 114
lbajardsilogic@16 115 IntervalCommand(IntervalModel* model,
lbajardsilogic@16 116 const TimeIntervalPtr& inter,
lbajardsilogic@16 117 Mode mode,
lbajardsilogic@16 118 long newStart,
lbajardsilogic@16 119 long newEnd,
lbajardsilogic@16 120 float newValue,
lbajardsilogic@16 121 const QString& newLabel) :
lbajardsilogic@16 122 m_model(model), m_interval(inter), m_mode(mode)
lbajardsilogic@16 123 {
lbajardsilogic@16 124 m_oldLabel = inter->label();
lbajardsilogic@16 125 m_oldStart = inter->start();
lbajardsilogic@16 126 m_oldEnd = inter->end();
lbajardsilogic@16 127 m_oldValue = inter->value();
lbajardsilogic@16 128 m_newLabel = newLabel;
lbajardsilogic@16 129 m_newStart = newStart;
lbajardsilogic@16 130 m_newEnd = newEnd;
lbajardsilogic@16 131 m_newValue = newValue;
lbajardsilogic@16 132 }
lbajardsilogic@16 133
lbajardsilogic@16 134 virtual QString getName() const { return tr("Edit Interval"); }
lbajardsilogic@16 135
lbajardsilogic@16 136 virtual void execute()
lbajardsilogic@16 137 {
lbajardsilogic@16 138 if (m_mode == Creation)
lbajardsilogic@16 139 {
lbajardsilogic@16 140 m_model->addInterval(m_interval);
lbajardsilogic@16 141 } else if (m_mode == Edition)
lbajardsilogic@16 142 {
lbajardsilogic@16 143 m_model->changeInterval(m_interval, m_newStart, m_newEnd, m_newValue, m_newLabel);
lbajardsilogic@16 144 } else if (m_mode == Deletion)
lbajardsilogic@16 145 {
lbajardsilogic@16 146 m_model->removeInterval(m_interval);
lbajardsilogic@16 147 }
lbajardsilogic@16 148 }
lbajardsilogic@16 149
lbajardsilogic@16 150 virtual void unexecute()
lbajardsilogic@16 151 {
lbajardsilogic@16 152 if (m_mode == Creation)
lbajardsilogic@16 153 {
lbajardsilogic@16 154 m_model->removeInterval(m_interval);
lbajardsilogic@16 155 } else if (m_mode == Edition)
lbajardsilogic@16 156 {
lbajardsilogic@16 157 m_model->changeInterval(m_interval, m_oldStart, m_oldEnd, m_oldValue, m_oldLabel);
lbajardsilogic@16 158 } else if (m_mode == Deletion)
lbajardsilogic@16 159 {
lbajardsilogic@16 160 m_model->addInterval(m_interval);
lbajardsilogic@16 161 }
lbajardsilogic@16 162 }
lbajardsilogic@16 163
lbajardsilogic@16 164 void newStart(long start)
lbajardsilogic@16 165 {
lbajardsilogic@16 166 if (m_newStart != start)
lbajardsilogic@16 167 {
lbajardsilogic@16 168 m_newStart = start;
lbajardsilogic@16 169 m_model->changeInterval(m_interval, m_newStart, m_newEnd, m_newValue, m_newLabel);
lbajardsilogic@16 170 }
lbajardsilogic@16 171 }
lbajardsilogic@16 172
lbajardsilogic@16 173 void newEnd(long end)
lbajardsilogic@16 174 {
lbajardsilogic@16 175 if (m_newEnd != end)
lbajardsilogic@16 176 {
lbajardsilogic@16 177 m_newEnd = end;
lbajardsilogic@16 178 m_model->changeInterval(m_interval, m_newStart, m_newEnd, m_newValue, m_newLabel);
lbajardsilogic@16 179 }
lbajardsilogic@16 180 }
lbajardsilogic@16 181
lbajardsilogic@16 182 void newLabel(QString label)
lbajardsilogic@16 183 {
lbajardsilogic@16 184 if (m_newLabel != label)
lbajardsilogic@16 185 {
lbajardsilogic@16 186 m_newLabel = label;
lbajardsilogic@16 187 m_model->changeInterval(m_interval, m_newStart, m_newEnd, m_newValue, m_newLabel);
lbajardsilogic@16 188 }
lbajardsilogic@16 189 }
lbajardsilogic@16 190
lbajardsilogic@16 191 private:
lbajardsilogic@16 192
lbajardsilogic@16 193 Mode m_mode;
lbajardsilogic@16 194
lbajardsilogic@16 195 IntervalModel* m_model;
lbajardsilogic@16 196 TimeIntervalPtr m_interval;
lbajardsilogic@16 197 QString m_newLabel;
lbajardsilogic@16 198 QString m_oldLabel;
lbajardsilogic@16 199 long m_newStart;
lbajardsilogic@16 200 long m_oldStart;
lbajardsilogic@16 201 long m_newEnd;
lbajardsilogic@16 202 long m_oldEnd;
lbajardsilogic@16 203 float m_newValue;
lbajardsilogic@16 204 float m_oldValue;
lbajardsilogic@16 205 };
lbajardsilogic@16 206
lbajardsilogic@16 207
lbajardsilogic@16 208 private:
lbajardsilogic@16 209
lbajardsilogic@16 210 size_t m_sampleRate;
lbajardsilogic@16 211 size_t m_resolution;
lbajardsilogic@16 212 bool m_notifyOnAdd;
lbajardsilogic@16 213
lbajardsilogic@16 214 IntervalList m_intervals;
lbajardsilogic@16 215 mutable QMutex m_mutex;
lbajardsilogic@16 216
lbajardsilogic@16 217 };
lbajardsilogic@16 218
lbajardsilogic@16 219 #endif // _INTERVAL_MODEL_H_