From e43a0ca76503a9bcfaec49fb647bb7d1276386d8 Mon Sep 17 00:00:00 2001 From: ronso0 Date: Mon, 17 Feb 2025 02:00:00 +0100 Subject: [PATCH] add WSettingsCheckBoxLabel to replace the click eventFilter --- CMakeLists.txt | 1 + src/controllers/legacycontrollersettings.cpp | 32 +++----------------- src/controllers/legacycontrollersettings.h | 11 ------- src/widget/wsettingscheckboxlabel.cpp | 17 +++++++++++ src/widget/wsettingscheckboxlabel.h | 24 +++++++++++++++ 5 files changed, 47 insertions(+), 38 deletions(-) create mode 100644 src/widget/wsettingscheckboxlabel.cpp create mode 100644 src/widget/wsettingscheckboxlabel.h diff --git a/CMakeLists.txt b/CMakeLists.txt index 058dfc276ee..b984ab8bd24 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1580,6 +1580,7 @@ add_library( src/widget/wscrollable.cpp src/widget/wsearchlineedit.cpp src/widget/wsearchrelatedtracksmenu.cpp + src/widget/wsettingscheckboxlabel.cpp src/widget/wsingletoncontainer.cpp src/widget/wsizeawarestack.cpp src/widget/wskincolor.cpp diff --git a/src/controllers/legacycontrollersettings.cpp b/src/controllers/legacycontrollersettings.cpp index ccb96b9844e..8b3a7ea6c6f 100644 --- a/src/controllers/legacycontrollersettings.cpp +++ b/src/controllers/legacycontrollersettings.cpp @@ -5,7 +5,6 @@ #include #include #include -#include #include #include #include @@ -18,6 +17,7 @@ #include "moc_legacycontrollersettings.cpp" #include "util/assert.h" #include "util/parented_ptr.h" +#include "widget/wsettingscheckboxlabel.h" namespace { @@ -163,18 +163,13 @@ QWidget* LegacyControllerBooleanSetting::buildInputWidget(QWidget* pParent) { }); // We want to format the checkbox label with html styles. This is not possible - // so we attach a separate QLabel and, in order to get a clickable label like - // with QCheckBox, we associate the label with the checkbox (buddy). - // When the label is clicked we toggle the checkbox in the function - // eventFilter() of helper class ToggleCheckboxEventFilter. - auto pLabelWidget = make_parented(pWidget); + // so we attach a separate label. In order to get a clickable label like + // with QCheckBox, we use a custom QLabel that toggles its buddy QCheckBox + // (on left-click, like QCheckBox) and sets focus on it. + auto pLabelWidget = make_parented(pWidget); pLabelWidget->setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Maximum); pLabelWidget->setText(label()); pLabelWidget->setBuddy(pCheckBox); - if (!m_pToggleCheckboxEventFilter) { - m_pToggleCheckboxEventFilter = make_parented(this); - } - pLabelWidget->installEventFilter(m_pToggleCheckboxEventFilter.get()); QBoxLayout* pLayout = new QHBoxLayout(); @@ -196,23 +191,6 @@ bool LegacyControllerBooleanSetting::match(const QDomElement& element) { Qt::CaseInsensitive) == 0; } -bool LegacyControllerBooleanSetting::ToggleCheckboxEventFilter::eventFilter( - QObject* pObj, QEvent* pEvent) { - // eventFilter was a method of LegacyControllerBooleanSetting, but this - // doesn't work, as LegacyControllerBooleanSetting is created from a - // different thread, and Qt cannot filter events for objects in a - // different thread. - - QLabel* pLabel = qobject_cast(pObj); - if (pLabel && pEvent->type() == QEvent::MouseButtonPress) { - QCheckBox* pCheckBox = qobject_cast(pLabel->buddy()); - if (pCheckBox) { - pCheckBox->toggle(); - } - } - return QObject::eventFilter(pObj, pEvent); -} - template ValueSerializer, Deserializer ValueDeserializer, diff --git a/src/controllers/legacycontrollersettings.h b/src/controllers/legacycontrollersettings.h index 2c7b7aaa81d..6cd7ca24848 100644 --- a/src/controllers/legacycontrollersettings.h +++ b/src/controllers/legacycontrollersettings.h @@ -214,17 +214,6 @@ class LegacyControllerBooleanSetting QWidget* buildInputWidget(QWidget* parent) override; - private: - class ToggleCheckboxEventFilter : public QObject { - public: - ToggleCheckboxEventFilter(QObject* pParent) - : QObject(pParent) { - } - bool eventFilter(QObject* pObj, QEvent* pEvent) override; - }; - - parented_ptr m_pToggleCheckboxEventFilter; - FRIEND_TEST(LegacyControllerMappingSettingsTest, booleanSettingEditing); }; diff --git a/src/widget/wsettingscheckboxlabel.cpp b/src/widget/wsettingscheckboxlabel.cpp new file mode 100644 index 00000000000..3481f1a9da5 --- /dev/null +++ b/src/widget/wsettingscheckboxlabel.cpp @@ -0,0 +1,17 @@ +#include "widget/wsettingscheckboxlabel.h" + +#include +#include + +#include "moc_wsettingscheckboxlabel.cpp" + +void WSettingsCheckBoxLabel::mousePressEvent(QMouseEvent* pEvent) { + if (pEvent->buttons().testFlag(Qt::LeftButton)) { + QCheckBox* pCB = qobject_cast(buddy()); + if (pCB) { + pCB->toggle(); + pCB->setFocus(Qt::MouseFocusReason); + } + } + QLabel::mousePressEvent(pEvent); +} diff --git a/src/widget/wsettingscheckboxlabel.h b/src/widget/wsettingscheckboxlabel.h new file mode 100644 index 00000000000..a1bb48db933 --- /dev/null +++ b/src/widget/wsettingscheckboxlabel.h @@ -0,0 +1,24 @@ +#pragma once + +#include + +/// This is a QLabel for use in controller settings. +/// It is expected to have a QCheckBox buddy assigned. If so, left-click on the +/// label will toggle the checkbox and set focus on it. +class WSettingsCheckBoxLabel : public QLabel { + Q_OBJECT + public: + explicit WSettingsCheckBoxLabel(QWidget* pParent = nullptr, + Qt::WindowFlags flags = Qt::WindowFlags()) + : QLabel(pParent, flags) { + + }; + explicit WSettingsCheckBoxLabel(const QString& text, + QWidget* pParent = nullptr, + Qt::WindowFlags flags = Qt::WindowFlags()) + : QLabel(text, pParent, flags) { + }; + + protected: + void mousePressEvent(QMouseEvent* pEvent) override; +};