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);
     }
 }
 

Reply via email to