diff options
author | Hakim El Hattab <hakim.elhattab@gmail.com> | 2013-04-27 17:35:17 -0400 |
---|---|---|
committer | Hakim El Hattab <hakim.elhattab@gmail.com> | 2013-04-27 17:35:17 -0400 |
commit | 6cfc6ecc49d40bb506c5b7ab7eca2b97324c9586 (patch) | |
tree | 67fa23696fcfeb8a3b3f12b79d4dce360765e5f2 /js/reveal.js | |
parent | 0ebda98735f0698e115a1ef1de495e67d8f65fd6 (diff) | |
download | perl-software-in-gnu-guix-6cfc6ecc49d40bb506c5b7ab7eca2b97324c9586.tar perl-software-in-gnu-guix-6cfc6ecc49d40bb506c5b7ab7eca2b97324c9586.tar.gz |
available fragment routes reflected in control arrows (closes #411)
Diffstat (limited to 'js/reveal.js')
-rw-r--r-- | js/reveal.js | 52 |
1 files changed, 52 insertions, 0 deletions
diff --git a/js/reveal.js b/js/reveal.js index eea243e..c58f3dc 100644 --- a/js/reveal.js +++ b/js/reveal.js @@ -1328,6 +1328,7 @@ var Reveal = (function(){ if ( config.controls && dom.controls ) { var routes = availableRoutes(); + var fragments = availableFragments(); // Remove the 'enabled' class from all directions dom.controlsLeft.concat( dom.controlsRight ) @@ -1336,6 +1337,7 @@ var Reveal = (function(){ .concat( dom.controlsPrev ) .concat( dom.controlsNext ).forEach( function( node ) { node.classList.remove( 'enabled' ); + node.classList.remove( 'fragmented' ); } ); // Add the 'enabled' class to the available routes @@ -1348,6 +1350,26 @@ var Reveal = (function(){ if( routes.left || routes.up ) dom.controlsPrev.forEach( function( el ) { el.classList.add( 'enabled' ); } ); if( routes.right || routes.down ) dom.controlsNext.forEach( function( el ) { el.classList.add( 'enabled' ); } ); + // Highlight fragment directions + if( currentSlide ) { + var isVertical = !!currentSlide.parentNode.nodeName.match( /section/gi ); + + // Always apply fragment decorator to prev/next buttons + if( fragments.prev ) dom.controlsPrev.forEach( function( el ) { el.classList.add( 'fragmented', 'enabled' ); } ); + if( fragments.next ) dom.controlsNext.forEach( function( el ) { el.classList.add( 'fragmented', 'enabled' ); } ); + + // Apply fragment decorators to directional buttons based on + // what slide axis they are in + if( isVertical ) { + if( fragments.prev ) dom.controlsUp.forEach( function( el ) { el.classList.add( 'fragmented', 'enabled' ); } ); + if( fragments.next ) dom.controlsDown.forEach( function( el ) { el.classList.add( 'fragmented', 'enabled' ); } ); + } + else { + if( fragments.prev ) dom.controlsLeft.forEach( function( el ) { el.classList.add( 'fragmented', 'enabled' ); } ); + if( fragments.next ) dom.controlsRight.forEach( function( el ) { el.classList.add( 'fragmented', 'enabled' ); } ); + } + } + } } @@ -1372,6 +1394,29 @@ var Reveal = (function(){ } /** + * Returns an object describing the available fragment + * directions. + * + * @return {Object} two boolean properties: prev/next + */ + function availableFragments() { + + if( currentSlide ) { + var fragments = currentSlide.querySelectorAll( '.fragment' ); + var hiddenFragments = currentSlide.querySelectorAll( '.fragment:not(.visible)' ); + + return { + prev: fragments.length - hiddenFragments.length > 0, + next: !!hiddenFragments.length + }; + } + else { + return { prev: false, next: false }; + } + + } + + /** * Reads the current URL (hash) and navigates accordingly. */ function readURL() { @@ -1506,6 +1551,8 @@ var Reveal = (function(){ // Notify subscribers of the change dispatchEvent( 'fragmentshown', { fragment: fragments[0] } ); + + updateControls(); return true; } } @@ -1530,6 +1577,8 @@ var Reveal = (function(){ // Notify subscribers of the change dispatchEvent( 'fragmenthidden', { fragment: fragments[ fragments.length - 1 ] } ); + + updateControls(); return true; } } @@ -1992,6 +2041,9 @@ var Reveal = (function(){ // Returns an object with the available routes as booleans (left/right/top/bottom) availableRoutes: availableRoutes, + // Returns an object with the available fragments as booleans (prev/next) + availableFragments: availableFragments, + // Toggles the overview mode on/off toggleOverview: toggleOverview, |