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