diff options
Diffstat (limited to 'src/declarative/graphicsitems/qmlgraphicspositioners.cpp')
-rw-r--r-- | src/declarative/graphicsitems/qmlgraphicspositioners.cpp | 141 |
1 files changed, 83 insertions, 58 deletions
diff --git a/src/declarative/graphicsitems/qmlgraphicspositioners.cpp b/src/declarative/graphicsitems/qmlgraphicspositioners.cpp index 65e63eb..db0cc7c 100644 --- a/src/declarative/graphicsitems/qmlgraphicspositioners.cpp +++ b/src/declarative/graphicsitems/qmlgraphicspositioners.cpp @@ -39,49 +39,52 @@ ** ****************************************************************************/ +#include "qmlgraphicspositioners_p.h" +#include "qmlgraphicspositioners_p_p.h" + +#include <qml.h> +#include <qmlstate_p.h> +#include <qmlstategroup_p.h> +#include <qmlstateoperations_p.h> +#include <qfxperf_p_p.h> + #include <QDebug> #include <QCoreApplication> -#include "qml.h" -#include <private/qmlstate_p.h> -#include <private/qmlstategroup_p.h> -#include <private/qmlstateoperations_p.h> -#include <private/qfxperf_p_p.h> -#include <private/qmlgraphicspositioners_p.h> -#include <private/qmlgraphicspositioners_p_p.h> - QT_BEGIN_NAMESPACE +int QmlGraphicsBasePositionerPrivate::prePosIdx = -1; +int QmlGraphicsBasePositionerPrivate::visibleIdx = -1; +int QmlGraphicsBasePositionerPrivate::opacityIdx = -1; + + void QmlGraphicsBasePositionerPrivate::watchChanges(QmlGraphicsItem *other) { Q_Q(QmlGraphicsBasePositioner); - QObject::connect(other, SIGNAL(visibleChanged()), - q, SLOT(prePositioning())); - QObject::connect(other, SIGNAL(opacityChanged()), - q, SLOT(prePositioning())); - QObject::connect(other, SIGNAL(heightChanged()), - q, SLOT(prePositioning())); - QObject::connect(other, SIGNAL(widthChanged()), - q, SLOT(prePositioning())); - static_cast<QmlGraphicsItemPrivate*>(QGraphicsItemPrivate::get(other))->registerSiblingOrderNotification(this); + QMetaObject::connect(other, visibleIdx, q, prePosIdx); + QMetaObject::connect(other, opacityIdx, q, prePosIdx); + + QmlGraphicsItemPrivate *otherPrivate = static_cast<QmlGraphicsItemPrivate*>(QGraphicsItemPrivate::get(other)); + + otherPrivate->connectToHeightChanged(q, prePosIdx); + otherPrivate->connectToWidthChanged(q, prePosIdx); + + otherPrivate->registerSiblingOrderNotification(this); watched << other; } void QmlGraphicsBasePositionerPrivate::unwatchChanges(QmlGraphicsItem* other) { Q_Q(QmlGraphicsBasePositioner); + QmlGraphicsItemPrivate *otherPrivate = static_cast<QmlGraphicsItemPrivate*>(QGraphicsItemPrivate::get(other)); bool stillAlive = false; //Use the return from disconnect to see if it was deleted or just reparented - stillAlive |= QObject::disconnect(other, SIGNAL(visibleChanged()), - q, SLOT(prePositioning())); - stillAlive |= QObject::disconnect(other, SIGNAL(opacityChanged()), - q, SLOT(prePositioning())); - stillAlive |= QObject::disconnect(other, SIGNAL(heightChanged()), - q, SLOT(prePositioning())); - stillAlive |= QObject::disconnect(other, SIGNAL(widthChanged()), - q, SLOT(prePositioning())); + stillAlive |= QMetaObject::disconnect(other, visibleIdx, q, prePosIdx); + stillAlive |= QMetaObject::disconnect(other, opacityIdx, q, prePosIdx); + stillAlive |= otherPrivate->disconnectFromHeightChanged(q, prePosIdx); + stillAlive |= otherPrivate->disconnectFromWidthChanged(q, prePosIdx); + if(stillAlive) - static_cast<QmlGraphicsItemPrivate*>(QGraphicsItemPrivate::get(other)) - ->unregisterSiblingOrderNotification(this); + otherPrivate->unregisterSiblingOrderNotification(this); watched.removeAll(other); } @@ -242,36 +245,52 @@ void QmlGraphicsBasePositioner::prePositioning() d->_ep = true; QCoreApplication::postEvent(this, new QEvent(QEvent::User)); } - QSet<QmlGraphicsItem *> allItems; //Need to order children by creation order modified by stacking order //###can we avoid using the QGraphicsItemPrivate? QList<QGraphicsItem *> children = childItems(); qSort(children.begin(), children.end(), d->insertionOrder); - positionedItems = QList<QmlGraphicsItem*>(); + positionedItems.clear(); - for (int ii = 0; ii < children.count(); ++ii) { - QmlGraphicsItem *child = qobject_cast<QmlGraphicsItem *>(children.at(ii)); - if (!child) - continue; - if (!d->_items.contains(child)){ + if (d->_items.isEmpty()) { + for (int ii = 0; ii < children.count(); ++ii) { + QmlGraphicsItem *child = qobject_cast<QmlGraphicsItem *>(children.at(ii)); + if (!child) + continue; d->watchChanges(child); d->_items += child; + if (child->opacity() != 0.0) + d->_newItems += child; + positionedItems << child; } - if (child->opacity() == 0.0){ - if (d->_stableItems.contains(child)){ - d->_leavingItems += child; - d->_stableItems -= child; + } else { + QSet<QmlGraphicsItem *> allItems; + allItems.reserve(children.count()); + for (int ii = 0; ii < children.count(); ++ii) { + QmlGraphicsItem *child = qobject_cast<QmlGraphicsItem *>(children.at(ii)); + if (!child) + continue; + if (!d->_items.contains(child)){ + d->watchChanges(child); + d->_items += child; + } + if (child->opacity() == 0.0){ + if (d->_stableItems.contains(child)){ + d->_leavingItems += child; + d->_stableItems -= child; + } + }else if (!d->_stableItems.contains(child)){ + d->_newItems+=child; + } + allItems += child; + positionedItems << child; + } + if (d->_items.count() != allItems.count()) { + QSet<QmlGraphicsItem *> deletedItems = d->_items - allItems; + foreach(QmlGraphicsItem *child, deletedItems){ + d->unwatchChanges(child); + d->_items -= child; } - }else if (!d->_stableItems.contains(child)){ - d->_newItems+=child; } - allItems += child; - positionedItems << child; - } - QSet<QmlGraphicsItem *> deletedItems = d->_items - allItems; - foreach(QmlGraphicsItem *child, deletedItems){ - d->unwatchChanges(child); - d->_items -= child; } d->_animated.clear(); doPositioning(); @@ -471,7 +490,7 @@ QmlGraphicsColumn::QmlGraphicsColumn(QmlGraphicsItem *parent) { } -inline bool isInvisible(QmlGraphicsItem *child) +static inline bool isInvisible(QmlGraphicsItem *child) { return child->opacity() == 0.0 || !child->isVisible() || !child->width() || !child->height(); } @@ -495,12 +514,15 @@ void QmlGraphicsColumn::doPositioning() bool needMove = (child->y() != voffset || child->x()); - QList<QPair<QString, QVariant> > changes; - changes << qMakePair(QString(QLatin1String("y")),QVariant(voffset)); - changes << qMakePair(QString(QLatin1String("x")),QVariant(0)); - if (needMove && items()->contains(child) && move()) { + if (needMove && move() && items()->contains(child)) { + QList<QPair<QString, QVariant> > changes; + changes << qMakePair(QString(QLatin1String("y")),QVariant(voffset)); + changes << qMakePair(QString(QLatin1String("x")),QVariant(0)); applyMove(changes,child); - } else if (!items()->contains(child) && add()) { + } else if (add() && !items()->contains(child)) { + QList<QPair<QString, QVariant> > changes; + changes << qMakePair(QString(QLatin1String("y")),QVariant(voffset)); + changes << qMakePair(QString(QLatin1String("x")),QVariant(0)); applyAdd(changes,child); } else if (needMove) { setMovingItem(child); @@ -630,12 +652,15 @@ void QmlGraphicsRow::doPositioning() bool needMove = (child->x() != hoffset || child->y()); - QList<QPair<QString, QVariant> > changes; - changes << qMakePair(QString(QLatin1String("x")),QVariant(hoffset)); - changes << qMakePair(QString(QLatin1String("y")),QVariant(0)); - if (needMove && items()->contains(child) && move()) { + if (needMove && move() && items()->contains(child)) { + QList<QPair<QString, QVariant> > changes; + changes << qMakePair(QString(QLatin1String("x")),QVariant(hoffset)); + changes << qMakePair(QString(QLatin1String("y")),QVariant(0)); applyMove(changes,child); - } else if (!items()->contains(child) && add()) { + } else if (add() && !items()->contains(child)) { + QList<QPair<QString, QVariant> > changes; + changes << qMakePair(QString(QLatin1String("x")),QVariant(hoffset)); + changes << qMakePair(QString(QLatin1String("y")),QVariant(0)); applyAdd(changes,child); } else if (needMove) { setMovingItem(child); |