2 * Copyright (c) 2018 Samsung Electronics Co., Ltd.
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
8 * http://www.apache.org/licenses/LICENSE-2.0
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
19 #include <dali/internal/event/animation/constraint-base.h>
22 #include <dali/public-api/object/handle.h>
23 #include <dali/public-api/object/type-registry.h>
24 #include <dali/internal/event/common/event-thread-services.h>
25 #include <dali/internal/event/common/property-helper.h>
26 #include <dali/internal/event/common/stage-impl.h>
27 #include <dali/internal/update/animation/scene-graph-constraint-base.h>
28 #include <dali/internal/update/common/animatable-property.h>
29 #include <dali/internal/update/common/property-owner-messages.h>
31 using Dali::Internal::SceneGraph::AnimatableProperty;
39 ConstraintBase::ConstraintBase( Object& object, Property::Index targetPropertyIndex, SourceContainer& sources )
40 : mEventThreadServices( *Stage::GetCurrent() ),
41 mTargetObject( &object ),
42 mSceneGraphConstraint( NULL ),
45 mTargetPropertyIndex( targetPropertyIndex ),
46 mRemoveAction( Dali::Constraint::DEFAULT_REMOVE_ACTION ),
49 mSourceDestroyed( false )
51 ObserveObject( object );
54 ConstraintBase::~ConstraintBase()
61 void ConstraintBase::AddSource( Source source )
63 mSources.push_back( source );
65 // Observe the object providing this property
66 if ( OBJECT_PROPERTY == source.sourceType )
68 if ( source.object != NULL )
70 ObserveObject( *source.object );
74 DALI_LOG_ERROR( "Constraint source object not found\n" );
79 void ConstraintBase::Apply()
81 if ( mTargetObject && !mApplied && !mSourceDestroyed )
86 mTargetObject->ApplyConstraint( *this );
90 void ConstraintBase::Remove()
96 mTargetObject->RemoveConstraint( *this );
100 void ConstraintBase::RemoveInternal()
106 // Guard against constraint sending messages during core destruction
107 if( Stage::IsInstalled() )
109 if( mTargetObject && mSceneGraphConstraint )
111 const SceneGraph::PropertyOwner& propertyOwner = mTargetObject->GetSceneObject();
112 // Remove from scene-graph
113 RemoveConstraintMessage( GetEventThreadServices(), propertyOwner, *(mSceneGraphConstraint) );
114 // mSceneGraphConstraint will be deleted in update-thread, remove dangling pointer
115 mSceneGraphConstraint = NULL;
121 Object* ConstraintBase::GetParent()
123 return mTargetObject;
126 Dali::Handle ConstraintBase::GetTargetObject()
128 return Dali::Handle( mTargetObject );
131 Property::Index ConstraintBase::GetTargetProperty()
133 return mTargetPropertyIndex;
136 void ConstraintBase::SetRemoveAction( ConstraintBase::RemoveAction action )
138 mRemoveAction = action;
141 ConstraintBase::RemoveAction ConstraintBase::GetRemoveAction() const
143 return mRemoveAction;
146 void ConstraintBase::SetTag( uint32_t tag )
151 uint32_t ConstraintBase::GetTag() const
156 void ConstraintBase::SceneObjectAdded( Object& object )
159 ( NULL == mSceneGraphConstraint ) &&
166 void ConstraintBase::SceneObjectRemoved( Object& object )
168 if ( mSceneGraphConstraint )
170 // An input property owning source has been deleted, need to tell the scene-graph-constraint owner to remove it
171 if ( &object != mTargetObject )
175 const SceneGraph::PropertyOwner& propertyOwner = mTargetObject->GetSceneObject();
176 // Remove from scene-graph
177 RemoveConstraintMessage( GetEventThreadServices(), propertyOwner, *(mSceneGraphConstraint) );
181 // mSceneGraphConstraint will be deleted in update-thread, remove dangling pointer
182 mSceneGraphConstraint = NULL;
186 void ConstraintBase::ObjectDestroyed( Object& object )
188 // Remove object pointer from observation set
189 ObjectIter iter = std::find( mObservedObjects.Begin(), mObservedObjects.End(), &object );
190 DALI_ASSERT_DEBUG( mObservedObjects.End() != iter );
191 mObservedObjects.Erase( iter );
193 // Constraint is not useful anymore as an input-source has been destroyed
194 mSourceDestroyed = true;
196 // Stop observing the remaining objects
199 // Clear our sources as well
202 // Discard all object & scene-graph pointers
203 mSceneGraphConstraint = NULL;
204 mTargetObject = NULL;
207 void ConstraintBase::ObserveObject( Object& object )
209 ObjectIter iter = std::find( mObservedObjects.Begin(), mObservedObjects.End(), &object );
210 if ( mObservedObjects.End() == iter )
212 object.AddObserver( *this );
213 mObservedObjects.PushBack( &object );
217 void ConstraintBase::StopObservation()
219 const ObjectIter end = mObservedObjects.End();
220 for( ObjectIter iter = mObservedObjects.Begin(); iter != end; ++iter )
222 (*iter)->RemoveObserver( *this );
225 mObservedObjects.Clear();
228 } // namespace Internal