From bdb2df773d774c15cf0a17fcae198d3f2452cdfa Mon Sep 17 00:00:00 2001 From: Kezi Olio Date: Sun, 16 Aug 2020 16:21:35 +0200 Subject: [PATCH] Fix forms when inertially scrolling `setViewport` automatically adds an item to the history if it finds that it moved for more than a page, which we don't want to do when automatically scrolling, as with inertial scrolling. This commit adds a new function `setViewportWithHistory()` which takes an argument to optionally avoid preserving history. This avoids breaking ABI. The new history-less functionality is used when inertially scrolling. BUG: 421354 FIXED-IN: 1.11.2 --- core/document.cpp | 33 ++++++++++++++++++++------------- core/document.h | 11 +++++++++++ ui/pageview.cpp | 5 +++-- 3 files changed, 34 insertions(+), 15 deletions(-) diff --git a/core/document.cpp b/core/document.cpp index f31345d5c..baa48a3fd 100644 --- a/core/document.cpp +++ b/core/document.cpp @@ -3445,19 +3445,8 @@ void Document::setPrevPage() setViewport( DocumentViewport( (*d->m_viewportIterator).pageNumber - 1 ) ); } */ -void Document::setViewportPage(int page, DocumentObserver *excludeObserver, bool smoothMove) -{ - // clamp page in range [0 ... numPages-1] - if (page < 0) - page = 0; - else if (page > (int)d->m_pagesVector.count()) - page = d->m_pagesVector.count() - 1; - // make a viewport from the page and broadcast it - setViewport(DocumentViewport(page), excludeObserver, smoothMove); -} - -void Document::setViewport(const DocumentViewport &viewport, DocumentObserver *excludeObserver, bool smoothMove) +void Document::setViewportWithHistory(const DocumentViewport &viewport, DocumentObserver *excludeObserver, bool smoothMove, bool updateHistory) { if (!viewport.isValid()) { qCDebug(OkularCoreDebug) << "invalid viewport:" << viewport.toString(); @@ -3477,7 +3466,7 @@ void Document::setViewport(const DocumentViewport &viewport, DocumentObserver *e const int oldPageNumber = oldViewport.pageNumber; // set internal viewport taking care of history - if (oldViewport.pageNumber == viewport.pageNumber || !oldViewport.isValid()) { + if (oldViewport.pageNumber == viewport.pageNumber || !oldViewport.isValid() || !updateHistory) { // if page is unchanged save the viewport at current position in queue oldViewport = viewport; } else { @@ -3506,6 +3495,24 @@ void Document::setViewport(const DocumentViewport &viewport, DocumentObserver *e } } +void Document::setViewportPage(int page, DocumentObserver *excludeObserver, bool smoothMove) +{ + // clamp page in range [0 ... numPages-1] + if (page < 0) + page = 0; + else if (page > (int)d->m_pagesVector.count()) + page = d->m_pagesVector.count() - 1; + + // make a viewport from the page and broadcast it + setViewport(DocumentViewport(page), excludeObserver, smoothMove); +} + +void Document::setViewport(const DocumentViewport &viewport, DocumentObserver *excludeObserver, bool smoothMove) +{ + // set viewport, updating history + setViewportWithHistory(viewport, excludeObserver, smoothMove, true); +} + void Document::setZoom(int factor, DocumentObserver *excludeObserver) { // notify change to all other (different from id) observers diff --git a/core/document.h b/core/document.h index 9b7f6df14..d2bfa2b29 100644 --- a/core/document.h +++ b/core/document.h @@ -431,6 +431,17 @@ public: */ void setViewport(const DocumentViewport &viewport, DocumentObserver *excludeObserver = nullptr, bool smoothMove = false); + /** + * Sets the current document viewport to the given @p viewport. + * BCI TODO: merge with setViewport, adding a parameter "bool updateHistory = true" + * + * @param viewport The document viewport. + * @param excludeObserver The observer which shouldn't be effected by this change. + * @param smoothMove Whether the move shall be animated smoothly. + * @param updateHistory Whether to consider the change of viewport for the history navigation + */ + void setViewportWithHistory(const DocumentViewport &viewport, DocumentObserver *excludeObserver = nullptr, bool smoothMove = false, bool updateHistory = true); + /** * Sets the current document viewport to the next viewport in the * viewport history. diff --git a/ui/pageview.cpp b/ui/pageview.cpp index fb8883257..89daf92f3 100644 --- a/ui/pageview.cpp +++ b/ui/pageview.cpp @@ -4360,7 +4360,7 @@ static void slotRequestPreloadPixmap(Okular::DocumentObserver *observer, const P void PageView::slotRequestVisiblePixmaps(int newValue) { // if requests are blocked (because raised by an unwanted event), exit - if (d->blockPixmapsRequest || d->scroller->state() == QScroller::Scrolling) + if (d->blockPixmapsRequest) return; // precalc view limits for intersecting with page coords inside the loop @@ -4503,7 +4503,8 @@ void PageView::slotRequestVisiblePixmaps(int newValue) newViewport.rePos.normalizedX = focusedX; newViewport.rePos.normalizedY = focusedY; // set the viewport to other observers - d->document->setViewport(newViewport, this); + // do not update history if the viewport is autoscrolling + d->document->setViewportWithHistory(newViewport, this, false, d->scroller->state() == QScroller::Scrolling); } d->document->setVisiblePageRects(visibleRects, this); }