252 lines
6.4 KiB
C++
252 lines
6.4 KiB
C++
|
|
|
|
#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;
|
|
}
|