0134d56
From 51b5565f2647e4c0f298c75e7566252d230e1ba6 Mon Sep 17 00:00:00 2001
faff1df
From: Aleix Pol <aleixpol@kde.org>
faff1df
Date: Thu, 23 Sep 2021 03:43:04 +0200
0134d56
Subject: [PATCH 02/30] QQmlDelegateModel: Refresh the view when a column is
faff1df
 added at 0
faff1df
faff1df
It can happen that a model reports n>0 rows but columns=0 (See
faff1df
QConcatenateTablesProxyModel). In those cases we would render glitchy
faff1df
items until the elements are marked as dirty.
faff1df
faff1df
Change-Id: I615c9cacbb1b6f9dee3898b03476605e5ac39d0a
faff1df
Reviewed-by: Ulf Hermann <ulf.hermann@qt.io>
faff1df
(cherry picked from commit ec9251efb918f37971aeefa1f687d137d037ff12)
faff1df
Reviewed-by: Qt Cherry-pick Bot <cherrypick_bot@qt-project.org>
faff1df
Signed-off-by: Aleix Pol <aleixpol@kde.org>
faff1df
---
faff1df
 src/qmlmodels/qqmldelegatemodel.cpp           | 44 +++++++++++++++++++
faff1df
 src/qmlmodels/qqmldelegatemodel_p.h           |  3 ++
faff1df
 .../data/redrawUponColumnChange.qml           | 11 +++++
faff1df
 .../tst_qqmldelegatemodel.cpp                 | 27 ++++++++++++
faff1df
 4 files changed, 85 insertions(+)
faff1df
 create mode 100644 tests/auto/qml/qqmldelegatemodel/data/redrawUponColumnChange.qml
faff1df
faff1df
diff --git a/src/qmlmodels/qqmldelegatemodel.cpp b/src/qmlmodels/qqmldelegatemodel.cpp
b0486fb
index 4fcff70de6..4157899aa6 100644
faff1df
--- a/src/qmlmodels/qqmldelegatemodel.cpp
faff1df
+++ b/src/qmlmodels/qqmldelegatemodel.cpp
faff1df
@@ -389,6 +389,12 @@ void QQmlDelegateModelPrivate::connectToAbstractItemModel()
faff1df
                       q,  QQmlDelegateModel, SLOT(_q_rowsRemoved(QModelIndex,int,int)));
faff1df
     qmlobject_connect(aim, QAbstractItemModel, SIGNAL(rowsAboutToBeRemoved(QModelIndex,int,int)),
faff1df
                       q,  QQmlDelegateModel, SLOT(_q_rowsAboutToBeRemoved(QModelIndex,int,int)));
faff1df
+    qmlobject_connect(aim, QAbstractItemModel, SIGNAL(columnsInserted(QModelIndex,int,int)),
faff1df
+                      q, QQmlDelegateModel, SLOT(_q_columnsInserted(QModelIndex,int,int)));
faff1df
+    qmlobject_connect(aim, QAbstractItemModel, SIGNAL(columnsRemoved(QModelIndex,int,int)),
faff1df
+                      q, QQmlDelegateModel, SLOT(_q_columnsRemoved(QModelIndex,int,int)));
faff1df
+    qmlobject_connect(aim, QAbstractItemModel, SIGNAL(columnsMoved(QModelIndex,int,int,QModelIndex,int)),
faff1df
+                      q, QQmlDelegateModel, SLOT(_q_columnsMoved(QModelIndex,int,int,QModelIndex,int)));
faff1df
     qmlobject_connect(aim, QAbstractItemModel, SIGNAL(dataChanged(QModelIndex,QModelIndex,QVector<int>)),
faff1df
                       q, QQmlDelegateModel, SLOT(_q_dataChanged(QModelIndex,QModelIndex,QVector<int>)));
faff1df
     qmlobject_connect(aim, QAbstractItemModel, SIGNAL(rowsMoved(QModelIndex,int,int,QModelIndex,int)),
faff1df
@@ -413,6 +419,12 @@ void QQmlDelegateModelPrivate::disconnectFromAbstractItemModel()
faff1df
                         q, SLOT(_q_rowsAboutToBeRemoved(QModelIndex,int,int)));
faff1df
     QObject::disconnect(aim, SIGNAL(rowsRemoved(QModelIndex,int,int)),
faff1df
                         q, SLOT(_q_rowsRemoved(QModelIndex,int,int)));
faff1df
+    QObject::disconnect(aim, SIGNAL(columnsInserted(QModelIndex,int,int)), q,
faff1df
+                        SLOT(_q_columnsInserted(QModelIndex,int,int)));
faff1df
+    QObject::disconnect(aim, SIGNAL(columnsRemoved(QModelIndex,int,int)), q,
faff1df
+                        SLOT(_q_columnsRemoved(QModelIndex,int,int)));
faff1df
+    QObject::disconnect(aim, SIGNAL(columnsMoved(QModelIndex,int,int,QModelIndex,int)), q,
faff1df
+                        SLOT(_q_columnsMoved(QModelIndex,int,int,QModelIndex,int)));
faff1df
     QObject::disconnect(aim, SIGNAL(dataChanged(QModelIndex,QModelIndex,QVector<int>)),
faff1df
                         q, SLOT(_q_dataChanged(QModelIndex,QModelIndex,QVector<int>)));
faff1df
     QObject::disconnect(aim, SIGNAL(rowsMoved(QModelIndex,int,int,QModelIndex,int)),
faff1df
@@ -1974,6 +1986,38 @@ void QQmlDelegateModel::_q_rowsMoved(
faff1df
     }
faff1df
 }
faff1df
 
faff1df
+void QQmlDelegateModel::_q_columnsInserted(const QModelIndex &parent, int begin, int end)
faff1df
+{
faff1df
+    Q_D(QQmlDelegateModel);
faff1df
+    Q_UNUSED(end);
faff1df
+    if (parent == d->m_adaptorModel.rootIndex && begin == 0) {
faff1df
+        // mark all items as changed
faff1df
+        _q_itemsChanged(0, d->m_count, QVector<int>());
faff1df
+    }
faff1df
+}
faff1df
+
faff1df
+void QQmlDelegateModel::_q_columnsRemoved(const QModelIndex &parent, int begin, int end)
faff1df
+{
faff1df
+    Q_D(QQmlDelegateModel);
faff1df
+    Q_UNUSED(end);
faff1df
+    if (parent == d->m_adaptorModel.rootIndex && begin == 0) {
faff1df
+        // mark all items as changed
faff1df
+        _q_itemsChanged(0, d->m_count, QVector<int>());
faff1df
+    }
faff1df
+}
faff1df
+
faff1df
+void QQmlDelegateModel::_q_columnsMoved(const QModelIndex &parent, int start, int end,
faff1df
+                                        const QModelIndex &destination, int column)
faff1df
+{
faff1df
+    Q_D(QQmlDelegateModel);
faff1df
+    Q_UNUSED(end);
faff1df
+    if ((parent == d->m_adaptorModel.rootIndex && start == 0)
faff1df
+        || (destination == d->m_adaptorModel.rootIndex && column == 0)) {
faff1df
+        // mark all items as changed
faff1df
+        _q_itemsChanged(0, d->m_count, QVector<int>());
faff1df
+    }
faff1df
+}
faff1df
+
faff1df
 void QQmlDelegateModel::_q_dataChanged(const QModelIndex &begin, const QModelIndex &end, const QVector<int> &roles)
faff1df
 {
faff1df
     Q_D(QQmlDelegateModel);
faff1df
diff --git a/src/qmlmodels/qqmldelegatemodel_p.h b/src/qmlmodels/qqmldelegatemodel_p.h
faff1df
index 8aab4badca..d140bfbaaf 100644
faff1df
--- a/src/qmlmodels/qqmldelegatemodel_p.h
faff1df
+++ b/src/qmlmodels/qqmldelegatemodel_p.h
faff1df
@@ -152,6 +152,9 @@ private Q_SLOTS:
faff1df
     void _q_itemsMoved(int from, int to, int count);
faff1df
     void _q_modelReset();
faff1df
     void _q_rowsInserted(const QModelIndex &,int,int);
faff1df
+    void _q_columnsInserted(const QModelIndex &, int, int);
faff1df
+    void _q_columnsRemoved(const QModelIndex &, int, int);
faff1df
+    void _q_columnsMoved(const QModelIndex &, int, int, const QModelIndex &, int);
faff1df
     void _q_rowsAboutToBeRemoved(const QModelIndex &parent, int begin, int end);
faff1df
     void _q_rowsRemoved(const QModelIndex &,int,int);
faff1df
     void _q_rowsMoved(const QModelIndex &, int, int, const QModelIndex &, int);
faff1df
diff --git a/tests/auto/qml/qqmldelegatemodel/data/redrawUponColumnChange.qml b/tests/auto/qml/qqmldelegatemodel/data/redrawUponColumnChange.qml
faff1df
new file mode 100644
faff1df
index 0000000000..206133bb39
faff1df
--- /dev/null
faff1df
+++ b/tests/auto/qml/qqmldelegatemodel/data/redrawUponColumnChange.qml
faff1df
@@ -0,0 +1,11 @@
faff1df
+import QtQuick 2.8
faff1df
+
faff1df
+ListView {
faff1df
+    id: root
faff1df
+    width: 200
faff1df
+    height: 200
faff1df
+
faff1df
+    delegate: Text {
faff1df
+        text: display
faff1df
+    }
faff1df
+}
faff1df
diff --git a/tests/auto/qml/qqmldelegatemodel/tst_qqmldelegatemodel.cpp b/tests/auto/qml/qqmldelegatemodel/tst_qqmldelegatemodel.cpp
faff1df
index 35f1e2c94d..1722447830 100644
faff1df
--- a/tests/auto/qml/qqmldelegatemodel/tst_qqmldelegatemodel.cpp
faff1df
+++ b/tests/auto/qml/qqmldelegatemodel/tst_qqmldelegatemodel.cpp
faff1df
@@ -27,6 +27,8 @@
faff1df
 ****************************************************************************/
faff1df
 
faff1df
 #include <QtTest/qtest.h>
faff1df
+#include <QtCore/QConcatenateTablesProxyModel>
faff1df
+#include <QtGui/QStandardItemModel>
faff1df
 #include <QtQml/qqmlcomponent.h>
faff1df
 #include <QtQmlModels/private/qqmldelegatemodel_p.h>
faff1df
 #include <QtQuick/qquickview.h>
faff1df
@@ -47,6 +49,7 @@ private slots:
faff1df
     void filterOnGroup_removeWhenCompleted();
faff1df
     void qtbug_86017();
faff1df
     void contextAccessedByHandler();
faff1df
+    void redrawUponColumnChange();
faff1df
 };
faff1df
 
faff1df
 class AbstractItemModel : public QAbstractItemModel
faff1df
@@ -186,6 +189,30 @@ void tst_QQmlDelegateModel::contextAccessedByHandler()
faff1df
     QVERIFY(root->property("works").toBool());
faff1df
 }
faff1df
 
faff1df
+void tst_QQmlDelegateModel::redrawUponColumnChange()
faff1df
+{
faff1df
+    QStandardItemModel m1;
faff1df
+    m1.appendRow({
faff1df
+            new QStandardItem("Banana"),
faff1df
+            new QStandardItem("Coconut"),
faff1df
+    });
faff1df
+
faff1df
+    QQuickView view(testFileUrl("redrawUponColumnChange.qml"));
faff1df
+    QCOMPARE(view.status(), QQuickView::Ready);
faff1df
+    view.show();
faff1df
+    QQuickItem *root = view.rootObject();
faff1df
+    root->setProperty("model", QVariant::fromValue<QObject *>(&m1));
faff1df
+
faff1df
+    QObject *item = root->property("currentItem").value<QObject *>();
faff1df
+    QVERIFY(item);
faff1df
+    QCOMPARE(item->property("text").toString(), "Banana");
faff1df
+
faff1df
+    QVERIFY(root);
faff1df
+    m1.removeColumn(0);
faff1df
+
faff1df
+    QCOMPARE(item->property("text").toString(), "Coconut");
faff1df
+}
faff1df
+
faff1df
 QTEST_MAIN(tst_QQmlDelegateModel)
faff1df
 
faff1df
 #include "tst_qqmldelegatemodel.moc"
faff1df
-- 
0134d56
2.41.0
faff1df