1
0
Fork 0
why-cant-we-deploy-today/js/controllers/pointer.js

160 lines
3.5 KiB
JavaScript
Raw Permalink Normal View History

/**
* Handles hiding of the pointer/cursor when inactive.
*/
export default class Pointer {
2023-05-23 19:50:14 +02:00
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(
"DOMMouseScroll",
this.onDocumentMouseScroll,
false
); // FF
document.addEventListener(
"mousewheel",
this.onDocumentMouseScroll,
false
);
} else {
document.removeEventListener(
"DOMMouseScroll",
this.onDocumentMouseScroll,
false
); // FF
document.removeEventListener(
"mousewheel",
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(
"DOMMouseScroll",
this.onDocumentMouseScroll,
false
);
document.removeEventListener(
"mousewheel",
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();
}
}
}
}