changeset 16:21f452cc3310

add - EasaierSessionManager - Easaier menus - Interval model
author lbajardsilogic
date Mon, 14 May 2007 13:11:29 +0000
parents 11e298cdb9e7
children e59b19407b6d
files data/model/IntervalModel.cpp data/model/IntervalModel.h
diffstat 2 files changed, 419 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/data/model/IntervalModel.cpp	Mon May 14 13:11:29 2007 +0000
@@ -0,0 +1,203 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*-  vi:set ts=8 sts=4 sw=4: */
+
+/*
+    Sound Access
+	EASAIER client application.
+	Silogic 2007. Luc Barthélémy.
+
+    This program is free software; you can redistribute it and/or
+    modify it under the terms of the GNU General Public License as
+    published by the Free Software Foundation; either version 2 of the
+    License, or (at your option) any later version.  See the file
+    COPYING included with this distribution for more information.
+*/
+
+
+#include "system/System.h"
+#include "model/IntervalModel.h"
+
+
+
+TimeInterval::TimeInterval(long start, long end, float value):
+m_start(start), m_end(end), m_value(value)
+{
+}
+
+TimeInterval::TimeInterval(long start, long end, const QString& label, float value):
+m_start(start), m_end(end), m_label(label), m_value(value)
+{
+}
+
+TimeInterval::~TimeInterval()
+{
+}
+
+QString 
+TimeInterval::toXmlString(QString indent , QString extraAttributes ) const
+{
+	return QString("%1<interval start=\"%2\" end=\"%3\" label=\"%4\" value=\"%5\" %6/>\n")
+	    .arg(indent).arg(m_start).arg(m_end).arg(m_label)
+		.arg(m_value).arg(extraAttributes);
+}
+
+QString 
+TimeInterval::toDelimitedDataString(const QString& delimiter, size_t sampleRate) const
+{
+    QStringList list;
+    list << RealTime::frame2RealTime(m_start, sampleRate).toString().c_str();
+    list << RealTime::frame2RealTime(m_end, sampleRate).toString().c_str();
+    list << QString("%1").arg(m_value);
+    list << m_label;
+
+    return list.join(delimiter);
+}
+
+/**
+ * IntervalModel
+ */
+
+IntervalModel::IntervalModel(size_t sampleRate, size_t resolution, bool notifyOnAdd) :
+m_sampleRate(sampleRate), m_resolution(resolution), m_notifyOnAdd(notifyOnAdd)
+{
+
+
+}
+
+IntervalModel::~IntervalModel()
+{
+
+}
+
+QString 
+IntervalModel::toDelimitedDataString(QString delimiter) const
+{ 
+    QString s;
+    for (IntervalListConstIterator i = m_intervals.begin(); i != m_intervals.end(); ++i) 
+	{
+        s += (*i)->toDelimitedDataString(delimiter, m_sampleRate) + "\n";
+    }
+
+	return s;
+}
+
+QString 
+IntervalModel::toXmlString(QString indent, QString extraAttributes) const
+{ 
+    QString s;
+
+    s += Model::toXmlString
+	(indent, QString("type=\"interval\" dimensions=\"3\" resolution=\"%1\" notifyOnAdd=\"%2\" dataset=\"%3\" %4")
+		.arg(m_resolution)
+		.arg(m_notifyOnAdd ? "true" : "false")
+		.arg(getObjectExportId(&m_intervals))
+		.arg(extraAttributes));
+
+    s += indent;
+    s += QString("<dataset id=\"%1\" dimensions=\"3\"\">\n")
+	.arg(getObjectExportId(&m_intervals));
+
+    for (IntervalListConstIterator i = m_intervals.begin(); i != m_intervals.end(); ++i) 
+	{
+        s += (*i)->toXmlString(indent + "  ");
+    }
+
+    s += indent + "</dataset>\n";
+
+    return s;
+}
+
+size_t 
+IntervalModel::getStartFrame() const
+{
+    QMutexLocker locker(&m_mutex);
+
+	size_t start= 0;
+	
+	if (m_intervals.size() > 0)
+		start = (*m_intervals.begin())->start();
+
+    for (IntervalListConstIterator i = m_intervals.begin() ; i != m_intervals.end(); ++i) 
+	{
+		if (start > ((size_t) ((*i)->start())))
+			start = (size_t) ((*i)->start());
+	}
+
+	return start;
+}
+
+size_t 
+IntervalModel::getEndFrame() const
+{
+    QMutexLocker locker(&m_mutex);
+
+	size_t end = 0;
+	
+    for (IntervalListConstIterator i = m_intervals.begin() ; i != m_intervals.end(); ++i) 
+	{
+		if (end < ((size_t) ((*i)->end())))
+			end = (size_t) ((*i)->end());
+	}
+
+	return end;
+}
+
+Model* 
+IntervalModel::clone() const
+{
+	IntervalModel* model = new IntervalModel(m_sampleRate, m_resolution, m_notifyOnAdd);
+	model->m_intervals = m_intervals;
+	
+	return model;
+}
+
+void 
+IntervalModel::addInterval(long start, long end, const QString& label, float value)
+{
+	QMutexLocker locker(&m_mutex);
+
+	m_intervals.push_back(new TimeInterval(start, end, label, value));
+}
+
+void IntervalModel::addInterval(TimeIntervalPtr ti)
+{
+	{
+		QMutexLocker locker(&m_mutex);
+
+		m_intervals.push_back(ti);
+	}
+
+	emit modelChanged(ti->start(), ti->end());
+}
+
+void IntervalModel::removeInterval(TimeIntervalPtr ti)
+{
+	{
+		QMutexLocker locker(&m_mutex);
+
+		m_intervals.remove(ti);
+	}
+
+	emit modelChanged(ti->start(), ti->end());
+}
+
+void
+IntervalModel::changeInterval(TimeIntervalPtr ti, long start, long end, float value, const QString& label)
+{
+
+	long startMin = min(start, ti->start());
+	long endMax   = max(end, ti->end());
+
+	{
+		QMutexLocker locker(&m_mutex);
+
+		if (label != ti->label())
+			ti->label(label);
+		ti->start(start);
+		ti->end(end);
+		ti->value(value);
+	}
+
+	emit modelChanged(startMin, endMax);
+}
+
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/data/model/IntervalModel.h	Mon May 14 13:11:29 2007 +0000
@@ -0,0 +1,216 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*-  vi:set ts=8 sts=4 sw=4: */
+
+/*
+    Sound Access
+	EASAIER client application.
+	Silogic 2007. Luc Barthélémy.
+
+    This program is free software; you can redistribute it and/or
+    modify it under the terms of the GNU General Public License as
+    published by the Free Software Foundation; either version 2 of the
+    License, or (at your option) any later version.  See the file
+    COPYING included with this distribution for more information.
+*/
+
+#ifndef _INTERVAL_MODEL_H_
+#define _INTERVAL_MODEL_H_
+ 
+#include <QMutex>
+
+#include "Model.h"
+#include "base/RealTime.h"
+#include "base/Command.h"
+#include "base/CommandHistory.h"
+
+/**
+ * TimeInterval SparseValueModel
+ */
+
+class TimeInterval
+{
+public:
+    
+	TimeInterval(long start = 0, long end = 0, float value = 0.0f);
+	TimeInterval(long start, long end, const QString& label, float value = 0.0f);
+	virtual ~TimeInterval();
+   
+	QString toXmlString(QString indent = "", QString extraAttributes = "") const;
+    QString toDelimitedDataString(const QString& delimiter, size_t sampleRate) const;
+
+	long start() const {return m_start;}
+	long end() const {return m_end;}
+	float value() const {return m_value;}
+	const QString& label() const { return m_label; }
+
+	void start(long start) { m_start = start;}
+	void end(long end) { m_end = end;}
+	void label(const QString& label) { m_label = label;}
+	void value(float val) { m_value = val;}
+
+private:
+    
+	long	m_start;
+    long	m_end;
+	float	m_value;
+
+	QString	m_label;
+};
+
+typedef TimeInterval* TimeIntervalPtr;
+
+typedef std::list<TimeIntervalPtr> IntervalList;
+typedef IntervalList::iterator IntervalListIterator;
+typedef IntervalList::const_iterator IntervalListConstIterator;
+
+/**
+ * IntervalModel
+ */
+
+class IntervalModel : public Model
+{
+public:
+
+    IntervalModel(size_t sampleRate, size_t resolution,
+	      bool notifyOnAdd = true);
+	~IntervalModel();
+
+
+    virtual bool isOK() const { return true; }
+    virtual size_t getStartFrame() const;
+    virtual size_t getEndFrame() const;
+
+	virtual size_t getSampleRate() const { return m_sampleRate; }
+    virtual size_t getResolution() const { return m_resolution; }
+
+    virtual Model *clone() const;
+  
+	virtual QString toXmlString(QString indent = "", QString extraAttributes = "") const;
+    virtual QString toDelimitedDataString(QString) const;
+
+	virtual void addInterval(long start, long end, const QString& label, float value);
+	virtual void addInterval(TimeIntervalPtr ti);
+
+	virtual void removeInterval(TimeIntervalPtr ti);
+
+	IntervalList& intervals() { return m_intervals; }
+
+	void changeInterval(TimeIntervalPtr ti, long start, long end, float value, const QString& label);
+
+   /**
+     * Command to change an interval.
+     */
+    class IntervalCommand : public Command
+    {
+	    public:
+			
+			enum Mode {
+				Creation,
+				Edition,
+				Deletion,
+			};
+
+			IntervalCommand(IntervalModel* model,
+				   const TimeIntervalPtr& inter,
+				   Mode mode,
+				   long newStart,
+				   long newEnd,
+				   float newValue,
+				   const QString& newLabel) :
+			m_model(model), m_interval(inter), m_mode(mode)
+			{
+				m_oldLabel = inter->label();
+				m_oldStart = inter->start();
+				m_oldEnd   = inter->end();
+				m_oldValue = inter->value();
+				m_newLabel = newLabel;
+				m_newStart = newStart;
+				m_newEnd   = newEnd;
+				m_newValue = newValue;
+			}
+
+			virtual QString getName() const { return tr("Edit Interval"); }
+
+			virtual void execute() 
+			{ 
+				if (m_mode == Creation)
+				{
+					m_model->addInterval(m_interval);
+				} else if (m_mode == Edition)
+				{
+					m_model->changeInterval(m_interval, m_newStart, m_newEnd, m_newValue, m_newLabel);
+				} else if (m_mode == Deletion)
+				{
+					m_model->removeInterval(m_interval);
+				}
+			}
+
+			virtual void unexecute() 
+			{ 
+				if (m_mode == Creation)
+				{
+					m_model->removeInterval(m_interval);
+				} else if (m_mode == Edition)
+				{
+					m_model->changeInterval(m_interval, m_oldStart, m_oldEnd, m_oldValue, m_oldLabel);
+				} else if (m_mode == Deletion)
+				{
+					m_model->addInterval(m_interval);
+				}
+			}
+
+			void newStart(long start) 
+			{ 
+				if (m_newStart != start)
+				{	
+					m_newStart  = start; 
+					m_model->changeInterval(m_interval, m_newStart, m_newEnd, m_newValue, m_newLabel);
+				}
+			}
+
+			void newEnd(long end)
+			{
+				if (m_newEnd != end)
+				{	
+					m_newEnd  = end; 
+					m_model->changeInterval(m_interval, m_newStart, m_newEnd, m_newValue, m_newLabel);
+				}
+			}
+
+			void newLabel(QString label)
+			{
+				if (m_newLabel != label)
+				{	
+					m_newLabel  = label; 
+					m_model->changeInterval(m_interval, m_newStart, m_newEnd, m_newValue, m_newLabel);
+				}
+			}
+
+	private:
+
+			Mode			m_mode;
+
+			IntervalModel*	m_model;
+			TimeIntervalPtr	m_interval;
+			QString			m_newLabel;
+			QString			m_oldLabel;
+			long			m_newStart;
+			long			m_oldStart;
+			long			m_newEnd;
+			long			m_oldEnd;
+			float			m_newValue;
+			float			m_oldValue;
+    };
+
+
+private:
+
+	size_t	m_sampleRate;
+	size_t	m_resolution;
+	bool	m_notifyOnAdd;
+
+	IntervalList	m_intervals; 
+	mutable QMutex	m_mutex;
+
+};
+
+#endif // _INTERVAL_MODEL_H_