tests/auto/qgraphicsview/tst_qgraphicsview.cpp
changeset 30 5dc02b23752f
parent 25 e24348a560a6
child 33 3e2da88830cd
--- a/tests/auto/qgraphicsview/tst_qgraphicsview.cpp	Wed Jun 23 19:07:03 2010 +0300
+++ b/tests/auto/qgraphicsview/tst_qgraphicsview.cpp	Tue Jul 06 15:10:48 2010 +0300
@@ -216,6 +216,9 @@
     void exposeRegion();
     void update_data();
     void update();
+    void update2_data();
+    void update2();
+    void update_ancestorClipsChildrenToShape();
     void inputMethodSensitivity();
     void inputContextReset();
     void indirectPainting();
@@ -239,6 +242,7 @@
     void QTBUG_4151_clipAndIgnore_data();
     void QTBUG_4151_clipAndIgnore();
     void QTBUG_5859_exposedRect();
+    void QTBUG_7438_cursor();
 };
 
 void tst_QGraphicsView::initTestCase()
@@ -1382,28 +1386,48 @@
 {
     QTest::addColumn<QRect>("updateRect");
     QTest::addColumn<int>("numPaints");
-
-    QTest::newRow("nil") << QRect() << 1;
-    QTest::newRow("0, 0, 300, 100") << QRect(0, 0, 300, 100) << 1;
-    QTest::newRow("0, 0, 100, 300") << QRect(0, 0, 100, 300) << 1;
-    QTest::newRow("200, 0, 100, 300") << QRect(200, 0, 100, 300) << 1;
-    QTest::newRow("0, 200, 300, 100") << QRect(0, 200, 300, 100) << 1;
-    QTest::newRow("0, 0, 300, 99") << QRect(0, 0, 300, 99) << 0;
-    QTest::newRow("0, 0, 99, 300") << QRect(0, 0, 99, 300) << 0;
-    QTest::newRow("201, 0, 99, 300") << QRect(201, 0, 99, 300) << 0;
-    QTest::newRow("0, 201, 300, 99") << QRect(0, 201, 300, 99) << 0;
+    QTest::addColumn<bool>("adjustForAntialiasing");
+
+    // Aliased.
+    QTest::newRow("nil") << QRect() << 1 << false;
+    QTest::newRow("0, 0, 300, 100") << QRect(0, 0, 300, 100) << 1 << false;
+    QTest::newRow("0, 0, 100, 300") << QRect(0, 0, 100, 300) << 1 << false;
+    QTest::newRow("200, 0, 100, 300") << QRect(200, 0, 100, 300) << 1 << false;
+    QTest::newRow("0, 200, 300, 100") << QRect(0, 200, 300, 100) << 1 << false;
+    QTest::newRow("0, 0, 300, 99") << QRect(0, 0, 300, 99) << 0 << false;
+    QTest::newRow("0, 0, 99, 300") << QRect(0, 0, 99, 300) << 0 << false;
+    QTest::newRow("201, 0, 99, 300") << QRect(201, 0, 99, 300) << 0 << false;
+    QTest::newRow("0, 201, 300, 99") << QRect(0, 201, 300, 99) << 0 << false;
+
+    // Anti-aliased.
+    QTest::newRow("nil") << QRect() << 1 << true;
+    QTest::newRow("0, 0, 300, 100") << QRect(0, 0, 300, 100) << 1 << true;
+    QTest::newRow("0, 0, 100, 300") << QRect(0, 0, 100, 300) << 1 << true;
+    QTest::newRow("200, 0, 100, 300") << QRect(200, 0, 100, 300) << 1 << true;
+    QTest::newRow("0, 200, 300, 100") << QRect(0, 200, 300, 100) << 1 << true;
+    QTest::newRow("0, 0, 300, 99") << QRect(0, 0, 300, 99) << 1 << true;
+    QTest::newRow("0, 0, 99, 300") << QRect(0, 0, 99, 300) << 1 << true;
+    QTest::newRow("201, 0, 99, 300") << QRect(201, 0, 99, 300) << 1 << true;
+    QTest::newRow("0, 201, 300, 99") << QRect(0, 201, 300, 99) << 1 << true;
+    QTest::newRow("0, 0, 300, 98") << QRect(0, 0, 300, 98) << 0 << false;
+    QTest::newRow("0, 0, 98, 300") << QRect(0, 0, 98, 300) << 0 << false;
+    QTest::newRow("202, 0, 98, 300") << QRect(202, 0, 98, 300) << 0 << false;
+    QTest::newRow("0, 202, 300, 98") << QRect(0, 202, 300, 98) << 0 << false;
 }
 
 void tst_QGraphicsView::itemsInRect_cosmeticAdjust()
 {
     QFETCH(QRect, updateRect);
     QFETCH(int, numPaints);
+    QFETCH(bool, adjustForAntialiasing);
 
     QGraphicsScene scene(-100, -100, 200, 200);
     CountPaintItem *rect = new CountPaintItem(QRectF(-50, -50, 100, 100));
     scene.addItem(rect);
 
     QGraphicsView view(&scene);
+    view.setOptimizationFlag(QGraphicsView::DontAdjustForAntialiasing, !adjustForAntialiasing);
+    view.setRenderHint(QPainter::Antialiasing, adjustForAntialiasing);
     view.setFrameStyle(0);
     view.resize(300, 300);
     view.show();
@@ -2218,8 +2242,8 @@
     QTRY_VERIFY(!view.lastUpdateRegions.isEmpty());
 #ifndef QT_MAC_USE_COCOA //cocoa doesn't support drawing regions
     QCOMPARE(view.lastUpdateRegions.last().rects().size(), 2);
-    QCOMPARE(view.lastUpdateRegions.last().rects().at(0).size(), QSize(15, 15));
-    QCOMPARE(view.lastUpdateRegions.last().rects().at(1).size(), QSize(15, 15));
+    QCOMPARE(view.lastUpdateRegions.last().rects().at(0).size(), QSize(14, 14));
+    QCOMPARE(view.lastUpdateRegions.last().rects().at(1).size(), QSize(14, 14));
 #endif
 
     // Set full update mode.
@@ -2253,7 +2277,7 @@
 
     // The view gets one bounding rect update.
     QCOMPARE(view.lastUpdateRegions.last().rects().size(), 1);
-    QCOMPARE(view.lastUpdateRegions.last().rects().at(0).size(), QSize(33, 33));
+    QCOMPARE(view.lastUpdateRegions.last().rects().at(0).size(), QSize(32, 32));
 
     // Set no update mode
     view.setViewportUpdateMode(QGraphicsView::NoViewportUpdate);
@@ -3646,7 +3670,6 @@
     const bool intersects = updateRect.intersects(viewportRect);
     QGraphicsViewPrivate *viewPrivate = static_cast<QGraphicsViewPrivate *>(qt_widget_private(&view));
     QTRY_COMPARE(viewPrivate->updateRect(updateRect), intersects);
-    QCOMPARE(viewPrivate->updateRegion(updateRect), intersects);
 
     view.lastUpdateRegions.clear();
     viewPrivate->processPendingUpdates();
@@ -3657,13 +3680,141 @@
         QTRY_VERIFY(view.lastUpdateRegions.isEmpty());
     } else {
         QTRY_COMPARE(view.lastUpdateRegions.size(), 1);
-        // Note that we adjust by 2 for antialiasing.
-        QTRY_COMPARE(view.lastUpdateRegions.at(0), QRegion(updateRect.adjusted(-2, -2, 2, 2) & viewportRect));
+        QTRY_COMPARE(view.lastUpdateRegions.at(0), QRegion(updateRect) & viewportRect);
     }
     QTRY_VERIFY(!viewPrivate->fullUpdatePending);
 #endif
 }
 
+void tst_QGraphicsView::update2_data()
+{
+    QTest::addColumn<qreal>("penWidth");
+    QTest::addColumn<bool>("antialiasing");
+
+    // Anti-aliased.
+    QTest::newRow("pen width: 0.0, antialiasing: true") << 0.0 << true;
+    QTest::newRow("pen width: 1.5, antialiasing: true") << 1.5 << true;
+    QTest::newRow("pen width: 2.0, antialiasing: true") << 2.0 << true;
+    QTest::newRow("pen width: 3.0, antialiasing: true") << 3.0 << true;
+
+    // Aliased.
+    QTest::newRow("pen width: 0.0, antialiasing: false") << 0.0 << false;
+    QTest::newRow("pen width: 1.5, antialiasing: false") << 1.5 << false;
+    QTest::newRow("pen width: 2.0, antialiasing: false") << 2.0 << false;
+    QTest::newRow("pen width: 3.0, antialiasing: false") << 3.0 << false;
+}
+
+void tst_QGraphicsView::update2()
+{
+    QFETCH(qreal, penWidth);
+    QFETCH(bool, antialiasing);
+
+    // Create a rect item.
+    const QRectF rawItemRect(-50.4, -50.3, 100.2, 100.1);
+    CountPaintItem *rect = new CountPaintItem(rawItemRect);
+    QPen pen;
+    pen.setWidthF(penWidth);
+    rect->setPen(pen);
+
+    // Add item to a scene.
+    QGraphicsScene scene(-100, -100, 200, 200);
+    scene.addItem(rect);
+
+    // Create a view on the scene.
+    CustomView view(&scene);
+    view.setOptimizationFlag(QGraphicsView::DontAdjustForAntialiasing, !antialiasing);
+    view.setRenderHint(QPainter::Antialiasing, antialiasing);
+    view.setFrameStyle(0);
+    view.resize(200, 200);
+    view.show();
+    QTest::qWaitForWindowShown(&view) ;
+    QTRY_VERIFY(rect->numPaints > 0);
+
+    // Calculate expected update region for the rect.
+    QRectF expectedItemBoundingRect = rawItemRect;
+    const qreal halfPenWidth = penWidth / qreal(2.0);
+    expectedItemBoundingRect.adjust(-halfPenWidth, -halfPenWidth, halfPenWidth, halfPenWidth);
+    QCOMPARE(rect->boundingRect(), expectedItemBoundingRect);
+
+    QRect expectedItemDeviceBoundingRect = rect->deviceTransform(view.viewportTransform())
+                                           .mapRect(expectedItemBoundingRect).toAlignedRect();
+    if (antialiasing)
+        expectedItemDeviceBoundingRect.adjust(-2, -2, 2, 2);
+    else
+        expectedItemDeviceBoundingRect.adjust(-1, -1, 1, 1);
+    const QRegion expectedUpdateRegion(expectedItemDeviceBoundingRect);
+
+    // Reset.
+    rect->numPaints = 0;
+    view.lastUpdateRegions.clear();
+    view.painted = false;
+
+    rect->update();
+    QTRY_VERIFY(view.painted);
+
+#ifndef QT_MAC_USE_COCOA //cocoa doesn't support drawing regions
+    QTRY_VERIFY(view.painted);
+    QCOMPARE(view.lastUpdateRegions.size(), 1);
+    QCOMPARE(view.lastUpdateRegions.at(0), expectedUpdateRegion);
+#endif
+}
+
+void tst_QGraphicsView::update_ancestorClipsChildrenToShape()
+{
+    QGraphicsScene scene(-150, -150, 300, 300);
+
+    /*
+    Add three rects:
+
+    +------------------+
+    | child            |
+    | +--------------+ |
+    | | parent       | |
+    | |  +-----------+ |
+    | |  |grandParent| |
+    | |  +-----------+ |
+    | +--------------+ |
+    +------------------+
+
+    ... where both the parent and the grand parent clips children to shape.
+    */
+    QApplication::processEvents(); // Get rid of pending update.
+
+    QGraphicsRectItem *grandParent = static_cast<QGraphicsRectItem *>(scene.addRect(0, 0, 50, 50));
+    grandParent->setBrush(Qt::black);
+    grandParent->setFlag(QGraphicsItem::ItemClipsChildrenToShape);
+
+    QGraphicsRectItem *parent = static_cast<QGraphicsRectItem *>(scene.addRect(-50, -50, 100, 100));
+    parent->setBrush(QColor(0, 0, 255, 125));
+    parent->setParentItem(grandParent);
+    parent->setFlag(QGraphicsItem::ItemClipsChildrenToShape);
+
+    QGraphicsRectItem *child = static_cast<QGraphicsRectItem *>(scene.addRect(-100, -100, 200, 200));
+    child->setBrush(QColor(255, 0, 0, 125));
+    child->setParentItem(parent);
+
+    CustomView view(&scene);
+    view.show();
+    QTest::qWaitForWindowShown(&view);
+    QTRY_VERIFY(view.painted);
+
+    view.lastUpdateRegions.clear();
+    view.painted = false;
+
+    // Call child->update() and make sure the updated area is within the ancestors' clip.
+    QRectF expected = child->deviceTransform(view.viewportTransform()).mapRect(child->boundingRect());
+    expected &= grandParent->deviceTransform(view.viewportTransform()).mapRect(grandParent->boundingRect());
+
+    child->update();
+    QTRY_VERIFY(view.painted);
+
+#ifndef QT_MAC_USE_COCOA //cocoa doesn't support drawing regions
+    QTRY_VERIFY(view.painted);
+    QCOMPARE(view.lastUpdateRegions.size(), 1);
+    QCOMPARE(view.lastUpdateRegions.at(0), QRegion(expected.toAlignedRect()));
+#endif
+}
+
 class FocusItem : public QGraphicsRectItem
 {
 public:
@@ -4085,5 +4236,32 @@
     QCOMPARE(item.lastExposedRect, scene.lastBackgroundExposedRect);
 }
 
+void tst_QGraphicsView::QTBUG_7438_cursor()
+{
+#ifndef QT_NO_CURSOR
+#if defined(Q_OS_WINCE)
+    QSKIP("Qt/CE does not have regular cursor support", SkipAll);
+#endif
+    QGraphicsScene scene;
+    QGraphicsItem *item = scene.addRect(QRectF(-10, -10, 20, 20));
+    item->setFlag(QGraphicsItem::ItemIsMovable);
+
+    QGraphicsView view(&scene);
+    view.setFixedSize(400, 400);
+    view.show();
+    QTest::qWaitForWindowShown(&view);
+
+    QCOMPARE(view.viewport()->cursor().shape(), QCursor().shape());
+    view.viewport()->setCursor(Qt::PointingHandCursor);
+    QCOMPARE(view.viewport()->cursor().shape(), Qt::PointingHandCursor);
+    sendMouseMove(view.viewport(), view.mapFromScene(0, 0));
+    QCOMPARE(view.viewport()->cursor().shape(), Qt::PointingHandCursor);
+    sendMousePress(view.viewport(), view.mapFromScene(0, 0));
+    QCOMPARE(view.viewport()->cursor().shape(), Qt::PointingHandCursor);
+    sendMouseRelease(view.viewport(), view.mapFromScene(0, 0));
+    QCOMPARE(view.viewport()->cursor().shape(), Qt::PointingHandCursor);
+#endif
+}
+
 QTEST_MAIN(tst_QGraphicsView)
 #include "tst_qgraphicsview.moc"