annotate data/model/TextModel.h @ 392:183ee2a55fc7

* More work to abstract out interactive components used in the data library, so that it does not need to depend on QtGui.
author Chris Cannam
date Fri, 14 Mar 2008 17:14:21 +0000
parents 700cd3350391
children 6a96bff0bd59
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@338 41
Chris@338 42 QString getLabel() const { return label; }
Chris@147 43
Chris@314 44 void toXml(QTextStream &stream, QString indent = "",
Chris@314 45 QString extraAttributes = "") const
Chris@147 46 {
Chris@314 47 stream << QString("%1<point frame=\"%2\" height=\"%3\" label=\"%4\" %5/>\n")
Chris@302 48 .arg(indent).arg(frame).arg(height)
Chris@302 49 .arg(encodeEntities(label)).arg(extraAttributes);
Chris@147 50 }
Chris@147 51
Chris@147 52 QString toDelimitedDataString(QString delimiter, size_t sampleRate) const
Chris@147 53 {
Chris@147 54 QStringList list;
Chris@147 55 list << RealTime::frame2RealTime(frame, sampleRate).toString().c_str();
Chris@147 56 list << QString("%1").arg(height);
Chris@318 57 if (label != "") list << label;
Chris@147 58 return list.join(delimiter);
Chris@147 59 }
Chris@147 60
Chris@147 61 struct Comparator {
Chris@147 62 bool operator()(const TextPoint &p1,
Chris@147 63 const TextPoint &p2) const {
Chris@147 64 if (p1.frame != p2.frame) return p1.frame < p2.frame;
Chris@147 65 if (p1.height != p2.height) return p1.height < p2.height;
Chris@147 66 return p1.label < p2.label;
Chris@147 67 }
Chris@147 68 };
Chris@147 69
Chris@147 70 struct OrderComparator {
Chris@147 71 bool operator()(const TextPoint &p1,
Chris@147 72 const TextPoint &p2) const {
Chris@147 73 return p1.frame < p2.frame;
Chris@147 74 }
Chris@147 75 };
Chris@147 76 };
Chris@147 77
Chris@147 78
Chris@147 79 // Make this a class rather than a typedef so it can be predeclared.
Chris@147 80
Chris@147 81 class TextModel : public SparseModel<TextPoint>
Chris@147 82 {
Chris@147 83 public:
Chris@147 84 TextModel(size_t sampleRate, size_t resolution, bool notifyOnAdd = true) :
Chris@147 85 SparseModel<TextPoint>(sampleRate, resolution, notifyOnAdd)
Chris@147 86 { }
Chris@147 87
Chris@288 88 virtual void toXml(QTextStream &out,
Chris@288 89 QString indent = "",
Chris@288 90 QString extraAttributes = "") const
Chris@147 91 {
Chris@288 92 SparseModel<TextPoint>::toXml
Chris@288 93 (out,
Chris@288 94 indent,
Chris@147 95 QString("%1 subtype=\"text\"")
Chris@147 96 .arg(extraAttributes));
Chris@147 97 }
Chris@345 98
Chris@345 99 QString getTypeName() const { return tr("Text"); }
Chris@147 100 };
Chris@147 101
Chris@147 102
Chris@147 103 #endif
Chris@147 104
Chris@147 105
Chris@147 106