Share Gaia assets and adapters, keep private profiles and development documents local, and update both public READMEs.
109 lines
3.4 KiB
JavaScript
Executable file
109 lines
3.4 KiB
JavaScript
Executable file
'use strict';
|
|
|
|
/* global app */
|
|
/* global appManager */
|
|
|
|
(function(exports) {
|
|
|
|
const APPEARANCE = {
|
|
OPAQUE: 'opaque',
|
|
SEMI_TRANSPARENT: 'semi-transparent'
|
|
};
|
|
|
|
function StatusBar() {
|
|
this.threshold = document.getElementById('search').clientHeight;
|
|
|
|
if (!appManager.app) {
|
|
window.addEventListener('appmanager-ready', function onReady() {
|
|
window.removeEventListener('appmanager-ready', onReady);
|
|
this.onAppReady();
|
|
}.bind(this));
|
|
} else {
|
|
this.onAppReady();
|
|
}
|
|
}
|
|
|
|
StatusBar.prototype = {
|
|
/**
|
|
* General event handler.
|
|
*/
|
|
handleEvent: function(e) {
|
|
switch(e.type) {
|
|
case 'editmode-start':
|
|
window.removeEventListener('context-menu-open', this);
|
|
window.removeEventListener('context-menu-close', this);
|
|
window.removeEventListener('gaia-confirm-open', this);
|
|
window.removeEventListener('gaia-confirm-close', this);
|
|
/* falls through */
|
|
case 'context-menu-open':
|
|
case 'gaia-confirm-open':
|
|
window.removeEventListener('scroll', this);
|
|
this.setAppearance(APPEARANCE.OPAQUE);
|
|
break;
|
|
case 'editmode-end':
|
|
window.addEventListener('context-menu-open', this);
|
|
window.addEventListener('context-menu-close', this);
|
|
window.addEventListener('gaia-confirm-open', this);
|
|
window.addEventListener('gaia-confirm-close', this);
|
|
/* falls through */
|
|
case 'context-menu-close':
|
|
case 'gaia-confirm-close':
|
|
window.addEventListener('scroll', this);
|
|
// We still want to toggle the appearance of the scroll bar on exit
|
|
/* falls through */
|
|
case 'scroll':
|
|
this.setAppearance(this.calculateAppearance());
|
|
break;
|
|
case 'visibilitychange':
|
|
// If the document is not hidden, set appearance based on scroll top.
|
|
if (document.hidden) {
|
|
break;
|
|
}
|
|
// Note: we always want to set statusbar transparency on
|
|
// visibilitychange, so we remove the cached appearance value.
|
|
this.appearance = null;
|
|
this.setAppearance(this.calculateAppearance());
|
|
break;
|
|
}
|
|
},
|
|
|
|
onAppReady: function() {
|
|
var grid = app.grid;
|
|
window.addEventListener('scroll', this);
|
|
grid.addEventListener('editmode-start', this);
|
|
grid.addEventListener('editmode-end', this);
|
|
window.addEventListener('context-menu-close', this);
|
|
window.addEventListener('context-menu-open', this);
|
|
window.addEventListener('gaia-confirm-open', this);
|
|
window.addEventListener('gaia-confirm-close', this);
|
|
window.addEventListener('visibilitychange', this);
|
|
this.setAppearance(APPEARANCE.SEMI_TRANSPARENT);
|
|
},
|
|
|
|
/**
|
|
* Calculate the appearance of the status bar based on scroll state.
|
|
*/
|
|
calculateAppearance: function() {
|
|
return window.scrollY > this.threshold ?
|
|
APPEARANCE.OPAQUE : APPEARANCE.SEMI_TRANSPARENT;
|
|
},
|
|
|
|
setAppearance: function(value) {
|
|
if (this.appearance === value) {
|
|
return;
|
|
}
|
|
|
|
this.appearance = value;
|
|
|
|
var meta = document.head.querySelector('meta[name="theme-color"]');
|
|
if (value == APPEARANCE.OPAQUE) {
|
|
meta.content = 'black';
|
|
} else {
|
|
meta.content = 'transparent';
|
|
}
|
|
}
|
|
};
|
|
|
|
exports.statusBar = new StatusBar();
|
|
|
|
}(window));
|