aboutsummaryrefslogtreecommitdiffstats
path: root/tests/auto/quick/qquickitem
diff options
context:
space:
mode:
authorAndrew den Exter <andrew.den-exter@nokia.com>2012-03-28 18:11:14 +1000
committerQt by Nokia <qt-info@nokia.com>2012-03-30 07:53:56 +0200
commitd2447feece42859011d7995dff5614f3d1758e64 (patch)
tree3fa93f7829051210927d2d09f6b05e47aac025fe /tests/auto/quick/qquickitem
parent2ab873ed5fbb43404f119ef05b412485665a975f (diff)
Fix forceActiveFocus() with multiple items having focus: true
Ensure focus is cleared from an item if it is parented to an item that already has a sub focus item. Checking scopedFocusItem() didn't allow for the case where an unparented item is the root of the focus tree but not itself a focus scope, checking the unguarded subFocusItem member will. Change-Id: I482779e8077e9f282d22bd0090e669840764e52a Reviewed-by: Bea Lam <bea.lam@nokia.com>
Diffstat (limited to 'tests/auto/quick/qquickitem')
-rw-r--r--tests/auto/quick/qquickitem/data/focusSubItemInNonFocusScope.qml23
-rw-r--r--tests/auto/quick/qquickitem/tst_qquickitem.cpp101
2 files changed, 124 insertions, 0 deletions
diff --git a/tests/auto/quick/qquickitem/data/focusSubItemInNonFocusScope.qml b/tests/auto/quick/qquickitem/data/focusSubItemInNonFocusScope.qml
new file mode 100644
index 0000000000..0e50710717
--- /dev/null
+++ b/tests/auto/quick/qquickitem/data/focusSubItemInNonFocusScope.qml
@@ -0,0 +1,23 @@
+import QtQuick 2.0
+
+Rectangle {
+ width: 400; height: 400
+
+ FocusScope {
+ width: 400; height: 400
+ focus: true
+ Item {
+ width: 400; height: 400
+ Item {
+ id: dummy
+ objectName: "dummyItem"
+ focus: true
+ }
+ TextInput {
+ id: ti
+ objectName: "textInput"
+ focus: true
+ }
+ }
+ }
+}
diff --git a/tests/auto/quick/qquickitem/tst_qquickitem.cpp b/tests/auto/quick/qquickitem/tst_qquickitem.cpp
index abd0da8ac1..79183f5b3d 100644
--- a/tests/auto/quick/qquickitem/tst_qquickitem.cpp
+++ b/tests/auto/quick/qquickitem/tst_qquickitem.cpp
@@ -139,6 +139,8 @@ private slots:
void addedToCanvas();
void changeParent();
void multipleFocusClears();
+ void focusSubItemInNonFocusScope();
+ void parentItemWithFocus();
void constructor();
void setParentItem();
@@ -720,6 +722,105 @@ void tst_qquickitem::multipleFocusClears()
QTRY_VERIFY(QGuiApplication::focusWindow() == view);
}
+void tst_qquickitem::focusSubItemInNonFocusScope()
+{
+ QQuickView *view = new QQuickView;
+ view->setSource(testFileUrl("focusSubItemInNonFocusScope.qml"));
+ view->show();
+ qApp->processEvents();
+
+ QQuickItem *dummyItem = view->rootObject()->findChild<QQuickItem *>("dummyItem");
+ QVERIFY(dummyItem);
+
+ QQuickItem *textInput = view->rootObject()->findChild<QQuickItem *>("textInput");
+ QVERIFY(textInput);
+
+ QVERIFY(dummyItem->hasFocus());
+ QVERIFY(!textInput->hasFocus());
+ QVERIFY(dummyItem->hasActiveFocus());
+
+ QVERIFY(QMetaObject::invokeMethod(textInput, "forceActiveFocus"));
+
+ QVERIFY(!dummyItem->hasFocus());
+ QVERIFY(textInput->hasFocus());
+ QVERIFY(textInput->hasActiveFocus());
+
+ delete view;
+}
+
+void tst_qquickitem::parentItemWithFocus()
+{
+ QQuickCanvas canvas;
+ ensureFocus(&canvas);
+ QTRY_VERIFY(QGuiApplication::focusWindow() == &canvas);
+ {
+ QQuickItem parent;
+ QQuickItem child;
+
+ FocusState focusState;
+ focusState << &parent << &child;
+ FVERIFY();
+
+ parent.setFocus(true);
+ child.setFocus(true);
+ focusState[&parent].set(true, false);
+ focusState[&child].set(true, false);
+ FVERIFY();
+
+ child.setParentItem(&parent);
+ focusState[&parent].set(true, false);
+ focusState[&child].set(false, false);
+ FVERIFY();
+
+ parent.setParentItem(canvas.rootItem());
+ focusState[&parent].set(true, true);
+ focusState[&child].set(false, false);
+ focusState.active(&parent);
+ FVERIFY();
+
+ child.forceActiveFocus();
+ focusState[&parent].set(false, false);
+ focusState[&child].set(true, true);
+ focusState.active(&child);
+ FVERIFY();
+ } {
+ QQuickItem parent;
+ QQuickItem child;
+ QQuickItem grandchild(&child);
+
+ FocusState focusState;
+ focusState << &parent << &child << &grandchild;
+ FVERIFY();
+
+ parent.setFocus(true);
+ grandchild.setFocus(true);
+ focusState[&parent].set(true, false);
+ focusState[&child].set(false, false);
+ focusState[&grandchild].set(true, false);
+ FVERIFY();
+
+ child.setParentItem(&parent);
+ focusState[&parent].set(true, false);
+ focusState[&child].set(false, false);
+ focusState[&grandchild].set(false, false);
+ FVERIFY();
+
+ parent.setParentItem(canvas.rootItem());
+ focusState[&parent].set(true, true);
+ focusState[&child].set(false, false);
+ focusState[&grandchild].set(false, false);
+ focusState.active(&parent);
+ FVERIFY();
+
+ grandchild.forceActiveFocus();
+ focusState[&parent].set(false, false);
+ focusState[&child].set(false, false);
+ focusState[&grandchild].set(true, true);
+ focusState.active(&grandchild);
+ FVERIFY();
+ }
+}
+
void tst_qquickitem::constructor()
{
QQuickItem *root = new QQuickItem;