diff --git a/src/controls/Menu.qml b/src/controls/Menu.qml index 362fe03c71163367020fdf91cb59369bb856779b..9399f88935edab7d9094c2b48558a51e7c8f7040 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 36c111fd799eb9d9b3503d5bbe8fe6b3aa5d77e7..65cbe1fd2f0924d42b7987dbdef941692f8c8435 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 dcb15d22cfbb3f6bd48cec0b04348b68131eb24d..f690fa91924b2b7908c91af68c7bd4c504437050 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 6b11ef30364518d231ade8166157189508987c56..7d0441662b539edd19e0337d13d6e93c5e69f859 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")) }