1
0
Fork 0
mirror of https://github.com/jellyfin/jellyfin-web synced 2025-03-30 19:56:21 +00:00
jellyfin-web/src/components/playback/volumeosd.js

154 lines
3.4 KiB
JavaScript
Raw Normal View History

2020-08-14 08:46:34 +02:00
2020-09-08 02:05:02 -04:00
import { Events } from 'jellyfin-apiclient';
2020-08-16 20:24:45 +02:00
import { playbackManager } from './playbackmanager';
2020-08-14 08:46:34 +02:00
import dom from '../../scripts/dom';
import browser from '../../scripts/browser';
2021-01-26 16:25:38 -05:00
import './iconosd.scss';
2020-08-14 08:46:34 +02:00
import 'material-design-icons-iconfont';
2020-10-07 21:12:14 +09:00
let currentPlayer;
let osdElement;
let iconElement;
let progressElement;
2020-10-07 21:12:14 +09:00
let enableAnimation;
2018-10-23 01:05:09 +03:00
function getOsdElementHtml() {
2020-10-07 21:12:14 +09:00
let html = '';
html += '<span class="material-icons iconOsdIcon volume_up"></span>';
html += '<div class="iconOsdProgressOuter"><div class="iconOsdProgressInner"></div></div>';
return html;
}
2018-10-23 01:05:09 +03:00
function ensureOsdElement() {
2020-10-07 21:12:14 +09:00
let elem = osdElement;
if (!elem) {
enableAnimation = browser.supportsCssAnimation();
elem = document.createElement('div');
elem.classList.add('hide');
elem.classList.add('iconOsd');
elem.classList.add('iconOsd-hidden');
elem.classList.add('volumeOsd');
elem.innerHTML = getOsdElementHtml();
iconElement = elem.querySelector('.material-icons');
progressElement = elem.querySelector('.iconOsdProgressInner');
document.body.appendChild(elem);
osdElement = elem;
2018-10-23 01:05:09 +03:00
}
}
2018-10-23 01:05:09 +03:00
function onHideComplete() {
this.classList.add('hide');
}
2018-10-23 01:05:09 +03:00
2020-10-07 21:12:14 +09:00
let hideTimeout;
function showOsd() {
clearHideTimeout();
2020-10-07 21:12:14 +09:00
const elem = osdElement;
dom.removeEventListener(elem, dom.whichTransitionEvent(), onHideComplete, {
once: true
});
elem.classList.remove('hide');
// trigger reflow
void elem.offsetWidth;
requestAnimationFrame(function () {
elem.classList.remove('iconOsd-hidden');
hideTimeout = setTimeout(hideOsd, 3000);
});
}
2018-10-23 01:05:09 +03:00
function clearHideTimeout() {
if (hideTimeout) {
clearTimeout(hideTimeout);
hideTimeout = null;
2018-10-23 01:05:09 +03:00
}
}
2018-10-23 01:05:09 +03:00
function hideOsd() {
clearHideTimeout();
2020-10-07 21:12:14 +09:00
const elem = osdElement;
if (elem) {
if (enableAnimation) {
// trigger reflow
void elem.offsetWidth;
requestAnimationFrame(function () {
elem.classList.add('iconOsd-hidden');
dom.addEventListener(elem, dom.whichTransitionEvent(), onHideComplete, {
once: true
});
});
} else {
onHideComplete.call(elem);
}
2018-10-23 01:05:09 +03:00
}
}
2018-10-23 01:05:09 +03:00
function updatePlayerVolumeState(isMuted, volume) {
if (iconElement) {
iconElement.classList.remove('volume_off', 'volume_up');
iconElement.classList.add(isMuted ? 'volume_off' : 'volume_up');
}
if (progressElement) {
progressElement.style.width = (volume || 0) + '%';
2018-10-23 01:05:09 +03:00
}
}
2018-10-23 01:05:09 +03:00
function releaseCurrentPlayer() {
2020-10-07 21:12:14 +09:00
const player = currentPlayer;
if (player) {
2020-09-08 02:05:02 -04:00
Events.off(player, 'volumechange', onVolumeChanged);
Events.off(player, 'playbackstop', hideOsd);
currentPlayer = null;
2018-10-23 01:05:09 +03:00
}
}
2018-10-23 01:05:09 +03:00
2021-01-26 22:20:12 -05:00
function onVolumeChanged() {
2020-10-07 21:12:14 +09:00
const player = this;
ensureOsdElement();
updatePlayerVolumeState(player.isMuted(), player.getVolume());
showOsd();
}
2018-10-23 01:05:09 +03:00
function bindToPlayer(player) {
if (player === currentPlayer) {
return;
}
releaseCurrentPlayer();
currentPlayer = player;
if (!player) {
return;
2018-10-23 01:05:09 +03:00
}
hideOsd();
2020-09-08 02:05:02 -04:00
Events.on(player, 'volumechange', onVolumeChanged);
Events.on(player, 'playbackstop', hideOsd);
}
2020-09-08 02:05:02 -04:00
Events.on(playbackManager, 'playerchange', function () {
bindToPlayer(playbackManager.getCurrentPlayer());
});
bindToPlayer(playbackManager.getCurrentPlayer());