From: Christian Kamm Date: Wed, 21 Sep 2011 10:54:10 +0000 (+0200) Subject: qmlplugindump: Describe meta object revisions of exported types. X-Git-Url: http://git.silmor.de/gitweb/?a=commitdiff_plain;h=26e15e877fb7db31928e1e90aa50bca841522711;p=konrad%2Fqtdeclarative.git qmlplugindump: Describe meta object revisions of exported types. Adds the exportMetaObjectRevisions property to generated qmltypes files. Change-Id: Iafe2fe408c88bb6dd02cbb558404a5f654431248 Reviewed-on: http://codereview.qt-project.org/5311 Reviewed-by: Roberto Raggi --- diff --git a/doc/src/declarative/modules.qdoc b/doc/src/declarative/modules.qdoc index efca620..259c77f 100644 --- a/doc/src/declarative/modules.qdoc +++ b/doc/src/declarative/modules.qdoc @@ -445,6 +445,13 @@ Module { "QtQuick/Animation 1.0" ] + // The meta object revisions for the exports specified in 'exports'. + // Describes with revisioned properties will be visible in an export. + // The list must have exactly the same length as the 'exports' list. + // For example the 'animations' propery described below will only be + // available through the QtQuick/Animation 1.0 export. + exportMetaObjectRevisions: [0, 1] + Property { name: "animations"; type: "QDeclarativeAbstractAnimation" @@ -454,7 +461,7 @@ Module { isPointer: true // defaults to false: whether the type actually is a QDeclarativeListProperty isList: true - // defaults to 0: the minor version that introduced this property + // defaults to 0: the meta object revision that introduced this property revision: 1 } Property { name: "loops"; type: "int" } diff --git a/tools/qmlplugindump/main.cpp b/tools/qmlplugindump/main.cpp index c53fd3c..6132d15 100644 --- a/tools/qmlplugindump/main.cpp +++ b/tools/qmlplugindump/main.cpp @@ -256,30 +256,43 @@ public: QSet qmlTypes = qmlTypesByCppName.value(meta->className()); if (!qmlTypes.isEmpty()) { - QStringList exports; + QHash exports; foreach (const QDeclarativeType *qmlTy, qmlTypes) { QString qmlTyName = qmlTy->qmlTypeName(); - // some qmltype names are missing the actual names, ignore that import - if (qmlTyName.endsWith('/')) - continue; if (qmlTyName.startsWith(relocatableModuleUri + QLatin1Char('/'))) { qmlTyName.remove(0, relocatableModuleUri.size() + 1); } if (qmlTyName.startsWith("./")) { qmlTyName.remove(0, 2); } - exports += enquote(QString("%1 %2.%3").arg( - qmlTyName, - QString::number(qmlTy->majorVersion()), - QString::number(qmlTy->minorVersion()))); + if (qmlTyName.startsWith("/")) { + qmlTyName.remove(0, 1); + } + const QString exportString = enquote( + QString("%1 %2.%3").arg( + qmlTyName, + QString::number(qmlTy->majorVersion()), + QString::number(qmlTy->minorVersion()))); + exports.insert(exportString, qmlTy); } // ensure exports are sorted and don't change order when the plugin is dumped again - exports.removeDuplicates(); - qSort(exports); - - qml->writeArrayBinding(QLatin1String("exports"), exports); + QStringList exportStrings = exports.keys(); + qSort(exportStrings); + qml->writeArrayBinding(QLatin1String("exports"), exportStrings); + + // write meta object revisions unless they're all zero + QStringList metaObjectRevisions; + bool shouldWriteMetaObjectRevisions = false; + foreach (const QString &exportString, exportStrings) { + int metaObjectRevision = exports[exportString]->metaObjectRevision(); + if (metaObjectRevision != 0) + shouldWriteMetaObjectRevisions = true; + metaObjectRevisions += QString::number(metaObjectRevision); + } + if (shouldWriteMetaObjectRevisions) + qml->writeArrayBinding(QLatin1String("exportMetaObjectRevisions"), metaObjectRevisions); if (const QMetaObject *attachedType = (*qmlTypes.begin())->attachedPropertiesType()) { qml->writeScriptBinding(QLatin1String("attachedType"), enquote( diff --git a/tools/qmlplugindump/qmlstreamwriter.cpp b/tools/qmlplugindump/qmlstreamwriter.cpp index ca52a7a..a5c110e 100644 --- a/tools/qmlplugindump/qmlstreamwriter.cpp +++ b/tools/qmlplugindump/qmlstreamwriter.cpp @@ -110,6 +110,22 @@ void QmlStreamWriter::writeArrayBinding(const QString &name, const QStringList & { flushPotentialLinesWithNewlines(); writeIndent(); + + // try to use a single line + QString singleLine; + singleLine += QString("%1: [").arg(name); + for (int i = 0; i < elements.size(); ++i) { + singleLine += elements.at(i); + if (i != elements.size() - 1) + singleLine += QLatin1String(", "); + } + singleLine += QLatin1String("]\n"); + if (singleLine.size() + m_indentDepth * 4 < 80) { + m_stream->write(singleLine.toUtf8()); + return; + } + + // write multi-line m_stream->write(QString("%1: [\n").arg(name).toUtf8()); ++m_indentDepth; for (int i = 0; i < elements.size(); ++i) {