1 #ifndef DALI_INTERNAL_OBJECT_IMPL_HELPER_H
2 #define DALI_INTERNAL_OBJECT_IMPL_HELPER_H
5 * Copyright (c) 2018 Samsung Electronics Co., Ltd.
7 * Licensed under the Apache License, Version 2.0 (the "License");
8 * you may not use this file except in compliance with the License.
9 * You may obtain a copy of the License at
11 * http://www.apache.org/licenses/LICENSE-2.0
13 * Unless required by applicable law or agreed to in writing, software
14 * distributed under the License is distributed on an "AS IS" BASIS,
15 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16 * See the License for the specific language governing permissions and
17 * limitations under the License.
25 #include <dali/public-api/object/property.h> // Dali::Property
26 #include <dali/public-api/object/property-index-ranges.h> // DEFAULT_DERIVED_HANDLE_PROPERTY_START_INDEX
27 #include <dali/internal/event/common/property-helper.h> // Dali::Internal::PropertyDetails
28 #include <dali/internal/event/common/stage-impl.h>
29 #include <dali/internal/update/common/animatable-property.h>
30 #include <dali/internal/update/common/property-owner-messages.h>
31 #include <dali/internal/update/manager/update-manager.h>
37 class PropertyMetadata;
38 class AnimatablePropertyMetadata;
39 class CustomPropertyMetadata;
40 class PropertyInputImpl;
49 } // namespace SceneGraph
51 // Typedefs to allow object methods to be passed via parameter
52 typedef AnimatablePropertyMetadata* (Object::*FindAnimatablePropertyMethod)( Property::Index index ) const;
53 typedef CustomPropertyMetadata* (Object::*FindCustomPropertyMethod)( Property::Index index ) const;
57 * Helper template class to be used by class that implement Object
61 * typename ObjectImplHelper<DEFAULT_PROPERTY_COUNT, DEFAULT_PROPERTY_DETAILS> MyObjectImpl;
63 * MyObjectImpl::GetDefaultPropertyCount();
66 template<int DEFAULT_PROPERTY_COUNT>
67 struct ObjectImplHelper
69 const PropertyDetails* DEFAULT_PROPERTY_DETAILS;
70 const int DEFAULT_PROPERTY_START_INDEX;
72 unsigned int GetDefaultPropertyCount() const
74 return DEFAULT_PROPERTY_COUNT;
77 void GetDefaultPropertyIndices( Property::IndexContainer& indices ) const
79 indices.Reserve( DEFAULT_PROPERTY_COUNT );
81 for( int i = 0; i < DEFAULT_PROPERTY_COUNT; ++i )
83 indices.PushBack( DEFAULT_PROPERTY_START_INDEX + i );
87 const char* GetDefaultPropertyName( Property::Index index ) const
89 const char* name = NULL;
91 if( index >= DEFAULT_PROPERTY_START_INDEX && index < DEFAULT_PROPERTY_START_INDEX + DEFAULT_PROPERTY_MAX_COUNT )
93 name = DEFAULT_PROPERTY_DETAILS[index - DEFAULT_PROPERTY_START_INDEX].name;
99 Property::Index GetDefaultPropertyIndex( const std::string& name ) const
101 Property::Index index = Property::INVALID_INDEX;
103 // Look for name in default properties
104 for( int i = 0; i < DEFAULT_PROPERTY_COUNT; ++i )
106 const Internal::PropertyDetails* property = &DEFAULT_PROPERTY_DETAILS[ i ];
107 if( 0 == strcmp( name.c_str(), property->name ) ) // dont want to convert rhs to string
117 bool IsDefaultPropertyWritable( Property::Index index ) const
119 bool isWritable = false;
121 if( index >= DEFAULT_PROPERTY_START_INDEX && index < DEFAULT_PROPERTY_START_INDEX + DEFAULT_PROPERTY_MAX_COUNT )
123 isWritable = DEFAULT_PROPERTY_DETAILS[index - DEFAULT_PROPERTY_START_INDEX].writable;
129 bool IsDefaultPropertyAnimatable( Property::Index index ) const
131 bool isAnimatable = false;
133 if( index >= DEFAULT_PROPERTY_START_INDEX && index < DEFAULT_PROPERTY_START_INDEX + DEFAULT_PROPERTY_MAX_COUNT )
135 isAnimatable = DEFAULT_PROPERTY_DETAILS[index - DEFAULT_PROPERTY_START_INDEX].animatable;
141 bool IsDefaultPropertyAConstraintInput( Property::Index index ) const
143 bool isConstraintInput = false;
145 if( index >= DEFAULT_PROPERTY_START_INDEX && index < DEFAULT_PROPERTY_START_INDEX + DEFAULT_PROPERTY_MAX_COUNT )
147 isConstraintInput = DEFAULT_PROPERTY_DETAILS[index - DEFAULT_PROPERTY_START_INDEX].constraintInput;
150 return isConstraintInput;
153 Property::Type GetDefaultPropertyType( Property::Index index ) const
155 Property::Type type = Property::NONE;
157 if( index >= DEFAULT_PROPERTY_START_INDEX && index < DEFAULT_PROPERTY_START_INDEX + DEFAULT_PROPERTY_MAX_COUNT )
159 type = DEFAULT_PROPERTY_DETAILS[index - DEFAULT_PROPERTY_START_INDEX].type;
165 // Get the (animatable) scene graph property. (All registered scene graph properties are animatable)
166 const SceneGraph::PropertyBase* GetRegisteredSceneGraphProperty(
167 const Object* object,
168 FindAnimatablePropertyMethod findAnimatablePropertyMethod,
169 FindCustomPropertyMethod findCustomPropertyMethod,
170 Property::Index index ) const
172 const SceneGraph::PropertyBase* property = NULL;
173 if ( index >= ANIMATABLE_PROPERTY_REGISTRATION_START_INDEX && index <= ANIMATABLE_PROPERTY_REGISTRATION_MAX_INDEX )
175 AnimatablePropertyMetadata* animatable = (object->*findAnimatablePropertyMethod)( index );
176 DALI_ASSERT_ALWAYS( animatable && "Property index is invalid" );
177 property = animatable->GetSceneGraphProperty();
179 else if ( ( index > CHILD_PROPERTY_REGISTRATION_START_INDEX ) && // Child properties are also stored as custom properties
180 ( index <= PROPERTY_CUSTOM_MAX_INDEX ) )
182 CustomPropertyMetadata* custom = (object->*findCustomPropertyMethod)( index );
183 DALI_ASSERT_ALWAYS( custom && "Property index is invalid" );
184 property = custom->GetSceneGraphProperty();
189 void SetSceneGraphProperty( EventThreadServices& eventThreadServices,
190 const Object* object,
191 Property::Index index,
192 const PropertyMetadata& entry,
193 const Property::Value& value ) const
195 const SceneGraph::PropertyOwner* sceneObject = object->GetSceneObject();
197 switch ( entry.GetType() )
199 case Property::BOOLEAN:
201 const SceneGraph::AnimatableProperty<bool>* property = dynamic_cast< const SceneGraph::AnimatableProperty<bool>* >( entry.GetSceneGraphProperty() );
202 DALI_ASSERT_DEBUG( NULL != property );
204 // property is being used in a separate thread; queue a message to set the property
205 SceneGraph::AnimatablePropertyMessage<bool>::Send( eventThreadServices, sceneObject, property, &SceneGraph::AnimatableProperty<bool>::Bake, value.Get<bool>() );
210 case Property::FLOAT:
212 const SceneGraph::AnimatableProperty<float>* property = dynamic_cast< const SceneGraph::AnimatableProperty<float>* >( entry.GetSceneGraphProperty() );
213 DALI_ASSERT_DEBUG( NULL != property );
215 // property is being used in a separate thread; queue a message to set the property
216 SceneGraph::AnimatablePropertyMessage<float>::Send( eventThreadServices, sceneObject, property, &SceneGraph::AnimatableProperty<float>::Bake, value.Get<float>() );
221 case Property::INTEGER:
223 const SceneGraph::AnimatableProperty<int>* property = dynamic_cast< const SceneGraph::AnimatableProperty<int>* >( entry.GetSceneGraphProperty() );
224 DALI_ASSERT_DEBUG( NULL != property );
226 // property is being used in a separate thread; queue a message to set the property
227 SceneGraph::AnimatablePropertyMessage<int>::Send( eventThreadServices, sceneObject, property, &SceneGraph::AnimatableProperty<int>::Bake, value.Get<int>() );
232 case Property::VECTOR2:
234 const SceneGraph::AnimatableProperty<Vector2>* property = dynamic_cast< const SceneGraph::AnimatableProperty<Vector2>* >( entry.GetSceneGraphProperty() );
235 DALI_ASSERT_DEBUG( NULL != property );
237 // property is being used in a separate thread; queue a message to set the property
238 SceneGraph::AnimatablePropertyMessage<Vector2>::Send( eventThreadServices, sceneObject, property, &SceneGraph::AnimatableProperty<Vector2>::Bake, value.Get<Vector2>() );
243 case Property::VECTOR3:
245 const SceneGraph::AnimatableProperty<Vector3>* property = dynamic_cast< const SceneGraph::AnimatableProperty<Vector3>* >( entry.GetSceneGraphProperty() );
246 DALI_ASSERT_DEBUG( NULL != property );
248 // property is being used in a separate thread; queue a message to set the property
249 SceneGraph::AnimatablePropertyMessage<Vector3>::Send( eventThreadServices, sceneObject, property, &SceneGraph::AnimatableProperty<Vector3>::Bake, value.Get<Vector3>() );
254 case Property::VECTOR4:
256 const SceneGraph::AnimatableProperty<Vector4>* property = dynamic_cast< const SceneGraph::AnimatableProperty<Vector4>* >( entry.GetSceneGraphProperty() );
257 DALI_ASSERT_DEBUG( NULL != property );
259 // property is being used in a separate thread; queue a message to set the property
260 SceneGraph::AnimatablePropertyMessage<Vector4>::Send( eventThreadServices, sceneObject, property, &SceneGraph::AnimatableProperty<Vector4>::Bake, value.Get<Vector4>() );
265 case Property::ROTATION:
267 const SceneGraph::AnimatableProperty<Quaternion>* property = dynamic_cast< const SceneGraph::AnimatableProperty<Quaternion>* >( entry.GetSceneGraphProperty() );
268 DALI_ASSERT_DEBUG( NULL != property );
270 // property is being used in a separate thread; queue a message to set the property
271 SceneGraph::AnimatablePropertyMessage<Quaternion>::Send( eventThreadServices, sceneObject, property,&SceneGraph::AnimatableProperty<Quaternion>::Bake, value.Get<Quaternion>() );
276 case Property::MATRIX:
278 const SceneGraph::AnimatableProperty<Matrix>* property = dynamic_cast< const SceneGraph::AnimatableProperty<Matrix>* >( entry.GetSceneGraphProperty() );
279 DALI_ASSERT_DEBUG( NULL != property );
281 // property is being used in a separate thread; queue a message to set the property
282 SceneGraph::AnimatablePropertyMessage<Matrix>::Send( eventThreadServices, sceneObject, property,&SceneGraph::AnimatableProperty<Matrix>::Bake, value.Get<Matrix>() );
287 case Property::MATRIX3:
289 const SceneGraph::AnimatableProperty<Matrix3>* property = dynamic_cast< const SceneGraph::AnimatableProperty<Matrix3>* >( entry.GetSceneGraphProperty() );
290 DALI_ASSERT_DEBUG( NULL != property );
292 // property is being used in a separate thread; queue a message to set the property
293 SceneGraph::AnimatablePropertyMessage<Matrix3>::Send( eventThreadServices, sceneObject, property, &SceneGraph::AnimatableProperty<Matrix3>::Bake, value.Get<Matrix3>() );
300 // ignore non-scene-graph types
308 } // namespace Internal
312 #endif // DALI_INTERNAL_OBJECT_IMPL_HELPER_H