[neon/qt6/qt6-declarative/Neon/release] debian/patches: network_applet_list.diff

Carlos De Maine null at kde.org
Mon Nov 4 05:14:26 GMT 2024


Git commit 92814ed3632dc15624d7408c136e1cead985c533 by Carlos De Maine.
Committed on 04/11/2024 at 05:14.
Pushed by carlosdem into branch 'Neon/release'.

network_applet_list.diff

A  +818  -0    debian/patches/network_applet_list.diff
A  +3    -0    debian/patches/series

https://invent.kde.org/neon/qt6/qt6-declarative/-/commit/92814ed3632dc15624d7408c136e1cead985c533

diff --git a/debian/patches/network_applet_list.diff b/debian/patches/network_applet_list.diff
new file mode 100644
index 0000000..154ea4f
--- /dev/null
+++ b/debian/patches/network_applet_list.diff
@@ -0,0 +1,818 @@
+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
++++ b/src/qmlmodels/qqmldelegatemodel.cpp
+@@ -172,7 +172,6 @@ QQmlDelegateModelPrivate::QQmlDelegateModelPrivate(QQmlContext *ctxt)
+     , m_transaction(false)
+     , m_incubatorCleanupScheduled(false)
+     , m_waitingToFetchMore(false)
+-    , m_maybeResetRoleNames(false)
+     , m_cacheItems(nullptr)
+     , m_items(nullptr)
+     , m_persistedItems(nullptr)
+@@ -366,7 +365,6 @@ void QQmlDelegateModelPrivate::connectToAbstractItemModel()
+     QObject::connect(aim, &QAbstractItemModel::dataChanged, q, &QQmlDelegateModel::_q_dataChanged);
+     QObject::connect(aim, &QAbstractItemModel::rowsMoved, q, &QQmlDelegateModel::_q_rowsMoved);
+     QObject::connect(aim, &QAbstractItemModel::modelAboutToBeReset, q, &QQmlDelegateModel::_q_modelAboutToBeReset);
+-    QObject::connect(aim, &QAbstractItemModel::modelReset, q, &QQmlDelegateModel::handleModelReset);
+     QObject::connect(aim, &QAbstractItemModel::layoutChanged, q, &QQmlDelegateModel::_q_layoutChanged);
+ }
+ 
+@@ -387,7 +385,6 @@ void QQmlDelegateModelPrivate::disconnectFromAbstractItemModel()
+     QObject::disconnect(aim, &QAbstractItemModel::dataChanged, q, &QQmlDelegateModel::_q_dataChanged);
+     QObject::disconnect(aim, &QAbstractItemModel::rowsMoved, q, &QQmlDelegateModel::_q_rowsMoved);
+     QObject::disconnect(aim, &QAbstractItemModel::modelAboutToBeReset, q, &QQmlDelegateModel::_q_modelAboutToBeReset);
+-    QObject::disconnect(aim, &QAbstractItemModel::modelReset, q, &QQmlDelegateModel::handleModelReset);
+     QObject::disconnect(aim, &QAbstractItemModel::layoutChanged, q, &QQmlDelegateModel::_q_layoutChanged);
+ }
+ 
+@@ -1898,28 +1895,25 @@ void QQmlDelegateModel::_q_modelAboutToBeReset()
+     Q_D(QQmlDelegateModel);
+     if (!d->m_adaptorModel.adaptsAim())
+         return;
+-
+-    /*
+-        roleNames are generally guaranteed to be stable (given that QAIM has no
+-        change signal for them), except that resetting the model is allowed to
+-        invalidate them (QTBUG-32132). DelegateModel must take this into account by
+-        snapshotting the current roleNames before the model is reset.
+-        Afterwards, if we detect that roleNames has changed, we throw the
+-        current model set up away and rebuild everything from scratch – it is
+-        unlikely that a more efficient implementation would be worth it.
+-
+-        If we detect no changes, we simply use the existing logic to handle the
+-        model reset.
+-
+-        This (role name resetting) logic relies on the fact that
+-        modelAboutToBeReset must be followed by a modelReset signal before any
+-        further modelAboutToBeReset can occur. However, it's possible for user
+-        code to begin the reset before connectToAbstractItemModel is called
+-        (QTBUG-125053), in which case we don't attempt to reset the role names.
+-    */
+-    Q_ASSERT(!d->m_maybeResetRoleNames);
+-    d->m_maybeResetRoleNames = true;
+-    d->m_roleNamesBeforeReset = d->m_adaptorModel.aim()->roleNames();
++    auto aim = d->m_adaptorModel.aim();
++    auto oldRoleNames = aim->roleNames();
++    // this relies on the fact that modelAboutToBeReset must be followed
++    // by a modelReset signal before any further modelAboutToBeReset can occur
++    QObject::connect(aim, &QAbstractItemModel::modelReset, this, [this, d, oldRoleNames, aim](){
++        if (!d->m_adaptorModel.adaptsAim() || d->m_adaptorModel.aim() != aim)
++            return;
++        if (oldRoleNames == aim->roleNames()) {
++            // if the rolenames stayed the same (most common case), then we don't have
++            // to throw away all the setup that we did
++            handleModelReset();
++        } else {
++            // If they did change, we give up and just start from scratch via setMode
++            setModel(QVariant::fromValue(model()));
++            // but we still have to call handleModelReset, otherwise views will
++            // not refresh
++            handleModelReset();
++        }
++    }, Qt::SingleShotConnection);
+ }
+ 
+ void QQmlDelegateModel::handleModelReset()
+@@ -1929,23 +1923,6 @@ void QQmlDelegateModel::handleModelReset()
+         return;
+ 
+     int oldCount = d->m_count;
+-
+-    if (d->m_maybeResetRoleNames) {
+-        auto aim = d->m_adaptorModel.aim();
+-        if (!d->m_adaptorModel.adaptsAim() || d->m_adaptorModel.aim() != aim)
+-            return;
+-
+-        // If the role names stayed the same (most common case), then we don't have
+-        // to throw away all the setup that we did.
+-        // If they did change, we give up and just start from scratch via setModel.
+-        // We do this before handling the reset to ensure that views refresh.
+-        if (aim->roleNames() != d->m_roleNamesBeforeReset)
+-            setModel(QVariant::fromValue(model()));
+-
+-        d->m_maybeResetRoleNames = false;
+-        d->m_roleNamesBeforeReset.clear();
+-    }
+-
+     d->m_adaptorModel.rootIndex = QModelIndex();
+ 
+     if (d->m_complete) {
+diff --git a/src/qmlmodels/qqmldelegatemodel_p_p.h b/src/qmlmodels/qqmldelegatemodel_p_p.h
+index bae8fc8a23..3c7ab9281d 100644
+--- a/src/qmlmodels/qqmldelegatemodel_p_p.h
++++ b/src/qmlmodels/qqmldelegatemodel_p_p.h
+@@ -334,7 +334,6 @@ public:
+     QQmlReusableDelegateModelItemsPool m_reusableItemsPool;
+     QList<QQDMIncubationTask *> m_finishedIncubating;
+     QList<QByteArray> m_watchedRoles;
+-    QHash<int, QByteArray> m_roleNamesBeforeReset;
+ 
+     QString m_filterGroup;
+ 
+@@ -348,7 +347,6 @@ public:
+     bool m_transaction : 1;
+     bool m_incubatorCleanupScheduled : 1;
+     bool m_waitingToFetchMore : 1;
+-    bool m_maybeResetRoleNames : 1;
+ 
+     union {
+         struct {
+diff --git a/tests/auto/qml/qqmldelegatemodel/CMakeLists.txt b/tests/auto/qml/qqmldelegatemodel/CMakeLists.txt
+index 966f5229df..8d8a90e0a7 100644
+--- a/tests/auto/qml/qqmldelegatemodel/CMakeLists.txt
++++ b/tests/auto/qml/qqmldelegatemodel/CMakeLists.txt
+@@ -29,7 +29,6 @@ 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/reset.qml b/tests/auto/qml/qqmldelegatemodel/data/reset.qml
+deleted file mode 100644
+index 0fcd5e8afa..0000000000
+--- a/tests/auto/qml/qqmldelegatemodel/data/reset.qml
++++ /dev/null
+@@ -1,28 +0,0 @@
+-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
+deleted file mode 100644
+index cb1f226737..0000000000
+--- a/tests/auto/qml/qqmldelegatemodel/data/resetInQAIMConstructor.qml
++++ /dev/null
+@@ -1,28 +0,0 @@
+-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 d9f8b7aeba..2cacda5513 100644
+--- a/tests/auto/qml/qqmldelegatemodel/tst_qqmldelegatemodel.cpp
++++ b/tests/auto/qml/qqmldelegatemodel/tst_qqmldelegatemodel.cpp
+@@ -4,7 +4,6 @@
+ #include <QtTest/qtest.h>
+ #include <QtCore/qjsonobject.h>
+ #include <QtCore/QConcatenateTablesProxyModel>
+-#include <QtCore/qtimer.h>
+ #include <QtGui/QStandardItemModel>
+ #include <QtQml/qqmlcomponent.h>
+ #include <QtQml/qqmlapplicationengine.h>
+@@ -12,17 +11,11 @@
+ #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
+@@ -32,8 +25,6 @@ public:
+ 
+ private slots:
+     void resettingRolesRespected();
+-    void resetInQAIMConstructor();
+-    void reset();
+     void valueWithoutCallingObjectFirst_data();
+     void valueWithoutCallingObjectFirst();
+     void qtbug_86017();
+@@ -53,9 +44,16 @@ private slots:
+     void viewUpdatedOnDelegateChoiceAffectingRoleChange();
+ };
+ 
+-class BaseAbstractItemModel : public QAbstractItemModel
++class AbstractItemModel : 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())
+@@ -93,21 +91,10 @@ public:
+         return mValues.at(index.row());
+     }
+ 
+-protected:
++private:
+     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)
+ {
+@@ -166,109 +153,7 @@ void tst_QQmlDelegateModel::resettingRolesRespected()
+     QObject *root = engine.rootObjects().constFirst();
+     QVERIFY(!root->property("success").toBool());
+     model->change();
+-    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");
++    QTRY_VERIFY(root->property("success").toBool());
+ }
+ 
+ void tst_QQmlDelegateModel::valueWithoutCallingObjectFirst_data()
\ No newline at end of file
diff --git a/debian/patches/series b/debian/patches/series
new file mode 100644
index 0000000..249af83
--- /dev/null
+++ b/debian/patches/series
@@ -0,0 +1,3 @@
+# https://bugs.kde.org/493116
+# fixed in 6.8.1
+network_applet_list.diff
\ No newline at end of file


More information about the Neon-commits mailing list