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-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>
40 const Dali::AlphaFunction DEFAULT_ALPHA_FUNCTION(Dali::AlphaFunction::DEFAULT);
41 } // anonymous namespace
43 TransitionPtr Transition::New(Dali::Toolkit::Control source, Dali::Toolkit::Control destination, bool useDestinationTarget, TimePeriod timePeriod)
45 float delaySeconds = timePeriod.delaySeconds;
46 if(delaySeconds < 0.0f)
48 DALI_LOG_WARNING("delay should be greater than 0.0f.\n");
52 float durationSeconds = timePeriod.durationSeconds;
53 if(durationSeconds < 0.0f)
55 DALI_LOG_WARNING("duration should be greater than 0.0f.\n");
56 durationSeconds = 0.0f;
59 TransitionPtr transition = new Transition(source, destination, useDestinationTarget, TimePeriod(delaySeconds, durationSeconds));
61 // Second-phase construction
62 transition->Initialize();
67 Transition::Transition(Dali::Toolkit::Control source, Dali::Toolkit::Control destination, bool useDestinationTarget, TimePeriod timePeriod)
69 mUseDestinationTarget(useDestinationTarget),
71 mSourceControl(source),
72 mDestinationControl(destination)
74 SetTarget(mUseDestinationTarget ? destination : source);
75 SetTimePeriod(timePeriod);
76 SetPairTransition(true);
79 Transition::~Transition()
83 void Transition::OnPlay()
85 Dali::Toolkit::Control sourceControl = mSourceControl.GetHandle();
86 Dali::Toolkit::Control destinationControl = mDestinationControl.GetHandle();
87 if(!sourceControl || !sourceControl[Dali::Actor::Property::CONNECTED_TO_SCENE] ||
88 !destinationControl || !destinationControl[Dali::Actor::Property::CONNECTED_TO_SCENE])
90 DALI_LOG_ERROR("The source or destination is not added on the window\n");
94 //Make startPropertyMap and finishPropertyMap to use for property animation.
95 Matrix sourceWorldTransform = GetWorldTransform(sourceControl);
96 Vector3 sourcePosition, sourceScale;
97 Quaternion sourceOrientation;
98 sourceWorldTransform.GetTransformComponents(sourcePosition, sourceOrientation, sourceScale);
100 Matrix destinationWorldTransform = GetWorldTransform(destinationControl);
101 Vector3 destinationPosition, destinationScale;
102 Quaternion destinationOrientation;
103 destinationWorldTransform.GetTransformComponents(destinationPosition, destinationOrientation, destinationScale);
105 Property::Map startPropertyMap;
106 Property::Map finishPropertyMap;
108 // Set animation of Transform
109 startPropertyMap.Insert(Dali::Actor::Property::POSITION, sourcePosition);
110 finishPropertyMap.Insert(Dali::Actor::Property::POSITION, destinationPosition);
112 startPropertyMap.Insert(Dali::Actor::Property::ORIENTATION, sourceOrientation);
113 finishPropertyMap.Insert(Dali::Actor::Property::ORIENTATION, destinationOrientation);
115 startPropertyMap.Insert(Dali::Actor::Property::SCALE, sourceScale);
116 finishPropertyMap.Insert(Dali::Actor::Property::SCALE, destinationScale);
118 Vector4 sourceColor = GetWorldColor(sourceControl);
119 Vector4 destinationColor = GetWorldColor(destinationControl);
120 startPropertyMap.Insert(Dali::Actor::Property::COLOR, sourceColor);
121 finishPropertyMap.Insert(Dali::Actor::Property::COLOR, destinationColor);
123 // Set animation for other properties if source and destination is different.
124 Vector3 sourceSize = sourceControl[Dali::Actor::Property::SIZE];
125 Vector3 destinationSize = destinationControl[Dali::Actor::Property::SIZE];
126 if(sourceSize != destinationSize)
128 startPropertyMap.Insert(Dali::Actor::Property::SIZE, sourceSize);
129 finishPropertyMap.Insert(Dali::Actor::Property::SIZE, destinationSize);
130 if(!mUseDestinationTarget)
132 mOriginalSize = GetTargetControl().GetProperty<Vector3>(Dali::Actor::Property::SIZE);
136 SetStartPropertyMap(startPropertyMap);
137 SetFinishPropertyMap(finishPropertyMap);
139 // source View becomes transparent during transition.
140 Dali::Toolkit::Control waitingControl = GetWaitingControl();
141 if(IsTransitionWithChild())
143 waitingControl[Dali::Actor::Property::VISIBLE] = false;
147 GetImplementation(waitingControl).SetTransparent(true);
150 Dali::Animation animation = GetAnimation();
153 DALI_LOG_ERROR("animation is still not initialized\n");
157 mOriginalVisualProperties.clear();
158 std::vector<std::pair<Dali::Property::Index, Dali::Property::Map>> destinationVisualProperties;
159 Dali::Toolkit::Control targetControl = GetTargetControl();
160 Internal::Control& internalControl = Toolkit::Internal::GetImplementation(targetControl);
161 Internal::Control::Impl& controlDataImpl = Toolkit::Internal::Control::Impl::Get(internalControl);
162 controlDataImpl.CreateTransitions(mOriginalVisualProperties, destinationVisualProperties, sourceControl, destinationControl);
164 for(uint32_t index = 0; index < mOriginalVisualProperties.size(); ++index)
166 Dali::Property::Map source = mOriginalVisualProperties[index].second;
167 Dali::Property::Map destination = destinationVisualProperties[index].second;
168 for(size_t i = 0; i < source.Count(); ++i)
170 Dali::Property property = DevelControl::GetVisualProperty(targetControl, mOriginalVisualProperties[index].first, source.GetKeyAt(i));
171 if(GetTimePeriod().delaySeconds > 0.0f)
173 Dali::KeyFrames initialKeyframes = Dali::KeyFrames::New();
174 initialKeyframes.Add(0.0f, source.GetValue(i));
175 animation.AnimateBetween(property, initialKeyframes, TimePeriod(GetTimePeriod().delaySeconds));
177 Dali::KeyFrames keyframes = Dali::KeyFrames::New();
178 keyframes.Add(0.0f, source.GetValue(i));
179 keyframes.Add(1.0f, destination.GetValue(i));
180 animation.AnimateBetween(property, keyframes, GetAlphaFunction(), GetTimePeriod());
185 void Transition::OnFinished()
187 Dali::Toolkit::Control waitingControl = GetWaitingControl();
193 if(!mUseDestinationTarget)
195 Dali::Toolkit::Control target = GetTargetControl();
196 Dali::Animation resetAnimation = Dali::Animation::New(0.0f);
197 if(mOriginalSize != target.GetProperty<Vector3>(Dali::Actor::Property::SIZE))
199 // Use Animation not to notify size change and not to change width and height resize policy.
200 resetAnimation.AnimateTo(Dali::Property(target, Dali::Actor::Property::SIZE), mOriginalSize);
202 resetAnimation.Play();
204 Dali::Toolkit::Control targetControl = GetTargetControl();
205 Internal::Control& internalControl = Toolkit::Internal::GetImplementation(targetControl);
206 Internal::Control::Impl& controlDataImpl = Toolkit::Internal::Control::Impl::Get(internalControl);
207 controlDataImpl.UpdateVisualProperties(mOriginalVisualProperties);
210 if(IsTransitionWithChild())
212 waitingControl[Dali::Actor::Property::VISIBLE] = true;
216 GetImplementation(waitingControl).SetTransparent(false);
220 Dali::Toolkit::Control Transition::GetTargetControl()
222 Dali::Toolkit::Control target = mUseDestinationTarget ? mDestinationControl.GetHandle() : mSourceControl.GetHandle();
226 Dali::Toolkit::Control Transition::GetWaitingControl()
228 Dali::Toolkit::Control waitingControl = mUseDestinationTarget ? mSourceControl.GetHandle() : mDestinationControl.GetHandle();
229 return waitingControl;
232 } // namespace Internal
234 } // namespace Toolkit