lbajardsilogic@16: /* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ lbajardsilogic@16: lbajardsilogic@16: /* lbajardsilogic@16: Sound Access lbajardsilogic@16: EASAIER client application. lbajardsilogic@16: Silogic 2007. Luc Barthélémy. lbajardsilogic@16: lbajardsilogic@16: This program is free software; you can redistribute it and/or lbajardsilogic@16: modify it under the terms of the GNU General Public License as lbajardsilogic@16: published by the Free Software Foundation; either version 2 of the lbajardsilogic@16: License, or (at your option) any later version. See the file lbajardsilogic@16: COPYING included with this distribution for more information. lbajardsilogic@16: */ lbajardsilogic@16: lbajardsilogic@16: #ifndef _INTERVAL_MODEL_H_ lbajardsilogic@16: #define _INTERVAL_MODEL_H_ lbajardsilogic@16: lbajardsilogic@16: #include lbajardsilogic@16: lbajardsilogic@16: #include "Model.h" lbajardsilogic@16: #include "base/RealTime.h" lbajardsilogic@16: #include "base/Command.h" lbajardsilogic@16: #include "base/CommandHistory.h" lbajardsilogic@16: lbajardsilogic@16: /** lbajardsilogic@16: * TimeInterval SparseValueModel lbajardsilogic@16: */ lbajardsilogic@16: lbajardsilogic@16: class TimeInterval lbajardsilogic@16: { lbajardsilogic@16: public: lbajardsilogic@16: lbajardsilogic@16: TimeInterval(long start = 0, long end = 0, float value = 0.0f); lbajardsilogic@16: TimeInterval(long start, long end, const QString& label, float value = 0.0f); lbajardsilogic@16: virtual ~TimeInterval(); lbajardsilogic@16: lbajardsilogic@16: QString toXmlString(QString indent = "", QString extraAttributes = "") const; lbajardsilogic@16: QString toDelimitedDataString(const QString& delimiter, size_t sampleRate) const; lbajardsilogic@16: lbajardsilogic@16: long start() const {return m_start;} lbajardsilogic@16: long end() const {return m_end;} lbajardsilogic@16: float value() const {return m_value;} lbajardsilogic@16: const QString& label() const { return m_label; } lbajardsilogic@16: lbajardsilogic@16: void start(long start) { m_start = start;} lbajardsilogic@16: void end(long end) { m_end = end;} lbajardsilogic@16: void label(const QString& label) { m_label = label;} lbajardsilogic@16: void value(float val) { m_value = val;} lbajardsilogic@16: lbajardsilogic@16: private: lbajardsilogic@16: lbajardsilogic@16: long m_start; lbajardsilogic@16: long m_end; lbajardsilogic@16: float m_value; lbajardsilogic@16: lbajardsilogic@16: QString m_label; lbajardsilogic@16: }; lbajardsilogic@16: lbajardsilogic@16: typedef TimeInterval* TimeIntervalPtr; lbajardsilogic@16: lbajardsilogic@16: typedef std::list IntervalList; lbajardsilogic@16: typedef IntervalList::iterator IntervalListIterator; lbajardsilogic@16: typedef IntervalList::const_iterator IntervalListConstIterator; lbajardsilogic@16: lbajardsilogic@16: /** lbajardsilogic@16: * IntervalModel lbajardsilogic@16: */ lbajardsilogic@16: lbajardsilogic@16: class IntervalModel : public Model lbajardsilogic@16: { lbajardsilogic@16: public: lbajardsilogic@16: lbajardsilogic@16: IntervalModel(size_t sampleRate, size_t resolution, lbajardsilogic@16: bool notifyOnAdd = true); lbajardsilogic@16: ~IntervalModel(); lbajardsilogic@16: lbajardsilogic@16: lbajardsilogic@16: virtual bool isOK() const { return true; } lbajardsilogic@16: virtual size_t getStartFrame() const; lbajardsilogic@16: virtual size_t getEndFrame() const; lbajardsilogic@16: lbajardsilogic@16: virtual size_t getSampleRate() const { return m_sampleRate; } lbajardsilogic@16: virtual size_t getResolution() const { return m_resolution; } lbajardsilogic@16: lbajardsilogic@16: virtual Model *clone() const; lbajardsilogic@16: lbajardsilogic@48: virtual void toXml(QTextStream &out, lbajardsilogic@48: QString indent = "", lbajardsilogic@48: QString extraAttributes = "") const; lbajardsilogic@16: virtual QString toXmlString(QString indent = "", QString extraAttributes = "") const; lbajardsilogic@16: virtual QString toDelimitedDataString(QString) const; lbajardsilogic@16: lbajardsilogic@16: virtual void addInterval(long start, long end, const QString& label, float value); lbajardsilogic@16: virtual void addInterval(TimeIntervalPtr ti); lbajardsilogic@16: lbajardsilogic@16: virtual void removeInterval(TimeIntervalPtr ti); lbajardsilogic@16: lbajardsilogic@16: IntervalList& intervals() { return m_intervals; } lbajardsilogic@16: lbajardsilogic@16: void changeInterval(TimeIntervalPtr ti, long start, long end, float value, const QString& label); lbajardsilogic@16: lbajardsilogic@16: /** lbajardsilogic@16: * Command to change an interval. lbajardsilogic@16: */ lbajardsilogic@16: class IntervalCommand : public Command lbajardsilogic@16: { lbajardsilogic@16: public: lbajardsilogic@16: lbajardsilogic@16: enum Mode { lbajardsilogic@16: Creation, lbajardsilogic@16: Edition, lbajardsilogic@16: Deletion, lbajardsilogic@16: }; lbajardsilogic@16: lbajardsilogic@16: IntervalCommand(IntervalModel* model, lbajardsilogic@16: const TimeIntervalPtr& inter, lbajardsilogic@16: Mode mode, lbajardsilogic@16: long newStart, lbajardsilogic@16: long newEnd, lbajardsilogic@16: float newValue, lbajardsilogic@16: const QString& newLabel) : lbajardsilogic@16: m_model(model), m_interval(inter), m_mode(mode) lbajardsilogic@16: { lbajardsilogic@16: m_oldLabel = inter->label(); lbajardsilogic@16: m_oldStart = inter->start(); lbajardsilogic@16: m_oldEnd = inter->end(); lbajardsilogic@16: m_oldValue = inter->value(); lbajardsilogic@16: m_newLabel = newLabel; lbajardsilogic@16: m_newStart = newStart; lbajardsilogic@16: m_newEnd = newEnd; lbajardsilogic@16: m_newValue = newValue; lbajardsilogic@16: } lbajardsilogic@16: lbajardsilogic@16: virtual QString getName() const { return tr("Edit Interval"); } lbajardsilogic@16: lbajardsilogic@16: virtual void execute() lbajardsilogic@16: { lbajardsilogic@16: if (m_mode == Creation) lbajardsilogic@16: { lbajardsilogic@16: m_model->addInterval(m_interval); lbajardsilogic@16: } else if (m_mode == Edition) lbajardsilogic@16: { lbajardsilogic@16: m_model->changeInterval(m_interval, m_newStart, m_newEnd, m_newValue, m_newLabel); lbajardsilogic@16: } else if (m_mode == Deletion) lbajardsilogic@16: { lbajardsilogic@16: m_model->removeInterval(m_interval); lbajardsilogic@16: } lbajardsilogic@16: } lbajardsilogic@16: lbajardsilogic@16: virtual void unexecute() lbajardsilogic@16: { lbajardsilogic@16: if (m_mode == Creation) lbajardsilogic@16: { lbajardsilogic@16: m_model->removeInterval(m_interval); lbajardsilogic@16: } else if (m_mode == Edition) lbajardsilogic@16: { lbajardsilogic@16: m_model->changeInterval(m_interval, m_oldStart, m_oldEnd, m_oldValue, m_oldLabel); lbajardsilogic@16: } else if (m_mode == Deletion) lbajardsilogic@16: { lbajardsilogic@16: m_model->addInterval(m_interval); lbajardsilogic@16: } lbajardsilogic@16: } lbajardsilogic@16: lbajardsilogic@16: void newStart(long start) lbajardsilogic@16: { lbajardsilogic@16: if (m_newStart != start) lbajardsilogic@16: { lbajardsilogic@16: m_newStart = start; lbajardsilogic@16: m_model->changeInterval(m_interval, m_newStart, m_newEnd, m_newValue, m_newLabel); lbajardsilogic@16: } lbajardsilogic@16: } lbajardsilogic@16: lbajardsilogic@16: void newEnd(long end) lbajardsilogic@16: { lbajardsilogic@16: if (m_newEnd != end) lbajardsilogic@16: { lbajardsilogic@16: m_newEnd = end; lbajardsilogic@16: m_model->changeInterval(m_interval, m_newStart, m_newEnd, m_newValue, m_newLabel); lbajardsilogic@16: } lbajardsilogic@16: } lbajardsilogic@16: lbajardsilogic@16: void newLabel(QString label) lbajardsilogic@16: { lbajardsilogic@16: if (m_newLabel != label) lbajardsilogic@16: { lbajardsilogic@16: m_newLabel = label; lbajardsilogic@16: m_model->changeInterval(m_interval, m_newStart, m_newEnd, m_newValue, m_newLabel); lbajardsilogic@16: } lbajardsilogic@16: } lbajardsilogic@16: lbajardsilogic@16: private: lbajardsilogic@16: lbajardsilogic@16: Mode m_mode; lbajardsilogic@16: lbajardsilogic@16: IntervalModel* m_model; lbajardsilogic@16: TimeIntervalPtr m_interval; lbajardsilogic@16: QString m_newLabel; lbajardsilogic@16: QString m_oldLabel; lbajardsilogic@16: long m_newStart; lbajardsilogic@16: long m_oldStart; lbajardsilogic@16: long m_newEnd; lbajardsilogic@16: long m_oldEnd; lbajardsilogic@16: float m_newValue; lbajardsilogic@16: float m_oldValue; lbajardsilogic@16: }; lbajardsilogic@16: lbajardsilogic@16: lbajardsilogic@16: private: lbajardsilogic@16: lbajardsilogic@16: size_t m_sampleRate; lbajardsilogic@16: size_t m_resolution; lbajardsilogic@16: bool m_notifyOnAdd; lbajardsilogic@16: lbajardsilogic@16: IntervalList m_intervals; lbajardsilogic@16: mutable QMutex m_mutex; lbajardsilogic@16: lbajardsilogic@16: }; lbajardsilogic@16: lbajardsilogic@16: #endif // _INTERVAL_MODEL_H_