diff options
Diffstat (limited to 'slideshow/source/engine')
5 files changed, 41 insertions, 4 deletions
diff --git a/slideshow/source/engine/activitiesqueue.cxx b/slideshow/source/engine/activitiesqueue.cxx index ba982385356e..2e3b29d9dbc7 100644 --- a/slideshow/source/engine/activitiesqueue.cxx +++ b/slideshow/source/engine/activitiesqueue.cxx @@ -50,6 +50,8 @@ namespace slideshow::internal { for( const auto& pActivity : maCurrentActivitiesWaiting ) pActivity->dispose(); + for( const auto& pActivity : maCurrentTailActivitiesWaiting ) + pActivity->dispose(); for( const auto& pActivity : maCurrentActivitiesReinsert ) pActivity->dispose(); } @@ -72,10 +74,31 @@ namespace slideshow::internal return true; } + bool ActivitiesQueue::addTailActivity(const ActivitySharedPtr &pActivity) + { + OSL_ENSURE( pActivity, "ActivitiesQueue::addTailActivity: activity ptr NULL" ); + + if( !pActivity ) + return false; + + // Activities that should be processed last are kept in a different + // ActivityQueue, and later appended to the end of the maCurrentActivitiesWaiting + // on the beginning of ActivitiesQueue::process() + maCurrentTailActivitiesWaiting.push_back( pActivity ); + + return true; + } + void ActivitiesQueue::process() { SAL_INFO("slideshow.verbose", "ActivitiesQueue: outer loop heartbeat" ); + // If there are activities to be processed last append them to the end of the ActivitiesQueue + maCurrentActivitiesWaiting.insert( maCurrentActivitiesWaiting.end(), + maCurrentTailActivitiesWaiting.begin(), + maCurrentTailActivitiesWaiting.end() ); + maCurrentTailActivitiesWaiting.clear(); + // accumulate time lag for all activities, and lag time // base if necessary: double fLag = 0.0; diff --git a/slideshow/source/engine/animationnodes/animationbasenode.cxx b/slideshow/source/engine/animationnodes/animationbasenode.cxx index 4dcb640795aa..1a15bf2de843 100644 --- a/slideshow/source/engine/animationnodes/animationbasenode.cxx +++ b/slideshow/source/engine/animationnodes/animationbasenode.cxx @@ -45,12 +45,12 @@ AnimationBaseNode::AnimationBaseNode( mxAnimateNode( xNode, uno::UNO_QUERY_THROW ), maAttributeLayerHolder(), maSlideSize( rContext.maSlideSize ), - mpActivity(), mpShape(), mpShapeSubset(), mpSubsetManager(rContext.maContext.mpSubsettableShapeManager), mbPreservedVisibility(true), - mbIsIndependentSubset( rContext.mbIsIndependentSubset ) + mbIsIndependentSubset( rContext.mbIsIndependentSubset ), + mpActivity() { // extract native node targets // =========================== @@ -294,7 +294,7 @@ void AnimationBaseNode::activate_st() mpActivity->setTargets( getShape(), maAttributeLayerHolder.get() ); // add to activities queue - getContext().mrActivitiesQueue.addActivity( mpActivity ); + enqueueActivity(); } else { // Actually, DO generate the event for empty activity, @@ -372,6 +372,11 @@ bool AnimationBaseNode::hasPendingAnimation() const return true; } +bool AnimationBaseNode::enqueueActivity() const +{ + return getContext().mrActivitiesQueue.addActivity( mpActivity ); +} + #if defined(DBG_UTIL) void AnimationBaseNode::showState() const { diff --git a/slideshow/source/engine/animationnodes/animationbasenode.hxx b/slideshow/source/engine/animationnodes/animationbasenode.hxx index d31a3a5a2fc9..6bb5cd1f2ff7 100644 --- a/slideshow/source/engine/animationnodes/animationbasenode.hxx +++ b/slideshow/source/engine/animationnodes/animationbasenode.hxx @@ -59,6 +59,7 @@ protected: private: virtual bool hasPendingAnimation() const override; + virtual bool enqueueActivity() const; private: // state transition callbacks virtual bool init_st() override; @@ -79,7 +80,6 @@ private: css::uno::Reference<css::animations::XAnimate> mxAnimateNode; ShapeAttributeLayerHolder maAttributeLayerHolder; ::basegfx::B2DVector maSlideSize; - AnimationActivitySharedPtr mpActivity; /// When valid, this node has a plain target shape AttributableShapeSharedPtr mpShape; @@ -88,6 +88,9 @@ private: SubsettableShapeManagerSharedPtr mpSubsetManager; bool mbPreservedVisibility; bool mbIsIndependentSubset; + +protected: + AnimationActivitySharedPtr mpActivity; }; } // namespace presentation::internal diff --git a/slideshow/source/engine/animationnodes/animationphysicsnode.cxx b/slideshow/source/engine/animationnodes/animationphysicsnode.cxx index 28e247c30d6c..8f531ea24ed7 100644 --- a/slideshow/source/engine/animationnodes/animationphysicsnode.cxx +++ b/slideshow/source/engine/animationnodes/animationphysicsnode.cxx @@ -43,6 +43,11 @@ AnimationActivitySharedPtr AnimationPhysicsNode::createActivity() const true); } +bool AnimationPhysicsNode::enqueueActivity() const +{ + return getContext().mrActivitiesQueue.addTailActivity(mpActivity); +} + } // namespace slideshow::internal /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/slideshow/source/engine/animationnodes/animationphysicsnode.hxx b/slideshow/source/engine/animationnodes/animationphysicsnode.hxx index 15ac8911e916..8517dbbb803b 100644 --- a/slideshow/source/engine/animationnodes/animationphysicsnode.hxx +++ b/slideshow/source/engine/animationnodes/animationphysicsnode.hxx @@ -44,6 +44,7 @@ protected: private: virtual AnimationActivitySharedPtr createActivity() const override; + virtual bool enqueueActivity() const override; css::uno::Reference<css::animations::XAnimateMotion> mxPhysicsMotionNode; }; |