yacreader/common/scroll_management.cpp
2022-09-04 10:05:11 +02:00

68 lines
1.6 KiB
C++

#include "scroll_management.h"
#include <QtCore>
#include <QApplication>
ScrollManagement::ScrollManagement()
{
wheelTimer = new QElapsedTimer();
wheelTimer->start();
wheelAccumulator = 0;
}
ScrollManagement::Movement ScrollManagement::getMovement(QWheelEvent *event)
{
// qDebug() << "WheelEvent angle delta : " << event->angleDelta();
// qDebug() << "WheelEvent pixel delta : " << event->pixelDelta();
// qDebug() << "Accumulator : " << wheelAccumulator;
int delta;
int tooFast = 1;
int timeThrottle = 16;
int minimumMove;
if (event->pixelDelta().x() != 0 || event->pixelDelta().y() != 0) {
delta = event->pixelDelta().y() + event->pixelDelta().x();
minimumMove = 30;
} else {
delta = (event->angleDelta().y() / 8) + (event->angleDelta().x() / 8);
minimumMove = 8;
}
wheelAccumulator += delta;
// avoid any events overflood
if ((wheelTimer->elapsed() < tooFast)) {
event->setAccepted(true);
return None;
}
// Do not process events too fast
if ((wheelTimer->elapsed() < timeThrottle)) {
event->setAccepted(true);
return None;
}
// small intervals are ignored until with have enough acumulated delta
if ((wheelAccumulator < minimumMove) && (wheelAccumulator > -minimumMove)) {
event->setAccepted(true);
return None;
}
Movement m;
if (wheelAccumulator < 0)
m = Forward;
else
m = Backward;
event->accept();
// Clean up
wheelAccumulator = 0;
wheelTimer->restart();
return m;
}
ScrollManagement::~ScrollManagement()
{
}