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;