From 95b2ec124bb8bdcfabfc69e377b7d28e9dcab569 Mon Sep 17 00:00:00 2001 From: Jonas Jenwald Date: Sat, 31 Jan 2015 16:46:23 +0100 Subject: [PATCH] Move the PresentationMode-specific scrollWheel code from PDFViewerApplication --- web/presentation_mode.js | 77 +++++++++++++++++++++++++++++++++++++++- web/viewer.js | 75 ++++---------------------------------- 2 files changed, 82 insertions(+), 70 deletions(-) diff --git a/web/presentation_mode.js b/web/presentation_mode.js index 6c4fe4643..6fc223ba6 100644 --- a/web/presentation_mode.js +++ b/web/presentation_mode.js @@ -30,6 +30,8 @@ var PresentationMode = { //#if (GENERIC || CHROME) prevCoords: { x: null, y: null }, //#endif + mouseScrollTimeStamp: 0, + mouseScrollDelta: 0, initialize: function presentationModeInitialize(options) { this.initialized = true; @@ -146,6 +148,7 @@ var PresentationMode = { window.addEventListener('mousemove', this.mouseMove, false); window.addEventListener('mousedown', this.mouseDown, false); + window.addEventListener('keydown', this.keyDown, false); window.addEventListener('contextmenu', this.contextMenu, false); this.showControls(); @@ -175,10 +178,11 @@ var PresentationMode = { window.removeEventListener('mousemove', this.mouseMove, false); window.removeEventListener('mousedown', this.mouseDown, false); + window.removeEventListener('keydown', this.keyDown, false); window.removeEventListener('contextmenu', this.contextMenu, false); this.hideControls(); - PDFViewerApplication.clearMouseScrollState(); + this.clearMouseScrollState(); this.container.removeAttribute('contextmenu'); this.contextMenuOpen = false; @@ -246,8 +250,79 @@ var PresentationMode = { } }, + keyDown: function presentationModeKeyDown(evt) { + PresentationMode.clearMouseScrollState(); + }, + contextMenu: function presentationModeContextMenu(evt) { PresentationMode.contextMenuOpen = true; + }, + + /** + * This function flips the page in presentation mode if the user scrolls up + * or down with large enough motion and prevents page flipping too often. + * @param {number} mouseScrollDelta The delta value from the mouse event. + */ + mouseScroll: function presentationModeMouseScroll(mouseScrollDelta) { + if (!this.initialized) { + return; + } + var MOUSE_SCROLL_COOLDOWN_TIME = 50; + + var currentTime = (new Date()).getTime(); + var storedTime = this.mouseScrollTimeStamp; + + // In case one page has already been flipped there is a cooldown time + // which has to expire before next page can be scrolled on to. + if (currentTime > storedTime && + currentTime - storedTime < MOUSE_SCROLL_COOLDOWN_TIME) { + return; + } + + // In case the user decides to scroll to the opposite direction than before + // clear the accumulated delta. + if ((this.mouseScrollDelta > 0 && mouseScrollDelta < 0) || + (this.mouseScrollDelta < 0 && mouseScrollDelta > 0)) { + this.clearMouseScrollState(); + } + + this.mouseScrollDelta += mouseScrollDelta; + + var PAGE_FLIP_THRESHOLD = 120; + if (Math.abs(this.mouseScrollDelta) >= PAGE_FLIP_THRESHOLD) { + + var PageFlipDirection = { + UP: -1, + DOWN: 1 + }; + + // In presentation mode scroll one page at a time. + var pageFlipDirection = (this.mouseScrollDelta > 0) ? + PageFlipDirection.UP : + PageFlipDirection.DOWN; + this.clearMouseScrollState(); + var currentPage = PDFViewerApplication.page; + + // In case we are already on the first or the last page there is no need + // to do anything. + if ((currentPage === 1 && pageFlipDirection === PageFlipDirection.UP) || + (currentPage === PDFViewerApplication.pagesCount && + pageFlipDirection === PageFlipDirection.DOWN)) { + return; + } + + PDFViewerApplication.page += pageFlipDirection; + this.mouseScrollTimeStamp = currentTime; + } + }, + + /** + * This function clears the member attributes used with mouse scrolling in + * presentation mode. + */ + clearMouseScrollState: function presentationModeClearMouseScrollState() { + this.mouseScrollTimeStamp = 0; + this.mouseScrollDelta = 0; } }; diff --git a/web/viewer.js b/web/viewer.js index b80d9781f..994835dce 100644 --- a/web/viewer.js +++ b/web/viewer.js @@ -111,8 +111,6 @@ var PDFViewerApplication = { updateScaleControls: true, isInitialViewSet: false, animationStartedPromise: null, - mouseScrollTimeStamp: 0, - mouseScrollDelta: 0, preferenceSidebarViewOnLoad: SidebarView.NONE, preferencePdfBugEnabled: false, preferenceShowPreviousViewOnLoad: true, @@ -1342,72 +1340,11 @@ var PDFViewerApplication = { PresentationMode.request(); }, - /** - * This function flips the page in presentation mode if the user scrolls up - * or down with large enough motion and prevents page flipping too often. - * - * @this {PDFView} - * @param {number} mouseScrollDelta The delta value from the mouse event. - */ - mouseScroll: function pdfViewMouseScroll(mouseScrollDelta) { - var MOUSE_SCROLL_COOLDOWN_TIME = 50; - - var currentTime = (new Date()).getTime(); - var storedTime = this.mouseScrollTimeStamp; - - // In case one page has already been flipped there is a cooldown time - // which has to expire before next page can be scrolled on to. - if (currentTime > storedTime && - currentTime - storedTime < MOUSE_SCROLL_COOLDOWN_TIME) { + scrollPresentationMode: function pdfViewScrollPresentationMode(delta) { + if (!this.supportsFullscreen) { return; } - - // In case the user decides to scroll to the opposite direction than before - // clear the accumulated delta. - if ((this.mouseScrollDelta > 0 && mouseScrollDelta < 0) || - (this.mouseScrollDelta < 0 && mouseScrollDelta > 0)) { - this.clearMouseScrollState(); - } - - this.mouseScrollDelta += mouseScrollDelta; - - var PAGE_FLIP_THRESHOLD = 120; - if (Math.abs(this.mouseScrollDelta) >= PAGE_FLIP_THRESHOLD) { - - var PageFlipDirection = { - UP: -1, - DOWN: 1 - }; - - // In presentation mode scroll one page at a time. - var pageFlipDirection = (this.mouseScrollDelta > 0) ? - PageFlipDirection.UP : - PageFlipDirection.DOWN; - this.clearMouseScrollState(); - var currentPage = this.page; - - // In case we are already on the first or the last page there is no need - // to do anything. - if ((currentPage === 1 && pageFlipDirection === PageFlipDirection.UP) || - (currentPage === this.pagesCount && - pageFlipDirection === PageFlipDirection.DOWN)) { - return; - } - - this.page += pageFlipDirection; - this.mouseScrollTimeStamp = currentTime; - } - }, - - /** - * This function clears the member attributes used with mouse scrolling in - * presentation mode. - * - * @this {PDFView} - */ - clearMouseScrollState: function pdfViewClearMouseScrollState() { - this.mouseScrollTimeStamp = 0; - this.mouseScrollDelta = 0; + PresentationMode.mouseScroll(delta); } }; //#if GENERIC @@ -1986,9 +1923,10 @@ function handleMouseWheel(evt) { if (PDFViewerApplication.pdfViewer.isInPresentationMode) { evt.preventDefault(); - PDFViewerApplication.mouseScroll(ticks * MOUSE_WHEEL_DELTA_FACTOR); + PDFViewerApplication.scrollPresentationMode(ticks * + MOUSE_WHEEL_DELTA_FACTOR); } else if (evt.ctrlKey || evt.metaKey) { - // Only zoom the pages, not the entire viewer + // Only zoom the pages, not the entire viewer. evt.preventDefault(); PDFViewerApplication[direction](Math.abs(ticks)); } @@ -2256,7 +2194,6 @@ window.addEventListener('keydown', function keydown(evt) { if (handled) { evt.preventDefault(); - PDFViewerApplication.clearMouseScrollState(); } });