Mercurial > hg > svgui
diff widgets/WheelCounter.h @ 1303:13f5f84fbfad
Collect the bits of bookkeeping for mouse wheel events, and use in all widgets
author | Chris Cannam |
---|---|
date | Fri, 22 Jun 2018 17:19:48 +0100 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/widgets/WheelCounter.h Fri Jun 22 17:19:48 2018 +0100 @@ -0,0 +1,65 @@ +/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ + +/* + Sonic Visualiser + An audio file viewer and annotation editor. + Centre for Digital Music, Queen Mary, University of London. + + This program is free software; you can redistribute it and/or + modify it under the terms of the GNU General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. See the file + COPYING included with this distribution for more information. +*/ + +#ifndef SV_WHEEL_COUNTER_H +#define SV_WHEEL_COUNTER_H + +#include <QWheelEvent> + +/** + * Manage the little bit of tedious book-keeping associated with + * translating vertical wheel events into up/down notch counts + */ +class WheelCounter +{ +public: + WheelCounter() : m_pendingWheelAngle(0) { } + + ~WheelCounter() { } + + int count(QWheelEvent *e) { + + e->accept(); + + int delta = e->angleDelta().y(); + if (delta == 0) { + return 0; + } + + if (e->phase() == Qt::ScrollBegin || + std::abs(delta) >= 120 || + (delta > 0 && m_pendingWheelAngle < 0) || + (delta < 0 && m_pendingWheelAngle > 0)) { + m_pendingWheelAngle = delta; + } else { + m_pendingWheelAngle += delta; + } + + if (abs(m_pendingWheelAngle) >= 600) { + // Sometimes on Linux we're seeing absurdly extreme angles + // on the first wheel event -- discard those entirely + m_pendingWheelAngle = 0; + return 0; + } + + int count = m_pendingWheelAngle / 120; + m_pendingWheelAngle -= count * 120; + return count; + } + +private: + int m_pendingWheelAngle; +}; + +#endif