vcl/inc/qt5/QtInstanceWidget.hxx | 2 ++ vcl/inc/qt5/QtTools.hxx | 4 ++++ vcl/qt5/QtInstanceDrawingArea.cxx | 2 +- vcl/qt5/QtInstanceWidget.cxx | 30 ++++++++++++++++++++++++++++++ vcl/qt5/QtInstanceWindow.cxx | 2 +- vcl/qt5/QtTools.cxx | 10 ++++++++++ 6 files changed, 48 insertions(+), 2 deletions(-)
New commits: commit 099feb494d23bd0addc162a15a5bb90ddc68c111 Author: Michael Weghorn <m.wegh...@posteo.de> AuthorDate: Fri Apr 11 15:58:16 2025 +0200 Commit: Michael Weghorn <m.wegh...@posteo.de> CommitDate: Fri Apr 11 19:45:02 2025 +0200 tdf#130857 qt weld: Forward mouse click/release events Set QtInstanceWidget as event filter for its QWidget and in QtInstanceWidget::eventFilter, handle (single and double) mouse click and mouse release events by converting the QMouseEvent to a corresponding vcl MouseEvent and calling weld::Widget::signal_mouse_press and weld::Widget::signal_mouse_release. In a WIP branch (also containing various other changes) for the "File" -> "Templates" -> "Manage Templates" dialog, this results in the correct template getting highlighted when clicking on it and opened when double-clicking on it in thumbnail mode. Change-Id: I507deb1ed4aa2ae39c5f2b14f8bcb1fc1069ccf3 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/184048 Tested-by: Jenkins Reviewed-by: Michael Weghorn <m.wegh...@posteo.de> diff --git a/vcl/inc/qt5/QtInstanceWidget.hxx b/vcl/inc/qt5/QtInstanceWidget.hxx index 38eb66b0bfb8..3ec744177c1f 100644 --- a/vcl/inc/qt5/QtInstanceWidget.hxx +++ b/vcl/inc/qt5/QtInstanceWidget.hxx @@ -173,6 +173,8 @@ public: virtual void draw(OutputDevice&, const Point&, const Size&) override; + virtual bool eventFilter(QObject* pObject, QEvent* pEvent) override; + static void setHelpId(QWidget& rWidget, const OUString& rHelpId); private Q_SLOTS: diff --git a/vcl/inc/qt5/QtTools.hxx b/vcl/inc/qt5/QtTools.hxx index 863356d66246..cf3bd7e952b1 100644 --- a/vcl/inc/qt5/QtTools.hxx +++ b/vcl/inc/qt5/QtTools.hxx @@ -26,6 +26,7 @@ #include <QtCore/QSize> #include <QtCore/QString> #include <QtGui/QImage> +#include <QtGui/QMouseEvent> #include <QtWidgets/QMessageBox> #include <rtl/string.hxx> @@ -33,6 +34,7 @@ #include <tools/color.hxx> #include <tools/gen.hxx> #include <vcl/bitmap/BitmapTypes.hxx> +#include <vcl/event.hxx> #include <vcl/vclenum.hxx> #include <com/sun/star/uno/Sequence.hxx> @@ -151,6 +153,8 @@ typedef std::unique_ptr<cairo_surface_t, CairoDeleter> UniqueCairoSurface; sal_uInt16 toVclKeyboardModifiers(Qt::KeyboardModifiers eKeyModifiers); sal_uInt16 toVclMouseButtons(Qt::MouseButtons eButtons); +MouseEvent toVclMouseEvent(QMouseEvent& rEvent); + QImage toQImage(const Image& rImage); QMessageBox::Icon vclMessageTypeToQtIcon(VclMessageType eType); diff --git a/vcl/qt5/QtInstanceWidget.cxx b/vcl/qt5/QtInstanceWidget.cxx index 66a23f13036c..f228ec504917 100644 --- a/vcl/qt5/QtInstanceWidget.cxx +++ b/vcl/qt5/QtInstanceWidget.cxx @@ -12,9 +12,12 @@ #include <QtInstanceContainer.hxx> +#include <vcl/event.hxx> #include <vcl/transfer.hxx> #include <vcl/qt/QtUtils.hxx> +#include <QtGui/QMouseEvent> + /** Name of QObject property used for the help ID. */ const char* const PROPERTY_HELP_ID = "help-id"; @@ -24,6 +27,7 @@ QtInstanceWidget::QtInstanceWidget(QWidget* pWidget) assert(pWidget); connect(qApp, &QApplication::focusChanged, this, &QtInstanceWidget::applicationFocusChanged); + pWidget->installEventFilter(this); } void QtInstanceWidget::set_sensitive(bool bSensitive) @@ -245,6 +249,32 @@ OUString QtInstanceWidget::get_buildable_name() const { return OUString(); } void QtInstanceWidget::set_buildable_name(const OUString&) {} +bool QtInstanceWidget::eventFilter(QObject* pObject, QEvent* pEvent) +{ + SolarMutexGuard g; + assert(GetQtInstance().IsMainThread()); + + if (pObject != getQWidget()) + return false; + + switch (pEvent->type()) + { + case QEvent::MouseButtonDblClick: + case QEvent::MouseButtonPress: + { + QMouseEvent* pMouseEvent = static_cast<QMouseEvent*>(pEvent); + return signal_mouse_press(toVclMouseEvent(*pMouseEvent)); + } + case QEvent::MouseButtonRelease: + { + QMouseEvent* pMouseEvent = static_cast<QMouseEvent*>(pEvent); + return signal_mouse_release(toVclMouseEvent(*pMouseEvent)); + } + default: + return QObject::eventFilter(pObject, pEvent); + } +} + void QtInstanceWidget::setHelpId(QWidget& rWidget, const OUString& rHelpId) { SolarMutexGuard g; diff --git a/vcl/qt5/QtTools.cxx b/vcl/qt5/QtTools.cxx index dc7c3d69b8c7..51517bd1aca5 100644 --- a/vcl/qt5/QtTools.cxx +++ b/vcl/qt5/QtTools.cxx @@ -59,6 +59,16 @@ sal_uInt16 toVclMouseButtons(Qt::MouseButtons eButtons) return nCode; } +MouseEvent toVclMouseEvent(QMouseEvent& rEvent) +{ + const Point aPos = toPoint(rEvent.pos()); + const sal_uInt16 nClicks = rEvent.type() == QMouseEvent::MouseButtonDblClick ? 2 : 1; + const sal_uInt16 nButtons = toVclMouseButtons(rEvent.buttons()); + const sal_uInt16 nModifiers = toVclKeyboardModifiers(rEvent.modifiers()); + + return MouseEvent(aPos, nClicks, MouseEventModifiers::NONE, nButtons, nModifiers); +} + Qt::DropActions toQtDropActions(sal_Int8 dragOperation) { Qt::DropActions eRet = Qt::IgnoreAction; commit b22229d473e435d33ff6b59ac8c72213d1c53df9 Author: Michael Weghorn <m.wegh...@posteo.de> AuthorDate: Fri Apr 11 15:44:49 2025 +0200 Commit: Michael Weghorn <m.wegh...@posteo.de> CommitDate: Fri Apr 11 19:44:55 2025 +0200 tdf#130857 qt weld: Call base class eventFilter() If the QObject::eventFilter override doesn't handle the event itself, call the base class implementation. This will in particular be relevant once QtInstanceWidget will handle events like mouse clicks. Change-Id: I8055f049cf0244103e55fe4d5c042666d270a3e3 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/184047 Tested-by: Jenkins Reviewed-by: Michael Weghorn <m.wegh...@posteo.de> diff --git a/vcl/qt5/QtInstanceDrawingArea.cxx b/vcl/qt5/QtInstanceDrawingArea.cxx index a68d2b906d53..4610f554a18c 100644 --- a/vcl/qt5/QtInstanceDrawingArea.cxx +++ b/vcl/qt5/QtInstanceDrawingArea.cxx @@ -103,7 +103,7 @@ bool QtInstanceDrawingArea::eventFilter(QObject* pObject, QEvent* pEvent) handleResizeEvent(); return false; default: - return false; + return QtInstanceWidget::eventFilter(pObject, pEvent); } } diff --git a/vcl/qt5/QtInstanceWindow.cxx b/vcl/qt5/QtInstanceWindow.cxx index b90aed35fbfc..0ed98b364318 100644 --- a/vcl/qt5/QtInstanceWindow.cxx +++ b/vcl/qt5/QtInstanceWindow.cxx @@ -228,7 +228,7 @@ bool QtInstanceWindow::eventFilter(QObject* pObject, QEvent* pEvent) signal_container_focus_changed(); return false; default: - return false; + return QtInstanceContainer::eventFilter(pObject, pEvent); } }