mirror of
https://github.com/JakubMelka/PDF4QT.git
synced 2025-06-05 21:59:17 +02:00
Issue #112: smooth scrolling
This commit is contained in:
@ -266,6 +266,8 @@ PDFDrawWidgetBase<BaseWidget>::PDFDrawWidgetBase(PDFWidget* widget, QWidget* par
|
||||
{
|
||||
this->setFocusPolicy(Qt::StrongFocus);
|
||||
this->setMouseTracking(true);
|
||||
|
||||
QObject::connect(&m_autoScrollTimer, &QTimer::timeout, this, &PDFDrawWidgetBase::onAutoScrollTimeout);
|
||||
}
|
||||
|
||||
template<typename BaseWidget>
|
||||
@ -308,6 +310,13 @@ void PDFDrawWidgetBase<BaseWidget>::performMouseOperation(QPoint currentMousePos
|
||||
break;
|
||||
}
|
||||
|
||||
case MouseOperation::AutoScroll:
|
||||
{
|
||||
m_lastMousePosition = currentMousePosition;
|
||||
onAutoScrollTimeout();
|
||||
break;
|
||||
}
|
||||
|
||||
default:
|
||||
Q_ASSERT(false);
|
||||
}
|
||||
@ -407,6 +416,26 @@ void PDFDrawWidgetBase<BaseWidget>::mousePressEvent(QMouseEvent* event)
|
||||
m_lastMousePosition = event->pos();
|
||||
}
|
||||
|
||||
if (event->button() == Qt::MiddleButton)
|
||||
{
|
||||
if (m_mouseOperation == MouseOperation::AutoScroll)
|
||||
{
|
||||
m_mouseOperation = MouseOperation::None;
|
||||
m_autoScrollTimer.stop();
|
||||
m_autoScrollLastElapsedTimer.restart();
|
||||
m_autoScrollOffset = QPointF(0.0, 0.0);
|
||||
}
|
||||
else
|
||||
{
|
||||
m_mouseOperation = MouseOperation::AutoScroll;
|
||||
m_autoScrollMousePosition = event->pos();
|
||||
m_autoScrollLastElapsedTimer.restart();
|
||||
m_autoScrollOffset = QPointF(0.0, 0.0);
|
||||
m_lastMousePosition = event->pos();
|
||||
m_autoScrollTimer.start();
|
||||
}
|
||||
}
|
||||
|
||||
updateCursor();
|
||||
event->accept();
|
||||
}
|
||||
@ -441,12 +470,19 @@ void PDFDrawWidgetBase<BaseWidget>::mouseReleaseEvent(QMouseEvent* event)
|
||||
|
||||
case MouseOperation::Translate:
|
||||
{
|
||||
m_mouseOperation = MouseOperation::None;
|
||||
if (event->button() != Qt::MiddleButton)
|
||||
{
|
||||
m_mouseOperation = MouseOperation::None;
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
case MouseOperation::AutoScroll:
|
||||
break;
|
||||
|
||||
default:
|
||||
Q_ASSERT(false);
|
||||
break;
|
||||
}
|
||||
|
||||
updateCursor();
|
||||
@ -496,6 +532,10 @@ void PDFDrawWidgetBase<BaseWidget>::updateCursor()
|
||||
cursor = QCursor(Qt::ClosedHandCursor);
|
||||
break;
|
||||
|
||||
case MouseOperation::AutoScroll:
|
||||
cursor = QCursor(Qt::SizeAllCursor);
|
||||
break;
|
||||
|
||||
default:
|
||||
Q_ASSERT(false);
|
||||
break;
|
||||
@ -512,6 +552,31 @@ void PDFDrawWidgetBase<BaseWidget>::updateCursor()
|
||||
}
|
||||
}
|
||||
|
||||
template<typename BaseWidget>
|
||||
void PDFDrawWidgetBase<BaseWidget>::onAutoScrollTimeout()
|
||||
{
|
||||
if (m_mouseOperation != MouseOperation::AutoScroll)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
QPointF offset = m_autoScrollMousePosition - m_lastMousePosition;
|
||||
QPointF scrollOffset = m_autoScrollOffset;
|
||||
|
||||
qreal secondsElapsed = qreal(m_autoScrollLastElapsedTimer.nsecsElapsed()) * 0.000000001;
|
||||
m_autoScrollLastElapsedTimer.restart();
|
||||
scrollOffset += offset * secondsElapsed;
|
||||
|
||||
int scrollX = qFloor(scrollOffset.x());
|
||||
int scrollY = qFloor(scrollOffset.y());
|
||||
|
||||
scrollOffset -= QPointF(scrollX, scrollY);
|
||||
m_autoScrollOffset = scrollOffset;
|
||||
|
||||
PDFDrawWidgetProxy* proxy = m_widget->getDrawWidgetProxy();
|
||||
proxy->scrollByPixels(QPoint(scrollX, scrollY));
|
||||
}
|
||||
|
||||
template<typename BaseWidget>
|
||||
void PDFDrawWidgetBase<BaseWidget>::wheelEvent(QWheelEvent* event)
|
||||
{
|
||||
|
Reference in New Issue
Block a user