From 25323b4a3a3178aac9fd2e0ff5f127bc9f273394 Mon Sep 17 00:00:00 2001 From: Jonas Kvinge Date: Sun, 1 Jan 2023 17:46:26 +0100 Subject: [PATCH] VolumeSlider: Fix infinite loop when adjusting volume using mouse wheel Fixes #1089 --- src/widgets/volumeslider.cpp | 11 ++++++++++- src/widgets/volumeslider.h | 1 + 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/src/widgets/volumeslider.cpp b/src/widgets/volumeslider.cpp index c49664ce..127eddb6 100644 --- a/src/widgets/volumeslider.cpp +++ b/src/widgets/volumeslider.cpp @@ -47,6 +47,7 @@ SliderSlider::SliderSlider(const Qt::Orientation orientation, QWidget *parent, const int max) : QSlider(orientation, parent), sliding_(false), + wheeling_(false), outside_(false), prev_value_(0) { @@ -62,6 +63,8 @@ void SliderSlider::wheelEvent(QWheelEvent *e) { return; } + wheeling_ = true; + // Position Slider (horizontal) int step = e->angleDelta().y() * 1500 / 18; int nval = qBound(minimum(), QSlider::value() + step, maximum()); @@ -70,6 +73,8 @@ void SliderSlider::wheelEvent(QWheelEvent *e) { emit SliderReleased(value()); + wheeling_ = false; + } void SliderSlider::mouseMoveEvent(QMouseEvent *e) { @@ -151,7 +156,7 @@ void SliderSlider::setValue(int value) { // Don't adjust the slider while the user is dragging it! - if (!sliding_ || outside_) { + if ((!sliding_ || outside_) && !wheeling_) { QSlider::setValue(adjustValue(value)); } else { @@ -310,10 +315,14 @@ void VolumeSlider::slideEvent(QMouseEvent *e) { void VolumeSlider::wheelEvent(QWheelEvent *e) { + wheeling_ = true; + const int step = e->angleDelta().y() / (e->angleDelta().x() == 0 ? 30 : -30); QSlider::setValue(SliderSlider::value() + step); emit SliderReleased(value()); + wheeling_ = false; + } void VolumeSlider::paintEvent(QPaintEvent*) { diff --git a/src/widgets/volumeslider.h b/src/widgets/volumeslider.h index a0305bbd..14615368 100644 --- a/src/widgets/volumeslider.h +++ b/src/widgets/volumeslider.h @@ -62,6 +62,7 @@ class SliderSlider : public QSlider { virtual void slideEvent(QMouseEvent*); bool sliding_; + bool wheeling_; /// we flip the value for vertical sliders int adjustValue(int v) const {