From b1200f446e611f167a712eb877d60b2b3a9444e6 Mon Sep 17 00:00:00 2001 From: Charles Yin Date: Tue, 26 Jul 2011 10:47:13 +1000 Subject: [PATCH] Add .arg() for Javascript String type Change-Id: I973032189c40bfa4d5450396f5bad1a7c81ac68b Task-number:QTBUG-16734 Reviewed-by:Michael Brasser Reviewed-on: http://codereview.qt.nokia.com/2134 Reviewed-by: Qt Sanity Bot Reviewed-by: Aaron Kennedy --- src/declarative/qml/v8/qv8engine.cpp | 21 ++++++++++++++++++++ src/declarative/qml/v8/qv8engine_p.h | 1 + .../qdeclarativeecmascript/data/dynamicString.qml | 16 +++++++++++++++ .../tst_qdeclarativeecmascript.cpp | 10 ++++++++- 4 files changed, 47 insertions(+), 1 deletions(-) create mode 100644 tests/auto/declarative/qdeclarativeecmascript/data/dynamicString.qml diff --git a/src/declarative/qml/v8/qv8engine.cpp b/src/declarative/qml/v8/qv8engine.cpp index 0569242..0294a60 100644 --- a/src/declarative/qml/v8/qv8engine.cpp +++ b/src/declarative/qml/v8/qv8engine.cpp @@ -578,6 +578,10 @@ void QV8Engine::initializeGlobal(v8::Handle global) global->Set(v8::String::New("Qt"), qt); global->Set(v8::String::New("gc"), V8FUNCTION(gc, this)); + v8::Local string = v8::Local::Cast(global->Get(v8::String::New("String"))); + v8::Local stringPrototype = v8::Local::Cast(string->Get(v8::String::New("prototype"))); + stringPrototype->Set(v8::String::New("arg"), V8FUNCTION(stringArg, this)); + m_xmlHttpRequestData = qt_add_qmlxmlhttprequest(this); m_sqlDatabaseData = qt_add_qmlsqldatabase(this); @@ -721,6 +725,23 @@ v8::Handle QV8Engine::print(const v8::Arguments &args) return v8::Undefined(); } +v8::Handle QV8Engine::stringArg(const v8::Arguments &args) +{ + QString value = V8ENGINE()->toString(args.This()->ToString()); + if (args.Length() != 1) + V8THROW_ERROR("String.arg(): Invalid arguments"); + + if (args[0]->IsUint32()) + return V8ENGINE()->toString(value.arg(args[0]->Uint32Value())); + else if (args[0]->IsInt32()) + return V8ENGINE()->toString(value.arg(args[0]->Int32Value())); + else if (args[0]->IsNumber()) + return V8ENGINE()->toString(value.arg(args[0]->NumberValue())); + else if (args[0]->IsBoolean()) + return V8ENGINE()->toString(value.arg(args[0]->BooleanValue())); + + return V8ENGINE()->toString(value.arg(V8ENGINE()->toString(args[0]))); +} /*! \qmlmethod bool Qt::isQtObject(object) Returns true if \c object is a valid reference to a Qt or QML object, otherwise false. diff --git a/src/declarative/qml/v8/qv8engine_p.h b/src/declarative/qml/v8/qv8engine_p.h index 5058eee..7dc3336 100644 --- a/src/declarative/qml/v8/qv8engine_p.h +++ b/src/declarative/qml/v8/qv8engine_p.h @@ -351,6 +351,7 @@ private: static v8::Handle qsTrNoOp(const v8::Arguments &args); static v8::Handle qsTrId(const v8::Arguments &args); static v8::Handle qsTrIdNoOp(const v8::Arguments &args); + static v8::Handle stringArg(const v8::Arguments &args); double qtDateTimeToJsDate(const QDateTime &dt); QDateTime qtDateTimeFromJsDate(double jsDate); diff --git a/tests/auto/declarative/qdeclarativeecmascript/data/dynamicString.qml b/tests/auto/declarative/qdeclarativeecmascript/data/dynamicString.qml new file mode 100644 index 0000000..5693794 --- /dev/null +++ b/tests/auto/declarative/qdeclarativeecmascript/data/dynamicString.qml @@ -0,0 +1,16 @@ +import Qt.test 1.0 +import QtQuick 2.0 + +MyTypeObject { + stringProperty:"string:%0 false:%1 true:%2 uint32:%3 int32:%4 double:%5 date:%6!" + Component.onCompleted: { + var date = new Date(); + date.setDate(11); + date.setMonth(1); + date.setFullYear(2011); + date.setHours(5); + date.setMinutes(30); + date.setSeconds(50); + stringProperty = stringProperty.arg("Hello World").arg(false).arg(true).arg(100).arg(-100).arg(3.1415926).arg(Qt.formatDateTime(date, "yyyy-MM-dd hh::mm:ss")); + } +} diff --git a/tests/auto/declarative/qdeclarativeecmascript/tst_qdeclarativeecmascript.cpp b/tests/auto/declarative/qdeclarativeecmascript/tst_qdeclarativeecmascript.cpp index 2b02ad2..bc33932 100644 --- a/tests/auto/declarative/qdeclarativeecmascript/tst_qdeclarativeecmascript.cpp +++ b/tests/auto/declarative/qdeclarativeecmascript/tst_qdeclarativeecmascript.cpp @@ -184,7 +184,7 @@ private slots: void aliasWritesOverrideBindings(); void aliasToCompositeElement(); void realToInt(); - + void dynamicString(); void include(); void callQtInvokables(); @@ -3644,6 +3644,14 @@ void tst_qdeclarativeecmascript::realToInt() QMetaObject::invokeMethod(object, "test2"); QCOMPARE(object->value(), int(8)); } +void tst_qdeclarativeecmascript::dynamicString() +{ + QDeclarativeComponent component(&engine, TEST_FILE("dynamicString.qml")); + QObject *object = component.create(); + QVERIFY(object != 0); + QCOMPARE(object->property("stringProperty").toString(), + QString::fromLatin1("string:Hello World false:0 true:1 uint32:100 int32:-100 double:3.14159 date:2011-02-11 05::30:50!")); +} QTEST_MAIN(tst_qdeclarativeecmascript) -- 1.7.2.5