aboutsummaryrefslogtreecommitdiffstats
path: root/tests/auto
diff options
context:
space:
mode:
authorGabriel de Dietrich <gabriel.dedietrich@theqtcompany.com>2015-07-02 18:20:41 +0200
committerGabriel de Dietrich <gabriel.dedietrich@theqtcompany.com>2015-08-21 12:43:30 +0000
commit6328dd2d2743ed540efea89742261f24552d7611 (patch)
tree89434d52f1fe4b8bccebcba153e63f58e22ecf93 /tests/auto
parent80ff6ded28ea40dd4d017f2406743e5dc35d87ac (diff)
Add isTabFence private flag
When an item has this flag set, the user can't tab-navigate either out of it, or enter it. We use this flag to implement QQuickPanel as an item for platforms that only support one single top-level window. Change-Id: I1f4313912ae1c70217af0d4d21064932b50a9438 Reviewed-by: Mitch Curtis <mitch.curtis@theqtcompany.com>
Diffstat (limited to 'tests/auto')
-rw-r--r--tests/auto/quick/qquickitem2/data/tabFence.qml49
-rw-r--r--tests/auto/quick/qquickitem2/tst_qquickitem.cpp72
2 files changed, 121 insertions, 0 deletions
diff --git a/tests/auto/quick/qquickitem2/data/tabFence.qml b/tests/auto/quick/qquickitem2/data/tabFence.qml
new file mode 100644
index 0000000000..fcf69b418b
--- /dev/null
+++ b/tests/auto/quick/qquickitem2/data/tabFence.qml
@@ -0,0 +1,49 @@
+import QtQuick 2.1
+import Test 1.0
+
+Item {
+ objectName: "root"
+ focus: true
+ width: 800
+ height: 600
+
+ TabFence {
+ objectName: "fence1"
+
+ TextInput {
+ objectName: "input11"
+ activeFocusOnTab: true
+ }
+ TextInput {
+ objectName: "input12"
+ activeFocusOnTab: true
+ }
+ TextInput {
+ objectName: "input13"
+ activeFocusOnTab: true
+ }
+ }
+
+ TextInput {
+ objectName: "input1"
+ activeFocusOnTab: true
+ }
+
+ TextInput {
+ objectName: "input2"
+ activeFocusOnTab: true
+ }
+
+ TabFence {
+ objectName: "fence2"
+ }
+
+ TextInput {
+ objectName: "input3"
+ activeFocusOnTab: true
+ }
+
+ TabFence {
+ objectName: "fence3"
+ }
+}
diff --git a/tests/auto/quick/qquickitem2/tst_qquickitem.cpp b/tests/auto/quick/qquickitem2/tst_qquickitem.cpp
index 396f183860..9f3de8292f 100644
--- a/tests/auto/quick/qquickitem2/tst_qquickitem.cpp
+++ b/tests/auto/quick/qquickitem2/tst_qquickitem.cpp
@@ -73,6 +73,8 @@ private slots:
void nextItemInFocusChain2();
void nextItemInFocusChain3();
+ void tabFence();
+
void keys();
void standardKeys_data();
void standardKeys();
@@ -289,6 +291,20 @@ private:
QML_DECLARE_TYPE(HollowTestItem);
+class TabFenceItem : public QQuickItem
+{
+ Q_OBJECT
+
+public:
+ TabFenceItem(QQuickItem *parent = Q_NULLPTR)
+ : QQuickItem(parent)
+ {
+ QQuickItemPrivate *d = QQuickItemPrivate::get(this);
+ d->isTabFence = true;
+ }
+};
+
+QML_DECLARE_TYPE(TabFenceItem);
tst_QQuickItem::tst_QQuickItem()
{
@@ -299,6 +315,7 @@ void tst_QQuickItem::initTestCase()
QQmlDataTest::initTestCase();
qmlRegisterType<KeyTestItem>("Test",1,0,"KeyTestItem");
qmlRegisterType<HollowTestItem>("Test", 1, 0, "HollowTestItem");
+ qmlRegisterType<TabFenceItem>("Test", 1, 0, "TabFence");
}
void tst_QQuickItem::cleanup()
@@ -1120,6 +1137,61 @@ void tst_QQuickItem::nextItemInFocusChain3()
QCOMPARE(QGuiApplication::focusWindow(), window);
}
+void verifyTabFocusChain(QQuickView *window, const char **focusChain, bool forward)
+{
+ int idx = 0;
+ for (const char **objectName = focusChain; *objectName; ++objectName, ++idx) {
+ const QString &descrStr = QString("idx=%1 objectName=\"%2\"").arg(idx).arg(*objectName);
+ const char *descr = descrStr.toLocal8Bit().data();
+ QKeyEvent key(QEvent::KeyPress, Qt::Key_Tab, forward ? Qt::NoModifier : Qt::ShiftModifier);
+ QGuiApplication::sendEvent(window, &key);
+ QVERIFY2(key.isAccepted(), descr);
+
+ QQuickItem *item = findItem<QQuickItem>(window->rootObject(), *objectName);
+ QVERIFY2(item, descr);
+ QVERIFY2(item->hasActiveFocus(), descr);
+ }
+}
+
+void tst_QQuickItem::tabFence()
+{
+ QQuickView *window = new QQuickView(0);
+ window->setBaseSize(QSize(800,600));
+
+ window->setSource(testFileUrl("tabFence.qml"));
+ window->show();
+ window->requestActivate();
+ QVERIFY(QTest::qWaitForWindowActive(window));
+ QVERIFY(QGuiApplication::focusWindow() == window);
+ QVERIFY(window->rootObject()->hasActiveFocus());
+
+ const char *rootTabFocusChain[] = {
+ "input1", "input2", "input3", "input1", Q_NULLPTR
+ };
+ verifyTabFocusChain(window, rootTabFocusChain, true /* forward */);
+
+ const char *rootBacktabFocusChain[] = {
+ "input3", "input2", "input1", "input3", Q_NULLPTR
+ };
+ verifyTabFocusChain(window, rootBacktabFocusChain, false /* forward */);
+
+ // Give focus to input11 in fence1
+ QQuickItem *item = findItem<QQuickItem>(window->rootObject(), "input11");
+ item->setFocus(true);
+ QVERIFY(item);
+ QVERIFY(item->hasActiveFocus());
+
+ const char *fence1TabFocusChain[] = {
+ "input12", "input13", "input11", "input12", Q_NULLPTR
+ };
+ verifyTabFocusChain(window, fence1TabFocusChain, true /* forward */);
+
+ const char *fence1BacktabFocusChain[] = {
+ "input11", "input13", "input12", "input11", Q_NULLPTR
+ };
+ verifyTabFocusChain(window, fence1BacktabFocusChain, false /* forward */);
+}
+
void tst_QQuickItem::keys()
{
QQuickView *window = new QQuickView(0);