Dali 3D User Interface Engine
constraint-base.cpp
Go to the documentation of this file.
1 /*
2  * Copyright (c) 2014 Samsung Electronics Co., Ltd.
3  *
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
7  *
8  * http://www.apache.org/licenses/LICENSE-2.0
9  *
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.
15  *
16  */
17 
18 // CLASS HEADER
20 
21 // INTERNAL INCLUDES
30 
32 
33 namespace Dali
34 {
35 
36 namespace Internal
37 {
38 
39 ConstraintBase::ConstraintBase( Object& object, Property::Index targetPropertyIndex, SourceContainer& sources )
40 : mEventThreadServices( *Stage::GetCurrent() ),
41  mTargetObject( &object ),
42  mSceneGraphConstraint( NULL ),
43  mSources( sources ),
44  mObservedObjects(),
45  mTargetPropertyIndex( targetPropertyIndex ),
46  mRemoveAction( Dali::Constraint::DEFAULT_REMOVE_ACTION ),
47  mTag( 0 ),
48  mApplied( false ),
49  mSourceDestroyed( false )
50 {
51  ObserveObject( object );
52 }
53 
55 {
57 
59 }
60 
62 {
63  mSources.push_back( source );
64 
65  // Observe the object providing this property
66  if ( OBJECT_PROPERTY == source.sourceType )
67  {
68  if ( source.object != NULL )
69  {
70  ObserveObject( *source.object );
71  }
72  else
73  {
74  DALI_LOG_ERROR( "Constraint source object not found" );
75  }
76  }
77 }
78 
80 {
82  {
83  mApplied = true;
85 
87  }
88 }
89 
91 {
93 
94  if( mTargetObject )
95  {
97  }
98 }
99 
101 {
102  if ( mApplied )
103  {
104  mApplied = false;
105 
106  // Guard against constraint sending messages during core destruction
107  if( Stage::IsInstalled() )
108  {
109  const SceneGraph::PropertyOwner* propertyOwner = mTargetObject ? mTargetObject->GetSceneObject() : NULL;
110 
111  if ( propertyOwner &&
113  {
114  // Remove from scene-graph
116 
117  // mSceneGraphConstraint will be deleted in update-thread, remove dangling pointer
118  mSceneGraphConstraint = NULL;
119  }
120  }
121  }
122 }
123 
125 {
126  return mTargetObject;
127 }
128 
130 {
131  return Dali::Handle( mTargetObject );
132 }
133 
135 {
136  return mTargetPropertyIndex;
137 }
138 
140 {
141  mRemoveAction = action;
142 }
143 
145 {
146  return mRemoveAction;
147 }
148 
149 void ConstraintBase::SetTag(const unsigned int tag)
150 {
151  mTag = tag;
152 }
153 
154 unsigned int ConstraintBase::GetTag() const
155 {
156  return mTag;
157 }
158 
160 {
161  if ( mApplied &&
162  ( NULL == mSceneGraphConstraint ) &&
163  mTargetObject )
164  {
166  }
167 }
168 
170 {
171  if ( mSceneGraphConstraint )
172  {
173  // An input property owning source has been deleted, need to tell the scene-graph-constraint owner to remove it
174  if ( &object != mTargetObject )
175  {
176  const SceneGraph::PropertyOwner* propertyOwner = mTargetObject ? mTargetObject->GetSceneObject() : NULL;
177 
178  if( propertyOwner )
179  {
180  // Remove from scene-graph
182  }
183  }
184 
185  // mSceneGraphConstraint will be deleted in update-thread, remove dangling pointer
186  mSceneGraphConstraint = NULL;
187  }
188 }
189 
191 {
192  // Remove object pointer from observation set
193  ObjectIter iter = std::find( mObservedObjects.Begin(), mObservedObjects.End(), &object );
195  mObservedObjects.Erase( iter );
196 
197  // Constraint is not useful anymore as an input-source has been destroyed
198  mSourceDestroyed = true;
199 
200  // Stop observing the remaining objects
201  StopObservation();
202 
203  // Clear our sources as well
204  mSources.clear();
205 
206  // Discard all object & scene-graph pointers
207  mSceneGraphConstraint = NULL;
208  mTargetObject = NULL;
209 }
210 
212 {
213  ObjectIter iter = std::find( mObservedObjects.Begin(), mObservedObjects.End(), &object );
214  if ( mObservedObjects.End() == iter )
215  {
216  object.AddObserver( *this );
217  mObservedObjects.PushBack( &object );
218  }
219 }
220 
222 {
223  const ObjectIter end = mObservedObjects.End();
224  for( ObjectIter iter = mObservedObjects.Begin(); iter != end; ++iter )
225  {
226  (*iter)->RemoveObserver( *this );
227  }
228 
230 }
231 
232 } // namespace Internal
233 
234 } // namespace Dali
Dali Docs Home
Read more about Dali