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.
master
gxalpha 2022-03-26 02:19:23 +01:00 committed by Jim
parent f2b049c0e7
commit e33b7d2dab
4 changed files with 28 additions and 5 deletions

View File

@ -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);

View File

@ -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);
}

View File

@ -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;

View File

@ -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();