aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMichael Brasser <michael.brasser@nokia.com>2012-04-05 13:30:00 +1000
committerQt by Nokia <qt-info@nokia.com>2012-04-20 04:09:37 +0200
commit955bac49404590e88360f855207d88eb21925a6d (patch)
tree22077edefe1e2b2749b3a2e809aa4a4eba2aaeb8
parent22408c96cdf4597c410fcde1d01df9f8c53fd8c8 (diff)
Provide receivers count from QQmlData.
Change-Id: I70b06507158797df3083dc23a119935497aa19f4 Reviewed-by: Kent Hansen <kent.hansen@nokia.com> Reviewed-by: Aaron Kennedy <aaron.kennedy@nokia.com>
-rw-r--r--src/qml/qml/qqmldata_p.h3
-rw-r--r--src/qml/qml/qqmlengine.cpp19
-rw-r--r--tests/auto/qml/qqmllanguage/data/receivers.qml8
-rw-r--r--tests/auto/qml/qqmllanguage/testtypes.cpp2
-rw-r--r--tests/auto/qml/qqmllanguage/testtypes.h19
-rw-r--r--tests/auto/qml/qqmllanguage/tst_qqmllanguage.cpp13
6 files changed, 64 insertions, 0 deletions
diff --git a/src/qml/qml/qqmldata_p.h b/src/qml/qml/qqmldata_p.h
index 3dd1c3ccba..b8eee47750 100644
--- a/src/qml/qml/qqmldata_p.h
+++ b/src/qml/qml/qqmldata_p.h
@@ -91,12 +91,14 @@ public:
QAbstractDeclarativeData::parentChanged = parentChanged;
QAbstractDeclarativeData::objectNameChanged = objectNameChanged;
QAbstractDeclarativeData::signalEmitted = signalEmitted;
+ QAbstractDeclarativeData::receivers = receivers;
}
static void destroyed(QAbstractDeclarativeData *, QObject *);
static void parentChanged(QAbstractDeclarativeData *, QObject *, QObject *);
static void objectNameChanged(QAbstractDeclarativeData *, QObject *);
static void signalEmitted(QAbstractDeclarativeData *, QObject *, int, void **);
+ static int receivers(QAbstractDeclarativeData *, const QObject *, int);
void destroyed(QObject *);
void parentChanged(QObject *, QObject *);
@@ -130,6 +132,7 @@ public:
inline QQmlNotifierEndpoint *notify(int index);
void addNotify(int index, QQmlNotifierEndpoint *);
+ int endpointCount(int index);
// The context that created the C++ object
QQmlContextData *context;
diff --git a/src/qml/qml/qqmlengine.cpp b/src/qml/qml/qqmlengine.cpp
index 153d6b325a..82eeb917ab 100644
--- a/src/qml/qml/qqmlengine.cpp
+++ b/src/qml/qml/qqmlengine.cpp
@@ -457,6 +457,25 @@ void QQmlData::signalEmitted(QAbstractDeclarativeData *, QObject *object, int in
if (ep) QQmlNotifier::emitNotify(ep);
}
+int QQmlData::receivers(QAbstractDeclarativeData *d, const QObject *, int index)
+{
+ return static_cast<QQmlData *>(d)->endpointCount(index);
+}
+
+int QQmlData::endpointCount(int index)
+{
+ int count = 0;
+ QQmlNotifierEndpoint *ep = notify(index);
+ if (!ep)
+ return count;
+ ++count;
+ while (ep->next) {
+ ++count;
+ ep = ep->next;
+ }
+ return count;
+}
+
void QQmlEnginePrivate::init()
{
Q_Q(QQmlEngine);
diff --git a/tests/auto/qml/qqmllanguage/data/receivers.qml b/tests/auto/qml/qqmllanguage/data/receivers.qml
new file mode 100644
index 0000000000..8828745854
--- /dev/null
+++ b/tests/auto/qml/qqmllanguage/data/receivers.qml
@@ -0,0 +1,8 @@
+import Test 1.0
+
+MyReceiversTestObject {
+ property int dummy: prop
+ onPropChanged: { var a = 0; } //do nothing
+ onMySignal: { var a = 0; } //do nothing
+}
+
diff --git a/tests/auto/qml/qqmllanguage/testtypes.cpp b/tests/auto/qml/qqmllanguage/testtypes.cpp
index 5e9423761c..beb0f596ae 100644
--- a/tests/auto/qml/qqmllanguage/testtypes.cpp
+++ b/tests/auto/qml/qqmllanguage/testtypes.cpp
@@ -81,6 +81,8 @@ void registerTypes()
qmlRegisterType<MyEnum1Class>("Test",1,0,"MyEnum1Class");
qmlRegisterType<MyEnum2Class>("Test",1,0,"MyEnum2Class");
qmlRegisterType<MyEnumDerivedClass>("Test",1,0,"MyEnumDerivedClass");
+
+ qmlRegisterType<MyReceiversTestObject>("Test",1,0,"MyReceiversTestObject");
}
QVariant myCustomVariantTypeConverter(const QString &data)
diff --git a/tests/auto/qml/qqmllanguage/testtypes.h b/tests/auto/qml/qqmllanguage/testtypes.h
index 7b3265efb4..90dea4a217 100644
--- a/tests/auto/qml/qqmllanguage/testtypes.h
+++ b/tests/auto/qml/qqmllanguage/testtypes.h
@@ -526,6 +526,24 @@ public:
UnavailableType() {}
};
+class MyReceiversTestObject : public QObject
+{
+ Q_OBJECT
+
+ Q_PROPERTY(int prop READ prop NOTIFY propChanged)
+public:
+ MyReceiversTestObject() {}
+
+ int prop() const { return 5; }
+
+ int mySignalCount() { return receivers(SIGNAL(mySignal())); }
+ int propChangedCount() { return receivers(SIGNAL(propChanged())); }
+
+signals:
+ void mySignal();
+ void propChanged();
+};
+
class MyDotPropertyObject : public QObject
{
Q_OBJECT
@@ -907,6 +925,7 @@ QML_DECLARE_TYPE(MyRevisionedBaseClassUnregistered)
QML_DECLARE_TYPE(MyRevisionedClass)
QML_DECLARE_TYPE(MyRevisionedSubclass)
QML_DECLARE_TYPE(MySubclass)
+QML_DECLARE_TYPE(MyReceiversTestObject)
void registerTypes();
diff --git a/tests/auto/qml/qqmllanguage/tst_qqmllanguage.cpp b/tests/auto/qml/qqmllanguage/tst_qqmllanguage.cpp
index 4720269313..e33f636c66 100644
--- a/tests/auto/qml/qqmllanguage/tst_qqmllanguage.cpp
+++ b/tests/auto/qml/qqmllanguage/tst_qqmllanguage.cpp
@@ -146,6 +146,7 @@ private slots:
void nestedComponentRoots();
void registrationOrder();
void readonly();
+ void receivers();
void basicRemote_data();
void basicRemote();
@@ -2285,6 +2286,18 @@ void tst_qqmllanguage::readonly()
delete o;
}
+void tst_qqmllanguage::receivers()
+{
+ QQmlComponent component(&engine, TEST_FILE("receivers.qml"));
+
+ MyReceiversTestObject *o = qobject_cast<MyReceiversTestObject*>(component.create());
+ QVERIFY(o != 0);
+ QCOMPARE(o->mySignalCount(), 1);
+ QCOMPARE(o->propChangedCount(), 2);
+
+ delete o;
+}
+
// QTBUG-18268
void tst_qqmllanguage::remoteLoadCrash()
{