Search
SailfishOS Open Build Service
>
Projects
>
home:kaltsi
:
tnhlbug
>
qt
> 0021-Clear-focus-of-GraphicsItem-focus-scopes-and-their-c.patch
Log In
Username
Password
Cancel
Overview
Repositories
Revisions
Requests
Users
Advanced
Attributes
Meta
File 0021-Clear-focus-of-GraphicsItem-focus-scopes-and-their-c.patch of Package qt
From aa48aa1c560c6ef911f5770122a22971a3e0c112 Mon Sep 17 00:00:00 2001 From: Andrew den Exter <andrew.den.exter@jollamobile.com> Date: Mon, 3 Dec 2012 17:14:15 +1000 Subject: [PATCH 21/29] 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: Ia24abbce9740447178d43eb1fb09ccf2c40c41da --- src/gui/graphicsview/qgraphicsitem.cpp | 12 ++++++-- tests/auto/qgraphicsitem/tst_qgraphicsitem.cpp | 39 ++++++++++++++++++++++++ 2 files changed, 48 insertions(+), 3 deletions(-) diff --git a/src/gui/graphicsview/qgraphicsitem.cpp b/src/gui/graphicsview/qgraphicsitem.cpp index ef5527b..f19c215 100644 --- a/src/gui/graphicsview/qgraphicsitem.cpp +++ b/src/gui/graphicsview/qgraphicsitem.cpp @@ -3348,6 +3348,12 @@ void QGraphicsItem::clearFocus() */ void QGraphicsItemPrivate::clearFocusHelper(bool giveFocusToParent) { + 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) { @@ -3356,10 +3362,10 @@ void QGraphicsItemPrivate::clearFocusHelper(bool giveFocusToParent) 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; @@ -3369,7 +3375,7 @@ void QGraphicsItemPrivate::clearFocusHelper(bool giveFocusToParent) } } - if (q_ptr->hasFocus()) { + if (subFocusItem->hasFocus()) { // Invisible items with focus must explicitly clear subfocus. clearSubFocus(q_ptr); diff --git a/tests/auto/qgraphicsitem/tst_qgraphicsitem.cpp b/tests/auto/qgraphicsitem/tst_qgraphicsitem.cpp index 86dee5d..fe12993 100644 --- a/tests/auto/qgraphicsitem/tst_qgraphicsitem.cpp +++ b/tests/auto/qgraphicsitem/tst_qgraphicsitem.cpp @@ -9220,6 +9220,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); -- 1.7.10.3