From: Alan Alpert Date: Mon, 1 Aug 2011 08:26:57 +0000 (+1000) Subject: Allow custom parser types to still get signal handlers generated X-Git-Url: http://git.silmor.de/gitweb/?a=commitdiff_plain;h=aa0448cf1882ddb6e4a959718a6fcc399c36990b;p=konrad%2Fqtdeclarative.git Allow custom parser types to still get signal handlers generated 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 --- diff --git a/src/declarative/qml/qdeclarativecompiler.cpp b/src/declarative/qml/qdeclarativecompiler.cpp index 5e1d3f6..5018abe 100644 --- a/src/declarative/qml/qdeclarativecompiler.cpp +++ b/src/declarative/qml/qdeclarativecompiler.cpp @@ -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); } diff --git a/src/declarative/qml/qdeclarativecustomparser_p.h b/src/declarative/qml/qdeclarativecustomparser_p.h index ab66b9f..3145283 100644 --- a/src/declarative/qml/qdeclarativecustomparser_p.h +++ b/src/declarative/qml/qdeclarativecustomparser_p.h @@ -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) diff --git a/src/declarative/util/qdeclarativelistmodel_p.h b/src/declarative/util/qdeclarativelistmodel_p.h index 94a7e65..e7c5632 100644 --- a/src/declarative/util/qdeclarativelistmodel_p.h +++ b/src/declarative/util/qdeclarativelistmodel_p.h @@ -125,6 +125,7 @@ Q_OBJECT class QDeclarativeListModelParser : public QDeclarativeCustomParser { public: + QDeclarativeListModelParser() : QDeclarativeCustomParser(QDeclarativeCustomParser::AcceptsSignalHandlers) {} QByteArray compile(const QList &); 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 index 0000000..750d99c --- /dev/null +++ b/tests/auto/declarative/qdeclarativelistmodel/data/signalhandlers.qml @@ -0,0 +1,8 @@ +import QtQuick 2.0 + +ListModel{ + property bool ok: false + property int foo: 5 + onFooChanged: ok = true + Component.onCompleted: foo = 6 +} diff --git a/tests/auto/declarative/qdeclarativelistmodel/tst_qdeclarativelistmodel.cpp b/tests/auto/declarative/qdeclarativelistmodel/tst_qdeclarativelistmodel.cpp index fd68933..946a3a5 100644 --- a/tests/auto/declarative/qdeclarativelistmodel/tst_qdeclarativelistmodel.cpp +++ b/tests/auto/declarative/qdeclarativelistmodel/tst_qdeclarativelistmodel.cpp @@ -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"