123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110 |
- /**
- * 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();
-
- }
-
- }
|