summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMartin Jones <martin.jones@nokia.com>2010-02-10 03:03:27 (GMT)
committerMartin Jones <martin.jones@nokia.com>2010-02-10 03:03:27 (GMT)
commit6dbd2643ac8230bce652411dd5f8bd34567b387a (patch)
treeea9865b020d427b64f04c1bd4d2513b80eff659b
parent582f8dcffae369b6d7fc6a0966cd4a8d65fdabab (diff)
downloadQt-6dbd2643ac8230bce652411dd5f8bd34567b387a.zip
Qt-6dbd2643ac8230bce652411dd5f8bd34567b387a.tar.gz
Qt-6dbd2643ac8230bce652411dd5f8bd34567b387a.tar.bz2
Revert "Replace QList<>* support with QmlListProperty"
This reverts commit d914555badcd4761864657e1e335e657b791453f.
-rw-r--r--src/declarative/graphicsitems/qmlgraphicsitem.cpp6
-rw-r--r--src/declarative/graphicsitems/qmlgraphicspath.cpp4
-rw-r--r--src/declarative/graphicsitems/qmlgraphicspath_p.h4
-rw-r--r--src/declarative/graphicsitems/qmlgraphicsrectangle_p.h4
-rw-r--r--src/declarative/graphicsitems/qmlgraphicsvisualitemmodel.cpp4
-rw-r--r--src/declarative/qml/qml.h4
-rw-r--r--src/declarative/qml/qmllist.h66
-rw-r--r--src/declarative/qml/qmllistscriptclass.cpp57
-rw-r--r--src/declarative/qml/qmllistscriptclass_p.h2
-rw-r--r--src/declarative/qml/qmlmetaproperty.cpp3
-rw-r--r--src/declarative/qml/qmlmetatype.cpp66
-rw-r--r--src/declarative/qml/qmlmetatype.h47
-rw-r--r--src/declarative/qml/qmlobjectscriptclass.cpp2
-rw-r--r--src/declarative/qml/qmlprivate.h163
-rw-r--r--src/declarative/qml/qmlvme.cpp26
-rw-r--r--src/declarative/util/qmlanimation.cpp16
-rw-r--r--src/declarative/util/qmlanimation_p.h16
-rw-r--r--src/declarative/util/qmllistaccessor.cpp41
-rw-r--r--src/declarative/util/qmllistaccessor_p.h2
-rw-r--r--tests/auto/declarative/qmlecmascript/testtypes.h8
-rw-r--r--tests/auto/declarative/qmlecmascript/tst_qmlecmascript.cpp2
-rw-r--r--tests/auto/declarative/qmllanguage/testtypes.h11
-rw-r--r--tests/auto/declarative/qmllanguage/tst_qmllanguage.cpp34
-rw-r--r--tests/auto/declarative/qmllistaccessor/tst_qmllistaccessor.cpp10
24 files changed, 350 insertions, 248 deletions
diff --git a/src/declarative/graphicsitems/qmlgraphicsitem.cpp b/src/declarative/graphicsitems/qmlgraphicsitem.cpp
index ed5b18f..8973cb4 100644
--- a/src/declarative/graphicsitems/qmlgraphicsitem.cpp
+++ b/src/declarative/graphicsitems/qmlgraphicsitem.cpp
@@ -1000,7 +1000,7 @@ class QmlGraphicsKeysAttached : public QObject, public QmlGraphicsItemKeyFilter
Q_DECLARE_PRIVATE(QmlGraphicsKeysAttached)
Q_PROPERTY(bool enabled READ enabled WRITE setEnabled NOTIFY enabledChanged)
- Q_PROPERTY(QmlListProperty<QmlGraphicsItem> forwardTo READ forwardTo)
+ Q_PROPERTY(QList<QmlGraphicsItem *> *forwardTo READ forwardTo)
public:
QmlGraphicsKeysAttached(QObject *parent=0);
@@ -1015,9 +1015,9 @@ public:
}
}
- QmlListProperty<QmlGraphicsItem> forwardTo() {
+ QList<QmlGraphicsItem *> *forwardTo() {
Q_D(QmlGraphicsKeysAttached);
- return QmlListProperty<QmlGraphicsItem>(this, d->targets);
+ return &d->targets;
}
virtual void componentComplete();
diff --git a/src/declarative/graphicsitems/qmlgraphicspath.cpp b/src/declarative/graphicsitems/qmlgraphicspath.cpp
index 2bac4b6..18f27af 100644
--- a/src/declarative/graphicsitems/qmlgraphicspath.cpp
+++ b/src/declarative/graphicsitems/qmlgraphicspath.cpp
@@ -163,10 +163,10 @@ bool QmlGraphicsPath::isClosed() const
\snippet doc/src/snippets/declarative/pathview/pathattributes.qml 2
*/
-QmlListProperty<QmlGraphicsPathElement> QmlGraphicsPath::pathElements()
+QList<QmlGraphicsPathElement *>* QmlGraphicsPath::pathElements()
{
Q_D(QmlGraphicsPath);
- return QmlListProperty<QmlGraphicsPathElement>(this, d->_pathElements);
+ return &(d->_pathElements);
}
void QmlGraphicsPath::interpolate(int idx, const QString &name, qreal value)
diff --git a/src/declarative/graphicsitems/qmlgraphicspath_p.h b/src/declarative/graphicsitems/qmlgraphicspath_p.h
index 50ea15b..2b4b0fd 100644
--- a/src/declarative/graphicsitems/qmlgraphicspath_p.h
+++ b/src/declarative/graphicsitems/qmlgraphicspath_p.h
@@ -189,7 +189,7 @@ class Q_DECLARATIVE_EXPORT QmlGraphicsPath : public QObject, public QmlParserSta
Q_OBJECT
Q_INTERFACES(QmlParserStatus)
- Q_PROPERTY(QmlListProperty<QmlGraphicsPathElement> pathElements READ pathElements)
+ Q_PROPERTY(QList<QmlGraphicsPathElement *>* pathElements READ pathElements)
Q_PROPERTY(qreal startX READ startX WRITE setStartX)
Q_PROPERTY(qreal startY READ startY WRITE setStartY)
Q_PROPERTY(bool closed READ isClosed NOTIFY changed)
@@ -199,7 +199,7 @@ public:
QmlGraphicsPath(QObject *parent=0);
~QmlGraphicsPath();
- QmlListProperty<QmlGraphicsPathElement> pathElements();
+ QList<QmlGraphicsPathElement *>* pathElements();
qreal startX() const;
void setStartX(qreal x);
diff --git a/src/declarative/graphicsitems/qmlgraphicsrectangle_p.h b/src/declarative/graphicsitems/qmlgraphicsrectangle_p.h
index b8c2179..4f4c1cf 100644
--- a/src/declarative/graphicsitems/qmlgraphicsrectangle_p.h
+++ b/src/declarative/graphicsitems/qmlgraphicsrectangle_p.h
@@ -107,14 +107,14 @@ class Q_DECLARATIVE_EXPORT QmlGraphicsGradient : public QObject
{
Q_OBJECT
- Q_PROPERTY(QmlListProperty<QmlGraphicsGradientStop> stops READ stops)
+ Q_PROPERTY(QList<QmlGraphicsGradientStop *> *stops READ stops)
Q_CLASSINFO("DefaultProperty", "stops")
public:
QmlGraphicsGradient(QObject *parent=0) : QObject(parent), m_gradient(0) {}
~QmlGraphicsGradient() { delete m_gradient; }
- QmlListProperty<QmlGraphicsGradientStop> stops() { return QmlListProperty<QmlGraphicsGradientStop>(this, m_stops); }
+ QList<QmlGraphicsGradientStop *> *stops() { return &m_stops; }
const QGradient *gradient() const;
diff --git a/src/declarative/graphicsitems/qmlgraphicsvisualitemmodel.cpp b/src/declarative/graphicsitems/qmlgraphicsvisualitemmodel.cpp
index 4f5b53c..2fc143d 100644
--- a/src/declarative/graphicsitems/qmlgraphicsvisualitemmodel.cpp
+++ b/src/declarative/graphicsitems/qmlgraphicsvisualitemmodel.cpp
@@ -463,7 +463,7 @@ int QmlGraphicsVisualDataModelDataMetaObject::createProperty(const char *name, c
if ((!model->m_listModelInterface || !model->m_abstractItemModel) && model->m_listAccessor) {
if (model->m_listAccessor->type() == QmlListAccessor::QmlList
- || model->m_listAccessor->type() == QmlListAccessor::ListProperty) {
+ || model->m_listAccessor->type() == QmlListAccessor::QListPtr) {
model->ensureRoles();
QObject *object = model->m_listAccessor->at(data->m_index).value<QObject*>();
if (object && object->property(name).isValid())
@@ -725,7 +725,7 @@ void QmlGraphicsVisualDataModel::setModel(const QVariant &model)
}
d->m_listAccessor = new QmlListAccessor;
d->m_listAccessor->setList(model, d->m_context?d->m_context->engine():qmlEngine(this));
- if (d->m_listAccessor->type() != QmlListAccessor::QmlList && d->m_listAccessor->type() != QmlListAccessor::ListProperty)
+ if (d->m_listAccessor->type() != QmlListAccessor::QmlList && d->m_listAccessor->type() != QmlListAccessor::QListPtr)
d->m_metaDataCacheable = true;
if (d->m_delegate && d->modelCount()) {
emit itemsInserted(0, d->modelCount());
diff --git a/src/declarative/qml/qml.h b/src/declarative/qml/qml.h
index 859fd66..c009093 100644
--- a/src/declarative/qml/qml.h
+++ b/src/declarative/qml/qml.h
@@ -59,11 +59,11 @@ QT_MODULE(Declarative)
#define QML_DECLARE_TYPE(TYPE) \
Q_DECLARE_METATYPE(TYPE *) \
- Q_DECLARE_METATYPE(QmlListProperty<TYPE>) \
+ Q_DECLARE_METATYPE(QList<TYPE *> *) \
Q_DECLARE_METATYPE(QmlList<TYPE *> *)
#define QML_DECLARE_TYPE_HASMETATYPE(TYPE) \
- Q_DECLARE_METATYPE(QmlListProperty<TYPE>) \
+ Q_DECLARE_METATYPE(QList<TYPE *> *) \
Q_DECLARE_METATYPE(QmlList<TYPE *> *)
#define QML_DECLARE_INTERFACE(INTERFACE) \
diff --git a/src/declarative/qml/qmllist.h b/src/declarative/qml/qmllist.h
index b1a81c4..ad2d874 100644
--- a/src/declarative/qml/qmllist.h
+++ b/src/declarative/qml/qmllist.h
@@ -119,72 +119,6 @@ class Qml_ProxyList_ ##ListName : public QmlList<ListType> \
friend class Qml_ProxyList_ ##ListName ; \
Qml_ProxyList_##ListName ListName;
-template<typename T>
-struct QmlListProperty {
- typedef void (*AppendFunction)(QmlListProperty<T> *, T*);
- typedef int (*CountFunction)(QmlListProperty<T> *);
- typedef T *(*AtFunction)(QmlListProperty<T> *, int);
- typedef void (*ClearFunction)(QmlListProperty<T> *);
- typedef void (*InsertFunction)(QmlListProperty<T> *, int, T *);
- typedef void (*RemoveAtFunction)(QmlListProperty<T> *, int);
-
- QmlListProperty()
- : version(1), object(0), data(0), append(0), count(0), at(0), clear(0), insert(0), removeAt(0) {}
- QmlListProperty(QObject *o, QList<T *> &list)
- : version(1), object(o), data(&list), append(qlist_append), count(qlist_count), at(qlist_at),
- clear(qlist_clear), insert(qlist_insert), removeAt(qlist_removeAt) {}
- QmlListProperty(QObject *o, void *d, AppendFunction a, CountFunction c = 0, AtFunction t = 0,
- ClearFunction l = 0, InsertFunction i = 0, RemoveAtFunction r = 0)
- : version(1), object(o), data(d), append(a), count(c), at(t), clear(l), insert(i), removeAt(r) {}
-
- bool operator==(const QmlListProperty &o) const {
- return version == o.version &&
- object == o.object &&
- data == o.data &&
- append == o.append &&
- count == o.count &&
- at == o.at &&
- clear == o.clear &&
- insert == o.insert &&
- removeAt == o.removeAt;
- }
-
- int version;
-
- QObject *object;
- void *data;
-
- AppendFunction append;
-
- CountFunction count;
- AtFunction at;
-
- ClearFunction clear;
-
- InsertFunction insert;
- RemoveAtFunction removeAt;
-
-private:
- static void qlist_append(QmlListProperty *p, T *v) {
- ((QList<T *> *)p->data)->append(v);
- }
- static int qlist_count(QmlListProperty *p) {
- return ((QList<T *> *)p->data)->count();
- }
- static T *qlist_at(QmlListProperty *p, int idx) {
- return ((QList<T *> *)p->data)->at(idx);
- }
- static void qlist_clear(QmlListProperty *p) {
- return ((QList<T *> *)p->data)->clear();
- }
- static void qlist_insert(QmlListProperty *p, int idx, T *v) {
- return ((QList<T *> *)p->data)->insert(idx, v);
- }
- static void qlist_removeAt(QmlListProperty *p, int idx) {
- return ((QList<T *> *)p->data)->removeAt(idx);
- }
-};
-
QT_END_NAMESPACE
QT_END_HEADER
diff --git a/src/declarative/qml/qmllistscriptclass.cpp b/src/declarative/qml/qmllistscriptclass.cpp
index caa4e4e..d4cdc6e 100644
--- a/src/declarative/qml/qmllistscriptclass.cpp
+++ b/src/declarative/qml/qmllistscriptclass.cpp
@@ -111,31 +111,27 @@ QmlListScriptClass::ScriptValue QmlListScriptClass::property(Object *obj, const
if (!data->object)
return Value();
- if (data->type == ListProperty) {
- QmlListProperty<QObject> list;
- void *args[] = { &list, 0 };
+ void *list = 0;
+ void *args[] = { &list, 0 };
+ QMetaObject::metacall(data->object, QMetaObject::ReadProperty,
+ data->propertyIdx, args);
- QMetaObject::metacall(data->object, QMetaObject::ReadProperty,
- data->propertyIdx, args);
+ if (!list)
+ return Value();
+
+ if (data->type == QListPtr) {
+ const QList<QObject *> &qlist = *((QList<QObject *>*)list);
- quint32 count = list.count(&list);
+ quint32 count = qlist.count();
if (name == m_lengthId.identifier)
return Value(scriptEngine, count);
else if (lastIndex < count)
- return Value(scriptEngine, enginePriv->objectClass->newQObject(list.at(&list, lastIndex)));
+ return Value(scriptEngine, enginePriv->objectClass->newQObject(qlist.at(lastIndex)));
else
return Value();
} else {
- void *list = 0;
- void *args[] = { &list, 0 };
- QMetaObject::metacall(data->object, QMetaObject::ReadProperty,
- data->propertyIdx, args);
-
- if (!list)
- return Value();
-
Q_ASSERT(data->type == QmlListPtr);
const QmlList<QObject *> &qmllist = *((QmlList<QObject *>*)list);
@@ -159,29 +155,18 @@ QVariant QmlListScriptClass::toVariant(Object *obj, bool *ok)
return QVariant();
}
- if (data->type == QmlListScriptClass::QmlListPtr) {
- void *list = 0;
- void *args[] = { &list, 0 };
- QMetaObject::metacall(data->object, QMetaObject::ReadProperty,
- data->propertyIdx, args);
-
- if (!list) {
- if (ok) *ok = false;
- return QVariant();
- }
+ void *list = 0;
+ void *args[] = { &list, 0 };
+ QMetaObject::metacall(data->object, QMetaObject::ReadProperty,
+ data->propertyIdx, args);
- if (ok) *ok = true;
- return QVariant(data->propertyType, &list);
- } else {
- QmlListProperty<QObject> list;
- void *args[] = { &list, 0 };
-
- QMetaObject::metacall(data->object, QMetaObject::ReadProperty,
- data->propertyIdx, args);
-
- if (ok) *ok = true;
- return QVariant(data->propertyType, &list);
+ if (!list) {
+ if (ok) *ok = false;
+ return QVariant();
}
+
+ if (ok) *ok = true;
+ return QVariant(data->propertyType, &list);
}
QT_END_NAMESPACE
diff --git a/src/declarative/qml/qmllistscriptclass_p.h b/src/declarative/qml/qmllistscriptclass_p.h
index 464f91e..e484b34 100644
--- a/src/declarative/qml/qmllistscriptclass_p.h
+++ b/src/declarative/qml/qmllistscriptclass_p.h
@@ -64,7 +64,7 @@ public:
QmlListScriptClass(QmlEngine *);
~QmlListScriptClass();
- enum ListCategory { ListProperty, QmlListPtr };
+ enum ListCategory { QListPtr, QmlListPtr };
QScriptValue newList(QObject *, int, ListCategory, int);
protected:
diff --git a/src/declarative/qml/qmlmetaproperty.cpp b/src/declarative/qml/qmlmetaproperty.cpp
index a0857df..09c936e 100644
--- a/src/declarative/qml/qmlmetaproperty.cpp
+++ b/src/declarative/qml/qmlmetaproperty.cpp
@@ -892,8 +892,7 @@ bool QmlMetaPropertyPrivate::write(QObject *object, const QmlPropertyCache::Data
QVariant listVar = prop.read(object);
QmlMetaType::clear(listVar);
for (int ii = 0; ii < list.count(); ++ii) {
- QObject *o = list.at(ii);
- QVariant v = QVariant(listType, &o);
+ QVariant v = QmlMetaType::fromObject(list.at(ii), listType);
QmlMetaType::append(listVar, v);
}
diff --git a/src/declarative/qml/qmlmetatype.cpp b/src/declarative/qml/qmlmetatype.cpp
index 973f04f..d9c007d 100644
--- a/src/declarative/qml/qmlmetatype.cpp
+++ b/src/declarative/qml/qmlmetatype.cpp
@@ -124,7 +124,7 @@ public:
int m_version_maj;
int m_version_min;
int m_typeId; int m_listId; int m_qmlListId;
- QObject *(*m_newFunc)();
+ QmlPrivate::Func m_opFunc;
const QMetaObject *m_baseMetaObject;
QmlAttachedPropertiesFunc m_attachedPropertiesFunc;
const QMetaObject *m_attachedPropertiesType;
@@ -141,14 +141,15 @@ public:
QmlTypePrivate::QmlTypePrivate()
: m_isInterface(false), m_iid(0), m_typeId(0), m_listId(0), m_qmlListId(0),
- m_newFunc(0), m_baseMetaObject(0), m_attachedPropertiesFunc(0), m_attachedPropertiesType(0),
+ m_opFunc(0), m_baseMetaObject(0), m_attachedPropertiesFunc(0), m_attachedPropertiesType(0),
m_parserStatusCast(-1), m_propertyValueSourceCast(-1), m_propertyValueInterceptorCast(-1),
m_extFunc(0), m_extMetaObject(0), m_index(-1), m_customParser(0), m_isSetup(false)
{
}
-QmlType::QmlType(int type, int listType, int qmlListType, const char *iid, int index)
+QmlType::QmlType(int type, int listType, int qmlListType,
+ QmlPrivate::Func opFunc, const char *iid, int index)
: d(new QmlTypePrivate)
{
d->m_isInterface = true;
@@ -156,7 +157,7 @@ QmlType::QmlType(int type, int listType, int qmlListType, const char *iid, int i
d->m_typeId = type;
d->m_listId = listType;
d->m_qmlListId = qmlListType;
- d->m_newFunc = 0;
+ d->m_opFunc = opFunc;
d->m_index = index;
d->m_isSetup = true;
d->m_version_maj = 0;
@@ -164,7 +165,7 @@ QmlType::QmlType(int type, int listType, int qmlListType, const char *iid, int i
}
QmlType::QmlType(int type, int listType, int qmlListType,
- QObject *(*newFunc)(), const char *qmlName,
+ QmlPrivate::Func opFunc, const char *qmlName,
int version_maj, int version_min,
const QMetaObject *metaObject,
QmlAttachedPropertiesFunc attachedPropertiesFunc,
@@ -181,7 +182,7 @@ QmlType::QmlType(int type, int listType, int qmlListType,
d->m_typeId = type;
d->m_listId = listType;
d->m_qmlListId = qmlListType;
- d->m_newFunc = newFunc;
+ d->m_opFunc = opFunc;
d->m_baseMetaObject = metaObject;
d->m_attachedPropertiesFunc = attachedPropertiesFunc;
d->m_attachedPropertiesType = attachedType;
@@ -281,7 +282,10 @@ QObject *QmlType::create() const
{
d->init();
- QObject *rv = d->m_newFunc();
+ QVariant v;
+ QObject *rv = 0;
+ d->m_opFunc(QmlPrivate::Create, 0, v, v, (void **)&rv);
+
if (rv && !d->m_metaObjects.isEmpty())
(void *)new QmlProxyMetaObject(rv, &d->m_metaObjects);
@@ -316,35 +320,29 @@ int QmlType::qmlListTypeId() const
void QmlType::listClear(const QVariant &list)
{
Q_ASSERT(list.userType() == qListTypeId());
- QmlListProperty<void> *l = (QmlListProperty<void> *)list.data();
- if (l->clear) l->clear(l);
+ QVariant arg;
+ d->m_opFunc(QmlPrivate::Clear, 0, list, arg, 0);
}
void QmlType::listAppend(const QVariant &list, const QVariant &item)
{
Q_ASSERT(list.userType() == qListTypeId());
- QmlListProperty<void> *l = (QmlListProperty<void> *)list.data();
- if (l->append) l->append(l, *(void **)item.data());
+ d->m_opFunc(QmlPrivate::Append, 0, list, item, 0);
}
QVariant QmlType::listAt(const QVariant &list, int idx)
{
Q_ASSERT(list.userType() == qListTypeId());
- QmlListProperty<void> *l = (QmlListProperty<void> *)list.data();
- if (l->at) {
- void *v = l->at(l, idx);
- return QVariant(typeId(), &v);
- } else {
- return QVariant();
- }
+ QVariant rv;
+ void *ptr = (void *)&rv;
+ d->m_opFunc(QmlPrivate::Value, idx, list, QVariant(), &ptr);
+ return rv;
}
int QmlType::listCount(const QVariant &list)
{
Q_ASSERT(list.userType() == qListTypeId());
- QmlListProperty<void> *l = (QmlListProperty<void> *)list.data();
- if (l->count) return l->count(l);
- return 0;
+ return d->m_opFunc(QmlPrivate::Length, 0, list, QVariant(), 0);
}
const QMetaObject *QmlType::metaObject() const
@@ -388,6 +386,15 @@ int QmlType::propertyValueInterceptorCast() const
return d->m_propertyValueInterceptorCast;
}
+QVariant QmlType::fromObject(QObject *obj) const
+{
+ QVariant rv;
+ QVariant *v_ptr = &rv;
+ QVariant vobj = QVariant::fromValue(obj);
+ d->m_opFunc(QmlPrivate::FromObject, 0, QVariant(), vobj, (void **)&v_ptr);
+ return rv;
+}
+
const char *QmlType::interfaceIId() const
{
return d->m_iid;
@@ -399,6 +406,7 @@ int QmlType::index() const
}
int QmlMetaType::registerInterface(const QmlPrivate::MetaTypeIds &id,
+ QmlPrivate::Func listFunction,
const char *iid)
{
QWriteLocker lock(metaTypeDataLock());
@@ -407,7 +415,7 @@ int QmlMetaType::registerInterface(const QmlPrivate::MetaTypeIds &id,
int index = data->types.count();
QmlType *type = new QmlType(id.typeId, id.listId, id.qmlListId,
- iid, index);
+ listFunction, iid, index);
data->types.append(type);
data->idToType.insert(type->typeId(), type);
@@ -430,7 +438,7 @@ int QmlMetaType::registerInterface(const QmlPrivate::MetaTypeIds &id,
return index;
}
-int QmlMetaType::registerType(const QmlPrivate::MetaTypeIds &id, QObject *(*func)(),
+int QmlMetaType::registerType(const QmlPrivate::MetaTypeIds &id, QmlPrivate::Func func,
const char *uri, int version_maj, int version_min, const char *cname,
const QMetaObject *mo, QmlAttachedPropertiesFunc attach, const QMetaObject *attachMo,
int pStatus, int object, int valueSource, int valueInterceptor, QmlPrivate::CreateFunc extFunc, const QMetaObject *extmo, QmlCustomParser *parser)
@@ -585,6 +593,18 @@ bool QmlMetaType::append(const QVariant &list, const QVariant &item)
}
}
+QVariant QmlMetaType::fromObject(QObject *obj, int typeId)
+{
+ QReadLocker lock(metaTypeDataLock());
+ QmlMetaTypeData *data = metaTypeData();
+
+ QmlType *type = data->idToType.value(typeId);
+ if (type && type->typeId() == typeId)
+ return type->fromObject(obj);
+ else
+ return QVariant();
+}
+
const QMetaObject *QmlMetaType::rawMetaObjectForType(int id)
{
if (id == QMetaType::QObjectStar)
diff --git a/src/declarative/qml/qmlmetatype.h b/src/declarative/qml/qmlmetatype.h
index 32174ff..6dccc7a 100644
--- a/src/declarative/qml/qmlmetatype.h
+++ b/src/declarative/qml/qmlmetatype.h
@@ -46,7 +46,6 @@
#include "qmlparserstatus.h"
#include "qmlpropertyvaluesource.h"
#include "qmlpropertyvalueinterceptor.h"
-#include "qmllist.h"
#include <QtCore/qglobal.h>
#include <QtCore/qvariant.h>
@@ -63,8 +62,8 @@ class QmlCustomParser;
class Q_DECLARATIVE_EXPORT QmlMetaType
{
public:
- static int registerType(const QmlPrivate::MetaTypeIds &, QObject *(*)(), const char *, int vmaj, int vmin, const char *qmlName, const QMetaObject *, QmlAttachedPropertiesFunc, const QMetaObject *, int pStatus, int object, int valueSource, int valueInterceptor, QmlPrivate::CreateFunc extFunc, const QMetaObject *extmo, QmlCustomParser *);
- static int registerInterface(const QmlPrivate::MetaTypeIds &, const char *);
+ static int registerType(const QmlPrivate::MetaTypeIds &, QmlPrivate::Func, const char *, int vmaj, int vmin, const char *qmlName, const QMetaObject *, QmlAttachedPropertiesFunc, const QMetaObject *, int pStatus, int object, int valueSource, int valueInterceptor, QmlPrivate::CreateFunc extFunc, const QMetaObject *extmo, QmlCustomParser *);
+ static int registerInterface(const QmlPrivate::MetaTypeIds &, QmlPrivate::Func, const char *);
static bool copy(int type, void *data, const void *copy = 0);
@@ -151,8 +150,8 @@ private:
friend class QmlMetaType;
friend class QmlTypePrivate;
friend struct QmlMetaTypeData;
- QmlType(int, int, int, const char *, int);
- QmlType(int, int, int, QObject *(*)(), const char *, int, int, const QMetaObject *, QmlAttachedPropertiesFunc, const QMetaObject *, int, int, int, QmlPrivate::CreateFunc, const QMetaObject *, int, QmlCustomParser *);
+ QmlType(int, int, int, QmlPrivate::Func, const char *, int);
+ QmlType(int, int, int, QmlPrivate::Func, const char *, int, int, const QMetaObject *, QmlAttachedPropertiesFunc, const QMetaObject *, int, int, int, QmlPrivate::CreateFunc, const QMetaObject *, int, QmlCustomParser *);
~QmlType();
QmlTypePrivate *d;
@@ -164,11 +163,11 @@ int qmlRegisterType(const char *typeName)
QByteArray name(typeName);
QmlPrivate::MetaTypeIds ids = {
qRegisterMetaType<T *>(QByteArray(name + '*').constData()),
- qRegisterMetaType<QmlListProperty<T> >(QByteArray("QmlListProperty<" + name + ">").constData()),
- qRegisterMetaType<QmlList<T *>*>(QByteArray("QmlList<" + name + "*>*").constData())
+ qRegisterMetaType<T *>(QByteArray("QList<" + name + "*>*").constData()),
+ qRegisterMetaType<T *>(QByteArray("QmlList<" + name + "*>*").constData())
};
- return QmlMetaType::registerType(ids, 0, 0, 0, 0, 0,
+ return QmlMetaType::registerType(ids, QmlPrivate::list_nocreate_op<T>, 0, 0, 0, 0,
&T::staticMetaObject,
QmlPrivate::attachedPropertiesFunc<T>(),
QmlPrivate::attachedPropertiesMetaObject<T>(),
@@ -185,11 +184,11 @@ int qmlRegisterType(const char *uri, int version_maj, int version_min, const cha
QByteArray name(typeName);
QmlPrivate::MetaTypeIds ids = {
qRegisterMetaType<T *>(QByteArray(name + '*').constData()),
- qRegisterMetaType<QmlListProperty<T> >(QByteArray("QmlListProperty<" + name + ">").constData()),
- qRegisterMetaType<QmlList<T *>*>(QByteArray("QmlList<" + name + "*>*").constData())
+ qRegisterMetaType<T *>(QByteArray("QList<" + name + "*>*").constData()),
+ qRegisterMetaType<T *>(QByteArray("QmlList<" + name + "*>*").constData())
};
- return QmlMetaType::registerType(ids, QmlPrivate::create<T>,
+ return QmlMetaType::registerType(ids, QmlPrivate::list_op<T>,
uri, version_maj, version_min, qmlName,
&T::staticMetaObject,
QmlPrivate::attachedPropertiesFunc<T>(),
@@ -207,8 +206,8 @@ int qmlRegisterExtendedType(const char *typeName)
QByteArray name(typeName);
QmlPrivate::MetaTypeIds ids = {
qRegisterMetaType<T *>(QByteArray(name + '*').constData()),
- qRegisterMetaType<QmlListProperty<T> >(QByteArray("QmlListProperty<" + name + ">").constData()),
- qRegisterMetaType<QmlList<T *>*>(QByteArray("QmlList<" + name + "*>*").constData())
+ qRegisterMetaType<T *>(QByteArray("QList<" + name + "*>*").constData()),
+ qRegisterMetaType<T *>(QByteArray("QmlList<" + name + "*>*").constData())
};
QmlAttachedPropertiesFunc attached =
@@ -220,7 +219,7 @@ int qmlRegisterExtendedType(const char *typeName)
attachedMo = QmlPrivate::attachedPropertiesMetaObject<T>();
}
- return QmlMetaType::registerType(ids, 0, 0, 0, 0, 0,
+ return QmlMetaType::registerType(ids, QmlPrivate::list_nocreate_op<T>, 0, 0, 0, 0,
&T::staticMetaObject, attached, attachedMo,
QmlPrivate::StaticCastSelector<T,QmlParserStatus>::cast(),
QmlPrivate::StaticCastSelector<T,QObject>::cast(),
@@ -235,8 +234,8 @@ int qmlRegisterExtendedType(const char *uri, int version_maj, int version_min, c
QByteArray name(typeName);
QmlPrivate::MetaTypeIds ids = {
qRegisterMetaType<T *>(QByteArray(name + '*').constData()),
- qRegisterMetaType<QmlListProperty<T> >(QByteArray("QmlListProperty<" + name + ">").constData()),
- qRegisterMetaType<QmlList<T *>*>(QByteArray("QmlList<" + name + "*>*").constData())
+ qRegisterMetaType<T *>(QByteArray("QList<" + name + "*>*").constData()),
+ qRegisterMetaType<T *>(QByteArray("QmlList<" + name + "*>*").constData())
};
QmlAttachedPropertiesFunc attached =
@@ -248,7 +247,7 @@ int qmlRegisterExtendedType(const char *uri, int version_maj, int version_min, c
attachedMo = QmlPrivate::attachedPropertiesMetaObject<T>();
}
- return QmlMetaType::registerType(ids, QmlPrivate::create<T>,
+ return QmlMetaType::registerType(ids, QmlPrivate::list_op<T>,
uri, version_maj, version_min, qmlName,
&T::staticMetaObject,
attached, attachedMo,
@@ -266,11 +265,13 @@ int qmlRegisterInterface(const char *typeName)
QByteArray name(typeName);
QmlPrivate::MetaTypeIds ids = {
qRegisterMetaType<T *>(QByteArray(name + '*').constData()),
- qRegisterMetaType<QmlListProperty<T> >(QByteArray("QmlListProperty<" + name + ">").constData()),
- qRegisterMetaType<QmlList<T *>*>(QByteArray("QmlList<" + name + "*>*").constData())
+ qRegisterMetaType<T *>(QByteArray("QList<" + name + "*>*").constData()),
+ qRegisterMetaType<T *>(QByteArray("QmlList<" + name + "*>*").constData())
};
- return QmlMetaType::registerInterface(ids, qobject_interface_iid<T *>());
+ return QmlMetaType::registerInterface(ids,
+ QmlPrivate::list_interface_op<T>,
+ qobject_interface_iid<T *>());
}
template<typename T>
@@ -279,11 +280,11 @@ int qmlRegisterCustomType(const char *uri, int version_maj, int version_min, con
QByteArray name(typeName);
QmlPrivate::MetaTypeIds ids = {
qRegisterMetaType<T *>(QByteArray(name + '*').constData()),
- qRegisterMetaType<QmlListProperty<T> >(QByteArray("QmlListProperty<" + name + ">").constData()),
- qRegisterMetaType<QmlList<T *>*>(QByteArray("QmlList<" + name + "*>*").constData())
+ qRegisterMetaType<T *>(QByteArray("QList<" + name + "*>*").constData()),
+ qRegisterMetaType<T *>(QByteArray("QmlList<" + name + "*>*").constData())
};
- return QmlMetaType::registerType(ids, QmlPrivate::create<T>,
+ return QmlMetaType::registerType(ids, QmlPrivate::list_op<T>,
uri, version_maj, version_min, qmlName,
&T::staticMetaObject,
QmlPrivate::attachedPropertiesFunc<T>(),
diff --git a/src/declarative/qml/qmlobjectscriptclass.cpp b/src/declarative/qml/qmlobjectscriptclass.cpp
index 09d326f..7bbb7df 100644
--- a/src/declarative/qml/qmlobjectscriptclass.cpp
+++ b/src/declarative/qml/qmlobjectscriptclass.cpp
@@ -238,7 +238,7 @@ QmlObjectScriptClass::property(QObject *obj, const Identifier &name)
}
if (lastData->flags & QmlPropertyCache::Data::IsQList) {
- return Value(scriptEngine, enginePriv->listClass->newList(obj, lastData->coreIndex, QmlListScriptClass::ListProperty, lastData->propType));
+ return Value(scriptEngine, enginePriv->listClass->newList(obj, lastData->coreIndex, QmlListScriptClass::QListPtr, lastData->propType));
} else if (lastData->flags & QmlPropertyCache::Data::IsQmlList) {
return Value(scriptEngine, enginePriv->listClass->newList(obj, lastData->coreIndex, QmlListScriptClass::QmlListPtr, lastData->propType));
} else if (lastData->flags & QmlPropertyCache::Data::IsQObjectDerived) {
diff --git a/src/declarative/qml/qmlprivate.h b/src/declarative/qml/qmlprivate.h
index c367497..dd98110 100644
--- a/src/declarative/qml/qmlprivate.h
+++ b/src/declarative/qml/qmlprivate.h
@@ -85,8 +85,26 @@ namespace QmlPrivate
virtual void clear() = 0;
};
+ enum ListOp { Append, Set, Insert, Prepend, Length, FromObject,
+ Object, Create, Value, Clear };
+
+ template<typename T>
+ int list_op(ListOp op, int val,
+ const QVariant &vlist,
+ const QVariant &value,
+ void **out);
+
template<typename T>
- QObject *create() { return new T; }
+ int list_nocreate_op(ListOp op, int val,
+ const QVariant &vlist,
+ const QVariant &value,
+ void **out);
+
+ template<typename T>
+ int list_interface_op(ListOp op, int val,
+ const QVariant &vlist,
+ const QVariant &value,
+ void **out);
template<class From, class To, int N>
struct StaticCastSelectorClass
@@ -185,6 +203,7 @@ namespace QmlPrivate
int listId;
int qmlListId;
};
+ typedef int (*Func)(QmlPrivate::ListOp, int, const QVariant &, const QVariant &, void **);
typedef QObject *(*CreateFunc)(QObject *);
template<typename T>
@@ -218,6 +237,148 @@ namespace QmlPrivate
};
}
+template<typename T>
+int QmlPrivate::list_op(QmlPrivate::ListOp op, int val,
+ const QVariant &vlist,
+ const QVariant &value,
+ void **out)
+{
+ if (op == QmlPrivate::Create) {
+ QObject *obj = static_cast<QObject *>(new T);
+ *((QObject **)out) = obj;
+ return 0;
+ }
+ QList<T *> *list = vlist.value<QList<T *> *>();
+ switch(op) {
+ case QmlPrivate::Append:
+ list->append(value.value<T *>());
+ break;
+ case QmlPrivate::Set:
+ (*list)[val] = value.value<T *>();
+ break;
+ case QmlPrivate::Insert:
+ list->insert(val, value.value<T *>());
+ break;
+ case QmlPrivate::Prepend:
+ list->prepend(value.value<T *>());
+ break;
+ case QmlPrivate::Length:
+ return list->count();
+ break;
+ case QmlPrivate::Clear:
+ list->clear();
+ return 0;
+ break;
+ case QmlPrivate::Create:
+ break;
+ case QmlPrivate::Object:
+ *out = static_cast<QObject *>(value.value<T *>());
+ break;
+ case QmlPrivate::FromObject:
+ {
+ QObject *fromObj = value.value<QObject *>();
+ T *me = qobject_cast<T *>(fromObj);
+ if (me) {
+ *((QVariant *)*out) = QVariant::fromValue(me);
+ }
+ }
+ break;
+ case QmlPrivate::Value:
+ if (list->count() <= val) *((QVariant *)*out) = QVariant();
+ else *((QVariant *)*out) = QVariant::fromValue(list->at(val));
+ break;
+ }
+ return 0;
+}
+
+template<typename T>
+int QmlPrivate::list_nocreate_op(QmlPrivate::ListOp op, int val,
+ const QVariant &vlist,
+ const QVariant &value,
+ void **out)
+{
+ QList<T *> *list = vlist.value<QList<T *> *>();
+ switch(op) {
+ case QmlPrivate::Append:
+ list->append(value.value<T *>());
+ break;
+ case QmlPrivate::Set:
+ (*list)[val] = value.value<T *>();
+ break;
+ case QmlPrivate::Insert:
+ list->insert(val, value.value<T *>());
+ break;
+ case QmlPrivate::Prepend:
+ list->prepend(value.value<T *>());
+ break;
+ case QmlPrivate::Length:
+ return list->count();
+ break;
+ case QmlPrivate::Clear:
+ list->clear();
+ return 0;
+ break;
+ case QmlPrivate::Create:
+ break;
+ case QmlPrivate::Object:
+ *out = static_cast<QObject *>(value.value<T *>());
+ break;
+ case QmlPrivate::FromObject:
+ {
+ QObject *fromObj = value.value<QObject *>();
+ T *me = qobject_cast<T *>(fromObj);
+ if (me) {
+ *((QVariant *)*out) = QVariant::fromValue(me);
+ }
+ }
+ break;
+ case QmlPrivate::Value:
+ *((QVariant *)*out) = QVariant::fromValue(list->at(val));
+ break;
+ }
+ return 0;
+}
+
+template<typename T>
+int QmlPrivate::list_interface_op(QmlPrivate::ListOp op, int val,
+ const QVariant &vlist,
+ const QVariant &value,
+ void **out)
+{
+ QList<T *> *list = vlist.value<QList<T *> *>();
+ switch(op) {
+ case QmlPrivate::Append:
+ list->append(value.value<T *>());
+ break;
+ case QmlPrivate::Set:
+ (*list)[val] = value.value<T *>();
+ break;
+ case QmlPrivate::Insert:
+ list->insert(val, value.value<T *>());
+ break;
+ case QmlPrivate::Prepend:
+ list->prepend(value.value<T *>());
+ break;
+ case QmlPrivate::Length:
+ return list->count();
+ break;
+ case QmlPrivate::Clear:
+ list->clear();
+ return 0;
+ break;
+ case QmlPrivate::Create:
+ break;
+ case QmlPrivate::Object:
+ break;
+ case QmlPrivate::FromObject:
+ break;
+ case QmlPrivate::Value:
+ *((QVariant *)*out) = QVariant::fromValue(list->at(val));
+ break;
+ }
+ return 0;
+}
+
QT_END_NAMESPACE
QT_END_HEADER
diff --git a/src/declarative/qml/qmlvme.cpp b/src/declarative/qml/qmlvme.cpp
index 4ab205e..e9a0449 100644
--- a/src/declarative/qml/qmlvme.cpp
+++ b/src/declarative/qml/qmlvme.cpp
@@ -91,15 +91,14 @@ QmlVME::QmlVME()
struct ListInstance
{
- ListInstance()
- : type(0), qmlListInterface(0) {}
- ListInstance(int t)
- : type(t), qmlListInterface(0) {}
+ ListInstance() {}
+ ListInstance(QList<void *> *q, int t)
+ : type(t), qListInterface(q), qmlListInterface(0) {}
ListInstance(QmlPrivate::ListInterface *q, int t)
- : type(t), qmlListInterface(q) {}
+ : type(t), qListInterface(0), qmlListInterface(q) {}
int type;
- QmlListProperty<void> qListProperty;
+ QList<void *> *qListInterface;
QmlPrivate::ListInterface *qmlListInterface;
};
@@ -670,7 +669,7 @@ QObject *QmlVME::run(QmlVMEStack<QObject *> &stack, QmlContext *ctxt,
QObject *assign = stack.pop();
const ListInstance &list = qliststack.top();
- list.qListProperty.append((QmlListProperty<void>*)&list.qListProperty, assign);
+ list.qListInterface->append((void *)assign);
}
break;
@@ -695,7 +694,7 @@ QObject *QmlVME::run(QmlVMEStack<QObject *> &stack, QmlContext *ctxt,
void *d = (void *)&ptr;
list.qmlListInterface->append(d);
} else {
- list.qListProperty.append((QmlListProperty<void>*)&list.qListProperty, ptr);
+ list.qListInterface->append(ptr);
}
}
break;
@@ -773,12 +772,17 @@ QObject *QmlVME::run(QmlVMEStack<QObject *> &stack, QmlContext *ctxt,
{
QObject *target = stack.top();
- qliststack.push(ListInstance(instr.fetchQmlList.type));
-
void *a[1];
- a[0] = (void *)&(qliststack.top().qListProperty);
+ // We know that QList<T *>* can be converted to
+ // QList<void *>*
+ QList<void *> *list = 0;
+ a[0] = &list;
QMetaObject::metacall(target, QMetaObject::ReadProperty,
instr.fetchQmlList.property, a);
+ if (!list)
+ VME_EXCEPTION(QCoreApplication::translate("QmlVME","Cannot assign to null list"));
+
+ qliststack.push(ListInstance(list, instr.fetchQmlList.type));
}
break;
diff --git a/src/declarative/util/qmlanimation.cpp b/src/declarative/util/qmlanimation.cpp
index 2d1d3b9..ba096b3 100644
--- a/src/declarative/util/qmlanimation.cpp
+++ b/src/declarative/util/qmlanimation.cpp
@@ -939,10 +939,10 @@ void QmlPropertyAction::setProperties(const QString &p)
\sa exclude matchProperties PropertyAnimation::matchTargets
*/
-QmlListProperty<QObject> QmlPropertyAction::targets()
+QList<QObject *> *QmlPropertyAction::targets()
{
Q_D(QmlPropertyAction);
- return QmlListProperty<QObject>(this, d->targets);
+ return &d->targets;
}
/*!
@@ -950,10 +950,10 @@ QmlListProperty<QObject> QmlPropertyAction::targets()
This property holds the objects not to be affected by this animation.
\sa matchTargets
*/
-QmlListProperty<QObject> QmlPropertyAction::exclude()
+QList<QObject *> *QmlPropertyAction::exclude()
{
Q_D(QmlPropertyAction);
- return QmlListProperty<QObject>(this, d->exclude);
+ return &d->exclude;
}
/*!
@@ -2089,10 +2089,10 @@ void QmlPropertyAnimation::setProperties(const QString &prop)
\sa exclude matchProperties
*/
-QmlListProperty<QObject> QmlPropertyAnimation::targets()
+QList<QObject *> *QmlPropertyAnimation::targets()
{
Q_D(QmlPropertyAnimation);
- return QmlListProperty<QObject>(this, d->targets);
+ return &d->targets;
}
/*!
@@ -2100,10 +2100,10 @@ QmlListProperty<QObject> QmlPropertyAnimation::targets()
This property holds the items not to be affected by this animation.
\sa matchTargets
*/
-QmlListProperty<QObject> QmlPropertyAnimation::exclude()
+QList<QObject *> *QmlPropertyAnimation::exclude()
{
Q_D(QmlPropertyAnimation);
- return QmlListProperty<QObject>(this, d->exclude);
+ return &d->exclude;
}
void QmlPropertyAnimationPrivate::valueChanged(qreal r)
diff --git a/src/declarative/util/qmlanimation_p.h b/src/declarative/util/qmlanimation_p.h
index a566074..6a69e4d 100644
--- a/src/declarative/util/qmlanimation_p.h
+++ b/src/declarative/util/qmlanimation_p.h
@@ -187,8 +187,8 @@ class QmlPropertyAction : public QmlAbstractAnimation
Q_PROPERTY(QObject *target READ target WRITE setTarget NOTIFY targetChanged)
Q_PROPERTY(QString property READ property WRITE setProperty NOTIFY targetChanged)
Q_PROPERTY(QString matchProperties READ properties WRITE setProperties NOTIFY propertiesChanged)
- Q_PROPERTY(QmlListProperty<QObject> matchTargets READ targets)
- Q_PROPERTY(QmlListProperty<QObject> exclude READ exclude)
+ Q_PROPERTY(QList<QObject *>* matchTargets READ targets)
+ Q_PROPERTY(QList<QObject *>* exclude READ exclude)
Q_PROPERTY(QVariant value READ value WRITE setValue NOTIFY valueChanged)
public:
@@ -204,8 +204,8 @@ public:
QString properties() const;
void setProperties(const QString &);
- QmlListProperty<QObject> targets();
- QmlListProperty<QObject> exclude();
+ QList<QObject *> *targets();
+ QList<QObject *> *exclude();
QVariant value() const;
void setValue(const QVariant &);
@@ -267,8 +267,8 @@ class Q_AUTOTEST_EXPORT QmlPropertyAnimation : public QmlAbstractAnimation
Q_PROPERTY(QObject *target READ target WRITE setTarget NOTIFY targetChanged)
Q_PROPERTY(QString property READ property WRITE setProperty NOTIFY targetChanged)
Q_PROPERTY(QString matchProperties READ properties WRITE setProperties NOTIFY propertiesChanged)
- Q_PROPERTY(QmlListProperty<QObject> matchTargets READ targets)
- Q_PROPERTY(QmlListProperty<QObject> exclude READ exclude)
+ Q_PROPERTY(QList<QObject *>* matchTargets READ targets)
+ Q_PROPERTY(QList<QObject *>* exclude READ exclude)
public:
QmlPropertyAnimation(QObject *parent=0);
@@ -295,8 +295,8 @@ public:
QString properties() const;
void setProperties(const QString &);
- QmlListProperty<QObject> targets();
- QmlListProperty<QObject> exclude();
+ QList<QObject *> *targets();
+ QList<QObject *> *exclude();
protected:
virtual void transition(QmlStateActions &actions,
diff --git a/src/declarative/util/qmllistaccessor.cpp b/src/declarative/util/qmllistaccessor.cpp
index e060097..00b8220 100644
--- a/src/declarative/util/qmllistaccessor.cpp
+++ b/src/declarative/util/qmllistaccessor.cpp
@@ -89,7 +89,7 @@ void QmlListAccessor::setList(const QVariant &v, QmlEngine *engine)
(enginePrivate && enginePrivate->isQmlList(d.userType()))) {
m_type = QmlList;
} else if (QmlMetaType::isList(d.userType())) {
- m_type = ListProperty;
+ m_type = QListPtr;
} else {
m_type = Instance;
}
@@ -107,11 +107,10 @@ int QmlListAccessor::count() const
QmlPrivate::ListInterface *li = *(QmlPrivate::ListInterface **)d.constData();
return li->count();
}
- case ListProperty:
+ case QListPtr:
{
- QmlListProperty<void> *li = (QmlListProperty<void>*)d.constData();
- if (li->count) return li->count(li);
- else return 0;
+ QList<void *> *li = *(QList<void *> **)d.constData();
+ return li->count();
}
case Instance:
return 1;
@@ -138,11 +137,11 @@ QVariant QmlListAccessor::at(int idx) const
li->at(idx, ptr);
return QVariant::fromValue((QObject*)ptr[0]);
}
- case ListProperty:
+ case QListPtr:
{
- QmlListProperty<void> *li = (QmlListProperty<void>*)d.constData();
- if (li->at) return QVariant::fromValue((QObject *)li->at(li, idx));
- else return QVariant();
+ QList<void *> *li = *(QList<void *> **)d.constData();
+ void *ptr = li->at(idx);
+ return QVariant::fromValue((QObject*)ptr);
}
case Instance:
return d;
@@ -163,10 +162,10 @@ bool QmlListAccessor::append(const QVariant &value)
li->append(const_cast<void *>(value.constData())); //XXX Typesafety
return true;
}
- case ListProperty:
+ case QListPtr:
{
- QmlListProperty<void> *li = (QmlListProperty<void>*)d.constData();
- if (li->append) li->append(li, *(void **)value.constData()); // XXX Typesafety
+ QList<void *> *li = *(QList<void *> **)d.constData();
+ li->append(*reinterpret_cast<void **>(const_cast<void *>(value.constData()))); //XXX Typesafety
return true;
}
case StringList:
@@ -188,10 +187,10 @@ bool QmlListAccessor::insert(int index, const QVariant &value)
li->insert(index, const_cast<void *>(value.constData())); //XXX Typesafety
return true;
}
- case ListProperty:
+ case QListPtr:
{
- QmlListProperty<void> *li = (QmlListProperty<void>*)d.constData();
- if (li->insert) li->insert(li, index, *(void **)value.constData()); // XXX Typesafety
+ QList<void *> *li = *(QList<void *>**)d.constData();
+ li->insert(index, *reinterpret_cast<void **>(const_cast<void *>(value.constData()))); //XXX Typesafety
return true;
}
case StringList:
@@ -213,10 +212,10 @@ bool QmlListAccessor::removeAt(int index)
li->removeAt(index);
return true;
}
- case ListProperty:
+ case QListPtr:
{
- QmlListProperty<void> *li = (QmlListProperty<void>*)d.constData();
- if (li->removeAt) li->removeAt(li, index);
+ QList<void *> *li = *(QList<void *>**)d.constData();
+ li->removeAt(index);
return true;
}
case StringList:
@@ -238,10 +237,10 @@ bool QmlListAccessor::clear()
li->clear();
return true;
}
- case ListProperty:
+ case QListPtr:
{
- QmlListProperty<void> *li = (QmlListProperty<void>*)d.constData();
- if (li->clear) li->clear(li);
+ QList<void *> *li = *(QList<void *>**)d.constData();
+ li->clear();
return true;
}
case StringList:
diff --git a/src/declarative/util/qmllistaccessor_p.h b/src/declarative/util/qmllistaccessor_p.h
index 6866150..3c67e3a 100644
--- a/src/declarative/util/qmllistaccessor_p.h
+++ b/src/declarative/util/qmllistaccessor_p.h
@@ -70,7 +70,7 @@ public:
bool removeAt(int);
bool clear();
- enum Type { Invalid, StringList, VariantList, QmlList, ListProperty, Instance, Integer };
+ enum Type { Invalid, StringList, VariantList, QmlList, QListPtr, Instance, Integer };
Type type() const { return m_type; }
private:
diff --git a/tests/auto/declarative/qmlecmascript/testtypes.h b/tests/auto/declarative/qmlecmascript/testtypes.h
index b307d9c..09c850d 100644
--- a/tests/auto/declarative/qmlecmascript/testtypes.h
+++ b/tests/auto/declarative/qmlecmascript/testtypes.h
@@ -78,7 +78,7 @@ class MyQmlObject : public QObject
Q_PROPERTY(QString stringProperty READ stringProperty WRITE setStringProperty NOTIFY stringChanged)
Q_PROPERTY(QObject *objectProperty READ objectProperty WRITE setObjectProperty NOTIFY objectChanged)
Q_PROPERTY(QmlList<QObject *> *objectQmlListProperty READ objectQmlListProperty CONSTANT)
- Q_PROPERTY(QmlListProperty<QObject> objectListProperty READ objectListProperty CONSTANT)
+ Q_PROPERTY(QList<QObject *> *objectListProperty READ objectListProperty CONSTANT)
Q_PROPERTY(int resettableProperty READ resettableProperty WRITE setResettableProperty RESET resetProperty)
public:
@@ -108,7 +108,7 @@ public:
}
QmlList<QObject *> *objectQmlListProperty() { return &m_objectQmlList; }
- QmlListProperty<QObject> objectListProperty() { return QmlListProperty<QObject>(this, m_objectQList); }
+ QList<QObject *> *objectListProperty() { return &m_objectQList; }
bool methodCalled() const { return m_methodCalled; }
bool methodIntCalled() const { return m_methodIntCalled; }
@@ -162,11 +162,11 @@ QML_DECLARE_TYPE(MyQmlObject);
class MyQmlContainer : public QObject
{
Q_OBJECT
- Q_PROPERTY(QmlListProperty<MyQmlObject> children READ children CONSTANT)
+ Q_PROPERTY(QList<MyQmlObject*>* children READ children CONSTANT)
public:
MyQmlContainer() {}
- QmlListProperty<MyQmlObject> children() { return QmlListProperty<MyQmlObject>(this, m_children); }
+ QList<MyQmlObject*> *children() { return &m_children; }
private:
QList<MyQmlObject*> m_children;
diff --git a/tests/auto/declarative/qmlecmascript/tst_qmlecmascript.cpp b/tests/auto/declarative/qmlecmascript/tst_qmlecmascript.cpp
index cc5d7f2..1ba9a52 100644
--- a/tests/auto/declarative/qmlecmascript/tst_qmlecmascript.cpp
+++ b/tests/auto/declarative/qmlecmascript/tst_qmlecmascript.cpp
@@ -1608,7 +1608,7 @@ void tst_qmlecmascript::listToVariant()
QObject *object = component.create(&context);
QVERIFY(object != 0);
- QVERIFY(qvariant_cast<QmlListProperty<MyQmlObject> >(object->property("test")) == container.children());
+ QCOMPARE(object->property("test"), QVariant::fromValue(container.children()));
delete object;
}
diff --git a/tests/auto/declarative/qmllanguage/testtypes.h b/tests/auto/declarative/qmllanguage/testtypes.h
index 6cd4cb5..d6ca898 100644
--- a/tests/auto/declarative/qmllanguage/testtypes.h
+++ b/tests/auto/declarative/qmllanguage/testtypes.h
@@ -447,20 +447,19 @@ QML_DECLARE_TYPE(MyTypeObject);
class MyContainer : public QObject
{
Q_OBJECT
- Q_PROPERTY(QmlListProperty<QObject> children READ children)
- Q_PROPERTY(QmlListProperty<MyInterface> qlistInterfaces READ qlistInterfaces)
+ Q_PROPERTY(QList<QObject*>* children READ children)
+ Q_PROPERTY(QList<MyInterface*>* qlistInterfaces READ qlistInterfaces)
Q_PROPERTY(QmlList<MyInterface*>* qmllistInterfaces READ qmllistInterfaces)
Q_CLASSINFO("DefaultProperty", "children");
public:
MyContainer() {}
- QmlListProperty<QObject> children() { return QmlListProperty<QObject>(this, m_children); }
- QList<QObject *> *getChildren() { return &m_children; }
- QmlListProperty<MyInterface> qlistInterfaces() { return QmlListProperty<MyInterface>(this, m_interfaces); }
- QList<MyInterface *> *getQListInterfaces() { return &m_interfaces; }
+ QList<QObject*> *children() { return &m_children; }
+ QList<MyInterface *> *qlistInterfaces() { return &m_interfaces; }
QmlList<MyInterface *> *qmllistInterfaces() { return &m_qmlinterfaces; }
const QmlConcreteList<MyInterface *> &qmllistAccessor() const { return m_qmlinterfaces; }
+private:
QList<QObject*> m_children;
QList<MyInterface *> m_interfaces;
QmlConcreteList<MyInterface *> m_qmlinterfaces;
diff --git a/tests/auto/declarative/qmllanguage/tst_qmllanguage.cpp b/tests/auto/declarative/qmllanguage/tst_qmllanguage.cpp
index 7ccdd3d..357fc5f 100644
--- a/tests/auto/declarative/qmllanguage/tst_qmllanguage.cpp
+++ b/tests/auto/declarative/qmllanguage/tst_qmllanguage.cpp
@@ -351,7 +351,7 @@ void tst_qmllanguage::simpleContainer()
VERIFY_ERRORS(0);
MyContainer *container= qobject_cast<MyContainer*>(component.create());
QVERIFY(container != 0);
- QCOMPARE(container->getChildren()->count(),2);
+ QCOMPARE(container->children()->count(),2);
}
void tst_qmllanguage::interfaceProperty()
@@ -381,9 +381,9 @@ void tst_qmllanguage::interfaceQList()
VERIFY_ERRORS(0);
MyContainer *container= qobject_cast<MyContainer*>(component.create());
QVERIFY(container != 0);
- QVERIFY(container->getQListInterfaces()->count() == 2);
+ QVERIFY(container->qlistInterfaces()->count() == 2);
for(int ii = 0; ii < 2; ++ii)
- QVERIFY(container->getQListInterfaces()->at(ii)->id == 913);
+ QVERIFY(container->qlistInterfaces()->at(ii)->id == 913);
}
void tst_qmllanguage::assignObjectToSignal()
@@ -422,8 +422,8 @@ void tst_qmllanguage::assignQmlComponent()
VERIFY_ERRORS(0);
MyContainer *object = qobject_cast<MyContainer *>(component.create());
QVERIFY(object != 0);
- QVERIFY(object->getChildren()->count() == 1);
- QObject *child = object->getChildren()->at(0);
+ QVERIFY(object->children()->count() == 1);
+ QObject *child = object->children()->at(0);
QCOMPARE(child->property("x"), QVariant(10));
QCOMPARE(child->property("y"), QVariant(11));
}
@@ -501,7 +501,7 @@ void tst_qmllanguage::rootAsQmlComponent()
MyContainer *object = qobject_cast<MyContainer *>(component.create());
QVERIFY(object != 0);
QCOMPARE(object->property("x"), QVariant(11));
- QCOMPARE(object->getChildren()->count(), 2);
+ QCOMPARE(object->children()->count(), 2);
}
// Tests that components can be specified inline
@@ -511,8 +511,8 @@ void tst_qmllanguage::inlineQmlComponents()
VERIFY_ERRORS(0);
MyContainer *object = qobject_cast<MyContainer *>(component.create());
QVERIFY(object != 0);
- QCOMPARE(object->getChildren()->count(), 1);
- QmlComponent *comp = qobject_cast<QmlComponent *>(object->getChildren()->at(0));
+ QCOMPARE(object->children()->count(), 1);
+ QmlComponent *comp = qobject_cast<QmlComponent *>(object->children()->at(0));
QVERIFY(comp != 0);
MyQmlObject *compObject = qobject_cast<MyQmlObject *>(comp->create());
QVERIFY(compObject != 0);
@@ -526,9 +526,9 @@ void tst_qmllanguage::idProperty()
VERIFY_ERRORS(0);
MyContainer *object = qobject_cast<MyContainer *>(component.create());
QVERIFY(object != 0);
- QCOMPARE(object->getChildren()->count(), 1);
+ QCOMPARE(object->children()->count(), 1);
MyTypeObject *child =
- qobject_cast<MyTypeObject *>(object->getChildren()->at(0));
+ qobject_cast<MyTypeObject *>(object->children()->at(0));
QVERIFY(child != 0);
QCOMPARE(child->id(), QString("myObjectId"));
QCOMPARE(object->property("object"), QVariant::fromValue((QObject *)child));
@@ -1031,13 +1031,13 @@ void tst_qmllanguage::defaultPropertyListOrder()
MyContainer *container = qobject_cast<MyContainer *>(component.create());
QVERIFY(container != 0);
- QCOMPARE(container->getChildren()->count(), 6);
- QCOMPARE(container->getChildren()->at(0)->property("index"), QVariant(0));
- QCOMPARE(container->getChildren()->at(1)->property("index"), QVariant(1));
- QCOMPARE(container->getChildren()->at(2)->property("index"), QVariant(2));
- QCOMPARE(container->getChildren()->at(3)->property("index"), QVariant(3));
- QCOMPARE(container->getChildren()->at(4)->property("index"), QVariant(4));
- QCOMPARE(container->getChildren()->at(5)->property("index"), QVariant(5));
+ QCOMPARE(container->children()->count(), 6);
+ QCOMPARE(container->children()->at(0)->property("index"), QVariant(0));
+ QCOMPARE(container->children()->at(1)->property("index"), QVariant(1));
+ QCOMPARE(container->children()->at(2)->property("index"), QVariant(2));
+ QCOMPARE(container->children()->at(3)->property("index"), QVariant(3));
+ QCOMPARE(container->children()->at(4)->property("index"), QVariant(4));
+ QCOMPARE(container->children()->at(5)->property("index"), QVariant(5));
}
void tst_qmllanguage::declaredPropertyValues()
diff --git a/tests/auto/declarative/qmllistaccessor/tst_qmllistaccessor.cpp b/tests/auto/declarative/qmllistaccessor/tst_qmllistaccessor.cpp
index 9bf47b6..ddf9a07 100644
--- a/tests/auto/declarative/qmllistaccessor/tst_qmllistaccessor.cpp
+++ b/tests/auto/declarative/qmllistaccessor/tst_qmllistaccessor.cpp
@@ -52,7 +52,7 @@ public:
private slots:
void invalid();
void qmllist();
- void listproperty();
+ void qlist();
void qstringlist();
void qvariantlist();
void qobject();
@@ -149,7 +149,7 @@ void tst_QmlListAccessor::qmllist()
QCOMPARE(list.count(), 0);
}
-void tst_QmlListAccessor::listproperty()
+void tst_QmlListAccessor::qlist()
{
QList<QObject*> list;
QObject *obj = new QObject(this);
@@ -161,11 +161,11 @@ void tst_QmlListAccessor::listproperty()
QCOMPARE(list.at(0), obj);
QmlListAccessor accessor;
- accessor.setList(qVariantFromValue(QmlListProperty<QObject>(this, list)));
- QVERIFY(qvariant_cast<QmlListProperty<QObject> >(accessor.list()) == QmlListProperty<QObject>(this, list));
+ accessor.setList(qVariantFromValue((QList<QObject*>*)&list));
+ QCOMPARE(accessor.list(), qVariantFromValue((QList<QObject*>*)&list));
// type
- QCOMPARE(accessor.type(), QmlListAccessor::ListProperty);
+ QCOMPARE(accessor.type(), QmlListAccessor::QListPtr);
// isValid
QVERIFY(accessor.isValid());