From 24a7d8559f291c9ff565142bf3a7a230dccb6c63 Mon Sep 17 00:00:00 2001 From: Michael Brasser Date: Tue, 12 Jan 2010 16:32:12 +1000 Subject: Add basic support for property iteration. Task-number: QTBUG-6033 --- src/declarative/qml/qmlobjectscriptclass.cpp | 23 +++++++++++++++++++++++ src/declarative/qml/qmlobjectscriptclass_p.h | 1 + src/declarative/qml/qmlpropertycache.cpp | 11 +++++++++++ src/declarative/qml/qmlpropertycache_p.h | 1 + 4 files changed, 36 insertions(+) diff --git a/src/declarative/qml/qmlobjectscriptclass.cpp b/src/declarative/qml/qmlobjectscriptclass.cpp index 1023579..fbd123a 100644 --- a/src/declarative/qml/qmlobjectscriptclass.cpp +++ b/src/declarative/qml/qmlobjectscriptclass.cpp @@ -402,5 +402,28 @@ QScriptValue QmlObjectScriptClass::destroy(QScriptContext *context, QScriptEngin return engine->nullValue(); } +QStringList QmlObjectScriptClass::propertyNames(Object *object) +{ + QObject *obj = toQObject(object); + if (!obj) + return QStringList(); + + QmlEnginePrivate *enginePrivate = QmlEnginePrivate::get(engine); + + QmlPropertyCache *cache = 0; + QmlDeclarativeData *ddata = QmlDeclarativeData::get(obj); + if (ddata) + cache = ddata->propertyCache; + if (!cache) { + cache = enginePrivate->cache(obj); + if (cache && ddata) { cache->addref(); ddata->propertyCache = cache; } + } + + if (!cache) + return QStringList(); + + return cache->propertyNames(); +} + QT_END_NAMESPACE diff --git a/src/declarative/qml/qmlobjectscriptclass_p.h b/src/declarative/qml/qmlobjectscriptclass_p.h index 5c488db..457eb2b 100644 --- a/src/declarative/qml/qmlobjectscriptclass_p.h +++ b/src/declarative/qml/qmlobjectscriptclass_p.h @@ -89,6 +89,7 @@ public: Value property(QObject *, const Identifier &); void setProperty(QObject *, const Identifier &name, const QScriptValue &, QmlContext *evalContext = 0); + virtual QStringList propertyNames(Object *); protected: virtual QScriptClass::QueryFlags queryProperty(Object *, const Identifier &, diff --git a/src/declarative/qml/qmlpropertycache.cpp b/src/declarative/qml/qmlpropertycache.cpp index 394fa35..3bbf1fe 100644 --- a/src/declarative/qml/qmlpropertycache.cpp +++ b/src/declarative/qml/qmlpropertycache.cpp @@ -130,6 +130,8 @@ QmlPropertyCache::Data QmlPropertyCache::create(const QMetaObject *metaObject, int methodCount = metaObject->methodCount(); for (int ii = methodCount - 1; ii >= 0; --ii) { QMetaMethod m = metaObject->method(ii); + if (m.access() == QMetaMethod::Private) + continue; QString methodName = QString::fromUtf8(m.signature()); int parenIdx = methodName.indexOf(QLatin1Char('(')); @@ -198,6 +200,8 @@ void QmlPropertyCache::append(QmlEngine *engine, const QMetaObject *metaObject, int methodOffset = metaObject->methodOffset(); for (int ii = methodOffset; ii < methodCount; ++ii) { QMetaMethod m = metaObject->method(ii); + if (m.access() == QMetaMethod::Private) + continue; QString methodName = QString::fromUtf8(m.signature()); int parenIdx = methodName.indexOf(QLatin1Char('(')); @@ -268,6 +272,8 @@ void QmlPropertyCache::update(QmlEngine *engine, const QMetaObject *metaObject) int methodCount = metaObject->methodCount(); for (int ii = methodCount - 1; ii >= 0; --ii) { QMetaMethod m = metaObject->method(ii); + if (m.access() == QMetaMethod::Private) + continue; QString methodName = QString::fromUtf8(m.signature()); int parenIdx = methodName.indexOf(QLatin1Char('(')); @@ -330,4 +336,9 @@ QString QmlPropertyCache::Data::name(const QMetaObject *metaObject) } } +QStringList QmlPropertyCache::propertyNames() const +{ + return stringCache.keys(); +} + QT_END_NAMESPACE diff --git a/src/declarative/qml/qmlpropertycache_p.h b/src/declarative/qml/qmlpropertycache_p.h index feaa683..a94b2a1 100644 --- a/src/declarative/qml/qmlpropertycache_p.h +++ b/src/declarative/qml/qmlpropertycache_p.h @@ -125,6 +125,7 @@ public: inline Data *property(const QScriptDeclarativeClass::Identifier &id) const; Data *property(const QString &) const; Data *property(int) const; + QStringList propertyNames() const; protected: virtual void clear(); -- cgit v0.12