diff options
author | Filippo Cucchetto <filippocucchetto@gmail.com> | 2015-04-06 20:52:15 +0200 |
---|---|---|
committer | Filippo Cucchetto <filippocucchetto@gmail.com> | 2015-04-13 11:49:42 +0000 |
commit | d9d9dd16da54b6b40c37b8e1e9c2394422835ab0 (patch) | |
tree | 2dba312f198535063574a4a4bc1da355cf8ac4f7 | |
parent | 74d33bfb7c51643a38f4968d084689a9d8ef96b7 (diff) | |
download | qtquickcontrols-d9d9dd16da54b6b40c37b8e1e9c2394422835ab0.tar.gz |
Added QQuickMenu reference in QQuickMenuPopupWindow
QQuickMenuPopupWindow has not direct reference to the QQuickMenu that
created it.
This is useful for navigating back from the popup to the QQuickMenu
Change-Id: I6b11641ef90c423df9961277bb3e89573d1ed0e0
Reviewed-by: Filippo Cucchetto <filippocucchetto@gmail.com>
Reviewed-by: Gabriel de Dietrich <gabriel.dedietrich@theqtcompany.com>
-rw-r--r-- | src/controls/qquickmenu.cpp | 2 | ||||
-rw-r--r-- | src/controls/qquickmenupopupwindow.cpp | 11 | ||||
-rw-r--r-- | src/controls/qquickmenupopupwindow_p.h | 7 | ||||
-rw-r--r-- | tests/auto/menubar/data/WindowWithMenuBar.qml | 20 | ||||
-rw-r--r-- | tests/auto/menubar/menubar.pro | 15 | ||||
-rw-r--r-- | tests/auto/menubar/tst_menubar.cpp | 43 |
6 files changed, 91 insertions, 7 deletions
diff --git a/src/controls/qquickmenu.cpp b/src/controls/qquickmenu.cpp index 85bb4496..b5567523 100644 --- a/src/controls/qquickmenu.cpp +++ b/src/controls/qquickmenu.cpp @@ -421,7 +421,7 @@ void QQuickMenu::__popup(const QRectF &targetRect, int atItemIndex, MenuType men m_platformMenu->setMenuType(QPlatformMenu::MenuType(menuType)); m_platformMenu->showPopup(parentWindow, globalTargetRect.toRect(), atItem ? atItem->platformItem() : 0); } else { - m_popupWindow = new QQuickMenuPopupWindow(); + m_popupWindow = new QQuickMenuPopupWindow(this); if (visualItem()) m_popupWindow->setParentItem(visualItem()); else diff --git a/src/controls/qquickmenupopupwindow.cpp b/src/controls/qquickmenupopupwindow.cpp index 52063979..f5719908 100644 --- a/src/controls/qquickmenupopupwindow.cpp +++ b/src/controls/qquickmenupopupwindow.cpp @@ -41,12 +41,14 @@ #include <qquickitem.h> #include <QtGui/QScreen> #include <QtQuick/QQuickRenderControl> +#include "qquickmenu_p.h" QT_BEGIN_NAMESPACE -QQuickMenuPopupWindow::QQuickMenuPopupWindow() : +QQuickMenuPopupWindow::QQuickMenuPopupWindow(QQuickMenu *menu) : m_itemAt(0), - m_logicalParentWindow(0) + m_logicalParentWindow(0), + m_menu(menu) { } @@ -144,4 +146,9 @@ void QQuickMenuPopupWindow::exposeEvent(QExposeEvent *e) QQuickPopupWindow::exposeEvent(e); } +QQuickMenu *QQuickMenuPopupWindow::menu() const +{ + return m_menu; +} + QT_END_NAMESPACE diff --git a/src/controls/qquickmenupopupwindow_p.h b/src/controls/qquickmenupopupwindow_p.h index 3f8c29d1..517ba6a0 100644 --- a/src/controls/qquickmenupopupwindow_p.h +++ b/src/controls/qquickmenupopupwindow_p.h @@ -41,11 +41,13 @@ QT_BEGIN_NAMESPACE +class QQuickMenu; + class QQuickMenuPopupWindow : public QQuickPopupWindow { Q_OBJECT public: - QQuickMenuPopupWindow(); + QQuickMenuPopupWindow(QQuickMenu *menu); void setItemAt(QQuickItem *menuItem); void setParentWindow(QWindow *effectiveParentWindow, QQuickWindow *parentWindow); @@ -53,6 +55,8 @@ public: void setParentItem(QQuickItem *); + QQuickMenu *menu() const; + protected Q_SLOTS: void updateSize(); void updatePosition(); @@ -65,6 +69,7 @@ private: QPointF m_oldItemPos; QPointF m_initialPos; QQuickWindow *m_logicalParentWindow; + QQuickMenu *m_menu; }; QT_END_NAMESPACE diff --git a/tests/auto/menubar/data/WindowWithMenuBar.qml b/tests/auto/menubar/data/WindowWithMenuBar.qml index 1b6c6d93..f4caf3f3 100644 --- a/tests/auto/menubar/data/WindowWithMenuBar.qml +++ b/tests/auto/menubar/data/WindowWithMenuBar.qml @@ -99,4 +99,24 @@ ApplicationWindow { width: 100 height: 20 } + + Menu { + id: contextMenu + objectName: "contextMenu" + MenuItem { + id: contextMenuItem1 + objectName: "contextMenuItem1" + text: "contextMenuItem1" + } + MenuItem { + id: contextMenuItem2 + objectName: "contextMenuItem2" + text: "contextMenuItem2" + } + } + + MouseArea { + anchors.fill: parent + onClicked: contextMenu.popup() + } } diff --git a/tests/auto/menubar/menubar.pro b/tests/auto/menubar/menubar.pro index 45a2c995..41a9eaac 100644 --- a/tests/auto/menubar/menubar.pro +++ b/tests/auto/menubar/menubar.pro @@ -1,7 +1,16 @@ -CONFIG += testcase +CONFIG += testcase console TARGET = tst_menubar -SOURCES += tst_menubar.cpp +HEADERS += \ + $$PWD/../../../src/controls/qquickpopupwindow_p.h \ + $$PWD/../../../src/controls/qquickmenupopupwindow_p.h \ + $$PWD/../../../src/controls/qquickmenubar_p.h + +SOURCES += \ + tst_menubar.cpp \ + $$PWD/../../../src/controls/qquickpopupwindow.cpp \ + $$PWD/../../../src/controls/qquickmenupopupwindow.cpp \ + $$PWD/../../../src/controls/qquickmenubar.cpp include (../shared/util.pri) @@ -11,6 +20,8 @@ win32:CONFIG+=insignificant_test # QTBUG-30513 - test is unstable CONFIG += parallel_test QT += core-private gui-private qml-private quick-private testlib +INCLUDEPATH += $$PWD/../../../src/controls + DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0 OTHER_FILES += \ diff --git a/tests/auto/menubar/tst_menubar.cpp b/tests/auto/menubar/tst_menubar.cpp index 1efef081..1a25b07e 100644 --- a/tests/auto/menubar/tst_menubar.cpp +++ b/tests/auto/menubar/tst_menubar.cpp @@ -42,6 +42,9 @@ #include <QtQml/QQmlApplicationEngine> #include <QSignalSpy> #include <QTest> +#include "qquickmenupopupwindow_p.h" +#include "qquickpopupwindow_p.h" +#include "qquickmenu_p.h" #define WAIT_TIME 500 @@ -59,7 +62,9 @@ private slots: void init(); void cleanup(); - void testClickSubMenu(); + void testClickSubMenu(); + void testParentMenuForPopupsOutsideMenuBar(); + void testParentMenuForPopupsInsideMenuBar(); private: QQmlApplicationEngine* m_engine; @@ -156,6 +161,42 @@ void tst_menubar::testClickSubMenu() QCOMPARE(actionsSubMenu->property("__popupVisible").toBool(), false); } +void tst_menubar::testParentMenuForPopupsOutsideMenuBar() +{ + waitForRendering(m_window); + QCOMPARE(qApp->focusWindow() == m_window, true); + moveOnPos(m_window, QPointF(50,50)); + clickOnPos(m_window, QPointF(50,50)); + QTest::qWait(500); + QCOMPARE(qApp->focusWindow() == m_window, false); + + QQuickMenuPopupWindow *window = dynamic_cast<QQuickMenuPopupWindow*>(qApp->focusWindow()); + QVERIFY(window); + + QObject *contextMenu = m_window->findChildren<QObject*>("contextMenu").first(); + QVERIFY(contextMenu); + + QCOMPARE(contextMenu, window->menu()); +} + +void tst_menubar::testParentMenuForPopupsInsideMenuBar() +{ + waitForRendering(m_window); + QCOMPARE(qApp->focusWindow() == m_window, true); + moveOnPos(m_window, QPointF(5,5)); + clickOnPos(m_window, QPointF(5,5)); + QTest::qWait(500); + QCOMPARE(qApp->focusWindow() == m_window, false); + + QQuickMenuPopupWindow *window = dynamic_cast<QQuickMenuPopupWindow*>(qApp->focusWindow()); + QVERIFY(window); + + QObject *fileMenu = m_window->findChildren<QObject*>("fileMenu").first(); + QVERIFY(fileMenu); + + QCOMPARE(fileMenu, window->menu()); +} + QTEST_MAIN(tst_menubar) |