2 * Copyright (c) 2022 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-impl.h>
22 #include <dali-toolkit/public-api/controls/control-impl.h>
23 #include <dali/devel-api/actors/actor-devel.h>
24 #include <dali/integration-api/debug.h>
25 #include <dali/public-api/common/dali-common.h>
26 #include <dali/public-api/object/type-registry.h>
29 #include <dali-toolkit/devel-api/controls/control-devel.h>
30 #include <dali-toolkit/internal/controls/control/control-data-impl.h>
38 TransitionPtr Transition::New(Dali::Toolkit::Control source, Dali::Toolkit::Control destination, bool useDestinationTarget, TimePeriod timePeriod)
40 float delaySeconds = timePeriod.delaySeconds;
41 if(delaySeconds < 0.0f)
43 DALI_LOG_WARNING("delay should be greater than 0.0f.\n");
47 float durationSeconds = timePeriod.durationSeconds;
48 if(durationSeconds < 0.0f)
50 DALI_LOG_WARNING("duration should be greater than 0.0f.\n");
51 durationSeconds = 0.0f;
54 TransitionPtr transition = new Transition(source, destination, useDestinationTarget, TimePeriod(delaySeconds, durationSeconds));
56 // Second-phase construction
57 transition->Initialize();
62 Transition::Transition(Dali::Toolkit::Control source, Dali::Toolkit::Control destination, bool useDestinationTarget, TimePeriod timePeriod)
64 mUseDestinationTarget(useDestinationTarget),
66 mSourceControl(source),
67 mDestinationControl(destination)
69 SetTarget(mUseDestinationTarget ? destination : source);
70 SetTimePeriod(timePeriod);
71 SetPairTransition(true);
74 Transition::~Transition()
78 void Transition::OnPlay()
80 Dali::Toolkit::Control sourceControl = mSourceControl.GetHandle();
81 Dali::Toolkit::Control destinationControl = mDestinationControl.GetHandle();
82 if(!sourceControl || !sourceControl[Dali::Actor::Property::CONNECTED_TO_SCENE] ||
83 !destinationControl || !destinationControl[Dali::Actor::Property::CONNECTED_TO_SCENE])
85 DALI_LOG_ERROR("The source or destination is not added on the window\n");
89 //Make startPropertyMap and finishPropertyMap to use for property animation.
90 Matrix sourceWorldTransform = DevelActor::GetWorldTransform(sourceControl);
91 Vector3 sourcePosition, sourceScale;
92 Quaternion sourceOrientation;
93 sourceWorldTransform.GetTransformComponents(sourcePosition, sourceOrientation, sourceScale);
95 Matrix destinationWorldTransform = DevelActor::GetWorldTransform(destinationControl);
96 Vector3 destinationPosition, destinationScale;
97 Quaternion destinationOrientation;
98 destinationWorldTransform.GetTransformComponents(destinationPosition, destinationOrientation, destinationScale);
100 Property::Map startPropertyMap;
101 Property::Map finishPropertyMap;
103 // Set animation of Transform
104 startPropertyMap.Insert(Dali::Actor::Property::POSITION, sourcePosition);
105 finishPropertyMap.Insert(Dali::Actor::Property::POSITION, destinationPosition);
107 startPropertyMap.Insert(Dali::Actor::Property::ORIENTATION, sourceOrientation);
108 finishPropertyMap.Insert(Dali::Actor::Property::ORIENTATION, destinationOrientation);
110 startPropertyMap.Insert(Dali::Actor::Property::SCALE, sourceScale);
111 finishPropertyMap.Insert(Dali::Actor::Property::SCALE, destinationScale);
113 Vector4 sourceColor = DevelActor::GetWorldColor(sourceControl);
114 Vector4 destinationColor = DevelActor::GetWorldColor(destinationControl);
115 startPropertyMap.Insert(Dali::Actor::Property::COLOR, sourceColor);
116 finishPropertyMap.Insert(Dali::Actor::Property::COLOR, destinationColor);
118 // Set animation for other properties if source and destination is different.
119 Vector3 sourceSize = sourceControl[Dali::Actor::Property::SIZE];
120 Vector3 destinationSize = destinationControl[Dali::Actor::Property::SIZE];
121 if(sourceSize != destinationSize)
123 startPropertyMap.Insert(Dali::Actor::Property::SIZE, sourceSize);
124 finishPropertyMap.Insert(Dali::Actor::Property::SIZE, destinationSize);
125 if(!mUseDestinationTarget)
127 mOriginalSize = GetTargetControl().GetProperty<Vector3>(Dali::Actor::Property::SIZE);
131 SetStartPropertyMap(startPropertyMap);
132 SetFinishPropertyMap(finishPropertyMap);
134 // source View becomes transparent during transition.
135 Dali::Toolkit::Control waitingControl = GetWaitingControl();
136 if(IsTransitionWithChild())
138 waitingControl[Dali::Actor::Property::VISIBLE] = false;
142 GetImplementation(waitingControl).SetTransparent(true);
145 Dali::Animation animation = GetAnimation();
148 DALI_LOG_ERROR("animation is still not initialized\n");
152 mOriginalVisualProperties.clear();
153 std::vector<std::pair<Dali::Property::Index, Dali::Property::Map>> destinationVisualProperties;
154 Dali::Toolkit::Control targetControl = GetTargetControl();
155 Internal::Control& internalControl = Toolkit::Internal::GetImplementation(targetControl);
156 Internal::Control::Impl& controlDataImpl = Toolkit::Internal::Control::Impl::Get(internalControl);
157 controlDataImpl.CreateTransitions(mOriginalVisualProperties, destinationVisualProperties, sourceControl, destinationControl);
159 for(uint32_t index = 0; index < mOriginalVisualProperties.size(); ++index)
161 Dali::Property::Map source = mOriginalVisualProperties[index].second;
162 Dali::Property::Map destination = destinationVisualProperties[index].second;
163 for(size_t i = 0; i < source.Count(); ++i)
165 Dali::Property property = DevelControl::GetVisualProperty(targetControl, mOriginalVisualProperties[index].first, source.GetKeyAt(i));
166 if(GetTimePeriod().delaySeconds > 0.0f)
168 Dali::KeyFrames initialKeyframes = Dali::KeyFrames::New();
169 initialKeyframes.Add(0.0f, source.GetValue(i));
170 animation.AnimateBetween(property, initialKeyframes, TimePeriod(GetTimePeriod().delaySeconds));
172 Dali::KeyFrames keyframes = Dali::KeyFrames::New();
173 keyframes.Add(0.0f, source.GetValue(i));
174 keyframes.Add(1.0f, destination.GetValue(i));
175 animation.AnimateBetween(property, keyframes, GetAlphaFunction(), GetTimePeriod());
180 void Transition::OnFinished()
182 Dali::Toolkit::Control waitingControl = GetWaitingControl();
188 if(!mUseDestinationTarget)
190 Dali::Toolkit::Control target = GetTargetControl();
191 Dali::Animation resetAnimation = Dali::Animation::New(0.0f);
192 if(mOriginalSize != target.GetProperty<Vector3>(Dali::Actor::Property::SIZE))
194 // Use Animation not to notify size change and not to change width and height resize policy.
195 resetAnimation.AnimateTo(Dali::Property(target, Dali::Actor::Property::SIZE), mOriginalSize);
197 resetAnimation.Play();
199 Dali::Toolkit::Control targetControl = GetTargetControl();
200 Internal::Control& internalControl = Toolkit::Internal::GetImplementation(targetControl);
201 Internal::Control::Impl& controlDataImpl = Toolkit::Internal::Control::Impl::Get(internalControl);
202 controlDataImpl.UpdateVisualProperties(mOriginalVisualProperties);
205 if(IsTransitionWithChild())
207 waitingControl[Dali::Actor::Property::VISIBLE] = true;
211 GetImplementation(waitingControl).SetTransparent(false);
215 Dali::Toolkit::Control Transition::GetTargetControl()
217 Dali::Toolkit::Control target = mUseDestinationTarget ? mDestinationControl.GetHandle() : mSourceControl.GetHandle();
221 Dali::Toolkit::Control Transition::GetWaitingControl()
223 Dali::Toolkit::Control waitingControl = mUseDestinationTarget ? mSourceControl.GetHandle() : mDestinationControl.GetHandle();
224 return waitingControl;
227 } // namespace Internal
229 } // namespace Toolkit