diff options
author | Andreas Aardal Hanssen <andrhans@cisco.com> | 2012-11-23 11:48:27 +0100 |
---|---|---|
committer | The Qt Project <gerrit-noreply@qt-project.org> | 2012-11-26 21:23:15 +0100 |
commit | bfb569b6e70cc6a56566002d1cb278a0122189d1 (patch) | |
tree | c17330cd85296b0a512c2dd654712b99a78d4582 /tests/auto | |
parent | 85cf6cd5f253694ad0e7d51fdd0fcfdfe65d8dc8 (diff) |
Ensure subfocus is not reset to 0 when hiding a panel.
When hiding any widget that is not a panel, it is correct to clear
subfocus. In case clearFocus() has been called, the result is that
focusItem() / focusWidget() points to 0, which is correct. Upon
reactivation, nothing gains input focus. When changing focus, the
following setSubFocus() call will ensure subfocus points to the new
widget.
When hiding a panel, however, it's essential that subfocus within
that panel is not cleared, otherwise, when re-showing the panel,
nothing will have focus, whereas the expected behavior is that focus
is restored to the last item that had focus, i.e., the focusItem()
a.k.a. subfocus widget.
Task-number: QTBUG-22256
Change-Id: I84d849a505764e074e1369fef923cef1ad5c0b1e
Reviewed-by: Olivier Goffart <ogoffart@woboq.com>
Diffstat (limited to 'tests/auto')
-rw-r--r-- | tests/auto/widgets/graphicsview/qgraphicsitem/tst_qgraphicsitem.cpp | 137 |
1 files changed, 91 insertions, 46 deletions
diff --git a/tests/auto/widgets/graphicsview/qgraphicsitem/tst_qgraphicsitem.cpp b/tests/auto/widgets/graphicsview/qgraphicsitem/tst_qgraphicsitem.cpp index 490d79b270..9a996cd0c6 100644 --- a/tests/auto/widgets/graphicsview/qgraphicsitem/tst_qgraphicsitem.cpp +++ b/tests/auto/widgets/graphicsview/qgraphicsitem/tst_qgraphicsitem.cpp @@ -424,7 +424,7 @@ private slots: void setGraphicsEffect(); void panel(); void addPanelToActiveScene(); - void panelWithFocusItem(); + void panelWithFocusItems(); void activate(); void setActivePanelOnInactiveScene(); void activationOnShowHide(); @@ -8721,52 +8721,97 @@ void tst_QGraphicsItem::panel() QVERIFY(!panel1->isActive()); } -void tst_QGraphicsItem::panelWithFocusItem() +void tst_QGraphicsItem::panelWithFocusItems() { - QGraphicsScene scene; - QEvent activate(QEvent::WindowActivate); - QApplication::sendEvent(&scene, &activate); - - QGraphicsRectItem *parentPanel = new QGraphicsRectItem; - QGraphicsRectItem *parentPanelFocusItem = new QGraphicsRectItem(parentPanel); - parentPanel->setFlag(QGraphicsItem::ItemIsPanel); - parentPanelFocusItem->setFlag(QGraphicsItem::ItemIsFocusable); - parentPanelFocusItem->setFocus(); - scene.addItem(parentPanel); - - QVERIFY(parentPanel->isActive()); - QVERIFY(parentPanelFocusItem->hasFocus()); - QCOMPARE(parentPanel->focusItem(), (QGraphicsItem *)parentPanelFocusItem); - QCOMPARE(parentPanelFocusItem->focusItem(), (QGraphicsItem *)parentPanelFocusItem); - - QGraphicsRectItem *childPanel = new QGraphicsRectItem; - QGraphicsRectItem *childPanelFocusItem = new QGraphicsRectItem(childPanel); - childPanel->setFlag(QGraphicsItem::ItemIsPanel); - childPanelFocusItem->setFlag(QGraphicsItem::ItemIsFocusable); - childPanelFocusItem->setFocus(); - - QVERIFY(!childPanelFocusItem->hasFocus()); - QCOMPARE(childPanel->focusItem(), (QGraphicsItem *)childPanelFocusItem); - QCOMPARE(childPanelFocusItem->focusItem(), (QGraphicsItem *)childPanelFocusItem); - - childPanel->setParentItem(parentPanel); - - QVERIFY(!parentPanel->isActive()); - QVERIFY(!parentPanelFocusItem->hasFocus()); - QCOMPARE(parentPanel->focusItem(), (QGraphicsItem *)parentPanelFocusItem); - QCOMPARE(parentPanelFocusItem->focusItem(), (QGraphicsItem *)parentPanelFocusItem); - - QVERIFY(childPanel->isActive()); - QVERIFY(childPanelFocusItem->hasFocus()); - QCOMPARE(childPanel->focusItem(), (QGraphicsItem *)childPanelFocusItem); - QCOMPARE(childPanelFocusItem->focusItem(), (QGraphicsItem *)childPanelFocusItem); - - childPanel->hide(); - - QVERIFY(parentPanel->isActive()); - QVERIFY(parentPanelFocusItem->hasFocus()); - QCOMPARE(parentPanel->focusItem(), (QGraphicsItem *)parentPanelFocusItem); - QCOMPARE(parentPanelFocusItem->focusItem(), (QGraphicsItem *)parentPanelFocusItem); + for (int i = 0; i < 2; ++i) + { + QGraphicsScene scene; + QEvent activate(QEvent::WindowActivate); + QApplication::sendEvent(&scene, &activate); + + bool widget = (i == 1); + QGraphicsItem *parentPanel = widget ? (QGraphicsItem *)new QGraphicsWidget : (QGraphicsItem *)new QGraphicsRectItem; + QGraphicsItem *parentPanelFocusItem = widget ? (QGraphicsItem *)new QGraphicsWidget : (QGraphicsItem *)new QGraphicsRectItem; + QGraphicsItem *parentPanelFocusItemSibling = widget ? (QGraphicsItem *)new QGraphicsWidget : (QGraphicsItem *)new QGraphicsRectItem; + parentPanel->setFlag(QGraphicsItem::ItemIsPanel); + parentPanelFocusItem->setFlag(QGraphicsItem::ItemIsFocusable); + parentPanelFocusItemSibling->setFlag(QGraphicsItem::ItemIsFocusable); + if (widget) { + static_cast<QGraphicsWidget *>(parentPanelFocusItem)->setFocusPolicy(Qt::StrongFocus); + static_cast<QGraphicsWidget *>(parentPanelFocusItemSibling)->setFocusPolicy(Qt::StrongFocus); + } + parentPanelFocusItem->setParentItem(parentPanel); + parentPanelFocusItemSibling->setParentItem(parentPanel); + parentPanelFocusItem->setFocus(); + scene.addItem(parentPanel); + + QVERIFY(parentPanel->isActive()); + QVERIFY(parentPanelFocusItem->hasFocus()); + QCOMPARE(parentPanel->focusItem(), (QGraphicsItem *)parentPanelFocusItem); + QCOMPARE(parentPanelFocusItem->focusItem(), (QGraphicsItem *)parentPanelFocusItem); + + QGraphicsItem *childPanel = widget ? (QGraphicsItem *)new QGraphicsWidget : (QGraphicsItem *)new QGraphicsRectItem; + QGraphicsItem *childPanelFocusItem = widget ? (QGraphicsItem *)new QGraphicsWidget : (QGraphicsItem *)new QGraphicsRectItem; + QGraphicsItem *grandChildPanelFocusItem = widget ? (QGraphicsItem *)new QGraphicsWidget : (QGraphicsItem *)new QGraphicsRectItem; + QGraphicsItem *grandChildPanelFocusItem2 = widget ? (QGraphicsItem *)new QGraphicsWidget : (QGraphicsItem *)new QGraphicsRectItem; + + childPanel->setFlag(QGraphicsItem::ItemIsPanel); + childPanelFocusItem->setFlag(QGraphicsItem::ItemIsFocusable); + grandChildPanelFocusItem->setFlag(QGraphicsItem::ItemIsFocusable); + grandChildPanelFocusItem2->setFlag(QGraphicsItem::ItemIsFocusable); + + if (widget) + { + static_cast<QGraphicsWidget *>(childPanelFocusItem)->setFocusPolicy(Qt::StrongFocus); + static_cast<QGraphicsWidget *>(grandChildPanelFocusItem)->setFocusPolicy(Qt::StrongFocus); + static_cast<QGraphicsWidget *>(grandChildPanelFocusItem2)->setFocusPolicy(Qt::StrongFocus); + } + grandChildPanelFocusItem->setParentItem(childPanelFocusItem); + grandChildPanelFocusItem2->setParentItem(childPanelFocusItem); + childPanelFocusItem->setParentItem(childPanel); + grandChildPanelFocusItem->setFocus(); + + QVERIFY(!grandChildPanelFocusItem->hasFocus()); + QCOMPARE(childPanel->focusItem(), (QGraphicsItem *)grandChildPanelFocusItem); + QCOMPARE(childPanelFocusItem->focusItem(), (QGraphicsItem *)grandChildPanelFocusItem); + QCOMPARE(grandChildPanelFocusItem->focusItem(), (QGraphicsItem *)grandChildPanelFocusItem); + + childPanel->setParentItem(parentPanel); + + QVERIFY(!parentPanel->isActive()); + QVERIFY(!parentPanelFocusItem->hasFocus()); + QCOMPARE(parentPanel->focusItem(), (QGraphicsItem *)parentPanelFocusItem); + QCOMPARE(parentPanelFocusItem->focusItem(), (QGraphicsItem *)parentPanelFocusItem); + + QVERIFY(childPanel->isActive()); + QVERIFY(!childPanelFocusItem->hasFocus()); + QVERIFY(grandChildPanelFocusItem->hasFocus()); + QCOMPARE(childPanel->focusItem(), (QGraphicsItem *)grandChildPanelFocusItem); + QCOMPARE(childPanelFocusItem->focusItem(), (QGraphicsItem *)grandChildPanelFocusItem); + + childPanel->hide(); + QCOMPARE(childPanel->focusItem(), (QGraphicsItem *)grandChildPanelFocusItem); + QVERIFY(!childPanel->focusItem()->hasFocus()); + QVERIFY(parentPanel->isActive()); + QVERIFY(parentPanelFocusItem->hasFocus()); + QCOMPARE(parentPanel->focusItem(), (QGraphicsItem *)parentPanelFocusItem); + QCOMPARE(parentPanelFocusItem->focusItem(), (QGraphicsItem *)parentPanelFocusItem); + QCOMPARE(grandChildPanelFocusItem->focusItem(), (QGraphicsItem *)grandChildPanelFocusItem); + + childPanel->show(); + QVERIFY(childPanel->isActive()); + QVERIFY(grandChildPanelFocusItem->hasFocus()); + QCOMPARE(childPanel->focusItem(), (QGraphicsItem *)grandChildPanelFocusItem); + QCOMPARE(childPanelFocusItem->focusItem(), (QGraphicsItem *)grandChildPanelFocusItem); + QCOMPARE(grandChildPanelFocusItem->focusItem(), (QGraphicsItem *)grandChildPanelFocusItem); + + childPanel->hide(); + + QVERIFY(parentPanel->isActive()); + QVERIFY(parentPanelFocusItem->hasFocus()); + QCOMPARE(parentPanel->focusItem(), (QGraphicsItem *)parentPanelFocusItem); + QCOMPARE(parentPanelFocusItem->focusItem(), (QGraphicsItem *)parentPanelFocusItem); + } } void tst_QGraphicsItem::addPanelToActiveScene() |