From 306b3f72d81c5bc801b02b83b3a511e00a6dce4d Mon Sep 17 00:00:00 2001 From: Jonas Kvinge Date: Mon, 19 Feb 2024 23:07:27 +0100 Subject: [PATCH] SettingsPage: Pass on scroll event to page If the settings widget does not have focus, pass the event to the page for scrolling down instead of changing the setting. Fixes #1380 --- src/settings/settingspage.cpp | 46 +++++++++++++++++++++++++++++++++++ src/settings/settingspage.h | 5 ++++ 2 files changed, 51 insertions(+) diff --git a/src/settings/settingspage.cpp b/src/settings/settingspage.cpp index 4220cc88..4507f6e7 100644 --- a/src/settings/settingspage.cpp +++ b/src/settings/settingspage.cpp @@ -23,6 +23,7 @@ #include #include #include +#include #include #include #include @@ -63,15 +64,26 @@ void SettingsPage::Init(QWidget *ui_widget) { radiobuttons_ << qMakePair(radiobutton, radiobutton->isChecked()); } else if (QComboBox *combobox = qobject_cast(w)) { + combobox->setFocusPolicy(Qt::StrongFocus); + combobox->installEventFilter(this); comboboxes_ << qMakePair(combobox, combobox->currentText()); } else if (QSpinBox *spinbox = qobject_cast(w)) { + spinbox->setFocusPolicy(Qt::StrongFocus); + spinbox->installEventFilter(this); spinboxes_ << qMakePair(spinbox, spinbox->value()); } + else if (QDoubleSpinBox *double_spinbox = qobject_cast(w)) { + double_spinbox->setFocusPolicy(Qt::StrongFocus); + double_spinbox->installEventFilter(this); + double_spinboxes_ << qMakePair(double_spinbox, double_spinbox->value()); + } else if (QLineEdit *lineedit = qobject_cast(w)) { lineedits_ << qMakePair(lineedit, lineedit->text()); } else if (QSlider *slider = qobject_cast(w)) { + slider->setFocusPolicy(Qt::StrongFocus); + slider->installEventFilter(this); sliders_ << qMakePair(slider, slider->value()); } } @@ -114,6 +126,11 @@ void SettingsPage::Apply() { changed_ = true; qLog(Info) << spinbox.first->objectName() << "is changed for" << windowTitle() << "settings."; } + for (QPair &double_spinbox : double_spinboxes_) { + if (double_spinbox.first->value() == double_spinbox.second) continue; + changed_ = true; + qLog(Info) << double_spinbox.first->objectName() << "is changed for" << windowTitle() << "settings."; + } for (QPair &lineedit : lineedits_) { if (lineedit.first->text() == lineedit.second) continue; changed_ = true; @@ -161,3 +178,32 @@ void SettingsPage::ComboBoxLoadFromSettingsByIndex(const QSettings &s, QComboBox } +bool SettingsPage::eventFilter(QObject *obj, QEvent *e) { + + if (e->type() == QEvent::Wheel) { + if (QComboBox *combobox = qobject_cast(obj)) { + if (!combobox->hasFocus()) { + return event(e); + } + } + else if (QSpinBox *spinbox = qobject_cast(obj)) { + if (!spinbox->hasFocus()) { + return event(e); + } + } + else if (QDoubleSpinBox *double_spinbox = qobject_cast(obj)) { + if (!double_spinbox->hasFocus()) { + return event(e); + } + } + else if (QSlider *slider = qobject_cast(obj)) { + if (!slider->hasFocus()) { + return event(e); + } + } + } + + return false; + +} + diff --git a/src/settings/settingspage.h b/src/settings/settingspage.h index aa6aea96..584bca6c 100644 --- a/src/settings/settingspage.h +++ b/src/settings/settingspage.h @@ -39,6 +39,7 @@ class QCheckBox; class QComboBox; class QRadioButton; class QSpinBox; +class QDoubleSpinBox; class QSlider; class QLineEdit; class QShowEvent; @@ -75,6 +76,9 @@ class SettingsPage : public QWidget { virtual void Save() = 0; virtual void Cancel() {} + protected: + bool eventFilter(QObject *obj, QEvent *e) override; + signals: void NotificationPreview(const OSDBase::Behaviour, const QString&, const QString&); @@ -86,6 +90,7 @@ class SettingsPage : public QWidget { QList> radiobuttons_; QList> comboboxes_; QList> spinboxes_; + QList> double_spinboxes_; QList> sliders_; QList> lineedits_; };