diff options
Diffstat (limited to 'present/js/controllers/focus.js')
| -rw-r--r-- | present/js/controllers/focus.js | 103 | 
1 files changed, 103 insertions, 0 deletions
| diff --git a/present/js/controllers/focus.js b/present/js/controllers/focus.js new file mode 100644 index 0000000..3e68c3f --- /dev/null +++ b/present/js/controllers/focus.js @@ -0,0 +1,103 @@ +import { closest } from '../utils/util.js' + +/** + * Manages focus when a presentation is embedded. This + * helps us only capture keyboard from the presentation + * a user is currently interacting with in a page where + * multiple presentations are embedded. + */ + +const STATE_FOCUS = 'focus'; +const STATE_BLUR = 'blur'; + +export default class Focus { + +	constructor( Reveal ) { + +		this.Reveal = Reveal; + +		this.onRevealPointerDown = this.onRevealPointerDown.bind( this ); +		this.onDocumentPointerDown = this.onDocumentPointerDown.bind( this ); + +	} + +	/** +	 * Called when the reveal.js config is updated. +	 */ +	configure( config, oldConfig ) { + +		if( config.embedded ) { +			this.blur(); +		} +		else { +			this.focus(); +			this.unbind(); +		} + +	} + +	bind() { + +		if( this.Reveal.getConfig().embedded ) { +			this.Reveal.getRevealElement().addEventListener( 'pointerdown', this.onRevealPointerDown, false ); +		} + +	} + +	unbind() { + +		this.Reveal.getRevealElement().removeEventListener( 'pointerdown', this.onRevealPointerDown, false ); +		document.removeEventListener( 'pointerdown', this.onDocumentPointerDown, false ); + +	} + +	focus() { + +		if( this.state !== STATE_FOCUS ) { +			this.Reveal.getRevealElement().classList.add( 'focused' ); +			document.addEventListener( 'pointerdown', this.onDocumentPointerDown, false ); +		} + +		this.state = STATE_FOCUS; + +	} + +	blur() { + +		if( this.state !== STATE_BLUR ) { +			this.Reveal.getRevealElement().classList.remove( 'focused' ); +			document.removeEventListener( 'pointerdown', this.onDocumentPointerDown, false ); +		} + +		this.state = STATE_BLUR; + +	} + +	isFocused() { + +		return this.state === STATE_FOCUS; + +	} + +	destroy() { + +		this.Reveal.getRevealElement().classList.remove( 'focused' ); + +	} + +	onRevealPointerDown( event ) { + +		this.focus(); + +	} + +	onDocumentPointerDown( event ) { + +		let revealElement = closest( event.target, '.reveal' ); +		if( !revealElement || revealElement !== this.Reveal.getRevealElement() ) { +			this.blur(); +		} + +	} + +}
\ No newline at end of file | 
