Revert "[Tizen] Add codes for Dali Windows Backend"
[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  * @SINCE_1_0.0
74  */
75 template <typename Slot>
76 class SlotDelegate
77 {
78 public:
79
80   /**
81    * @brief Constructor.
82    *
83    * @SINCE_1_0.0
84    * @param[in] slot The object with a callback
85    */
86   SlotDelegate( Slot* slot )
87   : mSlot( slot )
88   {
89   }
90
91   /**
92    * @brief Non-virtual destructor.
93    *
94    * @SINCE_1_0.0
95    */
96   ~SlotDelegate()
97   {
98   }
99
100   /**
101    * @brief Disconnects all signals from this object.
102    *
103    * @SINCE_1_0.0
104    */
105   void DisconnectAll()
106   {
107     mConnectionTracker.DisconnectAll();
108   }
109
110   /**
111    * @copydoc ConnectionTracker::GetConnectionCount
112    */
113   std::size_t GetConnectionCount() const
114   {
115     return mConnectionTracker.GetConnectionCount();
116   }
117
118   /**
119    * @brief Retrieves the slot object.
120    *
121    * @SINCE_1_0.0
122    * @return The object with a callback
123    */
124   Slot* GetSlot()
125   {
126     return mSlot;
127   }
128
129   /**
130    * @brief Retrieves the connection tracker component.
131    *
132    * @SINCE_1_0.0
133    * @return The connection tracker component
134    */
135   ConnectionTracker* GetConnectionTracker()
136   {
137     return &mConnectionTracker;
138   }
139
140 private:
141
142   SlotDelegate( const SlotDelegate& );            ///< undefined copy constructor @SINCE_1_0.0
143   SlotDelegate& operator=( const SlotDelegate& ); ///< undefined assignment operator @SINCE_1_0.0
144
145 private:
146
147   Slot* mSlot; ///< The slot object
148
149   // Use composition instead of inheritance (virtual methods don't mix well with templates)
150   ConnectionTracker mConnectionTracker; ///< A connection tracker
151 };
152
153 /**
154  * @}
155  */
156 } // namespace Dali
157
158 #endif // __DALI_SLOT_DELEGATE_H__