summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMartin Jones <martin.jones@nokia.com>2010-09-17 03:46:44 (GMT)
committerJason McDonald <jason.mcdonald@nokia.com>2010-09-21 05:17:26 (GMT)
commite65aac1dbbeb26575554da10e2531694e8db5ac9 (patch)
tree9bb89bac82e633a71c81457da53480daa46f0742
parent6c1f0aeeeb589280adaec940844fc2af17cf1bd1 (diff)
downloadQt-e65aac1dbbeb26575554da10e2531694e8db5ac9.zip
Qt-e65aac1dbbeb26575554da10e2531694e8db5ac9.tar.gz
Qt-e65aac1dbbeb26575554da10e2531694e8db5ac9.tar.bz2
Moving items in a PathView caused PathView.onPath to be set to false.
Check that we no longer hold a reference to the item before setting onPath to false. Task-number: QTBUG-13689 Reviewed-by: Michael Brasser (cherry picked from commit 7e6b2b2b95bc1db77544b898ec45ea4a2683e435)
-rw-r--r--src/declarative/graphicsitems/qdeclarativepathview.cpp8
-rw-r--r--tests/auto/declarative/qdeclarativepathview/data/datamodel.qml1
-rw-r--r--tests/auto/declarative/qdeclarativepathview/tst_qdeclarativepathview.cpp23
3 files changed, 21 insertions, 11 deletions
diff --git a/src/declarative/graphicsitems/qdeclarativepathview.cpp b/src/declarative/graphicsitems/qdeclarativepathview.cpp
index 119ac3e..d134929 100644
--- a/src/declarative/graphicsitems/qdeclarativepathview.cpp
+++ b/src/declarative/graphicsitems/qdeclarativepathview.cpp
@@ -141,11 +141,13 @@ void QDeclarativePathViewPrivate::releaseItem(QDeclarativeItem *item)
{
if (!item || !model)
return;
- if (QDeclarativePathViewAttached *att = attached(item))
- att->setOnPath(false);
QDeclarativeItemPrivate *itemPrivate = static_cast<QDeclarativeItemPrivate*>(QGraphicsItemPrivate::get(item));
itemPrivate->removeItemChangeListener(this, QDeclarativeItemPrivate::Geometry);
- model->release(item);
+ if (model->release(item) == 0) {
+ // item was not destroyed, and we no longer reference it.
+ if (QDeclarativePathViewAttached *att = attached(item))
+ att->setOnPath(false);
+ }
}
QDeclarativePathViewAttached *QDeclarativePathViewPrivate::attached(QDeclarativeItem *item)
diff --git a/tests/auto/declarative/qdeclarativepathview/data/datamodel.qml b/tests/auto/declarative/qdeclarativepathview/data/datamodel.qml
index a5c3772..fb3c910 100644
--- a/tests/auto/declarative/qdeclarativepathview/data/datamodel.qml
+++ b/tests/auto/declarative/qdeclarativepathview/data/datamodel.qml
@@ -21,6 +21,7 @@ PathView {
Rectangle {
id: wrapper
objectName: "wrapper"
+ property bool onPath: PathView.onPath
width: 20; height: 20; color: name
Text {
objectName: "myText"
diff --git a/tests/auto/declarative/qdeclarativepathview/tst_qdeclarativepathview.cpp b/tests/auto/declarative/qdeclarativepathview/tst_qdeclarativepathview.cpp
index 74d2f0a..cbfbfbd 100644
--- a/tests/auto/declarative/qdeclarativepathview/tst_qdeclarativepathview.cpp
+++ b/tests/auto/declarative/qdeclarativepathview/tst_qdeclarativepathview.cpp
@@ -152,27 +152,27 @@ public:
QString number(int index) const { return list.at(index).second; }
void addItem(const QString &name, const QString &number) {
- emit beginInsertRows(QModelIndex(), list.count(), list.count());
+ beginInsertRows(QModelIndex(), list.count(), list.count());
list.append(QPair<QString,QString>(name, number));
- emit endInsertRows();
+ endInsertRows();
}
void insertItem(int index, const QString &name, const QString &number) {
- emit beginInsertRows(QModelIndex(), index, index);
+ beginInsertRows(QModelIndex(), index, index);
list.insert(index, QPair<QString,QString>(name, number));
- emit endInsertRows();
+ endInsertRows();
}
void removeItem(int index) {
- emit beginRemoveRows(QModelIndex(), index, index);
+ beginRemoveRows(QModelIndex(), index, index);
list.removeAt(index);
- emit endRemoveRows();
+ endRemoveRows();
}
void moveItem(int from, int to) {
- emit beginMoveRows(QModelIndex(), from, from, QModelIndex(), to);
+ beginMoveRows(QModelIndex(), from, from, QModelIndex(), to);
list.move(from, to);
- emit endMoveRows();
+ endMoveRows();
}
void modifyItem(int idx, const QString &name, const QString &number) {
@@ -411,6 +411,13 @@ void tst_QDeclarativePathView::dataModel()
QVERIFY(text);
QCOMPARE(text->text(), model.name(3));
+ model.moveItem(3, 5);
+ QTRY_COMPARE(findItems<QDeclarativeItem>(pathview, "wrapper").count(), 5);
+ QList<QDeclarativeItem*> items = findItems<QDeclarativeItem>(pathview, "wrapper");
+ foreach (QDeclarativeItem *item, items) {
+ QVERIFY(item->property("onPath").toBool());
+ }
+
delete canvas;
}