tdf#88969 restart interactive sequence.
This patch allows the whole interactive sequence to
restart automatically when it's done. User don't
need to insert multiple pause toggle command to
a media object just for toggling the media
multiple times.
Change-Id: I000a55f580917327ae438ea8e79e62f63275cce7
Reviewed-on: https://gerrit.libreoffice.org/68283
Tested-by: Jenkins
Reviewed-by: Mark Hung <marklh9@gmail.com>
diff --git a/sd/source/core/CustomAnimationEffect.cxx b/sd/source/core/CustomAnimationEffect.cxx
index 418a52b..04f4fed 100644
--- a/sd/source/core/CustomAnimationEffect.cxx
+++ b/sd/source/core/CustomAnimationEffect.cxx
@@ -36,6 +36,7 @@
#include <com/sun/star/animations/XAnimateTransform.hpp>
#include <com/sun/star/animations/XAnimateMotion.hpp>
#include <com/sun/star/animations/XAnimate.hpp>
#include <com/sun/star/animations/AnimationRestart.hpp>
#include <com/sun/star/beans/NamedValue.hpp>
#include <com/sun/star/beans/XPropertySet.hpp>
#include <com/sun/star/container/XEnumerationAccess.hpp>
@@ -3099,6 +3100,7 @@ InteractiveSequencePtr MainSequence::createInteractiveSequence( const css::uno::
uno::Sequence< css::beans::NamedValue > aUserData
{ { "node-type", css::uno::makeAny(css::presentation::EffectNodeType::INTERACTIVE_SEQUENCE) } };
xISRoot->setUserData( aUserData );
xISRoot->setRestart( css::animations::AnimationRestart::WHEN_NOT_ACTIVE );
Reference< XChild > xChild( mxSequenceRoot, UNO_QUERY_THROW );
Reference< XTimeContainer > xParent( xChild->getParent(), UNO_QUERY_THROW );
diff --git a/slideshow/source/engine/animationnodes/basecontainernode.cxx b/slideshow/source/engine/animationnodes/basecontainernode.cxx
index d48df81..e8e5dfb 100644
--- a/slideshow/source/engine/animationnodes/basecontainernode.cxx
+++ b/slideshow/source/engine/animationnodes/basecontainernode.cxx
@@ -19,6 +19,7 @@
#include <basecontainernode.hxx>
#include <com/sun/star/animations/AnimationRestart.hpp>
#include <eventqueue.hxx>
#include <tools.hxx>
#include "nodetools.hxx"
@@ -32,6 +33,19 @@ using namespace com::sun::star;
namespace slideshow {
namespace internal {
namespace {
bool isRepeatIndefinite(const uno::Reference<animations::XAnimationNode>& xNode)
{
return xNode->getRepeatCount().hasValue() && isIndefiniteTiming(xNode->getRepeatCount());
}
bool isRestart(const uno::Reference<animations::XAnimationNode>& xNode)
{
sal_Int16 nRestart = xNode->getRestart();
return nRestart == animations::AnimationRestart::WHEN_NOT_ACTIVE ||
nRestart == animations::AnimationRestart::ALWAYS;
}
}
BaseContainerNode::BaseContainerNode(
const uno::Reference< animations::XAnimationNode >& xNode,
@@ -41,7 +55,8 @@ BaseContainerNode::BaseContainerNode(
maChildren(),
mnFinishedChildren(0),
mnLeftIterations(0),
mbRepeatIndefinite(xNode->getRepeatCount().hasValue() && isIndefiniteTiming(xNode->getRepeatCount())),
mbRepeatIndefinite(isRepeatIndefinite(xNode)),
mbRestart(isRestart(xNode)),
mbDurationIndefinite( isIndefiniteTiming( xNode->getEnd() ) &&
isIndefiniteTiming( xNode->getDuration() ) )
{
@@ -144,9 +159,11 @@ bool BaseContainerNode::notifyDeactivatedChild(
{
mnLeftIterations -= 1.0;
}
if( mnLeftIterations >= 1.0 )
if(mnLeftIterations >= 1.0 || mbRestart)
{
bFinished = false;
if (mnLeftIterations >= 1.0)
bFinished = false;
EventSharedPtr aRepetitionEvent =
makeDelay( [this] () { this->repeat(); },
0.0,
diff --git a/slideshow/source/inc/basecontainernode.hxx b/slideshow/source/inc/basecontainernode.hxx
index ca07eff1..a86f05f 100644
--- a/slideshow/source/inc/basecontainernode.hxx
+++ b/slideshow/source/inc/basecontainernode.hxx
@@ -86,6 +86,7 @@ protected:
private:
const bool mbRepeatIndefinite;
const bool mbRestart;
const bool mbDurationIndefinite;
};