jellyfish-web/src/components/playback/brightnessosd.js

165 lines
4 KiB
JavaScript
Raw Normal View History

2019-01-23 11:33:34 +00:00
define(['events', 'playbackManager', 'dom', 'browser', 'css!./iconosd', 'material-icons'], function (events, playbackManager, dom, browser) {
'use strict';
var currentPlayer;
var osdElement;
var iconElement;
var progressElement;
var enableAnimation;
2018-10-23 01:05:09 +03:00
function getOsdElementHtml() {
var html = '';
html += '<i class="md-icon iconOsdIcon">&#xE1AC;</i>';
html += '<div class="iconOsdProgressOuter"><div class="iconOsdProgressInner brightnessOsdProgressInner"></div></div>';
return html;
2018-10-23 01:05:09 +03:00
}
function ensureOsdElement() {
2018-10-23 01:05:09 +03:00
var 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('brightnessOsd');
elem.innerHTML = getOsdElementHtml();
iconElement = elem.querySelector('i');
progressElement = elem.querySelector('.iconOsdProgressInner');
document.body.appendChild(elem);
osdElement = elem;
}
2018-10-23 01:05:09 +03:00
}
function onHideComplete() {
this.classList.add('hide');
2018-10-23 01:05:09 +03:00
}
var hideTimeout;
2018-10-23 01:05:09 +03:00
function showOsd() {
2018-10-23 01:05:09 +03:00
clearHideTimeout();
2018-10-23 01:05:09 +03:00
var elem = osdElement;
2018-10-23 01:05:09 +03:00
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
}
function hideOsd() {
2018-10-23 01:05:09 +03:00
clearHideTimeout();
2018-10-23 01:05:09 +03:00
var 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
}
function updateElementsFromPlayer(brightness) {
if (iconElement) {
if (brightness >= 80) {
iconElement.innerHTML = '&#xE1AC;';
}
else if (brightness >= 20) {
iconElement.innerHTML = '&#xE1AE;';
} else {
iconElement.innerHTML = '&#xE1AD;';
}
}
if (progressElement) {
progressElement.style.width = (brightness || 0) + '%';
}
2018-10-23 01:05:09 +03:00
}
function releaseCurrentPlayer() {
2018-10-23 01:05:09 +03:00
var player = currentPlayer;
if (player) {
events.off(player, 'brightnesschange', onBrightnessChanged);
events.off(player, 'playbackstop', hideOsd);
currentPlayer = null;
}
2018-10-23 01:05:09 +03:00
}
function onBrightnessChanged(e) {
2018-10-23 01:05:09 +03:00
var player = this;
ensureOsdElement();
updateElementsFromPlayer(playbackManager.getBrightness(player));
showOsd();
2018-10-23 01:05:09 +03:00
}
function bindToPlayer(player) {
if (player === currentPlayer) {
return;
}
releaseCurrentPlayer();
currentPlayer = player;
if (!player) {
return;
}
hideOsd();
events.on(player, 'brightnesschange', onBrightnessChanged);
events.on(player, 'playbackstop', hideOsd);
2018-10-23 01:05:09 +03:00
}
events.on(playbackManager, 'playerchange', function () {
bindToPlayer(playbackManager.getCurrentPlayer());
});
bindToPlayer(playbackManager.getCurrentPlayer());
2018-10-23 01:05:09 +03:00
});