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 for(auto&& transition : mTransitions)
133 transition->TransitionFinished();
136 EmitFinishedSignal();
139 Dali::Toolkit::TransitionSet::TransitionSetSignalType& TransitionSet::FinishedSignal()
141 return mFinishedSignal;
144 void TransitionSet::EmitFinishedSignal()
146 if(!mFinishedSignal.Empty())
148 Dali::Toolkit::TransitionSet handle(this);
149 mFinishedSignal.Emit(handle);
153 bool TransitionSet::DoConnectSignal(BaseObject* object, ConnectionTrackerInterface* tracker, const std::string& signalName, FunctorDelegate* functor)
155 bool connected(false);
156 TransitionSet* transitionSet = static_cast<TransitionSet*>(object); // TypeRegistry guarantees that this is the correct type.
158 if(SIGNAL_FINISHED == signalName)
160 transitionSet->FinishedSignal().Connect(tracker, functor);
167 void TransitionSet::Process(bool postProcessor)
171 TransitionPreProcess();
177 Adaptor::Get().UnregisterProcessor(*this, postProcessor);
180 } // namespace Internal
182 } // namespace Toolkit