1 /****************************************************************************
3 ** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
4 ** All rights reserved.
5 ** Contact: Nokia Corporation (qt-info@nokia.com)
7 ** This file is part of the QtDeclarative module of the Qt Toolkit.
9 ** $QT_BEGIN_LICENSE:LGPL$
10 ** No Commercial Usage
11 ** This file contains pre-release code and may not be distributed.
12 ** You may use this file in accordance with the terms and conditions
13 ** contained in the Technology Preview License Agreement accompanying
16 ** GNU Lesser General Public License Usage
17 ** Alternatively, this file may be used under the terms of the GNU Lesser
18 ** General Public License version 2.1 as published by the Free Software
19 ** Foundation and appearing in the file LICENSE.LGPL included in the
20 ** packaging of this file. Please review the following information to
21 ** ensure the GNU Lesser General Public License version 2.1 requirements
22 ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
24 ** In addition, as a special exception, Nokia gives you certain additional
25 ** rights. These rights are described in the Nokia Qt LGPL Exception
26 ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
28 ** If you have questions regarding the use of this file, please contact
29 ** Nokia at qt-info@nokia.com.
40 ****************************************************************************/
42 #ifndef QDECLARATIVE_H
43 #define QDECLARATIVE_H
45 #include <QtDeclarative/qdeclarativeprivate.h>
46 #include <QtDeclarative/qdeclarativeparserstatus.h>
47 #include <QtDeclarative/qdeclarativepropertyvaluesource.h>
48 #include <QtDeclarative/qdeclarativepropertyvalueinterceptor.h>
49 #include <QtDeclarative/qdeclarativelist.h>
51 #include <QtCore/qbytearray.h>
52 #include <QtCore/qmetaobject.h>
56 #define QML_VERSION 0x020000
57 #define QML_VERSION_STR "2.0"
59 #define QML_DECLARE_TYPE(TYPE) \
60 Q_DECLARE_METATYPE(TYPE *) \
61 Q_DECLARE_METATYPE(QDeclarativeListProperty<TYPE>)
63 #define QML_DECLARE_TYPE_HASMETATYPE(TYPE) \
64 Q_DECLARE_METATYPE(QDeclarativeListProperty<TYPE>)
66 #define QML_DECLARE_INTERFACE(INTERFACE) \
67 QML_DECLARE_TYPE(INTERFACE)
69 #define QML_DECLARE_INTERFACE_HASMETATYPE(INTERFACE) \
70 QML_DECLARE_TYPE_HASMETATYPE(INTERFACE)
72 enum { /* TYPEINFO flags */
73 QML_HAS_ATTACHED_PROPERTIES = 0x01
76 #define QML_DECLARE_TYPEINFO(TYPE, FLAGS) \
79 class QDeclarativeTypeInfo<TYPE > \
83 hasAttachedProperties = (((FLAGS) & QML_HAS_ATTACHED_PROPERTIES) == QML_HAS_ATTACHED_PROPERTIES) \
90 QT_MODULE(Declarative)
95 QByteArray name(T::staticMetaObject.className());
97 QByteArray pointerName(name + '*');
98 QByteArray listName("QDeclarativeListProperty<" + name + ">");
100 QDeclarativePrivate::RegisterType type = {
103 qRegisterMetaType<T *>(pointerName.constData()),
104 qRegisterMetaType<QDeclarativeListProperty<T> >(listName.constData()),
108 0, 0, 0, 0, &T::staticMetaObject,
110 QDeclarativePrivate::attachedPropertiesFunc<T>(),
111 QDeclarativePrivate::attachedPropertiesMetaObject<T>(),
113 QDeclarativePrivate::StaticCastSelector<T,QDeclarativeParserStatus>::cast(),
114 QDeclarativePrivate::StaticCastSelector<T,QDeclarativePropertyValueSource>::cast(),
115 QDeclarativePrivate::StaticCastSelector<T,QDeclarativePropertyValueInterceptor>::cast(),
123 return QDeclarativePrivate::qmlregister(QDeclarativePrivate::TypeRegistration, &type);
126 int Q_AUTOTEST_EXPORT qmlRegisterTypeNotAvailable(const char *uri, int versionMajor, int versionMinor, const char *qmlName, const QString& message);
129 int qmlRegisterUncreatableType(const char *uri, int versionMajor, int versionMinor, const char *qmlName, const QString& reason)
131 QByteArray name(T::staticMetaObject.className());
133 QByteArray pointerName(name + '*');
134 QByteArray listName("QDeclarativeListProperty<" + name + ">");
136 QDeclarativePrivate::RegisterType type = {
139 qRegisterMetaType<T *>(pointerName.constData()),
140 qRegisterMetaType<QDeclarativeListProperty<T> >(listName.constData()),
144 uri, versionMajor, versionMinor, qmlName, &T::staticMetaObject,
146 QDeclarativePrivate::attachedPropertiesFunc<T>(),
147 QDeclarativePrivate::attachedPropertiesMetaObject<T>(),
149 QDeclarativePrivate::StaticCastSelector<T,QDeclarativeParserStatus>::cast(),
150 QDeclarativePrivate::StaticCastSelector<T,QDeclarativePropertyValueSource>::cast(),
151 QDeclarativePrivate::StaticCastSelector<T,QDeclarativePropertyValueInterceptor>::cast(),
159 return QDeclarativePrivate::qmlregister(QDeclarativePrivate::TypeRegistration, &type);
163 int qmlRegisterType(const char *uri, int versionMajor, int versionMinor, const char *qmlName)
165 QByteArray name(T::staticMetaObject.className());
167 QByteArray pointerName(name + '*');
168 QByteArray listName("QDeclarativeListProperty<" + name + ">");
170 QDeclarativePrivate::RegisterType type = {
173 qRegisterMetaType<T *>(pointerName.constData()),
174 qRegisterMetaType<QDeclarativeListProperty<T> >(listName.constData()),
175 sizeof(T), QDeclarativePrivate::createInto<T>,
178 uri, versionMajor, versionMinor, qmlName, &T::staticMetaObject,
180 QDeclarativePrivate::attachedPropertiesFunc<T>(),
181 QDeclarativePrivate::attachedPropertiesMetaObject<T>(),
183 QDeclarativePrivate::StaticCastSelector<T,QDeclarativeParserStatus>::cast(),
184 QDeclarativePrivate::StaticCastSelector<T,QDeclarativePropertyValueSource>::cast(),
185 QDeclarativePrivate::StaticCastSelector<T,QDeclarativePropertyValueInterceptor>::cast(),
193 return QDeclarativePrivate::qmlregister(QDeclarativePrivate::TypeRegistration, &type);
196 template<typename T, int metaObjectRevision>
197 int qmlRegisterType(const char *uri, int versionMajor, int versionMinor, const char *qmlName)
199 QByteArray name(T::staticMetaObject.className());
201 QByteArray pointerName(name + '*');
202 QByteArray listName("QDeclarativeListProperty<" + name + ">");
204 QDeclarativePrivate::RegisterType type = {
207 qRegisterMetaType<T *>(pointerName.constData()),
208 qRegisterMetaType<QDeclarativeListProperty<T> >(listName.constData()),
209 sizeof(T), QDeclarativePrivate::createInto<T>,
212 uri, versionMajor, versionMinor, qmlName, &T::staticMetaObject,
214 QDeclarativePrivate::attachedPropertiesFunc<T>(),
215 QDeclarativePrivate::attachedPropertiesMetaObject<T>(),
217 QDeclarativePrivate::StaticCastSelector<T,QDeclarativeParserStatus>::cast(),
218 QDeclarativePrivate::StaticCastSelector<T,QDeclarativePropertyValueSource>::cast(),
219 QDeclarativePrivate::StaticCastSelector<T,QDeclarativePropertyValueInterceptor>::cast(),
227 return QDeclarativePrivate::qmlregister(QDeclarativePrivate::TypeRegistration, &type);
230 template<typename T, int metaObjectRevision>
231 int qmlRegisterRevision(const char *uri, int versionMajor, int versionMinor)
233 QByteArray name(T::staticMetaObject.className());
235 QByteArray pointerName(name + '*');
236 QByteArray listName("QDeclarativeListProperty<" + name + ">");
238 QDeclarativePrivate::RegisterType type = {
241 qRegisterMetaType<T *>(pointerName.constData()),
242 qRegisterMetaType<QDeclarativeListProperty<T> >(listName.constData()),
243 sizeof(T), QDeclarativePrivate::createInto<T>,
246 uri, versionMajor, versionMinor, 0, &T::staticMetaObject,
248 QDeclarativePrivate::attachedPropertiesFunc<T>(),
249 QDeclarativePrivate::attachedPropertiesMetaObject<T>(),
251 QDeclarativePrivate::StaticCastSelector<T,QDeclarativeParserStatus>::cast(),
252 QDeclarativePrivate::StaticCastSelector<T,QDeclarativePropertyValueSource>::cast(),
253 QDeclarativePrivate::StaticCastSelector<T,QDeclarativePropertyValueInterceptor>::cast(),
261 return QDeclarativePrivate::qmlregister(QDeclarativePrivate::TypeRegistration, &type);
265 template<typename T, typename E>
266 int qmlRegisterExtendedType()
268 QByteArray name(T::staticMetaObject.className());
270 QByteArray pointerName(name + '*');
271 QByteArray listName("QDeclarativeListProperty<" + name + ">");
273 QDeclarativePrivate::RegisterType type = {
276 qRegisterMetaType<T *>(pointerName.constData()),
277 qRegisterMetaType<QDeclarativeListProperty<T> >(listName.constData()),
281 0, 0, 0, 0, &T::staticMetaObject,
283 QDeclarativePrivate::attachedPropertiesFunc<T>(),
284 QDeclarativePrivate::attachedPropertiesMetaObject<T>(),
286 QDeclarativePrivate::StaticCastSelector<T,QDeclarativeParserStatus>::cast(),
287 QDeclarativePrivate::StaticCastSelector<T,QDeclarativePropertyValueSource>::cast(),
288 QDeclarativePrivate::StaticCastSelector<T,QDeclarativePropertyValueInterceptor>::cast(),
290 QDeclarativePrivate::createParent<E>, &E::staticMetaObject,
296 return QDeclarativePrivate::qmlregister(QDeclarativePrivate::TypeRegistration, &type);
299 template<typename T, typename E>
300 int qmlRegisterExtendedType(const char *uri, int versionMajor, int versionMinor,
303 QByteArray name(T::staticMetaObject.className());
305 QByteArray pointerName(name + '*');
306 QByteArray listName("QDeclarativeListProperty<" + name + ">");
308 QDeclarativeAttachedPropertiesFunc attached = QDeclarativePrivate::attachedPropertiesFunc<E>();
309 const QMetaObject * attachedMetaObject = QDeclarativePrivate::attachedPropertiesMetaObject<E>();
311 attached = QDeclarativePrivate::attachedPropertiesFunc<T>();
312 attachedMetaObject = QDeclarativePrivate::attachedPropertiesMetaObject<T>();
315 QDeclarativePrivate::RegisterType type = {
318 qRegisterMetaType<T *>(pointerName.constData()),
319 qRegisterMetaType<QDeclarativeListProperty<T> >(listName.constData()),
320 sizeof(T), QDeclarativePrivate::createInto<T>,
323 uri, versionMajor, versionMinor, qmlName, &T::staticMetaObject,
328 QDeclarativePrivate::StaticCastSelector<T,QDeclarativeParserStatus>::cast(),
329 QDeclarativePrivate::StaticCastSelector<T,QDeclarativePropertyValueSource>::cast(),
330 QDeclarativePrivate::StaticCastSelector<T,QDeclarativePropertyValueInterceptor>::cast(),
332 QDeclarativePrivate::createParent<E>, &E::staticMetaObject,
338 return QDeclarativePrivate::qmlregister(QDeclarativePrivate::TypeRegistration, &type);
342 int qmlRegisterInterface(const char *typeName)
344 QByteArray name(typeName);
346 QByteArray pointerName(name + '*');
347 QByteArray listName("QDeclarativeListProperty<" + name + ">");
349 QDeclarativePrivate::RegisterInterface qmlInterface = {
352 qRegisterMetaType<T *>(pointerName.constData()),
353 qRegisterMetaType<QDeclarativeListProperty<T> >(listName.constData()),
355 qobject_interface_iid<T *>()
358 return QDeclarativePrivate::qmlregister(QDeclarativePrivate::InterfaceRegistration, &qmlInterface);
362 int qmlRegisterCustomType(const char *uri, int versionMajor, int versionMinor,
363 const char *qmlName, QDeclarativeCustomParser *parser)
365 QByteArray name(T::staticMetaObject.className());
367 QByteArray pointerName(name + '*');
368 QByteArray listName("QDeclarativeListProperty<" + name + ">");
370 QDeclarativePrivate::RegisterType type = {
373 qRegisterMetaType<T *>(pointerName.constData()),
374 qRegisterMetaType<QDeclarativeListProperty<T> >(listName.constData()),
375 sizeof(T), QDeclarativePrivate::createInto<T>,
378 uri, versionMajor, versionMinor, qmlName, &T::staticMetaObject,
380 QDeclarativePrivate::attachedPropertiesFunc<T>(),
381 QDeclarativePrivate::attachedPropertiesMetaObject<T>(),
383 QDeclarativePrivate::StaticCastSelector<T,QDeclarativeParserStatus>::cast(),
384 QDeclarativePrivate::StaticCastSelector<T,QDeclarativePropertyValueSource>::cast(),
385 QDeclarativePrivate::StaticCastSelector<T,QDeclarativePropertyValueInterceptor>::cast(),
393 return QDeclarativePrivate::qmlregister(QDeclarativePrivate::TypeRegistration, &type);
396 class QDeclarativeContext;
397 class QDeclarativeEngine;
400 Q_DECLARATIVE_EXPORT void qmlExecuteDeferred(QObject *);
401 Q_DECLARATIVE_EXPORT QDeclarativeContext *qmlContext(const QObject *);
402 Q_DECLARATIVE_EXPORT QDeclarativeEngine *qmlEngine(const QObject *);
403 Q_DECLARATIVE_EXPORT QObject *qmlAttachedPropertiesObjectById(int, const QObject *, bool create = true);
404 Q_DECLARATIVE_EXPORT QObject *qmlAttachedPropertiesObject(int *, const QObject *, const QMetaObject *, bool create);
407 QObject *qmlAttachedPropertiesObject(const QObject *obj, bool create = true)
410 return qmlAttachedPropertiesObject(&idx, obj, &T::staticMetaObject, create);
414 This function may be used to register a module API provider \a callback in a particular \a uri
415 with a version specified in \a versionMajor and \a versionMinor.
417 Installing a module API into a uri allows developers to provide arbitrary functionality
418 (methods and properties) in a namespace that doesn't necessarily contain elements.
420 A module API may be either a QObject or a QScriptValue. Only one module API provider
421 may be registered into any given namespace (combination of \a uri, \a majorVersion and \a minorVersion).
422 This function should be used to register a module API provider function which returns a QScriptValue as a module API.
426 // first, define the module API provider function (callback).
427 static QScriptValue *example_qscriptvalue_module_api_provider(QDeclarativeEngine *engine, QScriptEngine *scriptEngine)
431 static int seedValue = 5;
432 QScriptValue example = scriptEngine->newObject();
433 example.setProperty("someProperty", seedValue++);
437 // second, register the module API provider with QML by calling this function in an initialization function.
439 qmlRegisterModuleApi("Qt.example.qscriptvalueApi", 1, 0, example_qscriptvalue_module_api_provider);
443 In order to use the registered module API in QML, you must import the module API.
446 import Qt.example.qscriptvalueApi 1.0 as ExampleApi
449 property int someValue: ExampleApi.someProperty
453 inline int qmlRegisterModuleApi(const char *uri, int versionMajor, int versionMinor,
454 QScriptValue (*callback)(QDeclarativeEngine *, QScriptEngine *))
456 QDeclarativePrivate::RegisterModuleApi api = {
459 uri, versionMajor, versionMinor,
464 return QDeclarativePrivate::qmlregister(QDeclarativePrivate::ModuleApiRegistration, &api);
468 This function may be used to register a module API provider \a callback in a particular \a uri
469 with a version specified in \a versionMajor and \a versionMinor.
471 Installing a module API into a uri allows developers to provide arbitrary functionality
472 (methods and properties) in a namespace that doesn't necessarily contain elements.
474 A module API may be either a QObject or a QScriptValue. Only one module API provider
475 may be registered into any given namespace (combination of \a uri, \a majorVersion and \a minorVersion).
476 This function should be used to register a module API provider function which returns a QObject as a module API.
480 // first, define your QObject which provides the functionality.
481 class ModuleApiExample : public QObject
484 Q_PROPERTY (int someProperty READ someProperty WRITE setSomeProperty NOTIFY somePropertyChanged)
487 ModuleApiExample(QObject* parent = 0)
488 : QObject(parent), m_someProperty(0)
492 ~ModuleApiExample() {}
494 Q_INVOKABLE int doSomething() { setSomeProperty(5); return m_someProperty; }
496 int someProperty() const { return m_someProperty; }
497 void setSomeProperty(int val) { m_someProperty = val; emit somePropertyChanged(val); }
500 void somePropertyChanged(int newValue);
506 // second, define the module API provider function (callback).
507 static QObject *example_qobject_module_api_provider(QDeclarativeEngine *engine, QScriptEngine *scriptEngine)
510 Q_UNUSED(scriptEngine)
512 ModuleApiExample *example = new ModuleApiExample();
516 // third, register the module API provider with QML by calling this function in an initialization function.
518 qmlRegisterModuleApi("Qt.example.qobjectApi", 1, 0, example_qobject_module_api_provider);
522 In order to use the registered module API in QML, you must import the module API.
525 import Qt.example.qobjectApi 1.0 as ExampleApi
528 property int someValue: ExampleApi.someProperty
530 Component.onCompleted: {
531 someValue = ExampleApi.doSomething()
536 inline int qmlRegisterModuleApi(const char *uri, int versionMajor, int versionMinor,
537 QObject *(*callback)(QDeclarativeEngine *, QScriptEngine *))
539 QDeclarativePrivate::RegisterModuleApi api = {
542 uri, versionMajor, versionMinor,
547 return QDeclarativePrivate::qmlregister(QDeclarativePrivate::ModuleApiRegistration, &api);
552 QML_DECLARE_TYPE(QObject)
553 Q_DECLARE_METATYPE(QVariant)
557 #endif // QDECLARATIVE_H