diff --git a/src/gui/graphicsview/qgraphicsitem.cpp b/src/gui/graphicsview/qgraphicsitem.cpp index 9092593..56cf45a 100644 --- a/src/gui/graphicsview/qgraphicsitem.cpp +++ b/src/gui/graphicsview/qgraphicsitem.cpp @@ -1103,6 +1103,8 @@ void QGraphicsItemPrivate::setParentItemHelper(QGraphicsItem *newParent, const Q if (newParent == parent) return; + qDebug() << "REPARENTING" << q_ptr << "to" << newParent; + if (isWidget) static_cast(this)->fixFocusChainBeforeReparenting((newParent && newParent->isWidget()) ? static_cast(newParent) : 0, @@ -1145,6 +1147,7 @@ void QGraphicsItemPrivate::setParentItemHelper(QGraphicsItem *newParent, const Q } } + // Ensure any last parent focus scope does not point to this item or any of // its descendents. QGraphicsItem *p = parent; @@ -1157,7 +1160,12 @@ void QGraphicsItemPrivate::setParentItemHelper(QGraphicsItem *newParent, const Q if (q_ptr == fsi || q_ptr->isAncestorOf(fsi)) { parentFocusScopeItem = fsi; p->d_ptr->focusScopeItem = 0; + qDebug() << "NULLING fsi of" << p << "NP" << newParent; +#ifndef BUGFIX fsi->d_ptr->focusScopeItemChange(false); +#endif + qDebug() << "RETURN FROM fsic" << p; + Q_ASSERT(p->d_ptr->focusScopeItem == 0); } break; } @@ -1192,6 +1200,9 @@ void QGraphicsItemPrivate::setParentItemHelper(QGraphicsItem *newParent, const Q } p->d_ptr->focusScopeItem = newFocusScopeItem; + if (newFocusScopeItem->d_ptr->isObject && static_cast(newFocusScopeItem)->objectName() == QLatin1String("WATCHME")) + qDebug() << "SETTINGS fsi of" << p << "to" << newFocusScopeItem; + newFocusScopeItem->d_ptr->focusScopeItemChange(true); // Ensure the new item is no longer the subFocusItem. The // only way to set focus on a child of a focus scope is @@ -1207,6 +1218,8 @@ void QGraphicsItemPrivate::setParentItemHelper(QGraphicsItem *newParent, const Q // Resolve depth. invalidateDepthRecursively(); + qDebug() << "SETTING parent OF" << q_ptr << "to" << newParent; + if ((parent = newParent)) { if (parent->d_func()->scene && parent->d_func()->scene != scene) { // Move this item to its new parent's scene @@ -1261,6 +1274,11 @@ void QGraphicsItemPrivate::setParentItemHelper(QGraphicsItem *newParent, const Q if (!inDestructor && (transformData || (newParent && newParent->d_ptr->transformData))) transformChanged(); +#ifdef BUGFIX + if (parentFocusScopeItem) + parentFocusScopeItem->d_ptr->focusScopeItemChange(false); +#endif + // Restore the sub focus chain. if (subFocusItem) { subFocusItem->d_ptr->setSubFocus(newParent); @@ -1472,14 +1490,30 @@ QGraphicsItem::~QGraphicsItem() } #endif + if (static_cast(this)->objectName() == QLatin1String("WATCHME")) + qDebug() << "DESTROYING" << this; + clearFocus(); +// if (static_cast(this)->objectName() == QLatin1String("WATCHME")) { +// qDebug() << "UPDATING FSIP"; +// qDebug() << "PARENTS"; +// QGraphicsItem *p = d_ptr->parent; +// while (p) { +// qDebug() << "P" << p; +// p = p->d_ptr->parent; +// } +// } + // Update focus scope item ptr. QGraphicsItem *p = d_ptr->parent; while (p) { if (p->flags() & ItemIsFocusScope) { - if (p->d_ptr->focusScopeItem == this) + if (p->d_ptr->focusScopeItem == this) { + if (static_cast(this)->objectName() == QLatin1String("WATCHME")) + qDebug() << "REMOVING ME as fsi FROM" << p; p->d_ptr->focusScopeItem = 0; + } break; } p = p->d_ptr->parent; @@ -3284,6 +3318,15 @@ void QGraphicsItemPrivate::setFocusHelper(Qt::FocusReason focusReason, bool clim while (p) { if (p->flags() & QGraphicsItem::ItemIsFocusScope) { QGraphicsItem *oldFocusScopeItem = p->d_ptr->focusScopeItem; + if (isObject && static_cast(q_ptr)->objectName() == QLatin1String("WATCHME")) { + qDebug() << "SETTINGS fsi of" << p << "to" << q_ptr; + qDebug() << "PARENTS"; + QGraphicsItem *p = parent; + while (p) { + qDebug() << "P" << p; + p = p->d_ptr->parent; + } + } p->d_ptr->focusScopeItem = q_ptr; if (!p->focusItem() && !focusFromHide) { if (oldFocusScopeItem) @@ -3299,8 +3342,11 @@ void QGraphicsItemPrivate::setFocusHelper(Qt::FocusReason focusReason, bool clim } if (climb) { - while (f->d_ptr->focusScopeItem && f->d_ptr->focusScopeItem->isVisible()) + qDebug() << "climbing " << f; + while (f->d_ptr->focusScopeItem && f->d_ptr->focusScopeItem->isVisible()) { + qDebug() << "CLIMB" << f->d_ptr->focusScopeItem << "to" << (void*) f->d_ptr->focusScopeItem->d_ptr->focusScopeItem; f = f->d_ptr->focusScopeItem; + } } // Update the child focus chain. @@ -3350,6 +3396,8 @@ void QGraphicsItemPrivate::clearFocusHelper(bool giveFocusToParent) while (p) { if (p->flags() & QGraphicsItem::ItemIsFocusScope) { if (p->d_ptr->focusScopeItem == q_ptr) { + if (isObject && static_cast(q_ptr)->objectName() == QLatin1String("WATCHME")) + qDebug() << "CLEARING fsi FOR" << p; p->d_ptr->focusScopeItem = 0; if (!q_ptr->hasFocus()) //if it has focus, focusScopeItemChange is called elsewhere focusScopeItemChange(false); @@ -5582,6 +5630,7 @@ void QGraphicsItemPrivate::setSubFocus(QGraphicsItem *rootItem, QGraphicsItem *s } parent->d_ptr->subFocusItem = q_ptr; parent->d_ptr->subFocusItemChange(); + Q_ASSERT(parent->d_ptr->subFocusItem == q_ptr); //FIXME } while (!parent->isPanel() && (parent = parent->d_ptr->parent) && (visible || !parent->d_ptr->visible)); if (scene && !scene->isActive()) {