Allow custom parser types to still get signal handlers generated
authorAlan Alpert <alan.alpert@nokia.com>
Mon, 1 Aug 2011 08:26:57 +0000 (18:26 +1000)
committerQt by Nokia <qt-info@nokia.com>
Tue, 2 Aug 2011 02:55:55 +0000 (04:55 +0200)
Specifically, QDeclarativeListModelParser ought to have this behaviour.

Task-number: QTBUG-19763
Change-Id: I9d6ee07d1e17a027b254b87d20d1a93795c55744
Reviewed-on: http://codereview.qt.nokia.com/2431
Reviewed-by: Martin Jones <martin.jones@nokia.com>

src/declarative/qml/qdeclarativecompiler.cpp
src/declarative/qml/qdeclarativecustomparser_p.h
src/declarative/util/qdeclarativelistmodel_p.h
tests/auto/declarative/qdeclarativelistmodel/data/signalhandlers.qml [new file with mode: 0644]
tests/auto/declarative/qdeclarativelistmodel/tst_qdeclarativelistmodel.cpp

index 5e1d3f6..5018abe 100644 (file)
@@ -856,6 +856,9 @@ bool QDeclarativeCompiler::buildObject(QDeclarativeParser::Object *obj, const Bi
                 int ids = compileState.ids.count();
                 COMPILE_CHECK(buildProperty(prop, obj, objCtxt));
                 canDefer = ids == compileState.ids.count();
+            } else if (isSignalPropertyName(prop->name) && 
+                    (cp->flags() & QDeclarativeCustomParser::AcceptsSignalHandlers)) {
+                COMPILE_CHECK(buildSignal(prop,obj,objCtxt));
             } else {
                 customProps << QDeclarativeCustomParserNodePrivate::fromProperty(prop);
             }
index ab66b9f..3145283 100644 (file)
@@ -116,7 +116,8 @@ class Q_DECLARATIVE_EXPORT QDeclarativeCustomParser
 public:
     enum Flag {
         NoFlag                    = 0x00000000,
-        AcceptsAttachedProperties = 0x00000001
+        AcceptsAttachedProperties = 0x00000001,
+        AcceptsSignalHandlers     = 0x00000002
     };
     Q_DECLARE_FLAGS(Flags, Flag)
 
index 94a7e65..e7c5632 100644 (file)
@@ -125,6 +125,7 @@ Q_OBJECT
 class QDeclarativeListModelParser : public QDeclarativeCustomParser
 {
 public:
+    QDeclarativeListModelParser() : QDeclarativeCustomParser(QDeclarativeCustomParser::AcceptsSignalHandlers) {}
     QByteArray compile(const QList<QDeclarativeCustomParserProperty> &);
     void setCustomData(QObject *, const QByteArray &);
 
diff --git a/tests/auto/declarative/qdeclarativelistmodel/data/signalhandlers.qml b/tests/auto/declarative/qdeclarativelistmodel/data/signalhandlers.qml
new file mode 100644 (file)
index 0000000..750d99c
--- /dev/null
@@ -0,0 +1,8 @@
+import QtQuick 2.0
+
+ListModel{
+    property bool ok: false
+    property int foo: 5
+    onFooChanged: ok = true
+    Component.onCompleted: foo = 6
+}
index fd68933..946a3a5 100644 (file)
@@ -107,6 +107,7 @@ private slots:
     void property_changes_worker();
     void property_changes_worker_data();
     void clear();
+    void signal_handlers();
 };
 
 int tst_qdeclarativelistmodel::roleFromName(const QDeclarativeListModel *model, const QString &roleName)
@@ -1192,6 +1193,18 @@ void tst_qdeclarativelistmodel::clear()
     QCOMPARE(model.toString(roles[2]), QString("propertyC"));
 }
 
+void tst_qdeclarativelistmodel::signal_handlers()
+{
+    QDeclarativeEngine eng;
+    QDeclarativeComponent component(&eng, QUrl::fromLocalFile(SRCDIR "/data/signalhandlers.qml"));
+    QObject *model = component.create();
+    QVERIFY2(component.errorString().isEmpty(), QTest::toString(component.errorString()));
+    QVERIFY(model != 0);
+    QVERIFY(model->property("ok").toBool());
+
+    delete model;
+}
+
 QTEST_MAIN(tst_qdeclarativelistmodel)
 
 #include "tst_qdeclarativelistmodel.moc"