diff --git a/src/EventFilterInterface.h b/src/EventFilterInterface.h index 513e489e..4299fee6 100644 --- a/src/EventFilterInterface.h +++ b/src/EventFilterInterface.h @@ -54,6 +54,14 @@ public: { return false; } + + /// @brief Provided for convenience, aggregates all other overloads + /// receives all mouse event types, if you return true here then the specialized counterparts won't be called + /// Example, if true is returned here for a mouse press, then onMouseButtonPress() won't be called + virtual bool onMouseEvent(View *, QMouseEvent *) + { + return false; + } }; } diff --git a/src/private/WidgetResizeHandler.cpp b/src/private/WidgetResizeHandler.cpp index ac4575be..034cfc0a 100644 --- a/src/private/WidgetResizeHandler.cpp +++ b/src/private/WidgetResizeHandler.cpp @@ -214,21 +214,6 @@ bool WidgetResizeHandler::onMouseEvent(View *widget, QMouseEvent *e) return false; } -bool WidgetResizeHandler::onMouseButtonPress(View *view, QMouseEvent *ev) -{ - return onMouseEvent(view, ev); -} - -bool WidgetResizeHandler::onMouseButtonRelease(View *view, QMouseEvent *ev) -{ - return onMouseEvent(view, ev); -} - -bool WidgetResizeHandler::onMouseButtonMove(View *view, QMouseEvent *ev) -{ - return onMouseEvent(view, ev); -} - bool WidgetResizeHandler::mouseMoveEvent(QMouseEvent *e) { const QPoint globalPos = Qt5Qt6Compat::eventGlobalPos(e); diff --git a/src/private/WidgetResizeHandler_p.h b/src/private/WidgetResizeHandler_p.h index 304832d8..2fbe5837 100644 --- a/src/private/WidgetResizeHandler_p.h +++ b/src/private/WidgetResizeHandler_p.h @@ -38,7 +38,8 @@ class DOCKS_EXPORT WidgetResizeHandler : public QObject, public EventFilterInter { Q_OBJECT public: - enum Feature { + enum Feature + { Feature_None = 0, Feature_NativeShadow = 1, Feature_NativeResize = 2, @@ -143,11 +144,7 @@ public: private: // EventFilterInterface: - bool onMouseButtonPress(View *, QMouseEvent *) override; - bool onMouseButtonRelease(View *, QMouseEvent *) override; - bool onMouseButtonMove(View *, QMouseEvent *) override; - - bool onMouseEvent(View *, QMouseEvent *e); + bool onMouseEvent(View *, QMouseEvent *) override; void setTarget(View *w); bool mouseMoveEvent(QMouseEvent *e); void updateCursor(CursorPosition m); diff --git a/src/qtcommon/Platform_qt.cpp b/src/qtcommon/Platform_qt.cpp index 976642fb..fa92769d 100644 --- a/src/qtcommon/Platform_qt.cpp +++ b/src/qtcommon/Platform_qt.cpp @@ -163,9 +163,13 @@ public: for (EventFilterInterface *filter : filters) { + // Filter might have been deleted meanwhile if (std::find(q->d->m_globalEventFilters.cbegin(), q->d->m_globalEventFilters.cend(), filter) == q->d->m_globalEventFilters.cend()) continue; + if (filter->onMouseEvent(view.get(), ev)) + return true; + switch (ev->type()) { case QEvent::MouseButtonPress: if (filter->onMouseButtonPress(view.get(), ev)) @@ -450,4 +454,4 @@ Platform::DisplayType Platform_qt::displayType() const bool Platform_qt::isLeftMouseButtonPressed() const { return qGuiApp->mouseButtons() & Qt::LeftButton; -} \ No newline at end of file +} diff --git a/src/qtcommon/View_qt.cpp b/src/qtcommon/View_qt.cpp index 1895a0eb..7681bf78 100644 --- a/src/qtcommon/View_qt.cpp +++ b/src/qtcommon/View_qt.cpp @@ -38,6 +38,10 @@ public: bool handleMouseEvent(QMouseEvent *ev) { for (EventFilterInterface *filter : qAsConst(q->d->m_viewEventFilters)) { + + if (filter->onMouseEvent(q, ev)) + return true; + switch (ev->type()) { case QEvent::MouseButtonPress: if (filter->onMouseButtonPress(q, ev))