annotate data/model/TextModel.h @ 319:3ff8f571da09

* Hoist alignment model set/query up to Model, so any models can be aligned * Add Model::aboutToDelete and aboutToBeDeleted for management of models that are contained by or referred to by other models instead of only the document
author Chris Cannam
date Wed, 24 Oct 2007 15:21:38 +0000
parents 7a4bd2c8585c
children f14e2f7b24f7 6f6ab834449d
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@302 20 #include "base/XmlExportable.h"
Chris@147 21 #include "base/RealTime.h"
Chris@147 22
Chris@147 23 /**
Chris@147 24 * Text point type for use in a SparseModel. This represents a piece
Chris@147 25 * of text at a given time and y-value in the [0,1) range (indicative
Chris@147 26 * of height on the window). Intended for casual textual annotations.
Chris@147 27 */
Chris@147 28
Chris@302 29 struct TextPoint : public XmlExportable
Chris@147 30 {
Chris@147 31 public:
Chris@147 32 TextPoint(long _frame) : frame(_frame), height(0.0f) { }
Chris@147 33 TextPoint(long _frame, float _height, QString _label) :
Chris@147 34 frame(_frame), height(_height), label(_label) { }
Chris@147 35
Chris@147 36 int getDimensions() const { return 2; }
Chris@147 37
Chris@147 38 long frame;
Chris@147 39 float height;
Chris@147 40 QString label;
Chris@147 41
Chris@314 42 void toXml(QTextStream &stream, QString indent = "",
Chris@314 43 QString extraAttributes = "") const
Chris@147 44 {
Chris@314 45 stream << QString("%1<point frame=\"%2\" height=\"%3\" label=\"%4\" %5/>\n")
Chris@302 46 .arg(indent).arg(frame).arg(height)
Chris@302 47 .arg(encodeEntities(label)).arg(extraAttributes);
Chris@147 48 }
Chris@147 49
Chris@147 50 QString toDelimitedDataString(QString delimiter, size_t sampleRate) const
Chris@147 51 {
Chris@147 52 QStringList list;
Chris@147 53 list << RealTime::frame2RealTime(frame, sampleRate).toString().c_str();
Chris@147 54 list << QString("%1").arg(height);
Chris@318 55 if (label != "") list << label;
Chris@147 56 return list.join(delimiter);
Chris@147 57 }
Chris@147 58
Chris@147 59 struct Comparator {
Chris@147 60 bool operator()(const TextPoint &p1,
Chris@147 61 const TextPoint &p2) const {
Chris@147 62 if (p1.frame != p2.frame) return p1.frame < p2.frame;
Chris@147 63 if (p1.height != p2.height) return p1.height < p2.height;
Chris@147 64 return p1.label < p2.label;
Chris@147 65 }
Chris@147 66 };
Chris@147 67
Chris@147 68 struct OrderComparator {
Chris@147 69 bool operator()(const TextPoint &p1,
Chris@147 70 const TextPoint &p2) const {
Chris@147 71 return p1.frame < p2.frame;
Chris@147 72 }
Chris@147 73 };
Chris@147 74 };
Chris@147 75
Chris@147 76
Chris@147 77 // Make this a class rather than a typedef so it can be predeclared.
Chris@147 78
Chris@147 79 class TextModel : public SparseModel<TextPoint>
Chris@147 80 {
Chris@147 81 public:
Chris@147 82 TextModel(size_t sampleRate, size_t resolution, bool notifyOnAdd = true) :
Chris@147 83 SparseModel<TextPoint>(sampleRate, resolution, notifyOnAdd)
Chris@147 84 { }
Chris@147 85
Chris@288 86 virtual void toXml(QTextStream &out,
Chris@288 87 QString indent = "",
Chris@288 88 QString extraAttributes = "") const
Chris@147 89 {
Chris@288 90 SparseModel<TextPoint>::toXml
Chris@288 91 (out,
Chris@288 92 indent,
Chris@147 93 QString("%1 subtype=\"text\"")
Chris@147 94 .arg(extraAttributes));
Chris@147 95 }
Chris@147 96 };
Chris@147 97
Chris@147 98
Chris@147 99 #endif
Chris@147 100
Chris@147 101
Chris@147 102