/* * Copyright (c) 2015-2017, Michael A. Updike All rights reserved. * Licensed under the BSD-3-Clause * https://opensource.org/licenses/BSD-3-Clause * https://github.com/opus1269/photo-screen-saver/blob/master/LICENSE.md */ window.app = window.app || {}; /** * A screensaver * @namespace */ app.Screensaver = (function() { 'use strict'; new ExceptionHandler(); /** * Main auto-binding template * @typedef {Element} app.Screensaver.Template * @property {Array<app.SSView>} _views - array of views * @property {?string} sizingType - the way an image is rendered * @property {int} aniType - the animation type for photo transitions * @property {int} screenWidth - screen width in pixels * @property {int} screenHeight - screen height in pixels * @property {boolean} paused - true if slideshow paused * @property {boolean} noPhotos - true if there are no usable photos * @property {string} noPhotosLabel - label when no photos are usable * @property {string} timeLabel - current time label * @property {Function} set - Polymer setter * @property {Function} push - Polymer pusher * @memberOf app.Screensaver */ /** * Main auto-binding template * @type {app.Screensaver.Template} * @const * @private * @memberOf app.Screensaver */ const t = document.querySelector('#t'); t.sizingType = null; t.screenWidth = screen.width; t.screenHeight = screen.height; t.aniType = 0; t.paused = false; t.noPhotos = false; t.noPhotosLabel = ''; t.timeLabel = ''; /** * Event: Template Bound, bindings have resolved and content has been * stamped to the page * @private * @memberOf app.Screensaver */ function _onDomChange() { // set selected background image document.body.style.background = Chrome.Storage.get('background').substring(11); Chrome.GA.page('/screensaver.html'); // register event listeners app.SSEvents.initialize(); _setZoom(); _setupPhotoTransitions(); app.Screensaver.launch(); } /** * Process settings related to between photo transitions * @private * @memberOf app.Screensaver */ function _setupPhotoTransitions() { let type = Chrome.Storage.getInt('photoTransition', 0); if (type === 8) { // pick random transition type = Chrome.Utils.getRandomInt(0, 7); } t.set('aniType', type); app.SSTime.initialize(); } /** * Set the window zoom factor to 1.0 * @private * @memberOf app.Screensaver */ function _setZoom() { if (Chrome.Utils.getChromeVersion() >= 42) { // override zoom factor to 1.0 - chrome 42 and later const chromep = new ChromePromise(); chromep.tabs.getZoom().then((zoomFactor) => { if ((zoomFactor <= 0.99) || (zoomFactor >= 1.01)) { chrome.tabs.setZoom(1.0); } return null; }).catch((err) => { Chrome.Log.error(err.message, 'chromep.tabs.getZoom'); }); } } // listen for dom-change t.addEventListener('dom-change', _onDomChange); return { /** * Launch the slide show * @param {int} [delay=2000] - delay before start * @memberOf app.Screensaver */ launch: function(delay = 2000) { const hasPhotos = app.SSBuilder.build(); if (hasPhotos) { // kick off the slide show if there are photos selected app.SSRunner.start(delay); } }, /** * Create the {@link app.SSViews} that will be animated * @memberOf app.Screensaver */ createPages: function() { app.SSViews.create(t); }, /** * Set the sizing type for the paper-image elements * @param {string} type The sizing type * @memberOf app.Screensaver */ setSizingType: function(type) { t.set('sizingType', type); }, /** * Do we have usable photos * @returns {boolean} true if all photos are bad * @memberOf app.Screensaver */ noPhotos: function() { return t.noPhotos; }, /** * Set the state when no photos are available * @memberOf app.Screensaver */ setNoPhotos: function() { t.set('noPhotos', true); t.noPhotosLabel = Chrome.Locale.localize('no_photos'); }, /** * Set the time label * @param {string} label - current time * @memberOf app.Screensaver */ setTimeLabel: function(label) { t.timeLabel = label; }, /** * Set the state when slideshow is paused * @param {boolean} paused - paused state * @memberOf app.Screensaver */ setPaused: function(paused) { t.paused = paused; if (paused) { t.$.pauseImage.classList.add('fadeOut'); t.$.playImage.classList.remove('fadeOut'); } else { t.$.playImage.classList.add('fadeOut'); t.$.pauseImage.classList.remove('fadeOut'); } }, }; })();