From: Aaron Kennedy Date: Fri, 1 Jul 2011 06:30:06 +0000 (+1000) Subject: Add toString for variants X-Git-Url: http://git.silmor.de/gitweb/?a=commitdiff_plain;h=c4b0954b7de4f82e1d4ecc55bec59b3cef13c7f1;p=konrad%2Fqtdeclarative.git Add toString for variants Change-Id: Ia64adeb3640f7f7eedccd7015de729969232a07f Reviewed-on: http://codereview.qt.nokia.com/987 Reviewed-by: Aaron Kennedy --- diff --git a/src/declarative/qml/v8/qv8variantwrapper.cpp b/src/declarative/qml/v8/qv8variantwrapper.cpp index 37e998d..9d486d0 100644 --- a/src/declarative/qml/v8/qv8variantwrapper.cpp +++ b/src/declarative/qml/v8/qv8variantwrapper.cpp @@ -70,10 +70,15 @@ QV8VariantWrapper::~QV8VariantWrapper() void QV8VariantWrapper::init(QV8Engine *engine) { m_engine = engine; + m_toString = qPersistentNew(v8::FunctionTemplate::New(ToString)->GetFunction()); + { v8::Local ft = v8::FunctionTemplate::New(); - ft->InstanceTemplate()->SetNamedPropertyHandler(Getter, Setter); + ft->InstanceTemplate()->SetFallbackPropertyHandler(Getter, Setter); ft->InstanceTemplate()->SetHasExternalResource(true); + ft->InstanceTemplate()->SetAccessor(v8::String::New("toString"), ToStringGetter, 0, + m_toString, v8::DEFAULT, + v8::PropertyAttribute(v8::ReadOnly | v8::DontDelete)); m_constructor = qPersistentNew(ft->GetFunction()); } { @@ -88,6 +93,9 @@ void QV8VariantWrapper::init(QV8Engine *engine) ft->InstanceTemplate()->SetAccessor(v8::String::New("destroy"), DestroyGetter, 0, m_destroy, v8::DEFAULT, v8::PropertyAttribute(v8::ReadOnly | v8::DontDelete)); + ft->InstanceTemplate()->SetAccessor(v8::String::New("toString"), ToStringGetter, 0, + m_toString, v8::DEFAULT, + v8::PropertyAttribute(v8::ReadOnly | v8::DontDelete)); m_scarceConstructor = qPersistentNew(ft->GetFunction()); } @@ -95,6 +103,7 @@ void QV8VariantWrapper::init(QV8Engine *engine) void QV8VariantWrapper::destroy() { + qPersistentDispose(m_toString); qPersistentDispose(m_destroy); qPersistentDispose(m_preserve); qPersistentDispose(m_scarceConstructor); @@ -167,6 +176,13 @@ v8::Handle QV8VariantWrapper::DestroyGetter(v8::Local pro return info.Data(); } +v8::Handle QV8VariantWrapper::ToStringGetter(v8::Local property, + const v8::AccessorInfo &info) +{ + Q_UNUSED(property); + return info.Data(); +} + v8::Handle QV8VariantWrapper::Preserve(const v8::Arguments &args) { QV8VariantResource *resource = v8_resource_cast(args.This()); @@ -186,4 +202,17 @@ v8::Handle QV8VariantWrapper::Destroy(const v8::Arguments &args) return v8::Undefined(); } +v8::Handle QV8VariantWrapper::ToString(const v8::Arguments &args) +{ + QV8VariantResource *resource = v8_resource_cast(args.This()); + if (resource) { + QString result = resource->data.toString(); + if (result.isEmpty() && !resource->data.canConvert(QVariant::String)) + result = QString::fromLatin1("QVariant(%0)").arg(QString::fromLatin1(resource->data.typeName())); + return resource->engine->toString(result); + } else { + return v8::Undefined(); + } +} + QT_END_NAMESPACE diff --git a/src/declarative/qml/v8/qv8variantwrapper_p.h b/src/declarative/qml/v8/qv8variantwrapper_p.h index 972d4e9..9e165f3 100644 --- a/src/declarative/qml/v8/qv8variantwrapper_p.h +++ b/src/declarative/qml/v8/qv8variantwrapper_p.h @@ -85,14 +85,18 @@ private: const v8::AccessorInfo &info); static v8::Handle DestroyGetter(v8::Local property, const v8::AccessorInfo &info); + static v8::Handle ToStringGetter(v8::Local property, + const v8::AccessorInfo &info); static v8::Handle Preserve(const v8::Arguments &args); static v8::Handle Destroy(const v8::Arguments &args); + static v8::Handle ToString(const v8::Arguments &args); QV8Engine *m_engine; v8::Persistent m_constructor; v8::Persistent m_scarceConstructor; v8::Persistent m_preserve; v8::Persistent m_destroy; + v8::Persistent m_toString; }; QT_END_NAMESPACE