Merge "Allow multiple renderers per Actor and sharing renderers between actors" into...
[platform/core/uifw/dali-core.git] / dali / public-api / signals / slot-delegate.h
1 #ifndef __DALI_SLOT_DELEGATE_H__
2 #define __DALI_SLOT_DELEGATE_H__
3
4 /*
5  * Copyright (c) 2015 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/common/dali-common.h>
23 #include <dali/public-api/signals/connection-tracker.h>
24
25 namespace Dali
26 {
27 /**
28  * @addtogroup dali_core_signals
29  * @{
30  */
31
32 /**
33  * @brief SlotDelegates can be used to connect member functions to signals, without inheriting from SlotDelegateInterface.
34  *
35  * Note that the object providing the member function is expected to own the SlotDelegate; therefore when the object
36  * is destroyed, the SlotDelegate destructor will automatically disconnect.
37  *
38  * @code
39  *
40  * class Example // This does not inherit from SlotDelegateInterface!
41  * {
42  * public:
43  *
44  *   Example()
45  *   : mSlotDelegate( this )
46  *   {
47  *   }
48  *
49  *   ~Example()
50  *   {
51  *     // mSlotDelegate disconnects automatically here
52  *   }
53  *
54  *   void Animate()
55  *   {
56  *     Animation animation = Animation::New( 1.0f );
57  *     animation.FinishedSignal().Connect( mSlotDelegate, &Example::OnAnimationFinished );
58  *     animation.Play(); // fire & forget
59  *   }
60  *
61  *   void OnAnimationFinished( Animation& animation )
62  *   {
63  *     std::cout << "Animation Finished!" << std::endl;
64  *   }
65  *
66  * private:
67  *
68  *  SlotDelegate<Example> mSlotDelegate;
69  *
70  * };
71  *
72  * @endcode
73  */
74 template <typename Slot>
75 class SlotDelegate
76 {
77 public:
78
79   /**
80    * @brief Constructor.
81    *
82    * @param[in] slot The object with a callback.
83    */
84   SlotDelegate( Slot* slot )
85   : mSlot( slot )
86   {
87   }
88
89   /**
90    * @brief Non-virtual destructor.
91    *
92    */
93   ~SlotDelegate()
94   {
95   }
96
97   /**
98    * @brief Disconnect all signals from this object.
99    *
100    */
101   void DisconnectAll()
102   {
103     mConnectionTracker.DisconnectAll();
104   }
105
106   /**
107    * @copydoc ConnectionTracker::GetConnectionCount
108    */
109   std::size_t GetConnectionCount() const
110   {
111     return mConnectionTracker.GetConnectionCount();
112   }
113
114   /**
115    * @brief Retrieve the slot object.
116    *
117    * @return The object with a callback.
118    */
119   Slot* GetSlot()
120   {
121     return mSlot;
122   }
123
124   /**
125    * @brief Retrieve the connection tracker component.
126    *
127    * @return The connection tracker component.
128    */
129   ConnectionTracker* GetConnectionTracker()
130   {
131     return &mConnectionTracker;
132   }
133
134 private:
135
136   SlotDelegate( const SlotDelegate& );            ///< undefined copy constructor
137   SlotDelegate& operator=( const SlotDelegate& ); ///< undefined assignment operator
138
139 private:
140
141   Slot* mSlot; ///< The slot object
142
143   // Use composition instead of inheritance (virtual methods don't mix well with templates)
144   ConnectionTracker mConnectionTracker; ///< A connection tracker
145 };
146
147 /**
148  * @}
149  */
150 } // namespace Dali
151
152 #endif // __DALI_SLOT_DELEGATE_H__