summaryrefslogtreecommitdiff
path: root/filter
diff options
context:
space:
mode:
authorMarco Cecchetti <mrcekets@gmail.com>2019-05-26 17:02:33 +0200
committerMichael Meeks <michael.meeks@collabora.com>2019-10-12 04:28:52 +0200
commitccc299b706104b3dd0eba15e45c3d259c242a7ca (patch)
tree3add47c83cf63f4907ad45b0e5ffc6793f800fe2 /filter
parent2ef2c031ce9ec730b13fca8bca808f382aab5fe4 (diff)
filter: svg export: presentation engine: automatic slide transition
Added support for having the presentation engine to advance automatically to the next slide after a given timeout. Change-Id: I765ab5116686af78d24dfcc51bb9183418072e70 Reviewed-on: https://gerrit.libreoffice.org/80679 Tested-by: Jenkins Reviewed-by: Michael Meeks <michael.meeks@collabora.com>
Diffstat (limited to 'filter')
-rw-r--r--filter/source/svg/presentation_engine.js77
-rw-r--r--filter/source/svg/svgexport.cxx13
2 files changed, 87 insertions, 3 deletions
diff --git a/filter/source/svg/presentation_engine.js b/filter/source/svg/presentation_engine.js
index 8e01bfeba182..abea4f2880e2 100644
--- a/filter/source/svg/presentation_engine.js
+++ b/filter/source/svg/presentation_engine.js
@@ -4429,6 +4429,7 @@ var aOOOAttrUsePositionedChars = 'use-positioned-chars';
var aOOOAttrSlide = 'slide';
var aOOOAttrMaster = 'master';
+var aOOOAttrSlideDuration = 'slide-duration';
var aOOOAttrHasTransition = 'has-transition';
var aOOOAttrBackgroundVisibility = 'background-visibility';
var aOOOAttrMasterObjectsVisibility = 'master-objects-visibility';
@@ -5060,6 +5061,9 @@ function MetaSlide( sMetaSlideId, aMetaDoc )
this.aTextFieldContentProviderSet[aFooterClassName] = this.initFixedTextFieldContentProvider( aOOOAttrFooterField );
this.aTextFieldContentProviderSet[aHeaderClassName] = this.initFixedTextFieldContentProvider( aOOOAttrHeaderField );
+ // We init the slide duration when automatic slide transition is enabled
+ this.fDuration = this.initSlideDuration();
+
// We look for slide transition.
this.aTransitionHandler = null;
this.bHasTransition = this.initHasTransition() || true;
@@ -5143,6 +5147,15 @@ initMasterPage : function()
return this.theMetaDoc.aMasterPageSet[ sMasterPageId ];
},
+initSlideDuration : function()
+{
+ var sSlideDuration = this.element.getAttributeNS( NSS['ooo'], aOOOAttrSlideDuration );
+ if( sSlideDuration && sSlideDuration.length > 0 )
+ return parseFloat( sSlideDuration );
+ else
+ return -1;
+},
+
initHasTransition : function()
{
var sHasTransition = this.element.getAttributeNS( NSS['ooo'], aOOOAttrHasTransition );
@@ -10133,6 +10146,9 @@ BaseNode.prototype.notifyEndListeners = function()
this.aContext.aEventMultiplexer.notifyEvent( EVENT_TRIGGER_END_EVENT, this.getId() );
if( this.getParentNode() && this.getParentNode().isMainSequenceRootNode() )
this.aContext.aEventMultiplexer.notifyNextEffectEndEvent();
+
+ if( this.isMainSequenceRootNode() )
+ this.aContext.aEventMultiplexer.notifyAnimationsEndEvent();
};
BaseNode.prototype.getContext = function()
@@ -15823,6 +15839,7 @@ function EventMultiplexer( aTimerEventQueue )
this.nId = EventMultiplexer.getUniqueId();
this.aTimerEventQueue = aTimerEventQueue;
this.aEventMap = {};
+ this.aAnimationsEndHandler = null;
this.aSkipEffectEndHandlerSet = [];
this.aMouseClickHandlerSet = new PriorityQueue( PriorityEntry.compare );
this.aSkipEffectEvent = null;
@@ -15903,6 +15920,17 @@ EventMultiplexer.prototype.notifyEvent = function( eEventType, aNotifierId )
}
};
+EventMultiplexer.prototype.registerAnimationsEndHandler = function( aHandler )
+{
+ this.aAnimationsEndHandler = aHandler;
+};
+
+EventMultiplexer.prototype.notifyAnimationsEndEvent = function()
+{
+ if( this.aAnimationsEndHandler )
+ this.aAnimationsEndHandler();
+};
+
EventMultiplexer.prototype.registerNextEffectEndHandler = function( aHandler )
{
this.aSkipEffectEndHandlerSet.push( aHandler );
@@ -17796,6 +17824,7 @@ function SlideShow()
this.aStartedEffectList = [];
this.aStartedEffectIndexMap = {};
this.aStartedEffectIndexMap[ -1 ] = undefined;
+ this.automaticAdvanceTimeout = null;
}
SlideShow.prototype.setSlideEvents = function( aNextEffectEventArray,
@@ -17908,7 +17937,6 @@ SlideShow.prototype.notifyNextEffectStart = function()
this.aStartedEffectIndexMap[ -1 ] = this.aStartedEffectList.length;
this.aStartedEffectList.push( aEffect );
-
var aAnimatedElementMap = theMetaDoc.aMetaSlideSet[nCurSlide].aSlideAnimationsHandler.aAnimatedElementMap;
for( var sId in aAnimatedElementMap )
aAnimatedElementMap[ sId ].notifyNextEffectStart( this.nCurrentEffect );
@@ -17916,11 +17944,34 @@ SlideShow.prototype.notifyNextEffectStart = function()
SlideShow.prototype.notifyNextEffectEnd = function()
{
- assert( this.bIsNextEffectRunning,
+ assert( this.bIsNextEffectRunning,
'SlideShow.notifyNextEffectEnd: effect already ended.' );
this.bIsNextEffectRunning = false;
this.aStartedEffectList[ this.aStartedEffectIndexMap[ -1 ] ].end();
+ if( this.automaticAdvanceTimeout !== null )
+ {
+ if( this.automaticAdvanceTimeout['rewindedEffect'] === this.nCurrentEffect )
+ {
+ this.automaticAdvanceTimeout = null;
+ this.notifyAnimationsEnd();
+ }
+ }
+};
+
+SlideShow.prototype.notifyAnimationsEnd = function()
+{
+ if( nCurSlide + 1 === theMetaDoc.nNumberOfSlides )
+ return;
+
+ assert (this.automaticAdvanceTimeout === null,
+ 'SlideShow.notifyAnimationsEnd: Timeout already set.')
+
+ var nTimeout = Math.ceil(theMetaDoc.aMetaSlideSet[nCurSlide].fDuration * 1000);
+ if( nTimeout < 0 )
+ return;
+
+ this.automaticAdvanceTimeout = window.setTimeout('switchSlide(1, false)', nTimeout);
};
SlideShow.prototype.notifySlideStart = function( nNewSlideIndex, nOldSlideIndex )
@@ -17981,7 +18032,15 @@ SlideShow.prototype.notifyTransitionEnd = function( nSlideIndex )
// clear all queues
this.dispose();
- theMetaDoc.getCurrentSlide().aSlideAnimationsHandler.start();
+ var aCurrentSlide = theMetaDoc.getCurrentSlide();
+ if( aCurrentSlide.aSlideAnimationsHandler.elementsParsed() )
+ {
+ aCurrentSlide.aSlideAnimationsHandler.start();
+ this.aEventMultiplexer.registerAnimationsEndHandler( bind2( SlideShow.prototype.notifyAnimationsEnd, this ) );
+ }
+ else
+ this.notifyAnimationsEnd();
+
this.update();
}
};
@@ -18213,6 +18272,12 @@ SlideShow.prototype.rewindEffect = function()
if( this.bIsSkipping || this.bIsRewinding )
return;
+ if( this.automaticAdvanceTimeout !== null && !this.automaticAdvanceTimeout['rewindedEffect'] )
+ {
+ window.clearTimeout( this.automaticAdvanceTimeout );
+ this.automaticAdvanceTimeout = { 'rewindedEffect': this.nCurrentEffect };
+ }
+
if( !this.hasAnyEffectStarted() )
{
this.rewindToPreviousSlide();
@@ -18391,6 +18456,12 @@ SlideShow.prototype.displaySlide = function( nNewSlide, bSkipSlideTransition )
this.dispose();
}
}
+
+ if( this.automaticAdvanceTimeout !== null )
+ {
+ window.clearTimeout( this.automaticAdvanceTimeout );
+ this.automaticAdvanceTimeout = null;
+ }
}
this.notifySlideStart( nNewSlide, nOldSlide );
diff --git a/filter/source/svg/svgexport.cxx b/filter/source/svg/svgexport.cxx
index 7adb1d04e9ca..fc7847dbfd06 100644
--- a/filter/source/svg/svgexport.cxx
+++ b/filter/source/svg/svgexport.cxx
@@ -88,6 +88,7 @@ static const char aOOOAttrSlide[] = NSPREFIX "slide";
static const char aOOOAttrMaster[] = NSPREFIX "master";
static const char aOOOAttrBackgroundVisibility[] = NSPREFIX "background-visibility";
static const char aOOOAttrMasterObjectsVisibility[] = NSPREFIX "master-objects-visibility";
+static const char aOOOAttrSlideDuration[] = NSPREFIX "slide-duration";
static const OUString aOOOAttrDateTimeField = NSPREFIX "date-time-field";
static const char aOOOAttrFooterField[] = NSPREFIX "footer-field";
static const char aOOOAttrHasTransition[] = NSPREFIX "has-transition";
@@ -1205,6 +1206,18 @@ void SVGFilter::implGenerateMetaData()
mpSVGExport->AddAttribute( XML_NAMESPACE_NONE, aOOOAttrMasterObjectsVisibility, "hidden" );
}
+ sal_Int32 nChange(0);
+ double fSlideDuration(0);
+
+ if( xPropSet->getPropertySetInfo()->hasPropertyByName( "Change" ) &&
+ (xPropSet->getPropertyValue( "Change" ) >>= nChange ) && nChange == 1 )
+ {
+ if( xPropSet->getPropertySetInfo()->hasPropertyByName( "HighResDuration" ) &&
+ (xPropSet->getPropertyValue( "HighResDuration" ) >>= fSlideDuration) )
+ {
+ mpSVGExport->AddAttribute( XML_NAMESPACE_NONE, aOOOAttrSlideDuration, OUString::number(fSlideDuration) );
+ }
+ }
// We look for a slide transition.
// Transition properties are exported together with animations.
sal_Int16 nTransitionType(0);