|
|
@@ -203,6 +203,44 @@ public:
|
|
|
SetFunctionPtr setFunction_;
|
|
|
};
|
|
|
|
|
|
+/// Template implementation of the attribute accessor invoke helper class.
|
|
|
+template <class T, class U> class EnumAttributeAccessorImpl : public AttributeAccessor
|
|
|
+{
|
|
|
+public:
|
|
|
+ typedef U (T::*GetFunctionPtr)() const;
|
|
|
+ typedef void (T::*SetFunctionPtr)(U);
|
|
|
+
|
|
|
+ /// Construct with function pointers.
|
|
|
+ EnumAttributeAccessorImpl(GetFunctionPtr getFunction, SetFunctionPtr setFunction) :
|
|
|
+ getFunction_(getFunction),
|
|
|
+ setFunction_(setFunction)
|
|
|
+ {
|
|
|
+ assert(getFunction_);
|
|
|
+ assert(setFunction_);
|
|
|
+ }
|
|
|
+
|
|
|
+ /// Invoke getter function.
|
|
|
+ virtual void Get(const Serializable* ptr, Variant& dest) const
|
|
|
+ {
|
|
|
+ assert(ptr);
|
|
|
+ const T* classPtr = static_cast<const T*>(ptr);
|
|
|
+ dest = (classPtr->*getFunction_)();
|
|
|
+ }
|
|
|
+
|
|
|
+ /// Invoke setter function.
|
|
|
+ virtual void Set(Serializable* ptr, const Variant& value)
|
|
|
+ {
|
|
|
+ assert(ptr);
|
|
|
+ T* classPtr = static_cast<T*>(ptr);
|
|
|
+ (classPtr->*setFunction_)((U)value.GetInt());
|
|
|
+ }
|
|
|
+
|
|
|
+ /// Class-specific pointer to getter function.
|
|
|
+ GetFunctionPtr getFunction_;
|
|
|
+ /// Class-specific pointer to setter function.
|
|
|
+ SetFunctionPtr setFunction_;
|
|
|
+};
|
|
|
+
|
|
|
/// Template implementation of the attribute accessor invoke helper class using const references for setter only.
|
|
|
template <class T, class U> class MixedAttributeAccessorImpl : public AttributeAccessor
|
|
|
{
|
|
|
@@ -246,7 +284,7 @@ public:
|
|
|
#define ATTRIBUTE(type, name, variable, defaultValue, mode) context->RegisterAttribute<ClassName>(Urho3D::AttributeInfo(type, name, offsetof(ClassName, variable), defaultValue, mode))
|
|
|
#define ENUM_ATTRIBUTE(name, variable, enumNames, defaultValue, mode) context->RegisterAttribute<ClassName>(Urho3D::AttributeInfo(name, offsetof(ClassName, variable), enumNames, defaultValue, mode))
|
|
|
#define ACCESSOR_ATTRIBUTE(name, getFunction, setFunction, typeName, defaultValue, mode) context->RegisterAttribute<ClassName>(Urho3D::AttributeInfo(GetVariantType<typeName>(), name, new Urho3D::AttributeAccessorImpl<ClassName, typeName>(&ClassName::getFunction, &ClassName::setFunction), defaultValue, mode))
|
|
|
-#define ENUM_ACCESSOR_ATTRIBUTE(name, getFunction, setFunction, typeName, enumNames, defaultValue, mode) context->RegisterAttribute<ClassName>(Urho3D::AttributeInfo(name, new Urho3D::AttributeAccessorImpl<ClassName, typeName>(&ClassName::getFunction, &ClassName::setFunction), enumNames, defaultValue, mode))
|
|
|
+#define ENUM_ACCESSOR_ATTRIBUTE(name, getFunction, setFunction, typeName, enumNames, defaultValue, mode) context->RegisterAttribute<ClassName>(Urho3D::AttributeInfo(name, new Urho3D::EnumAttributeAccessorImpl<ClassName, typeName>(&ClassName::getFunction, &ClassName::setFunction), enumNames, defaultValue, mode))
|
|
|
#define REF_ACCESSOR_ATTRIBUTE(name, getFunction, setFunction, typeName, defaultValue, mode) context->RegisterAttribute<ClassName>(Urho3D::AttributeInfo(GetVariantType<typeName>(), name, new Urho3D::RefAttributeAccessorImpl<ClassName, typeName>(&ClassName::getFunction, &ClassName::setFunction), defaultValue, mode))
|
|
|
#define MIXED_ACCESSOR_ATTRIBUTE(name, getFunction, setFunction, typeName, defaultValue, mode) context->RegisterAttribute<ClassName>(Urho3D::AttributeInfo(GetVariantType<typeName>(), name, new Urho3D::MixedAttributeAccessorImpl<ClassName, typeName>(&ClassName::getFunction, &ClassName::setFunction), defaultValue, mode))
|
|
|
#define UPDATE_ATTRIBUTE_DEFAULT_VALUE(name, defaultValue) context->UpdateAttributeDefaultValue<ClassName>(name, defaultValue)
|