summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFilippo Cucchetto <filippocucchetto@gmail.com>2015-04-06 20:52:15 +0200
committerFilippo Cucchetto <filippocucchetto@gmail.com>2015-04-13 11:49:42 +0000
commitd9d9dd16da54b6b40c37b8e1e9c2394422835ab0 (patch)
tree2dba312f198535063574a4a4bc1da355cf8ac4f7
parent74d33bfb7c51643a38f4968d084689a9d8ef96b7 (diff)
downloadqtquickcontrols-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.cpp2
-rw-r--r--src/controls/qquickmenupopupwindow.cpp11
-rw-r--r--src/controls/qquickmenupopupwindow_p.h7
-rw-r--r--tests/auto/menubar/data/WindowWithMenuBar.qml20
-rw-r--r--tests/auto/menubar/menubar.pro15
-rw-r--r--tests/auto/menubar/tst_menubar.cpp43
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)