| |
| |
| #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") |
| |
| |
| 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; |
| } |
| |