Center pages vertically in PresentationMode (issue 10906)
*This patch can be tested e.g. with the `sizes.pdf` document in the test-suite.* While this patch isn't necessarily the best solution, e.g. it might be possible to solve this with *only* CSS, it's what I was able to come up with to address an old issue. The solution here re-uses the `spread`-class in PresentationMode, since that one already takes care of centering pages *vertically*, together with a dummy-page that takes up the entire height of the window. Finally, some PresentationMode-related CSS-rules are also simplified slightly, since the changes in PR 14112 (using Page-scrolling) allows some clean-up here.
This commit is contained in:
parent
70fc30d97c
commit
f7b1da418f
@ -159,24 +159,14 @@ class PDFPageViewBuffer {
|
||||
}
|
||||
}
|
||||
|
||||
function isSameScale(oldScale, newScale) {
|
||||
if (newScale === oldScale) {
|
||||
return true;
|
||||
}
|
||||
if (Math.abs(newScale - oldScale) < 1e-15) {
|
||||
// Prevent unnecessary re-rendering of all pages when the scale
|
||||
// changes only because of limited numerical precision.
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* Simple viewer control to display PDF content/pages.
|
||||
*/
|
||||
class BaseViewer {
|
||||
#buffer = null;
|
||||
|
||||
#previousContainerHeight = 0;
|
||||
|
||||
#scrollModePageState = null;
|
||||
|
||||
/**
|
||||
@ -751,7 +741,20 @@ class BaseViewer {
|
||||
if (this._spreadMode === SpreadMode.NONE) {
|
||||
// Finally, append the new page to the viewer.
|
||||
const pageView = this._pages[pageNumber - 1];
|
||||
viewer.appendChild(pageView.div);
|
||||
|
||||
if (this.isInPresentationMode) {
|
||||
const spread = document.createElement("div");
|
||||
spread.className = "spread";
|
||||
const dummyPage = document.createElement("div");
|
||||
dummyPage.className = "dummyPage";
|
||||
dummyPage.style.height = `${this.container.clientHeight}px`;
|
||||
|
||||
spread.appendChild(dummyPage);
|
||||
spread.appendChild(pageView.div);
|
||||
viewer.appendChild(spread);
|
||||
} else {
|
||||
viewer.appendChild(pageView.div);
|
||||
}
|
||||
|
||||
state.pages.push(pageView);
|
||||
} else {
|
||||
@ -828,10 +831,29 @@ class BaseViewer {
|
||||
scrollIntoView(pageDiv, pageSpot);
|
||||
}
|
||||
|
||||
/**
|
||||
* Prevent unnecessary re-rendering of all pages when the scale changes
|
||||
* only because of limited numerical precision.
|
||||
*/
|
||||
#isSameScale(newScale) {
|
||||
if (
|
||||
this.isInPresentationMode &&
|
||||
this.container.clientHeight !== this.#previousContainerHeight
|
||||
) {
|
||||
// Ensure that the current page remains centered vertically if/when
|
||||
// the window is resized while PresentationMode is active.
|
||||
return false;
|
||||
}
|
||||
return (
|
||||
newScale === this._currentScale ||
|
||||
Math.abs(newScale - this._currentScale) < 1e-15
|
||||
);
|
||||
}
|
||||
|
||||
_setScaleUpdatePages(newScale, newValue, noScroll = false, preset = false) {
|
||||
this._currentScaleValue = newValue.toString();
|
||||
|
||||
if (isSameScale(this._currentScale, newScale)) {
|
||||
if (this.#isSameScale(newScale)) {
|
||||
if (preset) {
|
||||
this.eventBus.dispatch("scalechanging", {
|
||||
source: this,
|
||||
@ -886,6 +908,8 @@ class BaseViewer {
|
||||
if (this.defaultRenderingQueue) {
|
||||
this.update();
|
||||
}
|
||||
|
||||
this.#previousContainerHeight = this.container.clientHeight;
|
||||
}
|
||||
|
||||
/**
|
||||
@ -911,11 +935,15 @@ class BaseViewer {
|
||||
if (!currentPage) {
|
||||
return;
|
||||
}
|
||||
const noPadding = this.isInPresentationMode || this.removePageBorders;
|
||||
let hPadding = noPadding ? 0 : SCROLLBAR_PADDING;
|
||||
let vPadding = noPadding ? 0 : VERTICAL_PADDING;
|
||||
let hPadding = SCROLLBAR_PADDING,
|
||||
vPadding = VERTICAL_PADDING;
|
||||
|
||||
if (!noPadding && this._scrollMode === ScrollMode.HORIZONTAL) {
|
||||
if (this.isInPresentationMode) {
|
||||
hPadding = vPadding = 4;
|
||||
} else if (this.removePageBorders) {
|
||||
hPadding = vPadding = 0;
|
||||
}
|
||||
if (this._scrollMode === ScrollMode.HORIZONTAL) {
|
||||
[hPadding, vPadding] = [vPadding, hPadding]; // Swap the padding values.
|
||||
}
|
||||
const pageWidthScale =
|
||||
|
@ -17,7 +17,7 @@
|
||||
@import url(xfa_layer_builder.css);
|
||||
|
||||
:root {
|
||||
--pdfViewer-padding-bottom: none;
|
||||
--pdfViewer-padding-bottom: 0;
|
||||
--page-margin: 1px auto -8px;
|
||||
--page-border: 9px solid transparent;
|
||||
--spreadHorizontalWrapped-margin-LR: -3.5px;
|
||||
@ -55,6 +55,12 @@
|
||||
background-color: rgba(255, 255, 255, 1);
|
||||
}
|
||||
|
||||
.pdfViewer .dummyPage {
|
||||
position: relative;
|
||||
width: 0;
|
||||
/* The height is set via JS, see `BaseViewer.#ensurePageViewVisible`. */
|
||||
}
|
||||
|
||||
.pdfViewer.removePageBorders .page {
|
||||
margin: 0 auto 10px;
|
||||
border: none;
|
||||
@ -90,6 +96,7 @@
|
||||
}
|
||||
|
||||
.spread .page,
|
||||
.spread .dummyPage,
|
||||
.pdfViewer.scrollHorizontal .page,
|
||||
.pdfViewer.scrollWrapped .page,
|
||||
.pdfViewer.scrollHorizontal .spread,
|
||||
@ -135,22 +142,14 @@
|
||||
}
|
||||
|
||||
.pdfPresentationMode .pdfViewer {
|
||||
margin-left: 0;
|
||||
margin-right: 0;
|
||||
padding-bottom: 0;
|
||||
}
|
||||
|
||||
.pdfPresentationMode .pdfViewer .page,
|
||||
.pdfPresentationMode .pdfViewer .spread {
|
||||
display: block;
|
||||
.pdfPresentationMode .spread {
|
||||
margin: 0;
|
||||
}
|
||||
|
||||
.pdfPresentationMode .pdfViewer .page,
|
||||
.pdfPresentationMode .pdfViewer.removePageBorders .page {
|
||||
margin-left: auto;
|
||||
margin-right: auto;
|
||||
}
|
||||
|
||||
.pdfPresentationMode:fullscreen .pdfViewer .page {
|
||||
margin-bottom: 100%;
|
||||
border: 0;
|
||||
.pdfPresentationMode .pdfViewer .page {
|
||||
margin: 0 auto;
|
||||
border: 2px solid transparent;
|
||||
}
|
||||
|
@ -211,7 +211,6 @@ select {
|
||||
|
||||
#viewerContainer.pdfPresentationMode:fullscreen {
|
||||
top: 0;
|
||||
border-top: 2px solid rgba(0, 0, 0, 0);
|
||||
background-color: rgba(0, 0, 0, 1);
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
|
Loading…
x
Reference in New Issue
Block a user