summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorFrank Meerkoetter <frank.meerkoetter@basyskom.com>2016-01-03 22:35:05 +0100
committerFrank Meerkoetter <frank.meerkoetter@basyskom.com>2016-01-04 09:56:17 +0000
commita4b2fa94d28327b83c8a1ddce5741c29cb0a7e0c (patch)
tree42114d979cc0449a287079fd8951c6b2634816a5
parent3b762574094e1a807fac7f83f07df2ebd8f1fc80 (diff)
Fix value changed logic for ValueTypeProvider types
Fix broken value changed logic for types implemented through the ValueTypeProvider interface (QtQuick and Qt3d). It affects vector2d, vector3d, ... The signal was not emitted for the cases where the new value was equal to the default value of a given type. Also add a unit test to cover this area. Change-Id: I9491b0462c78fecc4c704ea36921611c1bd6b2ee Task-number: QTBUG-50204 Reviewed-by: Simon Hausmann <simon.hausmann@theqtcompany.com>
-rw-r--r--src/qml/qml/qqmlvmemetaobject.cpp2
-rw-r--r--tests/auto/qml/qqmlvaluetypeproviders/data/changedSignal.qml94
-rw-r--r--tests/auto/qml/qqmlvaluetypeproviders/tst_qqmlvaluetypeproviders.cpp14
3 files changed, 109 insertions, 1 deletions
diff --git a/src/qml/qml/qqmlvmemetaobject.cpp b/src/qml/qml/qqmlvmemetaobject.cpp
index 37dbfec2a3..e85b3dc82c 100644
--- a/src/qml/qml/qqmlvmemetaobject.cpp
+++ b/src/qml/qml/qqmlvmemetaobject.cpp
@@ -731,8 +731,8 @@ int QQmlVMEMetaObject::metaCall(QObject *o, QMetaObject::Call c, int _id, void *
if (!v) {
*(md->data() + id) = cache->engine->newVariantObject(QVariant());
v = (md->data() + id)->as<QV4::VariantObject>();
+ QQml_valueTypeProvider()->initValueType(t, v->d()->data);
}
- QQml_valueTypeProvider()->initValueType(t, v->d()->data);
needActivate = !QQml_valueTypeProvider()->equalValueType(t, a[0], v->d()->data);
QQml_valueTypeProvider()->writeValueType(t, a[0], v->d()->data);
}
diff --git a/tests/auto/qml/qqmlvaluetypeproviders/data/changedSignal.qml b/tests/auto/qml/qqmlvaluetypeproviders/data/changedSignal.qml
new file mode 100644
index 0000000000..fed4cf4cbc
--- /dev/null
+++ b/tests/auto/qml/qqmlvaluetypeproviders/data/changedSignal.qml
@@ -0,0 +1,94 @@
+/****************************************************************************
+**
+** Copyright (C) 2016 basysKom GmbH, opensource@basyskom.com.
+** Contact: http://www.qt.io/licensing/
+**
+** This file is part of the test suite of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL21$
+** 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 The Qt Company. For licensing terms
+** and conditions see http://www.qt.io/terms-conditions. For further
+** information use the contact form at http://www.qt.io/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 or version 3 as published by the Free
+** Software Foundation and appearing in the file LICENSE.LGPLv21 and
+** LICENSE.LGPLv3 included in the packaging of this file. Please review the
+** following information to ensure the GNU Lesser General Public License
+** requirements will be met: https://www.gnu.org/licenses/lgpl.html and
+** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** As a special exception, The Qt Company gives you certain additional
+** rights. These rights are described in The Qt Company LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.0
+
+Item {
+ property bool success: false
+ property bool complete: false
+
+ property vector2d v2: Qt.vector2d(-2, 0)
+ property vector3d v3: Qt.vector3d(-2, 0, 0)
+ property vector4d v4: Qt.vector4d(-2, 0, 0, 0)
+
+ property int v2ChangedSignalCount;
+ property int v3ChangedSignalCount;
+ property int v4ChangedSignalCount;
+
+ onV2Changed: v2ChangedSignalCount++
+ onV3Changed: v3ChangedSignalCount++
+ onV4Changed: v4ChangedSignalCount++
+
+ Component.onCompleted: {
+ complete = false;
+ success = true;
+
+ // storing the initial value causes a signal emission
+ if (v2ChangedSignalCount !== 1) success = false
+ v2 = Qt.vector2d(-2, 0);
+ // setting the same value again must not emit a signal
+ if (v2ChangedSignalCount !== 1) success = false
+ v2.x++
+ if (v2ChangedSignalCount !== 2) success = false
+ v2.x++ // cycle through 0, 0 which is the default value
+ if (v2ChangedSignalCount !== 3) success = false
+ v2.x++
+ if (v2ChangedSignalCount !== 4) success = false
+
+ // storing the initial value causes a signal emission
+ if (v3ChangedSignalCount !== 1) success = false
+ v3 = Qt.vector3d(-2, 0, 0);
+ // setting the same value again must not emit a signal
+ if (v3ChangedSignalCount !== 1) success = false
+ v3.x++
+ if (v3ChangedSignalCount !== 2) success = false
+ v3.x++ // cycle through 0, 0, 0 which is the default value
+ if (v3ChangedSignalCount !== 3) success = false
+ v3.x++
+ if (v3ChangedSignalCount !== 4) success = false
+
+ // storing the initial value causes a signal emission
+ if (v4ChangedSignalCount !== 1) success = false
+ v4 = Qt.vector4d(-2, 0, 0, 0);
+ // setting the same value again must not emit a signal
+ if (v4ChangedSignalCount !== 1) success = false
+ v4.x++
+ if (v4ChangedSignalCount !== 2) success = false
+ v4.x++ // cycle through 0, 0, 0 which is the default value
+ if (v4ChangedSignalCount !== 3) success = false
+ v4.x++
+ if (v4ChangedSignalCount !== 4) success = false
+
+ complete = true;
+ }
+}
diff --git a/tests/auto/qml/qqmlvaluetypeproviders/tst_qqmlvaluetypeproviders.cpp b/tests/auto/qml/qqmlvaluetypeproviders/tst_qqmlvaluetypeproviders.cpp
index 58fca2d9d9..a38dff21fa 100644
--- a/tests/auto/qml/qqmlvaluetypeproviders/tst_qqmlvaluetypeproviders.cpp
+++ b/tests/auto/qml/qqmlvaluetypeproviders/tst_qqmlvaluetypeproviders.cpp
@@ -36,6 +36,7 @@
#include <QQmlComponent>
#include <QQmlContext>
#include <QDebug>
+#include <QScopedPointer>
#include <private/qqmlglobal_p.h>
#include <private/qquickvaluetypes_p.h>
#include "../../shared/util.h"
@@ -66,6 +67,7 @@ private slots:
void jsObjectConversion();
void invokableFunctions();
void userType();
+ void changedSignal();
};
void tst_qqmlvaluetypeproviders::initTestCase()
@@ -291,6 +293,18 @@ void tst_qqmlvaluetypeproviders::userType()
QCOMPARE(obj->property("success").toBool(), true);
}
+void tst_qqmlvaluetypeproviders::changedSignal()
+{
+ QQmlEngine e;
+ QQmlComponent component(&e, testFileUrl("changedSignal.qml"));
+ QVERIFY(!component.isError());
+ QVERIFY(component.errors().isEmpty());
+ QScopedPointer<QObject> object(component.create());
+ QVERIFY(object != 0);
+ QVERIFY(object->property("complete").toBool());
+ QVERIFY(object->property("success").toBool());
+}
+
QTEST_MAIN(tst_qqmlvaluetypeproviders)
#include "tst_qqmlvaluetypeproviders.moc"