/*
* 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 || {};
/**
* Track the recent history of a {@link app.Screensaver} traversal
* @namespace
*/
app.SSHistory = (function() {
'use strict';
new ExceptionHandler();
/**
* History item
* @typedef {Object} app.SSHistory.Item
* @property {int} viewsIdx - {@link app.SSViews} index
* @property {int} replaceIdx - {@link app.SSViews} index
* @property {int} photoId - {@link app.SSPhoto} id
* @property {int} photosPos - pointer into {@link app.SSPhotos}
* @memberOf app.SSHistory
*/
/**
* Slide show history
* @property {Array<app.SSHistory.Item>} arr - history items
* @property {int} idx - pointer into arr
* @property {int} max - max length of arr, it will actually have 1 item more
* @consts
* @private
* @memberOf app.SSHistory
*/
const _history = {
arr: [],
idx: -1,
max: 20,
};
return {
/**
* Initialize the history
* @memberOf app.SSHistory
*/
initialize: function() {
_history.max = Math.min(app.SSPhotos.getCount(), _history.max);
},
/**
* Add item to the history
* @param {?int} newIdx - if not null, a request from the back command
* @param {int} selected - the current selection
* @param {int} replaceIdx - the replace index
* @memberOf app.SSHistory
*/
add: function(newIdx, selected, replaceIdx) {
if (newIdx === null) {
const view = app.SSViews.get(selected);
const idx = _history.idx;
const len = _history.arr.length;
const photoId = view.photo.getId();
const photosPos = app.SSPhotos.getCurrentIndex();
const historyItem = {
viewsIdx: selected,
replaceIdx: replaceIdx,
photoId: photoId,
photosPos: photosPos,
};
if ((idx === len - 1)) {
// add to end
if (_history.arr.length > _history.max) {
// FIFO delete
_history.arr.shift();
_history.idx--;
_history.idx = Math.max(_history.idx, -1);
}
// add newest photo
_history.arr.push(historyItem);
}
}
_history.idx++;
},
/**
* Reset the slide show history
* @memberOf app.SSHistory
*/
clear: function() {
_history.arr = [];
_history.idx = -1;
},
/**
* Backup one slide
* @returns {?int} {@link app.SSViews} index to step to
* @memberOf app.SSHistory
*/
back: function() {
if (_history.idx <= 0) {
// at beginning
return null;
}
let nextStep = null;
let inc = 2;
let idx = _history.idx - inc;
_history.idx = idx;
if (idx < 0) {
if ((_history.arr.length > _history.max)) {
// at beginning of history
_history.idx+= inc;
return null;
} else {
// at beginning, first time through
_history.idx = -1;
inc = 1;
nextStep = -1;
idx = 0;
}
}
// update state from history
const photosPos = _history.arr[idx].photosPos;
const replaceIdx = _history.arr[idx + inc].replaceIdx;
app.SSPhotos.setCurrentIndex(photosPos);
app.SSRunner.setReplaceIdx(replaceIdx);
const viewsIdx = _history.arr[idx].viewsIdx;
const photoId = _history.arr[idx].photoId;
nextStep = (nextStep === null) ? viewsIdx : nextStep;
const view = app.SSViews.get(viewsIdx);
const photo = app.SSPhotos.get(photoId);
view.setPhoto(photo);
view.render();
return nextStep;
},
};
})();