From a238a5ad5afabbae6682b0f376f4e39611108bdf Mon Sep 17 00:00:00 2001
From: Gabriel de Dietrich <gabriel.dedietrich@digia.com>
Date: Fri, 1 Mar 2013 21:07:44 +0100
Subject: [PATCH] MenuBar: Fix mouse interaction

Used the same pattern as earlier with Menu.

Change-Id: Id7a2d791516ba6d827e90c3b3e11f97dd326ccd5
Reviewed-by: J-P Nurmi <jpnurmi@digia.com>
---
 src/controls/Menu.qml               |  2 +-
 src/controls/MenuBar.qml            | 42 ++++++++++++++++-------------
 src/controls/qtmenupopupwindow.cpp  | 14 +++++-----
 src/styles/Desktop/MenuBarStyle.qml |  2 +-
 4 files changed, 32 insertions(+), 28 deletions(-)

diff --git a/src/controls/Menu.qml b/src/controls/Menu.qml
index 362fe03c7..9399f8893 100644
--- a/src/controls/Menu.qml
+++ b/src/controls/Menu.qml
@@ -219,7 +219,7 @@ MenuPrivate {
                     currentItem = column.childAt(pos.x, pos.y)
                     if (currentItem) {
                         root.__currentIndex = currentItem.menuItemIndex
-                        if (currentItem.hasSubmenu && !currentItem.menuItem.popupVisible)
+                        if (currentItem.hasSubmenu && !currentItem.menuItem.__popupVisible)
                             currentItem.showSubMenu(false)
                     } else {
                         root.__currentIndex = -1
diff --git a/src/controls/MenuBar.qml b/src/controls/MenuBar.qml
index 36c111fd7..65cbe1fd2 100644
--- a/src/controls/MenuBar.qml
+++ b/src/controls/MenuBar.qml
@@ -140,6 +140,27 @@ MenuBarPrivate {
             anchors.fill: parent
             hoverEnabled: true
 
+            onPositionChanged: updateCurrentItem(mouse)
+            onPressed: {
+                menuBarLoader.preselectMenuItem = false
+                menuBarLoader.openedMenuIndex = currentItem.menuItemIndex
+            }
+
+            property Item currentItem: null
+            function updateCurrentItem(mouse) {
+                var pos = mapToItem(row, mouse.x, mouse.y)
+                if (!currentItem || !currentItem.contains(Qt.point(pos.x - currentItem.x, pos.y - currentItem.y))) {
+                    var newCurrentItem = row.childAt(pos.x, pos.y)
+                    if (!newCurrentItem)
+                        return;
+                    currentItem = newCurrentItem
+                    if (menuBarLoader.openedMenuIndex !== -1) {
+                        menuBarLoader.preselectMenuItem = false
+                        menuBarLoader.openedMenuIndex = currentItem.menuItemIndex
+                    }
+                }
+            }
+
             Row {
                 id: row
 
@@ -150,27 +171,10 @@ MenuBarPrivate {
                         id: menuItemLoader
 
                         property var menuItem: modelData
-                        property bool selected: menuItem.__popupVisible || itemMouseArea.pressed || menuBarLoader.openedMenuIndex === index
+                        property bool selected: menuItem.__popupVisible || menuBarLoader.openedMenuIndex === index
 
                         sourceComponent: menuBarLoader.menuItemStyle
-
-                        MouseArea {
-                            id: itemMouseArea
-                            anchors.fill:parent
-                            hoverEnabled: true
-
-                            onClicked: {
-                                menuBarLoader.preselectMenuItem = false
-                                menuBarLoader.openedMenuIndex = index
-                            }
-                            onPositionChanged: {
-                                if ((pressed || menuMouseArea.pressed || menuBarLoader.openedMenuIndex !== -1)
-                                        && menuBarLoader.openedMenuIndex !== index) {
-                                    menuBarLoader.openedMenuIndex = index
-                                    menuBarLoader.preselectMenuItem = false
-                                }
-                            }
-                        }
+                        property int menuItemIndex: index
 
                         Connections {
                             target: menuBarLoader
diff --git a/src/controls/qtmenupopupwindow.cpp b/src/controls/qtmenupopupwindow.cpp
index dcb15d22c..f690fa919 100644
--- a/src/controls/qtmenupopupwindow.cpp
+++ b/src/controls/qtmenupopupwindow.cpp
@@ -134,14 +134,14 @@ void QtMenuPopupWindow::mouseReleaseEvent(QMouseEvent *e)
 
 void QtMenuPopupWindow::forwardEventToTransientParent(QMouseEvent *e)
 {
-    QWindow *parentMenuWindow = qobject_cast<QtMenuPopupWindow*>(transientParent());
-    if (!parentMenuWindow) {
-        if (m_mouseMoved && e->type() == QEvent::MouseButtonRelease)
-            dismissMenu();
-    } else {
-        QPoint parentPos = parentMenuWindow->mapFromGlobal(mapToGlobal(e->pos()));
+    if (!qobject_cast<QtMenuPopupWindow*>(transientParent())
+        && m_mouseMoved && e->type() == QEvent::MouseButtonRelease) {
+        // Clicked outside any menu
+        dismissMenu();
+    } else if (transientParent()) {
+        QPoint parentPos = transientParent()->mapFromGlobal(mapToGlobal(e->pos()));
         QMouseEvent pe = QMouseEvent(e->type(), parentPos, e->button(), e->buttons(), e->modifiers());
-        QGuiApplication::sendEvent(parentMenuWindow, &pe);
+        QGuiApplication::sendEvent(transientParent(), &pe);
     }
 }
 
diff --git a/src/styles/Desktop/MenuBarStyle.qml b/src/styles/Desktop/MenuBarStyle.qml
index 6b11ef303..7d0441662 100644
--- a/src/styles/Desktop/MenuBarStyle.qml
+++ b/src/styles/Desktop/MenuBarStyle.qml
@@ -47,7 +47,7 @@ import QtQuick.Controls.Private 1.0
 Style {
     property Component frame: StyleItem {
         elementType: "menubar"
-        width: control.width
+        width: control.__contentItem.width
         height: parent ? parent.contentHeight : 0
         //        + 2 * (pixelMetric("menuvmargin") + pixelMetric("menupanelwidth"))
     }
-- 
GitLab