Mercurial > hg > svcore
comparison data/model/SparseModel.h @ 1599:ce185d4dd408 bqaudiostream
Merge from default branch
author | Chris Cannam |
---|---|
date | Wed, 23 Jan 2019 14:43:43 +0000 |
parents | c01cbe41aeb5 |
children | 0e0947896fd3 |
comparison
equal
deleted
inserted
replaced
1598:d2555df635ec | 1599:ce185d4dd408 |
---|---|
53 public: | 53 public: |
54 SparseModel(sv_samplerate_t sampleRate, int resolution, | 54 SparseModel(sv_samplerate_t sampleRate, int resolution, |
55 bool notifyOnAdd = true); | 55 bool notifyOnAdd = true); |
56 virtual ~SparseModel() { } | 56 virtual ~SparseModel() { } |
57 | 57 |
58 virtual bool isOK() const { return true; } | 58 bool isOK() const override { return true; } |
59 virtual sv_frame_t getStartFrame() const; | 59 virtual sv_frame_t getStartFrame() const; |
60 virtual sv_frame_t getEndFrame() const; | 60 virtual sv_frame_t getEndFrame() const; |
61 virtual sv_samplerate_t getSampleRate() const { return m_sampleRate; } | 61 sv_samplerate_t getSampleRate() const override { return m_sampleRate; } |
62 | 62 |
63 // Number of frames of the underlying sample rate that this model | 63 // Number of frames of the underlying sample rate that this model |
64 // is capable of resolving to. For example, if m_resolution == 10 | 64 // is capable of resolving to. For example, if m_resolution == 10 |
65 // then every point in this model will be at a multiple of 10 | 65 // then every point in this model will be at a multiple of 10 |
66 // sample frames and should be considered to cover a window ending | 66 // sample frames and should be considered to cover a window ending |
145 * Return true if the given point is found in this model, false | 145 * Return true if the given point is found in this model, false |
146 * otherwise. | 146 * otherwise. |
147 */ | 147 */ |
148 virtual bool containsPoint(const PointType &point); | 148 virtual bool containsPoint(const PointType &point); |
149 | 149 |
150 virtual bool isReady(int *completion = 0) const { | 150 bool isReady(int *completion = 0) const override { |
151 bool ready = isOK() && (m_completion == 100); | 151 bool ready = isOK() && (m_completion == 100); |
152 if (completion) *completion = m_completion; | 152 if (completion) *completion = m_completion; |
153 return ready; | 153 return ready; |
154 } | 154 } |
155 | 155 |
156 virtual void setCompletion(int completion, bool update = true); | 156 virtual void setCompletion(int completion, bool update = true); |
157 virtual int getCompletion() const { return m_completion; } | 157 virtual int getCompletion() const { return m_completion; } |
158 | 158 |
159 virtual bool hasTextLabels() const { return m_hasTextLabels; } | 159 virtual bool hasTextLabels() const { return m_hasTextLabels; } |
160 | 160 |
161 virtual bool isSparse() const { return true; } | 161 bool isSparse() const override { return true; } |
162 | 162 |
163 QString getTypeName() const { return tr("Sparse"); } | 163 QString getTypeName() const override { return tr("Sparse"); } |
164 | 164 |
165 virtual QString getXmlOutputType() const { return "sparse"; } | 165 virtual QString getXmlOutputType() const { return "sparse"; } |
166 | 166 |
167 virtual void toXml(QTextStream &out, | 167 virtual void toXml(QTextStream &out, |
168 QString indent = "", | 168 QString indent = "", |
169 QString extraAttributes = "") const; | 169 QString extraAttributes = "") const; |
170 | 170 |
171 virtual QString toDelimitedDataString(QString delimiter) const { | 171 QString toDelimitedDataString(QString delimiter) const override { |
172 return toDelimitedDataStringWithOptions | 172 return toDelimitedDataStringWithOptions |
173 (delimiter, DataExportDefaults); | 173 (delimiter, DataExportDefaults); |
174 } | 174 } |
175 | 175 |
176 virtual QString toDelimitedDataStringWithOptions(QString delimiter, | 176 QString toDelimitedDataStringWithOptions(QString delimiter, |
177 DataExportOptions opts) const { | 177 DataExportOptions opts) const override { |
178 return toDelimitedDataStringSubsetWithOptions | 178 return toDelimitedDataStringSubsetWithOptions |
179 (delimiter, opts, | 179 (delimiter, opts, |
180 std::min(getStartFrame(), sv_frame_t(0)), getEndFrame()); | 180 std::min(getStartFrame(), sv_frame_t(0)), getEndFrame()); |
181 } | 181 } |
182 | 182 |
183 virtual QString toDelimitedDataStringSubset(QString delimiter, sv_frame_t f0, sv_frame_t f1) const { | 183 QString toDelimitedDataStringSubset(QString delimiter, sv_frame_t f0, sv_frame_t f1) const override { |
184 return toDelimitedDataStringSubsetWithOptions | 184 return toDelimitedDataStringSubsetWithOptions |
185 (delimiter, DataExportDefaults, f0, f1); | 185 (delimiter, DataExportDefaults, f0, f1); |
186 } | 186 } |
187 | 187 |
188 virtual QString toDelimitedDataStringSubsetWithOptions(QString delimiter, DataExportOptions opts, sv_frame_t f0, sv_frame_t f1) const { | 188 QString toDelimitedDataStringSubsetWithOptions(QString delimiter, DataExportOptions opts, sv_frame_t f0, sv_frame_t f1) const override { |
189 if (opts & DataExportFillGaps) { | 189 if (opts & DataExportFillGaps) { |
190 return toDelimitedDataStringSubsetFilled(delimiter, opts, f0, f1); | 190 return toDelimitedDataStringSubsetFilled(delimiter, opts, f0, f1); |
191 } else { | 191 } else { |
192 QString s; | 192 QString s; |
193 for (PointListConstIterator i = m_points.begin(); i != m_points.end(); ++i) { | 193 for (PointListConstIterator i = m_points.begin(); i != m_points.end(); ++i) { |
208 AddPointCommand(SparseModel<PointType> *model, | 208 AddPointCommand(SparseModel<PointType> *model, |
209 const PointType &point, | 209 const PointType &point, |
210 QString name = "") : | 210 QString name = "") : |
211 m_model(model), m_point(point), m_name(name) { } | 211 m_model(model), m_point(point), m_name(name) { } |
212 | 212 |
213 virtual QString getName() const { | 213 QString getName() const override { |
214 return (m_name == "" ? tr("Add Point") : m_name); | 214 return (m_name == "" ? tr("Add Point") : m_name); |
215 } | 215 } |
216 | 216 |
217 virtual void execute() { m_model->addPoint(m_point); } | 217 void execute() override { m_model->addPoint(m_point); } |
218 virtual void unexecute() { m_model->deletePoint(m_point); } | 218 void unexecute() override { m_model->deletePoint(m_point); } |
219 | 219 |
220 const PointType &getPoint() const { return m_point; } | 220 const PointType &getPoint() const { return m_point; } |
221 | 221 |
222 private: | 222 private: |
223 SparseModel<PointType> *m_model; | 223 SparseModel<PointType> *m_model; |
234 public: | 234 public: |
235 DeletePointCommand(SparseModel<PointType> *model, | 235 DeletePointCommand(SparseModel<PointType> *model, |
236 const PointType &point) : | 236 const PointType &point) : |
237 m_model(model), m_point(point) { } | 237 m_model(model), m_point(point) { } |
238 | 238 |
239 virtual QString getName() const { return tr("Delete Point"); } | 239 QString getName() const override { return tr("Delete Point"); } |
240 | 240 |
241 virtual void execute() { m_model->deletePoint(m_point); } | 241 void execute() override { m_model->deletePoint(m_point); } |
242 virtual void unexecute() { m_model->addPoint(m_point); } | 242 void unexecute() override { m_model->addPoint(m_point); } |
243 | 243 |
244 const PointType &getPoint() const { return m_point; } | 244 const PointType &getPoint() const { return m_point; } |
245 | 245 |
246 private: | 246 private: |
247 SparseModel<PointType> *m_model; | 247 SparseModel<PointType> *m_model; |
262 virtual void deletePoint(const PointType &point); | 262 virtual void deletePoint(const PointType &point); |
263 | 263 |
264 /** | 264 /** |
265 * Stack an arbitrary other command in the same sequence. | 265 * Stack an arbitrary other command in the same sequence. |
266 */ | 266 */ |
267 virtual void addCommand(Command *command) { addCommand(command, true); } | 267 void addCommand(Command *command) override { addCommand(command, true); } |
268 | 268 |
269 /** | 269 /** |
270 * If any points have been added or deleted, return this | 270 * If any points have been added or deleted, return this |
271 * command (so the caller can add it to the command history). | 271 * command (so the caller can add it to the command history). |
272 * Otherwise delete the command and return NULL. | 272 * Otherwise delete the command and return NULL. |
291 QString newLabel) : | 291 QString newLabel) : |
292 m_model(model), m_oldPoint(point), m_newPoint(point) { | 292 m_model(model), m_oldPoint(point), m_newPoint(point) { |
293 m_newPoint.label = newLabel; | 293 m_newPoint.label = newLabel; |
294 } | 294 } |
295 | 295 |
296 virtual QString getName() const { return tr("Re-Label Point"); } | 296 QString getName() const override { return tr("Re-Label Point"); } |
297 | 297 |
298 virtual void execute() { | 298 void execute() override { |
299 m_model->deletePoint(m_oldPoint); | 299 m_model->deletePoint(m_oldPoint); |
300 m_model->addPoint(m_newPoint); | 300 m_model->addPoint(m_newPoint); |
301 std::swap(m_oldPoint, m_newPoint); | 301 std::swap(m_oldPoint, m_newPoint); |
302 } | 302 } |
303 | 303 |
304 virtual void unexecute() { execute(); } | 304 void unexecute() override { execute(); } |
305 | 305 |
306 private: | 306 private: |
307 SparseModel<PointType> *m_model; | 307 SparseModel<PointType> *m_model; |
308 PointType m_oldPoint; | 308 PointType m_oldPoint; |
309 PointType m_newPoint; | 309 PointType m_newPoint; |
311 | 311 |
312 /** | 312 /** |
313 * TabularModel methods. | 313 * TabularModel methods. |
314 */ | 314 */ |
315 | 315 |
316 virtual int getRowCount() const | 316 int getRowCount() const override |
317 { | 317 { |
318 return int(m_points.size()); | 318 return int(m_points.size()); |
319 } | 319 } |
320 | 320 |
321 virtual sv_frame_t getFrameForRow(int row) const | 321 sv_frame_t getFrameForRow(int row) const override |
322 { | 322 { |
323 PointListConstIterator i = getPointListIteratorForRow(row); | 323 PointListConstIterator i = getPointListIteratorForRow(row); |
324 if (i == m_points.end()) return 0; | 324 if (i == m_points.end()) return 0; |
325 return i->frame; | 325 return i->frame; |
326 } | 326 } |
327 | 327 |
328 virtual int getRowForFrame(sv_frame_t frame) const | 328 int getRowForFrame(sv_frame_t frame) const override |
329 { | 329 { |
330 if (m_rows.empty()) rebuildRowVector(); | 330 if (m_rows.empty()) rebuildRowVector(); |
331 std::vector<sv_frame_t>::iterator i = | 331 std::vector<sv_frame_t>::iterator i = |
332 std::lower_bound(m_rows.begin(), m_rows.end(), frame); | 332 std::lower_bound(m_rows.begin(), m_rows.end(), frame); |
333 ssize_t row = std::distance(m_rows.begin(), i); | 333 ssize_t row = std::distance(m_rows.begin(), i); |
335 --row; | 335 --row; |
336 } | 336 } |
337 return int(row); | 337 return int(row); |
338 } | 338 } |
339 | 339 |
340 virtual int getColumnCount() const { return 1; } | 340 int getColumnCount() const override { return 1; } |
341 virtual QVariant getData(int row, int column, int role) const | 341 QVariant getData(int row, int column, int role) const override |
342 { | 342 { |
343 PointListConstIterator i = getPointListIteratorForRow(row); | 343 PointListConstIterator i = getPointListIteratorForRow(row); |
344 if (i == m_points.end()) { | 344 if (i == m_points.end()) { |
345 // cerr << "no iterator for row " << row << " (have " << getRowCount() << " rows)" << endl; | 345 // cerr << "no iterator for row " << row << " (have " << getRowCount() << " rows)" << endl; |
346 return QVariant(); | 346 return QVariant(); |
359 } | 359 } |
360 | 360 |
361 return QVariant(); | 361 return QVariant(); |
362 } | 362 } |
363 | 363 |
364 virtual Command *getSetDataCommand(int row, int column, | 364 Command *getSetDataCommand(int row, int column, |
365 const QVariant &value, int role) | 365 const QVariant &value, int role) override |
366 { | 366 { |
367 if (role != Qt::EditRole) return 0; | 367 if (role != Qt::EditRole) return 0; |
368 PointListIterator i = getPointListIteratorForRow(row); | 368 PointListIterator i = getPointListIteratorForRow(row); |
369 if (i == m_points.end()) return 0; | 369 if (i == m_points.end()) return 0; |
370 EditCommand *command = new EditCommand(this, tr("Edit Data")); | 370 EditCommand *command = new EditCommand(this, tr("Edit Data")); |
379 | 379 |
380 command->addPoint(point); | 380 command->addPoint(point); |
381 return command->finish(); | 381 return command->finish(); |
382 } | 382 } |
383 | 383 |
384 virtual Command *getInsertRowCommand(int row) | 384 Command *getInsertRowCommand(int row) override |
385 { | 385 { |
386 EditCommand *command = new EditCommand(this, tr("Insert Data Point")); | 386 EditCommand *command = new EditCommand(this, tr("Insert Data Point")); |
387 Point point(0); | 387 Point point(0); |
388 PointListIterator i = getPointListIteratorForRow(row); | 388 PointListIterator i = getPointListIteratorForRow(row); |
389 if (i == m_points.end() && i != m_points.begin()) --i; | 389 if (i == m_points.end() && i != m_points.begin()) --i; |
390 if (i != m_points.end()) point = *i; | 390 if (i != m_points.end()) point = *i; |
391 command->addPoint(point); | 391 command->addPoint(point); |
392 return command->finish(); | 392 return command->finish(); |
393 } | 393 } |
394 | 394 |
395 virtual Command *getRemoveRowCommand(int row) | 395 Command *getRemoveRowCommand(int row) override |
396 { | 396 { |
397 PointListIterator i = getPointListIteratorForRow(row); | 397 PointListIterator i = getPointListIteratorForRow(row); |
398 if (i == m_points.end()) return 0; | 398 if (i == m_points.end()) return 0; |
399 EditCommand *command = new EditCommand(this, tr("Delete Data Point")); | 399 EditCommand *command = new EditCommand(this, tr("Delete Data Point")); |
400 command->deletePoint(*i); | 400 command->deletePoint(*i); |