annotate data/model/TextModel.h @ 299:576be0d0d218

* Merge transform directory from sv-match-alignment branch (the previous comment included notes for this stuff, but I missed it in the actual merge) * Fix crash when a transform fails to create an output model and the thread that created the transform then deletes its input model thinking it's no longer needed, even though the transform run thread is still using it -- fix is to wait() on the transform before returning the null output model
author Chris Cannam
date Fri, 28 Sep 2007 16:15:06 +0000
parents 7b96b3bd4bae
children 726b32522e3f
rev   line source
Chris@147 1 /* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
Chris@147 2
Chris@147 3 /*
Chris@147 4 Sonic Visualiser
Chris@147 5 An audio file viewer and annotation editor.
Chris@147 6 Centre for Digital Music, Queen Mary, University of London.
Chris@147 7 This file copyright 2006 Chris Cannam.
Chris@147 8
Chris@147 9 This program is free software; you can redistribute it and/or
Chris@147 10 modify it under the terms of the GNU General Public License as
Chris@147 11 published by the Free Software Foundation; either version 2 of the
Chris@147 12 License, or (at your option) any later version. See the file
Chris@147 13 COPYING included with this distribution for more information.
Chris@147 14 */
Chris@147 15
Chris@147 16 #ifndef _TEXT_MODEL_H_
Chris@147 17 #define _TEXT_MODEL_H_
Chris@147 18
Chris@147 19 #include "SparseModel.h"
Chris@147 20 #include "base/RealTime.h"
Chris@147 21
Chris@147 22 /**
Chris@147 23 * Text point type for use in a SparseModel. This represents a piece
Chris@147 24 * of text at a given time and y-value in the [0,1) range (indicative
Chris@147 25 * of height on the window). Intended for casual textual annotations.
Chris@147 26 */
Chris@147 27
Chris@147 28 struct TextPoint
Chris@147 29 {
Chris@147 30 public:
Chris@147 31 TextPoint(long _frame) : frame(_frame), height(0.0f) { }
Chris@147 32 TextPoint(long _frame, float _height, QString _label) :
Chris@147 33 frame(_frame), height(_height), label(_label) { }
Chris@147 34
Chris@147 35 int getDimensions() const { return 2; }
Chris@147 36
Chris@147 37 long frame;
Chris@147 38 float height;
Chris@147 39 QString label;
Chris@147 40
Chris@147 41 QString toXmlString(QString indent = "",
Chris@147 42 QString extraAttributes = "") const
Chris@147 43 {
Chris@147 44 return QString("%1<point frame=\"%2\" height=\"%3\" label=\"%4\" %5/>\n")
Chris@147 45 .arg(indent).arg(frame).arg(height).arg(label).arg(extraAttributes);
Chris@147 46 }
Chris@147 47
Chris@147 48 QString toDelimitedDataString(QString delimiter, size_t sampleRate) const
Chris@147 49 {
Chris@147 50 QStringList list;
Chris@147 51 list << RealTime::frame2RealTime(frame, sampleRate).toString().c_str();
Chris@147 52 list << QString("%1").arg(height);
Chris@147 53 list << label;
Chris@147 54 return list.join(delimiter);
Chris@147 55 }
Chris@147 56
Chris@147 57 struct Comparator {
Chris@147 58 bool operator()(const TextPoint &p1,
Chris@147 59 const TextPoint &p2) const {
Chris@147 60 if (p1.frame != p2.frame) return p1.frame < p2.frame;
Chris@147 61 if (p1.height != p2.height) return p1.height < p2.height;
Chris@147 62 return p1.label < p2.label;
Chris@147 63 }
Chris@147 64 };
Chris@147 65
Chris@147 66 struct OrderComparator {
Chris@147 67 bool operator()(const TextPoint &p1,
Chris@147 68 const TextPoint &p2) const {
Chris@147 69 return p1.frame < p2.frame;
Chris@147 70 }
Chris@147 71 };
Chris@147 72 };
Chris@147 73
Chris@147 74
Chris@147 75 // Make this a class rather than a typedef so it can be predeclared.
Chris@147 76
Chris@147 77 class TextModel : public SparseModel<TextPoint>
Chris@147 78 {
Chris@147 79 public:
Chris@147 80 TextModel(size_t sampleRate, size_t resolution, bool notifyOnAdd = true) :
Chris@147 81 SparseModel<TextPoint>(sampleRate, resolution, notifyOnAdd)
Chris@147 82 { }
Chris@147 83
Chris@288 84 virtual void toXml(QTextStream &out,
Chris@288 85 QString indent = "",
Chris@288 86 QString extraAttributes = "") const
Chris@147 87 {
Chris@288 88 SparseModel<TextPoint>::toXml
Chris@288 89 (out,
Chris@288 90 indent,
Chris@147 91 QString("%1 subtype=\"text\"")
Chris@147 92 .arg(extraAttributes));
Chris@147 93 }
Chris@147 94 };
Chris@147 95
Chris@147 96
Chris@147 97 #endif
Chris@147 98
Chris@147 99
Chris@147 100