diff options
author | Unai IRIGOYEN <u.irigoyen@gmail.com> | 2019-11-04 21:45:29 +0100 |
---|---|---|
committer | Ulf Hermann <ulf.hermann@qt.io> | 2020-08-22 22:44:32 +0200 |
commit | 1876bd4215ccf5bbaa6f571177db889ba4bc8eff (patch) | |
tree | c0f6305b305119d7c509f1ef4cee908f62b689f3 /tests | |
parent | 3d195d33ece3f8fd7cd7d8e6163fe038fc7fc036 (diff) |
Add override behaviors to QQmlListProperty
[ChangeLog][QQmlListProperty] When overriding a
QQmlListProperty in a derived QML type, the default behavior is to
append the derived class elements to the base class ones. This
introduces a macro to allow replacing the base
type contents either always or if the property is not the default one.
Fixes: QTBUG-77529
Change-Id: Ib1abbf52e341c043344c347c612928b47856fb3e
Reviewed-by: Ulf Hermann <ulf.hermann@qt.io>
Diffstat (limited to 'tests')
7 files changed, 90 insertions, 1 deletions
diff --git a/tests/auto/qml/qqmlproperty/data/ListOverrideAlwaysAppendBaseContainer.qml b/tests/auto/qml/qqmlproperty/data/ListOverrideAlwaysAppendBaseContainer.qml new file mode 100644 index 0000000000..36f2b4ee85 --- /dev/null +++ b/tests/auto/qml/qqmlproperty/data/ListOverrideAlwaysAppendBaseContainer.qml @@ -0,0 +1,5 @@ +import Test 1.0 + +MyContainer { + children: [MyQmlObject {}, MyQmlObject {}, MyQmlObject {}] +} diff --git a/tests/auto/qml/qqmlproperty/data/ListOverrideAlwaysAppendOverridenContainer.qml b/tests/auto/qml/qqmlproperty/data/ListOverrideAlwaysAppendOverridenContainer.qml new file mode 100644 index 0000000000..1c5bd5ea54 --- /dev/null +++ b/tests/auto/qml/qqmlproperty/data/ListOverrideAlwaysAppendOverridenContainer.qml @@ -0,0 +1,5 @@ +import Test 1.0 + +ListOverrideAlwaysAppendBaseContainer { + children: [MyQmlObject {}, MyQmlObject {}] +} diff --git a/tests/auto/qml/qqmlproperty/data/ListOverrideAlwaysReplaceBaseContainer.qml b/tests/auto/qml/qqmlproperty/data/ListOverrideAlwaysReplaceBaseContainer.qml new file mode 100644 index 0000000000..02085762e6 --- /dev/null +++ b/tests/auto/qml/qqmlproperty/data/ListOverrideAlwaysReplaceBaseContainer.qml @@ -0,0 +1,5 @@ +import Test 1.0 + +MyAlwaysReplaceBehaviorContainer { + children: [MyQmlObject {}, MyQmlObject {}, MyQmlObject {}] +} diff --git a/tests/auto/qml/qqmlproperty/data/ListOverrideAlwaysReplaceOverridenContainer.qml b/tests/auto/qml/qqmlproperty/data/ListOverrideAlwaysReplaceOverridenContainer.qml new file mode 100644 index 0000000000..3d4ac36a3c --- /dev/null +++ b/tests/auto/qml/qqmlproperty/data/ListOverrideAlwaysReplaceOverridenContainer.qml @@ -0,0 +1,5 @@ +import Test 1.0 + +ListOverrideAlwaysReplaceBaseContainer { + children: [MyQmlObject {}, MyQmlObject {}] +} diff --git a/tests/auto/qml/qqmlproperty/data/ListOverrideReplaceIfNotDefaultBaseContainer.qml b/tests/auto/qml/qqmlproperty/data/ListOverrideReplaceIfNotDefaultBaseContainer.qml new file mode 100644 index 0000000000..fda1677531 --- /dev/null +++ b/tests/auto/qml/qqmlproperty/data/ListOverrideReplaceIfNotDefaultBaseContainer.qml @@ -0,0 +1,6 @@ +import Test 1.0 + +MyReplaceIfNotDefaultBehaviorContainer { + children: [MyQmlObject {}, MyQmlObject {}, MyQmlObject {}] + defaultList: [MyQmlObject {}, MyQmlObject {}, MyQmlObject {}] +} diff --git a/tests/auto/qml/qqmlproperty/data/ListOverrideReplaceIfNotDefaultOverridenContainer.qml b/tests/auto/qml/qqmlproperty/data/ListOverrideReplaceIfNotDefaultOverridenContainer.qml new file mode 100644 index 0000000000..7d16378774 --- /dev/null +++ b/tests/auto/qml/qqmlproperty/data/ListOverrideReplaceIfNotDefaultOverridenContainer.qml @@ -0,0 +1,6 @@ +import Test 1.0 + +ListOverrideReplaceIfNotDefaultBaseContainer { + children: [MyQmlObject {}, MyQmlObject {}] + defaultList: [MyQmlObject {}, MyQmlObject {}] +} diff --git a/tests/auto/qml/qqmlproperty/tst_qqmlproperty.cpp b/tests/auto/qml/qqmlproperty/tst_qqmlproperty.cpp index adaba5ccfd..4523cd029e 100644 --- a/tests/auto/qml/qqmlproperty/tst_qqmlproperty.cpp +++ b/tests/auto/qml/qqmlproperty/tst_qqmlproperty.cpp @@ -90,10 +90,11 @@ class MyContainer : public QObject { Q_OBJECT Q_PROPERTY(QQmlListProperty<MyQmlObject> children READ children) + public: MyContainer() {} - QQmlListProperty<MyQmlObject> children() { return QQmlListProperty<MyQmlObject>(this, m_children); } + QQmlListProperty<MyQmlObject> children() { return QQmlListProperty<MyQmlObject>(this, &m_children); } static MyAttached *qmlAttachedProperties(QObject *o) { return new MyAttached(o); @@ -106,6 +107,35 @@ private: QML_DECLARE_TYPE(MyContainer); QML_DECLARE_TYPEINFO(MyContainer, QML_HAS_ATTACHED_PROPERTIES) +class MyReplaceIfNotDefaultBehaviorContainer : public MyContainer +{ + Q_OBJECT + Q_PROPERTY(QQmlListProperty<MyQmlObject> defaultList READ defaultList) + + QML_LIST_PROPERTY_ASSIGN_BEHAVIOR_REPLACE_IF_NOT_DEFAULT + Q_CLASSINFO("DefaultProperty", "defaultList") +public: + MyReplaceIfNotDefaultBehaviorContainer() {} + + QQmlListProperty<MyQmlObject> defaultList() { return QQmlListProperty<MyQmlObject>(this, &m_defaultList); } + +private: + QList<MyQmlObject*> m_defaultList; +}; + +QML_DECLARE_TYPE(MyReplaceIfNotDefaultBehaviorContainer); + +class MyAlwaysReplaceBehaviorContainer : public MyContainer +{ + Q_OBJECT + + QML_LIST_PROPERTY_ASSIGN_BEHAVIOR_REPLACE +public: + MyAlwaysReplaceBehaviorContainer() {} +}; + +QML_DECLARE_TYPE(MyAlwaysReplaceBehaviorContainer); + class tst_qqmlproperty : public QQmlDataTest { Q_OBJECT @@ -131,6 +161,7 @@ private slots: // Functionality void writeObjectToList(); void writeListToList(); + void listOverrideBehavior(); //writeToReadOnly(); @@ -1663,6 +1694,30 @@ void tst_qqmlproperty::writeListToList() QCOMPARE(container->children()->size(), 1);*/ } +void tst_qqmlproperty::listOverrideBehavior() +{ + QQmlComponent alwaysAppendContainerComponent(&engine, testFileUrl("ListOverrideAlwaysAppendOverridenContainer.qml")); + QScopedPointer<QObject> alwaysAppendObject(alwaysAppendContainerComponent.create()); + MyContainer *alwaysAppendContainer = qobject_cast<MyContainer*>(alwaysAppendObject.data()); + QVERIFY(alwaysAppendContainer != nullptr); + QQmlListReference alwaysAppendChildrenList(alwaysAppendContainer, "children"); + QCOMPARE(alwaysAppendChildrenList.count(), 5); + QQmlComponent replaceIfNotDefaultContainerComponent(&engine, testFileUrl("ListOverrideReplaceIfNotDefaultOverridenContainer.qml")); + QScopedPointer<QObject> replaceIfNotDefaultObject(replaceIfNotDefaultContainerComponent.create()); + MyReplaceIfNotDefaultBehaviorContainer *replaceIfNotDefaultContainer = qobject_cast<MyReplaceIfNotDefaultBehaviorContainer*>(replaceIfNotDefaultObject.data()); + QVERIFY(replaceIfNotDefaultContainer != nullptr); + QQmlListReference replaceIfNotDefaultDefaultList(replaceIfNotDefaultContainer, "defaultList"); + QCOMPARE(replaceIfNotDefaultDefaultList.count(), 5); + QQmlListReference replaceIfNotDefaultChildrenList(replaceIfNotDefaultContainer, "children"); + QCOMPARE(replaceIfNotDefaultChildrenList.count(), 2); + QQmlComponent alwaysReplaceContainerComponent(&engine, testFileUrl("ListOverrideAlwaysReplaceOverridenContainer.qml")); + QScopedPointer<QObject> alwaysReplaceObject(alwaysReplaceContainerComponent.create()); + MyContainer *alwaysReplaceContainer = qobject_cast<MyContainer*>(alwaysReplaceObject.data()); + QVERIFY(alwaysReplaceContainer != nullptr); + QQmlListReference alwaysReplaceChildrenList(alwaysReplaceContainer, "children"); + QCOMPARE(alwaysReplaceChildrenList.count(), 2); +} + void tst_qqmlproperty::urlHandling_data() { QTest::addColumn<QByteArray>("input"); @@ -2158,6 +2213,8 @@ void tst_qqmlproperty::initTestCase() qmlRegisterType<MyQmlObject>("Test",1,0,"MyQmlObject"); qmlRegisterType<PropertyObject>("Test",1,0,"PropertyObject"); qmlRegisterType<MyContainer>("Test",1,0,"MyContainer"); + qmlRegisterType<MyReplaceIfNotDefaultBehaviorContainer>("Test",1,0,"MyReplaceIfNotDefaultBehaviorContainer"); + qmlRegisterType<MyAlwaysReplaceBehaviorContainer>("Test",1,0,"MyAlwaysReplaceBehaviorContainer"); } // QTBUG-60908 |