Merge pull request #112 from miripiruni/master
Refactoring, fix for presenter notes, fix for inner nav timing
This commit is contained in:
commit
df8c4f89e3
185
shower.js
185
shower.js
|
@ -158,8 +158,37 @@ window.shower = (function(window, document, undefined) {
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Show next slide. If slide is last returns false, otherwise return slide
|
* Go to slide number...
|
||||||
* number which been shown.
|
* @param {Number} slideNumber slide number (sic!). Attention: starts from zero.
|
||||||
|
* @param {Function} [callback] runs only if you not in List mode
|
||||||
|
* @returns {Number}
|
||||||
|
*/
|
||||||
|
shower.go = function(slideNumber, callback) {
|
||||||
|
if ( ! shower._isNumber(slideNumber)) {
|
||||||
|
throw new Error('Gimme slide number as Number, baby!');
|
||||||
|
}
|
||||||
|
|
||||||
|
// Also triggers popstate and invoke shower.enter__Mode()
|
||||||
|
url.hash = shower.getSlideHash(slideNumber);
|
||||||
|
|
||||||
|
if (shower.isSlideMode()) {
|
||||||
|
shower.showPresenterNotes(slideNumber);
|
||||||
|
shower.updateProgress(slideNumber);
|
||||||
|
shower.updateCurrentAndPassedSlides(slideNumber);
|
||||||
|
shower.runInnerNavigation(slideNumber);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
if (typeof(callback) === 'function') {
|
||||||
|
callback();
|
||||||
|
}
|
||||||
|
|
||||||
|
return slideNumber;
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Show next slide or show next item of Inner navigation. If slide is last
|
||||||
|
* returns false, otherwise return slide number which been shown.
|
||||||
* @param {Function} [callback] runs only if shower.next() complete successfully
|
* @param {Function} [callback] runs only if shower.next() complete successfully
|
||||||
* @returns {Number|Boolean}
|
* @returns {Number|Boolean}
|
||||||
*/
|
*/
|
||||||
|
@ -171,18 +200,26 @@ window.shower = (function(window, document, undefined) {
|
||||||
// navigation or inner navigation is fully shown
|
// navigation or inner navigation is fully shown
|
||||||
// NOTE: But first of all check if there is no current slide
|
// NOTE: But first of all check if there is no current slide
|
||||||
if (
|
if (
|
||||||
|
(
|
||||||
-1 === currentSlideNumber ||
|
-1 === currentSlideNumber ||
|
||||||
!slideList[currentSlideNumber].hasInnerNavigation ||
|
! slideList[currentSlideNumber].hasInnerNavigation ||
|
||||||
-1 === shower.increaseInnerNavigation(currentSlideNumber)
|
! shower.increaseInnerNavigation(currentSlideNumber)
|
||||||
|
) &&
|
||||||
|
// If exist next slide
|
||||||
|
(currentSlideNumber + 2) <= slideList.length
|
||||||
) {
|
) {
|
||||||
shower.go(currentSlideNumber + 1);
|
shower.go(currentSlideNumber + 1);
|
||||||
// slides starts from 0
|
// Slides starts from 0. So return next slide number.
|
||||||
ret = currentSlideNumber + 2;
|
ret = currentSlideNumber + 2;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (shower.isSlideMode()) {
|
||||||
|
shower.runInnerNavigation(currentSlideNumber + 1);
|
||||||
|
}
|
||||||
|
|
||||||
if (typeof(callback) === 'function') {
|
if (typeof(callback) === 'function') {
|
||||||
callback();
|
callback();
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
};
|
};
|
||||||
|
@ -243,33 +280,22 @@ window.shower = (function(window, document, undefined) {
|
||||||
shower.enterSlideMode = function(callback) {
|
shower.enterSlideMode = function(callback) {
|
||||||
var currentSlideNumber = shower.getCurrentSlideNumber();
|
var currentSlideNumber = shower.getCurrentSlideNumber();
|
||||||
|
|
||||||
if (currentSlideNumber === -1) {
|
// Anyway: change body class (@TODO: refactoring)
|
||||||
currentSlideNumber = 0;
|
body.classList.remove('list');
|
||||||
}
|
body.classList.add('full');
|
||||||
|
|
||||||
shower.go(currentSlideNumber);
|
|
||||||
shower.showPresenterNotes(currentSlideNumber);
|
|
||||||
|
|
||||||
|
// Preparing URL for shower.go()
|
||||||
if (shower.isListMode() && isHistoryApiSupported) {
|
if (shower.isListMode() && isHistoryApiSupported) {
|
||||||
history.pushState(null, null, url.pathname + '?full' + shower.getSlideHash(currentSlideNumber));
|
history.pushState(null, null, url.pathname + '?full' + shower.getSlideHash(currentSlideNumber));
|
||||||
}
|
}
|
||||||
|
|
||||||
body.classList.remove('list');
|
shower._applyTransform(shower._getTransform());
|
||||||
body.classList.add('full');
|
|
||||||
|
|
||||||
if (window.console && window.console.clear) {
|
|
||||||
console.clear();
|
|
||||||
}
|
|
||||||
|
|
||||||
shower.updateProgress(currentSlideNumber);
|
|
||||||
shower.updateCurrentAndPassedSlides(currentSlideNumber);
|
|
||||||
shower.runInnerNavigation(currentSlideNumber);
|
|
||||||
|
|
||||||
if (typeof(callback) === 'function') {
|
if (typeof(callback) === 'function') {
|
||||||
callback();
|
callback();
|
||||||
}
|
}
|
||||||
|
|
||||||
return shower._applyTransform(shower._getTransform());
|
return true;
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -278,24 +304,32 @@ window.shower = (function(window, document, undefined) {
|
||||||
* @returns {Boolean}
|
* @returns {Boolean}
|
||||||
*/
|
*/
|
||||||
shower.enterListMode = function(callback) {
|
shower.enterListMode = function(callback) {
|
||||||
|
// Anyway: change body class (@TODO: refactoring)
|
||||||
|
body.classList.remove('full');
|
||||||
|
body.classList.add('list');
|
||||||
|
|
||||||
|
shower.clearPresenterNotes();
|
||||||
|
|
||||||
|
if (shower.isListMode()) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
var currentSlideNumber = shower.getCurrentSlideNumber();
|
var currentSlideNumber = shower.getCurrentSlideNumber();
|
||||||
|
|
||||||
clearTimeout(timer);
|
clearTimeout(timer);
|
||||||
|
|
||||||
body.classList.remove('full');
|
|
||||||
body.classList.add('list');
|
|
||||||
|
|
||||||
if (shower.isSlideMode() && isHistoryApiSupported) {
|
if (shower.isSlideMode() && isHistoryApiSupported) {
|
||||||
history.pushState(null, null, url.pathname + shower.getSlideHash(currentSlideNumber));
|
history.pushState(null, null, url.pathname + shower.getSlideHash(currentSlideNumber));
|
||||||
}
|
}
|
||||||
|
|
||||||
shower.scrollToSlide(currentSlideNumber);
|
shower.scrollToSlide(currentSlideNumber);
|
||||||
|
shower._applyTransform('none');
|
||||||
|
|
||||||
if (typeof(callback) === 'function') {
|
if (typeof(callback) === 'function') {
|
||||||
callback();
|
callback();
|
||||||
}
|
}
|
||||||
|
|
||||||
return shower._applyTransform('none');
|
return true;
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -440,11 +474,22 @@ window.shower = (function(window, document, undefined) {
|
||||||
return true;
|
return true;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Clear presenter notes in console.
|
||||||
|
*/
|
||||||
|
shower.clearPresenterNotes = function() {
|
||||||
|
if (window.console && window.console.clear) {
|
||||||
|
console.clear();
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Show presenter notes in console.
|
* Show presenter notes in console.
|
||||||
* @param {Number} slideNumber slide number (sic!). Attention: starts from zero.
|
* @param {Number} slideNumber slide number (sic!). Attention: starts from zero.
|
||||||
*/
|
*/
|
||||||
shower.showPresenterNotes = function(slideNumber) {
|
shower.showPresenterNotes = function(slideNumber) {
|
||||||
|
shower.clearPresenterNotes();
|
||||||
|
|
||||||
if (window.console) {
|
if (window.console) {
|
||||||
slideNumber = shower._normalizeSlideNumber(slideNumber);
|
slideNumber = shower._normalizeSlideNumber(slideNumber);
|
||||||
|
|
||||||
|
@ -452,11 +497,12 @@ window.shower = (function(window, document, undefined) {
|
||||||
nextSlideId = slideList[slideNumber + 1] ? slideList[slideNumber + 1].id : null,
|
nextSlideId = slideList[slideNumber + 1] ? slideList[slideNumber + 1].id : null,
|
||||||
notes = document.getElementById(slideId).querySelector('footer');
|
notes = document.getElementById(slideId).querySelector('footer');
|
||||||
|
|
||||||
if (notes) {
|
if (notes && notes.innerHTML) {
|
||||||
console.info(notes.innerHTML.replace(/\n\s+/g,'\n'));
|
console.info(notes.innerHTML.replace(/\n\s+/g,'\n'));
|
||||||
}
|
}
|
||||||
|
|
||||||
if (nextSlideId) {
|
if (nextSlideId) {
|
||||||
|
|
||||||
var next = document.getElementById(nextSlideId).querySelector('h2');
|
var next = document.getElementById(nextSlideId).querySelector('h2');
|
||||||
|
|
||||||
if (next) {
|
if (next) {
|
||||||
|
@ -482,32 +528,6 @@ window.shower = (function(window, document, undefined) {
|
||||||
return '#' + slideList[slideNumber].id;
|
return '#' + slideList[slideNumber].id;
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
|
||||||
* Go to slide number...
|
|
||||||
* @param {Number} slideNumber slide number (sic!). Attention: starts from zero.
|
|
||||||
* @param {Function} [callback] runs only if you not in List mode
|
|
||||||
* @returns {Number}
|
|
||||||
*/
|
|
||||||
shower.go = function(slideNumber, callback) {
|
|
||||||
if ( ! shower._isNumber(slideNumber)) {
|
|
||||||
throw new Error('Gimme slide number as Number, baby!');
|
|
||||||
}
|
|
||||||
|
|
||||||
url.hash = shower.getSlideHash(slideNumber);
|
|
||||||
|
|
||||||
if (shower.isSlideMode()) {
|
|
||||||
shower.updateProgress(slideNumber);
|
|
||||||
shower.updateCurrentAndPassedSlides(slideNumber);
|
|
||||||
shower.showPresenterNotes(slideNumber);
|
|
||||||
|
|
||||||
if (typeof(callback) === 'function') {
|
|
||||||
callback();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return slideNumber;
|
|
||||||
};
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Run slide show if presented.
|
* Run slide show if presented.
|
||||||
* @param {Number} slideNumber
|
* @param {Number} slideNumber
|
||||||
|
@ -529,8 +549,7 @@ window.shower = (function(window, document, undefined) {
|
||||||
timing = parseInt(timing[0], 10) * 60 * 1000 + parseInt(timing[1], 10) * 1000;
|
timing = parseInt(timing[0], 10) * 60 * 1000 + parseInt(timing[1], 10) * 1000;
|
||||||
|
|
||||||
timer = setTimeout(function() {
|
timer = setTimeout(function() {
|
||||||
shower.go(slideNumber + 1);
|
shower.next();
|
||||||
shower.runInnerNavigation(slideNumber + 1);
|
|
||||||
},
|
},
|
||||||
timing);
|
timing);
|
||||||
}
|
}
|
||||||
|
@ -541,12 +560,11 @@ window.shower = (function(window, document, undefined) {
|
||||||
/**
|
/**
|
||||||
* Increases inner navigation by adding 'active' class to next inactive inner navigation item
|
* Increases inner navigation by adding 'active' class to next inactive inner navigation item
|
||||||
* @param {Number} slideNumber
|
* @param {Number} slideNumber
|
||||||
* @returns {Number}
|
* @returns {Boolean}
|
||||||
*/
|
*/
|
||||||
shower.increaseInnerNavigation = function(slideNumber) {
|
shower.increaseInnerNavigation = function(slideNumber) {
|
||||||
var nextNodes,
|
var nextNodes,
|
||||||
node,
|
node;
|
||||||
ret = -1;
|
|
||||||
|
|
||||||
if ( ! shower._isNumber(slideNumber)) {
|
if ( ! shower._isNumber(slideNumber)) {
|
||||||
throw new Error('Gimme slide number as Number, baby!');
|
throw new Error('Gimme slide number as Number, baby!');
|
||||||
|
@ -559,20 +577,18 @@ window.shower = (function(window, document, undefined) {
|
||||||
if (0 !== nextNodes.length) {
|
if (0 !== nextNodes.length) {
|
||||||
node = nextNodes[0];
|
node = nextNodes[0];
|
||||||
node.classList.add('active');
|
node.classList.add('active');
|
||||||
ret = nextNodes.length - 1;
|
return true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return ret;
|
return false;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
// Event handlers
|
// Event handlers
|
||||||
|
|
||||||
window.addEventListener('DOMContentLoaded', function() {
|
window.addEventListener('DOMContentLoaded', function() {
|
||||||
if (body.classList.contains('full')) {
|
if (body.classList.contains('full') || shower.isSlideMode()) {
|
||||||
|
shower.go(shower.getCurrentSlideNumber());
|
||||||
shower.enterSlideMode();
|
shower.enterSlideMode();
|
||||||
}
|
}
|
||||||
}, false);
|
}, false);
|
||||||
|
@ -596,7 +612,7 @@ window.shower = (function(window, document, undefined) {
|
||||||
if (e.altKey || e.ctrlKey || e.metaKey) { return; }
|
if (e.altKey || e.ctrlKey || e.metaKey) { return; }
|
||||||
|
|
||||||
var currentSlideNumber = shower.getCurrentSlideNumber(),
|
var currentSlideNumber = shower.getCurrentSlideNumber(),
|
||||||
innerNavigationCompleted = true;
|
isInnerNavCompleted = true;
|
||||||
|
|
||||||
switch (e.which) {
|
switch (e.which) {
|
||||||
case 116: // F5
|
case 116: // F5
|
||||||
|
@ -605,8 +621,11 @@ window.shower = (function(window, document, undefined) {
|
||||||
if (shower.isListMode()) {
|
if (shower.isListMode()) {
|
||||||
var slideNumber = e.shiftKey ? currentSlideNumber : 0;
|
var slideNumber = e.shiftKey ? currentSlideNumber : 0;
|
||||||
|
|
||||||
|
// Warning: go must be before enterSlideMode. Else there are
|
||||||
|
// bug in Chrome
|
||||||
shower.go(slideNumber);
|
shower.go(slideNumber);
|
||||||
shower.enterSlideMode();
|
shower.enterSlideMode();
|
||||||
|
shower.showPresenterNotes(slideNumber);
|
||||||
} else {
|
} else {
|
||||||
shower.enterListMode();
|
shower.enterListMode();
|
||||||
}
|
}
|
||||||
|
@ -641,28 +660,7 @@ window.shower = (function(window, document, undefined) {
|
||||||
case 76: // l
|
case 76: // l
|
||||||
case 74: // j
|
case 74: // j
|
||||||
e.preventDefault();
|
e.preventDefault();
|
||||||
|
shower.next();
|
||||||
if (shower.isSlideMode()) {
|
|
||||||
// Inner navigation is "completed" if current slide have
|
|
||||||
// no inner navigation or inner navigation is fully shown
|
|
||||||
innerNavigationCompleted = !slideList[currentSlideNumber].hasInnerNavigation ||
|
|
||||||
-1 === shower.increaseInnerNavigation(currentSlideNumber);
|
|
||||||
} else {
|
|
||||||
// Also inner navigation is always "completed" if we are in
|
|
||||||
// list mode
|
|
||||||
innerNavigationCompleted = true;
|
|
||||||
}
|
|
||||||
// NOTE: First of all check if there is no current slide
|
|
||||||
if (
|
|
||||||
-1 === currentSlideNumber || innerNavigationCompleted
|
|
||||||
) {
|
|
||||||
currentSlideNumber++;
|
|
||||||
shower.go(currentSlideNumber);
|
|
||||||
// We must run slideshow only in full mode
|
|
||||||
if (shower.isSlideMode()) {
|
|
||||||
shower.runInnerNavigation(currentSlideNumber);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 36: // Home
|
case 36: // Home
|
||||||
|
@ -687,10 +685,17 @@ window.shower = (function(window, document, undefined) {
|
||||||
}, false);
|
}, false);
|
||||||
|
|
||||||
document.addEventListener('click', function(e) {
|
document.addEventListener('click', function(e) {
|
||||||
if (shower.isListMode() && shower._getSlideIdByEl(e.target)) {
|
|
||||||
e.preventDefault();
|
e.preventDefault();
|
||||||
shower.go(shower.getSlideNumber(shower._getSlideIdByEl(e.target)));
|
|
||||||
|
var slideNumber = shower.getSlideNumber(shower._getSlideIdByEl(e.target));
|
||||||
|
|
||||||
|
// Click on slide in List mode
|
||||||
|
if (shower.isListMode() && shower._getSlideIdByEl(e.target)) {
|
||||||
|
// Warning: go must be before enterSlideMode. Else there are
|
||||||
|
// bug in Chrome
|
||||||
|
shower.go(slideNumber);
|
||||||
shower.enterSlideMode();
|
shower.enterSlideMode();
|
||||||
|
shower.showPresenterNotes(slideNumber);
|
||||||
}
|
}
|
||||||
}, false);
|
}, false);
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue