From: Heeyong Song Date: Tue, 22 Oct 2019 05:39:18 +0000 (+0900) Subject: (Vector) Pause animation when the window is hidden X-Git-Tag: dali_1.4.43~4 X-Git-Url: http://review.tizen.org/git/?p=platform%2Fcore%2Fuifw%2Fdali-toolkit.git;a=commitdiff_plain;h=ecd29518008c9ac00b8b379d87dc6fecaddfff79;ds=sidebyside (Vector) Pause animation when the window is hidden Change-Id: I26b67436050a3ee2a65c9e38770f77df406c1d1e --- diff --git a/automated-tests/src/dali-toolkit/dali-toolkit-test-utils/toolkit-window-impl.h b/automated-tests/src/dali-toolkit/dali-toolkit-test-utils/toolkit-window-impl.h index 1615e62..cf2ccef 100644 --- a/automated-tests/src/dali-toolkit/dali-toolkit-test-utils/toolkit-window-impl.h +++ b/automated-tests/src/dali-toolkit/dali-toolkit-test-utils/toolkit-window-impl.h @@ -44,6 +44,7 @@ public: virtual ~Window() = default; static Window* New(const PositionSize& positionSize, const std::string& name, const std::string& className, bool isTransparent); FocusChangeSignalType mFocusChangeSignal; + DevelWindow::VisibilityChangedSignalType mVisibilityChangedSignal; }; } // namespace Adaptor diff --git a/automated-tests/src/dali-toolkit/dali-toolkit-test-utils/toolkit-window.cpp b/automated-tests/src/dali-toolkit/dali-toolkit-test-utils/toolkit-window.cpp index 9849f60..5ee2dcb 100644 --- a/automated-tests/src/dali-toolkit/dali-toolkit-test-utils/toolkit-window.cpp +++ b/automated-tests/src/dali-toolkit/dali-toolkit-test-utils/toolkit-window.cpp @@ -48,7 +48,9 @@ namespace Adaptor { Window::Window( const PositionSize& positionSize ) -: SceneHolder( positionSize ) +: SceneHolder( positionSize ), + mFocusChangeSignal(), + mVisibilityChangedSignal() { } @@ -155,6 +157,11 @@ void Window::Raise() GetImplementation( *this ).mFocusChangeSignal.Emit(*this, true); } +void Window::Hide() +{ + GetImplementation( *this ).mVisibilityChangedSignal.Emit( *this, false ); +} + FocusChangeSignalType& Window::FocusChangeSignal() { return GetImplementation( *this ).mFocusChangeSignal; @@ -210,6 +217,11 @@ WheelEventSignalType& WheelEventSignal( Window window ) return GetImplementation( window ).WheelEventSignal(); } +VisibilityChangedSignalType& VisibilityChangedSignal( Window window ) +{ + return GetImplementation( window ).mVisibilityChangedSignal; +} + } // namespace DevelWindow } // Dali diff --git a/automated-tests/src/dali-toolkit/dali-toolkit-test-utils/toolkit-window.h b/automated-tests/src/dali-toolkit/dali-toolkit-test-utils/toolkit-window.h index f261051..271f885 100644 --- a/automated-tests/src/dali-toolkit/dali-toolkit-test-utils/toolkit-window.h +++ b/automated-tests/src/dali-toolkit/dali-toolkit-test-utils/toolkit-window.h @@ -67,6 +67,7 @@ public: void SetBackgroundColor( const Vector4& color ); Vector4 GetBackgroundColor() const; void Raise(); + void Hide(); FocusChangeSignalType& FocusChangeSignal(); public: @@ -83,6 +84,7 @@ typedef Signal< void (const KeyEvent&) > KeyEventSignalType; typedef Signal< bool (const KeyEvent&) > KeyEventGeneratedSignalType; typedef Signal< void (const TouchData&) > TouchSignalType; typedef Signal< void (const WheelEvent&) > WheelEventSignalType; +typedef Signal< void ( Window, bool ) > VisibilityChangedSignalType; Dali::Window Get( Actor actor ); Dali::Window DownCast( BaseHandle handle ); @@ -92,6 +94,7 @@ KeyEventSignalType& KeyEventSignal( Dali::Window window ); KeyEventGeneratedSignalType& KeyEventGeneratedSignal( Dali::Window window ); TouchSignalType& TouchSignal( Dali::Window window ); WheelEventSignalType& WheelEventSignal( Window window ); +VisibilityChangedSignalType& VisibilityChangedSignal( Window window ); } } // namespace Dali diff --git a/automated-tests/src/dali-toolkit/utc-Dali-AnimatedVectorImageVisual.cpp b/automated-tests/src/dali-toolkit/utc-Dali-AnimatedVectorImageVisual.cpp index 096b960..9f4ac84 100644 --- a/automated-tests/src/dali-toolkit/utc-Dali-AnimatedVectorImageVisual.cpp +++ b/automated-tests/src/dali-toolkit/utc-Dali-AnimatedVectorImageVisual.cpp @@ -29,6 +29,7 @@ #include #include #include +#include #include "dummy-control.h" using namespace Dali; @@ -1230,10 +1231,10 @@ int UtcDaliAnimatedVectorImageVisualMultipleInstances(void) END_TEST; } -int UtcDaliAnimatedVectorImageVisualVisibilityChanged(void) +int UtcDaliAnimatedVectorImageVisualControlVisibilityChanged(void) { ToolkitTestApplication application; - tet_infoline( "UtcDaliAnimatedVectorImageVisualVisibilityChanged" ); + tet_infoline( "UtcDaliAnimatedVectorImageVisualControlVisibilityChanged" ); Property::Map propertyMap; propertyMap.Add( Toolkit::Visual::Property::TYPE, DevelVisual::ANIMATED_VECTOR_IMAGE ) @@ -1273,3 +1274,48 @@ int UtcDaliAnimatedVectorImageVisualVisibilityChanged(void) END_TEST; } + +int UtcDaliAnimatedVectorImageVisualWindowVisibilityChanged(void) +{ + ToolkitTestApplication application; + tet_infoline( "UtcDaliAnimatedVectorImageVisualWindowVisibilityChanged" ); + + Property::Map propertyMap; + propertyMap.Add( Toolkit::Visual::Property::TYPE, DevelVisual::ANIMATED_VECTOR_IMAGE ) + .Add( ImageVisual::Property::URL, TEST_VECTOR_IMAGE_FILE_NAME ); + + Visual::Base visual = VisualFactory::Get().CreateVisual( propertyMap ); + DALI_TEST_CHECK( visual ); + + DummyControl actor = DummyControl::New( true ); + DummyControlImpl& dummyImpl = static_cast< DummyControlImpl& >( actor.GetImplementation() ); + dummyImpl.RegisterVisual( DummyControl::Property::TEST_VISUAL, visual ); + + Vector2 controlSize( 20.f, 30.f ); + actor.SetSize( controlSize ); + + Stage::GetCurrent().Add( actor ); + + application.SendNotification(); + application.Render(); + + Property::Map attributes; + DevelControl::DoAction( actor, DummyControl::Property::TEST_VISUAL, Dali::Toolkit::DevelAnimatedVectorImageVisual::Action::PLAY, attributes ); + + // Check rendering behavior + DALI_TEST_CHECK( actor.GetRendererCount() == 1u ); + Renderer renderer = actor.GetRendererAt( 0u ); + DALI_TEST_CHECK( renderer ); + DALI_TEST_CHECK( renderer.GetProperty< int >( DevelRenderer::Property::RENDERING_BEHAVIOR ) == DevelRenderer::Rendering::CONTINUOUSLY ); + + Window window = DevelWindow::Get( actor ); + window.Hide(); + + application.SendNotification(); + application.Render(); + + // Check rendering behavior again + DALI_TEST_CHECK( renderer.GetProperty< int >( DevelRenderer::Property::RENDERING_BEHAVIOR ) == DevelRenderer::Rendering::IF_REQUIRED ); + + END_TEST; +} diff --git a/dali-toolkit/internal/visuals/animated-vector-image/animated-vector-image-visual.cpp b/dali-toolkit/internal/visuals/animated-vector-image/animated-vector-image-visual.cpp index 16203e7..ea4dee5 100644 --- a/dali-toolkit/internal/visuals/animated-vector-image/animated-vector-image-visual.cpp +++ b/dali-toolkit/internal/visuals/animated-vector-image/animated-vector-image-visual.cpp @@ -21,6 +21,7 @@ // EXTERNAL INCLUDES #include #include +#include #include // INTERNAL INCLUDES @@ -309,21 +310,23 @@ void AnimatedVectorImageVisual::DoSetOnStage( Actor& actor ) mSizeNotification = actor.AddPropertyNotification( Actor::Property::SIZE, StepCondition( 3.0f ) ); mSizeNotification.NotifySignal().Connect( this, &AnimatedVectorImageVisual::OnSizeNotification ); - DevelActor::VisibilityChangedSignal( actor ).Connect( this, &AnimatedVectorImageVisual::OnVisibilityChanged ); + DevelActor::VisibilityChangedSignal( actor ).Connect( this, &AnimatedVectorImageVisual::OnControlVisibilityChanged ); + + Window window = DevelWindow::Get( actor ); + if( window ) + { + DevelWindow::VisibilityChangedSignal( window ).Connect( this, &AnimatedVectorImageVisual::OnWindowVisibilityChanged ); + } DALI_LOG_INFO( gVectorAnimationLogFilter, Debug::Verbose, "AnimatedVectorImageVisual::DoSetOnStage [%p]\n", this ); } void AnimatedVectorImageVisual::DoSetOffStage( Actor& actor ) { - mVectorAnimationTask->PauseAnimation(); - - mActionStatus = DevelAnimatedVectorImageVisual::Action::PAUSE; + PauseAnimation(); if( mImpl->mRenderer ) { - mImpl->mRenderer.SetProperty( DevelRenderer::Property::RENDERING_BEHAVIOR, DevelRenderer::Rendering::IF_REQUIRED ); - actor.RemoveRenderer( mImpl->mRenderer ); mImpl->mRenderer.Reset(); @@ -334,7 +337,13 @@ void AnimatedVectorImageVisual::DoSetOffStage( Actor& actor ) actor.RemovePropertyNotification( mScaleNotification ); actor.RemovePropertyNotification( mSizeNotification ); - DevelActor::VisibilityChangedSignal( actor ).Connect( this, &AnimatedVectorImageVisual::OnVisibilityChanged ); + DevelActor::VisibilityChangedSignal( actor ).Disconnect( this, &AnimatedVectorImageVisual::OnControlVisibilityChanged ); + + Window window = DevelWindow::Get( actor ); + if( window ) + { + DevelWindow::VisibilityChangedSignal( window ).Disconnect( this, &AnimatedVectorImageVisual::OnWindowVisibilityChanged ); + } mPlacementActor.Reset(); @@ -542,6 +551,21 @@ void AnimatedVectorImageVisual::SetVectorImageSize() } } +void AnimatedVectorImageVisual::PauseAnimation() +{ + if( mActionStatus == DevelAnimatedVectorImageVisual::Action::PLAY ) + { + mVectorAnimationTask->PauseAnimation(); + + mActionStatus = DevelAnimatedVectorImageVisual::Action::PAUSE; + + if( mImpl->mRenderer ) + { + mImpl->mRenderer.SetProperty( DevelRenderer::Property::RENDERING_BEHAVIOR, DevelRenderer::Rendering::IF_REQUIRED ); + } + } +} + void AnimatedVectorImageVisual::OnScaleNotification( PropertyNotification& source ) { Actor actor = mPlacementActor.GetHandle(); @@ -572,23 +596,23 @@ void AnimatedVectorImageVisual::OnSizeNotification( PropertyNotification& source } } -void AnimatedVectorImageVisual::OnVisibilityChanged( Actor actor, bool visible, DevelActor::VisibilityChange::Type type ) +void AnimatedVectorImageVisual::OnControlVisibilityChanged( Actor actor, bool visible, DevelActor::VisibilityChange::Type type ) { if( !visible ) { - if( mActionStatus == DevelAnimatedVectorImageVisual::Action::PLAY ) - { - mVectorAnimationTask->PauseAnimation(); + PauseAnimation(); - if( mImpl->mRenderer ) - { - mImpl->mRenderer.SetProperty( DevelRenderer::Property::RENDERING_BEHAVIOR, DevelRenderer::Rendering::IF_REQUIRED ); - } + DALI_LOG_INFO( gVectorAnimationLogFilter, Debug::Verbose, "AnimatedVectorImageVisual::OnControlVisibilityChanged: invisibile. Pause animation [%p]\n", this ); + } +} - mActionStatus = DevelAnimatedVectorImageVisual::Action::PAUSE; +void AnimatedVectorImageVisual::OnWindowVisibilityChanged( Window window, bool visible ) +{ + if( !visible ) + { + PauseAnimation(); - DALI_LOG_INFO( gVectorAnimationLogFilter, Debug::Verbose, "AnimatedVectorImageVisual::OnVisibilityChanged: invisibile. Pause animation [%p]\n", this ); - } + DALI_LOG_INFO( gVectorAnimationLogFilter, Debug::Verbose, "AnimatedVectorImageVisual::OnWindowVisibilityChanged: invisibile. Pause animation [%p]\n", this ); } } diff --git a/dali-toolkit/internal/visuals/animated-vector-image/animated-vector-image-visual.h b/dali-toolkit/internal/visuals/animated-vector-image/animated-vector-image-visual.h index 78848d0..9143299 100644 --- a/dali-toolkit/internal/visuals/animated-vector-image/animated-vector-image-visual.h +++ b/dali-toolkit/internal/visuals/animated-vector-image/animated-vector-image-visual.h @@ -23,6 +23,7 @@ #include #include #include +#include // INTERNAL INCLUDES #include @@ -167,6 +168,11 @@ private: void SetVectorImageSize(); /** + * @brief Pause the animation. + */ + void PauseAnimation(); + + /** * @brief Callback when the world scale factor changes. */ void OnScaleNotification( PropertyNotification& source ); @@ -179,7 +185,12 @@ private: /** * @brief Callback when the visibility of the actor is changed. */ - void OnVisibilityChanged( Actor actor, bool visible, DevelActor::VisibilityChange::Type type ); + void OnControlVisibilityChanged( Actor actor, bool visible, DevelActor::VisibilityChange::Type type ); + + /** + * @brief Callback when the visibility of the window is changed. + */ + void OnWindowVisibilityChanged( Window window, bool visible ); // Undefined AnimatedVectorImageVisual( const AnimatedVectorImageVisual& visual ) = delete;