Ignore:
Timestamp:
Mar 8, 2010, 12:52:58 PM (15 years ago)
Author:
Dmitry A. Kuminov
Message:

trunk: Merged in qt 4.6.2 sources.

Location:
trunk
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk

  • trunk/src/gui/graphicsview/qgraphicsscene.cpp

    r561 r651  
    11/****************************************************************************
    22**
    3 ** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
     3** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
    44** All rights reserved.
    55** Contact: Nokia Corporation (qt-info@nokia.com)
     
    252252#include <private/qgraphicseffect_p.h>
    253253#include <private/qgesturemanager_p.h>
     254#include <private/qpathclipper_p.h>
    254255
    255256// #define GESTURE_DEBUG
     
    293294      selectionChanging(0),
    294295      needSortTopLevelItems(true),
    295       unpolishedItemsModified(true),
    296296      holesInTopLevelSiblingIndex(false),
    297297      topLevelSequentialOrdering(true),
     
    374374        }
    375375    } else {
    376         updateAll = false;
     376        if (views.isEmpty()) {
     377            updateAll = false;
     378            return;
     379        }
    377380        for (int i = 0; i < views.size(); ++i)
    378381            views.at(i)->d_func()->processPendingUpdates();
     
    430433void QGraphicsScenePrivate::_q_polishItems()
    431434{
    432     QSet<QGraphicsItem *>::Iterator it = unpolishedItems.begin();
     435    if (unpolishedItems.isEmpty())
     436        return;
     437
    433438    const QVariant booleanTrueVariant(true);
    434     while (!unpolishedItems.isEmpty()) {
    435         QGraphicsItem *item = *it;
    436         it = unpolishedItems.erase(it);
    437         unpolishedItemsModified = false;
    438         if (!item->d_ptr->explicitlyHidden) {
     439    QGraphicsItem *item = 0;
     440    QGraphicsItemPrivate *itemd = 0;
     441    const int oldUnpolishedCount = unpolishedItems.count();
     442
     443    for (int i = 0; i < oldUnpolishedCount; ++i) {
     444        item = unpolishedItems.at(i);
     445        if (!item)
     446            continue;
     447        itemd = item->d_ptr.data();
     448        itemd->pendingPolish = false;
     449        if (!itemd->explicitlyHidden) {
    439450            item->itemChange(QGraphicsItem::ItemVisibleChange, booleanTrueVariant);
    440451            item->itemChange(QGraphicsItem::ItemVisibleHasChanged, booleanTrueVariant);
    441452        }
    442         if (item->isWidget()) {
     453        if (itemd->isWidget) {
    443454            QEvent event(QEvent::Polish);
    444455            QApplication::sendEvent((QGraphicsWidget *)item, &event);
    445456        }
    446         if (unpolishedItemsModified)
    447             it = unpolishedItems.begin();
     457    }
     458
     459    if (unpolishedItems.count() == oldUnpolishedCount) {
     460        // No new items were added to the vector.
     461        unpolishedItems.clear();
     462    } else {
     463        // New items were appended; keep them and remove the old ones.
     464        unpolishedItems.remove(0, oldUnpolishedCount);
     465        unpolishedItems.squeeze();
     466        QMetaObject::invokeMethod(q_ptr, "_q_polishItems", Qt::QueuedConnection);
    448467    }
    449468}
     
    600619            Q_ASSERT_X(parentItem->scene() == q, "QGraphicsScene::removeItem",
    601620                       "Parent item's scene is different from this item's scene");
    602             item->d_ptr->setParentItemHelper(0);
     621            item->setParentItem(0);
    603622        }
    604623    } else {
     
    639658    hoverItems.removeAll(item);
    640659    cachedItemsUnderMouse.removeAll(item);
    641     unpolishedItems.remove(item);
    642     unpolishedItemsModified = true;
     660    if (item->d_ptr->pendingPolish) {
     661        const int unpolishedIndex = unpolishedItems.indexOf(item);
     662        if (unpolishedIndex != -1)
     663            unpolishedItems[unpolishedIndex] = 0;
     664        item->d_ptr->pendingPolish = false;
     665    }
    643666    resetDirtyItem(item);
    644667
     
    19371960
    19381961    This convenience function is equivalent to calling items(QRectF(\a x, \a y, \a w, \a h), \a mode).
    1939    
     1962
    19401963    This function is deprecated and returns incorrect results if the scene
    19411964    contains items that ignore transformations. Use the overload that takes
     
    24832506        return;
    24842507    }
    2485     if (item->scene() == this) {
     2508    if (item->d_ptr->scene == this) {
    24862509        qWarning("QGraphicsScene::addItem: item has already been added to this scene");
    24872510        return;
    24882511    }
    24892512    // Remove this item from its existing scene
    2490     if (QGraphicsScene *oldScene = item->scene())
     2513    if (QGraphicsScene *oldScene = item->d_ptr->scene)
    24912514        oldScene->removeItem(item);
    24922515
     
    24972520    QGraphicsScene *targetScene = qVariantValue<QGraphicsScene *>(newSceneVariant);
    24982521    if (targetScene != this) {
    2499         if (targetScene && item->scene() != targetScene)
     2522        if (targetScene && item->d_ptr->scene != targetScene)
    25002523            targetScene->addItem(item);
    25012524        return;
    25022525    }
    25032526
     2527    if (d->unpolishedItems.isEmpty())
     2528        QMetaObject::invokeMethod(this, "_q_polishItems", Qt::QueuedConnection);
     2529    d->unpolishedItems.append(item);
     2530    item->d_ptr->pendingPolish = true;
     2531
    25042532    // Detach this item from its parent if the parent's scene is different
    25052533    // from this scene.
    2506     if (QGraphicsItem *itemParent = item->parentItem()) {
    2507         if (itemParent->scene() != this)
     2534    if (QGraphicsItem *itemParent = item->d_ptr->parent) {
     2535        if (itemParent->d_ptr->scene != this)
    25082536            item->setParentItem(0);
    25092537    }
     
    25352563    }
    25362564#ifndef QT_NO_CURSOR
    2537     if (d->allItemsUseDefaultCursor && item->hasCursor()) {
     2565    if (d->allItemsUseDefaultCursor && item->d_ptr->hasCursor) {
    25382566        d->allItemsUseDefaultCursor = false;
    25392567        if (d->allItemsIgnoreHoverEvents) // already enabled otherwise
     
    25432571
    25442572    // Enable touch events if the item accepts touch events.
    2545     if (d->allItemsIgnoreTouchEvents && item->acceptTouchEvents()) {
     2573    if (d->allItemsIgnoreTouchEvents && item->d_ptr->acceptTouchEvents) {
    25462574        d->allItemsIgnoreTouchEvents = false;
    25472575        d->enableTouchEventsOnViews();
     
    25762604
    25772605    // Add all children recursively
    2578     foreach (QGraphicsItem *child, item->children())
    2579         addItem(child);
     2606    item->d_ptr->ensureSortedChildren();
     2607    for (int i = 0; i < item->d_ptr->children.size(); ++i)
     2608        addItem(item->d_ptr->children.at(i));
    25802609
    25812610    // Resolve font and palette.
     
    25832612    item->d_ptr->resolvePalette(d->palette.resolve());
    25842613
    2585     if (d->unpolishedItems.isEmpty())
    2586         QMetaObject::invokeMethod(this, "_q_polishItems", Qt::QueuedConnection);
    2587     d->unpolishedItems.insert(item);
    2588     d->unpolishedItemsModified = true;
    25892614
    25902615    // Reenable selectionChanged() for individual items
     
    26202645    }
    26212646
    2622     if (item->flags() & QGraphicsItem::ItemSendsScenePositionChanges)
     2647    if (item->d_ptr->flags & QGraphicsItem::ItemSendsScenePositionChanges)
    26232648        d->registerScenePosItem(item);
    26242649
     
    37673792bool QGraphicsScenePrivate::itemAcceptsHoverEvents_helper(const QGraphicsItem *item) const
    37683793{
    3769     return (!item->isBlockedByModalPanel() &&
    3770             (item->acceptHoverEvents()
    3771              || (item->isWidget()
    3772                  && static_cast<const QGraphicsWidget *>(item)->d_func()->hasDecoration())));
     3794    return (item->d_ptr->acceptsHover
     3795            || (item->d_ptr->isWidget
     3796                && static_cast<const QGraphicsWidget *>(item)->d_func()->hasDecoration()))
     3797           && !item->isBlockedByModalPanel();
    37733798}
    37743799
     
    45834608        _q_polishItems();
    45844609
     4610    updateAll = false;
    45854611    QRectF exposedSceneRect;
    45864612    if (exposedRegion && indexMethod != QGraphicsScene::NoIndex) {
     
    46104636
    46114637    const qreal opacity = item->d_ptr->combineOpacityFromParent(parentOpacity);
    4612     const bool itemIsFullyTransparent = (opacity < 0.0001);
     4638    const bool itemIsFullyTransparent = QGraphicsItemPrivate::isOpacityNull(opacity);
    46134639    if (itemIsFullyTransparent && (!itemHasChildren || item->d_ptr->childrenCombineOpacity()))
    46144640        return;
     
    46874713            && sourced->lastEffectTransform != painter->worldTransform())
    46884714        {
     4715            bool unclipped = false;
     4716            if (sourced->lastEffectTransform.type() <= QTransform::TxTranslate
     4717                && painter->worldTransform().type() <= QTransform::TxTranslate)
     4718            {
     4719                QRectF itemRect = item->boundingRect();
     4720                if (!item->d_ptr->children.isEmpty())
     4721                    itemRect |= item->childrenBoundingRect();
     4722
     4723                QRectF oldSourceRect = sourced->lastEffectTransform.mapRect(itemRect);
     4724                QRectF newSourceRect = painter->worldTransform().mapRect(itemRect);
     4725
     4726                QRect oldEffectRect = sourced->paddedEffectRect(sourced->currentCachedSystem(), sourced->currentCachedMode(), oldSourceRect);
     4727                QRect newEffectRect = sourced->paddedEffectRect(sourced->currentCachedSystem(), sourced->currentCachedMode(), newSourceRect);
     4728
     4729                QRect deviceRect(0, 0, painter->device()->width(), painter->device()->height());
     4730                if (deviceRect.contains(oldEffectRect) && deviceRect.contains(newEffectRect)) {
     4731                    sourced->setCachedOffset(newEffectRect.topLeft());
     4732                    unclipped = true;
     4733                }
     4734            }
     4735
    46894736            sourced->lastEffectTransform = painter->worldTransform();
    4690             sourced->invalidateCache(QGraphicsEffectSourcePrivate::TransformChanged);
     4737
     4738            if (!unclipped)
     4739                sourced->invalidateCache(QGraphicsEffectSourcePrivate::TransformChanged);
    46914740        }
    46924741
     
    47074756                                 bool wasDirtyParentSceneTransform, bool drawItem)
    47084757{
    4709     const bool itemIsFullyTransparent = (opacity < 0.0001);
     4758    const bool itemIsFullyTransparent = QGraphicsItemPrivate::isOpacityNull(opacity);
    47104759    const bool itemClipsChildrenToShape = (item->d_ptr->flags & QGraphicsItem::ItemClipsChildrenToShape);
    47114760    const bool itemHasChildren = !item->d_ptr->children.isEmpty();
     
    47224771            else
    47234772                painter->setWorldTransform(*transformPtr);
    4724             painter->setClipPath(item->shape(), Qt::IntersectClip);
     4773            QRectF clipRect;
     4774            const QPainterPath clipPath(item->shape());
     4775            if (QPathClipper::pathToRect(clipPath, &clipRect))
     4776                painter->setClipRect(clipRect, Qt::IntersectClip);
     4777            else
     4778                painter->setClipPath(clipPath, Qt::IntersectClip);
    47254779        }
    47264780
     
    47584812        }
    47594813
    4760         if (itemClipsToShape)
    4761             painter->setClipPath(item->shape(), Qt::IntersectClip);
     4814        if (itemClipsToShape) {
     4815            QRectF clipRect;
     4816            const QPainterPath clipPath(item->shape());
     4817            if (QPathClipper::pathToRect(clipPath, &clipRect))
     4818                painter->setClipRect(clipRect, Qt::IntersectClip);
     4819            else
     4820                painter->setClipPath(clipPath, Qt::IntersectClip);
     4821        }
    47624822        painter->setOpacity(opacity);
    47634823
     
    48604920        item->d_ptr->ignoreOpacity = 1;
    48614921
    4862     QGraphicsItem *p = item->d_ptr->parent;
    4863     while (p) {
    4864         p->d_ptr->dirtyChildren = 1;
    4865 #ifndef QT_NO_GRAPHICSEFFECT
    4866         if (p->d_ptr->graphicsEffect && p->d_ptr->graphicsEffect->isEnabled()) {
    4867             p->d_ptr->dirty = 1;
    4868             p->d_ptr->fullUpdatePending = 1;
    4869         }
    4870 #endif //QT_NO_GRAPHICSEFFECT
    4871         p = p->d_ptr->parent;
    4872     }
     4922    item->d_ptr->markParentDirty();
    48734923}
    48744924
     
    49454995
    49464996    const qreal opacity = item->d_ptr->combineOpacityFromParent(parentOpacity);
    4947     const bool itemIsFullyTransparent = !item->d_ptr->ignoreOpacity && opacity < 0.0001;
     4997    const bool itemIsFullyTransparent = !item->d_ptr->ignoreOpacity
     4998                                        && QGraphicsItemPrivate::isOpacityNull(opacity);
    49484999    if (itemIsFullyTransparent && (!itemHasChildren || item->d_ptr->childrenCombineOpacity())) {
    49495000        resetDirtyItem(item, /*recursive=*/itemHasChildren);
     
    51185169        d->_q_polishItems();
    51195170
     5171    d->updateAll = false;
    51205172    QTransform viewTransform = painter->worldTransform();
    51215173    Q_UNUSED(options);
Note: See TracChangeset for help on using the changeset viewer.