summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAlan Alpert <alan.alpert@nokia.com>2009-11-03 22:53:12 (GMT)
committerAlan Alpert <alan.alpert@nokia.com>2009-11-04 01:55:00 (GMT)
commit4e8df537210736d8a723a409e5e01046efa44a39 (patch)
tree357c25e3fcc75e3a54bfe5a78f03ecd165ed3e95
parentafcbf6a97744a7b113dc5ce542618a5543aead91 (diff)
downloadQt-4e8df537210736d8a723a409e5e01046efa44a39.zip
Qt-4e8df537210736d8a723a409e5e01046efa44a39.tar.gz
Qt-4e8df537210736d8a723a409e5e01046efa44a39.tar.bz2
Position items in the correct order
Nearly fixes QT-2241, but still waiting for a signal to appear in QGraphicsItem which allows up to reposition items after a change.
-rw-r--r--src/declarative/graphicsitems/qmlgraphicspositioners.cpp21
-rw-r--r--src/declarative/graphicsitems/qmlgraphicspositioners_p.h1
-rw-r--r--tests/auto/declarative/layouts/tst_layouts.cpp25
3 files changed, 39 insertions, 8 deletions
diff --git a/src/declarative/graphicsitems/qmlgraphicspositioners.cpp b/src/declarative/graphicsitems/qmlgraphicspositioners.cpp
index f599025..b4544c5 100644
--- a/src/declarative/graphicsitems/qmlgraphicspositioners.cpp
+++ b/src/declarative/graphicsitems/qmlgraphicspositioners.cpp
@@ -209,7 +209,12 @@ void QmlGraphicsBasePositioner::prePositioning()
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*>();
+
for (int ii = 0; ii < children.count(); ++ii) {
QmlGraphicsItem *child = qobject_cast<QmlGraphicsItem *>(children.at(ii));
if (!child)
@@ -234,6 +239,7 @@ void QmlGraphicsBasePositioner::prePositioning()
d->_newItems+=child;
}
allItems += child;
+ positionedItems << child;
}
QSet<QmlGraphicsItem *> deletedItems = d->_items - allItems;
foreach(QmlGraphicsItem *child, d->_items){
@@ -497,9 +503,9 @@ void QmlGraphicsColumn::doPositioning()
}
}
- QList<QGraphicsItem *> children = childItems();
+ QList<QmlGraphicsItem *> children = positionedItems;
for (int ii = 0; ii < children.count(); ++ii) {
- QmlGraphicsItem *child = qobject_cast<QmlGraphicsItem *>(children.at(ii));
+ QmlGraphicsItem *child = children.at(ii);
if (!child || isInvisible(child))
continue;
@@ -653,9 +659,9 @@ void QmlGraphicsRow::doPositioning()
applyRemove(changes, item);
}
}
- QList<QGraphicsItem *> children = childItems();
+ QList<QmlGraphicsItem *> children = positionedItems;
for (int ii = 0; ii < children.count(); ++ii) {
- QmlGraphicsItem *child = qobject_cast<QmlGraphicsItem *>(children.at(ii));
+ QmlGraphicsItem *child = children.at(ii);
if (!child || isInvisible(child))
continue;
@@ -859,7 +865,7 @@ void QmlGraphicsGrid::doPositioning()
QList<int> maxColWidth;
QList<int> maxRowHeight;
int childIndex =0;
- QList<QGraphicsItem *> children = childItems();
+ QList<QmlGraphicsItem *> children = positionedItems;
for (int i=0; i<r; i++){
for (int j=0; j<c; j++){
if (j==0)
@@ -869,7 +875,7 @@ void QmlGraphicsGrid::doPositioning()
if (childIndex == children.count())
continue;
- QmlGraphicsItem *child = qobject_cast<QmlGraphicsItem *>(children.at(childIndex++));
+ QmlGraphicsItem *child = children.at(childIndex++);
if (!child || isInvisible(child))
continue;
if (child->width() > maxColWidth[j])
@@ -889,8 +895,7 @@ void QmlGraphicsGrid::doPositioning()
applyRemove(changes, item);
}
}
- foreach(QGraphicsItem* schild, children){
- QmlGraphicsItem *child = qobject_cast<QmlGraphicsItem *>(schild);
+ foreach(QmlGraphicsItem* child, children){
if (!child || isInvisible(child))
continue;
bool needMove = (child->x()!=xoffset)||(child->y()!=yoffset);
diff --git a/src/declarative/graphicsitems/qmlgraphicspositioners_p.h b/src/declarative/graphicsitems/qmlgraphicspositioners_p.h
index 0011ec5..56adc8b 100644
--- a/src/declarative/graphicsitems/qmlgraphicspositioners_p.h
+++ b/src/declarative/graphicsitems/qmlgraphicspositioners_p.h
@@ -104,6 +104,7 @@ private Q_SLOTS:
protected:
QmlGraphicsBasePositioner(QmlGraphicsBasePositionerPrivate &dd, AutoUpdateType at, QmlGraphicsItem *parent);
void setMovingItem(QmlGraphicsItem *);
+ QList<QmlGraphicsItem *> positionedItems;
private:
void applyTransition(const QList<QPair<QString, QVariant> >& changes, QmlGraphicsItem* target,
diff --git a/tests/auto/declarative/layouts/tst_layouts.cpp b/tests/auto/declarative/layouts/tst_layouts.cpp
index b0df57ea..96729a3 100644
--- a/tests/auto/declarative/layouts/tst_layouts.cpp
+++ b/tests/auto/declarative/layouts/tst_layouts.cpp
@@ -58,6 +58,7 @@ private slots:
void test_grid();
void test_grid_spacing();
+ void test_repeater();
private:
QmlView *createView(const QString &filename);
};
@@ -222,6 +223,30 @@ void tst_QmlGraphicsLayouts::test_grid_spacing()
QCOMPARE(five->y(), 54.0);
}
+void tst_QmlGraphicsLayouts::test_repeater()
+{
+ QmlView *canvas = createView("data/repeater.qml");
+
+ canvas->execute();
+ qApp->processEvents();
+
+ QmlGraphicsRectangle *one = canvas->root()->findChild<QmlGraphicsRectangle*>("one");
+ QVERIFY(one != 0);
+
+ QmlGraphicsRectangle *two = canvas->root()->findChild<QmlGraphicsRectangle*>("two");
+ QVERIFY(two != 0);
+
+ QmlGraphicsRectangle *three = canvas->root()->findChild<QmlGraphicsRectangle*>("three");
+ QVERIFY(three != 0);
+
+ QCOMPARE(one->x(), 0.0);
+ QCOMPARE(one->y(), 0.0);
+ QCOMPARE(two->x(), 50.0);
+ QCOMPARE(two->y(), 0.0);
+ QCOMPARE(three->x(), 100.0);
+ QCOMPARE(three->y(), 0.0);
+}
+
QmlView *tst_QmlGraphicsLayouts::createView(const QString &filename)
{
QmlView *canvas = new QmlView(0);