2 * Copyright (c) 2021 Samsung Electronics Co., Ltd.
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
8 * http://www.apache.org/licenses/LICENSE-2.0
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.
19 #include <dali-toolkit/internal/transition/transition-set-impl.h>
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>
27 #include <dali-toolkit/internal/transition/transition-lifecycle-controller.h>
38 static constexpr std::string_view SIGNAL_FINISHED = "finished";
42 return Dali::Toolkit::TransitionSet::New();
45 TypeRegistration mType(typeid(Dali::Toolkit::TransitionSet), typeid(Dali::BaseHandle), Create);
47 SignalConnectorType signalConnector1(mType, std::string(SIGNAL_FINISHED), &TransitionSet::DoConnectSignal);
49 } // anonymous namespace
51 TransitionSetPtr TransitionSet::New()
53 TransitionSetPtr transitionSet = new TransitionSet();
58 TransitionSet::TransitionSet()
62 TransitionSet::~TransitionSet()
67 void TransitionSet::AddTransition(TransitionBasePtr transition)
69 mTransitions.push_back(transition);
72 TransitionBase* TransitionSet::GetTransitionAt(uint32_t index) const
74 TransitionBase* result(nullptr);
75 if(index < GetTransitionCount())
77 result = mTransitions[index].Get();
81 DALI_LOG_ERROR("Error: Invalid index to TransitionSet::GetTransitionAt\n");
87 uint32_t TransitionSet::GetTransitionCount() const
89 return mTransitions.size();
92 void TransitionSet::Play()
94 Adaptor::Get().RegisterProcessor(*this, true);
95 Adaptor::Get().RegisterProcessor(*this, false);
96 TransitionLifecycleController::GetInstance().AddTransitions(Dali::Toolkit::TransitionSet(this));
99 void TransitionSet::TransitionPreProcess()
101 float lastDuration = 0.0f;
102 for(auto&& transition : mTransitions)
104 TimePeriod timePeriod = transition->GetTimePeriod();
105 if(lastDuration <= timePeriod.durationSeconds + timePeriod.delaySeconds)
107 lastDuration = timePeriod.durationSeconds + timePeriod.delaySeconds;
110 mAnimation = Dali::Animation::New(lastDuration);
112 for(auto&& transition : mTransitions)
114 transition->PreProcess(mAnimation);
118 void TransitionSet::TransitionStart()
120 for(auto&& transition : mTransitions)
125 mAnimation.FinishedSignal().Connect(this, &TransitionSet::TransitionFinished);
129 void TransitionSet::TransitionFinished(Dali::Animation& source)
131 // Call TransitionFinished() in reverse order.
132 // This let the first copied original properties will be return again at the final.
133 std::vector<TransitionBasePtr>::reverse_iterator riter;
134 for(riter = mTransitions.rbegin(); riter != mTransitions.rend(); riter++)
136 (*riter)->TransitionFinished();
139 EmitFinishedSignal();
142 Dali::Toolkit::TransitionSet::TransitionSetSignalType& TransitionSet::FinishedSignal()
144 return mFinishedSignal;
147 void TransitionSet::EmitFinishedSignal()
149 if(!mFinishedSignal.Empty())
151 Dali::Toolkit::TransitionSet handle(this);
152 mFinishedSignal.Emit(handle);
156 bool TransitionSet::DoConnectSignal(BaseObject* object, ConnectionTrackerInterface* tracker, const std::string& signalName, FunctorDelegate* functor)
158 bool connected(false);
159 TransitionSet* transitionSet = static_cast<TransitionSet*>(object); // TypeRegistry guarantees that this is the correct type.
161 if(SIGNAL_FINISHED == signalName)
163 transitionSet->FinishedSignal().Connect(tracker, functor);
170 void TransitionSet::Process(bool postProcessor)
174 TransitionPreProcess();
180 Adaptor::Get().UnregisterProcessor(*this, postProcessor);
183 } // namespace Internal
185 } // namespace Toolkit