From fa6c560882e0fe61a16dcf3347940d1b76c0a678 Mon Sep 17 00:00:00 2001 From: J-P Nurmi Date: Wed, 17 Sep 2014 13:40:25 +0200 Subject: import tst_dialogs from qtdeclarative Change-Id: I3e3ee93de9f89aa2b674ac91f92aae93e3756167 Reviewed-by: Shawn Rutledge --- tests/auto/auto.pro | 2 +- tests/auto/dialogs/data/RectWithFileDialog.qml | 72 ++++++++++++ tests/auto/dialogs/dialogs.pro | 20 ++++ tests/auto/dialogs/tst_dialogs.cpp | 152 +++++++++++++++++++++++++ 4 files changed, 245 insertions(+), 1 deletion(-) create mode 100644 tests/auto/dialogs/data/RectWithFileDialog.qml create mode 100644 tests/auto/dialogs/dialogs.pro create mode 100644 tests/auto/dialogs/tst_dialogs.cpp (limited to 'tests') diff --git a/tests/auto/auto.pro b/tests/auto/auto.pro index 7eba7586..810b4678 100644 --- a/tests/auto/auto.pro +++ b/tests/auto/auto.pro @@ -1,3 +1,3 @@ TEMPLATE = subdirs -SUBDIRS += testplugin controls activeFocusOnTab applicationwindow +SUBDIRS += testplugin controls activeFocusOnTab applicationwindow dialogs controls.depends = testplugin diff --git a/tests/auto/dialogs/data/RectWithFileDialog.qml b/tests/auto/dialogs/data/RectWithFileDialog.qml new file mode 100644 index 00000000..ca4d7944 --- /dev/null +++ b/tests/auto/dialogs/data/RectWithFileDialog.qml @@ -0,0 +1,72 @@ +/**************************************************************************** +** +** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies). +** Contact: http://www.qt-project.org/legal +** +** This file is part of the Qt Quick Controls module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:BSD$ +** You may use this file under the terms of the BSD license as follows: +** +** "Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions are +** met: +** * Redistributions of source code must retain the above copyright +** notice, this list of conditions and the following disclaimer. +** * Redistributions in binary form must reproduce the above copyright +** notice, this list of conditions and the following disclaimer in +** the documentation and/or other materials provided with the +** distribution. +** * Neither the name of Digia Plc and its Subsidiary(-ies) nor the names +** of its contributors may be used to endorse or promote products derived +** from this software without specific prior written permission. +** +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." +** +** $QT_END_LICENSE$ +** +****************************************************************************/ +import QtQuick 2.0 +import QtQuick.Dialogs 1.0 + +Rectangle { + width: 1024 + height: 320 + property alias fileDialog: fileDialog + property alias label: label + property alias mouseArea: mouseArea + + FileDialog { + id: fileDialog + title: "Choose some files" + selectMultiple: true + nameFilters: [ "QML files (*.qml)", "All files (*)" ] + selectedNameFilter: "QML files (*.qml)" + onAccepted: label.text = fileDialog.filePaths + } + + MouseArea { + id: mouseArea + anchors.fill: parent + onClicked: fileDialog.visible = !fileDialog.visible + } + + Text { + id: label + text: "Click to open a file dialog" + wrapMode: Text.Wrap + anchors.fill: parent + anchors.margins: 10 + } +} diff --git a/tests/auto/dialogs/dialogs.pro b/tests/auto/dialogs/dialogs.pro new file mode 100644 index 00000000..cf46bed1 --- /dev/null +++ b/tests/auto/dialogs/dialogs.pro @@ -0,0 +1,20 @@ +CONFIG += testcase +TARGET = tst_dialogs +SOURCES += tst_dialogs.cpp + +include (../shared/util.pri) + +osx:CONFIG -= app_bundle +osx:CONFIG+=insignificant_test # QTBUG-30513 - test is unstable +linux-*:CONFIG+=insignificant_test # QTBUG-30513 - test is unstable +win32:CONFIG+=insignificant_test # QTBUG-30513 - test is unstable + +CONFIG += parallel_test +QT += core-private gui-private qml-private quick-private testlib + +TESTDATA = data/* + +OTHER_FILES += \ + data/RectWithFileDialog.qml + +DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0 diff --git a/tests/auto/dialogs/tst_dialogs.cpp b/tests/auto/dialogs/tst_dialogs.cpp new file mode 100644 index 00000000..34af7e0c --- /dev/null +++ b/tests/auto/dialogs/tst_dialogs.cpp @@ -0,0 +1,152 @@ +/**************************************************************************** +** +** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies). +** Contact: http://www.qt-project.org/legal +** +** This file is part of the Qt Quick Controls module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL21$ +** 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 Digia. For licensing terms and +** conditions see http://qt.digia.com/licensing. For further information +** use the contact form at http://qt.digia.com/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 2.1 or version 3 as published by the Free +** Software Foundation and appearing in the file LICENSE.LGPLv21 and +** LICENSE.LGPLv3 included in the packaging of this file. Please review the +** following information to ensure the GNU Lesser General Public License +** requirements will be met: https://www.gnu.org/licenses/lgpl.html and +** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Digia gives you certain additional +** rights. These rights are described in the Digia Qt LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include +#include "../shared/util.h" +#include +#include +#include + +class tst_dialogs : public QQmlDataTest +{ + Q_OBJECT +public: + +private slots: + void initTestCase() + { + QQmlDataTest::initTestCase(); + } + + // FileDialog + void fileDialogDefaultModality(); + void fileDialogNonModal(); + void fileDialogNameFilters(); + +private: +}; + +void tst_dialogs::fileDialogDefaultModality() +{ + QQuickView *window = new QQuickView; + QScopedPointer cleanup(window); + + window->setSource(testFileUrl("RectWithFileDialog.qml")); + window->setGeometry(240,240,1024,320); + window->show(); + QVERIFY(QTest::qWaitForWindowExposed(window)); + QVERIFY(window->rootObject()); + + // Click to show + QObject *dlg = qvariant_cast(window->rootObject()->property("fileDialog")); + QSignalSpy spyVisibilityChanged(dlg, SIGNAL(visibilityChanged())); + QTest::mouseClick(window, Qt::LeftButton, 0, QPoint(1000, 100)); // show + QTRY_VERIFY(spyVisibilityChanged.count() > 0); + int visibilityChangedCount = spyVisibilityChanged.count(); + // Can't hide by clicking the main window, because dialog is modal. + QTest::mouseClick(window, Qt::LeftButton, 0, QPoint(1000, 100)); + /* + On OS X, if you send an event directly to a window, the modal dialog + doesn't block the event, so the window will process it normally. This + is a different code path compared to having a user click the mouse and + generate a native event; in that case the OS does the filtering itself, + and Qt will not even see the event. But simulating real events in the + test framework is generally unstable. So there isn't a good way to test + modality on OS X. + This test sometimes fails on other platforms too. Maybe it's not reliable + to try to click the main window in a location which is outside the + dialog, without checking or guaranteeing it somehow. + */ + QSKIP("Modality test is flaky in general and doesn't work at all on OS X"); + // So we expect no change in visibility. + QCOMPARE(spyVisibilityChanged.count(), visibilityChangedCount); + + QCOMPARE(dlg->property("visible").toBool(), true); + QMetaObject::invokeMethod(dlg, "close"); + QTRY_VERIFY(spyVisibilityChanged.count() > visibilityChangedCount); + visibilityChangedCount = spyVisibilityChanged.count(); + QCOMPARE(dlg->property("visible").toBool(), false); + QMetaObject::invokeMethod(dlg, "open"); + QTRY_VERIFY(spyVisibilityChanged.count() > visibilityChangedCount); + QCOMPARE(dlg->property("visible").toBool(), true); + QCOMPARE(dlg->property("modality").toInt(), (int)Qt::WindowModal); +} + +void tst_dialogs::fileDialogNonModal() +{ + QQuickView *window = new QQuickView; + QScopedPointer cleanup(window); + + window->setSource(testFileUrl("RectWithFileDialog.qml")); + window->setGeometry(240,240,1024,320); + window->show(); + QVERIFY(QTest::qWaitForWindowExposed(window)); + QVERIFY(window->rootObject()); + + // Click to toggle visibility + QObject *dlg = qvariant_cast(window->rootObject()->property("fileDialog")); + dlg->setProperty("modality", QVariant((int)Qt::NonModal)); + QSignalSpy spyVisibilityChanged(dlg, SIGNAL(visibilityChanged())); + QTest::mouseClick(window, Qt::LeftButton, 0, QPoint(1000, 100)); // show + QTRY_VERIFY(spyVisibilityChanged.count() > 0); + int visibilityChangedCount = spyVisibilityChanged.count(); + QCOMPARE(dlg->property("visible").toBool(), true); + QTest::mouseClick(window, Qt::LeftButton, 0, QPoint(1000, 100)); // hide + QTRY_VERIFY(spyVisibilityChanged.count() > visibilityChangedCount); + QCOMPARE(dlg->property("visible").toBool(), false); + QCOMPARE(dlg->property("modality").toInt(), (int)Qt::NonModal); +} + +void tst_dialogs::fileDialogNameFilters() +{ + QQuickView *window = new QQuickView; + QScopedPointer cleanup(window); + + window->setSource(testFileUrl("RectWithFileDialog.qml")); + window->setGeometry(240,240,1024,320); + window->show(); + QVERIFY(QTest::qWaitForWindowExposed(window)); + QVERIFY(window->rootObject()); + + QObject *dlg = qvariant_cast(window->rootObject()->property("fileDialog")); + QStringList filters; + filters << "QML files (*.qml)"; + filters << "Image files (*.jpg, *.png, *.gif)"; + filters << "All files (*)"; + dlg->setProperty("nameFilters", QVariant(filters)); + QCOMPARE(dlg->property("selectedNameFilter").toString(), filters.first()); +} + +QTEST_MAIN(tst_dialogs) + +#include "tst_dialogs.moc" -- cgit v1.2.1 From 85f57be3a096cc4f580f30e0eb59de3747f3da03 Mon Sep 17 00:00:00 2001 From: Mitch Curtis Date: Wed, 1 Oct 2014 13:41:37 +0200 Subject: ApplicationWindow: top level items must get focus when they ask for it. Currently, the following Item will not receive any key events: import QtQuick 2.2 import QtQuick.Controls 1.2 ApplicationWindow { visible: true width: 200 height: 200 Item { focus: true anchors.fill: parent Keys.onLeftPressed: textItem.text = "Left" Keys.onRightPressed: textItem.text = "Right" Keys.onPressed: { if (event.key === Qt.Key_Home) { textItem.text = "Home"; } else if (event.key === Qt.Key_End) { textItem.text = "End"; } } Text { id: textItem anchors.centerIn: parent } } } Using Window instead of ApplicationWindow does, however. ApplicationWindow can behave the same if we ensure that the panel has focus set to true. When the panel has focus, the contentItem can receive focus. [ChangeLog][ApplicationWindow] Top level items now receive focus when their focus property is set to true, in the same way that top level items of Window do. Change-Id: I16ef1632fc6df1989015e62e8683b6cd7c5be8a6 Reviewed-by: J-P Nurmi Reviewed-by: Liang Qi --- tests/auto/applicationwindow/data/defaultFocus.qml | 52 ++++++++++++++++++++++ .../applicationwindow/tst_applicationwindow.cpp | 29 ++++++++++++ 2 files changed, 81 insertions(+) create mode 100644 tests/auto/applicationwindow/data/defaultFocus.qml (limited to 'tests') diff --git a/tests/auto/applicationwindow/data/defaultFocus.qml b/tests/auto/applicationwindow/data/defaultFocus.qml new file mode 100644 index 00000000..718e809c --- /dev/null +++ b/tests/auto/applicationwindow/data/defaultFocus.qml @@ -0,0 +1,52 @@ +/**************************************************************************** +** +** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies). +** Contact: http://www.qt-project.org/legal +** +** This file is part of the test suite of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL21$ +** 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 Digia. For licensing terms and +** conditions see http://qt.digia.com/licensing. For further information +** use the contact form at http://qt.digia.com/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 2.1 or version 3 as published by the Free +** Software Foundation and appearing in the file LICENSE.LGPLv21 and +** LICENSE.LGPLv3 included in the packaging of this file. Please review the +** following information to ensure the GNU Lesser General Public License +** requirements will be met: https://www.gnu.org/licenses/lgpl.html and +** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Digia gives you certain additional +** rights. These rights are described in the Digia Qt LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +import QtQuick 2.2 +import QtQuick.Controls 1.2 + +ApplicationWindow { + visible: true + width: 200 + height: 200 + + property bool receivedKeyPress: false + + Item { + objectName: "item" + focus: true + anchors.fill: parent + + Keys.onLeftPressed: receivedKeyPress = true + } +} + diff --git a/tests/auto/applicationwindow/tst_applicationwindow.cpp b/tests/auto/applicationwindow/tst_applicationwindow.cpp index c45edfa7..3a12c385 100644 --- a/tests/auto/applicationwindow/tst_applicationwindow.cpp +++ b/tests/auto/applicationwindow/tst_applicationwindow.cpp @@ -52,6 +52,7 @@ private slots: void qmlCreation(); void activeFocusOnTab1(); void activeFocusOnTab2(); + void defaultFocus(); }; void tst_applicationwindow::qmlCreation() @@ -183,6 +184,34 @@ void tst_applicationwindow::activeFocusOnTab2() QVERIFY(item->hasActiveFocus()); } +void tst_applicationwindow::defaultFocus() +{ + QQmlEngine engine; + QQmlComponent component(&engine); + component.loadUrl(testFileUrl("defaultFocus.qml")); + QObject* created = component.create(); + QScopedPointer cleanup(created); + Q_UNUSED(cleanup); + QVERIFY(created); + + QQuickWindow* window = qobject_cast(created); + QVERIFY(window); + window->show(); + window->requestActivate(); + QVERIFY(QTest::qWaitForWindowActive(window)); + QVERIFY(QGuiApplication::focusWindow() == window); + + QQuickItem* contentItem = window->contentItem(); + QVERIFY(contentItem); + QVERIFY(contentItem->hasActiveFocus()); + + // A single item in an ApplicationWindow with focus: true should receive focus. + QQuickItem* item = findItem(window->contentItem(), "item"); + QVERIFY(item); + QVERIFY(item->hasFocus()); + QVERIFY(item->hasActiveFocus()); +} + QTEST_MAIN(tst_applicationwindow) #include "tst_applicationwindow.moc" -- cgit v1.2.1 From 41f0d5b9d931a378af66f735c57753146053664e Mon Sep 17 00:00:00 2001 From: Liang Qi Date: Wed, 24 Sep 2014 13:17:51 +0200 Subject: Controls: Fixed support for Keys attached property on TableView By forwarding key events from the internal control. The key events from internal are Keys.forwardTo TableView, then user could customize their own behavior. Autotest are included. [ChangeLog][TableView] Fixed support for Keys attached property, by forwarding key events from the internal control. Change-Id: Ic59273ae2589bf6d1a0ccf5babf8fd1741376e6c Reviewed-by: J-P Nurmi --- tests/auto/controls/data/tableview/tv_keys.qml | 60 ++++++++++++++++++++++++++ tests/auto/controls/data/tst_tableview.qml | 31 +++++++++++++ 2 files changed, 91 insertions(+) create mode 100644 tests/auto/controls/data/tableview/tv_keys.qml (limited to 'tests') diff --git a/tests/auto/controls/data/tableview/tv_keys.qml b/tests/auto/controls/data/tableview/tv_keys.qml new file mode 100644 index 00000000..2102f55c --- /dev/null +++ b/tests/auto/controls/data/tableview/tv_keys.qml @@ -0,0 +1,60 @@ +/**************************************************************************** +** +** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies). +** Contact: http://www.qt-project.org/legal +** +** This file is part of the Qt Quick Controls module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:BSD$ +** You may use this file under the terms of the BSD license as follows: +** +** "Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions are +** met: +** * Redistributions of source code must retain the above copyright +** notice, this list of conditions and the following disclaimer. +** * Redistributions in binary form must reproduce the above copyright +** notice, this list of conditions and the following disclaimer in +** the documentation and/or other materials provided with the +** distribution. +** * Neither the name of Digia Plc and its Subsidiary(-ies) nor the names +** of its contributors may be used to endorse or promote products derived +** from this software without specific prior written permission. +** +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +import QtQuick 2.2 +import QtQuick.Controls 1.2 + +Row { + width: 100 + height: 50 + spacing: 10 + property alias control1: _control1 + TableView { + id: _control1 + property bool gotit: false + Keys.onPressed: { + if ((!gotit) && (event.key === Qt.Key_Down)) { + gotit = true; + event.accepted = true; + return; + } + } + } +} diff --git a/tests/auto/controls/data/tst_tableview.qml b/tests/auto/controls/data/tst_tableview.qml index b802e7ff..9e37f45e 100644 --- a/tests/auto/controls/data/tst_tableview.qml +++ b/tests/auto/controls/data/tst_tableview.qml @@ -179,6 +179,37 @@ TestCase { table.destroy() } + function test_keys() { + var component = Qt.createComponent("tableview/tv_keys.qml") + compare(component.status, Component.Ready) + var test = component.createObject(container); + verify(test !== null, "test control created is null") + var control1 = test.control1 + verify(control1 !== null) + + control1.forceActiveFocus() + verify(control1.activeFocus) + + control1.selectionMode = SelectionMode.SingleSelection + control1.model = 3 + control1.currentRow = -1 + + verify(control1.gotit === false) + verify(control1.currentRow === -1) + + keyClick(Qt.Key_Down); + verify(control1.activeFocus) + verify(control1.gotit === true) + verify(control1.currentRow === -1) + + keyClick(Qt.Key_Down); + verify(control1.activeFocus) + verify(control1.gotit === true) + verify(control1.currentRow === 0) + + test.destroy() + } + function test_selection() { var component = Qt.createComponent("tableview/table2_qabstractitemmodel.qml") -- cgit v1.2.1