Blob Blame Raw


#include "tnotanimatableparam.h"
#include "tstream.h"

PERSIST_IDENTIFIER(TIntParam, "intParam")
PERSIST_IDENTIFIER(TBoolParam, "boolParam")
PERSIST_IDENTIFIER(TFilePathParam, "filePathParam")
PERSIST_IDENTIFIER(TStringParam, "stringParam")
PERSIST_IDENTIFIER(TNADoubleParam, "naDoubleParam")
//PERSIST_IDENTIFIER(TIntEnumParam, "intEnumParam")

TPersistDeclarationT<TEnumParam> TEnumParam::m_declaration("intEnumParam");

//=========================================================

void TIntParam::loadData(TIStream &is)
{
	int def, value;
	is >> def;
	if (is.eos()) {
		def += 1;
		setDefaultValue(def);
		setValue(def, false);
		return;
	}
	setDefaultValue(def);
	is >> value;
	setValue(value, false);
}

//---------------------------------------------------------

void TIntParam::saveData(TOStream &os)
{
	os << getDefaultValue();
	os << getValue();
}
//---------------------------------------------------------

bool TIntParam::isWheelEnabled() const
{
	return m_isWheelEnabled;
}
//---------------------------------------------------------

void TIntParam::enableWheel(bool on)
{
	m_isWheelEnabled = on;
}

//=========================================================

void TBoolParam::loadData(TIStream &is)
{
	int def, value;
	is >> def >> value;
	setDefaultValue(def ? true : false);
	setValue(value ? true : false, false);
}

//---------------------------------------------------------

void TBoolParam::saveData(TOStream &os)
{
	os << (int)getDefaultValue() << (int)getValue();
}

//=========================================================

void TFilePathParam::loadData(TIStream &is)
{
	TFilePath def, value;
	is >> def >> value;
	setDefaultValue(def);
	setValue(value, false);
}

//---------------------------------------------------------

void TFilePathParam::saveData(TOStream &os)
{
	os << getDefaultValue();
	os << getValue();
}

//=========================================================
void TStringParam::loadData(TIStream &is)
{
	std::wstring def, value;
	is >> def >> value;
	setDefaultValue(def);
	setValue(value, false);
}
void TStringParam::saveData(TOStream &os)
{
	os << getDefaultValue();
	os << getValue();
}
//=========================================================
void TNADoubleParam::loadData(TIStream &is)
{
	double def, value;
	is >> def >> value;
	setDefaultValue(def);
	setValue(value, false);
}
void TNADoubleParam::saveData(TOStream &os)
{
	os << getDefaultValue();
	os << getValue();
}
//=========================================================

//=========================================================

namespace
{
template <typename T>
class matchesValue
{
	T m_v;

public:
	matchesValue(T v) : m_v(v) {}
	bool operator()(const std::pair<T, std::string> &p) { return m_v == p.first; }
};
}

//---------------------------------------------------------

class TEnumParamImp
{
public:
	std::vector<std::pair<int, std::string>> m_items;
	void copy(std::unique_ptr<TEnumParamImp>& src)
	{
		m_items.clear();
		std::back_insert_iterator<std::vector<std::pair<int, std::string>>> bii(m_items);
		std::copy(src->m_items.begin(), src->m_items.end(), bii);
	}
	bool checkValue(int v)
	{
		std::vector<std::pair<int, std::string>>::iterator it =
			std::find_if(m_items.begin(), m_items.end(), matchesValue<int>(v));
		return it != m_items.end();
	}
};

//---------------------------------------------------------

TEnumParam::TEnumParam(const int &v, const std::string &caption)
	: TNotAnimatableParam<int>(v), m_imp(new TEnumParamImp())
{
	addItem(v, caption);
}

//---------------------------------------------------------

void TEnumParam::copy(TParam *src)
{
	TNotAnimatableParam<int>::copy(src);
	TEnumParam *p = dynamic_cast<TEnumParam *>(src);
	if (!p)
		throw TException("invalid source for copy");
	TEnumParam::setName(src->getName());
	m_imp->copy(p->m_imp);
}

//---------------------------------------------------------

TEnumParam::~TEnumParam()
{
}

//---------------------------------------------------------

TEnumParam::TEnumParam(const TEnumParam &src)
	: TNotAnimatableParam<int>(src), m_imp(new TEnumParamImp(*src.m_imp))
{
}

//---------------------------------------------------------

TEnumParam::TEnumParam()
	: TNotAnimatableParam<int>(), m_imp(new TEnumParamImp())

{
}

//---------------------------------------------------------

void TEnumParam::setValue(int v, bool undoing)
{
	bool valid = false;
	std::vector<std::pair<int, std::string>>::iterator it = m_imp->m_items.begin();
	for (; it != m_imp->m_items.end(); ++it) {
		if (it->first == v) {
			valid = true;
			break;
		}
	}

	if (!valid)
		throw TException("out of range parameter value");

	TNotAnimatableParam<int>::setValue(v, undoing);
}

//---------------------------------------------------------

void TEnumParam::setValue(const std::string &caption, bool undoing)
{
	bool valid = false;
	int v = 0;
	std::vector<std::pair<int, std::string>>::iterator it = m_imp->m_items.begin();
	for (; it != m_imp->m_items.end(); ++it) {
		if (it->second == caption) {
			v = it->first;
			valid = true;
			break;
		}
	}

	if (!valid)
		throw TException("out of range parameter value");

	TNotAnimatableParam<int>::setValue(v, undoing);
}

//---------------------------------------------------------

void TEnumParam::addItem(const int &item, const std::string &caption)
{
	m_imp->m_items.push_back(std::make_pair(item, caption));
}

//---------------------------------------------------------

int TEnumParam::getItemCount() const
{
	return m_imp->m_items.size();
}

//---------------------------------------------------------

void TEnumParam::getItem(int i, int &item, std::string &caption) const
{
	assert(i >= 0 && i < m_imp->m_items.size());
	item = m_imp->m_items[i].first;
	caption = m_imp->m_items[i].second;
}

//---------------------------------------------------------

void TEnumParam::loadData(TIStream &is)
{
	int value;
	is >> value;

	try {
		setValue(value, false);
	} catch (TException &) {
		TNotAnimatableParam<int>::reset();
	}
}

//---------------------------------------------------------

void TEnumParam::saveData(TOStream &os)
{
	os << TNotAnimatableParam<int>::getValue();
}

//---------------------------------------------------------

void TIntParam::setValueRange(int min, int max)
{
	assert(min < max);

	minValue = min;
	maxValue = max;
}

bool TIntParam::getValueRange(int &min, int &max) const
{
	min = minValue;
	max = maxValue;
	return min < max;
}