X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=dali-toolkit%2Finternal%2Ftransition%2Ftransition-set-impl.cpp;h=d1b16af2d0fbc50286dda8d7617d7ba2d1c54b1c;hb=73af44fd04b52cf0509279c5869b63ec9c690959;hp=ad7ca6273a6015b9c7eba564e312a695c27824d3;hpb=1472fda30a44315490d628a4b36459b423364802;p=platform%2Fcore%2Fuifw%2Fdali-toolkit.git diff --git a/dali-toolkit/internal/transition/transition-set-impl.cpp b/dali-toolkit/internal/transition/transition-set-impl.cpp index ad7ca62..d1b16af 100644 --- a/dali-toolkit/internal/transition/transition-set-impl.cpp +++ b/dali-toolkit/internal/transition/transition-set-impl.cpp @@ -37,6 +37,13 @@ namespace // Signals static constexpr std::string_view SIGNAL_FINISHED = "finished"; +static constexpr float OPACITY_TRANSPARENT = 0.0f; + +float CustomAlphaFunction(float progress) +{ + return (progress >= 1.0f) ? 1.0f : 0.0f; +} + BaseHandle Create() { return Dali::Toolkit::TransitionSet::New(); @@ -117,9 +124,46 @@ void TransitionSet::TransitionPreProcess() void TransitionSet::TransitionStart() { + std::vector> minimumDelays; for(auto&& transition : mTransitions) { transition->Play(); + + // If target Control has appearing transition, the target will not be rendered during delay. + // And if the Control has multiple transitions, the target will not be rendered during minimum delay of the transitions. + // Here we can find minimum delay of each target. + if(!transition->IsPairTransition() && transition->IsAppearingTransition()) + { + bool found = false; + for(uint32_t index = 0; index < minimumDelays.size(); ++index) + { + if(minimumDelays[index].first == transition->GetTarget()) + { + minimumDelays[index].second = std::min(minimumDelays[index].second, transition->GetTimePeriod().delaySeconds); + found = true; + break; + } + } + if(!found) + { + minimumDelays.push_back(std::pair(transition->GetTarget(), transition->GetTimePeriod().delaySeconds)); + } + } + } + + // If the target has delay that is larger than 0, hide the target during minimum delay. + // The custom alpha function make the target hide just during delay. + for(auto&& delay : minimumDelays) + { + if(delay.second > Dali::Math::MACHINE_EPSILON_10) + { + Dali::KeyFrames initialKeyframes = Dali::KeyFrames::New(); + initialKeyframes.Add(0.0f, OPACITY_TRANSPARENT); + initialKeyframes.Add(1.0f, delay.first.GetProperty(Dali::Actor::Property::OPACITY)); + + AlphaFunction alpha(&CustomAlphaFunction); + mAnimation.AnimateBetween(Property(delay.first, Dali::Actor::Property::OPACITY), initialKeyframes, alpha, TimePeriod(delay.second)); + } } mAnimation.FinishedSignal().Connect(this, &TransitionSet::TransitionFinished); @@ -128,9 +172,12 @@ void TransitionSet::TransitionStart() void TransitionSet::TransitionFinished(Dali::Animation& source) { - for(auto&& transition : mTransitions) + // Call TransitionFinished() in reverse order. + // This let the first copied original properties will be return again at the final. + std::vector::reverse_iterator riter; + for(riter = mTransitions.rbegin(); riter != mTransitions.rend(); riter++) { - transition->TransitionFinished(); + (*riter)->TransitionFinished(); } EmitFinishedSignal();