summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorFriedemann Kleint <Friedemann.Kleint@digia.com>2012-12-11 13:47:26 +0100
committerThe Qt Project <gerrit-noreply@qt-project.org>2012-12-12 21:55:30 +0100
commitbf178c77dda1db56ae698c1d31a6e3f685f4830f (patch)
tree9bfe026bfd8b93c3dda4b10b8c006c2982597ad0
parent8e36b8de02548310570ea6b45a68801d0f035880 (diff)
QMenu: Do not set snapToMouse if a caused-widget exists.
When clicking at the bottom-right corner of a menu in a menu bar, it appears at the wrong position. Add test and stabilize RTL-tests by making sure the layout direction is cleared should they fail. Task-number: QTBUG-28031 Task-number: QTBUG-2596 Change-Id: Ibc5ae916388753908e9f3ee98e8859faaa0c8723 Reviewed-by: Olivier Goffart <ogoffart@woboq.com>
-rw-r--r--src/widgets/widgets/qmenu.cpp2
-rw-r--r--tests/auto/widgets/widgets/qmenubar/tst_qmenubar.cpp41
2 files changed, 38 insertions, 5 deletions
diff --git a/src/widgets/widgets/qmenu.cpp b/src/widgets/widgets/qmenu.cpp
index 4d431868ac..17f9ca7911 100644
--- a/src/widgets/widgets/qmenu.cpp
+++ b/src/widgets/widgets/qmenu.cpp
@@ -1856,7 +1856,7 @@ void QMenu::popup(const QPoint &p, QAction *atAction)
QPoint mouse = QCursor::pos();
d->mousePopupPos = mouse;
- const bool snapToMouse = (QRect(p.x() - 3, p.y() - 3, 6, 6).contains(mouse));
+ const bool snapToMouse = !d->causedPopup.widget && (QRect(p.x() - 3, p.y() - 3, 6, 6).contains(mouse));
const QSize menuSize(sizeHint());
if (adjustToDesktop) {
diff --git a/tests/auto/widgets/widgets/qmenubar/tst_qmenubar.cpp b/tests/auto/widgets/widgets/qmenubar/tst_qmenubar.cpp
index 2535e23ab8..3aefe26b1c 100644
--- a/tests/auto/widgets/widgets/qmenubar/tst_qmenubar.cpp
+++ b/tests/auto/widgets/widgets/qmenubar/tst_qmenubar.cpp
@@ -1016,6 +1016,25 @@ void tst_QMenuBar::check_shortcutPress()
}
#endif
+class LayoutDirectionSaver
+{
+ Q_DISABLE_COPY(LayoutDirectionSaver)
+public:
+ explicit LayoutDirectionSaver(Qt::LayoutDirection direction)
+ : m_oldDirection(qApp->layoutDirection())
+ {
+ qApp->setLayoutDirection(direction);
+ }
+
+ ~LayoutDirectionSaver()
+ {
+ qApp->setLayoutDirection(m_oldDirection);
+ }
+
+private:
+ const Qt::LayoutDirection m_oldDirection;
+};
+
// Qt/Mac,WinCE does not use the native popups/menubar
#if !defined(Q_OS_MAC) && !defined(Q_OS_WINCE)
void tst_QMenuBar::check_menuPosition()
@@ -1070,10 +1089,9 @@ void tst_QMenuBar::check_menuPosition()
menu.close();
}
- //in RTL, the menu should be stuck at the right of the action geometry
+ // QTBUG-2596: in RTL, the menu should be stuck at the right of the action geometry
{
- Qt::LayoutDirection dir = qApp->layoutDirection();
- qApp->setLayoutDirection(Qt::RightToLeft);
+ LayoutDirectionSaver directionSaver(Qt::RightToLeft);
menu.clear();
QObject::connect(&menu, SIGNAL(aboutToShow()), &menu, SLOT(addActions()));
QRect mbItemRect = mw->menuBar()->actionGeometry(menu_action);
@@ -1082,8 +1100,23 @@ void tst_QMenuBar::check_menuPosition()
QVERIFY(menu.isActiveWindow());
QCOMPARE(menu.geometry().right(), mbItemRect.right());
menu.close();
- qApp->setLayoutDirection(dir);
}
+
+# ifndef QTEST_NO_CURSOR
+ // QTBUG-28031: Click at bottom-right corner.
+ {
+ mw->move(400, 200);
+ LayoutDirectionSaver directionSaver(Qt::RightToLeft);
+ QMenuBar *mb = mw->menuBar();
+ const QPoint localPos = mb->actionGeometry(menu.menuAction()).bottomRight() - QPoint(1, 1);
+ const QPoint globalPos = mb->mapToGlobal(localPos);
+ QCursor::setPos(globalPos);
+ QTest::mouseClick(mb, Qt::LeftButton, 0, localPos);
+ QTRY_VERIFY(menu.isActiveWindow());
+ QCOMPARE(menu.geometry().right() - 1, globalPos.x());
+ menu.close();
+ }
+# endif // QTEST_NO_CURSOR
}
#endif