aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAlbert Astals Cid <albert.astals@canonical.com>2013-10-16 17:20:59 +0200
committerThe Qt Project <gerrit-noreply@qt-project.org>2013-10-21 09:09:15 +0200
commit9bbb073592989565ec407c19ec2492dfba9317c4 (patch)
tree255b3de8d83da47c4f71f1c0fb514e140f4f37e8
parentb93ddb95a74fff4bc61073b6b04e9dd7a7dc7f36 (diff)
Reset on model layout changed
Otherwise the next dataChanged from the model may not be received Change-Id: I16b859d92fdb1823c4a56c297d4451abe438fbb1 Reviewed-by: Stephen Kelly <stephen.kelly@kdab.com>
-rw-r--r--src/qml/types/qqmldelegatemodel.cpp3
-rw-r--r--tests/auto/quick/qquicklistview/data/proxytest.qml77
-rw-r--r--tests/auto/quick/qquicklistview/proxytestinnermodel.cpp112
-rw-r--r--tests/auto/quick/qquicklistview/proxytestinnermodel.h69
-rw-r--r--tests/auto/quick/qquicklistview/qquicklistview.pro6
-rw-r--r--tests/auto/quick/qquicklistview/tst_qquicklistview.cpp22
6 files changed, 285 insertions, 4 deletions
diff --git a/src/qml/types/qqmldelegatemodel.cpp b/src/qml/types/qqmldelegatemodel.cpp
index 179dcfe373..10f957ab40 100644
--- a/src/qml/types/qqmldelegatemodel.cpp
+++ b/src/qml/types/qqmldelegatemodel.cpp
@@ -1524,8 +1524,7 @@ void QQmlDelegateModel::_q_dataChanged(const QModelIndex &begin, const QModelInd
void QQmlDelegateModel::_q_layoutChanged()
{
- Q_D(QQmlDelegateModel);
- _q_itemsChanged(0, d->m_count, QVector<int>());
+ _q_modelReset();
}
QQmlDelegateModelAttached *QQmlDelegateModel::qmlAttachedProperties(QObject *obj)
diff --git a/tests/auto/quick/qquicklistview/data/proxytest.qml b/tests/auto/quick/qquicklistview/data/proxytest.qml
new file mode 100644
index 0000000000..ce713d39c8
--- /dev/null
+++ b/tests/auto/quick/qquicklistview/data/proxytest.qml
@@ -0,0 +1,77 @@
+/****************************************************************************
+**
+** Copyright (C) 2013 Canonical Limited and/or its subsidiary(-ies).
+** 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$
+**
+****************************************************************************/
+
+import QtQuick 2.1
+import Proxy 1.0
+
+Item {
+
+ ProxyTestInnerModel {
+ id: innerModel
+ }
+
+ QSortFilterProxyModel {
+ id: outerModel
+ sourceModel: innerModel
+ filterRegExp: RegExp("^H.*$")
+ }
+
+ width: 400
+ height: 400
+ ListView {
+ anchors.fill: parent
+ orientation: Qt.Vertical
+ model: outerModel
+ delegate: Rectangle {
+ width: 400
+ height: 50
+ color: index % 2 ? "red" : "yellow"
+ }
+ }
+
+ Timer {
+ running: true
+ interval: 500
+ onTriggered: {
+ innerModel.doStuff();
+ }
+ }
+}
diff --git a/tests/auto/quick/qquicklistview/proxytestinnermodel.cpp b/tests/auto/quick/qquicklistview/proxytestinnermodel.cpp
new file mode 100644
index 0000000000..80b59f2f19
--- /dev/null
+++ b/tests/auto/quick/qquicklistview/proxytestinnermodel.cpp
@@ -0,0 +1,112 @@
+/****************************************************************************
+**
+** Copyright (C) 2013 Canonical Limited and/or its subsidiary(-ies).
+** 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$
+**
+****************************************************************************/
+
+#include "proxytestinnermodel.h"
+
+ProxyTestInnerModel::ProxyTestInnerModel()
+{
+ append("Adios");
+ append("Hola");
+ append("Halo");
+}
+
+QModelIndex ProxyTestInnerModel::index(int row, int column, const QModelIndex &parent) const
+{
+ if (parent.isValid())
+ return QModelIndex();
+
+ return createIndex(row, column);
+}
+
+QModelIndex ProxyTestInnerModel::parent(const QModelIndex & /*parent*/) const
+{
+ return QModelIndex();
+}
+
+int ProxyTestInnerModel::rowCount(const QModelIndex &parent) const
+{
+ if (parent.isValid())
+ return 0;
+
+ return m_values.count();
+}
+
+int ProxyTestInnerModel::columnCount(const QModelIndex &parent) const
+{
+ if (parent.isValid())
+ return 0;
+
+ return 1;
+}
+
+QVariant ProxyTestInnerModel::data(const QModelIndex &index, int role) const
+{
+ if (role != Qt::DisplayRole)
+ return QVariant();
+
+ return m_values[index.row()];
+}
+
+void ProxyTestInnerModel::append(const QString &s)
+{
+ beginInsertRows(QModelIndex(), m_values.count(), m_values.count());
+ m_values << s;
+ endInsertRows();
+}
+
+void ProxyTestInnerModel::setValue(int i, const QString &s)
+{
+ m_values[i] = s;
+ Q_EMIT dataChanged(index(i, 0), index(i, 0));
+}
+
+void ProxyTestInnerModel::moveTwoToZero()
+{
+ beginMoveRows(QModelIndex(), 2, 2, QModelIndex(), 0);
+ m_values.move(2, 0);
+ endMoveRows();
+}
+
+void ProxyTestInnerModel::doStuff()
+{
+ moveTwoToZero();
+ setValue(1, "Hilo");
+}
diff --git a/tests/auto/quick/qquicklistview/proxytestinnermodel.h b/tests/auto/quick/qquicklistview/proxytestinnermodel.h
new file mode 100644
index 0000000000..1983e69d49
--- /dev/null
+++ b/tests/auto/quick/qquicklistview/proxytestinnermodel.h
@@ -0,0 +1,69 @@
+/****************************************************************************
+**
+** Copyright (C) 2013 Canonical Limited and/or its subsidiary(-ies).
+** 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 INNERMODEL_H
+#define INNERMODEL_H
+
+#include <QAbstractItemModel>
+
+class ProxyTestInnerModel : public QAbstractItemModel
+{
+ Q_OBJECT
+public:
+ ProxyTestInnerModel();
+ virtual QModelIndex index(int row, int column, const QModelIndex &parent = QModelIndex()) const;
+ virtual QModelIndex parent(const QModelIndex & /*parent*/) const;
+ virtual int rowCount(const QModelIndex &parent = QModelIndex()) const;
+ virtual int columnCount(const QModelIndex &parent) const;
+ virtual QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const;
+
+ Q_INVOKABLE void doStuff();
+
+private:
+ void append(const QString &s);
+ void setValue(int i, const QString &s);
+ void moveTwoToZero();
+
+private:
+ QList<QString> m_values;
+};
+
+#endif
diff --git a/tests/auto/quick/qquicklistview/qquicklistview.pro b/tests/auto/quick/qquicklistview/qquicklistview.pro
index a745c1ae46..4ac47679da 100644
--- a/tests/auto/quick/qquicklistview/qquicklistview.pro
+++ b/tests/auto/quick/qquicklistview/qquicklistview.pro
@@ -3,9 +3,11 @@ testcase.timeout = 900 # this test is slow
TARGET = tst_qquicklistview
macx:CONFIG -= app_bundle
-HEADERS += incrementalmodel.h
+HEADERS += incrementalmodel.h \
+ proxytestinnermodel.h
SOURCES += tst_qquicklistview.cpp \
- incrementalmodel.cpp
+ incrementalmodel.cpp \
+ proxytestinnermodel.cpp
include (../../shared/util.pri)
include (../shared/util.pri)
diff --git a/tests/auto/quick/qquicklistview/tst_qquicklistview.cpp b/tests/auto/quick/qquicklistview/tst_qquicklistview.cpp
index 5b1dfc7e83..f62151c2d8 100644
--- a/tests/auto/quick/qquicklistview/tst_qquicklistview.cpp
+++ b/tests/auto/quick/qquicklistview/tst_qquicklistview.cpp
@@ -54,6 +54,7 @@
#include "../shared/viewtestutil.h"
#include "../shared/visualtestutil.h"
#include "incrementalmodel.h"
+#include "proxytestinnermodel.h"
#include <math.h>
Q_DECLARE_METATYPE(Qt::LayoutDirection)
@@ -210,6 +211,7 @@ private slots:
void accessEmptyCurrentItem_QTBUG_30227();
void delayedChanges_QTBUG_30555();
void outsideViewportChangeNotAffectingView();
+ void testProxyModelChangedAfterMove();
private:
template <class T> void items(const QUrl &source);
@@ -319,6 +321,9 @@ void tst_QQuickListView::init()
m_view = 0;
}
#endif
+ qmlRegisterType<QAbstractItemModel>();
+ qmlRegisterType<ProxyTestInnerModel>("Proxy", 1, 0, "ProxyTestInnerModel");
+ qmlRegisterType<QSortFilterProxyModel>("Proxy", 1, 0, "QSortFilterProxyModel");
}
void tst_QQuickListView::cleanupTestCase()
@@ -6938,6 +6943,23 @@ void tst_QQuickListView::outsideViewportChangeNotAffectingView()
delete window;
}
+void tst_QQuickListView::testProxyModelChangedAfterMove()
+{
+ QQuickView *window = createView();
+ QQuickViewTestUtil::moveMouseAway(window);
+ window->setSource(testFileUrl("proxytest.qml"));
+
+ QQuickListView *listview = window->rootObject()->findChild<QQuickListView*>();
+ QTRY_VERIFY(listview != 0);
+
+ window->show();
+ QVERIFY(QTest::qWaitForWindowExposed(window));
+
+ QTRY_COMPARE(listview->count(), 3);
+
+ delete window;
+}
+
QTEST_MAIN(tst_QQuickListView)
#include "tst_qquicklistview.moc"