From e33b7d2daba8a529c32c6cbf5139564e33d14781 Mon Sep 17 00:00:00 2001 From: gxalpha Date: Sat, 26 Mar 2022 02:19:23 +0100 Subject: [PATCH] UI: Disable wheel scrolling on QComboBoxes Adds a new ProxyStyle, OBSIgnoreWheelProxyStyle, and applies it to the entire program. This style sets a StyleHint to disable mouse wheel scrolling on QComboBoxes. The existing OBSProxyStyle, which is used only for the context bar, has been renamed accordingly. --- UI/obs-app.cpp | 2 ++ UI/obs-proxy-style.cpp | 20 +++++++++++++++++--- UI/obs-proxy-style.hpp | 9 ++++++++- UI/window-basic-main.cpp | 2 +- 4 files changed, 28 insertions(+), 5 deletions(-) diff --git a/UI/obs-app.cpp b/UI/obs-app.cpp index e62a9700e..b15e87084 100644 --- a/UI/obs-app.cpp +++ b/UI/obs-app.cpp @@ -39,6 +39,7 @@ #include "qt-wrappers.hpp" #include "obs-app.hpp" +#include "obs-proxy-style.hpp" #include "log-viewer.hpp" #include "slider-ignorewheel.hpp" #include "window-basic-main.hpp" @@ -1116,6 +1117,7 @@ bool OBSApp::SetTheme(std::string name, std::string path) QString mpath = QString("file:///") + path.c_str(); setPalette(defaultPalette); ParseExtraThemeData(path.c_str()); + setStyle(new OBSIgnoreWheelProxyStyle); setStyleSheet(mpath); QColor color = palette().text().color(); themeDarkMode = !(color.redF() < 0.5); diff --git a/UI/obs-proxy-style.cpp b/UI/obs-proxy-style.cpp index 72b124881..05be7a7ee 100644 --- a/UI/obs-proxy-style.cpp +++ b/UI/obs-proxy-style.cpp @@ -12,9 +12,10 @@ static inline uint qt_intensity(uint r, uint g, uint b) * * https://code.woboq.org/qt5/qtbase/src/widgets/styles/qcommonstyle.cpp.html#6429 */ -QPixmap OBSProxyStyle::generatedIconPixmap(QIcon::Mode iconMode, - const QPixmap &pixmap, - const QStyleOption *option) const +QPixmap +OBSContextBarProxyStyle::generatedIconPixmap(QIcon::Mode iconMode, + const QPixmap &pixmap, + const QStyleOption *option) const { if (iconMode == QIcon::Disabled) { QImage im = @@ -75,3 +76,16 @@ QPixmap OBSProxyStyle::generatedIconPixmap(QIcon::Mode iconMode, return QProxyStyle::generatedIconPixmap(iconMode, pixmap, option); } + +int OBSIgnoreWheelProxyStyle::styleHint(StyleHint hint, + const QStyleOption *option, + const QWidget *widget, + QStyleHintReturn *returnData) const +{ +#if QT_VERSION >= QT_VERSION_CHECK(5, 10, 0) + if (hint == SH_ComboBox_AllowWheelScrolling) + return false; +#endif + + return QProxyStyle::styleHint(hint, option, widget, returnData); +} diff --git a/UI/obs-proxy-style.hpp b/UI/obs-proxy-style.hpp index 29ddd57ef..e3a74a26e 100644 --- a/UI/obs-proxy-style.hpp +++ b/UI/obs-proxy-style.hpp @@ -2,7 +2,14 @@ #include -class OBSProxyStyle : public QProxyStyle { +class OBSIgnoreWheelProxyStyle : public QProxyStyle { +public: + int styleHint(StyleHint hint, const QStyleOption *option, + const QWidget *widget, + QStyleHintReturn *returnData) const override; +}; + +class OBSContextBarProxyStyle : public OBSIgnoreWheelProxyStyle { public: QPixmap generatedIconPixmap(QIcon::Mode iconMode, const QPixmap &pixmap, const QStyleOption *option) const override; diff --git a/UI/window-basic-main.cpp b/UI/window-basic-main.cpp index 8b5f4588e..de668bb24 100644 --- a/UI/window-basic-main.cpp +++ b/UI/window-basic-main.cpp @@ -257,7 +257,7 @@ OBSBasic::OBSBasic(QWidget *parent) ui->setupUi(this); ui->previewDisabledWidget->setVisible(false); - ui->contextContainer->setStyle(new OBSProxyStyle); + ui->contextContainer->setStyle(new OBSContextBarProxyStyle); ui->broadcastButton->setVisible(false); startingDockLayout = saveState();