X-Git-Url: http://review.tizen.org/git/?p=platform%2Fcore%2Fuifw%2Fdali-toolkit.git;a=blobdiff_plain;f=dali-toolkit%2Finternal%2Ftransition%2Ftransition-impl.cpp;h=78ba8dbee58435a6921db925080ea9a95eb73a99;hp=2cbd14d6df16e80bc2d5a504663f74a3af64dfb1;hb=03e8b126b8cdcd00170495b59ec94e4e5230b7be;hpb=4a65ed433da9d334b597ed111128d1d03a975341 diff --git a/dali-toolkit/internal/transition/transition-impl.cpp b/dali-toolkit/internal/transition/transition-impl.cpp index 2cbd14d..78ba8db 100644 --- a/dali-toolkit/internal/transition/transition-impl.cpp +++ b/dali-toolkit/internal/transition/transition-impl.cpp @@ -27,6 +27,7 @@ // INTERNAL INCLUDES #include +#include namespace Dali { @@ -37,10 +38,9 @@ namespace Internal 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) @@ -56,7 +56,7 @@ TransitionPtr Transition::New(Dali::Toolkit::Control source, Dali::Toolkit::Cont 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(); @@ -64,12 +64,14 @@ TransitionPtr Transition::New(Dali::Toolkit::Control source, Dali::Toolkit::Cont 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); } @@ -90,16 +92,15 @@ void Transition::OnPlay() } //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); - Vector3 destinationPosition = destinationControl[Dali::Actor::Property::POSITION]; - Vector3 destinationScale = destinationControl[Dali::Actor::Property::SCALE]; - Quaternion destinationOrientation = destinationControl[Dali::Actor::Property::ORIENTATION]; - Vector4 targetColor = destinationControl[Dali::Actor::Property::COLOR]; - Vector3 targetSize = destinationControl[Dali::Actor::Property::SIZE]; + Matrix destinationWorldTransform = GetWorldTransform(destinationControl); + Vector3 destinationPosition, destinationScale; + Quaternion destinationOrientation; + destinationWorldTransform.GetTransformComponents(destinationPosition, destinationOrientation, destinationScale); Property::Map startPropertyMap; Property::Map finishPropertyMap; @@ -114,29 +115,36 @@ void Transition::OnPlay() startPropertyMap.Insert(Dali::Actor::Property::SCALE, sourceScale); finishPropertyMap.Insert(Dali::Actor::Property::SCALE, destinationScale); - Vector4 sourceColor = sourceControl.GetCurrentProperty(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(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(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(); @@ -145,27 +153,82 @@ void Transition::OnPlay() DALI_LOG_ERROR("animation is still not initialized\n"); return; } - Dali::Toolkit::DevelControl::CreateTransitions(destinationControl, animation, sourceControl, GetAlphaFunction(), GetTimePeriod()); + + mOriginalVisualProperties.clear(); + std::vector> 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(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