diff --git a/ui/widgets/scroll_area.cpp b/ui/widgets/scroll_area.cpp index bb63b0c..1c1ed76 100644 --- a/ui/widgets/scroll_area.cpp +++ b/ui/widgets/scroll_area.cpp @@ -490,12 +490,21 @@ bool ScrollArea::eventFilter(QObject *obj, QEvent *e) { } bool ScrollArea::viewportEvent(QEvent *e) { - if (e->type() == QEvent::TouchBegin || e->type() == QEvent::TouchUpdate || e->type() == QEvent::TouchEnd || e->type() == QEvent::TouchCancel) { + const auto type = e->type(); + if (type == QEvent::TouchBegin + || type == QEvent::TouchUpdate + || type == QEvent::TouchEnd + || type == QEvent::TouchCancel) { QTouchEvent *ev = static_cast(e); if (_touchEnabled && ev->device()->type() == base::TouchDevice::TouchScreen) { touchEvent(ev); return true; } + } else if (type == QEvent::Wheel) { + if (_customWheelProcess + && _customWheelProcess(static_cast(e))) { + return true; + } } return QScrollArea::viewportEvent(e); } diff --git a/ui/widgets/scroll_area.h b/ui/widgets/scroll_area.h index 03692a6..8df7e30 100644 --- a/ui/widgets/scroll_area.h +++ b/ui/widgets/scroll_area.h @@ -172,6 +172,10 @@ public: void scrolled(); void innerResized(); + void setCustomWheelProcess(Fn)> process) { + _customWheelProcess = std::move(process); + } + [[nodiscard]] rpl::producer<> scrolls() const; [[nodiscard]] rpl::producer<> innerResizes() const; [[nodiscard]] rpl::producer<> geometryChanged() const; @@ -227,6 +231,7 @@ private: crl::time _touchTime = 0; base::Timer _touchScrollTimer; + Fn)> _customWheelProcess; bool _widgetAcceptsTouch = false; object_ptr _widget = { nullptr };