summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorAndreas Aardal Hanssen <andreas.aardal.hanssen@nokia.com>2009-09-22 09:23:48 (GMT)
committerAndreas Aardal Hanssen <andreas.aardal.hanssen@nokia.com>2009-09-22 14:13:41 (GMT)
commitf16fd9324ae5f86dfe851cad9639d2ee2e8571ed (patch)
tree9fa4338699f7d7747e4a7f9de9ea49a3b6606905 /src
parent04b7a414f626795b8000271e133b65f8b72ea4c9 (diff)
downloadQt-f16fd9324ae5f86dfe851cad9639d2ee2e8571ed.zip
Qt-f16fd9324ae5f86dfe851cad9639d2ee2e8571ed.tar.gz
Qt-f16fd9324ae5f86dfe851cad9639d2ee2e8571ed.tar.bz2
Fix focus scope bugs, verified against examples in kinetic-declarativeui.
The C++ autotests have been updated to match the expected behavior of the examples that broke (e.g., listview.qml) in kinetic-declarativeui. Reviewed-by: Alexis
Diffstat (limited to 'src')
-rw-r--r--src/gui/graphicsview/qgraphicsitem.cpp34
-rw-r--r--src/gui/graphicsview/qgraphicsscene.cpp13
2 files changed, 18 insertions, 29 deletions
diff --git a/src/gui/graphicsview/qgraphicsitem.cpp b/src/gui/graphicsview/qgraphicsitem.cpp
index 0145499..3249bb1 100644
--- a/src/gui/graphicsview/qgraphicsitem.cpp
+++ b/src/gui/graphicsview/qgraphicsitem.cpp
@@ -982,12 +982,10 @@ void QGraphicsItemPrivate::setParentItemHelper(QGraphicsItem *newParent)
QGraphicsItem *p = newParent;
while (p) {
if (p->flags() & QGraphicsItem::ItemIsFocusScope) {
- // ### We really want the parent's focus scope item to point
- // to this item's focusItem...
- if (q_ptr->flags() & QGraphicsItem::ItemIsFocusScope)
- p->d_ptr->focusScopeItem = q_ptr;
- else
- p->d_ptr->focusScopeItem = subFocusItem ? subFocusItem : parentFocusScopeItem;
+ p->d_ptr->focusScopeItem = subFocusItem ? subFocusItem : parentFocusScopeItem;
+ // ### The below line might not make sense...
+ if (subFocusItem)
+ subFocusItem->d_ptr->clearSubFocus();
break;
}
p = p->d_ptr->parent;
@@ -2812,15 +2810,12 @@ void QGraphicsItemPrivate::setFocusHelper(Qt::FocusReason focusReason, bool clim
if (scene && scene->focusItem() == f)
return;
- // Update the child focus chain.
- setSubFocus();
-
// Update focus scope item ptr.
QGraphicsItem *p = parent;
while (p) {
if (p->flags() & QGraphicsItem::ItemIsFocusScope) {
p->d_ptr->focusScopeItem = q_ptr;
- if (!q_ptr->isActive())
+ if (!q_ptr->isActive() || !p->focusItem())
return;
break;
}
@@ -2830,10 +2825,11 @@ void QGraphicsItemPrivate::setFocusHelper(Qt::FocusReason focusReason, bool clim
if (climb) {
while (f->d_ptr->focusScopeItem && f->d_ptr->focusScopeItem->isVisible())
f = f->d_ptr->focusScopeItem;
- if (f != q_ptr)
- f->d_ptr->setSubFocus();
}
+ // Update the child focus chain.
+ f->d_ptr->setSubFocus();
+
// Update the scene's focus item.
if (scene) {
QGraphicsItem *p = q_ptr->panel();
@@ -2858,13 +2854,15 @@ void QGraphicsItemPrivate::setFocusHelper(Qt::FocusReason focusReason, bool clim
void QGraphicsItem::clearFocus()
{
// Pass focus to the closest parent focus scope.
- QGraphicsItem *p = d_ptr->parent;
- while (p) {
- if (p->flags() & ItemIsFocusScope) {
- p->d_ptr->setFocusHelper(Qt::OtherFocusReason, /* climb = */ false);
- return;
+ if (!d_ptr->inDestructor) {
+ QGraphicsItem *p = d_ptr->parent;
+ while (p) {
+ if (p->flags() & ItemIsFocusScope) {
+ p->d_ptr->setFocusHelper(Qt::OtherFocusReason, /* climb = */ false);
+ return;
+ }
+ p = p->d_ptr->parent;
}
- p = p->d_ptr->parent;
}
// Invisible items with focus must explicitly clear subfocus.
diff --git a/src/gui/graphicsview/qgraphicsscene.cpp b/src/gui/graphicsview/qgraphicsscene.cpp
index f6e0aaf..a267996 100644
--- a/src/gui/graphicsview/qgraphicsscene.cpp
+++ b/src/gui/graphicsview/qgraphicsscene.cpp
@@ -2434,17 +2434,8 @@ void QGraphicsScene::addItem(QGraphicsItem *item)
// Ensure that newly added items that have subfocus set, gain
// focus automatically if there isn't a focus item already.
- if (!d->focusItem) {
- if (item->focusItem() == item && item != d->lastFocusItem) {
- QGraphicsItem *fi = item->focusItem() ? item->focusItem() : item->focusScopeItem();
- if (fi) {
- QGraphicsItem *fsi;
- while ((fsi = fi->focusScopeItem()) && fsi->isVisible())
- fi = fsi;
- fi->setFocus();
- }
- }
- }
+ if (!d->focusItem && item != d->lastFocusItem && item->focusItem() == item)
+ item->focusItem()->setFocus();
d->updateInputMethodSensitivityInViews();
}