/* * 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 || {}; /** * Collection of {@link app.SSPhoto} objects * @namespace */ app.SSPhotos = (function() { 'use strict'; new ExceptionHandler(); /** * The array of photos * @type {Array<app.SSPhoto>} * @const * @private * @memberOf app.SSPhotos */ const _photos = []; /** * Current index into {@link _photos} * @type {int} * @private * @memberOf app.SSPhotos */ let _curIdx = 0; return { /** * Add the photos from an {@link app.PhotoSource.Photos} * @param {app.PhotoSource.Photos} source * - The {@link app.PhotoSource.Photos} * @memberOf app.SSPhotos */ addFromSource: function(source) { const type = source.type; const viewType = app.SSViews.getType(); let ct = 0; for (const sourcePhoto of source.photos) { if (!app.SSView.ignore(sourcePhoto.asp, viewType)) { const photo = new app.SSPhoto(ct, sourcePhoto, type); _photos.push(photo); ct++; } } }, /** * Get number of photos * @returns {int} The number of photos * @memberOf app.SSPhotos */ getCount: function() { return _photos.length; }, /** * Do we have photos that aren't bad * @returns {boolean} true if at least one photo is good * @memberOf app.SSPhotos */ hasUsable: function() { return !_photos.every((photo) => { return photo.isBad(); }); }, /** * Get the {@link app.SSPhoto} at the given index * @param {int} idx - The index * @returns {app.SSPhoto} A {@link app.SSPhoto} * @memberOf app.SSPhotos */ get: function(idx) { return _photos[idx]; }, /** * Get the next {@link app.SSPhoto} that is usable * @returns {?app.SSPhoto} An {@link app.SSPhoto} * @memberOf app.SSPhotos */ getNextUsable: function() { // wrap-around loop: https://stackoverflow.com/a/28430482/4468645 for (let i = 0; i < _photos.length; i++) { // find a url that is ok, AFAWK const index = (i + _curIdx) % _photos.length; const photo = _photos[index]; if (!photo.isBad() && !app.SSViews.hasPhoto(photo)) { _curIdx = index; app.SSPhotos.incCurrentIndex(); return photo; } } return null; }, /** * Get current index into {@link _photos} * @returns {int} index * @memberOf app.SSPhotos */ getCurrentIndex: function() { return _curIdx; }, /** * Set current index into {@link _photos} * @param {int} idx - The index * @memberOf app.SSPhotos */ setCurrentIndex: function(idx) { _curIdx = idx; }, /** * Increment current index into {@link _photos} * @returns {int} new current index * @memberOf app.SSPhotos */ incCurrentIndex: function() { return _curIdx = (_curIdx === _photos.length - 1) ? 0 : _curIdx + 1; }, /** * Randomize the photos * @memberOf app.SSPhotos */ shuffle: function() { Chrome.Utils.shuffleArray(_photos); // renumber _photos.forEach((photo, index) => { photo.setId(index); }); }, }; })();