#include "scroll_management.h" #include #include 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() { }