diff --git a/src/libs/utils/aspects.cpp b/src/libs/utils/aspects.cpp index e2300ecb731..9fde2da787b 100644 --- a/src/libs/utils/aspects.cpp +++ b/src/libs/utils/aspects.cpp @@ -7,7 +7,6 @@ #include "checkablemessagebox.h" #include "environment.h" #include "fancylineedit.h" -#include "guiutils.h" #include "iconbutton.h" #include "layoutbuilder.h" #include "passworddialog.h" @@ -23,7 +22,6 @@ #include #include #include -#include #include #include #include @@ -2343,7 +2341,6 @@ void IntegerAspect::addToLayout(Layouting::LayoutItem &parent) d->m_spinBox->setRange(int(d->m_minimumValue.value() / d->m_displayScaleFactor), int(d->m_maximumValue.value() / d->m_displayScaleFactor)); d->m_spinBox->setValue(int(value() / d->m_displayScaleFactor)); // Must happen after setRange() - setWheelScrollingWithoutFocusBlocked(d->m_spinBox); addLabeledItem(parent, d->m_spinBox); connect(d->m_spinBox.data(), &QSpinBox::valueChanged, this, &IntegerAspect::handleGuiChanged); @@ -2443,7 +2440,6 @@ void DoubleAspect::addToLayout(LayoutItem &builder) d->m_spinBox->setSpecialValueText(d->m_specialValueText); if (d->m_maximumValue && d->m_maximumValue) d->m_spinBox->setRange(d->m_minimumValue.value(), d->m_maximumValue.value()); - setWheelScrollingWithoutFocusBlocked(d->m_spinBox); bufferToGui(); // Must happen after setRange()! addLabeledItem(builder, d->m_spinBox); connect(d->m_spinBox.data(), &QDoubleSpinBox::valueChanged, @@ -3528,6 +3524,7 @@ void StringSelectionAspect::addToLayout(Layouting::LayoutItem &parent) comboBox->setSizePolicy(QSizePolicy::MinimumExpanding, QSizePolicy::Fixed); comboBox->setModel(m_model); + setWheelScrollingWithoutFocusBlocked(comboBox); connect(m_selectionModel, &QItemSelectionModel::currentChanged, diff --git a/src/libs/utils/aspects.h b/src/libs/utils/aspects.h index ffc2906d879..727861d2bc7 100644 --- a/src/libs/utils/aspects.h +++ b/src/libs/utils/aspects.h @@ -4,6 +4,7 @@ #pragma once #include "filepath.h" +#include "guiutils.h" #include "id.h" #include "infolabel.h" #include "macroexpander.h" @@ -15,6 +16,8 @@ #include #include +#include +#include #include QT_BEGIN_NAMESPACE @@ -245,6 +248,10 @@ protected: Widget *createSubWidget(Args && ...args) { auto w = new Widget(args...); registerSubWidget(w); + if constexpr (std::is_base_of_v + || std::is_base_of_v) { + setWheelScrollingWithoutFocusBlocked(w); + } return w; } diff --git a/src/libs/utils/guiutils.cpp b/src/libs/utils/guiutils.cpp index 6d3a790c5d1..35830f1ca41 100644 --- a/src/libs/utils/guiutils.cpp +++ b/src/libs/utils/guiutils.cpp @@ -31,6 +31,8 @@ public: void QTCREATOR_UTILS_EXPORT setWheelScrollingWithoutFocusBlocked(QWidget *widget) { static Internal::WheelEventFilter instance; + // Installing duplicated event filter for the same objects just brings the event filter + // to the front and is otherwise no-op (the second event filter isn't installed). widget->installEventFilter(&instance); if (widget->focusPolicy() == Qt::WheelFocus) widget->setFocusPolicy(Qt::StrongFocus); diff --git a/src/plugins/coreplugin/dialogs/settingsdialog.cpp b/src/plugins/coreplugin/dialogs/settingsdialog.cpp index 26f0a788574..6dfd9106eb5 100644 --- a/src/plugins/coreplugin/dialogs/settingsdialog.cpp +++ b/src/plugins/coreplugin/dialogs/settingsdialog.cpp @@ -10,13 +10,16 @@ #include #include +#include #include #include #include #include +#include #include #include +#include #include #include #include @@ -337,6 +340,14 @@ public: // ----------- SmartScrollArea +template +void setWheelScrollingWithoutFocusBlockedForChildren(QWidget *widget) +{ + const auto children = widget->findChildren(); + for (auto child : children) + setWheelScrollingWithoutFocusBlocked(child); +} + class SmartScrollArea : public QScrollArea { public: @@ -353,6 +364,8 @@ private: { if (!widget()) { if (QWidget *inner = m_page->widget()) { + setWheelScrollingWithoutFocusBlockedForChildren(inner); + setWheelScrollingWithoutFocusBlockedForChildren(inner); setWidget(inner); inner->setAutoFillBackground(false); } else { diff --git a/src/plugins/help/generalsettingspage.cpp b/src/plugins/help/generalsettingspage.cpp index 8f001f6311c..ff1e7e82182 100644 --- a/src/plugins/help/generalsettingspage.cpp +++ b/src/plugins/help/generalsettingspage.cpp @@ -18,7 +18,6 @@ #include #include -#include #include #include @@ -106,7 +105,6 @@ GeneralSettingsPageWidget::GeneralSettingsPageWidget() zoomSpinBox->setSingleStep(10); zoomSpinBox->setValue(100); zoomSpinBox->setSuffix(Tr::tr("%")); - setWheelScrollingWithoutFocusBlocked(zoomSpinBox); antialiasCheckBox = new QCheckBox(Tr::tr("Antialias")); auto fontGroupBox = new QGroupBox(Tr::tr("Font")); diff --git a/src/plugins/incredibuild/commandbuilderaspect.cpp b/src/plugins/incredibuild/commandbuilderaspect.cpp index ce499f28038..99c29cd2692 100644 --- a/src/plugins/incredibuild/commandbuilderaspect.cpp +++ b/src/plugins/incredibuild/commandbuilderaspect.cpp @@ -13,6 +13,7 @@ #include #include +#include #include #include @@ -122,6 +123,7 @@ void CommandBuilderAspect::addToLayout(Layouting::LayoutItem &parent) d->m_activeCommandBuilder = d->m_commandBuilders[idx]; updateGui(); }); + setWheelScrollingWithoutFocusBlocked(d->commandBuilder); } if (!d->makePathChooser) { diff --git a/src/plugins/projectexplorer/buildsettingspropertiespage.cpp b/src/plugins/projectexplorer/buildsettingspropertiespage.cpp index 8ef3b330a6c..e3c55681839 100644 --- a/src/plugins/projectexplorer/buildsettingspropertiespage.cpp +++ b/src/plugins/projectexplorer/buildsettingspropertiespage.cpp @@ -16,6 +16,7 @@ #include #include +#include #include #include #include @@ -66,6 +67,7 @@ BuildSettingsWidget::BuildSettingsWidget(Target *target) : m_buildConfigurationComboBox = new QComboBox(this); m_buildConfigurationComboBox->setSizeAdjustPolicy(QComboBox::AdjustToContents); m_buildConfigurationComboBox->setModel(m_target->buildConfigurationModel()); + setWheelScrollingWithoutFocusBlocked(m_buildConfigurationComboBox); hbox->addWidget(m_buildConfigurationComboBox); m_addButton = new QPushButton(this); diff --git a/src/plugins/projectexplorer/kitaspects.cpp b/src/plugins/projectexplorer/kitaspects.cpp index c0cc6d6c279..dc1388cbd8c 100644 --- a/src/plugins/projectexplorer/kitaspects.cpp +++ b/src/plugins/projectexplorer/kitaspects.cpp @@ -19,6 +19,7 @@ #include #include #include +#include #include #include #include @@ -215,6 +216,7 @@ public: auto cb = new QComboBox; cb->setSizePolicy(QSizePolicy::Ignored, cb->sizePolicy().verticalPolicy()); cb->setToolTip(factory->description()); + setWheelScrollingWithoutFocusBlocked(cb); m_languageComboboxMap.insert(l, cb); layout->addWidget(cb, row, 1); @@ -247,6 +249,7 @@ private: IDeviceConstPtr device = BuildDeviceKitAspect::device(kit()); const GuardLocker locker(m_ignoreChanges); + // TODO: Get rid of keys, iterate directly on hash. const QList keys = m_languageComboboxMap.keys(); for (const Id l : keys) { const Toolchains ltcList = ToolchainManager::toolchains(equal(&Toolchain::language, l)); diff --git a/src/plugins/projectexplorer/runsettingspropertiespage.cpp b/src/plugins/projectexplorer/runsettingspropertiespage.cpp index e842bf4639c..75980d8ccba 100644 --- a/src/plugins/projectexplorer/runsettingspropertiespage.cpp +++ b/src/plugins/projectexplorer/runsettingspropertiespage.cpp @@ -15,6 +15,7 @@ #include #include +#include #include #include #include @@ -41,6 +42,7 @@ RunSettingsWidget::RunSettingsWidget(Target *target) : Q_ASSERT(m_target); m_deployConfigurationCombo = new QComboBox(this); + Utils::setWheelScrollingWithoutFocusBlocked(m_deployConfigurationCombo); m_addDeployToolButton = new QPushButton(Tr::tr("Add"), this); m_removeDeployToolButton = new QPushButton(Tr::tr("Remove"), this); m_renameDeployButton = new QPushButton(Tr::tr("Rename..."), this); @@ -50,6 +52,7 @@ RunSettingsWidget::RunSettingsWidget(Target *target) : m_runConfigurationCombo = new QComboBox(this); m_runConfigurationCombo->setSizeAdjustPolicy(QComboBox::AdjustToContents); m_runConfigurationCombo->setMinimumContentsLength(15); + Utils::setWheelScrollingWithoutFocusBlocked(m_runConfigurationCombo); m_addRunToolButton = new QPushButton(Tr::tr("Add..."), this); m_removeRunToolButton = new QPushButton(Tr::tr("Remove"), this);