diff options
author | Aaron Kennedy <aaron.kennedy@nokia.com> | 2010-03-05 03:23:04 (GMT) |
---|---|---|
committer | Aaron Kennedy <aaron.kennedy@nokia.com> | 2010-03-05 03:24:38 (GMT) |
commit | ae6f59d8dffc1a0569640e374dde01ed84f9c542 (patch) | |
tree | 7e15d0ca912854c181bb0f1209ac29a00ad0228e /src | |
parent | 604efbcd24058cdcb9bfa9691af6e08200eb47d4 (diff) | |
download | Qt-ae6f59d8dffc1a0569640e374dde01ed84f9c542.zip Qt-ae6f59d8dffc1a0569640e374dde01ed84f9c542.tar.gz Qt-ae6f59d8dffc1a0569640e374dde01ed84f9c542.tar.bz2 |
Allow unquoted enum syntax for value types
QTBUG-5424
Diffstat (limited to 'src')
-rw-r--r-- | src/declarative/qml/qdeclarativecompiler.cpp | 6 | ||||
-rw-r--r-- | src/declarative/qml/qdeclarativeengine.cpp | 1 | ||||
-rw-r--r-- | src/declarative/qml/qdeclarativemetatype.cpp | 9 | ||||
-rw-r--r-- | src/declarative/qml/qdeclarativemetatype_p.h | 2 | ||||
-rw-r--r-- | src/declarative/qml/qdeclarativevaluetype.cpp | 34 | ||||
-rw-r--r-- | src/declarative/qml/qdeclarativevaluetype_p.h | 2 |
6 files changed, 50 insertions, 4 deletions
diff --git a/src/declarative/qml/qdeclarativecompiler.cpp b/src/declarative/qml/qdeclarativecompiler.cpp index 5a2f3b5..3c6c949 100644 --- a/src/declarative/qml/qdeclarativecompiler.cpp +++ b/src/declarative/qml/qdeclarativecompiler.cpp @@ -561,9 +561,11 @@ bool QDeclarativeCompiler::compile(QDeclarativeEngine *engine, QDeclarativeCompositeTypeData::TypeReference &tref = unit->types[ii]; QDeclarativeCompiledData::TypeReference ref; QDeclarativeScriptParser::TypeReference *parserRef = unit->data.referencedTypes().at(ii); - if (tref.type) + if (tref.type) { ref.type = tref.type; - else if (tref.unit) { + if (!ref.type->isCreatable()) + COMPILE_EXCEPTION(parserRef->refObjects.first(), QCoreApplication::translate("QDeclarativeCompiler", "Element is not creatable.")); + } else if (tref.unit) { ref.component = tref.unit->toComponent(engine); if (ref.component->isError()) { diff --git a/src/declarative/qml/qdeclarativeengine.cpp b/src/declarative/qml/qdeclarativeengine.cpp index 7ce2d0b..1e60df4 100644 --- a/src/declarative/qml/qdeclarativeengine.cpp +++ b/src/declarative/qml/qdeclarativeengine.cpp @@ -167,6 +167,7 @@ QDeclarativeEnginePrivate::QDeclarativeEnginePrivate(QDeclarativeEngine *e) QDeclarativeItemModule::defineModule(); QDeclarativeUtilModule::defineModule(); QDeclarativeEnginePrivate::defineModule(); + QDeclarativeValueTypeFactory::registerValueTypes(); } globalClass = new QDeclarativeGlobalScriptClass(&scriptEngine); diff --git a/src/declarative/qml/qdeclarativemetatype.cpp b/src/declarative/qml/qdeclarativemetatype.cpp index abbb9d6..50ab56b 100644 --- a/src/declarative/qml/qdeclarativemetatype.cpp +++ b/src/declarative/qml/qdeclarativemetatype.cpp @@ -286,6 +286,11 @@ QDeclarativeCustomParser *QDeclarativeType::customParser() const return d->m_customParser; } +bool QDeclarativeType::isCreatable() const +{ + return d->m_newFunc != 0; +} + bool QDeclarativeType::isInterface() const { return d->m_isInterface; @@ -402,7 +407,7 @@ int QDeclarativePrivate::registerType(const QDeclarativePrivate::RegisterType &t data->types.append(dtype); data->idToType.insert(dtype->typeId(), dtype); - data->idToType.insert(dtype->qListTypeId(), dtype); + if (dtype->qListTypeId()) data->idToType.insert(dtype->qListTypeId(), dtype); if (!dtype->qmlTypeName().isEmpty()) data->nameToType.insertMulti(dtype->qmlTypeName(), dtype); @@ -414,7 +419,7 @@ int QDeclarativePrivate::registerType(const QDeclarativePrivate::RegisterType &t if (data->lists.size() <= type.listId) data->lists.resize(type.listId + 16); data->objects.setBit(type.typeId, true); - data->lists.setBit(type.listId, true); + if (type.listId) data->lists.setBit(type.listId, true); return index; } diff --git a/src/declarative/qml/qdeclarativemetatype_p.h b/src/declarative/qml/qdeclarativemetatype_p.h index ec5c045..cf8946d 100644 --- a/src/declarative/qml/qdeclarativemetatype_p.h +++ b/src/declarative/qml/qdeclarativemetatype_p.h @@ -114,6 +114,8 @@ public: QDeclarativeCustomParser *customParser() const; + bool isCreatable() const; + bool isInterface() const; int typeId() const; int qListTypeId() const; diff --git a/src/declarative/qml/qdeclarativevaluetype.cpp b/src/declarative/qml/qdeclarativevaluetype.cpp index 34d3795..c070123 100644 --- a/src/declarative/qml/qdeclarativevaluetype.cpp +++ b/src/declarative/qml/qdeclarativevaluetype.cpp @@ -41,6 +41,8 @@ #include "qdeclarativevaluetype_p.h" +#include "qdeclarativemetatype_p.h" + #include <QtCore/qdebug.h> QT_BEGIN_NAMESPACE @@ -49,6 +51,32 @@ QT_BEGIN_NAMESPACE Q_DECLARE_METATYPE(QEasingCurve); #endif +template<typename T> +int qmlRegisterValueTypeEnums(const char *qmlName) +{ + QByteArray name(T::staticMetaObject.className()); + + QByteArray pointerName(name + '*'); + + QDeclarativePrivate::RegisterType type = { + 0, + + qRegisterMetaType<T *>(pointerName.constData()), 0, 0, + + "Qt", 4, 6, qmlName, &T::staticMetaObject, + + 0, 0, + + 0, 0, 0, + + 0, 0, + + 0 + }; + + return QDeclarativePrivate::registerType(type); +} + QDeclarativeValueTypeFactory::QDeclarativeValueTypeFactory() { // ### Optimize @@ -80,6 +108,12 @@ bool QDeclarativeValueTypeFactory::isValueType(int idx) return false; } +void QDeclarativeValueTypeFactory::registerValueTypes() +{ + qmlRegisterValueTypeEnums<QDeclarativeEasingValueType>("Easing"); + qmlRegisterValueTypeEnums<QDeclarativeFontValueType>("Font"); +} + QDeclarativeValueType *QDeclarativeValueTypeFactory::operator[](int idx) const { #if (QT_VERSION < QT_VERSION_CHECK(4,7,0)) diff --git a/src/declarative/qml/qdeclarativevaluetype_p.h b/src/declarative/qml/qdeclarativevaluetype_p.h index e69f161..ad2f6c4 100644 --- a/src/declarative/qml/qdeclarativevaluetype_p.h +++ b/src/declarative/qml/qdeclarativevaluetype_p.h @@ -84,6 +84,8 @@ public: static bool isValueType(int); static QDeclarativeValueType *valueType(int); + static void registerValueTypes(); + QDeclarativeValueType *operator[](int idx) const; private: |