summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorShawn Rutledge <shawn.rutledge@digia.com>2013-04-17 10:48:55 +0200
committerThe Qt Project <gerrit-noreply@qt-project.org>2013-04-18 09:18:43 +0200
commit4c7881396edbb513b15f7f46af9553a3d7478dab (patch)
treeb35241865e002d840309be514819f683f2c8195f
parent7c791171a15c9192f4b025a810dde11b7dae2e51 (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.cpp4
-rw-r--r--tests/auto/widgets/widgets/qmenu/tst_qmenu.cpp36
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");