aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/qml/types/qqmlinstantiator.cpp2
-rw-r--r--tests/auto/qml/qqmlinstantiator/data/createAndRemove.qml18
-rw-r--r--tests/auto/qml/qqmlinstantiator/qqmlinstantiator.pro1
-rw-r--r--tests/auto/qml/qqmlinstantiator/stringmodel.h126
-rw-r--r--tests/auto/qml/qqmlinstantiator/tst_qqmlinstantiator.cpp24
5 files changed, 170 insertions, 1 deletions
diff --git a/src/qml/types/qqmlinstantiator.cpp b/src/qml/types/qqmlinstantiator.cpp
index f7b2f9254a..c28cfad9e3 100644
--- a/src/qml/types/qqmlinstantiator.cpp
+++ b/src/qml/types/qqmlinstantiator.cpp
@@ -115,7 +115,7 @@ void QQmlInstantiatorPrivate::_q_createdItem(int idx, QObject* item)
if (objects.contains(item)) //Case when it was created synchronously in regenerate
return;
item->setParent(q);
- objects << item;
+ objects.insert(idx, item);
if (objects.count() == 1)
q->objectChanged();
q->objectAdded(idx, item);
diff --git a/tests/auto/qml/qqmlinstantiator/data/createAndRemove.qml b/tests/auto/qml/qqmlinstantiator/data/createAndRemove.qml
new file mode 100644
index 0000000000..5dd322b5f5
--- /dev/null
+++ b/tests/auto/qml/qqmlinstantiator/data/createAndRemove.qml
@@ -0,0 +1,18 @@
+import QtQml 2.1
+import QtQuick 2.1
+
+Rectangle {
+ Instantiator {
+ objectName: "instantiator1"
+ model: model1
+ delegate: QtObject {
+ property string datum: model.text
+ }
+ }
+ Component.onCompleted: {
+ model1.add("Delta");
+ model1.add("Gamma");
+ model1.add("Beta");
+ model1.add("Alpha");
+ }
+}
diff --git a/tests/auto/qml/qqmlinstantiator/qqmlinstantiator.pro b/tests/auto/qml/qqmlinstantiator/qqmlinstantiator.pro
index aa83da1509..719fd6c350 100644
--- a/tests/auto/qml/qqmlinstantiator/qqmlinstantiator.pro
+++ b/tests/auto/qml/qqmlinstantiator/qqmlinstantiator.pro
@@ -4,6 +4,7 @@ macx:CONFIG -= app_bundle
INCLUDEPATH += ../../shared/
SOURCES += tst_qqmlinstantiator.cpp
+HEADERS += stringmodel.h
include (../../shared/util.pri)
diff --git a/tests/auto/qml/qqmlinstantiator/stringmodel.h b/tests/auto/qml/qqmlinstantiator/stringmodel.h
new file mode 100644
index 0000000000..c66aa5886a
--- /dev/null
+++ b/tests/auto/qml/qqmlinstantiator/stringmodel.h
@@ -0,0 +1,126 @@
+/****************************************************************************
+**
+** Copyright (C) 2013 Dmitrii Kosarev aka Kakadu <kakadu.hafanana@gmail.com>
+** Contact: http://www.qt-project.org/legal
+**
+** This file is part of the test suite of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and Digia. For licensing terms and
+** conditions see http://qt.digia.com/licensing. For further information
+** use the contact form at http://qt.digia.com/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Digia gives you certain additional
+** rights. These rights are described in the Digia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+#ifndef STRINGMODEL_H
+#define STRINGMODEL_H
+
+#include <QtCore/QObject>
+#include <QtCore/QAbstractItemModel>
+#include <QtCore/QDebug>
+
+class StringModel : public QAbstractItemModel
+{
+ Q_OBJECT
+ QVector<QString> items;
+ QHash<int, QByteArray> roles;
+ QString name;
+
+public:
+ explicit StringModel(const QString& name) : QAbstractItemModel(), name(name)
+ {
+ roles.insert(555, "text");
+ }
+
+ void drop(int count)
+ {
+ beginRemoveRows(QModelIndex(), 0, count-1);
+ for (int i=0; i<count; i++)
+ items.pop_front();
+ endRemoveRows();
+ }
+
+ Q_INVOKABLE void add(QString s)
+ {
+ beginInsertRows(QModelIndex(), 0, 0);
+ items.push_front(s);
+ endInsertRows();
+ }
+
+ int rowCount(const QModelIndex &) const
+ {
+ return items.count();
+ }
+
+ virtual QHash<int, QByteArray> roleNames() const Q_DECL_OVERRIDE
+ {
+ return roles;
+ }
+
+ virtual int columnCount(const QModelIndex &) const
+ {
+ return 1;
+ }
+
+ virtual bool hasChildren(const QModelIndex &) const Q_DECL_OVERRIDE
+ {
+ return rowCount(QModelIndex()) > 0;
+ }
+
+ virtual QModelIndex index(int row, int column, const QModelIndex &parent) const
+ {
+ Q_UNUSED(column);
+ if (row>=0 && row<rowCount(parent))
+ return createIndex(row,0);
+ else
+ return QModelIndex();
+ }
+
+ virtual QModelIndex parent(const QModelIndex &) const
+ {
+ return QModelIndex();
+ }
+
+ QVariant data (const QModelIndex & index, int role) const
+ {
+ int row = index.row();
+ if ((row<0) || (row>=items.count()))
+ return QVariant::Invalid;
+
+ switch (role) {
+ case Qt::DisplayRole:
+ case 555:
+ return QVariant::fromValue(items.at(row));
+ default:
+ return QVariant();
+ }
+ }
+};
+
+#endif // STRINGMODEL_H
diff --git a/tests/auto/qml/qqmlinstantiator/tst_qqmlinstantiator.cpp b/tests/auto/qml/qqmlinstantiator/tst_qqmlinstantiator.cpp
index 3e90eb2cbe..1b31e55e2d 100644
--- a/tests/auto/qml/qqmlinstantiator/tst_qqmlinstantiator.cpp
+++ b/tests/auto/qml/qqmlinstantiator/tst_qqmlinstantiator.cpp
@@ -45,7 +45,9 @@
#include <QtQml/qqmlengine.h>
#include <QtQml/qqmlcomponent.h>
#include <QtQml/private/qqmlinstantiator_p.h>
+#include <QtQml/qqmlcontext.h>
#include "../../shared/util.h"
+#include "stringmodel.h"
class tst_qqmlinstantiator: public QQmlDataTest
{
@@ -58,6 +60,7 @@ private slots:
void stringModel();
void activeProperty();
void intModelChange();
+ void createAndRemove();
};
void tst_qqmlinstantiator::createNone()
@@ -193,6 +196,27 @@ void tst_qqmlinstantiator::intModelChange()
}
}
+void tst_qqmlinstantiator::createAndRemove()
+{
+ QQmlEngine engine;
+ QQmlComponent component(&engine, testFileUrl("createAndRemove.qml"));
+ StringModel *model = new StringModel("model1");
+ engine.rootContext()->setContextProperty("model1", model);
+ QObject *rootObject = component.create();
+ QVERIFY(rootObject != 0);
+
+ QQmlInstantiator *instantiator =
+ qobject_cast<QQmlInstantiator*>(rootObject->findChild<QObject*>("instantiator1"));
+ QVERIFY(instantiator != 0);
+ model->drop(1);
+ QVector<QString> names;
+ names << "Beta" << "Gamma" << "Delta";
+ for (int i=0; i<3; i++) {
+ QObject *object = instantiator->objectAt(i);
+ QVERIFY(object);
+ QCOMPARE(object->property("datum").toString(), names[i]);
+ }
+}
QTEST_MAIN(tst_qqmlinstantiator)
#include "tst_qqmlinstantiator.moc"