annotate data/model/TextModel.h @ 316:3a6725f285d6

* Make RemoteFile far more pervasive, and use it for local files as well so that we can handle both transparently. Make it shallow copy with reference counting, so it can be used by value without having to worry about the cache file lifetime. Use RemoteFile for MainWindow file-open functions, etc
author Chris Cannam
date Thu, 18 Oct 2007 15:31:20 +0000
parents 70a232b1f12a
children 7a4bd2c8585c
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@147 55 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