Use modern construct 'using' instead of typedef.
[platform/core/uifw/dali-core.git] / dali / internal / event / animation / constraint-base.h
1 #ifndef DALI_INTERNAL_ACTIVE_CONSTRAINT_BASE_H
2 #define DALI_INTERNAL_ACTIVE_CONSTRAINT_BASE_H
3
4 /*
5  * Copyright (c) 2019 Samsung Electronics Co., Ltd.
6  *
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
10  *
11  * http://www.apache.org/licenses/LICENSE-2.0
12  *
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.
18  *
19  */
20
21 // INTERNAL INCLUDES
22 #include <dali/public-api/animation/constraint.h>
23 #include <dali/public-api/common/dali-common.h>
24 #include <dali/public-api/object/base-object.h>
25 #include <dali/internal/common/owner-pointer.h>
26 #include <dali/internal/event/animation/constraint-source-impl.h>
27 #include <dali/internal/update/animation/scene-graph-constraint-base.h>
28
29 namespace Dali
30 {
31
32 namespace Internal
33 {
34
35 class EventThreadServices;
36 class Object;
37 using ObjectContainer = Dali::Vector<Object*>;
38 using ObjectIter      = ObjectContainer::Iterator;
39
40 namespace SceneGraph
41 {
42 class ConstraintBase;
43
44 template <typename T>
45 class AnimatableProperty;
46 }
47
48 /**
49  * An abstract base class for active constraints.
50  */
51 class ConstraintBase : public BaseObject, public Object::Observer
52 {
53 public:
54   using RemoveAction = Dali::Constraint::RemoveAction;
55
56   /**
57    * Constructor.
58    * @param[in] object The property owning object.
59    * @param[in] messageController Used to send messages to the update-thread.
60    * @param[in] targetPropertyIndex The index of the property being constrained.
61    * @param[in] sources The sources of the input properties.
62    */
63   ConstraintBase( Object& object, Property::Index targetPropertyIndex, SourceContainer& sources );
64
65   /**
66    * Clone this constraint for another object.
67    * @param[in]  object  The object to clone this constraint for
68    * @return A new constraint.
69    */
70   ConstraintBase* Clone( Object& object );
71
72   /**
73    * Virtual destructor.
74    */
75   virtual ~ConstraintBase();
76
77   /**
78    * Adds a constraint source to the constraint
79    *
80    * @param[in] source The constraint source input to add
81    */
82   void AddSource( Source source );
83
84   /**
85    * @copydoc Dali::Constraint::Apply()
86    */
87   void Apply();
88
89   /**
90    * @copydoc Dali::Constraint::Remove()
91    */
92   void Remove();
93
94   /**
95    * Called when the Constraint is removed.
96    *
97    * @note This removes the scene-object as well but then does not call back into the target-object.
98    */
99   void RemoveInternal();
100
101   /**
102    * Retrieve the parent of the constraint.
103    * @return The parent object, or NULL.
104    */
105   Object* GetParent();
106
107   /**
108    * @copydoc Dali::Constraint::GetTargetObject()
109    */
110   Dali::Handle GetTargetObject();
111
112   /**
113    * @copydoc Dali::Constraint::GetTargetProperty()
114    */
115   Property::Index GetTargetProperty();
116
117   /**
118    * @copydoc Dali::Constraint::SetRemoveAction()
119    */
120   void SetRemoveAction(RemoveAction action);
121
122   /**
123    * @copydoc Dali::Constraint::GetRemoveAction()
124    */
125   RemoveAction GetRemoveAction() const;
126
127   /**
128    * @copydoc Dali::Constraint::SetTag()
129    */
130   void SetTag( uint32_t tag );
131
132   /**
133    * @copydoc Dali::Constraint::GetTag()
134    */
135   uint32_t GetTag() const;
136
137 private: // Object::Observer methods
138
139   /**
140    * @copydoc Object::Observer::SceneObjectAdded()
141    */
142   virtual void SceneObjectAdded( Object& object );
143
144   /**
145    * @copydoc Object::Observer::SceneObjectRemoved()
146    */
147   virtual void SceneObjectRemoved( Object& object );
148
149   /**
150    * @copydoc Object::Observer::ObjectDestroyed()
151    */
152   virtual void ObjectDestroyed( Object& object );
153
154 private:
155
156   /**
157    * Helper to observe an object, if not already observing it
158    */
159   void ObserveObject( Object& object );
160
161   /**
162    * Helper to stop observing objects
163    */
164   void StopObservation();
165
166   // To be implemented in derived classes
167
168   /**
169    * Clone the actual constraint
170    *
171    * @param object to clone to
172    * @return pointer to the clone
173    */
174   virtual ConstraintBase* DoClone( Object& object ) = 0;
175
176   /**
177    * Connect the constraint
178    */
179   virtual void ConnectConstraint() = 0;
180
181 protected:
182
183   /**
184    * Helper to Add an input property to the container of property owners
185    * @param source constraint[in] source used to determine the type and locate the property on the object
186    * @param propertyOwners[out] reference to the container to add
187    * @param componentIndex[out] component index
188    * @return pointer to input property if it was found, nullptr otherwise
189    */
190   PropertyInputImpl* AddInputProperty( Source& source, SceneGraph::PropertyOwnerContainer& propertyOwners, int32_t& componentIndex );
191
192   /**
193    * Get the event thread services object - used for sending messages to the scene graph
194    * Assert if called from the wrong thread.
195    * This is intentionally inline for performance reasons.
196    *
197    * @return The event thread services object
198    */
199   inline EventThreadServices& GetEventThreadServices()
200   {
201     DALI_ASSERT_DEBUG( EventThreadServices::IsCoreRunning() );
202     return mEventThreadServices;
203   }
204
205   /**
206    * Get the event thread services object - used for sending messages to the scene graph
207    * Assert if called from the wrong thread
208    * This is intentionally inline for performance reasons.
209    *
210    * @return The event thread services object
211    */
212   inline const EventThreadServices& GetEventThreadServices() const
213   {
214     DALI_ASSERT_DEBUG( EventThreadServices::IsCoreRunning() );
215     return mEventThreadServices;
216   }
217
218 protected:
219   EventThreadServices& mEventThreadServices;
220   Object* mTargetObject; ///< The object owns the constraint.
221   const SceneGraph::ConstraintBase* mSceneGraphConstraint;
222   SourceContainer mSources;
223   ObjectContainer mObservedObjects; // We don't observe the same object twice
224   Property::Index mTargetPropertyIndex;
225   RemoveAction mRemoveAction;
226   uint32_t mTag;
227   bool mApplied:1; ///< Whether the constraint has been applied
228   bool mSourceDestroyed:1; ///< Is set to true if any of our input source objects are destroyed
229 };
230
231 } // namespace Internal
232
233 // Helpers for public-api forwarding methods
234
235 inline Internal::ConstraintBase& GetImplementation(Dali::Constraint& constraint)
236 {
237   DALI_ASSERT_ALWAYS( constraint && "Constraint handle is empty" );
238
239   BaseObject& handle = constraint.GetBaseObject();
240
241   return static_cast<Internal::ConstraintBase&>(handle);
242 }
243
244 inline const Internal::ConstraintBase& GetImplementation(const Dali::Constraint& constraint)
245 {
246   DALI_ASSERT_ALWAYS( constraint && "Constraint handle is empty" );
247
248   const BaseObject& handle = constraint.GetBaseObject();
249
250   return static_cast<const Internal::ConstraintBase&>(handle);
251 }
252
253 } // namespace Dali
254
255 #endif // DALI_INTERNAL_ACTIVE_CONSTRAINT_BASE_H