Revert "[Tizen] Fix svace issue"
[platform/core/uifw/dali-toolkit.git] / dali-toolkit / internal / transition / transition-set-impl.cpp
1 /*
2  * Copyright (c) 2021 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
19 #include <dali-toolkit/internal/transition/transition-set-impl.h>
20
21 // EXTERNAL INCLUDES
22 #include <dali/integration-api/adaptor-framework/adaptor.h>
23 #include <dali/integration-api/debug.h>
24 #include <dali/public-api/object/type-registry.h>
25
26 namespace Dali
27 {
28 namespace Toolkit
29 {
30 namespace Internal
31 {
32 namespace
33 {
34 // Signals
35 static constexpr std::string_view SIGNAL_FINISHED = "finished";
36
37 BaseHandle Create()
38 {
39   return Dali::Toolkit::TransitionSet::New();
40 }
41
42 TypeRegistration mType(typeid(Dali::Toolkit::TransitionSet), typeid(Dali::BaseHandle), Create);
43
44 SignalConnectorType signalConnector1(mType, std::string(SIGNAL_FINISHED), &TransitionSet::DoConnectSignal);
45
46 } // anonymous namespace
47
48 TransitionSetPtr TransitionSet::New()
49 {
50   TransitionSetPtr transitionSet = new TransitionSet();
51
52   return transitionSet;
53 }
54
55 TransitionSet::TransitionSet()
56 {
57 }
58
59 TransitionSet::~TransitionSet()
60 {
61   mTransitions.clear();
62   mPlaylist.clear();
63 }
64
65 void TransitionSet::AddTransition(TransitionBasePtr transition)
66 {
67   mTransitions.push_back(transition);
68 }
69
70 TransitionBase* TransitionSet::GetTransitionAt(uint32_t index) const
71 {
72   TransitionBase* result(nullptr);
73   if(index < GetTransitionCount())
74   {
75     result = mTransitions[index].Get();
76   }
77   else
78   {
79     DALI_LOG_ERROR("Error: Invalid index to TextureSet::GetTexture\n");
80   }
81
82   return result;
83 }
84
85 uint32_t TransitionSet::GetTransitionCount() const
86 {
87   return mTransitions.size();
88 }
89
90 void TransitionSet::QueueToPlay()
91 {
92   for(auto&& transition : mTransitions)
93   {
94     transition->SetPlay(Dali::Toolkit::TransitionSet(this));
95   }
96
97   Adaptor::Get().RegisterProcessor(*this, true);
98   Adaptor::Get().RegisterProcessor(*this, false);
99 }
100
101 void TransitionSet::TransitionPreProcess()
102 {
103   float lastDuration = 0.0f;
104   for(auto&& transition : mTransitions)
105   {
106     if(lastDuration <= transition->GetDuration() + transition->GetDelay())
107     {
108       lastDuration = transition->GetDuration() + transition->GetDelay();
109     }
110   }
111   mAnimation = Dali::Animation::New(lastDuration);
112
113   for(auto&& transition : mTransitions)
114   {
115     transition->PreProcess(mAnimation);
116   }
117 }
118
119 void TransitionSet::TransitionStart()
120 {
121   mPlaylist.clear();
122   for(auto&& transition : mTransitions)
123   {
124     mPlaylist.push_back(transition);
125     transition->Play();
126   }
127
128   mAnimation.FinishedSignal().Connect(this, &TransitionSet::TransitionFinished);
129   mAnimation.Play();
130 }
131
132 void TransitionSet::TransitionFinished(Dali::Animation& source)
133 {
134   for(auto&& transition : mTransitions)
135   {
136     transition->TransitionFinished();
137   }
138
139   mPlaylist.clear();
140   EmitSignalFinish();
141 }
142
143 Dali::Toolkit::TransitionSet::TransitionSetSignalType& TransitionSet::FinishedSignal()
144 {
145   return mFinishedSignal;
146 }
147
148 void TransitionSet::EmitSignalFinish()
149 {
150   if(!mFinishedSignal.Empty())
151   {
152     Dali::Toolkit::TransitionSet handle(this);
153     mFinishedSignal.Emit(handle);
154   }
155 }
156
157 bool TransitionSet::DoConnectSignal(BaseObject* object, ConnectionTrackerInterface* tracker, const std::string& signalName, FunctorDelegate* functor)
158 {
159   bool           connected(false);
160   TransitionSet* transitionSet = static_cast<TransitionSet*>(object); // TypeRegistry guarantees that this is the correct type.
161
162   if(SIGNAL_FINISHED == signalName)
163   {
164     transitionSet->FinishedSignal().Connect(tracker, functor);
165     connected = true;
166   }
167
168   return connected;
169 }
170
171 void TransitionSet::Process(bool postProcessor)
172 {
173   if(!postProcessor)
174   {
175     TransitionPreProcess();
176   }
177   else
178   {
179     TransitionStart();
180   }
181
182   if(Adaptor::IsAvailable())
183   {
184     Adaptor::Get().UnregisterProcessor(*this, postProcessor);
185   }
186 }
187
188 } // namespace Internal
189
190 } // namespace Toolkit
191
192 } // namespace Dali