tdf#77186 handle time container indefinite repetition.
Indefinite duration isn't necessary for indefinite repetition, so simply check the number of iteration left and do not decrease the number when the repetition is indefinite. Note: a known issue is that the next effect starts before "until click" or "until next slide" if the starting time of the next slide is "after previous". A workaround is to set the starting time of the next slide to "click". Change-Id: Ie9c73b472dc400bc41501029ff19ecc3e3fab2df Reviewed-on: https://gerrit.libreoffice.org/67896 Tested-by: Jenkins Reviewed-by: Mark Hung <marklh9@gmail.com>
This commit is contained in:
@@ -41,6 +41,7 @@ BaseContainerNode::BaseContainerNode(
|
|||||||
maChildren(),
|
maChildren(),
|
||||||
mnFinishedChildren(0),
|
mnFinishedChildren(0),
|
||||||
mnLeftIterations(0),
|
mnLeftIterations(0),
|
||||||
|
mbRepeatIndefinite(xNode->getRepeatCount().hasValue() && isIndefiniteTiming(xNode->getRepeatCount())),
|
||||||
mbDurationIndefinite( isIndefiniteTiming( xNode->getEnd() ) &&
|
mbDurationIndefinite( isIndefiniteTiming( xNode->getEnd() ) &&
|
||||||
isIndefiniteTiming( xNode->getDuration() ) )
|
isIndefiniteTiming( xNode->getDuration() ) )
|
||||||
{
|
{
|
||||||
@@ -137,12 +138,9 @@ bool BaseContainerNode::notifyDeactivatedChild(
|
|||||||
++mnFinishedChildren;
|
++mnFinishedChildren;
|
||||||
bool bFinished = (mnFinishedChildren >= nSize);
|
bool bFinished = (mnFinishedChildren >= nSize);
|
||||||
|
|
||||||
// all children finished, and we've got indefinite duration?
|
// Handle repetition here.
|
||||||
// think of ParallelTimeContainer::notifyDeactivating()
|
if (bFinished) {
|
||||||
// if duration given, we will be deactivated by some end event
|
if(!mbRepeatIndefinite && mnLeftIterations >= 1.0)
|
||||||
// @see fillCommonParameters()
|
|
||||||
if (bFinished && isDurationIndefinite()) {
|
|
||||||
if( mnLeftIterations >= 1.0 )
|
|
||||||
{
|
{
|
||||||
mnLeftIterations -= 1.0;
|
mnLeftIterations -= 1.0;
|
||||||
}
|
}
|
||||||
@@ -155,7 +153,7 @@ bool BaseContainerNode::notifyDeactivatedChild(
|
|||||||
"BaseContainerNode::repeat");
|
"BaseContainerNode::repeat");
|
||||||
getContext().mrEventQueue.addEvent( aRepetitionEvent );
|
getContext().mrEventQueue.addEvent( aRepetitionEvent );
|
||||||
}
|
}
|
||||||
else
|
else if (isDurationIndefinite())
|
||||||
{
|
{
|
||||||
deactivate();
|
deactivate();
|
||||||
}
|
}
|
||||||
@@ -166,6 +164,10 @@ bool BaseContainerNode::notifyDeactivatedChild(
|
|||||||
|
|
||||||
void BaseContainerNode::repeat()
|
void BaseContainerNode::repeat()
|
||||||
{
|
{
|
||||||
|
// Prevent repeat event scheduled before deactivation.
|
||||||
|
if (getState() == FROZEN || getState() == ENDED)
|
||||||
|
return;
|
||||||
|
|
||||||
forEachChildNode( std::mem_fn(&AnimationNode::end), ~ENDED );
|
forEachChildNode( std::mem_fn(&AnimationNode::end), ~ENDED );
|
||||||
bool bState = init_children();
|
bool bState = init_children();
|
||||||
if( bState )
|
if( bState )
|
||||||
|
@@ -539,12 +539,26 @@ void BaseNode::scheduleDeactivationEvent( EventSharedPtr const& pEvent )
|
|||||||
// if anim base node has no activity, this is called to schedule deactivation,
|
// if anim base node has no activity, this is called to schedule deactivation,
|
||||||
// but what if it does not schedule anything?
|
// but what if it does not schedule anything?
|
||||||
|
|
||||||
// TODO(F2): Handle end time attribute, too
|
|
||||||
auto self(mpSelf);
|
auto self(mpSelf);
|
||||||
mpCurrentEvent = generateEvent(
|
if (mxAnimationNode->getEnd().hasValue())
|
||||||
mxAnimationNode->getDuration(),
|
{
|
||||||
[self] () { self->deactivate(); },
|
// TODO: We may need to calculate the duration if the end value is numeric.
|
||||||
maContext, 0.0 );
|
// We expect that the end value contains EventTrigger::ON_NEXT here.
|
||||||
|
// LibreOffice does not generate numeric values, so we can leave it
|
||||||
|
// until we find a test case.
|
||||||
|
mpCurrentEvent = generateEvent(
|
||||||
|
mxAnimationNode->getEnd(),
|
||||||
|
[self] () { self->deactivate(); },
|
||||||
|
maContext, 0.0 );
|
||||||
|
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
mpCurrentEvent = generateEvent(
|
||||||
|
mxAnimationNode->getDuration(),
|
||||||
|
[self] () { self->deactivate(); },
|
||||||
|
maContext, 0.0 );
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -85,6 +85,7 @@ protected:
|
|||||||
double mnLeftIterations;
|
double mnLeftIterations;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
const bool mbRepeatIndefinite;
|
||||||
const bool mbDurationIndefinite;
|
const bool mbDurationIndefinite;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user