From: seungho Date: Tue, 17 Aug 2021 07:02:30 +0000 (+0900) Subject: Refactoring transition and fadeTransition X-Git-Tag: dali_2.0.42~5^2 X-Git-Url: http://review.tizen.org/git/?p=platform%2Fcore%2Fuifw%2Fdali-toolkit.git;a=commitdiff_plain;h=b4c3c44dfea70c23f81cb878392e1e84e23c9603 Refactoring transition and fadeTransition - changes fade to fadeTransition - changes to use world transition and color for the all transition to make it indepenent of the parent Control and its transitions Change-Id: I022cc7911445036e28e9c7e250caf021844d4166 Signed-off-by: seungho --- diff --git a/automated-tests/src/dali-toolkit/CMakeLists.txt b/automated-tests/src/dali-toolkit/CMakeLists.txt index b3c04d4..3d00833 100755 --- a/automated-tests/src/dali-toolkit/CMakeLists.txt +++ b/automated-tests/src/dali-toolkit/CMakeLists.txt @@ -19,7 +19,7 @@ SET(TC_SOURCES utc-Dali-ConfirmationPopup.cpp utc-Dali-CubeTransitionEffect.cpp utc-Dali-EffectsView.cpp - utc-Dali-Fade.cpp + utc-Dali-FadeTransition.cpp utc-Dali-FlexContainer.cpp utc-Dali-FlexNode.cpp utc-Dali-GaussianBlurView.cpp diff --git a/automated-tests/src/dali-toolkit/utc-Dali-Fade.cpp b/automated-tests/src/dali-toolkit/utc-Dali-FadeTransition.cpp similarity index 71% rename from automated-tests/src/dali-toolkit/utc-Dali-Fade.cpp rename to automated-tests/src/dali-toolkit/utc-Dali-FadeTransition.cpp index 8fc8fba..f708a31 100755 --- a/automated-tests/src/dali-toolkit/utc-Dali-Fade.cpp +++ b/automated-tests/src/dali-toolkit/utc-Dali-FadeTransition.cpp @@ -23,7 +23,7 @@ #include #include #include -#include +#include using namespace Dali; using namespace Dali::Toolkit; @@ -75,14 +75,14 @@ struct TransitionFinishCheck bool& mSignalReceived; // owned by individual tests }; -int UtcDaliFadeSetGetProperty(void) +int UtcDaliFadeTransitionSetGetProperty(void) { ToolkitTestApplication application; - tet_infoline("UtcDaliFadeSetGetProperty"); + tet_infoline("UtcDaliFadeTransitionSetGetProperty"); Control control = Control::New(); - Fade fade = Fade::New(control, 0.5, TimePeriod(-0.5f, -0.5f)); + FadeTransition fade = FadeTransition::New(control, 0.5, TimePeriod(-0.5f, -0.5f)); TimePeriod timePeriod = fade.GetTimePeriod(); DALI_TEST_EQUALS(0.0f, timePeriod.delaySeconds, TEST_LOCATION); @@ -91,10 +91,10 @@ int UtcDaliFadeSetGetProperty(void) END_TEST; } -int UtcDaliFadeWithOffScene(void) +int UtcDaliFadeTransitionWithOffScene(void) { ToolkitTestApplication application; - tet_infoline("UtcDaliFadeWithOffScene"); + tet_infoline("UtcDaliFadeTransitionWithOffScene"); Control control = Control::New(); control.SetProperty(Actor::Property::PARENT_ORIGIN, ParentOrigin::TOP_LEFT); @@ -112,7 +112,7 @@ int UtcDaliFadeWithOffScene(void) DALI_TEST_EQUALS(1.0f, control.GetCurrentProperty(Actor::Property::OPACITY), TEST_LOCATION); - Fade fade = Fade::New(control, 0.5, TimePeriod(0.5f)); + FadeTransition fade = FadeTransition::New(control, 0.5, TimePeriod(0.5f)); fade.SetAppearingTransition(false); // set fade out TransitionSet transitionSet = TransitionSet::New(); transitionSet.AddTransition(fade); @@ -146,10 +146,10 @@ int UtcDaliFadeWithOffScene(void) END_TEST; } -int UtcDaliFadeOut(void) +int UtcDaliFadeTransitionDisappearing(void) { ToolkitTestApplication application; - tet_infoline("UtcDaliFadeOut"); + tet_infoline("UtcDaliFadeTransitionOut"); Control control = Control::New(); control.SetProperty(Actor::Property::PARENT_ORIGIN, ParentOrigin::TOP_LEFT); @@ -169,7 +169,7 @@ int UtcDaliFadeOut(void) DALI_TEST_EQUALS(1.0f, control.GetCurrentProperty(Actor::Property::OPACITY), TEST_LOCATION); - Fade fade = Fade::New(control, 0.5, TimePeriod(0.5f)); + FadeTransition fade = FadeTransition::New(control, 0.5, TimePeriod(0.5f)); fade.SetAppearingTransition(false); // set fade out TransitionSet transitionSet = TransitionSet::New(); transitionSet.AddTransition(fade); @@ -205,10 +205,10 @@ int UtcDaliFadeOut(void) END_TEST; } -int UtcDaliFadeIn(void) +int UtcDaliFadeTransitionAppearing(void) { ToolkitTestApplication application; - tet_infoline("UtcDaliFadeIn"); + tet_infoline("UtcDaliFadeTransitionIn"); Control control = Control::New(); control.SetProperty(Actor::Property::PARENT_ORIGIN, ParentOrigin::TOP_LEFT); @@ -228,7 +228,7 @@ int UtcDaliFadeIn(void) DALI_TEST_EQUALS(1.0f, control.GetCurrentProperty(Actor::Property::OPACITY), TEST_LOCATION); - Fade fade = Fade::New(control, 0.5, TimePeriod(0.5f)); + FadeTransition fade = FadeTransition::New(control, 0.5, TimePeriod(0.5f)); fade.SetAppearingTransition(true); // set fade in TransitionSet transitionSet = TransitionSet::New(); transitionSet.AddTransition(fade); @@ -262,3 +262,72 @@ int UtcDaliFadeIn(void) END_TEST; } + + +int UtcDaliFadeTransitionAppearingWithDelay(void) +{ + ToolkitTestApplication application; + tet_infoline("UtcDaliFadeTransitionIn"); + + Control control = Control::New(); + control.SetProperty(Actor::Property::PARENT_ORIGIN, ParentOrigin::TOP_LEFT); + control.SetProperty(Actor::Property::ANCHOR_POINT, AnchorPoint::TOP_LEFT); + control.SetProperty(Actor::Property::POSITION, Vector3(100, 200, 0)); + control.SetProperty(Actor::Property::SIZE, Vector3(150, 150, 0)); + control.SetProperty(Actor::Property::OPACITY, 1.0f); + Property::Map controlProperty; + controlProperty.Insert(Toolkit::Visual::Property::TYPE, Toolkit::Visual::COLOR); + controlProperty.Insert(Toolkit::ColorVisual::Property::MIX_COLOR, Vector4(1.0f, 0.0f, 0.0f, 1.0f)); + control.SetProperty(Toolkit::Control::Property::BACKGROUND, controlProperty); + + application.GetScene().Add(control); + + application.SendNotification(); + application.Render(20); + + DALI_TEST_EQUALS(1.0f, control.GetCurrentProperty(Actor::Property::OPACITY), TEST_LOCATION); + + FadeTransition fade = FadeTransition::New(control, 0.5, TimePeriod(0.5f, 0.5f)); + fade.SetAppearingTransition(true); // set fade in + TransitionSet transitionSet = TransitionSet::New(); + transitionSet.AddTransition(fade); + transitionSet.Play(); + + bool signalReceived(false); + TransitionFinishCheck finishCheck(signalReceived); + transitionSet.FinishedSignal().Connect(&application, finishCheck); + + application.SendNotification(); + application.Render(400); + + // We didn't expect the animation to finish yet + application.SendNotification(); + finishCheck.CheckSignalNotReceived(); + + float currentOpacity = control.GetCurrentProperty(Actor::Property::OPACITY); + DALI_TEST_CHECK(currentOpacity <= 0.01f); + + application.SendNotification(); + application.Render(500); + + // We didn't expect the animation to finish yet + application.SendNotification(); + finishCheck.CheckSignalNotReceived(); + + currentOpacity = control.GetCurrentProperty(Actor::Property::OPACITY); + DALI_TEST_CHECK(currentOpacity <= 1.0 && currentOpacity >= 0.8); + + application.SendNotification(); + application.Render(200); + + // We did expect the animation to finish + application.SendNotification(); + finishCheck.CheckSignalReceived(); + + application.SendNotification(); + application.Render(20); + + DALI_TEST_EQUALS(1.0f, control.GetCurrentProperty(Actor::Property::OPACITY), TEST_LOCATION); + + END_TEST; +} diff --git a/automated-tests/src/dali-toolkit/utc-Dali-Transition.cpp b/automated-tests/src/dali-toolkit/utc-Dali-Transition.cpp index 955e15e..7e36d2c 100755 --- a/automated-tests/src/dali-toolkit/utc-Dali-Transition.cpp +++ b/automated-tests/src/dali-toolkit/utc-Dali-Transition.cpp @@ -580,7 +580,6 @@ int UtcDaliTransitionBetweenImageViewPairWithDelay(void) DALI_TEST_EQUALS(startWorldPosition, control2.GetCurrentProperty(Actor::Property::POSITION), TEST_LOCATION); - application.SendNotification(); application.Render(400); diff --git a/dali-toolkit/dali-toolkit.h b/dali-toolkit/dali-toolkit.h index 4fc8493..10d4ac8 100644 --- a/dali-toolkit/dali-toolkit.h +++ b/dali-toolkit/dali-toolkit.h @@ -60,7 +60,7 @@ #include -#include +#include #include #include diff --git a/dali-toolkit/internal/file.list b/dali-toolkit/internal/file.list index 33b594a..d2176db 100644 --- a/dali-toolkit/internal/file.list +++ b/dali-toolkit/internal/file.list @@ -182,7 +182,7 @@ SET( toolkit_src_files ${toolkit_src_dir}/text/rendering/text-backend-impl.cpp ${toolkit_src_dir}/text/rendering/text-typesetter.cpp ${toolkit_src_dir}/text/rendering/view-model.cpp - ${toolkit_src_dir}/transition/fade-impl.cpp + ${toolkit_src_dir}/transition/fade-transition-impl.cpp ${toolkit_src_dir}/transition/transition-base-impl.cpp ${toolkit_src_dir}/transition/transition-impl.cpp ${toolkit_src_dir}/transition/transition-lifecycle-controller.cpp diff --git a/dali-toolkit/internal/transition/fade-impl.cpp b/dali-toolkit/internal/transition/fade-transition-impl.cpp similarity index 71% rename from dali-toolkit/internal/transition/fade-impl.cpp rename to dali-toolkit/internal/transition/fade-transition-impl.cpp index 33bee66..17c0b2c 100644 --- a/dali-toolkit/internal/transition/fade-impl.cpp +++ b/dali-toolkit/internal/transition/fade-transition-impl.cpp @@ -16,7 +16,7 @@ */ // CLASS HEADER -#include +#include // EXTERNAL INCLUDES #include @@ -31,13 +31,8 @@ namespace Toolkit { namespace Internal { -namespace -{ -const Dali::AlphaFunction DEFAULT_ALPHA_FUNCTION(Dali::AlphaFunction::DEFAULT); - -} // anonymous namespace -FadePtr Fade::New(Dali::Toolkit::Control control, float opacity, TimePeriod timePeriod) +FadeTransitionPtr FadeTransition::New(Dali::Toolkit::Control control, float opacity, TimePeriod timePeriod) { float delaySeconds = timePeriod.delaySeconds; if(delaySeconds < 0.0f) @@ -53,15 +48,15 @@ FadePtr Fade::New(Dali::Toolkit::Control control, float opacity, TimePeriod time durationSeconds = 0.0f; } - FadePtr fade = new Fade(control, Dali::Clamp(opacity, 0.0f, 1.0f), TimePeriod(delaySeconds, durationSeconds)); + FadeTransitionPtr fadeTransition = new FadeTransition(control, Dali::Clamp(opacity, 0.0f, 1.0f), TimePeriod(delaySeconds, durationSeconds)); // Second-phase construction - fade->Initialize(); + fadeTransition->Initialize(); - return fade; + return fadeTransition; } -Fade::Fade(Dali::Toolkit::Control control, float opacity, TimePeriod timePeriod) +FadeTransition::FadeTransition(Dali::Toolkit::Control control, float opacity, TimePeriod timePeriod) : TransitionBase(), mTargetControl(control), mOpacity(opacity) @@ -70,11 +65,11 @@ Fade::Fade(Dali::Toolkit::Control control, float opacity, TimePeriod timePeriod) SetTimePeriod(timePeriod); } -Fade::~Fade() +FadeTransition::~FadeTransition() { } -void Fade::OnPlay() +void FadeTransition::OnPlay() { Dali::Toolkit::Control targetControl = mTargetControl.GetHandle(); if(!targetControl || !targetControl[Dali::Actor::Property::CONNECTED_TO_SCENE]) @@ -83,27 +78,21 @@ void Fade::OnPlay() return; } - Property::Map initialPropertyMap; Property::Map startPropertyMap; Property::Map finishPropertyMap; - float targetOpacity = GetWorldColor(targetControl).a; - targetControl[Dali::Actor::Property::COLOR_MODE] = Dali::ColorMode::USE_OWN_COLOR; - + float targetOpacity = targetControl[Dali::Actor::Property::OPACITY]; if(IsAppearingTransition()) { - initialPropertyMap.Insert(Dali::Actor::Property::OPACITY, 0.0f); startPropertyMap.Insert(Dali::Actor::Property::OPACITY, mOpacity * targetOpacity); finishPropertyMap.Insert(Dali::Actor::Property::OPACITY, targetOpacity); } else { - initialPropertyMap.Insert(Dali::Actor::Property::OPACITY, targetOpacity); startPropertyMap.Insert(Dali::Actor::Property::OPACITY, targetOpacity); finishPropertyMap.Insert(Dali::Actor::Property::OPACITY, mOpacity * targetOpacity); } - SetInitialPropertyMap(initialPropertyMap); SetStartPropertyMap(startPropertyMap); SetFinishPropertyMap(finishPropertyMap); } diff --git a/dali-toolkit/internal/transition/fade-impl.h b/dali-toolkit/internal/transition/fade-transition-impl.h similarity index 53% rename from dali-toolkit/internal/transition/fade-impl.h rename to dali-toolkit/internal/transition/fade-transition-impl.h index 0ac5c73..c2040b0 100644 --- a/dali-toolkit/internal/transition/fade-impl.h +++ b/dali-toolkit/internal/transition/fade-transition-impl.h @@ -1,5 +1,5 @@ -#ifndef DALI_TOOLKIT_INTERNAL_FADE_H -#define DALI_TOOLKIT_INTERNAL_FADE_H +#ifndef DALI_TOOLKIT_INTERNAL_FADE_TRANSITION_H +#define DALI_TOOLKIT_INTERNAL_FADE_TRANSITION_H /* * Copyright (c) 2021 Samsung Electronics Co., Ltd. @@ -21,7 +21,7 @@ // INTERNAL INCLUDES #include #include -#include +#include // EXTERNAL INCLUDES #include @@ -32,75 +32,75 @@ namespace Toolkit { namespace Internal { -using FadePtr = IntrusivePtr; +using FadeTransitionPtr = IntrusivePtr; -class Fade : public TransitionBase +class FadeTransition : public TransitionBase { public: /** - * @brief Create a new Fade object. + * @brief Create a new FadeTransition object. * @param[in] control A control of this transition. * @param[in] opacity opacity value the control Opacity property will be changed from/to. * @param[in] timePeriod The duration of the animation. - * @return A smart-pointer to the newly allocated Fade. + * @return A smart-pointer to the newly allocated FadeTransition. */ - static FadePtr New(Dali::Toolkit::Control control, float opacity, TimePeriod timePeriod); + static FadeTransitionPtr New(Dali::Toolkit::Control control, float opacity, TimePeriod timePeriod); protected: /** - * @copydoc Dali::Toolkit::Fade::OnPlay() + * @copydoc Dali::Toolkit::FadeTransition::OnPlay() */ void OnPlay() override; protected: /** - * @brief Construct a new Fade. + * @brief Construct a new FadeTransition. */ - Fade(Dali::Toolkit::Control control, - float opacity, - TimePeriod timePeriod); + FadeTransition(Dali::Toolkit::Control control, + float opacity, + TimePeriod timePeriod); /** * @brief A reference counted object may only be deleted by calling Unreference() */ - ~Fade() override; + ~FadeTransition() override; private: // Undefined - Fade(const Fade&); + FadeTransition(const FadeTransition&); // Undefined - Fade& operator=(const Fade& rhs); + FadeTransition& operator=(const FadeTransition& rhs); private: WeakHandle mTargetControl; - float mOpacity; + float mOpacity; }; } // namespace Internal // Helpers for public-api forwarding methods -inline Internal::Fade& GetImplementation(Dali::Toolkit::Fade& fade) +inline Internal::FadeTransition& GetImplementation(Dali::Toolkit::FadeTransition& fade) { - DALI_ASSERT_ALWAYS(fade && "Fade handle is empty"); + DALI_ASSERT_ALWAYS(fade && "FadeTransition handle is empty"); BaseObject& handle = fade.GetBaseObject(); - return static_cast(handle); + return static_cast(handle); } -inline const Internal::Fade& GetImplementation(const Dali::Toolkit::Fade& fade) +inline const Internal::FadeTransition& GetImplementation(const Dali::Toolkit::FadeTransition& fade) { - DALI_ASSERT_ALWAYS(fade && "Fade handle is empty"); + DALI_ASSERT_ALWAYS(fade && "FadeTransition handle is empty"); const BaseObject& handle = fade.GetBaseObject(); - return static_cast(handle); + return static_cast(handle); } } // namespace Toolkit } // namespace Dali -#endif // DALI_TOOLKIT_INTERNAL_FADE_H +#endif // DALI_TOOLKIT_INTERNAL_FADE_TRANSITION_H diff --git a/dali-toolkit/internal/transition/transition-base-impl.cpp b/dali-toolkit/internal/transition/transition-base-impl.cpp index ca34d77..f8aed47 100644 --- a/dali-toolkit/internal/transition/transition-base-impl.cpp +++ b/dali-toolkit/internal/transition/transition-base-impl.cpp @@ -36,8 +36,20 @@ namespace Internal { namespace { +static constexpr float OPACITY_TRANSPARENT = 0.0f; + const Dali::AlphaFunction DEFAULT_ALPHA_FUNCTION(Dali::AlphaFunction::DEFAULT); +const Property::Map PROPERTY_MAP_INDEPENDENT_CONTROL{ + {Dali::Actor::Property::ANCHOR_POINT, AnchorPoint::CENTER}, + {Dali::Actor::Property::PARENT_ORIGIN, ParentOrigin::CENTER}, + {Dali::Actor::Property::POSITION_USES_ANCHOR_POINT, true}, + {Dali::Actor::Property::INHERIT_POSITION, false}, + {Dali::Actor::Property::INHERIT_ORIENTATION, false}, + {Dali::Actor::Property::INHERIT_SCALE, false}, + {Dali::Actor::Property::COLOR_MODE, Dali::ColorMode::USE_OWN_COLOR}, +}; + Property::Map GetOriginalProperties(Dali::Toolkit::Control control) { Property::Map propertyMap; @@ -105,7 +117,8 @@ TransitionBase::TransitionBase() mTimePeriod(TimePeriod(0.0f)), mTransitionWithChild(false), mMoveTargetChildren(false), - mIsAppearingTransition(true) + mIsAppearingTransition(true), + mIsPairTransition(false) { } @@ -168,6 +181,20 @@ void TransitionBase::Play() return; } + // Set world transform and color to the target control to make it independent of the parent control and its transition. + // The properties will be returned at the TransitionFinished() method. + Matrix targetWorldTransform = GetWorldTransform(mTarget); + Vector3 targetPosition, targetScale; + Quaternion targetOrientation; + targetWorldTransform.GetTransformComponents(targetPosition, targetOrientation, targetScale); + Vector4 targetColor = GetWorldColor(mTarget); + + mTarget.SetProperties(PROPERTY_MAP_INDEPENDENT_CONTROL); + mTarget[Dali::Actor::Property::POSITION] = targetPosition; + mTarget[Dali::Actor::Property::SCALE] = targetScale; + mTarget[Dali::Actor::Property::ORIENTATION] = targetOrientation; + mTarget[Dali::Actor::Property::COLOR] = targetColor; + OnPlay(); SetAnimation(); @@ -181,31 +208,40 @@ void TransitionBase::SetAnimation() return; } + // If this transition is not a transition from a Control to another Control + // and a transition effect to appear with delay, + // the mTarget should not be shown until delay seconds. + if(!IsPairTransition() && mIsAppearingTransition && mAnimation && mTimePeriod.delaySeconds > Dali::Math::MACHINE_EPSILON_10) + { + Dali::KeyFrames initialKeyframes = Dali::KeyFrames::New(); + initialKeyframes.Add(0.0f, OPACITY_TRANSPARENT); + initialKeyframes.Add(1.0f, OPACITY_TRANSPARENT); + mAnimation.AnimateBetween(Property(mTarget, Dali::Actor::Property::OPACITY), initialKeyframes, TimePeriod(mTimePeriod.delaySeconds)); + } + for(uint32_t i = 0; i < mStartPropertyMap.Count(); ++i) { - Property::Value* initialValuePointer = mInitialPropertyMap.Find(mStartPropertyMap.GetKeyAt(i).indexKey); Property::Value* finishValue = mFinishPropertyMap.Find(mStartPropertyMap.GetKeyAt(i).indexKey); if(finishValue) { - Property::Value initialValue = mStartPropertyMap.GetValue(i); - if(initialValuePointer) - { - initialValue = *initialValuePointer; - } - AnimateBetween(mTarget, mStartPropertyMap.GetKeyAt(i).indexKey, initialValue, mStartPropertyMap.GetValue(i), *finishValue); + AnimateBetween(mTarget, mStartPropertyMap.GetKeyAt(i).indexKey, mStartPropertyMap.GetValue(i), *finishValue); } } } -void TransitionBase::AnimateBetween(Dali::Toolkit::Control target, Property::Index index, Property::Value initialValue, Property::Value sourceValue, Property::Value destinationValue) +void TransitionBase::AnimateBetween(Dali::Toolkit::Control target, Property::Index index, Property::Value sourceValue, Property::Value destinationValue) { if(mAnimation) { - if(mTimePeriod.delaySeconds>0.0f) + // To make each property keep start value during delay time. + // When this transition is not Pair transition, it is not required. + // (For appearing transition, the mTarget control will not be shown during delay time, + // For disapplearing transition, the property of mTarget control keeps current value during delay time) + if(IsPairTransition() && mTimePeriod.delaySeconds > Dali::Math::MACHINE_EPSILON_10) { Dali::KeyFrames initialKeyframes = Dali::KeyFrames::New(); - initialKeyframes.Add(0.0f, initialValue); - initialKeyframes.Add(1.0f, initialValue); + initialKeyframes.Add(0.0f, sourceValue); + initialKeyframes.Add(1.0f, sourceValue); mAnimation.AnimateBetween(Property(target, index), initialKeyframes, TimePeriod(mTimePeriod.delaySeconds)); } Dali::KeyFrames keyframes = Dali::KeyFrames::New(); diff --git a/dali-toolkit/internal/transition/transition-base-impl.h b/dali-toolkit/internal/transition/transition-base-impl.h index b3289ec..409eb60 100644 --- a/dali-toolkit/internal/transition/transition-base-impl.h +++ b/dali-toolkit/internal/transition/transition-base-impl.h @@ -102,14 +102,7 @@ public: } protected: - /** - * @brief Set property map which will be used as a initial properties. - * @param[in] propertyMap propertyMap that will be used as a start value of transition. - */ - void SetInitialPropertyMap(const Property::Map& propertyMap) - { - mInitialPropertyMap = propertyMap; - } + /** * @brief Set property map which will be used as a animation start properties. * @param[in] propertyMap propertyMap that will be used as a start value of transition. @@ -173,6 +166,23 @@ protected: return mIsAppearingTransition; } + /** + * @brief Set whether this transition is a transition from a Control to another Control or effect to appearing or disappearing. + * @param[in] pairTransition True if this transition is appearing transition. + */ + void SetPairTransition(bool pairTransition) + { + mIsPairTransition = pairTransition; + } + + /** + * @brief Returns whether this transition is a transition from a Control to another Control or effect to appearing or disappearing. + */ + bool IsPairTransition() const + { + return mIsPairTransition; + } + protected: /** * Construct a new TransitionBase. @@ -206,11 +216,10 @@ private: * @brief Adds a property on an animation between sourceValue and destimationValue. * @param[in] target target control to be animated. * @param[in] index property index for animation. - * @param[in] initialValue initial value of animation. * @param[in] sourceValue source value of animation. * @param[in] destinationValue destination value of animation. */ - void AnimateBetween(Dali::Toolkit::Control target, Property::Index index, Property::Value initialValue, Property::Value sourceValue, Property::Value destinationValue); + void AnimateBetween(Dali::Toolkit::Control target, Property::Index index, Property::Value sourceValue, Property::Value destinationValue); /** * @brief Copy target to make clone for the child Actors @@ -243,7 +252,6 @@ private: Dali::Actor mCopiedActor; ///< Copied View that will replace mTarget during transition Dali::Animation mAnimation; ///< Property animations for the transition of mTarget AlphaFunction mAlphaFunction; ///< Alpha function that will applied for the property animation - Property::Map mInitialPropertyMap; ///< Initial properties to be animated. (world transform) Property::Map mStartPropertyMap; ///< Start properties to be animated. (world transform) Property::Map mFinishPropertyMap; ///< Finish properties to be animated. (world transform) Property::Map mOriginalPropertyMap; ///< Original properties of mTarget to be used to restore after the transition is finished. @@ -252,6 +260,7 @@ private: ///< If this is false, the child Actors are moved to the child of mCopiedActor that will have original properties of target Actor during Transition. bool mMoveTargetChildren; ///< Flag, if mTransitionWithChild is false and mTarget has children than True. bool mIsAppearingTransition; ///< True, if this transition is appearing transition. + bool mIsPairTransition; ///< True, if this transition is started from a Control to another Control. }; } // namespace Internal diff --git a/dali-toolkit/internal/transition/transition-impl.cpp b/dali-toolkit/internal/transition/transition-impl.cpp index a465433..2cbd14d 100644 --- a/dali-toolkit/internal/transition/transition-impl.cpp +++ b/dali-toolkit/internal/transition/transition-impl.cpp @@ -71,6 +71,7 @@ Transition::Transition(Dali::Toolkit::Control source, Dali::Toolkit::Control des { SetTarget(destination); SetTimePeriod(timePeriod); + SetPairTransition(true); } Transition::~Transition() @@ -94,25 +95,15 @@ void Transition::OnPlay() Quaternion sourceOrientation; sourceWorldTransform.GetTransformComponents(sourcePosition, sourceOrientation, sourceScale); - Matrix destinationWorldTransform = GetWorldTransform(destinationControl); - Vector3 destinationPosition, destinationScale; - Quaternion destinationOrientation; - destinationWorldTransform.GetTransformComponents(destinationPosition, destinationOrientation, destinationScale); + 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]; - 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); diff --git a/dali-toolkit/internal/transition/transition-set-impl.cpp b/dali-toolkit/internal/transition/transition-set-impl.cpp index ad7ca62..fd019b6 100644 --- a/dali-toolkit/internal/transition/transition-set-impl.cpp +++ b/dali-toolkit/internal/transition/transition-set-impl.cpp @@ -128,9 +128,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(); diff --git a/dali-toolkit/public-api/file.list b/dali-toolkit/public-api/file.list index 212dba7..71cbc3a 100644 --- a/dali-toolkit/public-api/file.list +++ b/dali-toolkit/public-api/file.list @@ -32,7 +32,7 @@ SET( public_api_src_files ${public_api_src_dir}/image-loader/async-image-loader.cpp ${public_api_src_dir}/image-loader/sync-image-loader.cpp ${public_api_src_dir}/styling/style-manager.cpp - ${public_api_src_dir}/transition/fade.cpp + ${public_api_src_dir}/transition/fade-transition.cpp ${public_api_src_dir}/transition/transition-base.cpp ${public_api_src_dir}/transition/transition-set.cpp ${public_api_src_dir}/transition/transition.cpp @@ -151,7 +151,7 @@ SET( public_api_visuals_header_files ) SET( public_api_transition_header_files - ${public_api_src_dir}/transition/fade.h + ${public_api_src_dir}/transition/fade-transition.h ${public_api_src_dir}/transition/transition-base.h ${public_api_src_dir}/transition/transition-set.h ${public_api_src_dir}/transition/transition.h diff --git a/dali-toolkit/public-api/transition/fade-transition.cpp b/dali-toolkit/public-api/transition/fade-transition.cpp new file mode 100644 index 0000000..9d08185 --- /dev/null +++ b/dali-toolkit/public-api/transition/fade-transition.cpp @@ -0,0 +1,59 @@ +/* + * Copyright (c) 2021 Samsung Electronics Co., Ltd. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +// CLASS HEADER +#include + +// INTERNAL INCLUDES +#include + +namespace Dali +{ +namespace Toolkit +{ +FadeTransition::FadeTransition() = default; + +FadeTransition::FadeTransition(Internal::FadeTransition* fadeTransition) +: TransitionBase(fadeTransition) +{ +} + +FadeTransition FadeTransition::New(Dali::Toolkit::Control control, float opacity, TimePeriod timePeriod) +{ + Internal::FadeTransitionPtr internal = Dali::Toolkit::Internal::FadeTransition::New(control, opacity, timePeriod); + + return FadeTransition(internal.Get()); +} + +FadeTransition FadeTransition::DownCast(BaseHandle handle) +{ + return FadeTransition(dynamic_cast(handle.GetObjectPtr())); +} + +FadeTransition::~FadeTransition() = default; + +FadeTransition::FadeTransition(const FadeTransition& handle) = default; + +FadeTransition& FadeTransition::operator=(const FadeTransition& rhs) = default; + +FadeTransition::FadeTransition(FadeTransition&& rhs) = default; + +FadeTransition& FadeTransition::operator=(FadeTransition&& rhs) = default; + +} // namespace Toolkit + +} // namespace Dali diff --git a/dali-toolkit/public-api/transition/fade.h b/dali-toolkit/public-api/transition/fade-transition.h similarity index 63% rename from dali-toolkit/public-api/transition/fade.h rename to dali-toolkit/public-api/transition/fade-transition.h index dbafb7b..3f5542a 100644 --- a/dali-toolkit/public-api/transition/fade.h +++ b/dali-toolkit/public-api/transition/fade-transition.h @@ -1,5 +1,5 @@ -#ifndef DALI_TOOLKIT_FADE_H -#define DALI_TOOLKIT_FADE_H +#ifndef DALI_TOOLKIT_FADE_TRANSITION_H +#define DALI_TOOLKIT_FADE_TRANSITION_H /* * Copyright (c) 2021 Samsung Electronics Co., Ltd. @@ -28,56 +28,56 @@ namespace Toolkit { namespace Internal DALI_INTERNAL { -class Fade; +class FadeTransition; } /** * @brief Fade provides smoothly appearing/disappearing effects for target Control. */ -class DALI_TOOLKIT_API Fade : public TransitionBase +class DALI_TOOLKIT_API FadeTransition : public TransitionBase { public: /** - * @brief Creates an uninitialized Fade; this can be initialized with Fade::New(). + * @brief Creates an uninitialized FadeTransition; this can be initialized with FadeTransition::New(). * - * Calling member functions with an uninitialized Fade handle is not allowed. + * Calling member functions with an uninitialized FadeTransition handle is not allowed. */ - Fade(); + FadeTransition(); /** - * @brief Creates an initialized Fade. + * @brief Creates an initialized FadeTransition. * * @param[in] control A control of this transition. * @param[in] opacity opacity value the control Opacity property will be changed from/to. Opacity must be between [0, 1]. * @param[in] timePeriod The duration of the animation. * @return A handle to a newly allocated Dali resource */ - static Fade New(Dali::Toolkit::Control control, float opacity, TimePeriod timePeriod); + static FadeTransition New(Dali::Toolkit::Control control, float opacity, TimePeriod timePeriod); /** - * @brief Downcasts a handle to Fade handle. + * @brief Downcasts a handle to FadeTransition handle. * - * If handle points to an Fade object, the downcast produces valid handle. + * If handle points to an FadeTransition object, the downcast produces valid handle. * If not, the returned handle is left uninitialized. * * @param[in] handle Handle to an object - * @return Handle to an Fade object or an uninitialized handle + * @return Handle to an FadeTransition object or an uninitialized handle */ - static Fade DownCast(BaseHandle handle); + static FadeTransition DownCast(BaseHandle handle); /** * @brief Destructor. * * This is non-virtual since derived Handle types must not contain data or virtual methods. */ - ~Fade(); + ~FadeTransition(); /** * @brief This copy constructor is required for (smart) pointer semantics. * * @param[in] handle A reference to the copied handle */ - Fade(const Fade& handle); + FadeTransition(const FadeTransition& handle); /** * @brief This assignment operator is required for (smart) pointer semantics. @@ -85,14 +85,14 @@ public: * @param[in] rhs A reference to the copied handle * @return A reference to this */ - Fade& operator=(const Fade& rhs); + FadeTransition& operator=(const FadeTransition& rhs); /** * @brief Move constructor. * * @param[in] rhs A reference to the moved handle */ - Fade(Fade&& rhs); + FadeTransition(FadeTransition&& rhs); /** * @brief Move assignment operator. @@ -100,15 +100,15 @@ public: * @param[in] rhs A reference to the moved handle * @return A reference to this handle */ - Fade& operator=(Fade&& rhs); + FadeTransition& operator=(FadeTransition&& rhs); public: // Not intended for use by Application developers /// @cond internal /** - * @brief This constructor is used by Fade::New() methods. - * @param[in] fade A pointer to a newly allocated Dali resource + * @brief This constructor is used by FadeTransition::New() methods. + * @param[in] fadeTransition A pointer to a newly allocated Dali resource */ - explicit DALI_INTERNAL Fade(Internal::Fade* fade); + explicit DALI_INTERNAL FadeTransition(Internal::FadeTransition* fadeTransition); /// @endcond }; @@ -116,4 +116,4 @@ public: // Not intended for use by Application developers } // namespace Dali -#endif // DALI_TOOLKIT_FADE_H +#endif // DALI_TOOLKIT_FADE_TRANSITION_H diff --git a/dali-toolkit/public-api/transition/fade.cpp b/dali-toolkit/public-api/transition/fade.cpp deleted file mode 100644 index b5e54dc..0000000 --- a/dali-toolkit/public-api/transition/fade.cpp +++ /dev/null @@ -1,59 +0,0 @@ -/* - * Copyright (c) 2021 Samsung Electronics Co., Ltd. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ - -// CLASS HEADER -#include - -// INTERNAL INCLUDES -#include - -namespace Dali -{ -namespace Toolkit -{ -Fade::Fade() = default; - -Fade::Fade(Internal::Fade* fade) -: TransitionBase(fade) -{ -} - -Fade Fade::New(Dali::Toolkit::Control control, float opacity, TimePeriod timePeriod) -{ - Internal::FadePtr internal = Dali::Toolkit::Internal::Fade::New(control, opacity, timePeriod); - - return Fade(internal.Get()); -} - -Fade Fade::DownCast(BaseHandle handle) -{ - return Fade(dynamic_cast(handle.GetObjectPtr())); -} - -Fade::~Fade() = default; - -Fade::Fade(const Fade& handle) = default; - -Fade& Fade::operator=(const Fade& rhs) = default; - -Fade::Fade(Fade&& rhs) = default; - -Fade& Fade::operator=(Fade&& rhs) = default; - -} // namespace Toolkit - -} // namespace Dali diff --git a/dali-toolkit/public-api/transition/transition-set.h b/dali-toolkit/public-api/transition/transition-set.h index 8df1ea5..b690d45 100644 --- a/dali-toolkit/public-api/transition/transition-set.h +++ b/dali-toolkit/public-api/transition/transition-set.h @@ -37,11 +37,13 @@ class TransitionSet; /** * @brief - * * TransitionSet is used to control lifetime of multiple Transitions. * Transition could be played with multiple other transitions for a scene change. * For the case, it is more useful to manage a group of transitions with same lifetime and a finished signal. * TransitionSet provides a single Play call and Finished callback for the multiple traisitions those added on it. + * + * @note + * Do not add transitions for a View by dividing them into multiple TransitionSets. */ class DALI_TOOLKIT_API TransitionSet : public BaseHandle {