diff options
author | Shawn Rutledge <shawn.rutledge@digia.com> | 2013-04-17 10:48:55 +0200 |
---|---|---|
committer | The Qt Project <gerrit-noreply@qt-project.org> | 2013-04-18 09:18:43 +0200 |
commit | 4c7881396edbb513b15f7f46af9553a3d7478dab (patch) | |
tree | b35241865e002d840309be514819f683f2c8195f | |
parent | 7c791171a15c9192f4b025a810dde11b7dae2e51 (diff) |
An RTL submenu should be right-aligned
Task-number: QTBUG-30595
Change-Id: Iac54cae70b5a2ac6be5a750279fb390bb158776a
Reviewed-by: Friedemann Kleint <Friedemann.Kleint@digia.com>
-rw-r--r-- | src/widgets/widgets/qmenu.cpp | 4 | ||||
-rw-r--r-- | tests/auto/widgets/widgets/qmenu/tst_qmenu.cpp | 36 |
2 files changed, 38 insertions, 2 deletions
diff --git a/src/widgets/widgets/qmenu.cpp b/src/widgets/widgets/qmenu.cpp index dfa906d2ea..6b02e7371f 100644 --- a/src/widgets/widgets/qmenu.cpp +++ b/src/widgets/widgets/qmenu.cpp @@ -1967,8 +1967,8 @@ void QMenu::popup(const QPoint &p, QAction *atAction) pos.setX(mouse.x() - size.width()); #ifndef QT_NO_MENUBAR - // if in a menubar, it should be right-aligned - if (qobject_cast<QMenuBar*>(d->causedPopup.widget)) + // if the menu is in a menubar or is a submenu, it should be right-aligned + if (qobject_cast<QMenuBar*>(d->causedPopup.widget) || qobject_cast<QMenu*>(d->causedPopup.widget)) pos.rx() -= size.width(); #endif //QT_NO_MENUBAR diff --git a/tests/auto/widgets/widgets/qmenu/tst_qmenu.cpp b/tests/auto/widgets/widgets/qmenu/tst_qmenu.cpp index e48316fd19..9fdb8de4b8 100644 --- a/tests/auto/widgets/widgets/qmenu/tst_qmenu.cpp +++ b/tests/auto/widgets/widgets/qmenu/tst_qmenu.cpp @@ -101,6 +101,7 @@ private slots: void pushButtonPopulateOnAboutToShow(); void QTBUG7907_submenus_autoselect(); void QTBUG7411_submenus_activate(); + void QTBUG30595_rtl_submenu(); void QTBUG20403_nested_popup_on_shortcut_trigger(); void QTBUG_10735_crashWithDialog(); protected slots: @@ -896,6 +897,41 @@ void tst_QMenu::QTBUG7411_submenus_activate() QTRY_VERIFY(sub1.isVisible()); } +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; +}; + +void tst_QMenu::QTBUG30595_rtl_submenu() +{ + LayoutDirectionSaver directionSaver(Qt::RightToLeft); + QMenu menu("Test Menu"); + QMenu sub("&sub"); + sub.addAction("bar"); + sub.setTitle("&sub"); + menu.addMenu(&sub); + menu.move(200, 20); + menu.show(); + QVERIFY(QTest::qWaitForWindowExposed(&menu)); + QTest::mouseClick(&menu, Qt::LeftButton, Qt::NoModifier, QPoint(5,5) ); + QTRY_VERIFY(sub.isVisible()); + QVERIFY(sub.pos().x() < menu.pos().x()); +} + void tst_QMenu::QTBUG20403_nested_popup_on_shortcut_trigger() { QMenu menu("Test Menu"); |