Merge branch 'work/hires_wheel_page_scroll_rework' into 'master'

Fixed Page Scroll Using Hires Scroll Wheel

See merge request graphics/okular!658
This commit is contained in:
Zack Mak 2024-06-24 22:47:06 +00:00
commit 30370b1da3
2 changed files with 79 additions and 30 deletions

View File

@ -217,6 +217,10 @@ public:
QPoint dragScrollVector;
QTimer dragScrollTimer;
// page scroll
int pageScrollDelta = 0;
QTimer pageScrollTimer;
// left click depress
QTimer leftClickTimer;
@ -422,6 +426,8 @@ PageView::PageView(QWidget *parent, Okular::Document *document)
connect(&d->dragScrollTimer, &QTimer::timeout, this, &PageView::slotDragScroll);
connect(&d->pageScrollTimer, &QTimer::timeout, this, &PageView::slotPageScroll);
d->leftClickTimer.setSingleShot(true);
connect(&d->leftClickTimer, &QTimer::timeout, this, &PageView::slotShowSizeAllCursor);
@ -2183,6 +2189,56 @@ void PageView::continuousZoomEnd()
updateCursor();
}
bool PageView::isPageScroll(int delta)
{
bool pageScroll = false;
int vScroll = verticalScrollBar()->value();
d->pageScrollDelta += delta;
if (d->pageScrollTimer.isActive()) {
d->pageScrollTimer.stop();
}
d->pageScrollTimer.setSingleShot(true);
d->pageScrollTimer.start(500);
if (d->pageScrollDelta <= -QWheelEvent::DefaultDeltasPerStep && vScroll == verticalScrollBar()->maximum()) {
// go to next page
if ((int)d->document->currentPage() < d->items.count() - 1) {
// more optimized than document->setNextPage and then move view to top
Okular::DocumentViewport newViewport = d->document->viewport();
newViewport.pageNumber += viewColumns();
if (newViewport.pageNumber >= (int)d->items.count()) {
newViewport.pageNumber = d->items.count() - 1;
}
newViewport.rePos.enabled = true;
newViewport.rePos.normalizedY = 0.0;
d->document->setViewport(newViewport);
d->scroller->scrollTo(QPoint(horizontalScrollBar()->value(), verticalScrollBar()->value()), 0); // sync scroller with scrollbar
d->pageScrollDelta = 0;
pageScroll = true;
}
} else if (d->pageScrollDelta >= QWheelEvent::DefaultDeltasPerStep && vScroll == verticalScrollBar()->minimum()) {
// go to prev page
if (d->document->currentPage() > 0) {
// more optimized than document->setPrevPage and then move view to bottom
Okular::DocumentViewport newViewport = d->document->viewport();
newViewport.pageNumber -= viewColumns();
if (newViewport.pageNumber < 0) {
newViewport.pageNumber = 0;
}
newViewport.rePos.enabled = true;
newViewport.rePos.normalizedY = 1.0;
d->document->setViewport(newViewport);
d->scroller->scrollTo(QPoint(horizontalScrollBar()->value(), verticalScrollBar()->value()), 0); // sync scroller with scrollbar
d->pageScrollDelta = 0;
pageScroll = true;
}
} else if ((d->pageScrollDelta < 0 && vScroll == verticalScrollBar()->maximum()) || (d->pageScrollDelta > 0 && vScroll == verticalScrollBar()->minimum())) {
pageScroll = true;
}
return pageScroll;
}
void PageView::mouseMoveEvent(QMouseEvent *e)
{
d->previousMouseMovePos = e->globalPosition();
@ -2313,6 +2369,8 @@ void PageView::mouseMoveEvent(QMouseEvent *e)
void PageView::mousePressEvent(QMouseEvent *e)
{
d->pageScrollDelta = 0;
// don't perform any mouse action when no document is shown
if (d->items.isEmpty()) {
return;
@ -2512,6 +2570,8 @@ void PageView::mousePressEvent(QMouseEvent *e)
void PageView::mouseReleaseEvent(QMouseEvent *e)
{
d->pageScrollDelta = 0;
// stop the drag scrolling
d->dragScrollTimer.stop();
@ -3159,6 +3219,8 @@ void PageView::guessTableDividers()
void PageView::mouseDoubleClickEvent(QMouseEvent *e)
{
d->pageScrollDelta = 0;
if (e->button() == Qt::LeftButton) {
const QPoint eventPos = contentAreaPoint(e->pos());
PageViewItem *pageItem = pickItemOnPoint(eventPos.x(), eventPos.y());
@ -3209,40 +3271,16 @@ void PageView::wheelEvent(QWheelEvent *e)
return;
}
int delta = e->angleDelta().y(), vScroll = verticalScrollBar()->value();
int delta = e->angleDelta().y();
e->accept();
if ((e->modifiers() & Qt::ControlModifier) == Qt::ControlModifier) {
continuousZoom(delta);
} else {
if (delta <= -QWheelEvent::DefaultDeltasPerStep && !getContinuousMode() && vScroll == verticalScrollBar()->maximum()) {
// go to next page
if ((int)d->document->currentPage() < d->items.count() - 1) {
// more optimized than document->setNextPage and then move view to top
Okular::DocumentViewport newViewport = d->document->viewport();
newViewport.pageNumber += viewColumns();
if (newViewport.pageNumber >= (int)d->items.count()) {
newViewport.pageNumber = d->items.count() - 1;
}
newViewport.rePos.enabled = true;
newViewport.rePos.normalizedY = 0.0;
d->document->setViewport(newViewport);
d->scroller->scrollTo(QPoint(horizontalScrollBar()->value(), verticalScrollBar()->value()), 0); // sync scroller with scrollbar
}
} else if (delta >= QWheelEvent::DefaultDeltasPerStep && !getContinuousMode() && vScroll == verticalScrollBar()->minimum()) {
// go to prev page
if (d->document->currentPage() > 0) {
// more optimized than document->setPrevPage and then move view to bottom
Okular::DocumentViewport newViewport = d->document->viewport();
newViewport.pageNumber -= viewColumns();
if (newViewport.pageNumber < 0) {
newViewport.pageNumber = 0;
}
newViewport.rePos.enabled = true;
newViewport.rePos.normalizedY = 1.0;
d->document->setViewport(newViewport);
d->scroller->scrollTo(QPoint(horizontalScrollBar()->value(), verticalScrollBar()->value()), 0); // sync scroller with scrollbar
}
} else {
bool skipScroll = false;
if (!getContinuousMode()) {
skipScroll = isPageScroll(delta);
}
if (!skipScroll) {
// When the shift key is held down, scroll ten times faster
int multiplier = e->modifiers() & Qt::ShiftModifier ? 10 : 1;
@ -3257,6 +3295,7 @@ void PageView::wheelEvent(QWheelEvent *e)
} else {
d->scroller->scrollTo(d->scroller->finalPosition() - e->angleDelta() * multiplier, 0);
}
d->pageScrollDelta = 0;
}
}
}
@ -4909,6 +4948,11 @@ void PageView::slotDragScroll()
updateSelection(p);
}
void PageView::slotPageScroll()
{
d->pageScrollDelta = 0;
}
void PageView::slotShowWelcome()
{
// show initial welcome text

View File

@ -242,6 +242,9 @@ private:
*/
bool getContinuousMode() const;
// Hangle page scrolling in non-continuous mode
bool isPageScroll(int delta);
// Zoom around the point given as zoomCenter
// zoomCenter is given in viewport coordinates
// newZoom is the intended new zoom level. A value of 0.0 means: Don't change the current zoom level.
@ -264,6 +267,8 @@ private Q_SLOTS:
void slotAutoScroll();
// activated by the dragScroll timer
void slotDragScroll();
// activated by the pageScroll timer
void slotPageScroll();
// show the welcome message
void slotShowWelcome();
// activated by left click timer