coverInternalPadding: 10, // Width of cover
coverExternalPadding: 10, // Padding outside of cover
bookSpineDivWidth: 30, // Width of book spine $$$ consider sizing based on book length
- autofit: true
+ autofit: 'auto',
};
// Background color for pages (e.g. when loading page image)
$("#BRcontainer").bind('scroll', this, function(e) {
e.data.loadLeafs();
});
-
+
this.setupKeyListeners();
this.startLocationPolling();
//console.log('resize!');
if (1 == e.data.mode) {
//console.log('centering 1page view');
+ if (e.data.autofit) {
+ e.data.resizePageView();
+ }
e.data.centerPageView();
$('#BRpageview').empty()
e.data.displayedIndices = [];
}
var reduceFactor = this.nextReduce(this.reduce, direction, this.onePage.reductionFactors);
+
+ if (this.reduce == reduceFactor.reduce) {
+ // Already at this level
+ return;
+ }
+
this.reduce = reduceFactor.reduce; // $$$ incorporate into function
- this.autofit = reduceFactor.autofit;
+ this.onePage.autofit = reduceFactor.autofit;
this.pageScale = this.reduce; // preserve current reduce
this.resizePageView();
this.onePageCalculateReductionFactors( $('#BRcontainer').attr('clientWidth'),
$('#BRcontainer').attr('clientHeight') );
// Update current reduce (if in autofit)
- // this.onePageUpdateReduce(); // XXX
+ if (this.onePage.autofit) {
+ var reductionFactor = this.nextReduce(this.reduce, this.onePage.autofit, this.onePage.reductionFactors);
+ this.reduce = reductionFactor.reduce;
+ }
for (i=0; i<this.numLeafs; i++) {
viewHeight += parseInt(this._getPageHeight(i)/this.reduce) + this.padding;
// quantizeReduce(reduce)
//______________________________________________________________________________
// Quantizes the given reduction factor to closest power of two from set from 12.5% to 200%
-BookReader.prototype.quantizeReduce = function(reduce) {
- var quantized = this.reductionFactors[0].reduce;
+BookReader.prototype.quantizeReduce = function(reduce, reductionFactors) {
+ var quantized = reductionFactors[0].reduce;
var distance = Math.abs(reduce - quantized);
- for (var i = 1; i < this.reductionFactors.length; i++) {
- newDistance = Math.abs(reduce - this.reductionFactors[i].reduce);
+ for (var i = 1; i < reductionFactors.length; i++) {
+ newDistance = Math.abs(reduce - reductionFactors[i].reduce);
if (newDistance < distance) {
distance = newDistance;
- quantized = this.reductionFactors[i].reduce;
+ quantized = reductionFactors[i].reduce;
}
}
//______________________________________________________________________________
BookReader.prototype.jumpToIndex = function(index, pageX, pageY) {
- if (2 == this.mode) {
+ if (this.constMode2up == this.mode) {
this.autoStop();
// By checking against min/max we do nothing if requested index
this.flipFwdToIndex(index);
}
- } else if (3 == this.mode) {
+ } else if (this.constModeThumb == this.mode) {
var viewWidth = $('#BRcontainer').attr('scrollWidth') - 20; // width minus buffer
var i;
var leafWidth = 0;
$('#BRcontainer').animate({scrollTop: leafTop },'fast');
}
} else {
+ // 1up
var i;
var leafTop = 0;
var leafLeft = 0;
offset -= $('#BRcontainer').attr('clientHeight') >> 1;
//console.log( 'jumping to ' + leafTop + ' ' + offset);
leafTop += offset;
+ } else {
+ // Show page just a little below the top
+ leafTop -= this.padding / 2;
}
if (pageX) {
// $$$ TODO preserve center of view when switching between mode
// See https://bugs.edge.launchpad.net/gnubook/+bug/416682
+ // XXX maybe better to preserve zoom in each mode
if (1 == mode) {
- this.reduce = this.quantizeReduce(this.reduce);
+ this.onePageCalculateReductionFactors( $('#BRcontainer').attr('clientWidth'), $('#BRcontainer').attr('clientHeight'));
+ this.reduce = this.quantizeReduce(this.reduce, this.onePage.reductionFactors);
this.prepareOnePageView();
} else if (3 == mode) {
- this.reduce = this.quantizeReduce(this.reduce);
+ this.reduce = this.quantizeReduce(this.reduce, this.reductionFactors);
this.prepareThumbnailView();
} else {
// $$$ why don't we save autofit?
- this.twoPage.autofit = false; // Take zoom level from other mode
- this.reduce = this.quantizeReduce(this.reduce);
+ this.twoPage.autofit = null; // Take zoom level from other mode
+ this.twoPageCalculateReductionFactors();
+ this.reduce = this.quantizeReduce(this.reduce, this.twoPage.reductionFactors);
this.prepareTwoPageView();
this.twoPageCenterView(0.5, 0.5); // $$$ TODO preserve center
}
}
BookReader.prototype.onePageGetAutofitWidth = function() {
- var widthPadding = 50;
+ var widthPadding = 20;
return (this.getMedianPageSize().width + 0.0) / ($('#BRcontainer').attr('clientWidth') - widthPadding * 2);
}
BookReader.prototype.onePageGetAutofitHeight = function() {
- var heightPadding = 10;
- return (this.getMedianPageSize().height + 0.0) / ($('#BRcontainer').attr('clientHeight') - heightPadding * 2);
+ return (this.getMedianPageSize().height + 0.0) / ($('#BRcontainer').attr('clientHeight') - this.padding * 2); // make sure a little of adjacent pages show
}
BookReader.prototype.getMedianPageSize = function() {
//______________________________________________________________________________
// Scrolls down one screen view
BookReader.prototype.scrollDown = function() {
- if ($.inArray(this.mode, [this.constMode2up, this.constModeThumb]) >= 0) {
+ if ($.inArray(this.mode, [this.constMode1up, this.constModeThumb]) >= 0) {
+ if ( this.mode == this.constMode1up && (this.reduce >= this.onePageGetAutofitHeight()) ) {
+ // Whole pages are visible, scroll whole page only
+ return this.next();
+ }
+
$('#BRcontainer').animate(
- { scrollTop: '+=' + $('#BRcontainer').height() * 0.95 + 'px'},
- 450, 'easeInOutQuint'
+ { scrollTop: '+=' + this._scrollAmount() + 'px'},
+ 400, 'easeInOutExpo'
);
return true;
} else {
//______________________________________________________________________________
// Scrolls up one screen view
BookReader.prototype.scrollUp = function() {
- if ($.inArray(this.mode, [this.constMode2up, this.constModeThumb]) >= 0) {
+ if ($.inArray(this.mode, [this.constMode1up, this.constModeThumb]) >= 0) {
+ if ( this.mode == this.constMode1up && (this.reduce >= this.onePageGetAutofitHeight()) ) {
+ // Whole pages are visible, scroll whole page only
+ return this.prev();
+ }
+
$('#BRcontainer').animate(
- { scrollTop: '-=' + $('#BRcontainer').height() * 0.95 + 'px'},
- 450, 'easeInOutQuint'
+ { scrollTop: '-=' + this._scrollAmount() + 'px'},
+ 400, 'easeInOutExpo'
);
return true;
} else {
}
}
+// _scrollAmount()
+//______________________________________________________________________________
+// The amount to scroll vertically in integer pixels
+BookReader.prototype._scrollAmount = function() {
+ if (this.constMode1up == this.mode) {
+ // Overlap by % of page size
+ return parseInt($('#BRcontainer').attr('clientHeight') - this.getPageHeight(this.currentIndex()) / this.reduce * 0.03);
+ }
+
+ return parseInt(0.9 * $('#BRcontainer').attr('clientHeight'));
+}
+
// flipBackToIndex()
//______________________________________________________________________________
});
jToolbar.find('.book_up').bind('click', function(e) {
- if ($.inArray(self.mode, [self.constMode2up, self.constModeThumb]) >= 0) {
+ if ($.inArray(self.mode, [self.constMode1up, self.constModeThumb]) >= 0) {
self.scrollUp();
} else {
self.prev();
});
jToolbar.find('.book_down').bind('click', function(e) {
- if ($.inArray(self.mode, [self.constMode2up, self.constModeThumb]) >= 0) {
+ if ($.inArray(self.mode, [self.constMode1up, self.constModeThumb]) >= 0) {
self.scrollDown();
} else {
self.next();
// Update the displayed zoom factor based on reduction factor
BookReader.prototype.updateToolbarZoom = function(reduce) {
var value;
- if (this.constMode2up == this.mode && this.twoPage.autofit) {
- value = 'Auto';
+ var autofit = null;
+
+ // $$$ TODO preserve zoom/fit for each mode
+ if (this.mode == this.constMode2up) {
+ autofit = this.twoPage.autofit;
+ } else {
+ autofit = this.onePage.autofit;
+ }
+
+ if (autofit) {
+ value = autofit[0].toUpperCase() + autofit.slice(1);
} else {
value = (100 / reduce).toFixed(2);
// Strip trailing zeroes and decimal if all zeroes