diff --git a/plugin-backlight/backlight.cpp b/plugin-backlight/backlight.cpp index 31247f7b1..ea1a7f318 100644 --- a/plugin-backlight/backlight.cpp +++ b/plugin-backlight/backlight.cpp @@ -25,7 +25,7 @@ * END_COMMON_COPYRIGHT_HEADER */ #include "backlight.h" -#include +#include LXQtBacklight::LXQtBacklight(const ILXQtPanelPluginStartupInfo &startupInfo): QObject(), @@ -35,6 +35,10 @@ LXQtBacklight::LXQtBacklight(const ILXQtPanelPluginStartupInfo &startupInfo): // use our own icon m_backlightButton->setIcon(QIcon::fromTheme(QStringLiteral("brightnesssettings"))); + // NOTE: Redirect (mouse) events to LXQtBacklight event filter + m_backlightButton->setMouseTracking(true); + m_backlightButton->installEventFilter(this); + connect(m_backlightButton, &QToolButton::clicked, this, &LXQtBacklight::showSlider); m_backlightSlider = nullptr; @@ -61,6 +65,25 @@ void LXQtBacklight::deleteSlider() //printf("Deleted\n"); } +bool LXQtBacklight::eventFilter(QObject *obj, QEvent *event) +{ + if (obj == m_backlightButton) { + if (event->type() == QEvent::Wheel) { + if(! m_backlightSlider) { + // NOTE: Workaround to prevent crash + // TODO: The event can probably be handled directly in the plugin + m_backlightSlider = new SliderDialog(m_backlightButton); + connect(m_backlightSlider, &SliderDialog::dialogClosed, this, &LXQtBacklight::deleteSlider); + } + auto ev = static_cast(event); + m_backlightSlider->handleWheelEvent(ev); + return true; + } + } + + return QObject::eventFilter(obj, event); +} + void LXQtBacklight::showSlider(bool) { if(! m_backlightSlider) { diff --git a/plugin-backlight/backlight.h b/plugin-backlight/backlight.h index c803a3e8f..2ea8e00a8 100644 --- a/plugin-backlight/backlight.h +++ b/plugin-backlight/backlight.h @@ -57,6 +57,9 @@ protected Q_SLOTS: void showSlider(bool); void deleteSlider(); +protected: + bool eventFilter(QObject* obj, QEvent* event) override; + private: QToolButton *m_backlightButton; SliderDialog *m_backlightSlider; diff --git a/plugin-backlight/sliderdialog.cpp b/plugin-backlight/sliderdialog.cpp index 41d28c5ec..440396f91 100644 --- a/plugin-backlight/sliderdialog.cpp +++ b/plugin-backlight/sliderdialog.cpp @@ -26,7 +26,7 @@ #include #include -#include +#include #include #include "sliderdialog.h" @@ -106,6 +106,18 @@ void SliderDialog::updateBacklight() m_slider->setValue( (m_backlight->getBacklight() * 100) / maxBacklight); } +void SliderDialog::handleWheelEvent(QWheelEvent *event) { + auto cur_pos = m_slider->sliderPosition(); + // auto cur_pos = m_backlight->getBacklight(); + auto delta = event->angleDelta().y() / QWheelEvent::DefaultDeltasPerStep; + auto step = delta * m_slider->singleStep(); + auto value = cur_pos + step; + qInfo().nospace() << "Handling backlight wheel event (set value: " << value << ")"; + // m_slider->setSliderPosition(m_slider->sliderPosition() + // + (event->angleDelta().y() / QWheelEvent::DefaultDeltasPerStep * m_slider->singleStep())); + m_slider->setValue(value); +} + void SliderDialog::downButtonClicked(bool) { m_slider->setValue(m_slider->value() - 1); diff --git a/plugin-backlight/sliderdialog.h b/plugin-backlight/sliderdialog.h index 641986364..d5eff8898 100644 --- a/plugin-backlight/sliderdialog.h +++ b/plugin-backlight/sliderdialog.h @@ -41,13 +41,14 @@ class SliderDialog: public QDialog public: SliderDialog(QWidget *parent); void updateBacklight(); + void handleWheelEvent(QWheelEvent* event); Q_SIGNALS: void dialogClosed(); protected: bool event(QEvent *event) override; - + private: QSlider *m_slider; QToolButton *m_upButton, *m_downButton;