From f1085b324eb27f9a4d2c2d67243a3ba015e34b22 Mon Sep 17 00:00:00 2001 From: Tasuku Suzuki Date: Fri, 13 Oct 2023 16:21:45 +0900 Subject: [PATCH] ProjectExplorer: Avoid accidental changes on spinbox via mouse scroll - Introduced an Utils::attachWheelBlocker() to disable mouse wheel events on the "Parallel Jobs" field. - This prevents unintentional modifications when users inadvertently scroll over the input. Change-Id: Iccb93305fbcf399cae683412078782b5ea9f4ad6 Reviewed-by: Reviewed-by: Jarek Kobus --- src/libs/utils/CMakeLists.txt | 1 + src/libs/utils/aspects.cpp | 3 +++ src/libs/utils/guiutils.cpp | 34 ++++++++++++++++++++++++ src/libs/utils/guiutils.h | 14 ++++++++++ src/plugins/help/generalsettingspage.cpp | 2 ++ 5 files changed, 54 insertions(+) create mode 100644 src/libs/utils/guiutils.cpp create mode 100644 src/libs/utils/guiutils.h diff --git a/src/libs/utils/CMakeLists.txt b/src/libs/utils/CMakeLists.txt index 6a890815d07..be022f6a838 100644 --- a/src/libs/utils/CMakeLists.txt +++ b/src/libs/utils/CMakeLists.txt @@ -69,6 +69,7 @@ add_qtc_library(Utils genericconstants.h globalfilechangeblocker.cpp globalfilechangeblocker.h guard.cpp guard.h + guiutils.cpp guiutils.h headerviewstretcher.cpp headerviewstretcher.h highlightingitemdelegate.cpp highlightingitemdelegate.h historycompleter.cpp historycompleter.h diff --git a/src/libs/utils/aspects.cpp b/src/libs/utils/aspects.cpp index b14a429ed92..f8923ce3ed1 100644 --- a/src/libs/utils/aspects.cpp +++ b/src/libs/utils/aspects.cpp @@ -7,6 +7,7 @@ #include "checkablemessagebox.h" #include "environment.h" #include "fancylineedit.h" +#include "guiutils.h" #include "iconbutton.h" #include "layoutbuilder.h" #include "passworddialog.h" @@ -2195,6 +2196,7 @@ 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() + attachWheelBlocker(d->m_spinBox); addLabeledItem(parent, d->m_spinBox); connect(d->m_spinBox.data(), &QSpinBox::valueChanged, this, &IntegerAspect::handleGuiChanged); @@ -2294,6 +2296,7 @@ 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()); + attachWheelBlocker(d->m_spinBox); bufferToGui(); // Must happen after setRange()! addLabeledItem(builder, d->m_spinBox); connect(d->m_spinBox.data(), &QDoubleSpinBox::valueChanged, diff --git a/src/libs/utils/guiutils.cpp b/src/libs/utils/guiutils.cpp new file mode 100644 index 00000000000..bfafff677f7 --- /dev/null +++ b/src/libs/utils/guiutils.cpp @@ -0,0 +1,34 @@ +// Copyright (C) 2023 Tasuku Suzuki +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0 + +#include "guiutils.h" + +#include +#include + +namespace Utils { + +namespace Internal { + +class WheelEventFilter : public QObject +{ +public: + bool eventFilter(QObject *watched, QEvent *event) override { + auto widget = qobject_cast(watched); + return event->type() == QEvent::Wheel + && widget + && widget->focusPolicy() != Qt::WheelFocus + && !widget->hasFocus(); + } +}; + +} // namespace Internal + +void QTCREATOR_UTILS_EXPORT attachWheelBlocker(QWidget *widget) +{ + static Internal::WheelEventFilter instance; + widget->installEventFilter(&instance); + widget->setFocusPolicy(Qt::StrongFocus); +} + +} // namespace Utils diff --git a/src/libs/utils/guiutils.h b/src/libs/utils/guiutils.h new file mode 100644 index 00000000000..d478c7d90db --- /dev/null +++ b/src/libs/utils/guiutils.h @@ -0,0 +1,14 @@ +// Copyright (C) 2023 Tasuku Suzuki +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0 + +#pragma once + +#include "utils_global.h" + +class QWidget; + +namespace Utils { + +void QTCREATOR_UTILS_EXPORT attachWheelBlocker(QWidget *widget); + +} // namespace Utils diff --git a/src/plugins/help/generalsettingspage.cpp b/src/plugins/help/generalsettingspage.cpp index ff1e7e82182..5f1731bb0c5 100644 --- a/src/plugins/help/generalsettingspage.cpp +++ b/src/plugins/help/generalsettingspage.cpp @@ -18,6 +18,7 @@ #include #include +#include #include #include @@ -105,6 +106,7 @@ GeneralSettingsPageWidget::GeneralSettingsPageWidget() zoomSpinBox->setSingleStep(10); zoomSpinBox->setValue(100); zoomSpinBox->setSuffix(Tr::tr("%")); + attachWheelBlocker(zoomSpinBox); antialiasCheckBox = new QCheckBox(Tr::tr("Antialias")); auto fontGroupBox = new QGroupBox(Tr::tr("Font"));