summaryrefslogtreecommitdiffstats
path: root/src/declarative/graphicsitems/qmlgraphicspositioners.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/declarative/graphicsitems/qmlgraphicspositioners.cpp')
-rw-r--r--src/declarative/graphicsitems/qmlgraphicspositioners.cpp141
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);