diff options
author | Andrew den Exter <andrew.den-exter@nokia.com> | 2012-07-10 15:24:59 +1000 |
---|---|---|
committer | Qt by Nokia <qt-info@nokia.com> | 2012-07-23 06:40:20 +0200 |
commit | 231e73b400fdc7eae84cb8beaf246617dcf8557e (patch) | |
tree | 36b31e75873a50553177c1e469cd8471650a132d | |
parent | 22c68738bf2a83eb228b412fbd251bcdf8e7056e (diff) |
Add a static object template for variant list model types.
Also cache any reused strings so a copy isn't created per model.
Change-Id: I32f6685df8c1ecc965c9dd7192fa9972655f0ce4
Reviewed-by: Chris Adams <christopher.adams@nokia.com>
-rw-r--r-- | src/quick/items/qquickvisualadaptormodel.cpp | 96 |
1 files changed, 74 insertions, 22 deletions
diff --git a/src/quick/items/qquickvisualadaptormodel.cpp b/src/quick/items/qquickvisualadaptormodel.cpp index f298346ced..f7cd3e2764 100644 --- a/src/quick/items/qquickvisualadaptormodel.cpp +++ b/src/quick/items/qquickvisualadaptormodel.cpp @@ -44,9 +44,42 @@ #include <private/qmetaobjectbuilder_p.h> #include <private/qqmlproperty_p.h> +#include <private/qv8engine_p.h> QT_BEGIN_NAMESPACE +class QQuickVisualAdaptorModelEngineData : public QV8Engine::Deletable +{ +public: + enum + { + Index, + ModelData, + HasModelChildren, + StringCount + }; + + QQuickVisualAdaptorModelEngineData(QV8Engine *engine); + ~QQuickVisualAdaptorModelEngineData(); + + v8::Local<v8::String> index() { return strings->Get(Index)->ToString(); } + v8::Local<v8::String> modelData() { return strings->Get(ModelData)->ToString(); } + v8::Local<v8::String> hasModelChildren() { return strings->Get(HasModelChildren)->ToString(); } + + v8::Persistent<v8::Function> constructorListItem; + v8::Persistent<v8::Array> strings; +}; + +V8_DEFINE_EXTENSION(QQuickVisualAdaptorModelEngineData, engineData) + +static v8::Handle<v8::Value> get_index(v8::Local<v8::String>, const v8::AccessorInfo &info) +{ + QQuickVisualDataModelItem *data = v8_resource_cast<QQuickVisualDataModelItem>(info.This()); + V8ASSERT_TYPE(data, "Not a valid VisualData object"); + + return v8::Int32::New(data->index); +} + template <typename T, typename M> static void setModelDataType(QMetaObjectBuilder *builder, M *metaType) { builder->setFlags(QMetaObjectBuilder::DynamicMetaObject); @@ -64,22 +97,6 @@ static void addProperty(QMetaObjectBuilder *builder, int propertyId, const QByte property.setWritable(true); } -static v8::Handle<v8::Value> get_index(v8::Local<v8::String>, const v8::AccessorInfo &info) -{ - QQuickVisualDataModelItem *data = v8_resource_cast<QQuickVisualDataModelItem>(info.This()); - V8ASSERT_TYPE(data, "Not a valid VisualData object"); - - return v8::Int32::New(data->index); -} - -static v8::Local<v8::ObjectTemplate> createConstructor() -{ - v8::Local<v8::ObjectTemplate> constructor = v8::ObjectTemplate::New(); - constructor->SetHasExternalResource(true); - constructor->SetAccessor(v8::String::New("index"), get_index); - return constructor; -} - class VDMModelDelegateDataType; class QQuickVDMCachedModelData : public QQuickVisualDataModelItem @@ -188,9 +205,11 @@ public: dataType->watchedRoles += newRoles; } - void initializeConstructor() + void initializeConstructor(QQuickVisualAdaptorModelEngineData *const data) { - constructor = qPersistentNew(createConstructor()); + constructor = qPersistentNew(v8::ObjectTemplate::New()); + constructor->SetHasExternalResource(true); + constructor->SetAccessor(data->index(), get_index); typedef QHash<QByteArray, int>::const_iterator iterator; for (iterator it = roleNames.constBegin(), end = roleNames.constEnd(); it != end; ++it) { @@ -394,10 +413,11 @@ public: v8::Handle<v8::Value> get() { if (type->constructor.IsEmpty()) { + QQuickVisualAdaptorModelEngineData * const data = engineData(engine); v8::HandleScope handleScope; v8::Context::Scope contextScope(engine->context()); - type->initializeConstructor(); - type->constructor->SetAccessor(v8::String::New("hasModelChildren"), get_hasModelChildren); + type->initializeConstructor(data); + type->constructor->SetAccessor(data->hasModelChildren(), get_hasModelChildren); } v8::Local<v8::Object> data = type->constructor->NewInstance(); data->SetExternalResource(this); @@ -556,7 +576,7 @@ public: if (type->constructor.IsEmpty()) { v8::HandleScope handleScope; v8::Context::Scope contextScope(engine->context()); - type->initializeConstructor(); + type->initializeConstructor(engineData(engine)); } v8::Local<v8::Object> data = type->constructor->NewInstance(); data->SetExternalResource(this); @@ -685,7 +705,7 @@ public: return data->engine->fromVariant(static_cast<QQuickVDMListAccessorData *>(data)->cachedData); } - static void set_modelData(v8::Local<v8::String>, const v8::Handle<v8::Value> &value, const v8::AccessorInfo &info) + static void set_modelData(v8::Local<v8::String>, v8::Local<v8::Value> value, const v8::AccessorInfo &info) { QQuickVisualDataModelItem *data = v8_resource_cast<QQuickVisualDataModelItem>(info.This()); V8ASSERT_TYPE_SETTER(data, "Not a valid VisualData object"); @@ -694,6 +714,14 @@ public: data->engine->toVariant(value, QVariant::Invalid)); } + v8::Handle<v8::Value> get() + { + v8::Local<v8::Object> data = engineData(engine)->constructorListItem->NewInstance(); + data->SetExternalResource(this); + ++scriptRef; + return data; + } + void setValue(const QString &role, const QVariant &value) { if (role == QLatin1String("modelData")) @@ -713,6 +741,7 @@ public: } } + Q_SIGNALS: void modelDataChanged(); @@ -1026,6 +1055,29 @@ void QQuickVisualAdaptorModel::objectDestroyed(QObject *) setModel(QVariant(), 0, 0); } +QQuickVisualAdaptorModelEngineData::QQuickVisualAdaptorModelEngineData(QV8Engine *) +{ + strings = qPersistentNew(v8::Array::New(StringCount)); + strings->Set(Index, v8::String::New("index")); + strings->Set(ModelData, v8::String::New("modelData")); + strings->Set(HasModelChildren, v8::String::New("hasModelChildren")); + + v8::Local<v8::FunctionTemplate> listItem = v8::FunctionTemplate::New(); + listItem->InstanceTemplate()->SetHasExternalResource(true); + listItem->InstanceTemplate()->SetAccessor(index(), get_index); + listItem->InstanceTemplate()->SetAccessor( + modelData(), + QQuickVDMListAccessorData::get_modelData, + QQuickVDMListAccessorData::set_modelData); + constructorListItem = qPersistentNew(listItem->GetFunction()); +} + +QQuickVisualAdaptorModelEngineData::~QQuickVisualAdaptorModelEngineData() +{ + qPersistentDispose(constructorListItem); + qPersistentDispose(strings); +} + QT_END_NAMESPACE QML_DECLARE_TYPE(QListModelInterface) |