From d5cb26bc56a3b6f6e99c88654d4f7a65f43551ac Mon Sep 17 00:00:00 2001 From: Mitch Curtis Date: Tue, 10 Apr 2018 17:40:07 +0200 Subject: Menu: ensure the correct delegates are used when created via Component Don't add items until we're complete, as the delegate could change in the meantime. Instead, add them to contentData and create them when we're complete. Task-number: QTBUG-67559 Change-Id: I5f42129f49de861ff5f15d0069daeda0b4e5017c Reviewed-by: Frederik Gladhorn --- tests/auto/qquickmenu/tst_qquickmenu.cpp | 98 ++++++++++++++++++++++++++++++++ 1 file changed, 98 insertions(+) (limited to 'tests/auto/qquickmenu/tst_qquickmenu.cpp') diff --git a/tests/auto/qquickmenu/tst_qquickmenu.cpp b/tests/auto/qquickmenu/tst_qquickmenu.cpp index 5a676c03..adb3d7aa 100644 --- a/tests/auto/qquickmenu/tst_qquickmenu.cpp +++ b/tests/auto/qquickmenu/tst_qquickmenu.cpp @@ -43,6 +43,8 @@ #include #include #include +#include +#include "../shared/menuutil.h" #include "../shared/util.h" #include "../shared/visualtestutil.h" @@ -86,6 +88,7 @@ private slots: void addRemoveSubMenus(); void scrollable_data(); void scrollable(); + void delegateFromSeparateComponent(); }; void tst_QQuickMenu::defaults() @@ -145,6 +148,7 @@ void tst_QQuickMenu::mouse() menu->open(); QVERIFY(menu->isVisible()); QVERIFY(window->overlay()->childItems().contains(menu->contentItem()->parentItem())); + waitForMenuListViewPolish(menu); QQuickItem *firstItem = menu->itemAt(0); QSignalSpy clickedSpy(firstItem, SIGNAL(clicked())); @@ -268,6 +272,8 @@ void tst_QQuickMenu::contextMenuKeyboard() QCOMPARE(visibleSpy.count(), 1); QVERIFY(menu->isVisible()); QVERIFY(window->overlay()->childItems().contains(menu->contentItem()->parentItem())); + waitForMenuListViewPolish(menu); + QVERIFY(!firstItem->hasActiveFocus()); QVERIFY(!firstItem->property("highlighted").toBool()); QCOMPARE(menu->currentIndex(), -1); @@ -934,6 +940,7 @@ void tst_QQuickMenu::subMenuMouse() QVERIFY(!subMenu1->isVisible()); QVERIFY(!subMenu2->isVisible()); QVERIFY(!subSubMenu1->isVisible()); + waitForMenuListViewPolish(mainMenu); // open the sub-menu with mouse click QQuickMenuItem *subMenu1Item = qobject_cast(mainMenu->itemAt(1)); @@ -944,6 +951,7 @@ void tst_QQuickMenu::subMenuMouse() QVERIFY(subMenu1->isVisible()); QVERIFY(!subMenu2->isVisible()); QVERIFY(!subSubMenu1->isVisible()); + waitForMenuListViewPolish(subMenu1); // open the cascading sub-sub-menu with mouse hover QQuickMenuItem *subSubMenu1Item = qobject_cast(subMenu1->itemAt(2)); @@ -954,6 +962,7 @@ void tst_QQuickMenu::subMenuMouse() QVERIFY(subMenu1->isVisible()); QVERIFY(!subMenu2->isVisible()); QVERIFY(!subSubMenu1->isVisible()); + QVERIFY(subSubMenu1Item->isHovered()); if (cascade) QTRY_VERIFY(subSubMenu1->isVisible()); @@ -973,6 +982,7 @@ void tst_QQuickMenu::subMenuMouse() QVERIFY(subMenu1->isVisible()); QVERIFY(!subMenu2->isVisible()); QVERIFY(!subSubMenu1->isVisible()); + QVERIFY(subSubMenu1Item->isHovered()); if (cascade) QTRY_VERIFY(subSubMenu1->isVisible()); @@ -1199,6 +1209,7 @@ void tst_QQuickMenu::subMenuPosition() QVERIFY(!subMenu1->isVisible()); QVERIFY(!subMenu2->isVisible()); QVERIFY(!subSubMenu1->isVisible()); + waitForMenuListViewPolish(mainMenu); // open the sub-menu (never flips) QQuickMenuItem *subMenu1Item = qobject_cast(mainMenu->itemAt(1)); @@ -1333,9 +1344,96 @@ void tst_QQuickMenu::scrollable() QVERIFY(menu->isVisible()); QQuickItem *contentItem = menu->contentItem(); + // Can only be scrollable if it exceeds the height of the window. + QTRY_VERIFY(contentItem->property("contentHeight").toReal() > window->height()); QCOMPARE(contentItem->property("interactive").toBool(), true); } +// QTBUG-67559 +// Test that Actions and MenuItems declared as children of a Menu have the +// correct delegate when it is declared outside of the Menu as a Component. +void tst_QQuickMenu::delegateFromSeparateComponent() +{ + QQuickApplicationHelper helper(this, QLatin1String("delegateFromSeparateComponent.qml")); + QQuickWindow *window = helper.window; + window->show(); + QVERIFY(QTest::qWaitForWindowActive(window)); + + const QColor green = QColor::fromRgb(0x00ff00); + + QQuickMenu *menu = window->property("menu").value(); + QVERIFY(menu); + + // "Action Item 1" + QQuickMenuItem *actionItem1 = qobject_cast(menu->itemAt(0)); + QVERIFY(actionItem1); + QCOMPARE(actionItem1->text(), QLatin1String("Action Item 1")); + + QQuickItem *actionItem1Bg = actionItem1->property("background").value(); + QVERIFY(actionItem1Bg); + QCOMPARE(actionItem1Bg->property("color").value(), green); + + // "Sub-menu" + QQuickMenuItem *subMenuItem = qobject_cast(menu->itemAt(1)); + QVERIFY(subMenuItem); + QCOMPARE(subMenuItem->text(), QLatin1String("Sub-menu")); + + QQuickItem *subMenuItemBg = subMenuItem->property("background").value(); + QVERIFY(subMenuItemBg); + QCOMPARE(subMenuItemBg->property("color").value(), green); + + QQuickMenu *subMenu = subMenuItem->subMenu(); + QVERIFY(subMenu); + + // "Sub-menu Action Item 1" + QQuickMenuItem *subMenuActionItem1 = qobject_cast(subMenu->itemAt(0)); + QVERIFY(subMenuActionItem1); + QCOMPARE(subMenuActionItem1->text(), QLatin1String("Sub-menu Action Item 1")); + + QQuickItem *subMenuActionItem1Bg = subMenuActionItem1->property("background").value(); + QVERIFY(subMenuActionItem1Bg); + QCOMPARE(subMenuActionItem1Bg->property("color").value(), green); + + // "Sub-sub-menu" + QQuickMenuItem *subSubMenuItem = qobject_cast(subMenu->itemAt(1)); + QVERIFY(subSubMenuItem); + QCOMPARE(subSubMenuItem->text(), QLatin1String("Sub-sub-menu")); + + QQuickItem *subSubMenuItemBg = subSubMenuItem->property("background").value(); + QVERIFY(subSubMenuItemBg); + QCOMPARE(subSubMenuItemBg->property("color").value(), green); + + QQuickMenu *subSubMenu = subSubMenuItem->subMenu(); + QVERIFY(subSubMenu); + + // "Sub-sub-menu Action Item 1" + QQuickMenuItem *subSubMenuActionItem1 = qobject_cast(subSubMenu->itemAt(0)); + QVERIFY(subSubMenuActionItem1); + QCOMPARE(subSubMenuActionItem1->text(), QLatin1String("Sub-sub-menu Action Item 1")); + + QQuickItem *subSubMenuActionItem1Bg = subSubMenuActionItem1->property("background").value(); + QVERIFY(subSubMenuActionItem1Bg); + QCOMPARE(subSubMenuActionItem1Bg->property("color").value(), green); + + // "Sub-menu Action Item 2" + QQuickMenuItem *subMenuActionItem2 = qobject_cast(subMenu->itemAt(2)); + QVERIFY(subMenuActionItem2); + QCOMPARE(subMenuActionItem2->text(), QLatin1String("Sub-menu Action Item 2")); + + QQuickItem *subMenuActionItem2Bg = subMenuActionItem2->property("background").value(); + QVERIFY(subMenuActionItem2Bg); + QCOMPARE(subMenuActionItem2Bg->property("color").value(), green); + + // "Action Item 2" + QQuickMenuItem *actionItem2 = qobject_cast(menu->itemAt(2)); + QVERIFY(actionItem2); + QCOMPARE(actionItem2->text(), QLatin1String("Action Item 2")); + + QQuickItem *actionItem2Bg = actionItem2->property("background").value(); + QVERIFY(actionItem2Bg); + QCOMPARE(actionItem2Bg->property("color").value(), green); +} + QTEST_MAIN(tst_QQuickMenu) #include "tst_qquickmenu.moc" -- cgit v1.2.3