diff data/model/IntervalModel.h @ 16:21f452cc3310

add - EasaierSessionManager - Easaier menus - Interval model
author lbajardsilogic
date Mon, 14 May 2007 13:11:29 +0000
parents
children a8dcc1ca82c4
line wrap: on
line diff
--- /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_