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

182 lines
4.3 KiB
JavaScript
Raw Normal View History

2020-08-14 08:46:34 +02:00
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';
2020-08-01 05:46:31 +02:00
/* eslint-disable indent */
2020-08-01 05:46:31 +02:00
const self = {};
2020-08-01 05:46:31 +02:00
let lastMouseInputTime = new Date().getTime();
let isMouseIdle;
2018-10-23 01:05:09 +03:00
function mouseIdleTime() {
return new Date().getTime() - lastMouseInputTime;
2018-10-23 01:05:09 +03:00
}
function notifyApp() {
2019-10-03 02:36:33 +09:00
inputManager.notifyMouseMove();
2018-10-23 01:05:09 +03:00
}
function removeIdleClasses() {
2020-08-01 05:46:31 +02:00
const classList = document.body.classList;
classList.remove('mouseIdle');
classList.remove('mouseIdle-tv');
2018-10-23 01:05:09 +03:00
}
function addIdleClasses() {
2020-08-01 05:46:31 +02:00
const classList = document.body.classList;
classList.add('mouseIdle');
if (layoutManager.tv) {
classList.add('mouseIdle-tv');
}
2018-10-23 01:05:09 +03:00
}
2020-08-01 05:46:31 +02:00
export function showCursor() {
if (isMouseIdle) {
isMouseIdle = false;
removeIdleClasses();
events.trigger(self, 'mouseactive');
}
2020-07-30 10:51:53 +02:00
}
2020-08-01 05:46:31 +02:00
export function hideCursor() {
if (!isMouseIdle) {
isMouseIdle = true;
addIdleClasses();
events.trigger(self, 'mouseidle');
}
2020-07-30 10:51:53 +02:00
}
2020-08-01 05:46:31 +02:00
let lastPointerMoveData;
2018-10-23 01:05:09 +03:00
function onPointerMove(e) {
2020-08-01 05:46:31 +02:00
const eventX = e.screenX;
const eventY = e.screenY;
// if coord don't exist how could it move
2020-05-04 12:44:12 +02:00
if (typeof eventX === 'undefined' && typeof eventY === 'undefined') {
return;
}
2020-08-01 05:46:31 +02:00
const obj = lastPointerMoveData;
if (!obj) {
lastPointerMoveData = {
2018-10-23 01:05:09 +03:00
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();
2018-10-23 01:05:09 +03:00
}
function onPointerEnter(e) {
2020-08-01 05:46:31 +02:00
const pointerType = e.pointerType || (layoutManager.mobile ? 'touch' : 'mouse');
if (pointerType === 'mouse') {
if (!isMouseIdle) {
2020-08-01 05:46:31 +02:00
const parent = focusManager.focusableParent(e.target);
if (parent) {
focusManager.focus(parent);
}
}
2018-10-23 01:05:09 +03:00
}
}
function enableFocusWithMouse() {
if (!layoutManager.tv) {
return false;
}
if (browser.web0s) {
return false;
}
if (browser.tv) {
return true;
}
return false;
2018-10-23 01:05:09 +03:00
}
function onMouseInterval() {
if (!isMouseIdle && mouseIdleTime() >= 5000) {
2020-07-30 10:51:53 +02:00
hideCursor();
}
2018-10-23 01:05:09 +03:00
}
2020-08-01 05:46:31 +02:00
let mouseInterval;
2018-10-23 01:05:09 +03:00
function startMouseInterval() {
if (!mouseInterval) {
mouseInterval = setInterval(onMouseInterval, 5000);
}
2018-10-23 01:05:09 +03:00
}
function stopMouseInterval() {
2020-08-01 05:46:31 +02:00
const interval = mouseInterval;
if (interval) {
clearInterval(interval);
mouseInterval = null;
}
removeIdleClasses();
2018-10-23 01:05:09 +03:00
}
function initMouse() {
stopMouseInterval();
2020-07-05 12:54:25 +02:00
/* 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
});
}
2020-07-05 12:54:25 +02:00
/* 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
});
}
2018-10-23 01:05:09 +03:00
}
initMouse();
events.on(layoutManager, 'modechange', initMouse);
2020-08-01 05:46:31 +02:00
/* eslint-enable indent */
export default {
hideCursor,
showCursor
};