tahoma2d/toonz/sources/include/tnotanimatableparam.h

452 lines
13 KiB
C
Raw Normal View History

2016-05-17 03:04:11 +12:00
#pragma once
2016-03-19 06:57:51 +13:00
#ifndef TNOTANIMATABLEPARAM_H
#define TNOTANIMATABLEPARAM_H
2016-04-14 22:15:09 +12:00
#include <memory>
2016-03-19 06:57:51 +13:00
#include "tparam.h"
#include "tparamchange.h"
#include "tfilepath.h"
#include "texception.h"
#include "tundo.h"
#include "tconvert.h"
#include <set>
#undef DVAPI
#undef DVVAR
#ifdef TPARAM_EXPORTS
#define DVAPI DV_EXPORT_API
#define DVVAR DV_EXPORT_VAR
#else
#define DVAPI DV_IMPORT_API
#define DVVAR DV_IMPORT_VAR
#endif
//-----------------------------------------------------------------------------
// TNotAnimatableParamChange
//-----------------------------------------------------------------------------
#ifdef _MSC_VER
2016-03-19 06:57:51 +13:00
#pragma warning(push)
#pragma warning(disable : 4251)
#endif
template <class T>
class TNotAnimatableParamChange final : public TParamChange {
2016-06-15 18:43:10 +12:00
T m_oldValue;
T m_newValue;
2016-03-19 06:57:51 +13:00
public:
2016-06-15 18:43:10 +12:00
TNotAnimatableParamChange(TParam *param, const T &oldValue, const T &newValue,
bool undoing)
: TParamChange(param, TParamChange::m_minFrame, TParamChange::m_maxFrame,
false, false, undoing)
, m_oldValue(oldValue)
, m_newValue(newValue) {}
TParamChange *clone() const {
return new TNotAnimatableParamChange<T>(*this);
}
TUndo *createUndo() const;
2016-03-19 06:57:51 +13:00
};
//-----------------------------------------------------------------------------
// TNotAnimatableParamChangeUndo
//-----------------------------------------------------------------------------
template <class T>
class TNotAnimatableParamChangeUndo final : public TUndo {
2016-03-19 06:57:51 +13:00
public:
2016-06-15 18:43:10 +12:00
TNotAnimatableParamChangeUndo(TParam *param, const T &oldValue,
const T &newValue);
~TNotAnimatableParamChangeUndo();
2016-06-19 20:06:29 +12:00
void undo() const override;
void redo() const override;
int getSize() const override;
2016-03-19 06:57:51 +13:00
private:
2016-06-15 18:43:10 +12:00
TParam *m_param;
T m_oldValue;
T m_newValue;
2016-03-19 06:57:51 +13:00
};
//-----------------------------------------------------------------------------
// TNotAnimatableParamObserver
//-----------------------------------------------------------------------------
template <class T>
2016-06-15 18:43:10 +12:00
class TNotAnimatableParamObserver : public TParamObserver {
2016-03-19 06:57:51 +13:00
public:
2016-06-15 18:43:10 +12:00
TNotAnimatableParamObserver() {}
2016-06-19 20:06:29 +12:00
void onChange(const TParamChange &) override = 0;
2016-06-15 18:43:10 +12:00
void onChange(const TNotAnimatableParamChange<T> &change) {
onChange(static_cast<const TParamChange &>(change));
}
2016-03-19 06:57:51 +13:00
};
typedef TNotAnimatableParamObserver<int> TIntParamObserver;
typedef TNotAnimatableParamObserver<bool> TBoolParamObserver;
typedef TNotAnimatableParamObserver<TFilePath> TFilePathParamObserver;
//-----------------------------------------------------------------------------
// TNotAnimatableParam base class
//-----------------------------------------------------------------------------
using std::set;
template <class T>
2016-06-15 18:43:10 +12:00
class DVAPI TNotAnimatableParam : public TParam {
T m_defaultValue, m_value;
2016-03-19 06:57:51 +13:00
protected:
2016-06-15 18:43:10 +12:00
set<TNotAnimatableParamObserver<T> *> m_observers;
set<TParamObserver *> m_paramObservers;
2016-03-19 06:57:51 +13:00
public:
2016-06-15 18:43:10 +12:00
TNotAnimatableParam(T def = T())
: TParam(), m_defaultValue(def), m_value(def){};
TNotAnimatableParam(const TNotAnimatableParam &src)
: TParam(src.getName())
, m_defaultValue(src.getDefaultValue())
, m_value(src.getValue()){};
~TNotAnimatableParam(){};
T getValue() const { return m_value; }
T getDefaultValue() const { return m_defaultValue; }
void setValue(T v, bool undoing = false) {
if (m_value == v) return;
TNotAnimatableParamChange<T> change(this, m_value, v, undoing);
m_value = v;
for (typename std::set<TNotAnimatableParamObserver<T> *>::iterator obsIt =
m_observers.begin();
obsIt != m_observers.end(); ++obsIt)
(*obsIt)->onChange(change);
for (std::set<TParamObserver *>::iterator parObsIt =
m_paramObservers.begin();
parObsIt != m_paramObservers.end(); ++parObsIt)
(*parObsIt)->onChange(change);
}
void setDefaultValue(T value) { m_defaultValue = value; }
2016-06-19 20:06:29 +12:00
void copy(TParam *src) override {
2016-06-15 18:43:10 +12:00
TNotAnimatableParam<T> *p = dynamic_cast<TNotAnimatableParam<T> *>(src);
if (!p) throw TException("invalid source for copy");
setName(src->getName());
m_defaultValue = p->m_defaultValue;
m_value = p->m_value;
}
void reset(bool undoing = false) { setValue(m_defaultValue, undoing); }
2016-06-19 20:06:29 +12:00
void addObserver(TParamObserver *observer) override {
2016-06-15 18:43:10 +12:00
TNotAnimatableParamObserver<T> *obs =
dynamic_cast<TNotAnimatableParamObserver<T> *>(observer);
if (obs)
m_observers.insert(obs);
else
m_paramObservers.insert(observer);
}
2016-06-19 20:06:29 +12:00
void removeObserver(TParamObserver *observer) override {
2016-06-15 18:43:10 +12:00
TNotAnimatableParamObserver<T> *obs =
dynamic_cast<TNotAnimatableParamObserver<T> *>(observer);
if (obs)
m_observers.erase(obs);
else
m_paramObservers.erase(observer);
}
2016-06-19 20:06:29 +12:00
bool isAnimatable() const override { return false; }
bool isKeyframe(double) const override { return false; }
void deleteKeyframe(double) override {}
void clearKeyframes() override {}
2016-06-20 14:23:05 +12:00
void assignKeyframe(double, const TSmartPointerT<TParam> &, double,
bool) override {}
2016-06-15 18:43:10 +12:00
2016-06-19 20:06:29 +12:00
std::string getValueAlias(double, int) override {
2016-06-15 18:43:10 +12:00
using namespace std;
return to_string(getValue());
}
2016-06-19 20:06:29 +12:00
bool hasKeyframes() const override { return 0; };
2016-06-20 14:23:05 +12:00
void getKeyframes(std::set<double> &) const override{};
2016-06-19 20:06:29 +12:00
int getNextKeyframe(double) const override { return -1; };
int getPrevKeyframe(double) const override { return -1; };
2016-03-19 06:57:51 +13:00
};
//=========================================================
//
// class TIntParam
//
//=========================================================
2016-04-15 17:11:23 +12:00
#ifdef _WIN32
2016-03-19 06:57:51 +13:00
template class DVAPI TNotAnimatableParam<int>;
class TIntParam;
template class DVAPI TPersistDeclarationT<TIntParam>;
#endif
class DVAPI TIntParam final : public TNotAnimatableParam<int> {
2016-06-15 18:43:10 +12:00
PERSIST_DECLARATION(TIntParam);
int minValue, maxValue;
bool m_isWheelEnabled;
2016-03-19 06:57:51 +13:00
public:
2016-06-15 18:43:10 +12:00
TIntParam(int v = int())
: TNotAnimatableParam<int>(v)
, minValue(-(std::numeric_limits<int>::max)())
, maxValue((std::numeric_limits<int>::max)())
, m_isWheelEnabled(false) {}
TIntParam(const TIntParam &src) : TNotAnimatableParam<int>(src) {}
2016-06-19 20:06:29 +12:00
TParam *clone() const override { return new TIntParam(*this); }
void loadData(TIStream &is) override;
void saveData(TOStream &os) override;
2016-06-15 18:43:10 +12:00
void enableWheel(bool on);
bool isWheelEnabled() const;
void setValueRange(int min, int max);
bool getValueRange(int &min, int &max) const;
2016-03-19 06:57:51 +13:00
};
DEFINE_PARAM_SMARTPOINTER(TIntParam, int)
//=========================================================
//
// class TBoolParam
//
//=========================================================
2016-04-15 17:11:23 +12:00
#ifdef _WIN32
2016-03-19 06:57:51 +13:00
template class DVAPI TNotAnimatableParam<bool>;
class TBoolParam;
template class DVAPI TPersistDeclarationT<TBoolParam>;
#endif
class DVAPI TBoolParam final : public TNotAnimatableParam<bool> {
2016-06-15 18:43:10 +12:00
PERSIST_DECLARATION(TBoolParam);
2016-03-19 06:57:51 +13:00
public:
2016-06-15 18:43:10 +12:00
TBoolParam(bool v = bool()) : TNotAnimatableParam<bool>(v) {}
TBoolParam(const TBoolParam &src) : TNotAnimatableParam<bool>(src) {}
2016-03-19 06:57:51 +13:00
2016-06-19 20:06:29 +12:00
TParam *clone() const override { return new TBoolParam(*this); }
2016-03-19 06:57:51 +13:00
2016-06-19 20:06:29 +12:00
void loadData(TIStream &is) override;
void saveData(TOStream &os) override;
2016-03-19 06:57:51 +13:00
};
DEFINE_PARAM_SMARTPOINTER(TBoolParam, bool)
//=========================================================
//
// class TFilePathParam
//
//=========================================================
2016-04-15 17:11:23 +12:00
#ifdef _WIN32
2016-03-19 06:57:51 +13:00
template class DVAPI TNotAnimatableParam<TFilePath>;
class TFilePathParam;
template class DVAPI TPersistDeclarationT<TFilePathParam>;
#endif
class DVAPI TFilePathParam final : public TNotAnimatableParam<TFilePath> {
2016-06-15 18:43:10 +12:00
PERSIST_DECLARATION(TFilePathParam);
2016-03-19 06:57:51 +13:00
public:
2016-06-15 18:43:10 +12:00
TFilePathParam(const TFilePath &v = TFilePath())
: TNotAnimatableParam<TFilePath>(v) {}
TFilePathParam(const TFilePathParam &src)
: TNotAnimatableParam<TFilePath>(src) {}
2016-06-19 20:06:29 +12:00
TParam *clone() const override { return new TFilePathParam(*this); }
void loadData(TIStream &is) override;
void saveData(TOStream &os) override;
2016-03-19 06:57:51 +13:00
};
DEFINE_PARAM_SMARTPOINTER(TFilePathParam, TFilePath)
//=========================================================
//
// class TStringParam
//
//=========================================================
2016-04-15 17:11:23 +12:00
#ifdef _WIN32
2016-03-19 06:57:51 +13:00
template class DVAPI TNotAnimatableParam<std::wstring>;
class TStringParam;
template class DVAPI TPersistDeclarationT<TStringParam>;
#endif
class DVAPI TStringParam final : public TNotAnimatableParam<std::wstring> {
2016-06-15 18:43:10 +12:00
PERSIST_DECLARATION(TStringParam);
2016-03-19 06:57:51 +13:00
public:
2016-06-15 18:43:10 +12:00
TStringParam(std::wstring v = L"") : TNotAnimatableParam<std::wstring>(v) {}
TStringParam(const TStringParam &src)
: TNotAnimatableParam<std::wstring>(src) {}
2016-06-19 20:06:29 +12:00
TParam *clone() const override { return new TStringParam(*this); }
void loadData(TIStream &is) override;
void saveData(TOStream &os) override;
2016-03-19 06:57:51 +13:00
};
DEFINE_PARAM_SMARTPOINTER(TStringParam, std::wstring)
2016-03-19 06:57:51 +13:00
//=========================================================
//
// class TEnumParam
//
//=========================================================
class TEnumParamImp;
class DVAPI TEnumParam final : public TNotAnimatableParam<int> {
2016-06-15 18:43:10 +12:00
PERSIST_DECLARATION(TEnumParam)
2016-03-19 06:57:51 +13:00
public:
2016-06-15 18:43:10 +12:00
TEnumParam(const int &v, const std::string &caption);
2016-03-19 06:57:51 +13:00
2016-06-15 18:43:10 +12:00
TEnumParam();
2016-03-19 06:57:51 +13:00
2016-06-15 18:43:10 +12:00
TEnumParam(const TEnumParam &src);
~TEnumParam();
2016-03-19 06:57:51 +13:00
2016-06-19 20:06:29 +12:00
TParam *clone() const override { return new TEnumParam(*this); }
void copy(TParam *src) override;
2016-03-19 06:57:51 +13:00
2016-06-15 18:43:10 +12:00
void setValue(int v, bool undoing = false);
void setValue(const std::string &caption, bool undoing = false);
2016-03-19 06:57:51 +13:00
2016-06-15 18:43:10 +12:00
void addItem(const int &item, const std::string &caption);
2016-03-19 06:57:51 +13:00
2016-06-15 18:43:10 +12:00
int getItemCount() const;
void getItem(int i, int &item, std::string &caption) const;
2016-03-19 06:57:51 +13:00
2016-06-15 18:43:10 +12:00
// TPersist methods
2016-06-19 20:06:29 +12:00
void loadData(TIStream &is) override;
void saveData(TOStream &os) override;
2016-03-19 06:57:51 +13:00
private:
2016-06-15 18:43:10 +12:00
std::unique_ptr<TEnumParamImp> m_imp;
2016-03-19 06:57:51 +13:00
};
typedef TEnumParam TIntEnumParam;
typedef TNotAnimatableParamObserver<TIntEnumParam> TIntEnumParamObserver;
DVAPI_PARAM_SMARTPOINTER(TIntEnumParam)
class DVAPI TIntEnumParamP final
2016-06-15 18:43:10 +12:00
: public TDerivedSmartPointerT<TIntEnumParam, TParam> {
2016-03-19 06:57:51 +13:00
public:
2016-06-15 18:43:10 +12:00
TIntEnumParamP(TIntEnumParam *p = 0) : DerivedSmartPointer(p) {}
TIntEnumParamP(int v, const std::string &caption)
: DerivedSmartPointer(new TEnumParam(v, caption)) {}
TIntEnumParamP(TParamP &p) : DerivedSmartPointer(p) {}
TIntEnumParamP(const TParamP &p) : DerivedSmartPointer(p) {}
operator TParamP() const { return TParamP(m_pointer); }
2016-03-19 06:57:51 +13:00
};
//------------------------------------------------------------------------------
//=========================================================
//
// class TNADoubleParam //is a not animatable double param
//
//=========================================================
2016-04-15 17:11:23 +12:00
#ifdef _WIN32
2016-03-19 06:57:51 +13:00
template class DVAPI TNotAnimatableParam<double>;
class TNADoubleParam;
template class DVAPI TPersistDeclarationT<TNADoubleParam>;
#endif
class DVAPI TNADoubleParam final : public TNotAnimatableParam<double> {
2016-06-15 18:43:10 +12:00
PERSIST_DECLARATION(TNADoubleParam);
2016-03-19 06:57:51 +13:00
public:
2016-06-15 18:43:10 +12:00
TNADoubleParam(double v = double())
: TNotAnimatableParam<double>(v), m_min(0.), m_max(100.) {}
TNADoubleParam(const TNADoubleParam &src)
: TNotAnimatableParam<double>(src) {}
2016-06-19 20:06:29 +12:00
TParam *clone() const override { return new TNADoubleParam(*this); }
2016-06-15 18:43:10 +12:00
void setValueRange(double min, double max) {
m_min = min;
m_max = max;
}
void setValue(double v, bool undoing = false) {
notMoreThan(m_max, v);
notLessThan(m_min, v);
TNotAnimatableParam<double>::setValue(v, undoing);
}
bool getValueRange(double &min, double &max) const {
min = m_min;
max = m_max;
return min < max;
}
2016-06-19 20:06:29 +12:00
void loadData(TIStream &is) override;
void saveData(TOStream &os) override;
2016-03-19 06:57:51 +13:00
private:
2016-06-15 18:43:10 +12:00
double m_min, m_max;
2016-03-19 06:57:51 +13:00
};
DEFINE_PARAM_SMARTPOINTER(TNADoubleParam, double)
//-----------------------------------------------------------------------------
// TNotAnimatableParamChangeUndo
//-----------------------------------------------------------------------------
template <class T>
2016-06-15 18:43:10 +12:00
TNotAnimatableParamChangeUndo<T>::TNotAnimatableParamChangeUndo(
TParam *param, const T &oldValue, const T &newValue)
: m_param(param), m_oldValue(oldValue), m_newValue(newValue) {
m_param->addRef();
2016-03-19 06:57:51 +13:00
}
//-----------------------------------------------------------------------------
template <class T>
2016-06-15 18:43:10 +12:00
TNotAnimatableParamChangeUndo<T>::~TNotAnimatableParamChangeUndo() {
m_param->release();
2016-03-19 06:57:51 +13:00
}
//-----------------------------------------------------------------------------
template <class T>
2016-06-15 18:43:10 +12:00
void TNotAnimatableParamChangeUndo<T>::undo() const {
TNotAnimatableParam<T> *p = dynamic_cast<TNotAnimatableParam<T> *>(m_param);
p->setValue(m_oldValue, true);
2016-03-19 06:57:51 +13:00
}
//-----------------------------------------------------------------------------
template <class T>
2016-06-15 18:43:10 +12:00
void TNotAnimatableParamChangeUndo<T>::redo() const {
TNotAnimatableParam<T> *p = dynamic_cast<TNotAnimatableParam<T> *>(m_param);
p->setValue(m_newValue, true);
2016-03-19 06:57:51 +13:00
}
//-----------------------------------------------------------------------------
template <class T>
2016-06-15 18:43:10 +12:00
int TNotAnimatableParamChangeUndo<T>::getSize() const {
return sizeof(*this);
2016-03-19 06:57:51 +13:00
}
//-----------------------------------------------------------------------------
// TNotAnimatableParamChange
//-----------------------------------------------------------------------------
template <class T>
2016-06-15 18:43:10 +12:00
TUndo *TNotAnimatableParamChange<T>::createUndo() const {
return new TNotAnimatableParamChangeUndo<T>(m_param, m_oldValue, m_newValue);
2016-03-19 06:57:51 +13:00
}
//-----------------------------------------------------------------------------
#ifdef _MSC_VER
2016-03-19 06:57:51 +13:00
#pragma warning(pop)
#endif
#endif