#include <dali/public-api/object/property-notification-declarations.h>
#include <dali/public-api/object/ref-object.h>
-namespace Dali DALI_IMPORT_API
+namespace Dali
{
+class ActiveConstraint;
+class Constraint;
class PropertyNotification;
class PropertyCondition;
}
/**
- * @brief Dali::Handle is a handle to an internal property owning Dali object.
+ * @brief Dali::Handle is a handle to an internal property owning Dali object that can have constraints applied to it.
*/
-class Handle : public BaseHandle
+class DALI_IMPORT_API Handle : public BaseHandle
{
public:
*
* @param [in] handle A pointer to a newly allocated Dali resource
*/
- Handle(Dali::Internal::Object* handle);
+ Handle( Dali::Internal::Object* handle );
/**
* @brief This constructor provides an uninitialized Dali::Handle.
Handle();
/**
+ * @brief Create a new object.
+ *
+ * @return A handle to a newly allocated object.
+ */
+ static Handle New();
+
+ /**
* @brief Dali::Handle is intended as a base class
*
* This is non-virtual since derived Handle types must not contain data or virtual methods.
*
* @param [in] handle A reference to the copied handle
*/
- Handle(const Handle& handle);
+ Handle( const Handle& handle );
/**
* @brief This assignment operator is required for (smart) pointer semantics.
* @param [in] rhs A reference to the copied handle
* @return A reference to this
*/
- Handle& operator=(const Handle& rhs);
-
- /**
- * @brief This method is defined to allow assignment of the NULL value,
- * and will throw an exception if passed any other value.
- *
- * Assigning to NULL is an alias for Reset().
- * @param [in] rhs A NULL pointer
- * @return A reference to this handle
- */
- Handle& operator=(BaseHandle::NullType* rhs);
+ Handle& operator=( const Handle& rhs );
/**
* @brief Downcast to a handle.
*/
static Handle DownCast( BaseHandle handle );
-public:
-
/**
* @brief Query whether an handle supports a given capability.
*
* @param[in] capability The queried capability.
* @return True if the capability is supported.
*/
- bool Supports(Capability capability) const;
+ bool Supports( Capability capability ) const;
+
+ // Properties
/**
* @brief Query how many properties are provided by an handle.
* @param [in] index The index of the property.
* @return The name of the property.
*/
- const std::string& GetPropertyName(Property::Index index) const;
+ std::string GetPropertyName( Property::Index index ) const;
/**
* @brief Query the index of a property.
+ * Returns the first property index that matches the given name exactly.
*
* @param [in] name The name of the property.
* @return The index of the property, or Property::INVALID_INDEX if no property exists with the given name.
*/
- Property::Index GetPropertyIndex(std::string name) const;
+ Property::Index GetPropertyIndex( const std::string& name ) const;
/**
* @brief Query whether a property can be set using SetProperty().
* @param [in] index The index of the property.
* @return True if the property is writable.
*/
- bool IsPropertyWritable(Property::Index index) const;
+ bool IsPropertyWritable( Property::Index index ) const;
/**
* @brief Query whether a writable property can be the target of an animation or constraint.
* @param [in] index The index of the property.
* @return True if the property is animatable.
*/
- bool IsPropertyAnimatable(Property::Index index) const;
+ bool IsPropertyAnimatable( Property::Index index ) const;
/**
* @brief Query whether a property can be used as in input to a constraint.
* @param [in] index The index of the property.
* @return True if the property can be used as a constraint input.
*/
- bool IsPropertyAConstraintInput(Property::Index index) const;
+ bool IsPropertyAConstraintInput( Property::Index index ) const;
/**
* @brief Query the type of a property.
* @param [in] index The index of the property.
* @return The type of the property.
*/
- Property::Type GetPropertyType(Property::Index index) const;
+ Property::Type GetPropertyType( Property::Index index ) const;
/**
* @brief Set the value of an existing property.
*
- * @pre Handle::IsPropertyWritable(index) returns true.
+ * Property should be write-able. Setting a read-only property is a no-op.
* @pre The property types match i.e. propertyValue.GetType() is equal to GetPropertyType(index).
* @param [in] index The index of the property.
* @param [in] propertyValue The new value of the property.
*/
- void SetProperty(Property::Index index, Property::Value propertyValue);
+ void SetProperty( Property::Index index, const Property::Value& propertyValue );
/**
- * @brief Register a new property.
+ * @brief Register a new animatable property.
*
- * @pre The handle supports dynamic properties i.e. Supports(Handle::DYNAMIC_PROPERTIES) returns true.
- * @pre name is unused i.e. GetPropertyIndex(name) returns PropertyIndex::INVALID.
+ * @pre The object supports dynamic properties i.e. Supports(Handle::DYNAMIC_PROPERTIES) returns true.
+ * Property names are expected to be unique, but this is not enforced.
+ * Property indices are unique to each registered custom property in a given object.
+ * returns Property::INVALID_INDEX if registration failed. This can happen if you try to register
+ * animatable property on an object that does not have scene graph object.
+ * @note Only the following types can be animated:
+ * - Property::BOOLEAN
+ * - Property::FLOAT
+ * - Property::INTEGER
+ * - Property::VECTOR2
+ * - Property::VECTOR3
+ * - Property::VECTOR4
+ * - Property::MATRIX3
+ * - Property::MATRIX
+ * - Property::ROTATION
* @param [in] name The name of the property.
* @param [in] propertyValue The new value of the property.
- * @return The index of the property
+ * @return The index of the property or Property::INVALID_INDEX if registration failed
*/
- Property::Index RegisterProperty(std::string name, Property::Value propertyValue);
+ Property::Index RegisterProperty( const std::string& name, const Property::Value& propertyValue );
/**
* @brief Register a new property.
* Properties can be set as non animatable using property attributes.
* @pre The handle supports dynamic properties i.e. Supports(Handle::DYNAMIC_PROPERTIES) returns true.
* @pre name is unused i.e. GetPropertyIndex(name) returns PropertyIndex::INVALID.
+ * @note Only the following types can be animated:
+ * - Property::BOOLEAN
+ * - Property::FLOAT
+ * - Property::INTEGER
+ * - Property::VECTOR2
+ * - Property::VECTOR3
+ * - Property::VECTOR4
+ * - Property::MATRIX3
+ * - Property::MATRIX
+ * - Property::ROTATION
* @param [in] name The name of the property.
* @param [in] propertyValue The new value of the property.
* @param [in] accessMode The property access mode (writable, animatable etc).
* @return The index of the property
*/
- Property::Index RegisterProperty(std::string name, Property::Value propertyValue, Property::AccessMode accessMode);
+ Property::Index RegisterProperty( const std::string& name, const Property::Value& propertyValue, Property::AccessMode accessMode );
/**
* @brief Retrieve a property value.
* @param [in] index The index of the property.
* @return The property value.
*/
- Property::Value GetProperty(Property::Index index) const;
+ Property::Value GetProperty( Property::Index index ) const;
/**
* @brief Convenience function for obtaining a property of a known type.
* @return The property value.
*/
template <typename T>
- T GetProperty(Property::Index index) const
+ T GetProperty( Property::Index index ) const
{
Property::Value value = GetProperty(index);
*
* @return A handle to the newly created PropertyNotification
*/
- PropertyNotification AddPropertyNotification(Property::Index index,
- const PropertyCondition& condition);
+ PropertyNotification AddPropertyNotification( Property::Index index,
+ const PropertyCondition& condition );
/**
* @brief Add a property notification to this object.
*
* @return A handle to the newly created PropertyNotification
*/
- PropertyNotification AddPropertyNotification(Property::Index index,
- int componentIndex,
- const PropertyCondition& condition);
+ PropertyNotification AddPropertyNotification( Property::Index index,
+ int componentIndex,
+ const PropertyCondition& condition );
/**
* @brief Remove a property notification from this object.
*
* @param [in] propertyNotification The propertyNotification to be removed.
*/
- void RemovePropertyNotification(Dali::PropertyNotification propertyNotification);
+ void RemovePropertyNotification( Dali::PropertyNotification propertyNotification );
/**
* @brief Remove all property notifications from this object.
*/
void RemovePropertyNotifications();
+ // Constraints
+
+ /**
+ * @brief Constrain one of the properties of an Actor.
+ *
+ * @note The constraint will be copied by the Actor. This means that modifying the apply-time etc.
+ * of the constraint, will not affect actors which are already being constrained.
+ * @pre The Actor has been initialized.
+ * @param[in] constraint The constraint to apply.
+ * @return The active-constraint being applied to the actor.
+ */
+ ActiveConstraint ApplyConstraint( Constraint constraint );
+
+ /**
+ * @brief Constrain one of the properties of an Actor, using a custom weight property.
+ *
+ * This overload is intended to allow a single weight property to be shared by many constraints
+ * e.g. call WeightObject::New() once, and pass the return value into every call to ApplyConstraint().
+ * @pre The Actor has been initialized.
+ * @param[in] constraint The constraint to apply.
+ * @param[in] weightObject An object which is expected to have a float property named "weight".
+ * @return The active-constraint being applied to the actor.
+ */
+ ActiveConstraint ApplyConstraint( Constraint constraint, Handle weightObject );
+
+ /**
+ * @brief Remove one constraint from an Object.
+ *
+ * @pre The Object has been initialized.
+ * @param[in] activeConstraint The active-constraint to remove.
+ */
+ void RemoveConstraint( ActiveConstraint activeConstraint );
+
+ /**
+ * @brief Remove all constraints from an Object.
+ *
+ * @pre The object has been initialized.
+ */
+ void RemoveConstraints();
+
+ /**
+ * @brief Remove all the constraint from the Object with a matching tag.
+ *
+ * @pre The Object has been intialized.
+ * @param[in] tag The tag of the constraints which will be removed
+ */
+ void RemoveConstraints( unsigned int tag );
};
+namespace WeightObject
+{
+
+DALI_IMPORT_API extern const Property::Index WEIGHT; ///< name "weight", type FLOAT
+
+/**
+ * @brief Convenience function to create an object with a custom "weight" property.
+ *
+ * @return A handle to a newly allocated object.
+ */
+DALI_IMPORT_API Handle New();
+
+} // namespace WeightObject
+
} // namespace Dali
#endif // __DALI_HANDLE_H__