aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/quicktemplates2/qquickmenu.cpp1
-rw-r--r--tests/auto/menu/data/subMenus.qml6
-rw-r--r--tests/auto/menu/tst_menu.cpp35
3 files changed, 26 insertions, 16 deletions
diff --git a/src/quicktemplates2/qquickmenu.cpp b/src/quicktemplates2/qquickmenu.cpp
index 8639e504..d0f305a4 100644
--- a/src/quicktemplates2/qquickmenu.cpp
+++ b/src/quicktemplates2/qquickmenu.cpp
@@ -441,6 +441,7 @@ void QQuickMenuPrivate::openSubMenu(QQuickMenuItem *item, bool activate)
}
QQuickMenuPrivate *p = QQuickMenuPrivate::get(subMenu);
+ p->allowHorizontalFlip = cascade;
p->parentMenu = q;
if (activate)
p->setCurrentIndex(0);
diff --git a/tests/auto/menu/data/subMenus.qml b/tests/auto/menu/data/subMenus.qml
index 314e7fed..f44d211f 100644
--- a/tests/auto/menu/data/subMenus.qml
+++ b/tests/auto/menu/data/subMenus.qml
@@ -52,7 +52,7 @@ import QtQuick 2.9
import QtQuick.Controls 2.3
ApplicationWindow {
- width: 400
+ width: 600
height: 400
property alias mainMenu: mainMenu
@@ -62,19 +62,16 @@ ApplicationWindow {
Menu {
id: mainMenu
- width: 100
MenuItem { id: mainMenuItem1; text: "Main 1" }
Menu {
id: subMenu1
- width: 100
title: "Sub Menu 1"
MenuItem { id: subMenuItem1; text: "Sub 1" }
MenuItem { id: subMenuItem2; text: "Sub 2" }
Menu {
id: subSubMenu1
- width: 100
title: "Sub Sub Menu 1"
MenuItem { id: subSubMenuItem1; text: "Sub Sub 1" }
MenuItem { id: subSubMenuItem2; text: "Sub Sub 2" }
@@ -85,7 +82,6 @@ ApplicationWindow {
Menu {
id: subMenu2
- width: 100
title: "Sub Menu 2"
MenuItem { id: subMenuItem3; text: "Sub 3" }
MenuItem { id: subMenuItem4; text: "Sub 4" }
diff --git a/tests/auto/menu/tst_menu.cpp b/tests/auto/menu/tst_menu.cpp
index 79a459b8..a2975c84 100644
--- a/tests/auto/menu/tst_menu.cpp
+++ b/tests/auto/menu/tst_menu.cpp
@@ -913,24 +913,37 @@ void tst_menu::subMenuKeyboard()
void tst_menu::subMenuPosition_data()
{
QTest::addColumn<bool>("cascade");
+ QTest::addColumn<bool>("flip");
QTest::addColumn<bool>("mirrored");
QTest::addColumn<qreal>("overlap");
- QTest::newRow("cascading") << true << false << 0.0;
- QTest::newRow("cascading,overlap") << true << false << 10.0;
- QTest::newRow("cascading,mirrored") << true << true << 0.0;
- QTest::newRow("cascading,mirrored,overlap") << true << true << 10.0;
- QTest::newRow("non-cascading") << false << false << 0.0;
+ QTest::newRow("cascading") << true << false << false << 0.0;
+ QTest::newRow("cascading,flip") << true << true << false << 0.0;
+ QTest::newRow("cascading,overlap") << true << false << false << 10.0;
+ QTest::newRow("cascading,flip,overlap") << true << true << false << 10.0;
+ QTest::newRow("cascading,mirrored") << true << false << true << 0.0;
+ QTest::newRow("cascading,mirrored,flip") << true << true << true << 0.0;
+ QTest::newRow("cascading,mirrored,overlap") << true << false << true << 10.0;
+ QTest::newRow("cascading,mirrored,flip,overlap") << true << true << true << 10.0;
+ QTest::newRow("non-cascading") << false << false << false << 0.0;
}
void tst_menu::subMenuPosition()
{
QFETCH(bool, cascade);
+ QFETCH(bool, flip);
QFETCH(bool, mirrored);
QFETCH(qreal, overlap);
QQuickApplicationHelper helper(this, QLatin1String("subMenus.qml"));
QQuickApplicationWindow *window = helper.appWindow;
+
+ // the default size of the window fits three menus side by side.
+ // when testing flipping, we resize the window so that the first
+ // sub-menu fits, but the second doesn't
+ if (flip)
+ window->setWidth(window->width() - 200);
+
window->show();
QVERIFY(QTest::qWaitForWindowActive(window));
moveMouseAway(window);
@@ -966,10 +979,10 @@ void tst_menu::subMenuPosition()
subSubMenu1->setOverlap(overlap);
QCOMPARE(subSubMenu1->overlap(), overlap);
+ // choose the main menu position so that there's room for the
+ // sub-menus to cascade to the left when mirrored
if (mirrored)
- mainMenu->setPosition(QPointF(290, 10));
- else
- mainMenu->setPosition(QPointF(10, 10));
+ mainMenu->setX(window->width() - 200);
mainMenu->open();
QVERIFY(mainMenu->isVisible());
@@ -977,7 +990,7 @@ void tst_menu::subMenuPosition()
QVERIFY(!subMenu2->isVisible());
QVERIFY(!subSubMenu1->isVisible());
- // open the sub-menu
+ // open the sub-menu (never flips)
QQuickMenuItem *subMenu1Item = qobject_cast<QQuickMenuItem *>(mainMenu->itemAt(1));
QVERIFY(subMenu1Item);
QCOMPARE(subMenu1Item->subMenu(), subMenu1);
@@ -1002,7 +1015,7 @@ void tst_menu::subMenuPosition()
QCOMPARE(subMenu1->popupItem()->y(), mainMenu->popupItem()->y() + (mainMenu->height() - subMenu1->height()) / 2);
}
- // open the sub-sub-menu
+ // open the sub-sub-menu (can flip)
QQuickMenuItem *subSubMenu1Item = qobject_cast<QQuickMenuItem *>(subMenu1->itemAt(2));
QVERIFY(subSubMenu1Item);
QCOMPARE(subSubMenu1Item->subMenu(), subSubMenu1);
@@ -1016,7 +1029,7 @@ void tst_menu::subMenuPosition()
QCOMPARE(subSubMenu1->parentItem(), subSubMenu1Item);
// vertically aligned to the parent menu item
QCOMPARE(subSubMenu1->popupItem()->y(), subMenu1->popupItem()->y() + subSubMenu1Item->y() - subSubMenu1->topPadding());
- if (mirrored)
+ if (mirrored != flip)
QCOMPARE(subSubMenu1->popupItem()->x(), subMenu1->popupItem()->x() - subSubMenu1->width() + overlap); // on the left of the parent menu
else
QCOMPARE(subSubMenu1->popupItem()->x(), subMenu1->popupItem()->x() + subMenu1->width() - overlap); // on the right of the parent menu