110 lines
		
	
	
		
			2.1 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			110 lines
		
	
	
		
			2.1 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| /**
 | |
|  * Creates a visual progress bar for the presentation.
 | |
|  */
 | |
| export default class Progress {
 | |
| 
 | |
| 	constructor( Reveal ) {
 | |
| 
 | |
| 		this.Reveal = Reveal;
 | |
| 
 | |
| 		this.onProgressClicked = this.onProgressClicked.bind( this );
 | |
| 
 | |
| 	}
 | |
| 
 | |
| 	render() {
 | |
| 
 | |
| 		this.element = document.createElement( 'div' );
 | |
| 		this.element.className = 'progress';
 | |
| 		this.Reveal.getRevealElement().appendChild( this.element );
 | |
| 
 | |
| 		this.bar = document.createElement( 'span' );
 | |
| 		this.element.appendChild( this.bar );
 | |
| 
 | |
| 	}
 | |
| 
 | |
| 	/**
 | |
| 	 * Called when the reveal.js config is updated.
 | |
| 	 */
 | |
| 	configure( config, oldConfig ) {
 | |
| 
 | |
| 		this.element.style.display = config.progress ? 'block' : 'none';
 | |
| 
 | |
| 	}
 | |
| 
 | |
| 	bind() {
 | |
| 
 | |
| 		if( this.Reveal.getConfig().progress && this.element ) {
 | |
| 			this.element.addEventListener( 'click', this.onProgressClicked, false );
 | |
| 		}
 | |
| 
 | |
| 	}
 | |
| 
 | |
| 	unbind() {
 | |
| 
 | |
| 		if ( this.Reveal.getConfig().progress && this.element ) {
 | |
| 			this.element.removeEventListener( 'click', this.onProgressClicked, false );
 | |
| 		}
 | |
| 
 | |
| 	}
 | |
| 
 | |
| 	/**
 | |
| 	 * Updates the progress bar to reflect the current slide.
 | |
| 	 */
 | |
| 	update() {
 | |
| 
 | |
| 		// Update progress if enabled
 | |
| 		if( this.Reveal.getConfig().progress && this.bar ) {
 | |
| 
 | |
| 			let scale = this.Reveal.getProgress();
 | |
| 
 | |
| 			// Don't fill the progress bar if there's only one slide
 | |
| 			if( this.Reveal.getTotalSlides() < 2 ) {
 | |
| 				scale = 0;
 | |
| 			}
 | |
| 
 | |
| 			this.bar.style.transform = 'scaleX('+ scale +')';
 | |
| 
 | |
| 		}
 | |
| 
 | |
| 	}
 | |
| 
 | |
| 	getMaxWidth() {
 | |
| 
 | |
| 		return this.Reveal.getRevealElement().offsetWidth;
 | |
| 
 | |
| 	}
 | |
| 
 | |
| 	/**
 | |
| 	 * Clicking on the progress bar results in a navigation to the
 | |
| 	 * closest approximate horizontal slide using this equation:
 | |
| 	 *
 | |
| 	 * ( clickX / presentationWidth ) * numberOfSlides
 | |
| 	 *
 | |
| 	 * @param {object} event
 | |
| 	 */
 | |
| 	onProgressClicked( event ) {
 | |
| 
 | |
| 		this.Reveal.onUserInput( event );
 | |
| 
 | |
| 		event.preventDefault();
 | |
| 
 | |
| 		let slides = this.Reveal.getSlides();
 | |
| 		let slidesTotal = slides.length;
 | |
| 		let slideIndex = Math.floor( ( event.clientX / this.getMaxWidth() ) * slidesTotal );
 | |
| 
 | |
| 		if( this.Reveal.getConfig().rtl ) {
 | |
| 			slideIndex = slidesTotal - slideIndex;
 | |
| 		}
 | |
| 
 | |
| 		let targetIndices = this.Reveal.getIndices(slides[slideIndex]);
 | |
| 		this.Reveal.slide( targetIndices.h, targetIndices.v );
 | |
| 
 | |
| 	}
 | |
| 
 | |
| 	destroy() {
 | |
| 
 | |
| 		this.element.remove();
 | |
| 
 | |
| 	}
 | |
| 
 | |
| } |