From e78aca737736dc68368430741d71aaa3bb98d9f8 Mon Sep 17 00:00:00 2001 From: AdenKoperczak Date: Sun, 18 May 2025 15:45:50 -0400 Subject: [PATCH] Disable modifying settings using the scroll wheel unless they are focused --- scwx-qt/scwx-qt.cmake | 6 + .../ui/modified_widgets/focused_combo_box.hpp | 23 ++++ .../focused_double_spin_box.hpp | 23 ++++ .../ui/modified_widgets/focused_spin_box.hpp | 23 ++++ .../qt/ui/settings/unit_settings_widget.cpp | 42 +++--- scwx-qt/source/scwx/qt/ui/settings_dialog.ui | 127 +++++++++++++++--- 6 files changed, 205 insertions(+), 39 deletions(-) create mode 100644 scwx-qt/source/scwx/qt/ui/modified_widgets/focused_combo_box.hpp create mode 100644 scwx-qt/source/scwx/qt/ui/modified_widgets/focused_double_spin_box.hpp create mode 100644 scwx-qt/source/scwx/qt/ui/modified_widgets/focused_spin_box.hpp diff --git a/scwx-qt/scwx-qt.cmake b/scwx-qt/scwx-qt.cmake index 0e8b2ef1..cd9abded 100644 --- a/scwx-qt/scwx-qt.cmake +++ b/scwx-qt/scwx-qt.cmake @@ -342,6 +342,10 @@ set(UI_UI source/scwx/qt/ui/about_dialog.ui source/scwx/qt/ui/serial_port_dialog.ui source/scwx/qt/ui/update_dialog.ui source/scwx/qt/ui/wfo_dialog.ui) +set(HDR_UI_MODIFIED_WIDGETS + source/scwx/qt/ui/modified_widgets/focused_combo_box.hpp + source/scwx/qt/ui/modified_widgets/focused_double_spin_box.hpp + source/scwx/qt/ui/modified_widgets/focused_spin_box.hpp) set(HDR_UI_SETTINGS source/scwx/qt/ui/settings/alert_palette_settings_widget.hpp source/scwx/qt/ui/settings/hotkey_settings_widget.hpp source/scwx/qt/ui/settings/settings_page_widget.hpp @@ -469,6 +473,7 @@ set(PROJECT_SOURCES ${HDR_MAIN} ${HDR_UI} ${SRC_UI} ${UI_UI} + ${HDR_UI_MODIFIED_WIDGETS} ${HDR_UI_SETTINGS} ${SRC_UI_SETTINGS} ${HDR_UI_SETUP} @@ -508,6 +513,7 @@ source_group("Header Files\\types" FILES ${HDR_TYPES}) source_group("Source Files\\types" FILES ${SRC_TYPES}) source_group("Header Files\\ui" FILES ${HDR_UI}) source_group("Source Files\\ui" FILES ${SRC_UI}) +source_group("Header Files\\ui\\modified_widgets" FILES ${HDR_UI_MODIFIED_WIDGETS}) source_group("Header Files\\ui\\settings" FILES ${HDR_UI_SETTINGS}) source_group("Source Files\\ui\\settings" FILES ${SRC_UI_SETTINGS}) source_group("Header Files\\ui\\setup" FILES ${HDR_UI_SETUP}) diff --git a/scwx-qt/source/scwx/qt/ui/modified_widgets/focused_combo_box.hpp b/scwx-qt/source/scwx/qt/ui/modified_widgets/focused_combo_box.hpp new file mode 100644 index 00000000..5c7d8f91 --- /dev/null +++ b/scwx-qt/source/scwx/qt/ui/modified_widgets/focused_combo_box.hpp @@ -0,0 +1,23 @@ +#include +#include + +class QFocusedComboBox : public QComboBox +{ + Q_OBJECT + +public: + using QComboBox::QComboBox; + +protected: + void wheelEvent(QWheelEvent* event) override + { + if (hasFocus()) + { + QComboBox::wheelEvent(event); + } + else + { + event->ignore(); + } + } +}; diff --git a/scwx-qt/source/scwx/qt/ui/modified_widgets/focused_double_spin_box.hpp b/scwx-qt/source/scwx/qt/ui/modified_widgets/focused_double_spin_box.hpp new file mode 100644 index 00000000..b18b3e89 --- /dev/null +++ b/scwx-qt/source/scwx/qt/ui/modified_widgets/focused_double_spin_box.hpp @@ -0,0 +1,23 @@ +#include +#include + +class QFocusedDoubleSpinBox : public QDoubleSpinBox +{ + Q_OBJECT + +public: + using QDoubleSpinBox::QDoubleSpinBox; + +protected: + void wheelEvent(QWheelEvent* event) override + { + if (hasFocus()) + { + QDoubleSpinBox::wheelEvent(event); + } + else + { + event->ignore(); + } + } +}; diff --git a/scwx-qt/source/scwx/qt/ui/modified_widgets/focused_spin_box.hpp b/scwx-qt/source/scwx/qt/ui/modified_widgets/focused_spin_box.hpp new file mode 100644 index 00000000..b83036b7 --- /dev/null +++ b/scwx-qt/source/scwx/qt/ui/modified_widgets/focused_spin_box.hpp @@ -0,0 +1,23 @@ +#include +#include + +class QFocusedSpinBox : public QSpinBox +{ + Q_OBJECT + +public: + using QSpinBox::QSpinBox; + +protected: + void wheelEvent(QWheelEvent* event) override + { + if (hasFocus()) + { + QSpinBox::wheelEvent(event); + } + else + { + event->ignore(); + } + } +}; diff --git a/scwx-qt/source/scwx/qt/ui/settings/unit_settings_widget.cpp b/scwx-qt/source/scwx/qt/ui/settings/unit_settings_widget.cpp index aff11583..83918696 100644 --- a/scwx-qt/source/scwx/qt/ui/settings/unit_settings_widget.cpp +++ b/scwx-qt/source/scwx/qt/ui/settings/unit_settings_widget.cpp @@ -2,21 +2,17 @@ #include #include #include +#include #include #include #include #include -#include #include #include #include -namespace scwx -{ -namespace qt -{ -namespace ui +namespace scwx::qt::ui { static const std::string logPrefix_ = @@ -51,7 +47,7 @@ public: [&row, &self, this]( settings::SettingsInterface& settingsInterface, const std::string& labelName, - QComboBox* comboBox) + QFocusedComboBox* comboBox) { QLabel* label = new QLabel(QObject::tr(labelName.c_str()), self); QToolButton* resetButton = new QToolButton(self); @@ -72,9 +68,12 @@ public: ++row; }; - QComboBox* accumulationComboBox = new QComboBox(self); + // Qt manages the memory for these widgets + // NOLINTBEGIN(cppcoreguidelines-owning-memory) + auto* accumulationComboBox = new QFocusedComboBox(self); accumulationComboBox->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Preferred); + accumulationComboBox->setFocusPolicy(Qt::StrongFocus); accumulationUnits_.SetSettingsVariable(unitSettings.accumulation_units()); SCWX_SETTINGS_COMBO_BOX(accumulationUnits_, accumulationComboBox, @@ -82,9 +81,10 @@ public: types::GetAccumulationUnitsName); AddRow(accumulationUnits_, "Accumulation", accumulationComboBox); - QComboBox* echoTopsComboBox = new QComboBox(self); + auto* echoTopsComboBox = new QFocusedComboBox(self); echoTopsComboBox->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Preferred); + echoTopsComboBox->setFocusPolicy(Qt::StrongFocus); echoTopsUnits_.SetSettingsVariable(unitSettings.echo_tops_units()); SCWX_SETTINGS_COMBO_BOX(echoTopsUnits_, echoTopsComboBox, @@ -92,9 +92,10 @@ public: types::GetEchoTopsUnitsName); AddRow(echoTopsUnits_, "Echo Tops", echoTopsComboBox); - QComboBox* speedComboBox = new QComboBox(self); + auto* speedComboBox = new QFocusedComboBox(self); speedComboBox->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Preferred); + speedComboBox->setFocusPolicy(Qt::StrongFocus); speedUnits_.SetSettingsVariable(unitSettings.speed_units()); SCWX_SETTINGS_COMBO_BOX(speedUnits_, speedComboBox, @@ -102,9 +103,10 @@ public: types::GetSpeedUnitsName); AddRow(speedUnits_, "Speed", speedComboBox); - QComboBox* distanceComboBox = new QComboBox(self); + auto* distanceComboBox = new QFocusedComboBox(self); distanceComboBox->setSizePolicy(QSizePolicy::Expanding, - QSizePolicy::Preferred); + QSizePolicy::Preferred); + distanceComboBox->setFocusPolicy(Qt::StrongFocus); distanceUnits_.SetSettingsVariable(unitSettings.distance_units()); SCWX_SETTINGS_COMBO_BOX(distanceUnits_, distanceComboBox, @@ -112,9 +114,10 @@ public: types::GetDistanceUnitsName); AddRow(distanceUnits_, "Distance", distanceComboBox); - QComboBox* otherComboBox = new QComboBox(self); + auto* otherComboBox = new QFocusedComboBox(self); otherComboBox->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Preferred); + otherComboBox->setFocusPolicy(Qt::StrongFocus); otherUnits_.SetSettingsVariable(unitSettings.other_units()); SCWX_SETTINGS_COMBO_BOX(otherUnits_, otherComboBox, @@ -122,12 +125,19 @@ public: types::GetOtherUnitsName); AddRow(otherUnits_, "Other", otherComboBox); - QSpacerItem* spacer = + auto* spacer = new QSpacerItem(0, 0, QSizePolicy::Minimum, QSizePolicy::Expanding); gridLayout_->addItem(spacer, row, 0); + + // NOLINTEND(cppcoreguidelines-owning-memory) } ~Impl() = default; + Impl(const Impl&) = delete; + Impl(Impl&&) = delete; + Impl& operator=(const Impl&) = delete; + Impl& operator=(Impl&&) = delete; + QWidget* contents_; QLayout* layout_; QScrollArea* scrollArea_ {}; @@ -147,6 +157,4 @@ UnitSettingsWidget::UnitSettingsWidget(QWidget* parent) : UnitSettingsWidget::~UnitSettingsWidget() = default; -} // namespace ui -} // namespace qt -} // namespace scwx +} // namespace scwx::qt::ui diff --git a/scwx-qt/source/scwx/qt/ui/settings_dialog.ui b/scwx-qt/source/scwx/qt/ui/settings_dialog.ui index 5b9b37fd..ca99c620 100644 --- a/scwx-qt/source/scwx/qt/ui/settings_dialog.ui +++ b/scwx-qt/source/scwx/qt/ui/settings_dialog.ui @@ -135,7 +135,7 @@ 0 - -412 + 0 511 873 @@ -160,13 +160,25 @@ 0 - + + + Qt::FocusPolicy::StrongFocus + + - + + + Qt::FocusPolicy::StrongFocus + + - + + + Qt::FocusPolicy::StrongFocus + + @@ -265,7 +277,11 @@ - + + + Qt::FocusPolicy::StrongFocus + + @@ -293,10 +309,18 @@ - + + + Qt::FocusPolicy::StrongFocus + + - + + + Qt::FocusPolicy::StrongFocus + + @@ -321,7 +345,10 @@ - + + + Qt::FocusPolicy::StrongFocus + 1 @@ -413,13 +440,21 @@ - + + + Qt::FocusPolicy::StrongFocus + + - + + + Qt::FocusPolicy::StrongFocus + + @@ -443,7 +478,11 @@ - + + + Qt::FocusPolicy::StrongFocus + + @@ -466,13 +505,16 @@ - + 0 0 + + Qt::FocusPolicy::StrongFocus + Set to 0 to disable @@ -623,7 +665,10 @@ - + + + Qt::FocusPolicy::StrongFocus + 1 @@ -765,8 +810,8 @@ 0 0 - 80 - 18 + 503 + 380 @@ -875,7 +920,10 @@ - + + + Qt::FocusPolicy::StrongFocus + 4 @@ -891,7 +939,10 @@ - + + + Qt::FocusPolicy::StrongFocus + Set to 0 to disable @@ -943,7 +994,10 @@ - + + + Qt::FocusPolicy::StrongFocus + 4 @@ -1040,16 +1094,23 @@ - + + + Qt::FocusPolicy::StrongFocus + + - + 0 0 + + Qt::FocusPolicy::StrongFocus + @@ -1360,7 +1421,10 @@ - + + + Qt::FocusPolicy::StrongFocus + 999 @@ -1385,7 +1449,11 @@ - + + + Qt::FocusPolicy::StrongFocus + + @@ -1446,6 +1514,21 @@ QLineEdit
scwx/qt/ui/api_key_edit_widget.hpp
+ + QFocusedDoubleSpinBox + QDoubleSpinBox +
scwx/qt/ui/modified_widgets/focused_double_spin_box.hpp
+
+ + QFocusedSpinBox + QSpinBox +
scwx/qt/ui/modified_widgets/focused_spin_box.hpp
+
+ + QFocusedComboBox + QComboBox +
scwx/qt/ui/modified_widgets/focused_combo_box.hpp
+