1
0
Fork 0
mirror of https://github.com/jellyfin/jellyfin-web synced 2025-03-30 19:56:21 +00:00
jellyfin-web/src/scripts/mouseManager.js
2022-10-11 03:11:41 -04:00

175 lines
4.3 KiB
JavaScript

import inputManager from './inputManager';
import focusManager from '../components/focusManager';
import browser from '../scripts/browser';
import layoutManager from '../components/layoutManager';
import { Events } from 'jellyfin-apiclient';
import dom from '../scripts/dom';
/* eslint-disable indent */
const self = {};
let lastMouseInputTime = new Date().getTime();
let isMouseIdle;
function mouseIdleTime() {
return new Date().getTime() - lastMouseInputTime;
}
function notifyApp() {
inputManager.notifyMouseMove();
}
function removeIdleClasses() {
const classList = document.body.classList;
classList.remove('mouseIdle');
classList.remove('mouseIdle-tv');
}
function addIdleClasses() {
const classList = document.body.classList;
classList.add('mouseIdle');
if (layoutManager.tv) {
classList.add('mouseIdle-tv');
}
}
export function showCursor() {
if (isMouseIdle) {
isMouseIdle = false;
removeIdleClasses();
Events.trigger(self, 'mouseactive');
}
}
export function hideCursor() {
if (!isMouseIdle) {
isMouseIdle = true;
addIdleClasses();
Events.trigger(self, 'mouseidle');
}
}
let lastPointerMoveData;
function onPointerMove(e) {
const eventX = e.screenX || e.clientX;
const eventY = e.screenY || e.clientY;
// if coord don't exist how could it move
if (typeof eventX === 'undefined' && typeof eventY === 'undefined') {
return;
}
const obj = lastPointerMoveData;
if (!obj) {
lastPointerMoveData = {
x: eventX,
y: eventY
};
return;
}
// if coord are same, it didn't move
if (Math.abs(eventX - obj.x) < 10 && Math.abs(eventY - obj.y) < 10) {
return;
}
obj.x = eventX;
obj.y = eventY;
lastMouseInputTime = new Date().getTime();
notifyApp();
showCursor();
}
function onPointerEnter(e) {
const pointerType = e.pointerType || (layoutManager.mobile ? 'touch' : 'mouse');
if (pointerType === 'mouse' && !isMouseIdle) {
const parent = focusManager.focusableParent(e.target);
if (parent) {
focusManager.focus(parent);
}
}
}
function enableFocusWithMouse() {
if (!layoutManager.tv) {
return false;
}
if (browser.web0s) {
return false;
}
return !!browser.tv;
}
function onMouseInterval() {
if (!isMouseIdle && mouseIdleTime() >= 5000) {
hideCursor();
}
}
let mouseInterval;
function startMouseInterval() {
if (!mouseInterval) {
mouseInterval = setInterval(onMouseInterval, 5000);
}
}
function stopMouseInterval() {
const interval = mouseInterval;
if (interval) {
clearInterval(interval);
mouseInterval = null;
}
removeIdleClasses();
}
function initMouse() {
stopMouseInterval();
/* eslint-disable-next-line compat/compat */
dom.removeEventListener(document, (window.PointerEvent ? 'pointermove' : 'mousemove'), onPointerMove, {
passive: true
});
if (!layoutManager.mobile) {
startMouseInterval();
dom.addEventListener(document, (window.PointerEvent ? 'pointermove' : 'mousemove'), onPointerMove, {
passive: true
});
}
/* eslint-disable-next-line compat/compat */
dom.removeEventListener(document, (window.PointerEvent ? 'pointerenter' : 'mouseenter'), onPointerEnter, {
capture: true,
passive: true
});
if (enableFocusWithMouse()) {
dom.addEventListener(document, (window.PointerEvent ? 'pointerenter' : 'mouseenter'), onPointerEnter, {
capture: true,
passive: true
});
}
}
initMouse();
Events.on(layoutManager, 'modechange', initMouse);
/* eslint-enable indent */
export default {
hideCursor,
showCursor
};