diff --git a/plotview.cpp b/plotview.cpp index ac4d106..c8aa80c 100644 --- a/plotview.cpp +++ b/plotview.cpp @@ -170,15 +170,24 @@ bool PlotView::viewportEvent(QEvent *event) { if (event->type() == QEvent::Wheel) { QWheelEvent *wheelEvent = (QWheelEvent*)event; if (QApplication::keyboardModifiers() & Qt::ControlModifier) { - // `updateViewRange()` keeps the center sample in the same place after zoom. Apply - // a scroll adjustment to keep the sample under the mouse cursor in the same place instead. - int fromCenter = wheelEvent->pos().x() - width()/2; - if (wheelEvent->angleDelta().y() > 0 && zoomLevel < fftSize) { - emit zoomIn(); - horizontalScrollBar()->setValue(horizontalScrollBar()->value() + fromCenter * samplesPerLine()); - } else if (wheelEvent->angleDelta().y() < 0 && zoomLevel > 1) { - horizontalScrollBar()->setValue(horizontalScrollBar()->value() - fromCenter * samplesPerLine()); - emit zoomOut(); + bool canZoomIn = zoomLevel < fftSize; + bool canZoomOut = zoomLevel > 1; + int delta = wheelEvent->angleDelta().y(); + if ((delta > 0 && canZoomIn) || (delta < 0 && canZoomOut)) { + scrollZoomStepsAccumulated += delta; + + // `updateViewRange()` keeps the center sample in the same place after zoom. Apply + // a scroll adjustment to keep the sample under the mouse cursor in the same place instead. + int fromCenter = wheelEvent->pos().x() - width()/2; + if (scrollZoomStepsAccumulated >= 120) { + scrollZoomStepsAccumulated -= 120; + emit zoomIn(); + horizontalScrollBar()->setValue(horizontalScrollBar()->value() + fromCenter * samplesPerLine()); + } else if (scrollZoomStepsAccumulated <= -120) { + scrollZoomStepsAccumulated += 120; + horizontalScrollBar()->setValue(horizontalScrollBar()->value() - fromCenter * samplesPerLine()); + emit zoomOut(); + } } return true; } diff --git a/plotview.h b/plotview.h index 231939a..5cce114 100644 --- a/plotview.h +++ b/plotview.h @@ -75,6 +75,7 @@ private: bool cursorsEnabled; off_t sampleRate = 0; bool timeScaleEnabled; + int scrollZoomStepsAccumulated = 0; void addPlot(Plot *plot); void emitTimeSelection();