summaryrefslogtreecommitdiff
path: root/2024-06-18-guix-social/reveal.js/js/controllers/pointer.js
diff options
context:
space:
mode:
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.js126
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();
+ }
+
+ }
+
+ }
+
+}