浏览代码

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.
gxalpha 3 年之前
父节点
当前提交
e33b7d2dab
共有 4 个文件被更改,包括 28 次插入5 次删除
  1. 2 0
      UI/obs-app.cpp
  2. 17 3
      UI/obs-proxy-style.cpp
  3. 8 1
      UI/obs-proxy-style.hpp
  4. 1 1
      UI/window-basic-main.cpp

+ 2 - 0
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);

+ 17 - 3
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);
+}

+ 8 - 1
UI/obs-proxy-style.hpp

@@ -2,7 +2,14 @@
 
 #include <QProxyStyle>
 
-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;

+ 1 - 1
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();