diff options
author | David Thompson <dthompson2@worcester.edu> | 2024-06-24 13:49:08 -0400 |
---|---|---|
committer | David Thompson <dthompson2@worcester.edu> | 2024-06-24 13:52:17 -0400 |
commit | d283f7e661e14d6ae1881fe803e5b4f1ed0689ff (patch) | |
tree | 84d3811c6dcb7d7f02aecadad7b2dfacce83bd4f /2024-06-18-guix-social/reveal.js/js/controllers/pointer.js | |
parent | 3d9dcd3099fb252fa35697148fbbd541eb9eecc9 (diff) |
Diffstat (limited to '2024-06-18-guix-social/reveal.js/js/controllers/pointer.js')
-rw-r--r-- | 2024-06-18-guix-social/reveal.js/js/controllers/pointer.js | 126 |
1 files changed, 126 insertions, 0 deletions
diff --git a/2024-06-18-guix-social/reveal.js/js/controllers/pointer.js b/2024-06-18-guix-social/reveal.js/js/controllers/pointer.js new file mode 100644 index 0000000..1a02762 --- /dev/null +++ b/2024-06-18-guix-social/reveal.js/js/controllers/pointer.js @@ -0,0 +1,126 @@ +/** + * Handles hiding of the pointer/cursor when inactive. + */ +export default class Pointer { + + constructor( Reveal ) { + + this.Reveal = Reveal; + + // Throttles mouse wheel navigation + this.lastMouseWheelStep = 0; + + // Is the mouse pointer currently hidden from view + this.cursorHidden = false; + + // Timeout used to determine when the cursor is inactive + this.cursorInactiveTimeout = 0; + + this.onDocumentCursorActive = this.onDocumentCursorActive.bind( this ); + this.onDocumentMouseScroll = this.onDocumentMouseScroll.bind( this ); + + } + + /** + * Called when the reveal.js config is updated. + */ + configure( config, oldConfig ) { + + if( config.mouseWheel ) { + document.addEventListener( 'wheel', this.onDocumentMouseScroll, false ); + } + else { + document.removeEventListener( 'wheel', this.onDocumentMouseScroll, false ); + } + + // Auto-hide the mouse pointer when its inactive + if( config.hideInactiveCursor ) { + document.addEventListener( 'mousemove', this.onDocumentCursorActive, false ); + document.addEventListener( 'mousedown', this.onDocumentCursorActive, false ); + } + else { + this.showCursor(); + + document.removeEventListener( 'mousemove', this.onDocumentCursorActive, false ); + document.removeEventListener( 'mousedown', this.onDocumentCursorActive, false ); + } + + } + + /** + * Shows the mouse pointer after it has been hidden with + * #hideCursor. + */ + showCursor() { + + if( this.cursorHidden ) { + this.cursorHidden = false; + this.Reveal.getRevealElement().style.cursor = ''; + } + + } + + /** + * Hides the mouse pointer when it's on top of the .reveal + * container. + */ + hideCursor() { + + if( this.cursorHidden === false ) { + this.cursorHidden = true; + this.Reveal.getRevealElement().style.cursor = 'none'; + } + + } + + destroy() { + + this.showCursor(); + + document.removeEventListener( 'wheel', this.onDocumentMouseScroll, false ); + document.removeEventListener( 'mousemove', this.onDocumentCursorActive, false ); + document.removeEventListener( 'mousedown', this.onDocumentCursorActive, false ); + + } + + /** + * Called whenever there is mouse input at the document level + * to determine if the cursor is active or not. + * + * @param {object} event + */ + onDocumentCursorActive( event ) { + + this.showCursor(); + + clearTimeout( this.cursorInactiveTimeout ); + + this.cursorInactiveTimeout = setTimeout( this.hideCursor.bind( this ), this.Reveal.getConfig().hideCursorTime ); + + } + + /** + * Handles mouse wheel scrolling, throttled to avoid skipping + * multiple slides. + * + * @param {object} event + */ + onDocumentMouseScroll( event ) { + + if( Date.now() - this.lastMouseWheelStep > 1000 ) { + + this.lastMouseWheelStep = Date.now(); + + let delta = event.detail || -event.wheelDelta; + if( delta > 0 ) { + this.Reveal.next(); + } + else if( delta < 0 ) { + this.Reveal.prev(); + } + + } + + } + +} |