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_
|