[neon/qt6/qt6-declarative/Neon/release] debian/patches: split the diffs

Carlos De Maine null at kde.org
Mon Nov 4 06:31:10 GMT 2024


Git commit 639f84517231f9053dddcb1db007b84a8137a126 by Carlos De Maine.
Committed on 04/11/2024 at 06:31.
Pushed by carlosdem into branch 'Neon/release'.

split the diffs

M  +1    -427  debian/patches/network_applet_list.diff
A  +427  -0    debian/patches/network_applet_list_2.diff
M  +2    -1    debian/patches/series

https://invent.kde.org/neon/qt6/qt6-declarative/-/commit/639f84517231f9053dddcb1db007b84a8137a126

diff --git a/debian/patches/network_applet_list.diff b/debian/patches/network_applet_list.diff
index 154ea4f..04d7641 100644
--- a/debian/patches/network_applet_list.diff
+++ b/debian/patches/network_applet_list.diff
@@ -1,430 +1,4 @@
-diff --git a/src/qmlmodels/qqmldelegatemodel.cpp b/src/qmlmodels/qqmldelegatemodel.cpp
-index 7cfa662aa6..f8de5cba82 100644
---- a/src/qmlmodels/qqmldelegatemodel.cpp
-+++ b/src/qmlmodels/qqmldelegatemodel.cpp
-@@ -3,6 +3,8 @@
- 
- #include "qqmldelegatemodel_p_p.h"
- 
-+#include <QtCore/private/qabstractitemmodel_p.h>
-+
- #include <QtQml/qqmlinfo.h>
- 
- #include <private/qqmlabstractdelegatecomponent_p.h>
-@@ -409,6 +411,21 @@ void QQmlDelegateModel::setModel(const QVariant &model)
-         _q_itemsInserted(0, d->adaptorModelCount());
-         d->requestMoreIfNecessary();
-     }
-+
-+    // Since 837c2f18cd223707e7cedb213257b0158ea07146, we connect to modelAboutToBeReset
-+    // rather than modelReset so that we can handle role name changes. _q_modelAboutToBeReset
-+    // now connects modelReset to handleModelReset with a single shot connection instead.
-+    // However, it's possible for user code to begin the reset before connectToAbstractItemModel is called
-+    // (QTBUG-125053), in which case we connect to modelReset too late and handleModelReset is never called,
-+    // resulting in delegates not being created in certain cases.
-+    // So, we check at the earliest point we can if the model is in the process of being reset,
-+    // and if so, connect modelReset to handleModelReset.
-+    if (d->m_adaptorModel.adaptsAim()) {
-+        auto *aim = d->m_adaptorModel.aim();
-+        auto *aimPrivate = QAbstractItemModelPrivate::get(aim);
-+        if (aimPrivate->resetting)
-+            QObject::connect(aim, &QAbstractItemModel::modelReset, this, &QQmlDelegateModel::handleModelReset, Qt::SingleShotConnection);
-+    }
- }
- 
- /*!
-diff --git a/tests/auto/qml/qqmldelegatemodel/CMakeLists.txt b/tests/auto/qml/qqmldelegatemodel/CMakeLists.txt
-index 8d8a90e0a7..966f5229df 100644
---- a/tests/auto/qml/qqmldelegatemodel/CMakeLists.txt
-+++ b/tests/auto/qml/qqmldelegatemodel/CMakeLists.txt
-@@ -29,6 +29,7 @@ qt_internal_add_test(tst_qqmldelegatemodel
-         Qt::QmlModelsPrivate
-         Qt::QmlPrivate
-         Qt::Quick
-+        Qt::QuickPrivate
-         Qt::QuickTestUtilsPrivate
-     TESTDATA ${test_data}
- )
-diff --git a/tests/auto/qml/qqmldelegatemodel/data/proxyModelWithDelayedSourceModelInListView.qml b/tests/auto/qml/qqmldelegatemodel/data/proxyModelWithDelayedSourceModelInListView.qml
-new file mode 100644
-index 0000000000..b6733bd38c
---- /dev/null
-+++ b/tests/auto/qml/qqmldelegatemodel/data/proxyModelWithDelayedSourceModelInListView.qml
-@@ -0,0 +1,30 @@
-+import QtQuick
-+import Test
-+
-+Window {
-+    id: root
-+    title: listView.count
-+
-+    property alias listView: listView
-+    property ProxySourceModel connectionModel: null
-+
-+    Component {
-+        id: modelComponent
-+        ProxySourceModel {}
-+    }
-+
-+    ListView {
-+        id: listView
-+        anchors.fill: parent
-+
-+        delegate: Text {
-+            text: model.Name
-+        }
-+
-+        model: ProxyModel {
-+            sourceModel: root.connectionModel
-+        }
-+    }
-+
-+    Component.onCompleted: root.connectionModel = modelComponent.createObject(root)
-+}
-diff --git a/tests/auto/qml/qqmldelegatemodel/data/reset.qml b/tests/auto/qml/qqmldelegatemodel/data/reset.qml
-new file mode 100644
-index 0000000000..0fcd5e8afa
---- /dev/null
-+++ b/tests/auto/qml/qqmldelegatemodel/data/reset.qml
-@@ -0,0 +1,28 @@
-+import QtQuick
-+import Test
-+
-+Window {
-+    id: root
-+    width: 200
-+    height: 200
-+
-+    property alias listView: listView
-+
-+    ResettableModel {
-+        id: resetModel
-+    }
-+
-+    ListView {
-+        id: listView
-+        anchors.fill: parent
-+        model: resetModel
-+
-+        delegate: Rectangle {
-+            implicitWidth: 100
-+            implicitHeight: 50
-+            color: "olivedrab"
-+
-+            required property string display
-+        }
-+    }
-+}
-diff --git a/tests/auto/qml/qqmldelegatemodel/data/resetInQAIMConstructor.qml b/tests/auto/qml/qqmldelegatemodel/data/resetInQAIMConstructor.qml
-new file mode 100644
-index 0000000000..cb1f226737
---- /dev/null
-+++ b/tests/auto/qml/qqmldelegatemodel/data/resetInQAIMConstructor.qml
-@@ -0,0 +1,28 @@
-+import QtQuick
-+import Test
-+
-+Window {
-+    id: root
-+    width: 200
-+    height: 200
-+
-+    property alias listView: listView
-+
-+    ResetInConstructorModel {
-+        id: resetInConstructorModel
-+    }
-+
-+    ListView {
-+        id: listView
-+        anchors.fill: parent
-+        model: resetInConstructorModel
-+
-+        delegate: Rectangle {
-+            implicitWidth: 100
-+            implicitHeight: 50
-+            color: "olivedrab"
-+
-+            required property string display
-+        }
-+    }
-+}
-diff --git a/tests/auto/qml/qqmldelegatemodel/tst_qqmldelegatemodel.cpp b/tests/auto/qml/qqmldelegatemodel/tst_qqmldelegatemodel.cpp
-index 2cacda5513..3f08d8fc85 100644
---- a/tests/auto/qml/qqmldelegatemodel/tst_qqmldelegatemodel.cpp
-+++ b/tests/auto/qml/qqmldelegatemodel/tst_qqmldelegatemodel.cpp
-@@ -3,7 +3,9 @@
- 
- #include <QtTest/qtest.h>
- #include <QtCore/qjsonobject.h>
-+#include <QtCore/qsortfilterproxymodel.h>
- #include <QtCore/QConcatenateTablesProxyModel>
-+#include <QtCore/qtimer.h>
- #include <QtGui/QStandardItemModel>
- #include <QtQml/qqmlcomponent.h>
- #include <QtQml/qqmlapplicationengine.h>
-@@ -11,11 +13,17 @@
- #include <QtQmlModels/private/qqmllistmodel_p.h>
- #include <QtQuick/qquickview.h>
- #include <QtQuick/qquickitem.h>
-+#include <QtQuick/private/qquickitemview_p_p.h>
-+#include <QtQuick/private/qquicklistview_p.h>
-+#include <QtQuickTest/quicktest.h>
- #include <QtQuickTestUtils/private/qmlutils_p.h>
-+#include <QtQuickTestUtils/private/visualtestutils_p.h>
- #include <QtTest/QSignalSpy>
- 
- #include <forward_list>
- 
-+using namespace QQuickVisualTestUtils;
-+
- class tst_QQmlDelegateModel : public QQmlDataTest
- {
-     Q_OBJECT
-@@ -25,6 +33,8 @@ public:
- 
- private slots:
-     void resettingRolesRespected();
-+    void resetInQAIMConstructor();
-+    void reset();
-     void valueWithoutCallingObjectFirst_data();
-     void valueWithoutCallingObjectFirst();
-     void qtbug_86017();
-@@ -42,18 +52,12 @@ private slots:
-     void doNotUnrefObjectUnderConstruction();
-     void clearCacheDuringInsertion();
-     void viewUpdatedOnDelegateChoiceAffectingRoleChange();
-+    void proxyModelWithDelayedSourceModelInListView();
- };
- 
--class AbstractItemModel : public QAbstractItemModel
-+class BaseAbstractItemModel : public QAbstractItemModel
- {
--    Q_OBJECT
- public:
--    AbstractItemModel()
--    {
--        for (int i = 0; i < 3; ++i)
--            mValues.append(QString::fromLatin1("Item %1").arg(i));
--    }
--
-     QModelIndex index(int row, int column, const QModelIndex &parent = QModelIndex()) const override
-     {
-         if (parent.isValid())
-@@ -91,10 +95,21 @@ public:
-         return mValues.at(index.row());
-     }
- 
--private:
-+protected:
-     QVector<QString> mValues;
- };
- 
-+class AbstractItemModel : public BaseAbstractItemModel
-+{
-+    Q_OBJECT
-+public:
-+    AbstractItemModel()
-+    {
-+        for (int i = 0; i < 3; ++i)
-+            mValues.append(QString::fromLatin1("Item %1").arg(i));
-+    }
-+};
-+
- tst_QQmlDelegateModel::tst_QQmlDelegateModel()
-     : QQmlDataTest(QT_QMLTEST_DATADIR)
- {
-@@ -153,7 +168,109 @@ void tst_QQmlDelegateModel::resettingRolesRespected()
-     QObject *root = engine.rootObjects().constFirst();
-     QVERIFY(!root->property("success").toBool());
-     model->change();
--    QTRY_VERIFY(root->property("success").toBool());
-+    QTRY_VERIFY_WITH_TIMEOUT(root->property("success").toBool(), 100);
-+}
-+
-+class ResetInConstructorModel : public BaseAbstractItemModel
-+{
-+    Q_OBJECT
-+    QML_ELEMENT
-+
-+public:
-+    ResetInConstructorModel()
-+    {
-+        beginResetModel();
-+        QTimer::singleShot(0, this, &ResetInConstructorModel::finishReset);
-+    }
-+
-+private:
-+    void finishReset()
-+    {
-+        mValues.append("First");
-+        endResetModel();
-+    }
-+};
-+
-+void tst_QQmlDelegateModel::resetInQAIMConstructor()
-+{
-+    qmlRegisterTypesAndRevisions<ResetInConstructorModel>("Test", 1);
-+
-+    QQuickApplicationHelper helper(this, "resetInQAIMConstructor.qml");
-+    QVERIFY2(helper.ready, helper.failureMessage());
-+    QQuickWindow *window = helper.window;
-+    window->show();
-+    QVERIFY(QTest::qWaitForWindowExposed(window));
-+
-+    auto *listView = window->property("listView").value<QQuickListView *>();
-+    QVERIFY(listView);
-+    QTRY_VERIFY_WITH_TIMEOUT(listView->itemAtIndex(0), 100);
-+    QQuickItem *firstDelegateItem = listView->itemAtIndex(0);
-+    QVERIFY(firstDelegateItem);
-+    QCOMPARE(firstDelegateItem->property("display").toString(), "First");
-+}
-+
-+class ResettableModel : public BaseAbstractItemModel
-+{
-+    Q_OBJECT
-+    QML_ELEMENT
-+
-+public:
-+    ResettableModel()
-+    {
-+        mValues.append("First");
-+    }
-+
-+    void callBeginResetModel()
-+    {
-+        beginResetModel();
-+        mValues.clear();
-+    }
-+
-+    void appendData()
-+    {
-+        mValues.append(QString::fromLatin1("Item %1").arg(mValues.size()));
-+    }
-+
-+    void callEndResetModel()
-+    {
-+        endResetModel();
-+    }
-+};
-+
-+// Tests that everything works as expected when calling beginResetModel/endResetModel
-+// after the QAIM subclass constructor has run.
-+void tst_QQmlDelegateModel::reset()
-+{
-+    qmlRegisterTypesAndRevisions<ResettableModel>("Test", 1);
-+
-+    QQuickApplicationHelper helper(this, "reset.qml");
-+    QVERIFY2(helper.ready, helper.failureMessage());
-+    QQuickWindow *window = helper.window;
-+    window->show();
-+    QVERIFY(QTest::qWaitForWindowExposed(window));
-+
-+    auto *listView = window->property("listView").value<QQuickListView *>();
-+    QVERIFY(listView);
-+    QQuickItem *firstDelegateItem = listView->itemAtIndex(0);
-+    QVERIFY(firstDelegateItem);
-+    QCOMPARE(firstDelegateItem->property("display").toString(), "First");
-+
-+    const auto delegateModel = QQuickItemViewPrivate::get(listView)->model;
-+    QSignalSpy rootIndexChangedSpy(delegateModel, SIGNAL(rootIndexChanged()));
-+    QVERIFY(rootIndexChangedSpy.isValid());
-+
-+    auto *model = listView->model().value<ResettableModel *>();
-+    model->callBeginResetModel();
-+    model->appendData();
-+    model->callEndResetModel();
-+    // This is verifies that handleModelReset isn't called
-+    // more than once during this process, since it unconditionally emits rootIndexChanged.
-+    QCOMPARE(rootIndexChangedSpy.count(), 1);
-+
-+    QTRY_VERIFY_WITH_TIMEOUT(listView->itemAtIndex(0), 100);
-+    firstDelegateItem = listView->itemAtIndex(0);
-+    QVERIFY(firstDelegateItem);
-+    QCOMPARE(firstDelegateItem->property("display").toString(), "Item 0");
- }
- 
- void tst_QQmlDelegateModel::valueWithoutCallingObjectFirst_data()
-@@ -616,6 +733,79 @@ void tst_QQmlDelegateModel::viewUpdatedOnDelegateChoiceAffectingRoleChange()
-     QVERIFY(returnedValue);
- }
- 
-+class ProxySourceModel : public QAbstractListModel
-+{
-+    Q_OBJECT
-+    QML_ELEMENT
-+public:
-+    explicit ProxySourceModel(QObject *parent = nullptr)
-+        : QAbstractListModel(parent)
-+    {
-+        for (int i = 0; i < rows; ++i) {
-+            beginInsertRows(QModelIndex(), i, i);
-+            endInsertRows();
-+        }
-+    }
-+
-+    ~ProxySourceModel() override = default;
-+
-+    int rowCount(const QModelIndex &) const override
-+    {
-+        return rows;
-+    }
-+
-+    QVariant data(const QModelIndex &, int ) const override
-+    {
-+        return "Hello";
-+    }
-+
-+    QHash<int, QByteArray> roleNames() const override
-+    {
-+        QHash<int, QByteArray> roles = QAbstractListModel::roleNames();
-+        roles[Qt::UserRole + 1] = "Name";
-+
-+        return roles;
-+    }
-+
-+    static const int rows = 1;
-+};
-+
-+class ProxyModel : public QSortFilterProxyModel
-+{
-+    Q_OBJECT
-+    QML_ELEMENT
-+    Q_PROPERTY(QAbstractItemModel *sourceModel READ sourceModel WRITE setSourceModel)
-+
-+public:
-+    explicit ProxyModel(QObject *parent = nullptr)
-+        : QSortFilterProxyModel(parent)
-+    {
-+    }
-+
-+    ~ProxyModel() override = default;
-+};
-+
-+// Checks that the correct amount of delegates are created when using a proxy
-+// model whose source model is set after a delay.
-+void tst_QQmlDelegateModel::proxyModelWithDelayedSourceModelInListView()
-+{
-+    QTest::failOnWarning();
-+
-+    qmlRegisterTypesAndRevisions<ProxySourceModel>("Test", 1);
-+    qmlRegisterTypesAndRevisions<ProxyModel>("Test", 1);
-+
-+    QQuickApplicationHelper helper(this, "proxyModelWithDelayedSourceModelInListView.qml");
-+    QVERIFY2(helper.ready, helper.failureMessage());
-+    QQuickWindow *window = helper.window;
-+    window->show();
-+    QVERIFY(QTest::qWaitForWindowExposed(window));
-+
-+    auto *listView = window->property("listView").value<QQuickListView *>();
-+    QVERIFY(listView);
-+    const auto delegateModel = QQuickItemViewPrivate::get(listView)->model;
-+    QTRY_COMPARE(listView->count(), 1);
-+}
-+
- QTEST_MAIN(tst_QQmlDelegateModel)
- 
- #include "tst_qqmldelegatemodel.moc"
+
 diff --git a/src/qmlmodels/qqmldelegatemodel.cpp b/src/qmlmodels/qqmldelegatemodel.cpp
 index 9af58d7a22..7cfa662aa6 100644
 --- a/src/qmlmodels/qqmldelegatemodel.cpp
diff --git a/debian/patches/network_applet_list_2.diff b/debian/patches/network_applet_list_2.diff
new file mode 100644
index 0000000..2d5c6b5
--- /dev/null
+++ b/debian/patches/network_applet_list_2.diff
@@ -0,0 +1,427 @@
+diff --git a/src/qmlmodels/qqmldelegatemodel.cpp b/src/qmlmodels/qqmldelegatemodel.cpp
+index 7cfa662aa6..f8de5cba82 100644
+--- a/src/qmlmodels/qqmldelegatemodel.cpp
++++ b/src/qmlmodels/qqmldelegatemodel.cpp
+@@ -3,6 +3,8 @@
+ 
+ #include "qqmldelegatemodel_p_p.h"
+ 
++#include <QtCore/private/qabstractitemmodel_p.h>
++
+ #include <QtQml/qqmlinfo.h>
+ 
+ #include <private/qqmlabstractdelegatecomponent_p.h>
+@@ -409,6 +411,21 @@ void QQmlDelegateModel::setModel(const QVariant &model)
+         _q_itemsInserted(0, d->adaptorModelCount());
+         d->requestMoreIfNecessary();
+     }
++
++    // Since 837c2f18cd223707e7cedb213257b0158ea07146, we connect to modelAboutToBeReset
++    // rather than modelReset so that we can handle role name changes. _q_modelAboutToBeReset
++    // now connects modelReset to handleModelReset with a single shot connection instead.
++    // However, it's possible for user code to begin the reset before connectToAbstractItemModel is called
++    // (QTBUG-125053), in which case we connect to modelReset too late and handleModelReset is never called,
++    // resulting in delegates not being created in certain cases.
++    // So, we check at the earliest point we can if the model is in the process of being reset,
++    // and if so, connect modelReset to handleModelReset.
++    if (d->m_adaptorModel.adaptsAim()) {
++        auto *aim = d->m_adaptorModel.aim();
++        auto *aimPrivate = QAbstractItemModelPrivate::get(aim);
++        if (aimPrivate->resetting)
++            QObject::connect(aim, &QAbstractItemModel::modelReset, this, &QQmlDelegateModel::handleModelReset, Qt::SingleShotConnection);
++    }
+ }
+ 
+ /*!
+diff --git a/tests/auto/qml/qqmldelegatemodel/CMakeLists.txt b/tests/auto/qml/qqmldelegatemodel/CMakeLists.txt
+index 8d8a90e0a7..966f5229df 100644
+--- a/tests/auto/qml/qqmldelegatemodel/CMakeLists.txt
++++ b/tests/auto/qml/qqmldelegatemodel/CMakeLists.txt
+@@ -29,6 +29,7 @@ qt_internal_add_test(tst_qqmldelegatemodel
+         Qt::QmlModelsPrivate
+         Qt::QmlPrivate
+         Qt::Quick
++        Qt::QuickPrivate
+         Qt::QuickTestUtilsPrivate
+     TESTDATA ${test_data}
+ )
+diff --git a/tests/auto/qml/qqmldelegatemodel/data/proxyModelWithDelayedSourceModelInListView.qml b/tests/auto/qml/qqmldelegatemodel/data/proxyModelWithDelayedSourceModelInListView.qml
+new file mode 100644
+index 0000000000..b6733bd38c
+--- /dev/null
++++ b/tests/auto/qml/qqmldelegatemodel/data/proxyModelWithDelayedSourceModelInListView.qml
+@@ -0,0 +1,30 @@
++import QtQuick
++import Test
++
++Window {
++    id: root
++    title: listView.count
++
++    property alias listView: listView
++    property ProxySourceModel connectionModel: null
++
++    Component {
++        id: modelComponent
++        ProxySourceModel {}
++    }
++
++    ListView {
++        id: listView
++        anchors.fill: parent
++
++        delegate: Text {
++            text: model.Name
++        }
++
++        model: ProxyModel {
++            sourceModel: root.connectionModel
++        }
++    }
++
++    Component.onCompleted: root.connectionModel = modelComponent.createObject(root)
++}
+diff --git a/tests/auto/qml/qqmldelegatemodel/data/reset.qml b/tests/auto/qml/qqmldelegatemodel/data/reset.qml
+new file mode 100644
+index 0000000000..0fcd5e8afa
+--- /dev/null
++++ b/tests/auto/qml/qqmldelegatemodel/data/reset.qml
+@@ -0,0 +1,28 @@
++import QtQuick
++import Test
++
++Window {
++    id: root
++    width: 200
++    height: 200
++
++    property alias listView: listView
++
++    ResettableModel {
++        id: resetModel
++    }
++
++    ListView {
++        id: listView
++        anchors.fill: parent
++        model: resetModel
++
++        delegate: Rectangle {
++            implicitWidth: 100
++            implicitHeight: 50
++            color: "olivedrab"
++
++            required property string display
++        }
++    }
++}
+diff --git a/tests/auto/qml/qqmldelegatemodel/data/resetInQAIMConstructor.qml b/tests/auto/qml/qqmldelegatemodel/data/resetInQAIMConstructor.qml
+new file mode 100644
+index 0000000000..cb1f226737
+--- /dev/null
++++ b/tests/auto/qml/qqmldelegatemodel/data/resetInQAIMConstructor.qml
+@@ -0,0 +1,28 @@
++import QtQuick
++import Test
++
++Window {
++    id: root
++    width: 200
++    height: 200
++
++    property alias listView: listView
++
++    ResetInConstructorModel {
++        id: resetInConstructorModel
++    }
++
++    ListView {
++        id: listView
++        anchors.fill: parent
++        model: resetInConstructorModel
++
++        delegate: Rectangle {
++            implicitWidth: 100
++            implicitHeight: 50
++            color: "olivedrab"
++
++            required property string display
++        }
++    }
++}
+diff --git a/tests/auto/qml/qqmldelegatemodel/tst_qqmldelegatemodel.cpp b/tests/auto/qml/qqmldelegatemodel/tst_qqmldelegatemodel.cpp
+index 2cacda5513..3f08d8fc85 100644
+--- a/tests/auto/qml/qqmldelegatemodel/tst_qqmldelegatemodel.cpp
++++ b/tests/auto/qml/qqmldelegatemodel/tst_qqmldelegatemodel.cpp
+@@ -3,7 +3,9 @@
+ 
+ #include <QtTest/qtest.h>
+ #include <QtCore/qjsonobject.h>
++#include <QtCore/qsortfilterproxymodel.h>
+ #include <QtCore/QConcatenateTablesProxyModel>
++#include <QtCore/qtimer.h>
+ #include <QtGui/QStandardItemModel>
+ #include <QtQml/qqmlcomponent.h>
+ #include <QtQml/qqmlapplicationengine.h>
+@@ -11,11 +13,17 @@
+ #include <QtQmlModels/private/qqmllistmodel_p.h>
+ #include <QtQuick/qquickview.h>
+ #include <QtQuick/qquickitem.h>
++#include <QtQuick/private/qquickitemview_p_p.h>
++#include <QtQuick/private/qquicklistview_p.h>
++#include <QtQuickTest/quicktest.h>
+ #include <QtQuickTestUtils/private/qmlutils_p.h>
++#include <QtQuickTestUtils/private/visualtestutils_p.h>
+ #include <QtTest/QSignalSpy>
+ 
+ #include <forward_list>
+ 
++using namespace QQuickVisualTestUtils;
++
+ class tst_QQmlDelegateModel : public QQmlDataTest
+ {
+     Q_OBJECT
+@@ -25,6 +33,8 @@ public:
+ 
+ private slots:
+     void resettingRolesRespected();
++    void resetInQAIMConstructor();
++    void reset();
+     void valueWithoutCallingObjectFirst_data();
+     void valueWithoutCallingObjectFirst();
+     void qtbug_86017();
+@@ -42,18 +52,12 @@ private slots:
+     void doNotUnrefObjectUnderConstruction();
+     void clearCacheDuringInsertion();
+     void viewUpdatedOnDelegateChoiceAffectingRoleChange();
++    void proxyModelWithDelayedSourceModelInListView();
+ };
+ 
+-class AbstractItemModel : public QAbstractItemModel
++class BaseAbstractItemModel : public QAbstractItemModel
+ {
+-    Q_OBJECT
+ public:
+-    AbstractItemModel()
+-    {
+-        for (int i = 0; i < 3; ++i)
+-            mValues.append(QString::fromLatin1("Item %1").arg(i));
+-    }
+-
+     QModelIndex index(int row, int column, const QModelIndex &parent = QModelIndex()) const override
+     {
+         if (parent.isValid())
+@@ -91,10 +95,21 @@ public:
+         return mValues.at(index.row());
+     }
+ 
+-private:
++protected:
+     QVector<QString> mValues;
+ };
+ 
++class AbstractItemModel : public BaseAbstractItemModel
++{
++    Q_OBJECT
++public:
++    AbstractItemModel()
++    {
++        for (int i = 0; i < 3; ++i)
++            mValues.append(QString::fromLatin1("Item %1").arg(i));
++    }
++};
++
+ tst_QQmlDelegateModel::tst_QQmlDelegateModel()
+     : QQmlDataTest(QT_QMLTEST_DATADIR)
+ {
+@@ -153,7 +168,109 @@ void tst_QQmlDelegateModel::resettingRolesRespected()
+     QObject *root = engine.rootObjects().constFirst();
+     QVERIFY(!root->property("success").toBool());
+     model->change();
+-    QTRY_VERIFY(root->property("success").toBool());
++    QTRY_VERIFY_WITH_TIMEOUT(root->property("success").toBool(), 100);
++}
++
++class ResetInConstructorModel : public BaseAbstractItemModel
++{
++    Q_OBJECT
++    QML_ELEMENT
++
++public:
++    ResetInConstructorModel()
++    {
++        beginResetModel();
++        QTimer::singleShot(0, this, &ResetInConstructorModel::finishReset);
++    }
++
++private:
++    void finishReset()
++    {
++        mValues.append("First");
++        endResetModel();
++    }
++};
++
++void tst_QQmlDelegateModel::resetInQAIMConstructor()
++{
++    qmlRegisterTypesAndRevisions<ResetInConstructorModel>("Test", 1);
++
++    QQuickApplicationHelper helper(this, "resetInQAIMConstructor.qml");
++    QVERIFY2(helper.ready, helper.failureMessage());
++    QQuickWindow *window = helper.window;
++    window->show();
++    QVERIFY(QTest::qWaitForWindowExposed(window));
++
++    auto *listView = window->property("listView").value<QQuickListView *>();
++    QVERIFY(listView);
++    QTRY_VERIFY_WITH_TIMEOUT(listView->itemAtIndex(0), 100);
++    QQuickItem *firstDelegateItem = listView->itemAtIndex(0);
++    QVERIFY(firstDelegateItem);
++    QCOMPARE(firstDelegateItem->property("display").toString(), "First");
++}
++
++class ResettableModel : public BaseAbstractItemModel
++{
++    Q_OBJECT
++    QML_ELEMENT
++
++public:
++    ResettableModel()
++    {
++        mValues.append("First");
++    }
++
++    void callBeginResetModel()
++    {
++        beginResetModel();
++        mValues.clear();
++    }
++
++    void appendData()
++    {
++        mValues.append(QString::fromLatin1("Item %1").arg(mValues.size()));
++    }
++
++    void callEndResetModel()
++    {
++        endResetModel();
++    }
++};
++
++// Tests that everything works as expected when calling beginResetModel/endResetModel
++// after the QAIM subclass constructor has run.
++void tst_QQmlDelegateModel::reset()
++{
++    qmlRegisterTypesAndRevisions<ResettableModel>("Test", 1);
++
++    QQuickApplicationHelper helper(this, "reset.qml");
++    QVERIFY2(helper.ready, helper.failureMessage());
++    QQuickWindow *window = helper.window;
++    window->show();
++    QVERIFY(QTest::qWaitForWindowExposed(window));
++
++    auto *listView = window->property("listView").value<QQuickListView *>();
++    QVERIFY(listView);
++    QQuickItem *firstDelegateItem = listView->itemAtIndex(0);
++    QVERIFY(firstDelegateItem);
++    QCOMPARE(firstDelegateItem->property("display").toString(), "First");
++
++    const auto delegateModel = QQuickItemViewPrivate::get(listView)->model;
++    QSignalSpy rootIndexChangedSpy(delegateModel, SIGNAL(rootIndexChanged()));
++    QVERIFY(rootIndexChangedSpy.isValid());
++
++    auto *model = listView->model().value<ResettableModel *>();
++    model->callBeginResetModel();
++    model->appendData();
++    model->callEndResetModel();
++    // This is verifies that handleModelReset isn't called
++    // more than once during this process, since it unconditionally emits rootIndexChanged.
++    QCOMPARE(rootIndexChangedSpy.count(), 1);
++
++    QTRY_VERIFY_WITH_TIMEOUT(listView->itemAtIndex(0), 100);
++    firstDelegateItem = listView->itemAtIndex(0);
++    QVERIFY(firstDelegateItem);
++    QCOMPARE(firstDelegateItem->property("display").toString(), "Item 0");
+ }
+ 
+ void tst_QQmlDelegateModel::valueWithoutCallingObjectFirst_data()
+@@ -616,6 +733,79 @@ void tst_QQmlDelegateModel::viewUpdatedOnDelegateChoiceAffectingRoleChange()
+     QVERIFY(returnedValue);
+ }
+ 
++class ProxySourceModel : public QAbstractListModel
++{
++    Q_OBJECT
++    QML_ELEMENT
++public:
++    explicit ProxySourceModel(QObject *parent = nullptr)
++        : QAbstractListModel(parent)
++    {
++        for (int i = 0; i < rows; ++i) {
++            beginInsertRows(QModelIndex(), i, i);
++            endInsertRows();
++        }
++    }
++
++    ~ProxySourceModel() override = default;
++
++    int rowCount(const QModelIndex &) const override
++    {
++        return rows;
++    }
++
++    QVariant data(const QModelIndex &, int ) const override
++    {
++        return "Hello";
++    }
++
++    QHash<int, QByteArray> roleNames() const override
++    {
++        QHash<int, QByteArray> roles = QAbstractListModel::roleNames();
++        roles[Qt::UserRole + 1] = "Name";
++
++        return roles;
++    }
++
++    static const int rows = 1;
++};
++
++class ProxyModel : public QSortFilterProxyModel
++{
++    Q_OBJECT
++    QML_ELEMENT
++    Q_PROPERTY(QAbstractItemModel *sourceModel READ sourceModel WRITE setSourceModel)
++
++public:
++    explicit ProxyModel(QObject *parent = nullptr)
++        : QSortFilterProxyModel(parent)
++    {
++    }
++
++    ~ProxyModel() override = default;
++};
++
++// Checks that the correct amount of delegates are created when using a proxy
++// model whose source model is set after a delay.
++void tst_QQmlDelegateModel::proxyModelWithDelayedSourceModelInListView()
++{
++    QTest::failOnWarning();
++
++    qmlRegisterTypesAndRevisions<ProxySourceModel>("Test", 1);
++    qmlRegisterTypesAndRevisions<ProxyModel>("Test", 1);
++
++    QQuickApplicationHelper helper(this, "proxyModelWithDelayedSourceModelInListView.qml");
++    QVERIFY2(helper.ready, helper.failureMessage());
++    QQuickWindow *window = helper.window;
++    window->show();
++    QVERIFY(QTest::qWaitForWindowExposed(window));
++
++    auto *listView = window->property("listView").value<QQuickListView *>();
++    QVERIFY(listView);
++    const auto delegateModel = QQuickItemViewPrivate::get(listView)->model;
++    QTRY_COMPARE(listView->count(), 1);
++}
++
+ QTEST_MAIN(tst_QQmlDelegateModel)
+ 
+ #include "tst_qqmldelegatemodel.moc"
\ No newline at end of file
diff --git a/debian/patches/series b/debian/patches/series
index 249af83..dbf1d65 100644
--- a/debian/patches/series
+++ b/debian/patches/series
@@ -1,3 +1,4 @@
 # https://bugs.kde.org/493116
 # fixed in 6.8.1
-network_applet_list.diff
\ No newline at end of file
+network_applet_list.diff
+network_applet_list_2.diff
\ No newline at end of file


More information about the Neon-commits mailing list