GuiUtils: Apply wheel blocker to more widgets

Attach it to configuration and aspect widgets.

Change-Id: Ifd649f6dbf8bbb1ce1cf7251ac46b7cfac9798e3
Reviewed-by: Eike Ziller <eike.ziller@qt.io>
This commit is contained in:
Jarek Kobus
2023-10-16 21:33:58 +02:00
parent c48c3110da
commit b49c40181a
9 changed files with 33 additions and 6 deletions

View File

@@ -7,7 +7,6 @@
#include "checkablemessagebox.h" #include "checkablemessagebox.h"
#include "environment.h" #include "environment.h"
#include "fancylineedit.h" #include "fancylineedit.h"
#include "guiutils.h"
#include "iconbutton.h" #include "iconbutton.h"
#include "layoutbuilder.h" #include "layoutbuilder.h"
#include "passworddialog.h" #include "passworddialog.h"
@@ -23,7 +22,6 @@
#include <QAction> #include <QAction>
#include <QButtonGroup> #include <QButtonGroup>
#include <QCheckBox> #include <QCheckBox>
#include <QComboBox>
#include <QCompleter> #include <QCompleter>
#include <QDebug> #include <QDebug>
#include <QGroupBox> #include <QGroupBox>
@@ -2343,7 +2341,6 @@ void IntegerAspect::addToLayout(Layouting::LayoutItem &parent)
d->m_spinBox->setRange(int(d->m_minimumValue.value() / d->m_displayScaleFactor), d->m_spinBox->setRange(int(d->m_minimumValue.value() / d->m_displayScaleFactor),
int(d->m_maximumValue.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() d->m_spinBox->setValue(int(value() / d->m_displayScaleFactor)); // Must happen after setRange()
setWheelScrollingWithoutFocusBlocked(d->m_spinBox);
addLabeledItem(parent, d->m_spinBox); addLabeledItem(parent, d->m_spinBox);
connect(d->m_spinBox.data(), &QSpinBox::valueChanged, connect(d->m_spinBox.data(), &QSpinBox::valueChanged,
this, &IntegerAspect::handleGuiChanged); this, &IntegerAspect::handleGuiChanged);
@@ -2443,7 +2440,6 @@ void DoubleAspect::addToLayout(LayoutItem &builder)
d->m_spinBox->setSpecialValueText(d->m_specialValueText); d->m_spinBox->setSpecialValueText(d->m_specialValueText);
if (d->m_maximumValue && d->m_maximumValue) if (d->m_maximumValue && d->m_maximumValue)
d->m_spinBox->setRange(d->m_minimumValue.value(), d->m_maximumValue.value()); d->m_spinBox->setRange(d->m_minimumValue.value(), d->m_maximumValue.value());
setWheelScrollingWithoutFocusBlocked(d->m_spinBox);
bufferToGui(); // Must happen after setRange()! bufferToGui(); // Must happen after setRange()!
addLabeledItem(builder, d->m_spinBox); addLabeledItem(builder, d->m_spinBox);
connect(d->m_spinBox.data(), &QDoubleSpinBox::valueChanged, connect(d->m_spinBox.data(), &QDoubleSpinBox::valueChanged,
@@ -3528,6 +3524,7 @@ void StringSelectionAspect::addToLayout(Layouting::LayoutItem &parent)
comboBox->setSizePolicy(QSizePolicy::MinimumExpanding, QSizePolicy::Fixed); comboBox->setSizePolicy(QSizePolicy::MinimumExpanding, QSizePolicy::Fixed);
comboBox->setModel(m_model); comboBox->setModel(m_model);
setWheelScrollingWithoutFocusBlocked(comboBox);
connect(m_selectionModel, connect(m_selectionModel,
&QItemSelectionModel::currentChanged, &QItemSelectionModel::currentChanged,

View File

@@ -4,6 +4,7 @@
#pragma once #pragma once
#include "filepath.h" #include "filepath.h"
#include "guiutils.h"
#include "id.h" #include "id.h"
#include "infolabel.h" #include "infolabel.h"
#include "macroexpander.h" #include "macroexpander.h"
@@ -15,6 +16,8 @@
#include <memory> #include <memory>
#include <optional> #include <optional>
#include <QAbstractSpinBox>
#include <QComboBox>
#include <QUndoCommand> #include <QUndoCommand>
QT_BEGIN_NAMESPACE QT_BEGIN_NAMESPACE
@@ -245,6 +248,10 @@ protected:
Widget *createSubWidget(Args && ...args) { Widget *createSubWidget(Args && ...args) {
auto w = new Widget(args...); auto w = new Widget(args...);
registerSubWidget(w); registerSubWidget(w);
if constexpr (std::is_base_of_v<QComboBox, Widget>
|| std::is_base_of_v<QAbstractSpinBox, Widget>) {
setWheelScrollingWithoutFocusBlocked(w);
}
return w; return w;
} }

View File

@@ -31,6 +31,8 @@ public:
void QTCREATOR_UTILS_EXPORT setWheelScrollingWithoutFocusBlocked(QWidget *widget) void QTCREATOR_UTILS_EXPORT setWheelScrollingWithoutFocusBlocked(QWidget *widget)
{ {
static Internal::WheelEventFilter instance; 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); widget->installEventFilter(&instance);
if (widget->focusPolicy() == Qt::WheelFocus) if (widget->focusPolicy() == Qt::WheelFocus)
widget->setFocusPolicy(Qt::StrongFocus); widget->setFocusPolicy(Qt::StrongFocus);

View File

@@ -10,13 +10,16 @@
#include <utils/algorithm.h> #include <utils/algorithm.h>
#include <utils/fancylineedit.h> #include <utils/fancylineedit.h>
#include <utils/guiutils.h>
#include <utils/hostosinfo.h> #include <utils/hostosinfo.h>
#include <utils/icon.h> #include <utils/icon.h>
#include <utils/qtcassert.h> #include <utils/qtcassert.h>
#include <utils/stylehelper.h> #include <utils/stylehelper.h>
#include <QAbstractSpinBox>
#include <QApplication> #include <QApplication>
#include <QCheckBox> #include <QCheckBox>
#include <QComboBox>
#include <QDialog> #include <QDialog>
#include <QDialogButtonBox> #include <QDialogButtonBox>
#include <QEventLoop> #include <QEventLoop>
@@ -337,6 +340,14 @@ public:
// ----------- SmartScrollArea // ----------- SmartScrollArea
template <typename T>
void setWheelScrollingWithoutFocusBlockedForChildren(QWidget *widget)
{
const auto children = widget->findChildren<T>();
for (auto child : children)
setWheelScrollingWithoutFocusBlocked(child);
}
class SmartScrollArea : public QScrollArea class SmartScrollArea : public QScrollArea
{ {
public: public:
@@ -353,6 +364,8 @@ private:
{ {
if (!widget()) { if (!widget()) {
if (QWidget *inner = m_page->widget()) { if (QWidget *inner = m_page->widget()) {
setWheelScrollingWithoutFocusBlockedForChildren<QComboBox *>(inner);
setWheelScrollingWithoutFocusBlockedForChildren<QAbstractSpinBox *>(inner);
setWidget(inner); setWidget(inner);
inner->setAutoFillBackground(false); inner->setAutoFillBackground(false);
} else { } else {

View File

@@ -18,7 +18,6 @@
#include <utils/algorithm.h> #include <utils/algorithm.h>
#include <utils/fileutils.h> #include <utils/fileutils.h>
#include <utils/guiutils.h>
#include <utils/layoutbuilder.h> #include <utils/layoutbuilder.h>
#include <QCheckBox> #include <QCheckBox>
@@ -106,7 +105,6 @@ GeneralSettingsPageWidget::GeneralSettingsPageWidget()
zoomSpinBox->setSingleStep(10); zoomSpinBox->setSingleStep(10);
zoomSpinBox->setValue(100); zoomSpinBox->setValue(100);
zoomSpinBox->setSuffix(Tr::tr("%")); zoomSpinBox->setSuffix(Tr::tr("%"));
setWheelScrollingWithoutFocusBlocked(zoomSpinBox);
antialiasCheckBox = new QCheckBox(Tr::tr("Antialias")); antialiasCheckBox = new QCheckBox(Tr::tr("Antialias"));
auto fontGroupBox = new QGroupBox(Tr::tr("Font")); auto fontGroupBox = new QGroupBox(Tr::tr("Font"));

View File

@@ -13,6 +13,7 @@
#include <projectexplorer/project.h> #include <projectexplorer/project.h>
#include <utils/environment.h> #include <utils/environment.h>
#include <utils/guiutils.h>
#include <utils/layoutbuilder.h> #include <utils/layoutbuilder.h>
#include <utils/pathchooser.h> #include <utils/pathchooser.h>
@@ -122,6 +123,7 @@ void CommandBuilderAspect::addToLayout(Layouting::LayoutItem &parent)
d->m_activeCommandBuilder = d->m_commandBuilders[idx]; d->m_activeCommandBuilder = d->m_commandBuilders[idx];
updateGui(); updateGui();
}); });
setWheelScrollingWithoutFocusBlocked(d->commandBuilder);
} }
if (!d->makePathChooser) { if (!d->makePathChooser) {

View File

@@ -16,6 +16,7 @@
#include <coreplugin/session.h> #include <coreplugin/session.h>
#include <utils/algorithm.h> #include <utils/algorithm.h>
#include <utils/guiutils.h>
#include <utils/qtcassert.h> #include <utils/qtcassert.h>
#include <utils/stringutils.h> #include <utils/stringutils.h>
#include <utils/stylehelper.h> #include <utils/stylehelper.h>
@@ -66,6 +67,7 @@ BuildSettingsWidget::BuildSettingsWidget(Target *target) :
m_buildConfigurationComboBox = new QComboBox(this); m_buildConfigurationComboBox = new QComboBox(this);
m_buildConfigurationComboBox->setSizeAdjustPolicy(QComboBox::AdjustToContents); m_buildConfigurationComboBox->setSizeAdjustPolicy(QComboBox::AdjustToContents);
m_buildConfigurationComboBox->setModel(m_target->buildConfigurationModel()); m_buildConfigurationComboBox->setModel(m_target->buildConfigurationModel());
setWheelScrollingWithoutFocusBlocked(m_buildConfigurationComboBox);
hbox->addWidget(m_buildConfigurationComboBox); hbox->addWidget(m_buildConfigurationComboBox);
m_addButton = new QPushButton(this); m_addButton = new QPushButton(this);

View File

@@ -19,6 +19,7 @@
#include <utils/environment.h> #include <utils/environment.h>
#include <utils/environmentdialog.h> #include <utils/environmentdialog.h>
#include <utils/guard.h> #include <utils/guard.h>
#include <utils/guiutils.h>
#include <utils/layoutbuilder.h> #include <utils/layoutbuilder.h>
#include <utils/macroexpander.h> #include <utils/macroexpander.h>
#include <utils/pathchooser.h> #include <utils/pathchooser.h>
@@ -215,6 +216,7 @@ public:
auto cb = new QComboBox; auto cb = new QComboBox;
cb->setSizePolicy(QSizePolicy::Ignored, cb->sizePolicy().verticalPolicy()); cb->setSizePolicy(QSizePolicy::Ignored, cb->sizePolicy().verticalPolicy());
cb->setToolTip(factory->description()); cb->setToolTip(factory->description());
setWheelScrollingWithoutFocusBlocked(cb);
m_languageComboboxMap.insert(l, cb); m_languageComboboxMap.insert(l, cb);
layout->addWidget(cb, row, 1); layout->addWidget(cb, row, 1);
@@ -247,6 +249,7 @@ private:
IDeviceConstPtr device = BuildDeviceKitAspect::device(kit()); IDeviceConstPtr device = BuildDeviceKitAspect::device(kit());
const GuardLocker locker(m_ignoreChanges); const GuardLocker locker(m_ignoreChanges);
// TODO: Get rid of keys, iterate directly on hash.
const QList<Id> keys = m_languageComboboxMap.keys(); const QList<Id> keys = m_languageComboboxMap.keys();
for (const Id l : keys) { for (const Id l : keys) {
const Toolchains ltcList = ToolchainManager::toolchains(equal(&Toolchain::language, l)); const Toolchains ltcList = ToolchainManager::toolchains(equal(&Toolchain::language, l));

View File

@@ -15,6 +15,7 @@
#include <coreplugin/session.h> #include <coreplugin/session.h>
#include <utils/algorithm.h> #include <utils/algorithm.h>
#include <utils/guiutils.h>
#include <utils/qtcassert.h> #include <utils/qtcassert.h>
#include <utils/stringutils.h> #include <utils/stringutils.h>
#include <utils/stylehelper.h> #include <utils/stylehelper.h>
@@ -41,6 +42,7 @@ RunSettingsWidget::RunSettingsWidget(Target *target) :
Q_ASSERT(m_target); Q_ASSERT(m_target);
m_deployConfigurationCombo = new QComboBox(this); m_deployConfigurationCombo = new QComboBox(this);
Utils::setWheelScrollingWithoutFocusBlocked(m_deployConfigurationCombo);
m_addDeployToolButton = new QPushButton(Tr::tr("Add"), this); m_addDeployToolButton = new QPushButton(Tr::tr("Add"), this);
m_removeDeployToolButton = new QPushButton(Tr::tr("Remove"), this); m_removeDeployToolButton = new QPushButton(Tr::tr("Remove"), this);
m_renameDeployButton = new QPushButton(Tr::tr("Rename..."), this); m_renameDeployButton = new QPushButton(Tr::tr("Rename..."), this);
@@ -50,6 +52,7 @@ RunSettingsWidget::RunSettingsWidget(Target *target) :
m_runConfigurationCombo = new QComboBox(this); m_runConfigurationCombo = new QComboBox(this);
m_runConfigurationCombo->setSizeAdjustPolicy(QComboBox::AdjustToContents); m_runConfigurationCombo->setSizeAdjustPolicy(QComboBox::AdjustToContents);
m_runConfigurationCombo->setMinimumContentsLength(15); m_runConfigurationCombo->setMinimumContentsLength(15);
Utils::setWheelScrollingWithoutFocusBlocked(m_runConfigurationCombo);
m_addRunToolButton = new QPushButton(Tr::tr("Add..."), this); m_addRunToolButton = new QPushButton(Tr::tr("Add..."), this);
m_removeRunToolButton = new QPushButton(Tr::tr("Remove"), this); m_removeRunToolButton = new QPushButton(Tr::tr("Remove"), this);