aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/quicktemplates2/qquickmenubar.cpp8
-rw-r--r--src/quicktemplates2/qquickmenubar_p_p.h2
-rw-r--r--tests/auto/qquickmenubar/tst_qquickmenubar.cpp60
3 files changed, 65 insertions, 5 deletions
diff --git a/src/quicktemplates2/qquickmenubar.cpp b/src/quicktemplates2/qquickmenubar.cpp
index 62205b6e..9be9ee09 100644
--- a/src/quicktemplates2/qquickmenubar.cpp
+++ b/src/quicktemplates2/qquickmenubar.cpp
@@ -95,7 +95,7 @@ void QQuickMenuBarPrivate::createItems()
}
}
-QQuickItem *QQuickMenuBarPrivate::beginCreateItem()
+QQuickItem *QQuickMenuBarPrivate::beginCreateItem(QQuickMenu *menu)
{
Q_Q(QQuickMenuBar);
if (!delegate)
@@ -115,6 +115,8 @@ QQuickItem *QQuickMenuBarPrivate::beginCreateItem()
return nullptr;
}
+ if (QQuickMenuBarItem *menuBarItem = qobject_cast<QQuickMenuBarItem *>(item))
+ menuBarItem->setMenu(menu);
item->setParentItem(q);
QQml_setParent_noEvent(item, q);
@@ -131,9 +133,7 @@ void QQuickMenuBarPrivate::completeCreateItem()
QQuickItem *QQuickMenuBarPrivate::createItem(QQuickMenu *menu)
{
- QQuickItem *item = beginCreateItem();
- if (QQuickMenuBarItem *menuBarItem = qobject_cast<QQuickMenuBarItem *>(item))
- menuBarItem->setMenu(menu);
+ QQuickItem *item = beginCreateItem(menu);
completeCreateItem();
return item;
}
diff --git a/src/quicktemplates2/qquickmenubar_p_p.h b/src/quicktemplates2/qquickmenubar_p_p.h
index 4d5e61e6..8623ef43 100644
--- a/src/quicktemplates2/qquickmenubar_p_p.h
+++ b/src/quicktemplates2/qquickmenubar_p_p.h
@@ -71,7 +71,7 @@ public:
void createItems();
- QQuickItem *beginCreateItem();
+ QQuickItem *beginCreateItem(QQuickMenu *menu);
void completeCreateItem();
QQuickItem *createItem(QQuickMenu *menu);
diff --git a/tests/auto/qquickmenubar/tst_qquickmenubar.cpp b/tests/auto/qquickmenubar/tst_qquickmenubar.cpp
index cfcdee5e..70d487a9 100644
--- a/tests/auto/qquickmenubar/tst_qquickmenubar.cpp
+++ b/tests/auto/qquickmenubar/tst_qquickmenubar.cpp
@@ -44,6 +44,7 @@
#include <QtQuickTemplates2/private/qquickapplicationwindow_p.h>
#include <QtQuickTemplates2/private/qquickmenu_p.h>
+#include <QtQuickTemplates2/private/qquickmenu_p_p.h>
#include <QtQuickTemplates2/private/qquickmenubar_p.h>
#include <QtQuickTemplates2/private/qquickmenubar_p_p.h>
#include <QtQuickTemplates2/private/qquickmenubaritem_p.h>
@@ -64,6 +65,7 @@ private slots:
void mnemonics();
void addRemove();
void delegateFromSeparateComponent();
+ void openTwice();
};
void tst_qquickmenubar::delegate()
@@ -605,6 +607,64 @@ void tst_qquickmenubar::delegateFromSeparateComponent()
QCOMPARE(menuBarItemBg->property("color").value<QColor>(), green);
}
+void tst_qquickmenubar::openTwice()
+{
+ if ((QGuiApplication::platformName() == QLatin1String("offscreen"))
+ || (QGuiApplication::platformName() == QLatin1String("minimal")))
+ QSKIP("Mouse highlight not functional on offscreen/minimal platforms");
+
+ QQmlApplicationEngine engine(testFileUrl("menubar.qml"));
+
+ QScopedPointer<QQuickApplicationWindow> window(qobject_cast<QQuickApplicationWindow *>(engine.rootObjects().value(0)));
+ QVERIFY(window);
+ QVERIFY(QTest::qWaitForWindowActive(window.data()));
+
+ centerOnScreen(window.data());
+
+ QQuickMenuBar *menuBar = window->property("header").value<QQuickMenuBar *>();
+ QVERIFY(menuBar);
+
+ QQuickMenu *fileMenuBarMenu = menuBar->menuAt(0);
+ QVERIFY(fileMenuBarMenu);
+
+ QQuickMenuBarItem *fileMenuBarItem = qobject_cast<QQuickMenuBarItem *>(fileMenuBarMenu->parentItem());
+ QVERIFY(fileMenuBarItem);
+ QQuickMenuBarPrivate *menuBarPrivate = QQuickMenuBarPrivate::get(menuBar);
+ menuBar->polish();
+ QVERIFY(menuBarPrivate->polishScheduled);
+ QTRY_VERIFY(!menuBarPrivate->polishScheduled);
+
+ // Open a menu.
+ QTest::mouseClick(window.data(), Qt::LeftButton, Qt::NoModifier,
+ fileMenuBarItem->mapToScene(QPointF(fileMenuBarItem->width() / 2, fileMenuBarItem->height() / 2)).toPoint());
+ QVERIFY(fileMenuBarItem->isHighlighted());
+ QVERIFY(fileMenuBarMenu->isVisible());
+ QTRY_VERIFY(fileMenuBarMenu->isOpened());
+ waitForMenuListViewPolish(fileMenuBarMenu);
+
+ // Click on an item to close the menu.
+ QQuickMenuItem *openMenuItem = qobject_cast<QQuickMenuItem *>(fileMenuBarMenu->itemAt(0));
+ QVERIFY(openMenuItem);
+ QTest::mouseClick(window.data(), Qt::LeftButton, Qt::NoModifier,
+ openMenuItem->mapToScene(QPointF(openMenuItem->width() / 2, openMenuItem->height() / 2)).toPoint());
+ QVERIFY(!fileMenuBarItem->isHighlighted());
+ QTRY_VERIFY(!fileMenuBarMenu->isVisible());
+
+ // Re-open the menu. It should open with one click of the QQuickMenuBarItem.
+ QTest::mouseClick(window.data(), Qt::LeftButton, Qt::NoModifier,
+ fileMenuBarItem->mapToScene(QPointF(fileMenuBarItem->width() / 2, fileMenuBarItem->height() / 2)).toPoint());
+ QVERIFY(fileMenuBarItem->isHighlighted());
+ QVERIFY(fileMenuBarMenu->isVisible());
+ QTRY_VERIFY(fileMenuBarMenu->isOpened());
+ waitForMenuListViewPolish(fileMenuBarMenu);
+
+ // Click on an item to close the menu.
+ QTest::mouseClick(window.data(), Qt::LeftButton, Qt::NoModifier,
+ openMenuItem->mapToScene(QPointF(openMenuItem->width() / 2, openMenuItem->height() / 2)).toPoint());
+ QVERIFY(!fileMenuBarItem->isHighlighted());
+ QTRY_VERIFY(!fileMenuBarMenu->isVisible());
+}
+
QTEST_QUICKCONTROLS_MAIN(tst_qquickmenubar)
#include "tst_qquickmenubar.moc"