// INTERNAL INCLUDES
#include <dali-toolkit/devel-api/controls/control-devel.h>
+#include <dali-toolkit/internal/controls/control/control-data-impl.h>
namespace Dali
{
namespace
{
const Dali::AlphaFunction DEFAULT_ALPHA_FUNCTION(Dali::AlphaFunction::DEFAULT);
-
} // anonymous namespace
-TransitionPtr Transition::New(Dali::Toolkit::Control source, Dali::Toolkit::Control destination, TimePeriod timePeriod)
+TransitionPtr Transition::New(Dali::Toolkit::Control source, Dali::Toolkit::Control destination, bool useDestinationTarget, TimePeriod timePeriod)
{
float delaySeconds = timePeriod.delaySeconds;
if(delaySeconds < 0.0f)
durationSeconds = 0.0f;
}
- TransitionPtr transition = new Transition(source, destination, TimePeriod(delaySeconds, durationSeconds));
+ TransitionPtr transition = new Transition(source, destination, useDestinationTarget, TimePeriod(delaySeconds, durationSeconds));
// Second-phase construction
transition->Initialize();
return transition;
}
-Transition::Transition(Dali::Toolkit::Control source, Dali::Toolkit::Control destination, TimePeriod timePeriod)
+Transition::Transition(Dali::Toolkit::Control source, Dali::Toolkit::Control destination, bool useDestinationTarget, TimePeriod timePeriod)
: TransitionBase(),
+ mUseDestinationTarget(useDestinationTarget),
+ mOriginalSize(),
mSourceControl(source),
mDestinationControl(destination)
{
- SetTarget(destination);
+ SetTarget(mUseDestinationTarget ? destination : source);
SetTimePeriod(timePeriod);
+ SetPairTransition(true);
}
Transition::~Transition()
}
//Make startPropertyMap and finishPropertyMap to use for property animation.
- Matrix sourceWorldTransform = sourceControl[Dali::Actor::Property::WORLD_MATRIX];
+ Matrix sourceWorldTransform = GetWorldTransform(sourceControl);
Vector3 sourcePosition, sourceScale;
Quaternion sourceOrientation;
sourceWorldTransform.GetTransformComponents(sourcePosition, sourceOrientation, sourceScale);
Quaternion destinationOrientation;
destinationWorldTransform.GetTransformComponents(destinationPosition, destinationOrientation, destinationScale);
- Vector3 targetSize = destinationControl[Dali::Actor::Property::SIZE];
- Vector4 targetColor = GetWorldColor(destinationControl);
Property::Map startPropertyMap;
Property::Map finishPropertyMap;
- // Use world transform if this transition requires animation of transform.
- destinationControl[Dali::Actor::Property::ANCHOR_POINT] = AnchorPoint::CENTER;
- destinationControl[Dali::Actor::Property::PARENT_ORIGIN] = ParentOrigin::CENTER;
- destinationControl[Dali::Actor::Property::POSITION_USES_ANCHOR_POINT] = true;
- destinationControl[Dali::Actor::Property::INHERIT_POSITION] = false;
- destinationControl[Dali::Actor::Property::INHERIT_ORIENTATION] = false;
- destinationControl[Dali::Actor::Property::INHERIT_SCALE] = false;
- destinationControl[Dali::Actor::Property::COLOR_MODE] = Dali::ColorMode::USE_OWN_COLOR;
-
// Set animation of Transform
startPropertyMap.Insert(Dali::Actor::Property::POSITION, sourcePosition);
finishPropertyMap.Insert(Dali::Actor::Property::POSITION, destinationPosition);
startPropertyMap.Insert(Dali::Actor::Property::SCALE, sourceScale);
finishPropertyMap.Insert(Dali::Actor::Property::SCALE, destinationScale);
- Vector4 sourceColor = sourceControl.GetCurrentProperty<Vector4>(Dali::Actor::Property::WORLD_COLOR);
+ Vector4 sourceColor = GetWorldColor(sourceControl);
+ Vector4 destinationColor = GetWorldColor(destinationControl);
startPropertyMap.Insert(Dali::Actor::Property::COLOR, sourceColor);
- finishPropertyMap.Insert(Dali::Actor::Property::COLOR, targetColor);
+ finishPropertyMap.Insert(Dali::Actor::Property::COLOR, destinationColor);
// Set animation for other properties if source and destination is different.
- Vector3 sourceSize = sourceControl.GetCurrentProperty<Vector3>(Dali::Actor::Property::SIZE);
- if(sourceSize != targetSize)
+ Vector3 sourceSize = sourceControl[Dali::Actor::Property::SIZE];
+ Vector3 destinationSize = destinationControl[Dali::Actor::Property::SIZE];
+ if(sourceSize != destinationSize)
{
startPropertyMap.Insert(Dali::Actor::Property::SIZE, sourceSize);
- finishPropertyMap.Insert(Dali::Actor::Property::SIZE, targetSize);
+ finishPropertyMap.Insert(Dali::Actor::Property::SIZE, destinationSize);
+ if(!mUseDestinationTarget)
+ {
+ mOriginalSize = GetTargetControl().GetProperty<Vector3>(Dali::Actor::Property::SIZE);
+ }
}
SetStartPropertyMap(startPropertyMap);
SetFinishPropertyMap(finishPropertyMap);
// source View becomes transparent during transition.
+ Dali::Toolkit::Control waitingControl = GetWaitingControl();
if(IsTransitionWithChild())
{
- sourceControl[Dali::Actor::Property::VISIBLE] = false;
+ waitingControl[Dali::Actor::Property::VISIBLE] = false;
}
else
{
- GetImplementation(sourceControl).SetTransparent(true);
+ GetImplementation(waitingControl).SetTransparent(true);
}
Dali::Animation animation = GetAnimation();
DALI_LOG_ERROR("animation is still not initialized\n");
return;
}
- Dali::Toolkit::DevelControl::CreateTransitions(destinationControl, animation, sourceControl, GetAlphaFunction(), GetTimePeriod());
+
+ mOriginalVisualProperties.clear();
+ std::vector<std::pair<Dali::Property::Index, Dali::Property::Map>> destinationVisualProperties;
+ Dali::Toolkit::Control targetControl = GetTargetControl();
+ Internal::Control& internalControl = Toolkit::Internal::GetImplementation(targetControl);
+ Internal::Control::Impl& controlDataImpl = Toolkit::Internal::Control::Impl::Get(internalControl);
+ controlDataImpl.CreateTransitions(mOriginalVisualProperties, destinationVisualProperties, sourceControl, destinationControl);
+
+ for(uint32_t index = 0; index < mOriginalVisualProperties.size(); ++index)
+ {
+ Dali::Property::Map source = mOriginalVisualProperties[index].second;
+ Dali::Property::Map destination = destinationVisualProperties[index].second;
+ for(size_t i = 0; i < source.Count(); ++i)
+ {
+ Dali::Property property = DevelControl::GetVisualProperty(targetControl, mOriginalVisualProperties[index].first, source.GetKeyAt(i));
+ if(GetTimePeriod().delaySeconds > 0.0f)
+ {
+ Dali::KeyFrames initialKeyframes = Dali::KeyFrames::New();
+ initialKeyframes.Add(0.0f, source.GetValue(i));
+ animation.AnimateBetween(property, initialKeyframes, TimePeriod(GetTimePeriod().delaySeconds));
+ }
+ Dali::KeyFrames keyframes = Dali::KeyFrames::New();
+ keyframes.Add(0.0f, source.GetValue(i));
+ keyframes.Add(1.0f, destination.GetValue(i));
+ animation.AnimateBetween(property, keyframes, GetAlphaFunction(), GetTimePeriod());
+ }
+ }
}
void Transition::OnFinished()
{
- Dali::Toolkit::Control sourceControl = mSourceControl.GetHandle();
- if(!sourceControl)
+ Dali::Toolkit::Control waitingControl = GetWaitingControl();
+ if(!waitingControl)
{
return;
}
+ if(!mUseDestinationTarget)
+ {
+ Dali::Toolkit::Control target = GetTargetControl();
+ Dali::Animation resetAnimation = Dali::Animation::New(0.0f);
+ if(mOriginalSize != target.GetProperty<Vector3>(Dali::Actor::Property::SIZE))
+ {
+ // Use Animation not to notify size change and not to change width and height resize policy.
+ resetAnimation.AnimateTo(Dali::Property(target, Dali::Actor::Property::SIZE), mOriginalSize);
+ }
+ resetAnimation.Play();
+
+ Dali::Toolkit::Control targetControl = GetTargetControl();
+ Internal::Control& internalControl = Toolkit::Internal::GetImplementation(targetControl);
+ Internal::Control::Impl& controlDataImpl = Toolkit::Internal::Control::Impl::Get(internalControl);
+ controlDataImpl.UpdateVisualProperties(mOriginalVisualProperties);
+ }
+
if(IsTransitionWithChild())
{
- sourceControl[Dali::Actor::Property::VISIBLE] = true;
+ waitingControl[Dali::Actor::Property::VISIBLE] = true;
}
else
{
- GetImplementation(sourceControl).SetTransparent(false);
+ GetImplementation(waitingControl).SetTransparent(false);
}
}
+Dali::Toolkit::Control Transition::GetTargetControl()
+{
+ Dali::Toolkit::Control target = mUseDestinationTarget ? mDestinationControl.GetHandle() : mSourceControl.GetHandle();
+ return target;
+}
+
+Dali::Toolkit::Control Transition::GetWaitingControl()
+{
+ Dali::Toolkit::Control waitingControl = mUseDestinationTarget ? mSourceControl.GetHandle() : mDestinationControl.GetHandle();
+ return waitingControl;
+}
+
} // namespace Internal
} // namespace Toolkit