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 "environment.h"
#include "fancylineedit.h"
#include "guiutils.h"
#include "iconbutton.h"
#include "layoutbuilder.h"
#include "passworddialog.h"
@@ -23,7 +22,6 @@
#include <QAction>
#include <QButtonGroup>
#include <QCheckBox>
#include <QComboBox>
#include <QCompleter>
#include <QDebug>
#include <QGroupBox>
@@ -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,

View File

@@ -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 <memory>
#include <optional>
#include <QAbstractSpinBox>
#include <QComboBox>
#include <QUndoCommand>
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<QComboBox, Widget>
|| std::is_base_of_v<QAbstractSpinBox, Widget>) {
setWheelScrollingWithoutFocusBlocked(w);
}
return w;
}

View File

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

View File

@@ -10,13 +10,16 @@
#include <utils/algorithm.h>
#include <utils/fancylineedit.h>
#include <utils/guiutils.h>
#include <utils/hostosinfo.h>
#include <utils/icon.h>
#include <utils/qtcassert.h>
#include <utils/stylehelper.h>
#include <QAbstractSpinBox>
#include <QApplication>
#include <QCheckBox>
#include <QComboBox>
#include <QDialog>
#include <QDialogButtonBox>
#include <QEventLoop>
@@ -337,6 +340,14 @@ public:
// ----------- SmartScrollArea
template <typename T>
void setWheelScrollingWithoutFocusBlockedForChildren(QWidget *widget)
{
const auto children = widget->findChildren<T>();
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<QComboBox *>(inner);
setWheelScrollingWithoutFocusBlockedForChildren<QAbstractSpinBox *>(inner);
setWidget(inner);
inner->setAutoFillBackground(false);
} else {

View File

@@ -18,7 +18,6 @@
#include <utils/algorithm.h>
#include <utils/fileutils.h>
#include <utils/guiutils.h>
#include <utils/layoutbuilder.h>
#include <QCheckBox>
@@ -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"));

View File

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

View File

@@ -16,6 +16,7 @@
#include <coreplugin/session.h>
#include <utils/algorithm.h>
#include <utils/guiutils.h>
#include <utils/qtcassert.h>
#include <utils/stringutils.h>
#include <utils/stylehelper.h>
@@ -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);

View File

@@ -19,6 +19,7 @@
#include <utils/environment.h>
#include <utils/environmentdialog.h>
#include <utils/guard.h>
#include <utils/guiutils.h>
#include <utils/layoutbuilder.h>
#include <utils/macroexpander.h>
#include <utils/pathchooser.h>
@@ -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<Id> keys = m_languageComboboxMap.keys();
for (const Id l : keys) {
const Toolchains ltcList = ToolchainManager::toolchains(equal(&Toolchain::language, l));

View File

@@ -15,6 +15,7 @@
#include <coreplugin/session.h>
#include <utils/algorithm.h>
#include <utils/guiutils.h>
#include <utils/qtcassert.h>
#include <utils/stringutils.h>
#include <utils/stylehelper.h>
@@ -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);