Added experimental slide-out sidebar with page thumbnails.

This commit is contained in:
Justin D'Arcangelo 2011-06-26 02:14:57 -04:00
parent 3f6df90e50
commit c40333317b
3 changed files with 132 additions and 12 deletions

View File

@ -74,6 +74,20 @@ span {
width: 100%; width: 100%;
} }
.thumbnailPageNumber {
color: #fff;
font-size: 0.55em;
text-align: right;
margin: -6px 2px 6px 0px;
width: 102px;
}
.thumbnail {
width: 104px;
height: 134px;
margin: 0px auto 10px;
}
.page { .page {
width: 816px; width: 816px;
height: 1056px; height: 1056px;
@ -163,27 +177,46 @@ span {
} }
#sidebar { #sidebar {
background-color: rgba(0, 0, 0, 0.8);
position: fixed; position: fixed;
width: 150px; width: 200px;
top: 62px; top: 62px;
bottom: 18px; bottom: 18px;
left: -170px;
transition: left 0.25s ease-in-out 1s;
-moz-transition: left 0.25s ease-in-out 1s;
-webkit-transition: left 0.25s ease-in-out 1s;
}
#sidebar:hover {
left: 0px;
transition: left 0.25s ease-in-out 0s;
-moz-transition: left 0.25s ease-in-out 0s;
-webkit-transition: left 0.25s ease-in-out 0s;
}
#sidebarBox {
background-color: rgba(0, 0, 0, 0.7);
width: 150px;
height: 100%;
border-top-right-radius: 8px; border-top-right-radius: 8px;
border-bottom-right-radius: 8px; border-bottom-right-radius: 8px;
-moz-border-radius-topright: 8px; -moz-border-radius-topright: 8px;
-moz-border-radius-bottomright: 8px; -moz-border-radius-bottomright: 8px;
-webkit-border-top-right-radius: 8px; -webkit-border-top-right-radius: 8px;
-webkit-border-bottom-right-radius: 8px; -webkit-border-bottom-right-radius: 8px;
box-shadow: 0px 2px 8px #000;
-moz-box-shadow: 0px 2px 8px #000;
-webkit-box-shadow: 0px 2px 8px #000;
} }
#sidebarScrollView { #sidebarScrollView {
position: absolute; position: absolute;
overflow: hidden; overflow: hidden;
overflow-y: auto; overflow-y: auto;
top: 40px; top: 10px;
right: 10px;
bottom: 10px; bottom: 10px;
left: 10px; left: 10px;
width: 130px;
} }
#sidebarContentView { #sidebarContentView {

View File

@ -40,13 +40,16 @@
<span class="label">Open File</span> <span class="label">Open File</span>
</span> </span>
</div> </div>
<!--<div id="sidebar">
<div id="sidebarScrollView"> <!-- EXPERIMENTAL: Slide-out sidebar with page thumbnails (comment-out to disable) -->
<div id="sidebarContentView"> <div id="sidebar">
<div id="sidebarBox">
<div id="sidebarScrollView">
<div id="sidebarContentView"></div>
</div> </div>
</div> </div>
</div>--> </div>
<div id="viewer"></div> <div id="viewer"></div>
</body> </body>
</html> </html>

View File

@ -10,6 +10,8 @@ var PDFViewer = {
element: null, element: null,
sidebarContentView: null,
previousPageButton: null, previousPageButton: null,
nextPageButton: null, nextPageButton: null,
pageNumberInput: null, pageNumberInput: null,
@ -52,6 +54,78 @@ var PDFViewer = {
return pages; return pages;
}, },
createThumbnail: function(num) {
if (PDFViewer.sidebarContentView) {
var anchor = document.createElement('a');
anchor.href = '#' + num;
var containerDiv = document.createElement('div');
containerDiv.id = 'thumbnailContainer' + num;
containerDiv.className = 'thumbnail';
var pageNumberDiv = document.createElement('div');
pageNumberDiv.className = 'thumbnailPageNumber';
pageNumberDiv.innerHTML = '' + num;
anchor.appendChild(containerDiv);
PDFViewer.sidebarContentView.appendChild(anchor);
PDFViewer.sidebarContentView.appendChild(pageNumberDiv);
}
},
removeThumbnail: function(num) {
var div = document.getElementById('thumbnailContainer' + num);
if (div) {
while (div.hasChildNodes()) {
div.removeChild(div.firstChild);
}
}
},
drawThumbnail: function(num) {
if (!PDFViewer.pdf)
return;
var div = document.getElementById('thumbnailContainer' + num);
if (div && !div.hasChildNodes()) {
var page = PDFViewer.pdf.getPage(num);
var canvas = document.createElement('canvas');
canvas.id = 'thumbnail' + num;
canvas.mozOpaque = true;
// Canvas dimensions must be specified in CSS pixels. CSS pixels
// are always 96 dpi. These dimensions are 8.5in x 11in at 96dpi.
canvas.width = 104;
canvas.height = 134;
div.appendChild(canvas);
var ctx = canvas.getContext('2d');
ctx.save();
ctx.fillStyle = 'rgb(255, 255, 255)';
ctx.fillRect(0, 0, canvas.width, canvas.height);
ctx.restore();
var gfx = new CanvasGraphics(ctx);
// page.compile will collect all fonts for us, once we have loaded them
// we can trigger the actual page rendering with page.display
var fonts = [];
page.compile(gfx, fonts);
var loadFont = function() {
if (!FontLoader.bind(fonts)) {
pageTimeout = window.setTimeout(loadFont, 10);
return;
}
page.display(gfx);
}
loadFont();
}
},
createPage: function(num) { createPage: function(num) {
var anchor = document.createElement('a'); var anchor = document.createElement('a');
anchor.name = '' + num; anchor.name = '' + num;
@ -81,11 +155,11 @@ var PDFViewer = {
return; return;
var div = document.getElementById('pageContainer' + num); var div = document.getElementById('pageContainer' + num);
var canvas = document.createElement('canvas');
if (div && !div.hasChildNodes()) { if (div && !div.hasChildNodes()) {
var page = PDFViewer.pdf.getPage(num); var page = PDFViewer.pdf.getPage(num);
var canvas = document.createElement('canvas');
canvas.id = 'page' + num; canvas.id = 'page' + num;
canvas.mozOpaque = true; canvas.mozOpaque = true;
@ -130,6 +204,7 @@ var PDFViewer = {
if (PDFViewer.pdf) { if (PDFViewer.pdf) {
for (i = 1; i <= PDFViewer.numberOfPages; i++) { for (i = 1; i <= PDFViewer.numberOfPages; i++) {
PDFViewer.createThumbnail(i);
PDFViewer.createPage(i); PDFViewer.createPage(i);
} }
} }
@ -218,6 +293,13 @@ var PDFViewer = {
if (PDFViewer.numberOfPages > 0) { if (PDFViewer.numberOfPages > 0) {
PDFViewer.drawPage(1); PDFViewer.drawPage(1);
document.location.hash = 1; document.location.hash = 1;
setTimeout(function() {
for (var i = 1; i <= PDFViewer.numberOfPages; i++) {
PDFViewer.createThumbnail(i);
PDFViewer.drawThumbnail(i);
}
}, 500);
} }
PDFViewer.previousPageButton.className = (PDFViewer.pageNumber === 1) ? 'disabled' : ''; PDFViewer.previousPageButton.className = (PDFViewer.pageNumber === 1) ? 'disabled' : '';
@ -242,6 +324,8 @@ window.onload = function() {
PDFViewer.element = document.getElementById('viewer'); PDFViewer.element = document.getElementById('viewer');
PDFViewer.sidebarContentView = document.getElementById('sidebarContentView');
PDFViewer.pageNumberInput = document.getElementById('pageNumber'); PDFViewer.pageNumberInput = document.getElementById('pageNumber');
PDFViewer.pageNumberInput.onkeydown = function(evt) { PDFViewer.pageNumberInput.onkeydown = function(evt) {
var charCode = evt.charCode || evt.keyCode; var charCode = evt.charCode || evt.keyCode;