X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=dali%2Finternal%2Fevent%2Fanimation%2Fanimation-playlist.cpp;h=c39385f7fef20f962f6088aaa295cd3c59a40556;hb=0c17fedc6fae9c4ca443b1eda9eab846215ca518;hp=6b5fa06801c51e5fbae8659ac9d751e3dceb9025;hpb=7dcb0a38005dd8c6d71e466c1ea0ec4d7d57239f;p=platform%2Fcore%2Fuifw%2Fdali-core.git diff --git a/dali/internal/event/animation/animation-playlist.cpp b/dali/internal/event/animation/animation-playlist.cpp index 6b5fa06..c39385f 100644 --- a/dali/internal/event/animation/animation-playlist.cpp +++ b/dali/internal/event/animation/animation-playlist.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2014 Samsung Electronics Co., Ltd. + * Copyright (c) 2020 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. @@ -21,7 +21,6 @@ // INTERNAL INCLUDES #include -#include #include @@ -46,34 +45,41 @@ AnimationPlaylist::~AnimationPlaylist() void AnimationPlaylist::AnimationCreated( Animation& animation ) { - mAnimations.insert( &animation ); + mAnimations.PushBack( &animation ); } void AnimationPlaylist::AnimationDestroyed( Animation& animation ) { - std::set< Animation* >::iterator iter = find( mAnimations.begin(), mAnimations.end(), &animation ); - DALI_ASSERT_ALWAYS( iter != mAnimations.end() && "Animation not found" ); + Dali::Vector< Animation* >::Iterator iter = std::find( mAnimations.Begin(), mAnimations.End(), &animation ); + DALI_ASSERT_ALWAYS( iter != mAnimations.End() && "Animation not found" ); - mAnimations.erase( iter ); + mAnimations.Remove( iter ); } void AnimationPlaylist::OnPlay( Animation& animation ) { - mPlaylist.insert( Dali::Animation(&animation) ); + mPlaylist.push_back( Dali::Animation(&animation) ); } void AnimationPlaylist::OnClear( Animation& animation ) { - mPlaylist.erase( Dali::Animation(&animation) ); + std::vector< Dali::Animation >::iterator iter = std::find( mPlaylist.begin(), mPlaylist.end(), Dali::Animation(&animation) ); + std::vector< Dali::Animation >::iterator last = mPlaylist.end(); + if( iter != last ) + { + --last; // move to real last + std::swap( *iter, *last ); // swap + mPlaylist.resize( mPlaylist.size() - 1u ); + } } -void AnimationPlaylist::NotifyFinishedAnimations() +void AnimationPlaylist::NotifyCompleted() { std::vector< Dali::Animation > finishedAnimations; // Since animations can be unreferenced during the signal emissions, iterators into animationPointers may be invalidated. // First copy and reference the finished animations, then emit signals - for ( std::set< Animation* >::iterator iter = mAnimations.begin(); iter != mAnimations.end(); ++iter ) + for ( Dali::Vector< Animation* >::Iterator iter = mAnimations.Begin(); iter != mAnimations.End(); ++iter ) { Animation* animation = *iter; @@ -83,7 +89,9 @@ void AnimationPlaylist::NotifyFinishedAnimations() // The animation may be present in mPlaylist - remove if necessary // Note that the animation "Finish" signal is emitted after Stop() has been called - mPlaylist.erase( Dali::Animation(animation) ); + std::vector< Dali::Animation >::iterator iter = std::find( mPlaylist.begin(), mPlaylist.end(), Dali::Animation(animation) ); + DALI_ASSERT_DEBUG(iter != mPlaylist.end()); + mPlaylist.erase( iter ); } } @@ -96,6 +104,44 @@ void AnimationPlaylist::NotifyFinishedAnimations() } } +void AnimationPlaylist::NotifyProgressReached( const SceneGraph::Animation* sceneGraphAnimation ) +{ + std::vector< Dali::Animation > notifyProgressAnimations; // Will own animations until all emits have been done + + for ( Dali::Vector< Animation* >::Iterator iter = mAnimations.Begin(); iter != mAnimations.End(); ++iter ) + { + Animation* animation = *iter; + + if ( ( animation->GetSceneObject() ) == sceneGraphAnimation ) + { + // Store handles to animations that need signals emitted in the case of an animation being cleared in-between emits + notifyProgressAnimations.push_back( Dali::Animation( animation ) ); + } + } + + for ( std::vector< Dali::Animation >::iterator iter = notifyProgressAnimations.begin(); iter != notifyProgressAnimations.end(); ++iter ) + { + Dali::Animation& handle = *iter; + + GetImplementation(handle).EmitSignalProgressReached(); + } +} + +uint32_t AnimationPlaylist::GetAnimationCount() +{ + return mAnimations.Size(); +} + +Dali::Animation AnimationPlaylist::GetAnimationAt( uint32_t index ) +{ + if( index >= mAnimations.Size() ) + { + DALI_LOG_ERROR( "Animation index is out of bounds.\n" ); + return Dali::Animation(); + } + return Dali::Animation( mAnimations[index] ); +} + } // namespace Internal } // namespace Dali