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