From 6328dd2d2743ed540efea89742261f24552d7611 Mon Sep 17 00:00:00 2001 From: Gabriel de Dietrich Date: Thu, 2 Jul 2015 18:20:41 +0200 Subject: 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 --- tests/auto/quick/qquickitem2/data/tabFence.qml | 49 +++++++++++++++++ tests/auto/quick/qquickitem2/tst_qquickitem.cpp | 72 +++++++++++++++++++++++++ 2 files changed, 121 insertions(+) create mode 100644 tests/auto/quick/qquickitem2/data/tabFence.qml (limited to 'tests') 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("Test",1,0,"KeyTestItem"); qmlRegisterType("Test", 1, 0, "HollowTestItem"); + qmlRegisterType("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(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(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); -- cgit v1.2.3