From dbd30a8131fd331a76e9aa927e453a7eb2ce0b68 Mon Sep 17 00:00:00 2001 From: akapar Date: Thu, 18 Apr 2019 22:02:35 -0400 Subject: [PATCH] UI: Do not allow mouse wheel for volume slider This commit fixes the issue of being able to scroll through the mixer with the mouse wheel without modifying the volume slider. This functionality can be temporarily restored by holding a click on the volume meter. --- UI/slider-ignorewheel.cpp | 8 ++++++++ UI/slider-ignorewheel.hpp | 3 +++ UI/volume-control.cpp | 27 ++++++++++++++++++++++++--- UI/volume-control.hpp | 3 +++ 4 files changed, 38 insertions(+), 3 deletions(-) diff --git a/UI/slider-ignorewheel.cpp b/UI/slider-ignorewheel.cpp index 2c53d5596..91051b3f5 100644 --- a/UI/slider-ignorewheel.cpp +++ b/UI/slider-ignorewheel.cpp @@ -5,6 +5,14 @@ SliderIgnoreScroll::SliderIgnoreScroll(QWidget *parent) : QSlider(parent) setFocusPolicy(Qt::StrongFocus); } +SliderIgnoreScroll::SliderIgnoreScroll(Qt::Orientation orientation, + QWidget *parent) + : QSlider(parent) +{ + setFocusPolicy(Qt::StrongFocus); + setOrientation(orientation); +} + void SliderIgnoreScroll::wheelEvent(QWheelEvent * event) { if (!hasFocus()) diff --git a/UI/slider-ignorewheel.hpp b/UI/slider-ignorewheel.hpp index 078016c4b..e2d8c451c 100644 --- a/UI/slider-ignorewheel.hpp +++ b/UI/slider-ignorewheel.hpp @@ -5,11 +5,14 @@ #include + + class SliderIgnoreScroll : public QSlider { Q_OBJECT public: SliderIgnoreScroll(QWidget *parent = nullptr); + SliderIgnoreScroll(Qt::Orientation orientation, QWidget *parent = nullptr); protected: diff --git a/UI/volume-control.cpp b/UI/volume-control.cpp index 525802a19..f75c5ae07 100644 --- a/UI/volume-control.cpp +++ b/UI/volume-control.cpp @@ -2,11 +2,11 @@ #include "qt-wrappers.hpp" #include "obs-app.hpp" #include "mute-checkbox.hpp" +#include "slider-ignorewheel.hpp" #include "slider-absoluteset-style.hpp" #include #include #include -#include #include #include #include @@ -123,6 +123,7 @@ VolControl::VolControl(OBSSource source_, bool showConfig, bool vertical) nameLabel = new QLabel(); volLabel = new QLabel(); mute = new MuteCheckBox(); + QString sourceName = obs_source_get_name(source); setObjectName(sourceName); @@ -153,7 +154,7 @@ VolControl::VolControl(OBSSource source_, bool showConfig, bool vertical) QHBoxLayout *meterLayout = new QHBoxLayout; volMeter = new VolumeMeter(nullptr, obs_volmeter, true); - slider = new QSlider(Qt::Vertical); + slider = new SliderIgnoreScroll(Qt::Vertical); nameLayout->setAlignment(Qt::AlignCenter); meterLayout->setAlignment(Qt::AlignCenter); @@ -188,6 +189,8 @@ VolControl::VolControl(OBSSource source_, bool showConfig, bool vertical) mainLayout->addItem(meterLayout); mainLayout->addItem(controlLayout); + volMeter->setFocusProxy(slider); + setMaximumWidth(110); } else { QHBoxLayout *volLayout = new QHBoxLayout; @@ -195,7 +198,7 @@ VolControl::VolControl(OBSSource source_, bool showConfig, bool vertical) QHBoxLayout *botLayout = new QHBoxLayout; volMeter = new VolumeMeter(nullptr, obs_volmeter, false); - slider = new QSlider(Qt::Horizontal); + slider = new SliderIgnoreScroll(Qt::Horizontal); textLayout->setContentsMargins(0, 0, 0, 0); textLayout->addWidget(nameLabel); @@ -217,6 +220,8 @@ VolControl::VolControl(OBSSource source_, bool showConfig, bool vertical) mainLayout->addItem(textLayout); mainLayout->addWidget(volMeter); mainLayout->addItem(botLayout); + + volMeter->setFocusProxy(slider); } setLayout(mainLayout); @@ -227,6 +232,7 @@ VolControl::VolControl(OBSSource source_, bool showConfig, bool vertical) nameLabel->setText(sourceName); nameLabel->setFont(font); volLabel->setFont(font); + slider->setMinimum(0); slider->setMaximum(100); @@ -498,6 +504,21 @@ void VolumeMeter::setPeakMeterType(enum obs_peak_meter_type peakMeterType) } } +void VolumeMeter::mousePressEvent(QMouseEvent * event) +{ + setFocus(Qt::MouseFocusReason); +} + +void VolumeMeter::wheelEvent(QWheelEvent * event) +{ + QApplication::sendEvent(focusProxy(), event); +} + +void VolumeMeter::leaveEvent(QEvent * event) +{ + clearFocus(); +} + VolumeMeter::VolumeMeter(QWidget *parent, obs_volmeter_t *obs_volmeter, bool vertical) : QWidget(parent), obs_volmeter(obs_volmeter), diff --git a/UI/volume-control.hpp b/UI/volume-control.hpp index 220cafcdf..1edff8fdb 100644 --- a/UI/volume-control.hpp +++ b/UI/volume-control.hpp @@ -198,6 +198,9 @@ public: qreal getInputPeakHoldDuration() const; void setInputPeakHoldDuration(qreal v); void setPeakMeterType(enum obs_peak_meter_type peakMeterType); + virtual void mousePressEvent(QMouseEvent *event) override; + virtual void wheelEvent(QWheelEvent *event) override; + virtual void leaveEvent(QEvent *event) override; protected: void paintEvent(QPaintEvent *event) override;