summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAndrew den Exter <andrew.den.exter@jollamobile.com>2012-12-03 17:03:02 +1000
committerThe Qt Project <gerrit-noreply@qt-project.org>2012-12-04 01:50:02 +0100
commitab97a44b6ae5cc826460f3704669383afd398594 (patch)
tree608c90a557c98525fbc136c8abcf1f8a7c5fa88d
parent5ede8ee80d4dc637febe49e7a7a90d9fe5fc7e69 (diff)
Clear focus of GraphicsItem focus scopes and their children.
A focus scope has effective focus if one of its children is the focus item, clearFocus() should remove effective focus from an item and its children not just from the focus item. Task-number: QTBUG-28328 Change-Id: I62a292eff000151e50b2f5221e22f326a380fc3a Reviewed-by: Martin Jones <martin.jones@jollamobile.com>
-rw-r--r--src/widgets/graphicsview/qgraphicsitem.cpp12
-rw-r--r--tests/auto/widgets/graphicsview/qgraphicsitem/tst_qgraphicsitem.cpp39
2 files changed, 48 insertions, 3 deletions
diff --git a/src/widgets/graphicsview/qgraphicsitem.cpp b/src/widgets/graphicsview/qgraphicsitem.cpp
index c30435e56a..f9b8cb83da 100644
--- a/src/widgets/graphicsview/qgraphicsitem.cpp
+++ b/src/widgets/graphicsview/qgraphicsitem.cpp
@@ -3313,6 +3313,12 @@ void QGraphicsItem::clearFocus()
*/
void QGraphicsItemPrivate::clearFocusHelper(bool giveFocusToParent, bool hiddenByParentPanel)
{
+ QGraphicsItem *subFocusItem = q_ptr;
+ if (flags & QGraphicsItem::ItemIsFocusScope) {
+ while (subFocusItem->d_ptr->focusScopeItem)
+ subFocusItem = subFocusItem->d_ptr->focusScopeItem;
+ }
+
if (giveFocusToParent) {
// Pass focus to the closest parent focus scope
if (!inDestructor) {
@@ -3321,10 +3327,10 @@ void QGraphicsItemPrivate::clearFocusHelper(bool giveFocusToParent, bool hiddenB
if (p->flags() & QGraphicsItem::ItemIsFocusScope) {
if (p->d_ptr->focusScopeItem == q_ptr) {
p->d_ptr->focusScopeItem = 0;
- if (!q_ptr->hasFocus()) //if it has focus, focusScopeItemChange is called elsewhere
+ if (!subFocusItem->hasFocus()) //if it has focus, focusScopeItemChange is called elsewhere
focusScopeItemChange(false);
}
- if (q_ptr->hasFocus())
+ if (subFocusItem->hasFocus())
p->d_ptr->setFocusHelper(Qt::OtherFocusReason, /* climb = */ false,
/* focusFromHide = */ false);
return;
@@ -3334,7 +3340,7 @@ void QGraphicsItemPrivate::clearFocusHelper(bool giveFocusToParent, bool hiddenB
}
}
- if (q_ptr->hasFocus()) {
+ if (subFocusItem->hasFocus()) {
// Invisible items with focus must explicitly clear subfocus.
if (!hiddenByParentPanel)
clearSubFocus(q_ptr);
diff --git a/tests/auto/widgets/graphicsview/qgraphicsitem/tst_qgraphicsitem.cpp b/tests/auto/widgets/graphicsview/qgraphicsitem/tst_qgraphicsitem.cpp
index 9a996cd0c6..687d44808d 100644
--- a/tests/auto/widgets/graphicsview/qgraphicsitem/tst_qgraphicsitem.cpp
+++ b/tests/auto/widgets/graphicsview/qgraphicsitem/tst_qgraphicsitem.cpp
@@ -9228,6 +9228,45 @@ void tst_QGraphicsItem::focusScope()
scope3->setFocus();
QVERIFY(scope3->hasFocus());
+ // clearFocus() on a focus scope will remove focus from its children.
+ scope1->clearFocus();
+ QVERIFY(!scope1->hasFocus());
+ QVERIFY(!scope2->hasFocus());
+ QVERIFY(!scope3->hasFocus());
+
+ scope1->setFocus();
+ QVERIFY(!scope1->hasFocus());
+ QVERIFY(!scope2->hasFocus());
+ QVERIFY(scope3->hasFocus());
+
+ scope2->clearFocus();
+ QVERIFY(scope1->hasFocus());
+ QVERIFY(!scope2->hasFocus());
+ QVERIFY(!scope3->hasFocus());
+
+ scope2->setFocus();
+ QVERIFY(!scope1->hasFocus());
+ QVERIFY(!scope2->hasFocus());
+ QVERIFY(scope3->hasFocus());
+
+ // Focus cleared while a parent doesn't have focus remains cleared
+ // when the parent regains focus.
+ scope1->clearFocus();
+ scope3->clearFocus();
+ QVERIFY(!scope1->hasFocus());
+ QVERIFY(!scope2->hasFocus());
+ QVERIFY(!scope3->hasFocus());
+
+ scope1->setFocus();
+ QVERIFY(!scope1->hasFocus());
+ QVERIFY(scope2->hasFocus());
+ QVERIFY(!scope3->hasFocus());
+
+ scope3->setFocus();
+ QVERIFY(!scope1->hasFocus());
+ QVERIFY(!scope2->hasFocus());
+ QVERIFY(scope3->hasFocus());
+
QGraphicsRectItem *rect4 = new QGraphicsRectItem;
rect4->setData(0, "rect4");
rect4->setParentItem(scope3);