Accumulate Control+Wheel Deltas until they reach QWheelEvent::DefaultDeltasPerStep

This way zooming in/out with a touchpad is easier to control

BUGS: 377128
remotes/origin/Applications/16.12
Albert Astals Cid 9 years ago
parent c058c809e2
commit 7a50ce0edf
  1. 78
      ui/pageview.cpp

@ -166,6 +166,7 @@ public:
double lastSourceLocationViewportNormalizedX; double lastSourceLocationViewportNormalizedX;
double lastSourceLocationViewportNormalizedY; double lastSourceLocationViewportNormalizedY;
QTimer * viewportMoveTimer; QTimer * viewportMoveTimer;
int controlWheelAccumulatedDelta;
// auto scroll // auto scroll
int scrollIncrement; int scrollIncrement;
QTimer * autoScrollTimer; QTimer * autoScrollTimer;
@ -312,6 +313,7 @@ PageView::PageView( QWidget *parent, Okular::Document *document )
d->lastSourceLocationViewportNormalizedX = 0.0; d->lastSourceLocationViewportNormalizedX = 0.0;
d->lastSourceLocationViewportNormalizedY = 0.0; d->lastSourceLocationViewportNormalizedY = 0.0;
d->viewportMoveTimer = 0; d->viewportMoveTimer = 0;
d->controlWheelAccumulatedDelta = 0;
d->scrollIncrement = 0; d->scrollIncrement = 0;
d->autoScrollTimer = 0; d->autoScrollTimer = 0;
d->annotator = 0; d->annotator = 0;
@ -1971,6 +1973,8 @@ void PageView::tabletEvent( QTabletEvent * e )
void PageView::mouseMoveEvent( QMouseEvent * e ) void PageView::mouseMoveEvent( QMouseEvent * e )
{ {
d->controlWheelAccumulatedDelta = 0;
// don't perform any mouse action when no document is shown // don't perform any mouse action when no document is shown
if ( d->items.isEmpty() ) if ( d->items.isEmpty() )
return; return;
@ -2159,6 +2163,8 @@ void PageView::mouseMoveEvent( QMouseEvent * e )
void PageView::mousePressEvent( QMouseEvent * e ) void PageView::mousePressEvent( QMouseEvent * e )
{ {
d->controlWheelAccumulatedDelta = 0;
// don't perform any mouse action when no document is shown // don't perform any mouse action when no document is shown
if ( d->items.isEmpty() ) if ( d->items.isEmpty() )
return; return;
@ -2392,6 +2398,8 @@ void PageView::mousePressEvent( QMouseEvent * e )
void PageView::mouseReleaseEvent( QMouseEvent * e ) void PageView::mouseReleaseEvent( QMouseEvent * e )
{ {
d->controlWheelAccumulatedDelta = 0;
// stop the drag scrolling // stop the drag scrolling
d->dragScrollTimer.stop(); d->dragScrollTimer.stop();
@ -3192,6 +3200,8 @@ void PageView::guessTableDividers()
void PageView::mouseDoubleClickEvent( QMouseEvent * e ) void PageView::mouseDoubleClickEvent( QMouseEvent * e )
{ {
d->controlWheelAccumulatedDelta = 0;
if ( e->button() == Qt::LeftButton ) if ( e->button() == Qt::LeftButton )
{ {
const QPoint eventPos = contentAreaPoint( e->pos() ); const QPoint eventPos = contentAreaPoint( e->pos() );
@ -3254,43 +3264,55 @@ void PageView::wheelEvent( QWheelEvent *e )
vScroll = verticalScrollBar()->value(); vScroll = verticalScrollBar()->value();
e->accept(); e->accept();
if ( (e->modifiers() & Qt::ControlModifier) == Qt::ControlModifier ) { if ( (e->modifiers() & Qt::ControlModifier) == Qt::ControlModifier ) {
if ( e->delta() < 0 ) d->controlWheelAccumulatedDelta += delta;
if ( d->controlWheelAccumulatedDelta <= -QWheelEvent::DefaultDeltasPerStep )
{
slotZoomOut(); slotZoomOut();
else d->controlWheelAccumulatedDelta = 0;
}
else if ( d->controlWheelAccumulatedDelta >= QWheelEvent::DefaultDeltasPerStep )
{
slotZoomIn(); slotZoomIn();
d->controlWheelAccumulatedDelta = 0;
}
} }
else if ( delta <= -120 && !Okular::Settings::viewContinuous() && vScroll == verticalScrollBar()->maximum() ) else
{ {
// go to next page d->controlWheelAccumulatedDelta = 0;
if ( (int)d->document->currentPage() < d->items.count() - 1 )
if ( delta <= -QWheelEvent::DefaultDeltasPerStep && !Okular::Settings::viewContinuous() && vScroll == verticalScrollBar()->maximum() )
{ {
// more optimized than document->setNextPage and then move view to top // go to next page
Okular::DocumentViewport newViewport = d->document->viewport(); if ( (int)d->document->currentPage() < d->items.count() - 1 )
newViewport.pageNumber += viewColumns(); {
if ( newViewport.pageNumber >= (int)d->items.count() ) // more optimized than document->setNextPage and then move view to top
newViewport.pageNumber = d->items.count() - 1; Okular::DocumentViewport newViewport = d->document->viewport();
newViewport.rePos.enabled = true; newViewport.pageNumber += viewColumns();
newViewport.rePos.normalizedY = 0.0; if ( newViewport.pageNumber >= (int)d->items.count() )
d->document->setViewport( newViewport ); newViewport.pageNumber = d->items.count() - 1;
newViewport.rePos.enabled = true;
newViewport.rePos.normalizedY = 0.0;
d->document->setViewport( newViewport );
}
} }
} else if ( delta >= QWheelEvent::DefaultDeltasPerStep && !Okular::Settings::viewContinuous() && vScroll == verticalScrollBar()->minimum() )
else if ( delta >= 120 && !Okular::Settings::viewContinuous() && vScroll == verticalScrollBar()->minimum() )
{
// go to prev page
if ( d->document->currentPage() > 0 )
{ {
// more optimized than document->setPrevPage and then move view to bottom // go to prev page
Okular::DocumentViewport newViewport = d->document->viewport(); if ( d->document->currentPage() > 0 )
newViewport.pageNumber -= viewColumns(); {
if ( newViewport.pageNumber < 0 ) // more optimized than document->setPrevPage and then move view to bottom
newViewport.pageNumber = 0; Okular::DocumentViewport newViewport = d->document->viewport();
newViewport.rePos.enabled = true; newViewport.pageNumber -= viewColumns();
newViewport.rePos.normalizedY = 1.0; if ( newViewport.pageNumber < 0 )
d->document->setViewport( newViewport ); newViewport.pageNumber = 0;
newViewport.rePos.enabled = true;
newViewport.rePos.normalizedY = 1.0;
d->document->setViewport( newViewport );
}
} }
else
QAbstractScrollArea::wheelEvent( e );
} }
else
QAbstractScrollArea::wheelEvent( e );
updateCursor(); updateCursor();
} }

Loading…
Cancel
Save