From 976935b86dcdc73e0c3bb31078eace0022de70b4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Luis=20=C3=81ngel=20San=20Mart=C3=ADn?= Date: Fri, 23 Jan 2015 09:29:06 +0100 Subject: [PATCH] first approach to custom scrolling using high res touchpads applied to flow_gl(for no native scrollables widgets) --- common/yacreader_flow_gl.cpp | 49 ++++++++++++++++++++++++++++++++++-- common/yacreader_flow_gl.h | 3 +++ 2 files changed, 50 insertions(+), 2 deletions(-) diff --git a/common/yacreader_flow_gl.cpp b/common/yacreader_flow_gl.cpp index 8808fc5c..331ca9f8 100644 --- a/common/yacreader_flow_gl.cpp +++ b/common/yacreader_flow_gl.cpp @@ -248,6 +248,10 @@ YACReaderFlowGL::YACReaderFlowGL(QWidget *parent,struct Preset p) timerId = startTimer(updateInterval); + wheelTimer = new QTime(); + wheelTimer->start(); + wheelAccumulator = 0; + } void YACReaderFlowGL::timerEvent(QTimerEvent * event) @@ -1042,13 +1046,54 @@ void YACReaderFlowGL::render() } //EVENTOS +#include "QsLog.h" void YACReaderFlowGL::wheelEvent(QWheelEvent * event) { - if(event->delta()<0) + /*QLOG_DEBUG() << "WheelEvent angle delta : " << event->angleDelta(); + QLOG_DEBUG() << "WheelEvent pixel delta : " << event->pixelDelta();*/ + + /*if(event->delta()<0) showNext(); else showPrevious(); - event->accept(); + event->accept();*/ + + int tooFast = 1; + int timeThrottle = 16; + int minimumMove = 70; + + //avoid any events overflood + if((wheelTimer->elapsed() < tooFast)){ + event->setAccepted(true); + return; + } + + // Accumulate the delta + if(event->delta()<0 != wheelAccumulator<0 ) //different sign means change in direction + wheelAccumulator = 0; + + wheelAccumulator += event->delta(); + + //Do not process events too fast + if((wheelTimer->elapsed() < timeThrottle)){ + event->setAccepted(true); + return; + } + + //small intervals are ignored until with have enough acumulated delta + if((wheelAccumulator < minimumMove) && (wheelAccumulator > -minimumMove)){ + event->setAccepted(true); + return; + } + + if(wheelAccumulator<0) + showNext(); + else + showPrevious(); + event->accept(); + //Clean up + wheelAccumulator = 0; + wheelTimer->restart(); } void YACReaderFlowGL::keyPressEvent(QKeyEvent *event) diff --git a/common/yacreader_flow_gl.h b/common/yacreader_flow_gl.h index 3076cd5d..4e4be817 100644 --- a/common/yacreader_flow_gl.h +++ b/common/yacreader_flow_gl.h @@ -175,6 +175,9 @@ protected: void startAnimationTimer(); void stopAnimationTimer(); + + QTime * wheelTimer; + int wheelAccumulator; public: