From 384fd7cdf1cb3061126c74c4f591cd2c0acdfedc Mon Sep 17 00:00:00 2001 From: Kent Hansen Date: Tue, 22 Nov 2011 15:10:42 +0100 Subject: v4: Get rid of dependency on QQuickAnchorLine type Delegate the meta-type id query and value comparison to QDeclarativeMetaType. Register a comparison function for QQuickAnchorLine in QQuickItemsModule, so that not even QDeclarativeMetaType needs to know the type declaration. (This is needed in order to be able to move the items to a separate library.) Change-Id: I6404d01b74143946ae0a79fa18d1777b675e4194 Reviewed-by: Roberto Raggi --- src/declarative/items/qquickitemsmodule.cpp | 9 +++++++++ src/declarative/qml/qdeclarativemetatype.cpp | 23 +++++++++++++++++++++++ src/declarative/qml/qdeclarativemetatype_p.h | 8 ++++++++ src/declarative/qml/v4/qv4bindings.cpp | 13 +++++-------- src/declarative/qml/v4/qv4compiler.cpp | 5 ++--- src/declarative/qml/v4/qv4irbuilder.cpp | 4 ++-- 6 files changed, 49 insertions(+), 13 deletions(-) (limited to 'src') diff --git a/src/declarative/items/qquickitemsmodule.cpp b/src/declarative/items/qquickitemsmodule.cpp index 0a04e884ae..fd9f4f8719 100644 --- a/src/declarative/items/qquickitemsmodule.cpp +++ b/src/declarative/items/qquickitemsmodule.cpp @@ -81,6 +81,7 @@ #include "qquickdrag_p.h" #include "qquickdroparea_p.h" #include "qquickmultipointtoucharea_p.h" +#include static QDeclarativePrivate::AutoParentResult qquickitem_autoParent(QObject *obj, QObject *parent) { @@ -96,6 +97,13 @@ static QDeclarativePrivate::AutoParentResult qquickitem_autoParent(QObject *obj, return QDeclarativePrivate::Parented; } +static bool compareQQuickAnchorLines(const void *p1, const void *p2) +{ + const QQuickAnchorLine &l1 = *static_cast(p1); + const QQuickAnchorLine &l2 = *static_cast(p2); + return l1 == l2; +} + static void qt_quickitems_defineModule(const char *uri, int major, int minor) { QDeclarativePrivate::RegisterAutoParent autoparent = { 0, &qquickitem_autoParent }; @@ -168,6 +176,7 @@ static void qt_quickitems_defineModule(const char *uri, int major, int minor) qmlRegisterType(); qmlRegisterType(); qRegisterMetaType("QQuickAnchorLine"); + QDeclarativeMetaType::setQQuickAnchorLineCompareFunction(compareQQuickAnchorLines); qmlRegisterUncreatableType(uri,major,minor,"KeyNavigation",QQuickKeyNavigationAttached::tr("KeyNavigation is only available via attached properties")); qmlRegisterUncreatableType(uri,major,minor,"Keys",QQuickKeysAttached::tr("Keys is only available via attached properties")); diff --git a/src/declarative/qml/qdeclarativemetatype.cpp b/src/declarative/qml/qdeclarativemetatype.cpp index 9e178c630e..46395e15e8 100644 --- a/src/declarative/qml/qdeclarativemetatype.cpp +++ b/src/declarative/qml/qdeclarativemetatype.cpp @@ -1894,4 +1894,27 @@ bool QDeclarativeMetaType::copy(int type, void *data, const void *copy) return false; } +int QDeclarativeMetaType::QQuickAnchorLineMetaTypeId() +{ + static int id = 0; + if (!id) { + id = QMetaType::type("QQuickAnchorLine"); + Q_ASSERT(id != 0); + } + return id; +} + +QDeclarativeMetaType::CompareFunction QDeclarativeMetaType::anchorLineCompareFunction = 0; + +void QDeclarativeMetaType::setQQuickAnchorLineCompareFunction(CompareFunction fun) +{ + anchorLineCompareFunction = fun; +} + +bool QDeclarativeMetaType::QQuickAnchorLineCompare(const void *p1, const void *p2) +{ + Q_ASSERT(anchorLineCompareFunction != 0); + return anchorLineCompareFunction(p1, p2); +} + QT_END_NAMESPACE diff --git a/src/declarative/qml/qdeclarativemetatype_p.h b/src/declarative/qml/qdeclarativemetatype_p.h index 4488600de1..fc4cff8342 100644 --- a/src/declarative/qml/qdeclarativemetatype_p.h +++ b/src/declarative/qml/qdeclarativemetatype_p.h @@ -111,6 +111,11 @@ public: static QList parentFunctions(); + static int QQuickAnchorLineMetaTypeId(); + typedef bool (*CompareFunction)(const void *, const void *); + static void setQQuickAnchorLineCompareFunction(CompareFunction); + static bool QQuickAnchorLineCompare(const void *p1, const void *p2); + struct ModuleApiInstance { ModuleApiInstance() : scriptCallback(0), qobjectCallback(0), qobjectApi(0) {} @@ -130,6 +135,9 @@ public: }; static ModuleApi moduleApi(const QString &, int, int); static QHash > moduleApis(); + +private: + static CompareFunction anchorLineCompareFunction; }; class QHashedStringRef; diff --git a/src/declarative/qml/v4/qv4bindings.cpp b/src/declarative/qml/v4/qv4bindings.cpp index 1f9342723e..835b7e7752 100644 --- a/src/declarative/qml/v4/qv4bindings.cpp +++ b/src/declarative/qml/v4/qv4bindings.cpp @@ -48,7 +48,7 @@ #include #include -#include // For AnchorLine +#include #include #include @@ -450,11 +450,8 @@ static bool testCompareVariants(const QVariant &qtscriptRaw, const QVariant &v4) QDeclarative1AnchorLine ra = qvariant_cast(v4); return la == ra; - } else if (type == qMetaTypeId()) { - QQuickAnchorLine la = qvariant_cast(qtscript); - QQuickAnchorLine ra = qvariant_cast(v4); - - return la == ra; + } else if (type == QDeclarativeMetaType::QQuickAnchorLineMetaTypeId()) { + return QDeclarativeMetaType::QQuickAnchorLineCompare(qtscript.constData(), v4.constData()); } else if (type == QMetaType::Double) { double la = qvariant_cast(qtscript); @@ -535,8 +532,8 @@ static void testBindingResult(const QString &binding, int line, int column, default: if (resultType == qMetaTypeId()) { v4value = qVariantFromValue(*(QDeclarative1AnchorLine *)result.typeDataPtr()); - } else if (resultType == qMetaTypeId()) { - v4value = qVariantFromValue(*(QQuickAnchorLine *)result.typeDataPtr()); + } else if (resultType == QDeclarativeMetaType::QQuickAnchorLineMetaTypeId()) { + v4value = QVariant(QDeclarativeMetaType::QQuickAnchorLineMetaTypeId(), result.typeDataPtr()); } else { iserror = true; v4Result = "Unknown V4 type"; diff --git a/src/declarative/qml/v4/qv4compiler.cpp b/src/declarative/qml/v4/qv4compiler.cpp index 8fdfa74ac4..1d6cd30a99 100644 --- a/src/declarative/qml/v4/qv4compiler.cpp +++ b/src/declarative/qml/v4/qv4compiler.cpp @@ -48,7 +48,6 @@ #include #include #include -#include // For AnchorLine QT_BEGIN_NAMESPACE @@ -346,7 +345,7 @@ void QV4CompilerPrivate::visitName(IR::Name *e) default: if (propTy == qMetaTypeId()) { regType = PODValueType; - } else if (propTy == qMetaTypeId()) { + } else if (propTy == QDeclarativeMetaType::QQuickAnchorLineMetaTypeId()) { regType = PODValueType; } else if (QDeclarativeMetaType::isQObject(propTy)) { regType = QObjectStarType; @@ -945,7 +944,7 @@ void QV4CompilerPrivate::visitRet(IR::Ret *s) test.regType = qMetaTypeId(); break; case IR::SGAnchorLineType: - test.regType = qMetaTypeId(); + test.regType = QDeclarativeMetaType::QQuickAnchorLineMetaTypeId(); break; case IR::ObjectType: test.regType = QMetaType::QObjectStar; diff --git a/src/declarative/qml/v4/qv4irbuilder.cpp b/src/declarative/qml/v4/qv4irbuilder.cpp index 125e1d002a..c65b348c9f 100644 --- a/src/declarative/qml/v4/qv4irbuilder.cpp +++ b/src/declarative/qml/v4/qv4irbuilder.cpp @@ -42,7 +42,7 @@ #include "qv4irbuilder_p.h" #include "qv4compiler_p_p.h" -#include // For AnchorLine +#include #include DEFINE_BOOL_CONFIG_OPTION(qmlVerboseCompiler, QML_VERBOSE_COMPILER) @@ -72,7 +72,7 @@ static IR::Type irTypeFromVariantType(int t, QDeclarativeEnginePrivate *engine, default: if (t == qMetaTypeId()) return IR::AnchorLineType; - else if (t == qMetaTypeId()) + else if (t == QDeclarativeMetaType::QQuickAnchorLineMetaTypeId()) return IR::SGAnchorLineType; else if (engine->metaObjectForType(t)) { return IR::ObjectType; -- cgit v1.2.3