From 4a1d18af6209db5795f53f736216b623ef5489ed Mon Sep 17 00:00:00 2001
From: Gabriel de Dietrich <gabriel.dedietrich@digia.com>
Date: Mon, 11 Mar 2013 12:57:06 +0100
Subject: [PATCH] Menu: Close menus on press when mouse is outside the popup

Change-Id: I1d76abcd1c306c6a6f0ce8dbffe980f95f6bf0ae
Reviewed-by: J-P Nurmi <jpnurmi@digia.com>
---
 src/controls/qtmenupopupwindow.cpp | 10 +++++++++-
 src/controls/qtmenupopupwindow_p.h |  1 +
 2 files changed, 10 insertions(+), 1 deletion(-)

diff --git a/src/controls/qtmenupopupwindow.cpp b/src/controls/qtmenupopupwindow.cpp
index 64fdd11f3..4e461c217 100644
--- a/src/controls/qtmenupopupwindow.cpp
+++ b/src/controls/qtmenupopupwindow.cpp
@@ -141,6 +141,13 @@ void QtMenuPopupWindow::mouseMoveEvent(QMouseEvent *e)
         forwardEventToTransientParent(e);
 }
 
+void QtMenuPopupWindow::mousePressEvent(QMouseEvent *e)
+{
+    QRect rect = QRect(QPoint(), size());
+    if (!rect.contains(e->pos()))
+        forwardEventToTransientParent(e);
+}
+
 void QtMenuPopupWindow::mouseReleaseEvent(QMouseEvent *e)
 {
     QRect rect = QRect(QPoint(), size());
@@ -159,7 +166,8 @@ void QtMenuPopupWindow::mouseReleaseEvent(QMouseEvent *e)
 void QtMenuPopupWindow::forwardEventToTransientParent(QMouseEvent *e)
 {
     if (!qobject_cast<QtMenuPopupWindow*>(transientParent())
-        && m_mouseMoved && e->type() == QEvent::MouseButtonRelease) {
+        && (m_mouseMoved && e->type() == QEvent::MouseButtonRelease
+            || e->type() == QEvent::MouseButtonPress)) {
         // Clicked outside any menu
         dismissMenu();
     } else if (transientParent()) {
diff --git a/src/controls/qtmenupopupwindow_p.h b/src/controls/qtmenupopupwindow_p.h
index fef203d39..8eccbfb59 100644
--- a/src/controls/qtmenupopupwindow_p.h
+++ b/src/controls/qtmenupopupwindow_p.h
@@ -68,6 +68,7 @@ Q_SIGNALS:
     void menuDismissed();
 
 protected:
+    void mousePressEvent(QMouseEvent *);
     void mouseReleaseEvent(QMouseEvent *);
     void mouseMoveEvent(QMouseEvent *);
 
-- 
GitLab