Support multiple transitions for a Control.
[platform/core/uifw/dali-toolkit.git] / dali-toolkit / internal / transition / transition-set-impl.cpp
index ad7ca62..d1b16af 100644 (file)
@@ -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<std::pair<Dali::Actor, float>> 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<Dali::Actor, float>(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<float>(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<TransitionBasePtr>::reverse_iterator riter;
+  for(riter = mTransitions.rbegin(); riter != mTransitions.rend(); riter++)
   {
-    transition->TransitionFinished();
+    (*riter)->TransitionFinished();
   }
 
   EmitFinishedSignal();