vcl/inc/qt5/QtWidget.hxx |    3 +++
 vcl/qt5/QtWidget.cxx     |   28 ++++++++++++++++++++++++++++
 2 files changed, 31 insertions(+)

New commits:
commit dc886bc6de2c0061a840bea2426663c3be2ecd26
Author:     Jan-Marek Glogowski <[email protected]>
AuthorDate: Tue Apr 19 16:03:56 2022 +0200
Commit:     Jan-Marek Glogowski <[email protected]>
CommitDate: Wed Apr 20 19:37:41 2022 +0200

    tdf#140463 Qt handle mouse enter+leave events
    
    Currently just implemented for the QtWidget, but still as a static
    function, so it may be used for QtObject at some point too.
    
    But there is no (mouse) enter or leave event function in QWindow,
    so no way to handle these there. And since we can't modify the
    returned QWidget from QWidget::createWindowContainer, the only way
    would be to expand the static QtWidget::handleEvent used by
    QtObjectWindow::event ... if it's actually needed at some point.
    
    Change-Id: If9009e5dfca508acd1e702df1a17eb8ad7c29690
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/133190
    Tested-by: Jenkins
    Reviewed-by: Jan-Marek Glogowski <[email protected]>

diff --git a/vcl/inc/qt5/QtWidget.hxx b/vcl/inc/qt5/QtWidget.hxx
index 878c8b1229ce..2ebe83fcbae1 100644
--- a/vcl/inc/qt5/QtWidget.hxx
+++ b/vcl/inc/qt5/QtWidget.hxx
@@ -51,6 +51,7 @@ class QtWidget : public QWidget
     static void commitText(QtFrame&, const QString& aText);
     static bool handleKeyEvent(QtFrame&, const QWidget&, QKeyEvent*, const 
ButtonKeyState);
     static void handleMouseButtonEvent(const QtFrame&, const QMouseEvent*, 
const ButtonKeyState);
+    static void handleMouseEnterLeaveEvents(const QtFrame&, QEvent*);
     static void fillSalAbstractMouseEvent(const QtFrame& rFrame, const 
QInputEvent* pQEvent,
                                           const QPoint& rPos, Qt::MouseButtons 
eButtons, int nWidth,
                                           SalAbstractMouseEvent& aSalEvent);
@@ -75,6 +76,8 @@ class QtWidget : public QWidget
     virtual void wheelEvent(QWheelEvent*) override;
     virtual void closeEvent(QCloseEvent*) override;
     virtual void changeEvent(QEvent*) override;
+    virtual void leaveEvent(QEvent*) override;
+    virtual void enterEvent(QEvent*) override;
 
     void inputMethodEvent(QInputMethodEvent*) override;
     QVariant inputMethodQuery(Qt::InputMethodQuery) const override;
diff --git a/vcl/qt5/QtWidget.cxx b/vcl/qt5/QtWidget.cxx
index 33320c577f94..2ac27548ac6a 100644
--- a/vcl/qt5/QtWidget.cxx
+++ b/vcl/qt5/QtWidget.cxx
@@ -207,6 +207,34 @@ void QtWidget::mouseMoveEvent(QMouseEvent* pEvent)
     pEvent->accept();
 }
 
+void QtWidget::handleMouseEnterLeaveEvents(const QtFrame& rFrame, QEvent* 
pQEvent)
+{
+    const qreal fRatio = rFrame.devicePixelRatioF();
+    const QWidget* pWidget = rFrame.GetQWidget();
+    const Point aPos = toPoint(pWidget->mapFromGlobal(QCursor::pos()) * 
fRatio);
+
+    SalMouseEvent aEvent;
+    aEvent.mnX
+        = QGuiApplication::isLeftToRight() ? aPos.X() : round(pWidget->width() 
* fRatio) - aPos.X();
+    aEvent.mnY = aPos.Y();
+    aEvent.mnTime = 0;
+    aEvent.mnButton = 0;
+    aEvent.mnCode = GetKeyModCode(QGuiApplication::keyboardModifiers())
+                    | GetMouseModCode(QGuiApplication::mouseButtons());
+
+    SalEvent nEventType;
+    if (pQEvent->type() == QEvent::Enter)
+        nEventType = SalEvent::MouseMove;
+    else
+        nEventType = SalEvent::MouseLeave;
+    rFrame.CallCallback(nEventType, &aEvent);
+    pQEvent->accept();
+}
+
+void QtWidget::leaveEvent(QEvent* pEvent) { 
handleMouseEnterLeaveEvents(m_rFrame, pEvent); }
+
+void QtWidget::enterEvent(QEvent* pEvent) { 
handleMouseEnterLeaveEvents(m_rFrame, pEvent); }
+
 void QtWidget::wheelEvent(QWheelEvent* pEvent)
 {
     SalWheelMouseEvent aEvent;

Reply via email to