aboutsummaryrefslogtreecommitdiffstats
path: root/tests/auto/quickcontrols2/qquickpopup/tst_qquickpopup.cpp
diff options
context:
space:
mode:
authorMitch Curtis <[email protected]>2021-08-12 14:39:51 +0200
committerMitch Curtis <[email protected]>2021-08-16 12:52:59 +0200
commit809339d1484cf556512534367b8170bc26baf072 (patch)
tree12871313b658f36d058b5ef25af1e247e9c46ce9 /tests/auto/quickcontrols2/qquickpopup/tst_qquickpopup.cpp
parentb01b4f00eae8022c6a97d90f54dac395144ae095 (diff)
Remove qtquickcontrols2 sources and explain where they wentHEADdev
Now that qtquickcontrols2 has been merged into qtdeclarative, we should make it obvious that this repo should no longer be used, by preventing it from being built. Task-number: QTBUG-95173 Pick-to: 6.2 Change-Id: I95bd6a214f3d75a865ab163ee0a1f9ffbeb7a051 Reviewed-by: Alexandru Croitor <[email protected]> Reviewed-by: Volker Hilsheimer <[email protected]>
Diffstat (limited to 'tests/auto/quickcontrols2/qquickpopup/tst_qquickpopup.cpp')
-rw-r--r--tests/auto/quickcontrols2/qquickpopup/tst_qquickpopup.cpp1477
1 files changed, 0 insertions, 1477 deletions
diff --git a/tests/auto/quickcontrols2/qquickpopup/tst_qquickpopup.cpp b/tests/auto/quickcontrols2/qquickpopup/tst_qquickpopup.cpp
deleted file mode 100644
index c709c17d..00000000
--- a/tests/auto/quickcontrols2/qquickpopup/tst_qquickpopup.cpp
+++ /dev/null
@@ -1,1477 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2017 The Qt Company Ltd.
-** Contact: http://www.qt.io/licensing/
-**
-** This file is part of the test suite of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL3$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see http://www.qt.io/terms-conditions. For further
-** information use the contact form at http://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPLv3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or later as published by the Free
-** Software Foundation and appearing in the file LICENSE.GPL included in
-** the packaging of this file. Please review the following information to
-** ensure the GNU General Public License version 2.0 requirements will be
-** met: http://www.gnu.org/licenses/gpl-2.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#include <QtTest/qtest.h>
-#include <QtTest/qsignalspy.h>
-#include "../shared/util.h"
-#include "../shared/visualtestutil.h"
-#include "../shared/qtest_quickcontrols.h"
-
-#include <QtCore/qoperatingsystemversion.h>
-#include <QtGui/qpa/qwindowsysteminterface.h>
-#include <QtQuick/qquickview.h>
-#include <QtQuick/private/qquickpalette_p.h>
-#include <QtQuickTemplates2/private/qquickapplicationwindow_p.h>
-#include <QtQuickTemplates2/private/qquickcombobox_p.h>
-#include <QtQuickTemplates2/private/qquickdialog_p.h>
-#include <QtQuickTemplates2/private/qquickoverlay_p.h>
-#include <QtQuickTemplates2/private/qquickpopup_p.h>
-#include <QtQuickTemplates2/private/qquickpopupitem_p_p.h>
-#include <QtQuickTemplates2/private/qquickbutton_p.h>
-#include <QtQuickTemplates2/private/qquickslider_p.h>
-#include <QtQuickTemplates2/private/qquickstackview_p.h>
-#include <QtQuickTemplates2/private/qquickpopup_p_p.h>
-#include <QtQuickTemplates2/private/qquicktooltip_p.h>
-
-using namespace QQuickVisualTestUtil;
-
-class tst_QQuickPopup : public QQmlDataTest
-{
- Q_OBJECT
-
-private slots:
- void initTestCase() override;
- void visible_data();
- void visible();
- void state();
- void overlay_data();
- void overlay();
- void zOrder_data();
- void zOrder();
- void windowChange();
- void closePolicy_data();
- void closePolicy();
- void activeFocusOnClose1();
- void activeFocusOnClose2();
- void activeFocusOnClose3();
- void activeFocusOnClosingSeveralPopups();
- void hover_data();
- void hover();
- void wheel_data();
- void wheel();
- void parentDestroyed();
- void nested();
- void grabber();
- void cursorShape();
- void componentComplete();
- void closeOnEscapeWithNestedPopups();
- void closeOnEscapeWithVisiblePopup();
- void enabled();
- void orientation_data();
- void orientation();
- void qquickview();
- void disabledPalette();
- void disabledParentPalette();
- void countChanged();
- void toolTipCrashOnClose();
- void setOverlayParentToNull();
- void tabFence();
- void invisibleToolTipOpen();
- void centerInOverlayWithinStackViewItem();
- void destroyDuringExitTransition();
-};
-
-void tst_QQuickPopup::initTestCase()
-{
- QQmlDataTest::initTestCase();
- qputenv("QML_NO_TOUCH_COMPRESSION", "1");
-}
-
-void tst_QQuickPopup::visible_data()
-{
- QTest::addColumn<QString>("source");
- QTest::newRow("Window") << "window.qml";
- QTest::newRow("ApplicationWindow") << "applicationwindow.qml";
-}
-
-void tst_QQuickPopup::visible()
-{
- QFETCH(QString, source);
- QQuickApplicationHelper helper(this, source);
- QVERIFY2(helper.ready, helper.failureMessage());
-
- QQuickWindow *window = helper.window;
- window->show();
- window->requestActivate();
- QVERIFY(QTest::qWaitForWindowActive(window));
-
- QQuickPopup *popup = window->property("popup").value<QQuickPopup*>();
- QVERIFY(popup);
- QQuickItem *popupItem = popup->popupItem();
-
- popup->open();
- QTRY_VERIFY(popup->isOpened());
-
- QQuickOverlay *overlay = QQuickOverlay::overlay(window);
- QVERIFY(overlay);
- QVERIFY(overlay->childItems().contains(popupItem));
-
- popup->close();
- QTRY_VERIFY(!popup->isVisible());
- QVERIFY(!overlay->childItems().contains(popupItem));
-
- popup->setVisible(true);
- QTRY_VERIFY(popup->isOpened());
- QVERIFY(overlay->childItems().contains(popupItem));
-
- popup->setVisible(false);
- QTRY_VERIFY(!popup->isVisible());
- QVERIFY(!overlay->childItems().contains(popupItem));
-}
-
-void tst_QQuickPopup::state()
-{
- QQuickApplicationHelper helper(this, "applicationwindow.qml");
- QVERIFY2(helper.ready, helper.failureMessage());
-
- QQuickWindow *window = helper.window;
- window->show();
- QVERIFY(QTest::qWaitForWindowExposed(window));
-
- QQuickPopup *popup = window->property("popup").value<QQuickPopup*>();
- QVERIFY(popup);
-
- QCOMPARE(popup->isVisible(), false);
-
- QSignalSpy visibleChangedSpy(popup, SIGNAL(visibleChanged()));
- QSignalSpy aboutToShowSpy(popup, SIGNAL(aboutToShow()));
- QSignalSpy aboutToHideSpy(popup, SIGNAL(aboutToHide()));
- QSignalSpy openedSpy(popup, SIGNAL(opened()));
- QSignalSpy closedSpy(popup, SIGNAL(closed()));
-
- QVERIFY(visibleChangedSpy.isValid());
- QVERIFY(aboutToShowSpy.isValid());
- QVERIFY(aboutToHideSpy.isValid());
- QVERIFY(openedSpy.isValid());
- QVERIFY(closedSpy.isValid());
-
- popup->open();
- QCOMPARE(visibleChangedSpy.count(), 1);
- QCOMPARE(aboutToShowSpy.count(), 1);
- QCOMPARE(aboutToHideSpy.count(), 0);
- QTRY_COMPARE(openedSpy.count(), 1);
- QCOMPARE(closedSpy.count(), 0);
-
- popup->close();
- QTRY_COMPARE(visibleChangedSpy.count(), 2);
- QCOMPARE(aboutToShowSpy.count(), 1);
- QCOMPARE(aboutToHideSpy.count(), 1);
- QCOMPARE(openedSpy.count(), 1);
- QTRY_COMPARE(closedSpy.count(), 1);
-}
-
-void tst_QQuickPopup::overlay_data()
-{
- QTest::addColumn<QString>("source");
- QTest::addColumn<bool>("modal");
- QTest::addColumn<bool>("dim");
-
- QTest::newRow("Window") << "window.qml" << false << false;
- QTest::newRow("Window,dim") << "window.qml" << false << true;
- QTest::newRow("Window,modal") << "window.qml" << true << false;
- QTest::newRow("Window,modal,dim") << "window.qml" << true << true;
-
- QTest::newRow("ApplicationWindow") << "applicationwindow.qml" << false << false;
- QTest::newRow("ApplicationWindow,dim") << "applicationwindow.qml" << false << true;
- QTest::newRow("ApplicationWindow,modal") << "applicationwindow.qml" << true << false;
- QTest::newRow("ApplicationWindow,modal,dim") << "applicationwindow.qml" << true << true;
-}
-
-void tst_QQuickPopup::overlay()
-{
- QFETCH(QString, source);
- QFETCH(bool, modal);
- QFETCH(bool, dim);
-
- QScopedPointer<QPointingDevice> device(QTest::createTouchDevice());
- QQuickApplicationHelper helper(this, source);
- QVERIFY2(helper.ready, helper.failureMessage());
-
- QQuickWindow *window = helper.window;
- window->show();
- window->requestActivate();
- QVERIFY(QTest::qWaitForWindowActive(window));
-
- QQuickOverlay *overlay = QQuickOverlay::overlay(window);
- QVERIFY(overlay);
-
- QSignalSpy overlayPressedSignal(overlay, SIGNAL(pressed()));
- QSignalSpy overlayReleasedSignal(overlay, SIGNAL(released()));
- QVERIFY(overlayPressedSignal.isValid());
- QVERIFY(overlayReleasedSignal.isValid());
-
- QVERIFY(!overlay->isVisible()); // no popups open
-
- QTest::mouseClick(window, Qt::LeftButton);
- QCOMPARE(overlayPressedSignal.count(), 0);
- QCOMPARE(overlayReleasedSignal.count(), 0);
-
- QQuickPopup *popup = window->property("popup").value<QQuickPopup*>();
- QVERIFY(popup);
-
- QQuickOverlayAttached *overlayAttached = qobject_cast<QQuickOverlayAttached *>(qmlAttachedPropertiesObject<QQuickOverlay>(popup));
- QVERIFY(overlayAttached);
- QCOMPARE(overlayAttached->overlay(), overlay);
-
- QSignalSpy overlayAttachedPressedSignal(overlayAttached, SIGNAL(pressed()));
- QSignalSpy overlayAttachedReleasedSignal(overlayAttached, SIGNAL(released()));
- QVERIFY(overlayAttachedPressedSignal.isValid());
- QVERIFY(overlayAttachedReleasedSignal.isValid());
-
- QQuickButton *button = window->property("button").value<QQuickButton*>();
- QVERIFY(button);
-
- int overlayPressCount = 0;
- int overlayReleaseCount = 0;
-
- popup->open();
- QVERIFY(popup->isVisible());
- QVERIFY(overlay->isVisible());
- QTRY_VERIFY(popup->isOpened());
-
- QTest::mousePress(window, Qt::LeftButton, Qt::NoModifier, QPoint(1, 1));
- QCOMPARE(overlayPressedSignal.count(), ++overlayPressCount);
- QCOMPARE(overlayReleasedSignal.count(), overlayReleaseCount);
- QCOMPARE(overlayAttachedPressedSignal.count(), overlayPressCount);
- QCOMPARE(overlayAttachedReleasedSignal.count(), overlayReleaseCount);
-
- QTRY_VERIFY(!popup->isVisible());
- QVERIFY(!overlay->isVisible());
-
- QTest::mouseRelease(window, Qt::LeftButton, Qt::NoModifier, QPoint(1, 1));
- QCOMPARE(overlayPressedSignal.count(), overlayPressCount);
- QCOMPARE(overlayReleasedSignal.count(), overlayReleaseCount); // no modal-popups open
- QCOMPARE(overlayAttachedPressedSignal.count(), overlayPressCount);
- QCOMPARE(overlayAttachedReleasedSignal.count(), overlayReleaseCount);
-
- popup->setDim(dim);
- popup->setModal(modal);
- popup->setClosePolicy(QQuickPopup::CloseOnReleaseOutside);
-
- // mouse
- popup->open();
- QVERIFY(popup->isVisible());
- QVERIFY(overlay->isVisible());
- QTRY_VERIFY(popup->isOpened());
-
- QTest::mousePress(window, Qt::LeftButton, Qt::NoModifier, QPoint(1, 1));
- QCOMPARE(overlayPressedSignal.count(), ++overlayPressCount);
- QCOMPARE(overlayReleasedSignal.count(), overlayReleaseCount);
- QCOMPARE(overlayAttachedPressedSignal.count(), overlayPressCount);
- QCOMPARE(overlayAttachedReleasedSignal.count(), overlayReleaseCount);
-
- QTest::mouseRelease(window, Qt::LeftButton, Qt::NoModifier, QPoint(1, 1));
- QCOMPARE(overlayPressedSignal.count(), overlayPressCount);
- QCOMPARE(overlayReleasedSignal.count(), ++overlayReleaseCount);
- QCOMPARE(overlayAttachedPressedSignal.count(), overlayPressCount);
- QCOMPARE(overlayAttachedReleasedSignal.count(), overlayReleaseCount);
-
- QTRY_VERIFY(!popup->isVisible());
- QVERIFY(!overlay->isVisible());
-
- // touch
- popup->open();
- QVERIFY(popup->isVisible());
- QVERIFY(overlay->isVisible());
- QTRY_VERIFY(popup->isOpened());
-
- QTest::touchEvent(window, device.data()).press(0, QPoint(1, 1));
- QCOMPARE(overlayPressedSignal.count(), ++overlayPressCount);
- QCOMPARE(overlayReleasedSignal.count(), overlayReleaseCount);
- QCOMPARE(overlayAttachedPressedSignal.count(), overlayPressCount);
- QCOMPARE(overlayAttachedReleasedSignal.count(), overlayReleaseCount);
-
- QTest::touchEvent(window, device.data()).release(0, QPoint(1, 1));
- QCOMPARE(overlayPressedSignal.count(), overlayPressCount);
- QCOMPARE(overlayReleasedSignal.count(), ++overlayReleaseCount);
- QCOMPARE(overlayAttachedPressedSignal.count(), overlayPressCount);
- QCOMPARE(overlayAttachedReleasedSignal.count(), overlayReleaseCount);
-
- QTRY_VERIFY(!popup->isVisible());
- QVERIFY(!overlay->isVisible());
-
- // multi-touch
- popup->open();
- QVERIFY(popup->isVisible());
- QVERIFY(overlay->isVisible());
- QVERIFY(!button->isPressed());
- QTRY_VERIFY(popup->isOpened());
-
- QTest::touchEvent(window, device.data()).press(0, button->mapToScene(QPointF(1, 1)).toPoint());
- QVERIFY(popup->isVisible());
- QVERIFY(overlay->isVisible());
- QCOMPARE(button->isPressed(), !modal);
- QCOMPARE(overlayPressedSignal.count(), ++overlayPressCount);
- QCOMPARE(overlayReleasedSignal.count(), overlayReleaseCount);
-
- QTest::touchEvent(window, device.data()).stationary(0).press(1, button->mapToScene(QPointF(button->width() / 2, button->height() / 2)).toPoint());
- QVERIFY(popup->isVisible());
- QVERIFY(overlay->isVisible());
- QCOMPARE(button->isPressed(), !modal);
- QCOMPARE(overlayPressedSignal.count(), ++overlayPressCount);
- QCOMPARE(overlayReleasedSignal.count(), overlayReleaseCount);
-
- QTest::touchEvent(window, device.data()).release(0, button->mapToScene(QPointF(1, 1)).toPoint()).stationary(1);
- QTRY_VERIFY(!popup->isVisible());
- QVERIFY(!overlay->isVisible());
- QVERIFY(!button->isPressed());
- QCOMPARE(overlayPressedSignal.count(), overlayPressCount);
- QCOMPARE(overlayReleasedSignal.count(), ++overlayReleaseCount);
-
- QTest::touchEvent(window, device.data()).release(1, button->mapToScene(QPointF(button->width() / 2, button->height() / 2)).toPoint());
- QVERIFY(!popup->isVisible());
- QVERIFY(!overlay->isVisible());
- QVERIFY(!button->isPressed());
- QCOMPARE(overlayPressedSignal.count(), overlayPressCount);
- QCOMPARE(overlayReleasedSignal.count(), overlayReleaseCount);
-}
-
-void tst_QQuickPopup::zOrder_data()
-{
- QTest::addColumn<QString>("source");
- QTest::newRow("Window") << "window.qml";
- QTest::newRow("ApplicationWindow") << "applicationwindow.qml";
-}
-
-void tst_QQuickPopup::zOrder()
-{
- QFETCH(QString, source);
- QQuickApplicationHelper helper(this, source);
- QVERIFY2(helper.ready, helper.failureMessage());
-
- QQuickWindow *window = helper.window;
- window->show();
- window->requestActivate();
- QVERIFY(QTest::qWaitForWindowActive(window));
-
- QQuickPopup *popup = window->property("popup").value<QQuickPopup*>();
- QVERIFY(popup);
- popup->setModal(true);
-
- QQuickPopup *popup2 = window->property("popup2").value<QQuickPopup*>();
- QVERIFY(popup2);
- popup2->setModal(true);
-
- // show popups in reverse order. popup2 has higher z-order so it appears
- // on top and must be closed first, even if the other popup was opened last
- popup2->open();
- popup->open();
- QTRY_VERIFY(popup2->isOpened());
- QTRY_VERIFY(popup->isOpened());
-
- QTest::mouseClick(window, Qt::LeftButton, Qt::NoModifier, QPoint(1, 1));
- QTRY_VERIFY(!popup2->isVisible());
- QVERIFY(popup->isVisible());
-
- QTest::mouseClick(window, Qt::LeftButton, Qt::NoModifier, QPoint(1, 1));
- QVERIFY(!popup2->isVisible());
- QTRY_VERIFY(!popup->isVisible());
-}
-
-void tst_QQuickPopup::windowChange()
-{
- QQuickPopup popup;
- QSignalSpy spy(&popup, SIGNAL(windowChanged(QQuickWindow*)));
- QVERIFY(spy.isValid());
-
- QQuickItem item;
- popup.setParentItem(&item);
- QVERIFY(!popup.window());
- QCOMPARE(spy.count(), 0);
-
- QQuickWindow window;
- item.setParentItem(window.contentItem());
- QCOMPARE(popup.window(), &window);
- QCOMPARE(spy.count(), 1);
-
- item.setParentItem(nullptr);
- QVERIFY(!popup.window());
- QCOMPARE(spy.count(), 2);
-
- popup.setParentItem(window.contentItem());
- QCOMPARE(popup.window(), &window);
- QCOMPARE(spy.count(), 3);
-
- popup.resetParentItem();
- QVERIFY(!popup.window());
- QCOMPARE(spy.count(), 4);
-
- popup.setParent(&window);
- popup.resetParentItem();
- QCOMPARE(popup.window(), &window);
- QCOMPARE(spy.count(), 5);
-
- popup.setParent(this);
- popup.resetParentItem();
- QVERIFY(!popup.window());
- QCOMPARE(spy.count(), 6);
-
- item.setParentItem(window.contentItem());
- popup.setParent(&item);
- popup.resetParentItem();
- QCOMPARE(popup.window(), &window);
- QCOMPARE(spy.count(), 7);
-
- popup.setParent(nullptr);
-}
-
-Q_DECLARE_METATYPE(QQuickPopup::ClosePolicy)
-
-void tst_QQuickPopup::closePolicy_data()
-{
- qRegisterMetaType<QQuickPopup::ClosePolicy>();
-
- QTest::addColumn<QString>("source");
- QTest::addColumn<QQuickPopup::ClosePolicy>("closePolicy");
-
- QTest::newRow("Window:NoAutoClose") << "window.qml"<< static_cast<QQuickPopup::ClosePolicy>(QQuickPopup::NoAutoClose);
- QTest::newRow("Window:CloseOnPressOutside") << "window.qml"<< static_cast<QQuickPopup::ClosePolicy>(QQuickPopup::CloseOnPressOutside);
- QTest::newRow("Window:CloseOnPressOutsideParent") << "window.qml"<< static_cast<QQuickPopup::ClosePolicy>(QQuickPopup::CloseOnPressOutsideParent);
- QTest::newRow("Window:CloseOnPressOutside|Parent") << "window.qml"<< static_cast<QQuickPopup::ClosePolicy>(QQuickPopup::CloseOnPressOutside | QQuickPopup::CloseOnPressOutsideParent);
- QTest::newRow("Window:CloseOnReleaseOutside") << "window.qml"<< static_cast<QQuickPopup::ClosePolicy>(QQuickPopup::CloseOnReleaseOutside);
- QTest::newRow("Window:CloseOnReleaseOutside|Parent") << "window.qml"<< static_cast<QQuickPopup::ClosePolicy>(QQuickPopup::CloseOnReleaseOutside | QQuickPopup::CloseOnReleaseOutsideParent);
- QTest::newRow("Window:CloseOnEscape") << "window.qml"<< static_cast<QQuickPopup::ClosePolicy>(QQuickPopup::CloseOnEscape);
-
- QTest::newRow("ApplicationWindow:NoAutoClose") << "applicationwindow.qml"<< static_cast<QQuickPopup::ClosePolicy>(QQuickPopup::NoAutoClose);
- QTest::newRow("ApplicationWindow:CloseOnPressOutside") << "applicationwindow.qml"<< static_cast<QQuickPopup::ClosePolicy>(QQuickPopup::CloseOnPressOutside);
- QTest::newRow("ApplicationWindow:CloseOnPressOutsideParent") << "applicationwindow.qml"<< static_cast<QQuickPopup::ClosePolicy>(QQuickPopup::CloseOnPressOutsideParent);
- QTest::newRow("ApplicationWindow:CloseOnPressOutside|Parent") << "applicationwindow.qml"<< static_cast<QQuickPopup::ClosePolicy>(QQuickPopup::CloseOnPressOutside | QQuickPopup::CloseOnPressOutsideParent);
- QTest::newRow("ApplicationWindow:CloseOnReleaseOutside") << "applicationwindow.qml"<< static_cast<QQuickPopup::ClosePolicy>(QQuickPopup::CloseOnReleaseOutside);
- QTest::newRow("ApplicationWindow:CloseOnReleaseOutside|Parent") << "applicationwindow.qml"<< static_cast<QQuickPopup::ClosePolicy>(QQuickPopup::CloseOnReleaseOutside | QQuickPopup::CloseOnReleaseOutsideParent);
- QTest::newRow("ApplicationWindow:CloseOnEscape") << "applicationwindow.qml"<< static_cast<QQuickPopup::ClosePolicy>(QQuickPopup::CloseOnEscape);
-}
-
-void tst_QQuickPopup::closePolicy()
-{
- QFETCH(QString, source);
- QFETCH(QQuickPopup::ClosePolicy, closePolicy);
-
- QQuickApplicationHelper helper(this, source);
- QVERIFY2(helper.ready, helper.failureMessage());
-
- QQuickWindow *window = helper.window;
- window->show();
- window->requestActivate();
- QVERIFY(QTest::qWaitForWindowActive(window));
-
- QQuickPopup *popup = window->property("popup").value<QQuickPopup*>();
- QVERIFY(popup);
-
- QQuickButton *button = window->property("button").value<QQuickButton*>();
- QVERIFY(button);
-
- popup->setModal(true);
- popup->setFocus(true);
- popup->setClosePolicy(closePolicy);
-
- popup->open();
- QVERIFY(popup->isVisible());
- QTRY_VERIFY(popup->isOpened());
-
- // press outside popup and its parent
- QTest::mousePress(window, Qt::LeftButton, Qt::NoModifier, QPoint(1, 1), 50);
- if (closePolicy.testFlag(QQuickPopup::CloseOnPressOutside) || closePolicy.testFlag(QQuickPopup::CloseOnPressOutsideParent))
- QTRY_VERIFY(!popup->isVisible());
- else
- QVERIFY(popup->isVisible());
-
- popup->open();
- QVERIFY(popup->isVisible());
- QTRY_VERIFY(popup->isOpened());
-
- // release outside popup and its parent
- QTest::mouseRelease(window, Qt::LeftButton, Qt::NoModifier, QPoint(1, 1));
- if (closePolicy.testFlag(QQuickPopup::CloseOnReleaseOutside))
- QTRY_VERIFY(!popup->isVisible());
- else
- QVERIFY(popup->isVisible());
-
- popup->open();
- QVERIFY(popup->isVisible());
- QTRY_VERIFY(popup->isOpened());
-
- // press outside popup but inside its parent
- QTest::mousePress(window, Qt::LeftButton, Qt::NoModifier, QPoint(button->x() + 1, button->y() + 1));
- if (closePolicy.testFlag(QQuickPopup::CloseOnPressOutside) && !closePolicy.testFlag(QQuickPopup::CloseOnPressOutsideParent))
- QTRY_VERIFY(!popup->isVisible());
- else
- QVERIFY(popup->isVisible());
-
- popup->open();
- QVERIFY(popup->isVisible());
- QTRY_VERIFY(popup->isOpened());
-
- // release outside popup but inside its parent
- QTest::mouseRelease(window, Qt::LeftButton, Qt::NoModifier, QPoint(button->x() + 1, button->y() + 1));
- if (closePolicy.testFlag(QQuickPopup::CloseOnReleaseOutside) && !closePolicy.testFlag(QQuickPopup::CloseOnReleaseOutsideParent))
- QTRY_VERIFY(!popup->isVisible());
- else
- QVERIFY(popup->isVisible());
-
- popup->open();
- QVERIFY(popup->isVisible());
- QTRY_VERIFY(popup->isOpened());
-
- // press inside and release outside
- QTest::mousePress(window, Qt::LeftButton, Qt::NoModifier, QPoint(button->x() + popup->x() + 1,
- button->y() + popup->y() + 1));
- QVERIFY(popup->isVisible());
- QTest::mouseRelease(window, Qt::LeftButton, Qt::NoModifier, QPoint(1, 1));
- QVERIFY(popup->isVisible());
-
- // escape
- QTest::keyClick(window, Qt::Key_Escape);
- if (closePolicy.testFlag(QQuickPopup::CloseOnEscape))
- QTRY_VERIFY(!popup->isVisible());
- else
- QVERIFY(popup->isVisible());
-}
-
-void tst_QQuickPopup::activeFocusOnClose1()
-{
- // Test that a popup that never sets focus: true (e.g. ToolTip) doesn't affect
- // the active focus item when it closes.
- QQuickApplicationHelper helper(this, QStringLiteral("activeFocusOnClose1.qml"));
- QVERIFY2(helper.ready, helper.failureMessage());
- QQuickApplicationWindow *window = helper.appWindow;
- window->show();
- window->requestActivate();
- QVERIFY(QTest::qWaitForWindowActive(window));
-
- QQuickPopup *focusedPopup = helper.appWindow->property("focusedPopup").value<QQuickPopup*>();
- QVERIFY(focusedPopup);
-
- QQuickPopup *nonFocusedPopup = helper.appWindow->property("nonFocusedPopup").value<QQuickPopup*>();
- QVERIFY(nonFocusedPopup);
-
- focusedPopup->open();
- QVERIFY(focusedPopup->isVisible());
- QTRY_VERIFY(focusedPopup->isOpened());
- QVERIFY(focusedPopup->hasActiveFocus());
-
- nonFocusedPopup->open();
- QVERIFY(nonFocusedPopup->isVisible());
- QTRY_VERIFY(nonFocusedPopup->isOpened());
- QVERIFY(focusedPopup->hasActiveFocus());
-
- nonFocusedPopup->close();
- QTRY_VERIFY(!nonFocusedPopup->isVisible());
- QVERIFY(focusedPopup->hasActiveFocus());
-
- // QTBUG-66113: force active focus on a popup that did not request focus
- nonFocusedPopup->open();
- nonFocusedPopup->forceActiveFocus();
- QVERIFY(nonFocusedPopup->isVisible());
- QTRY_VERIFY(nonFocusedPopup->isOpened());
- QVERIFY(nonFocusedPopup->hasActiveFocus());
-
- nonFocusedPopup->close();
- QTRY_VERIFY(!nonFocusedPopup->isVisible());
- QVERIFY(focusedPopup->hasActiveFocus());
-}
-
-void tst_QQuickPopup::activeFocusOnClose2()
-{
- // Test that a popup that sets focus: true but relinquishes focus (e.g. by
- // calling forceActiveFocus() on another item) before it closes doesn't
- // affect the active focus item when it closes.
- QQuickApplicationHelper helper(this, QStringLiteral("activeFocusOnClose2.qml"));
- QVERIFY2(helper.ready, helper.failureMessage());
- QQuickApplicationWindow *window = helper.appWindow;
- window->show();
- window->requestActivate();
- QVERIFY(QTest::qWaitForWindowActive(window));
-
- QQuickPopup *popup1 = helper.appWindow->property("popup1").value<QQuickPopup*>();
- QVERIFY(popup1);
-
- QQuickPopup *popup2 = helper.appWindow->property("popup2").value<QQuickPopup*>();
- QVERIFY(popup2);
-
- QQuickButton *closePopup2Button = helper.appWindow->property("closePopup2Button").value<QQuickButton*>();
- QVERIFY(closePopup2Button);
-
- popup1->open();
- QVERIFY(popup1->isVisible());
- QTRY_VERIFY(popup1->isOpened());
- QVERIFY(popup1->hasActiveFocus());
-
- popup2->open();
- QVERIFY(popup2->isVisible());
- QTRY_VERIFY(popup2->isOpened());
- QVERIFY(popup2->hasActiveFocus());
-
- // Causes popup1.contentItem.forceActiveFocus() to be called, then closes popup2.
- QTRY_VERIFY(closePopup2Button->width() > 0);
- QTest::mouseClick(window, Qt::LeftButton, Qt::NoModifier,
- closePopup2Button->mapToScene(QPointF(closePopup2Button->width() / 2, closePopup2Button->height() / 2)).toPoint());
- QTRY_VERIFY(!popup2->isVisible());
- QVERIFY(popup1->hasActiveFocus());
-}
-
-void tst_QQuickPopup::activeFocusOnClose3()
-{
- // Test that a closing popup that had focus doesn't steal focus from
- // another popup that the focus was transferred to.
- QQuickApplicationHelper helper(this, QStringLiteral("activeFocusOnClose3.qml"));
- QVERIFY2(helper.ready, helper.failureMessage());
- QQuickApplicationWindow *window = helper.appWindow;
- window->show();
- window->requestActivate();
- QVERIFY(QTest::qWaitForWindowActive(window));
-
- QQuickPopup *popup1 = helper.appWindow->property("popup1").value<QQuickPopup*>();
- QVERIFY(popup1);
-
- QQuickPopup *popup2 = helper.appWindow->property("popup2").value<QQuickPopup*>();
- QVERIFY(popup2);
-
- popup1->open();
- QVERIFY(popup1->isVisible());
- QTRY_VERIFY(popup1->hasActiveFocus());
-
- popup2->open();
- popup1->close();
-
- QSignalSpy closedSpy(popup1, SIGNAL(closed()));
- QVERIFY(closedSpy.isValid());
- QVERIFY(closedSpy.wait());
-
- QVERIFY(!popup1->isVisible());
- QVERIFY(popup2->isVisible());
- QTRY_VERIFY(popup2->hasActiveFocus());
-}
-
-void tst_QQuickPopup::activeFocusOnClosingSeveralPopups()
-{
- // Test that active focus isn't lost when multiple popup closing simultaneously
- QQuickApplicationHelper helper(this, QStringLiteral("activeFocusOnClosingSeveralPopups.qml"));
- QVERIFY2(helper.ready, helper.failureMessage());
- QQuickApplicationWindow *window = helper.appWindow;
- window->show();
- window->requestActivate();
- QVERIFY(QTest::qWaitForWindowActive(window));
-
- QQuickItem *button = window->property("button").value<QQuickItem *>();
- QVERIFY(button);
-
- QQuickPopup *popup1 = window->property("popup1").value<QQuickPopup *>();
- QVERIFY(popup1);
-
- QQuickPopup *popup2 = window->property("popup2").value<QQuickPopup *>();
- QVERIFY(popup2);
-
- QCOMPARE(button->hasActiveFocus(), true);
- popup1->open();
- QTRY_VERIFY(popup1->isOpened());
- QVERIFY(popup1->hasActiveFocus());
- popup2->open();
- QTRY_VERIFY(popup2->isOpened());
- QVERIFY(popup2->hasActiveFocus());
- QTRY_COMPARE(button->hasActiveFocus(), false);
- // close the unfocused popup first
- popup1->close();
- popup2->close();
- QTRY_VERIFY(!popup1->isVisible());
- QTRY_VERIFY(!popup2->isVisible());
- QTRY_COMPARE(button->hasActiveFocus(), true);
-
- popup1->open();
- QTRY_VERIFY(popup1->isOpened());
- QVERIFY(popup1->hasActiveFocus());
- popup2->open();
- QTRY_VERIFY(popup2->isOpened());
- QVERIFY(popup2->hasActiveFocus());
- QTRY_COMPARE(button->hasActiveFocus(), false);
- // close the focused popup first
- popup2->close();
- popup1->close();
- QTRY_VERIFY(!popup1->isVisible());
- QTRY_VERIFY(!popup2->isVisible());
- QTRY_COMPARE(button->hasActiveFocus(), true);
-}
-
-void tst_QQuickPopup::hover_data()
-{
- QTest::addColumn<QString>("source");
- QTest::addColumn<bool>("modal");
-
- QTest::newRow("Window:modal") << "window-hover.qml" << true;
- QTest::newRow("Window:modeless") << "window-hover.qml" << false;
- QTest::newRow("ApplicationWindow:modal") << "applicationwindow-hover.qml" << true;
- QTest::newRow("ApplicationWindow:modeless") << "applicationwindow-hover.qml" << false;
-}
-
-void tst_QQuickPopup::hover()
-{
- QFETCH(QString, source);
- QFETCH(bool, modal);
-
- QQuickApplicationHelper helper(this, source);
- QVERIFY2(helper.ready, helper.failureMessage());
- QQuickWindow *window = helper.window;
- window->show();
- window->requestActivate();
- QVERIFY(QTest::qWaitForWindowActive(window));
-
- QQuickPopup *popup = window->property("popup").value<QQuickPopup*>();
- QVERIFY(popup);
- popup->setModal(modal);
-
- QQuickButton *parentButton = window->property("parentButton").value<QQuickButton*>();
- QVERIFY(parentButton);
- parentButton->setHoverEnabled(true);
-
- QQuickButton *childButton = window->property("childButton").value<QQuickButton*>();
- QVERIFY(childButton);
- childButton->setHoverEnabled(true);
-
- QSignalSpy openedSpy(popup, SIGNAL(opened()));
- QVERIFY(openedSpy.isValid());
- popup->open();
- QVERIFY(openedSpy.count() == 1 || openedSpy.wait());
- QTRY_VERIFY(popup->width() > 10); // somehow this can take a short time with macOS style
-
- // hover the parent button outside the popup
- QTest::mouseMove(window, QPoint(window->width() - 1, window->height() - 1));
- QCOMPARE(parentButton->isHovered(), !modal);
- QVERIFY(!childButton->isHovered());
-
- // hover the popup background
- QTest::mouseMove(window, QPoint(1, 1));
- QVERIFY(!parentButton->isHovered());
- QVERIFY(!childButton->isHovered());
-
- // hover the child button in a popup
- QTest::mouseMove(window, QPoint(popup->x() + popup->width() / 2, popup->y() + popup->height() / 2));
- QVERIFY(!parentButton->isHovered());
- QVERIFY(childButton->isHovered());
-
- QSignalSpy closedSpy(popup, SIGNAL(closed()));
- QVERIFY(closedSpy.isValid());
- popup->close();
- QVERIFY(closedSpy.count() == 1 || closedSpy.wait());
-
- // hover the parent button after closing the popup
- QTest::mouseMove(window, QPoint(window->width() / 2, window->height() / 2));
- QVERIFY(parentButton->isHovered());
-}
-
-void tst_QQuickPopup::wheel_data()
-{
- QTest::addColumn<QString>("source");
- QTest::addColumn<bool>("modal");
-
- QTest::newRow("Window:modal") << "window-wheel.qml" << true;
- QTest::newRow("Window:modeless") << "window-wheel.qml" << false;
- QTest::newRow("ApplicationWindow:modal") << "applicationwindow-wheel.qml" << true;
- QTest::newRow("ApplicationWindow:modeless") << "applicationwindow-wheel.qml" << false;
-}
-
-static bool sendWheelEvent(QQuickItem *item, const QPoint &localPos, int degrees)
-{
- QQuickWindow *window = item->window();
- QWheelEvent wheelEvent(localPos, item->window()->mapToGlobal(localPos), QPoint(0, 0),
- QPoint(0, 8 * degrees), Qt::NoButton, Qt::NoModifier, Qt::NoScrollPhase,
- false);
- QSpontaneKeyEvent::setSpontaneous(&wheelEvent);
- return qGuiApp->notify(window, &wheelEvent);
-}
-
-void tst_QQuickPopup::wheel()
-{
- QFETCH(QString, source);
- QFETCH(bool, modal);
-
- QQuickApplicationHelper helper(this, source);
- QVERIFY2(helper.ready, helper.failureMessage());
- QQuickWindow *window = helper.window;
- window->show();
- QVERIFY(QTest::qWaitForWindowExposed(window));
-
- QQuickSlider *contentSlider = window->property("contentSlider").value<QQuickSlider*>();
- QVERIFY(contentSlider);
-
- QQuickPopup *popup = window->property("popup").value<QQuickPopup*>();
- QVERIFY(popup && popup->contentItem());
- popup->setModal(modal);
-
- QQuickSlider *popupSlider = window->property("popupSlider").value<QQuickSlider*>();
- QVERIFY(popupSlider);
-
- {
- // wheel over the content
- qreal oldContentValue = contentSlider->value();
- qreal oldPopupValue = popupSlider->value();
-
- QVERIFY(sendWheelEvent(contentSlider, QPoint(contentSlider->width() / 2, contentSlider->height() / 2), 15));
-
- QVERIFY(!qFuzzyCompare(contentSlider->value(), oldContentValue)); // must have moved
- QVERIFY(qFuzzyCompare(popupSlider->value(), oldPopupValue)); // must not have moved
- }
-
- QSignalSpy openedSpy(popup, SIGNAL(opened()));
- QVERIFY(openedSpy.isValid());
- popup->open();
- QVERIFY(openedSpy.count() == 1 || openedSpy.wait());
-
- {
- // wheel over the popup content
- qreal oldContentValue = contentSlider->value();
- qreal oldPopupValue = popupSlider->value();
-
- QVERIFY(sendWheelEvent(popupSlider, QPoint(popupSlider->width() / 2, popupSlider->height() / 2), 15));
-
- QVERIFY(qFuzzyCompare(contentSlider->value(), oldContentValue)); // must not have moved
- QVERIFY(!qFuzzyCompare(popupSlider->value(), oldPopupValue)); // must have moved
- }
-
- {
- // wheel over the overlay
- qreal oldContentValue = contentSlider->value();
- qreal oldPopupValue = popupSlider->value();
-
- QVERIFY(sendWheelEvent(QQuickOverlay::overlay(window), QPoint(0, 0), 15));
-
- if (modal) {
- // the content below a modal overlay must not move
- QVERIFY(qFuzzyCompare(contentSlider->value(), oldContentValue));
- } else {
- // the content below a modeless overlay must move
- QVERIFY(!qFuzzyCompare(contentSlider->value(), oldContentValue));
- }
- QVERIFY(qFuzzyCompare(popupSlider->value(), oldPopupValue)); // must not have moved
- }
-}
-
-void tst_QQuickPopup::parentDestroyed()
-{
- QQuickPopup popup;
- popup.setParentItem(new QQuickItem);
- delete popup.parentItem();
- QVERIFY(!popup.parentItem());
-}
-
-void tst_QQuickPopup::nested()
-{
- QQuickApplicationHelper helper(this, QStringLiteral("nested.qml"));
- QVERIFY2(helper.ready, helper.failureMessage());
- QQuickWindow *window = helper.window;
- window->show();
- QVERIFY(QTest::qWaitForWindowExposed(window));
-
- QQuickPopup *modalPopup = window->property("modalPopup").value<QQuickPopup *>();
- QVERIFY(modalPopup);
-
- QQuickPopup *modelessPopup = window->property("modelessPopup").value<QQuickPopup *>();
- QVERIFY(modelessPopup);
-
- modalPopup->open();
- QCOMPARE(modalPopup->isVisible(), true);
- QTRY_COMPARE(modalPopup->isOpened(), true);
-
- modelessPopup->open();
- QCOMPARE(modelessPopup->isVisible(), true);
- QTRY_COMPARE(modelessPopup->isOpened(), true);
-
- // click outside the modeless popup on the top, but inside the modal popup below
- QTest::mouseClick(window, Qt::LeftButton, Qt::NoModifier, QPoint(150, 150));
-
- QTRY_COMPARE(modelessPopup->isVisible(), false);
- QCOMPARE(modalPopup->isVisible(), true);
-}
-
-// QTBUG-56697
-void tst_QQuickPopup::grabber()
-{
- QQuickApplicationHelper helper(this, QStringLiteral("grabber.qml"));
- QVERIFY2(helper.ready, helper.failureMessage());
- QQuickWindow *window = helper.window;
- window->show();
- QVERIFY(QTest::qWaitForWindowExposed(window));
-
- QQuickPopup *menu = window->property("menu").value<QQuickPopup *>();
- QVERIFY(menu);
-
- QQuickPopup *popup = window->property("popup").value<QQuickPopup *>();
- QVERIFY(popup);
-
- QQuickPopup *combo = window->property("combo").value<QQuickPopup *>();
- QVERIFY(combo);
-
- menu->open();
- QTRY_COMPARE(menu->isOpened(), true);
- QCOMPARE(popup->isVisible(), false);
- QCOMPARE(combo->isVisible(), false);
-
- // click a menu item to open the popup
- QTest::mouseClick(window, Qt::LeftButton, Qt::NoModifier, QPoint(menu->width() / 2, menu->height() / 2));
- QTRY_COMPARE(menu->isVisible(), false);
- QTRY_COMPARE(popup->isOpened(), true);
- QCOMPARE(combo->isVisible(), false);
-
- combo->open();
- QCOMPARE(menu->isVisible(), false);
- QCOMPARE(popup->isVisible(), true);
- QTRY_COMPARE(combo->isOpened(), true);
-
- // click outside to close both the combo popup and the parent popup
- QTest::mouseClick(window, Qt::LeftButton, Qt::NoModifier, QPoint(window->width() - 1, window->height() - 1));
- QCOMPARE(menu->isVisible(), false);
- QTRY_COMPARE(popup->isVisible(), false);
- QTRY_COMPARE(combo->isVisible(), false);
-
- menu->open();
- QTRY_COMPARE(menu->isOpened(), true);
- QCOMPARE(popup->isVisible(), false);
- QCOMPARE(combo->isVisible(), false);
-
- // click outside the menu to close it (QTBUG-56697)
- QTest::mouseClick(window, Qt::LeftButton, Qt::NoModifier, QPoint(window->width() - 1, window->height() - 1));
- QTRY_COMPARE(menu->isVisible(), false);
- QCOMPARE(popup->isVisible(), false);
- QCOMPARE(combo->isVisible(), false);
-}
-
-void tst_QQuickPopup::cursorShape()
-{
- // Ensure that the mouse cursor has the correct shape when over a popup
- // which is itself over an item with a different shape.
- QQuickApplicationHelper helper(this, QStringLiteral("cursor.qml"));
- QVERIFY2(helper.ready, helper.failureMessage());
- QQuickApplicationWindow *window = helper.appWindow;
- centerOnScreen(window);
- moveMouseAway(window);
- window->show();
- QVERIFY(QTest::qWaitForWindowExposed(window));
-
- QQuickPopup *popup = helper.appWindow->property("popup").value<QQuickPopup*>();
- QVERIFY(popup);
-
- popup->open();
- QVERIFY(popup->isVisible());
- QTRY_VERIFY(popup->isOpened());
-
- QQuickItem *textField = helper.appWindow->property("textField").value<QQuickItem*>();
- QVERIFY(textField);
-
- // Move the mouse over the text field.
- const QPoint textFieldPos(popup->x() - 10, textField->height() / 2);
- QVERIFY(textField->contains(textField->mapFromScene(textFieldPos)));
- QTest::mouseMove(window, textFieldPos);
- QTRY_COMPARE(window->cursor().shape(), textField->cursor().shape());
-
- // Move the mouse over the popup where it overlaps with the text field.
- const QPoint textFieldOverlapPos(popup->x() + 10, textField->height() / 2);
- QTest::mouseMove(window, textFieldOverlapPos);
- QTRY_COMPARE(window->cursor().shape(), popup->popupItem()->cursor().shape());
-
- popup->close();
- QTRY_VERIFY(!popup->isVisible());
-}
-
-class FriendlyPopup : public QQuickPopup
-{
- friend class tst_QQuickPopup;
-};
-
-void tst_QQuickPopup::componentComplete()
-{
- FriendlyPopup cppPopup;
- QVERIFY(cppPopup.isComponentComplete());
-
- QQmlEngine engine;
- QQmlComponent component(&engine);
- component.setData("import QtQuick.Controls; Popup { }", QUrl());
-
- QScopedPointer<QObject> o(component.beginCreate(engine.rootContext()));
- FriendlyPopup *qmlPopup = static_cast<FriendlyPopup *>(o.data());
- QVERIFY(qmlPopup);
- QVERIFY(!qmlPopup->isComponentComplete());
-
- component.completeCreate();
- QVERIFY(qmlPopup->isComponentComplete());
-}
-
-void tst_QQuickPopup::closeOnEscapeWithNestedPopups()
-{
- // Tests the scenario in the Gallery example, where there are nested popups that should
- // close in the correct order when the Escape key is pressed.
- QQuickApplicationHelper helper(this, QStringLiteral("closeOnEscapeWithNestedPopups.qml"));
- QVERIFY2(helper.ready, helper.failureMessage());
- QQuickApplicationWindow *window = helper.appWindow;
- window->show();
- QVERIFY(QTest::qWaitForWindowExposed(window));
-
- // The stack view should have two items, and it should pop the second when escape is pressed
- // and it has focus.
- QQuickStackView *stackView = window->findChild<QQuickStackView*>("stackView");
- QVERIFY(stackView);
- QCOMPARE(stackView->depth(), 2);
-
- QQuickItem *optionsToolButton = window->findChild<QQuickItem*>("optionsToolButton");
- QVERIFY(optionsToolButton);
-
- // Click on the options tool button. The settings menu should pop up.
- const QPoint optionsToolButtonCenter = optionsToolButton->mapToScene(
- QPointF(optionsToolButton->width() / 2, optionsToolButton->height() / 2)).toPoint();
- QTest::mouseClick(window, Qt::LeftButton, Qt::NoModifier, optionsToolButtonCenter);
-
- QQuickPopup *optionsMenu = window->findChild<QQuickPopup*>("optionsMenu");
- QVERIFY(optionsMenu);
- QTRY_VERIFY(optionsMenu->isOpened());
-
- QQuickItem *settingsMenuItem = window->findChild<QQuickItem*>("settingsMenuItem");
- QVERIFY(settingsMenuItem);
-
- // Click on the settings menu item. The settings dialog should pop up.
- const QPoint settingsMenuItemCenter = settingsMenuItem->mapToScene(
- QPointF(settingsMenuItem->width() / 2, settingsMenuItem->height() / 2)).toPoint();
- QTest::mouseClick(window, Qt::LeftButton, Qt::NoModifier, settingsMenuItemCenter);
-
- QQuickPopup *settingsDialog = window->contentItem()->findChild<QQuickPopup*>("settingsDialog");
- QVERIFY(settingsDialog);
- QTRY_VERIFY(settingsDialog->isOpened());
-
- QQuickComboBox *comboBox = window->contentItem()->findChild<QQuickComboBox*>("comboBox");
- QVERIFY(comboBox);
-
- // Click on the combo box button. The combo box popup should pop up.
- const QPoint comboBoxCenter = comboBox->mapToScene(
- QPointF(comboBox->width() / 2, comboBox->height() / 2)).toPoint();
- QTest::mouseClick(window, Qt::LeftButton, Qt::NoModifier, comboBoxCenter);
- QTRY_VERIFY(comboBox->popup()->isOpened());
-
- // Close the combo box popup with the escape key. The settings dialog should still be visible.
- QTest::keyClick(window, Qt::Key_Escape);
- QTRY_VERIFY(!comboBox->popup()->isVisible());
- QVERIFY(settingsDialog->isVisible());
-
- // Close the settings dialog with the escape key.
- QTest::keyClick(window, Qt::Key_Escape);
- QTRY_VERIFY(!settingsDialog->isVisible());
-
- // The stack view should still have two items.
- QCOMPARE(stackView->depth(), 2);
-
- // Remove one by pressing the Escape key (the Shortcut should be activated).
- QTest::keyClick(window, Qt::Key_Escape);
- QCOMPARE(stackView->depth(), 1);
-}
-
-void tst_QQuickPopup::closeOnEscapeWithVisiblePopup()
-{
- QQuickApplicationHelper helper(this, QStringLiteral("closeOnEscapeWithVisiblePopup.qml"));
- QVERIFY2(helper.ready, helper.failureMessage());
- QQuickWindow *window = helper.window;
- window->show();
- QVERIFY(QTest::qWaitForWindowActive(window));
-
- QQuickPopup *popup = window->findChild<QQuickPopup *>("popup");
- QVERIFY(popup);
- QTRY_VERIFY(popup->isOpened());
-
- QTRY_VERIFY(window->activeFocusItem());
- QTest::keyClick(window, Qt::Key_Escape);
- QTRY_VERIFY(!popup->isVisible());
-}
-
-void tst_QQuickPopup::enabled()
-{
- QQuickPopup popup;
- QVERIFY(popup.isEnabled());
- QVERIFY(popup.popupItem()->isEnabled());
-
- QSignalSpy enabledSpy(&popup, &QQuickPopup::enabledChanged);
- QVERIFY(enabledSpy.isValid());
-
- popup.setEnabled(false);
- QVERIFY(!popup.isEnabled());
- QVERIFY(!popup.popupItem()->isEnabled());
- QCOMPARE(enabledSpy.count(), 1);
-
- popup.popupItem()->setEnabled(true);
- QVERIFY(popup.isEnabled());
- QVERIFY(popup.popupItem()->isEnabled());
- QCOMPARE(enabledSpy.count(), 2);
-}
-
-void tst_QQuickPopup::orientation_data()
-{
- QTest::addColumn<Qt::ScreenOrientation>("orientation");
- QTest::addColumn<QPointF>("position");
-
- QTest::newRow("Portrait") << Qt::PortraitOrientation << QPointF(330, 165);
- QTest::newRow("Landscape") << Qt::LandscapeOrientation << QPointF(165, 270);
- QTest::newRow("InvertedPortrait") << Qt::InvertedPortraitOrientation << QPointF(270, 135);
- QTest::newRow("InvertedLandscape") << Qt::InvertedLandscapeOrientation << QPointF(135, 330);
-}
-
-void tst_QQuickPopup::orientation()
-{
- QFETCH(Qt::ScreenOrientation, orientation);
- QFETCH(QPointF, position);
-
- QQuickApplicationHelper helper(this, "orientation.qml");
- QVERIFY2(helper.ready, helper.failureMessage());
-
- QQuickWindow *window = helper.window;
- window->reportContentOrientationChange(orientation);
- window->show();
- QVERIFY(QTest::qWaitForWindowActive(window));
-
- QQuickPopup *popup = window->property("popup").value<QQuickPopup*>();
- QVERIFY(popup);
- popup->open();
- QTRY_VERIFY(popup->isOpened());
- QCOMPARE(popup->popupItem()->position(), position);
-}
-
-void tst_QQuickPopup::qquickview()
-{
- QQuickView view;
- view.setObjectName("QQuickView");
- view.resize(400, 400);
- view.setSource(testFileUrl("dialog.qml"));
- QVERIFY(view.status() != QQuickView::Error);
- view.contentItem()->setObjectName("QQuickViewContentItem");
- view.show();
-
- QQuickDialog *dialog = view.rootObject()->property("dialog").value<QQuickDialog*>();
- QVERIFY(dialog);
- QTRY_COMPARE(dialog->property("opened").toBool(), true);
-
- dialog->close();
- QTRY_COMPARE(dialog->property("visible").toBool(), false);
-
- // QTBUG-72746: shouldn't crash on application exit after closing a Dialog when using QQuickView.
-}
-
-// TODO: also test it out without setting enabled directly on menu, but on a parent
-
-// QTBUG-73447
-void tst_QQuickPopup::disabledPalette()
-{
- QQuickApplicationHelper helper(this, "disabledPalette.qml");
- QVERIFY2(helper.ready, helper.failureMessage());
-
- QQuickWindow *window = helper.window;
- window->show();
- QVERIFY(QTest::qWaitForWindowActive(window));
-
- QQuickPopup *popup = window->property("popup").value<QQuickPopup*>();
- QVERIFY(popup);
-
- QSignalSpy popupEnabledSpy(popup, &QQuickPopup::enabledChanged);
- QVERIFY(popupEnabledSpy.isValid());
- QSignalSpy popupPaletteSpy(popup, &QQuickPopup::paletteChanged);
- QVERIFY(popupPaletteSpy.isValid());
-
- QSignalSpy popupItemEnabledSpy(popup->popupItem(), &QQuickItem::enabledChanged);
- QVERIFY(popupItemEnabledSpy.isValid());
- QSignalSpy popupItemPaletteSpy(popup->popupItem(), &QQuickItem::paletteChanged);
- QVERIFY(popupItemPaletteSpy.isValid());
-
- auto palette = QQuickPopupPrivate::get(popup)->palette();
- palette->setBase(Qt::green);
- palette->disabled()->setBase(Qt::red);
- QCOMPARE(popupPaletteSpy.count(), 2);
- QCOMPARE(popupItemPaletteSpy.count(), 2);
- QCOMPARE(popup->background()->property("color").value<QColor>(), Qt::green);
-
- popup->setEnabled(false);
- QCOMPARE(popupEnabledSpy.count(), 1);
- QCOMPARE(popupItemEnabledSpy.count(), 1);
- QCOMPARE(popupPaletteSpy.count(), 3);
- QCOMPARE(popupItemPaletteSpy.count(), 3);
- QCOMPARE(popup->background()->property("color").value<QColor>(), Qt::red);
-}
-
-void tst_QQuickPopup::disabledParentPalette()
-{
- QQuickApplicationHelper helper(this, "disabledPalette.qml");
- QVERIFY2(helper.ready, helper.failureMessage());
-
- QQuickWindow *window = helper.window;
- window->show();
- QVERIFY(QTest::qWaitForWindowActive(window));
-
- QQuickPopup *popup = window->property("popup").value<QQuickPopup*>();
- QVERIFY(popup);
-
- QSignalSpy popupEnabledSpy(popup, SIGNAL(enabledChanged()));
- QVERIFY(popupEnabledSpy.isValid());
- QSignalSpy popupPaletteSpy(popup, SIGNAL(paletteChanged()));
- QVERIFY(popupPaletteSpy.isValid());
-
- QSignalSpy popupItemEnabledSpy(popup->popupItem(), SIGNAL(enabledChanged()));
- QVERIFY(popupItemEnabledSpy.isValid());
- QSignalSpy popupItemPaletteSpy(popup->popupItem(), SIGNAL(paletteChanged()));
- QVERIFY(popupItemPaletteSpy.isValid());
-
- auto palette = QQuickPopupPrivate::get(popup)->palette();
- palette->setBase(Qt::green);
- palette->disabled()->setBase(Qt::red);
- QCOMPARE(popupPaletteSpy.count(), 2);
- QCOMPARE(popupItemPaletteSpy.count(), 2);
- QCOMPARE(popup->background()->property("color").value<QColor>(), Qt::green);
-
- // Disable the overlay (which is QQuickPopupItem's parent) to ensure that
- // the palette is changed when the popup is indirectly disabled.
- popup->open();
- QTRY_VERIFY(popup->isOpened());
- QVERIFY(QMetaObject::invokeMethod(window, "disableOverlay"));
- QVERIFY(!popup->isEnabled());
- QVERIFY(!popup->popupItem()->isEnabled());
- QCOMPARE(popup->background()->property("color").value<QColor>(), Qt::red);
- QCOMPARE(popupEnabledSpy.count(), 1);
- QCOMPARE(popupItemEnabledSpy.count(), 1);
- QCOMPARE(popupPaletteSpy.count(), 3);
- QCOMPARE(popupItemPaletteSpy.count(), 3);
-
- popup->close();
- QTRY_VERIFY(!popup->isVisible());
-}
-
-void tst_QQuickPopup::countChanged()
-{
- QQuickApplicationHelper helper(this, "countChanged.qml");
- QVERIFY2(helper.ready, helper.failureMessage());
-
- QQuickWindow *window = helper.window;
- window->show();
- QVERIFY(QTest::qWaitForWindowActive(window));
-
- QQuickComboBox *comboBox = window->property("comboBox").value<QQuickComboBox*>();
- QVERIFY(comboBox);
- QCOMPARE(window->property("count").toInt(), 1);
-
- QVERIFY(window->setProperty("isModel1", false));
- QTRY_COMPARE(window->property("count").toInt(), 2);
-}
-
-// QTBUG-73243
-void tst_QQuickPopup::toolTipCrashOnClose()
-{
- if (QOperatingSystemVersion::current() <= QOperatingSystemVersion::Windows7)
- QSKIP("Test requires a version of Windows newer than 7: QTBUG-84443");
- if (!canImportModule("import QtGraphicalEffects; DropShadow {}"))
- QSKIP("Test requires QtGraphicalEffects");
-
- QQuickApplicationHelper helper(this, "toolTipCrashOnClose.qml");
- QVERIFY2(helper.ready, helper.failureMessage());
-
- QQuickWindow *window = helper.window;
- window->show();
- QVERIFY(QTest::qWaitForWindowActive(window));
-
- QTest::mouseMove(window, QPoint(window->width() / 2, window->height() / 2));
- QTRY_VERIFY(window->property("toolTipOpened").toBool());
-
- QVERIFY(window->close());
- // Shouldn't crash.
-}
-
-void tst_QQuickPopup::setOverlayParentToNull()
-{
- if (QOperatingSystemVersion::current() <= QOperatingSystemVersion::Windows7)
- QSKIP("Test requires a version of Windows newer than 7: QTBUG-84443");
- if (!canImportModule("import QtGraphicalEffects; DropShadow {}"))
- QSKIP("Test requires QtGraphicalEffects");
-
- QQuickApplicationHelper helper(this, "toolTipCrashOnClose.qml");
- QVERIFY2(helper.ready, helper.failureMessage());
-
- QQuickWindow *window = helper.window;
- centerOnScreen(window);
- moveMouseAway(window);
- window->show();
- QVERIFY(QTest::qWaitForWindowActive(window));
-
- QVERIFY(QMetaObject::invokeMethod(window, "nullifyOverlayParent"));
-
- QTest::mouseMove(window, QPoint(window->width() / 2, window->height() / 2));
- QTRY_VERIFY(window->property("toolTipOpened").toBool());
-
- QVERIFY(window->close());
- // While nullifying the overlay parent doesn't make much sense, it shouldn't crash.
-}
-
-void tst_QQuickPopup::tabFence()
-{
- if (QGuiApplication::styleHints()->tabFocusBehavior() != Qt::TabFocusAllControls)
- QSKIP("This platform only allows tab focus for text controls");
-
- QQuickApplicationHelper helper(this, "tabFence.qml");
- QVERIFY2(helper.ready, helper.failureMessage());
-
- QQuickWindow *window = helper.window;
- window->show();
- QVERIFY(QTest::qWaitForWindowActive(window));
-
- QQuickPopup *popup = window->property("dialog").value<QQuickPopup*>();
- QVERIFY(popup);
- popup->setModal(true);
- popup->open();
- QTRY_VERIFY(popup->isOpened());
-
- QQuickButton *outsideButton1 = window->property("outsideButton1").value<QQuickButton*>();
- QVERIFY(outsideButton1);
- QQuickButton *outsideButton2 = window->property("outsideButton2").value<QQuickButton*>();
- QVERIFY(outsideButton2);
- QQuickButton *dialogButton1 = window->property("dialogButton1").value<QQuickButton*>();
- QVERIFY(dialogButton1);
- QQuickButton *dialogButton2 = window->property("dialogButton2").value<QQuickButton*>();
- QVERIFY(dialogButton2);
-
- // When modal, focus loops between the two external buttons
- outsideButton1->forceActiveFocus();
- QVERIFY(outsideButton1->hasActiveFocus());
- QTest::keyClick(window, Qt::Key_Tab);
- QVERIFY(outsideButton2->hasActiveFocus());
- QTest::keyClick(window, Qt::Key_Tab);
- QVERIFY(outsideButton1->hasActiveFocus());
-
- // Same thing for dialog's buttons
- dialogButton1->forceActiveFocus();
- QVERIFY(dialogButton1->hasActiveFocus());
- QTest::keyClick(window, Qt::Key_Tab);
- QVERIFY(dialogButton2->hasActiveFocus());
- QTest::keyClick(window, Qt::Key_Tab);
- QVERIFY(dialogButton1->hasActiveFocus());
-
- popup->setModal(false);
-
- // When not modal, focus goes in and out of the dialog
- outsideButton1->forceActiveFocus();
- QVERIFY(outsideButton1->hasActiveFocus());
- QTest::keyClick(window, Qt::Key_Tab);
- QVERIFY(outsideButton2->hasActiveFocus());
- QTest::keyClick(window, Qt::Key_Tab);
- QVERIFY(dialogButton1->hasActiveFocus());
- QTest::keyClick(window, Qt::Key_Tab);
- QVERIFY(dialogButton2->hasActiveFocus());
- QTest::keyClick(window, Qt::Key_Tab);
- QVERIFY(outsideButton1->hasActiveFocus());
-}
-
-void tst_QQuickPopup::invisibleToolTipOpen()
-{
- QQuickApplicationHelper helper(this, "invisibleToolTipOpen.qml");
- QVERIFY2(helper.ready, helper.failureMessage());
-
- QQuickWindow *window = helper.window;
- centerOnScreen(window);
- moveMouseAway(window);
- window->show();
- QVERIFY(QTest::qWaitForWindowActive(window));
-
- QQuickItem *mouseArea = qvariant_cast<QQuickItem *>(window->property("mouseArea"));
- QVERIFY(mouseArea);
- auto toolTipAttached = qobject_cast<QQuickToolTipAttached*>(
- qmlAttachedPropertiesObject<QQuickToolTip>(mouseArea, false));
- QVERIFY(toolTipAttached);
- QQuickPopup *toolTip = toolTipAttached->toolTip();
- QVERIFY(toolTip);
- QObject *loader = qvariant_cast<QObject *>(window->property("loader"));
- QVERIFY(loader);
-
- // Send an extra move event, otherwise the test fails on subsequent runs for different styles for some reason...
- // As an added bonus, this is also slightly more realistic. :D
- QTest::mouseMove(window, QPoint(mouseArea->width() / 2 - 1, mouseArea->height() / 2 - 1));
- QTest::mouseMove(window, QPoint(mouseArea->width() / 2, mouseArea->height() / 2));
- QTRY_VERIFY(toolTip->isOpened());
-
- QSignalSpy componentLoadedSpy(loader, SIGNAL(loaded()));
- QVERIFY(componentLoadedSpy.isValid());
-
- loader->setProperty("active", true);
- QTRY_COMPARE(componentLoadedSpy.count(), 1);
-
- QTRY_VERIFY(toolTip->isVisible());
-}
-
-void tst_QQuickPopup::centerInOverlayWithinStackViewItem()
-{
- QQuickApplicationHelper helper(this, "centerInOverlayWithinStackViewItem.qml");
- QVERIFY2(helper.ready, helper.failureMessage());
-
- QQuickWindow *window = helper.window;
- window->show();
- QVERIFY(QTest::qWaitForWindowExposed(window));
-
- QQuickPopup *popup = window->property("popup").value<QQuickPopup*>();
- QVERIFY(popup);
- QTRY_COMPARE(popup->isVisible(), true);
-
- // Shouldn't crash on exit.
-}
-
-void tst_QQuickPopup::destroyDuringExitTransition()
-{
- QQuickApplicationHelper helper(this, "destroyDuringExitTransition.qml");
- QVERIFY2(helper.ready, helper.failureMessage());
-
- QQuickWindow *window = helper.window;
- window->show();
- QVERIFY(QTest::qWaitForWindowActive(window));
-
- {
- QPointer<QQuickPopup> dialog2 = window->property("dialog2").value<QQuickPopup*>();
- QVERIFY(dialog2);
- QTRY_COMPARE(dialog2->isOpened(), true);
-
- // Close the second dialog, destroying it before its exit transition can finish.
- QTest::keyClick(window, Qt::Key_Escape);
- QTRY_VERIFY(!dialog2);
- }
-
- // Events should go through to the dialog underneath.
- QQuickPopup *dialog1 = window->property("dialog1").value<QQuickPopup*>();
- QVERIFY(dialog1);
- QTRY_COMPARE(dialog1->isOpened(), true);
- QQuickButton *button = dialog1->property("button").value<QQuickButton*>();
- QVERIFY(button);
- const auto buttonClickPos = button->mapToScene(QPointF(button->width() / 2, button->height() / 2)).toPoint();
- QTest::mousePress(window, Qt::LeftButton, Qt::NoModifier, buttonClickPos);
- QVERIFY(button->isDown());
- QTest::mouseRelease(window, Qt::LeftButton, Qt::NoModifier, buttonClickPos);
- QVERIFY(!button->isDown());
-}
-
-QTEST_QUICKCONTROLS_MAIN(tst_QQuickPopup)
-
-#include "tst_qquickpopup.moc"