Blob Blame Raw


#include "tparamcontainer.h"
//#include "tdoubleparam.h"
#include "tparamset.h"

#include "tparam.h"

void TParamVar::setParamObserver(TParamObserver *obs)
{
	if (m_paramObserver == obs)
		return;
	TParam *param = getParam();
	if (param) {
		if (obs)
			param->addObserver(obs);
		if (m_paramObserver)
			param->removeObserver(m_paramObserver);
	}
	m_paramObserver = obs;
}

class TParamContainer::Imp
{
public:
	std::map<string, TParamVar *> m_nameTable;
	std::vector<TParamVar *> m_vars;
	TParamObserver *m_paramObserver;
	Imp() : m_paramObserver(0) {}
	~Imp() { clearPointerContainer(m_vars); }
};

TParamContainer::TParamContainer()
	: m_imp(new Imp())
{
}

TParamContainer::~TParamContainer()
{
	delete m_imp;
}

void TParamContainer::setParamObserver(TParamObserver *observer)
{
	m_imp->m_paramObserver = observer;
}

TParamObserver *TParamContainer::getParamObserver() const
{
	return m_imp->m_paramObserver;
}

void TParamContainer::add(TParamVar *var)
{
	m_imp->m_vars.push_back(var);
	m_imp->m_nameTable[var->getName()] = var;
	var->setParamObserver(m_imp->m_paramObserver);
	var->getParam()->setName(var->getName());
}

int TParamContainer::getParamCount() const
{
	return m_imp->m_vars.size();
}

TParam *TParamContainer::getParam(int index) const
{
	assert(0 <= index && index < getParamCount());
	return m_imp->m_vars[index]->getParam();
}

bool TParamContainer::isParamHidden(int index) const
{
	assert(0 <= index && index < getParamCount());
	return m_imp->m_vars[index]->isHidden();
}

string TParamContainer::getParamName(int index) const
{
	assert(0 <= index && index < getParamCount());
	return m_imp->m_vars[index]->getName();
}

const TParamVar *TParamContainer::getParamVar(int index) const
{
	assert(0 <= index && index < getParamCount());
	return m_imp->m_vars[index];
}

TParam *TParamContainer::getParam(string name) const
{
	std::map<string, TParamVar *>::const_iterator it;
	it = m_imp->m_nameTable.find(name);
	if (it == m_imp->m_nameTable.end())
		return 0;
	else
		return it->second->getParam();
}

void TParamContainer::unlink()
{
	for (int i = 0; i < getParamCount(); i++) {
		//TRangeParam *p0;//,*p1;
		TParamVar *var = m_imp->m_vars[i];
		TParam *param = var->getParam();
		//p0 = dynamic_cast<TRangeParam *>(param);
		var->setParam(param->clone());
		/*p1 = dynamic_cast<TRangeParam *>(var->getParam());
     if(p0 && p1)
     {
       string name = p0->getName();
       name = p1->getName();
     }*/
	}
}

void TParamContainer::link(const TParamContainer *src)
{
	assert(getParamCount() == src->getParamCount());
	for (int i = 0; i < getParamCount(); i++) {
		assert(getParamName(i) == src->getParamName(i));
		assert(m_imp->m_vars[i]->getName() == getParamName(i));
		m_imp->m_vars[i]->setParam(src->getParam(i));
	}
}

void TParamContainer::copy(const TParamContainer *src)
{
	assert(getParamCount() == src->getParamCount());
	for (int i = 0; i < getParamCount(); i++) {
		assert(getParamName(i) == src->getParamName(i));
		assert(m_imp->m_vars[i]->getName() == getParamName(i));
		getParam(i)->copy(src->getParam(i));
	}
}