aboutsummaryrefslogtreecommitdiffstats
path: root/src/declarative/qml/v8/qdeclarativebuiltinfunctions.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/declarative/qml/v8/qdeclarativebuiltinfunctions.cpp')
-rw-r--r--src/declarative/qml/v8/qdeclarativebuiltinfunctions.cpp1320
1 files changed, 0 insertions, 1320 deletions
diff --git a/src/declarative/qml/v8/qdeclarativebuiltinfunctions.cpp b/src/declarative/qml/v8/qdeclarativebuiltinfunctions.cpp
deleted file mode 100644
index 12f06e6b76..0000000000
--- a/src/declarative/qml/v8/qdeclarativebuiltinfunctions.cpp
+++ /dev/null
@@ -1,1320 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies).
-** Contact: http://www.qt-project.org/
-**
-** This file is part of the QtDeclarative module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** GNU Lesser General Public License Usage
-** This file may be used under the terms of the GNU Lesser General Public
-** License version 2.1 as published by the Free Software Foundation and
-** appearing in the file LICENSE.LGPL included in the packaging of this
-** file. Please review the following information to ensure the GNU Lesser
-** General Public License version 2.1 requirements will be met:
-** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
-**
-** In addition, as a special exception, Nokia gives you certain additional
-** rights. These rights are described in the Nokia Qt LGPL Exception
-** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU General
-** Public License version 3.0 as published by the Free Software Foundation
-** and appearing in the file LICENSE.GPL included in the packaging of this
-** file. Please review the following information to ensure the GNU General
-** Public License version 3.0 requirements will be met:
-** http://www.gnu.org/copyleft/gpl.html.
-**
-** Other Usage
-** Alternatively, this file may be used in accordance with the terms and
-** conditions contained in a signed written agreement between you and Nokia.
-**
-**
-**
-**
-**
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#include "qdeclarativebuiltinfunctions_p.h"
-
-#include <QtDeclarative/qdeclarativecomponent.h>
-#include <private/qdeclarativeengine_p.h>
-#include <private/qdeclarativecomponent_p.h>
-#include <private/qdeclarativestringconverters_p.h>
-#include <private/qdeclarativelocale_p.h>
-#include <private/qv8engine_p.h>
-#include <private/qjsconverter_impl_p.h>
-
-#include <private/qv8profilerservice_p.h>
-#include <private/qdeclarativeprofilerservice_p.h>
-
-#include <QtCore/qstring.h>
-#include <QtCore/qdatetime.h>
-#include <QtCore/qcryptographichash.h>
-#include <QtCore/qrect.h>
-#include <QtCore/qsize.h>
-#include <QtCore/qpoint.h>
-#include <QtCore/qurl.h>
-#include <QtCore/qfile.h>
-#include <QtCore/qcoreapplication.h>
-
-#include <QtGui/qcolor.h>
-#include <QtGui/qvector3d.h>
-#include <QtGui/qvector4d.h>
-#include <QtGui/qdesktopservices.h>
-#include <QtGui/qfontdatabase.h>
-
-QT_BEGIN_NAMESPACE
-
-namespace QDeclarativeBuiltinFunctions {
-
-enum ConsoleLogTypes {
- Log,
- Warn,
- Error
-};
-
-static void jsContext(v8::Handle<v8::Value> *file, int *line, v8::Handle<v8::Value> *function) {
- v8::Local<v8::StackTrace> stackTrace = v8::StackTrace::CurrentStackTrace(1);
- if (stackTrace->GetFrameCount()) {
- v8::Local<v8::StackFrame> frame = stackTrace->GetFrame(0);
- *file = frame->GetScriptName();
- *line = frame->GetLineNumber();
- *function = frame->GetFunctionName();
- }
-}
-
-static QString jsStack() {
- QStringList stackFrames;
-
- //The v8 default is currently 10 stack frames.
- v8::Handle<v8::StackTrace> stackTrace =
- v8::StackTrace::CurrentStackTrace(10, v8::StackTrace::kOverview);
- int stackCount = stackTrace->GetFrameCount();
-
- for (int i = 0; i < stackCount; i++) {
- v8::Local<v8::StackFrame> frame = stackTrace->GetFrame(i);
- v8::Handle<v8::String> function(frame->GetFunctionName());
- v8::Handle<v8::String> script(frame->GetScriptName());
- int lineNumber = frame->GetLineNumber();
- int columnNumber = frame->GetColumn();
-
- QString stackFrame =
- QString::fromLatin1("%1 (%2:%3:%4)").arg(QJSConverter::toString(function),
- QJSConverter::toString(script),
- QString::number(lineNumber),
- QString::number(columnNumber));
- stackFrames.append(stackFrame);
- }
- return stackFrames.join(QLatin1String("\n"));
-}
-
-v8::Handle<v8::Value> console(ConsoleLogTypes logType, const v8::Arguments &args,
- bool printStack = false)
-{
- v8::HandleScope handleScope;
-
- QString result;
- for (int i = 0; i < args.Length(); ++i) {
- if (i != 0)
- result.append(QLatin1Char(' '));
-
- v8::Local<v8::Value> value = args[i];
- //Check for Object Type
- if (value->IsObject() && !value->IsFunction()
- && !value->IsArray() && !value->IsDate()
- && !value->IsRegExp()) {
- result.append(QLatin1String("Object"));
- } else {
- v8::Local<v8::String> jsstr = value->ToString();
- QString tmp = V8ENGINE()->toString(jsstr);
- if (value->IsArray())
- result.append(QString::fromLatin1("[%1]").arg(tmp));
- else
- result.append(tmp);
- }
- }
-
- if (printStack) {
- result.append(QLatin1String("\n"));
- result.append(jsStack());
- }
-
- v8::Handle<v8::Value> fileHandle;
- v8::Handle<v8::Value> functionHandle;
- int line;
-
- jsContext(&fileHandle, &line, &functionHandle);
-
- switch (logType) {
- case Log:
- QMessageLogger(*v8::String::AsciiValue(fileHandle), line,
- *v8::String::AsciiValue(functionHandle)).debug("%s", qPrintable(result));
- break;
- case Warn:
- QMessageLogger(*v8::String::AsciiValue(fileHandle), line,
- *v8::String::AsciiValue(functionHandle)).warning("%s", qPrintable(result));
- break;
- case Error:
- QMessageLogger(*v8::String::AsciiValue(fileHandle), line,
- *v8::String::AsciiValue(functionHandle)).critical("%s", qPrintable(result));
- break;
- default:
- break;
- }
-
- return v8::Undefined();
-}
-
-v8::Handle<v8::Value> gc(const v8::Arguments &args)
-{
- Q_UNUSED(args);
- QV8Engine::gc();
- return v8::Undefined();
-}
-
-v8::Handle<v8::Value> consoleError(const v8::Arguments &args)
-{
- return console(Error, args);
-}
-
-v8::Handle<v8::Value> consoleLog(const v8::Arguments &args)
-{
- //console.log
- //console.debug
- //console.info
- //print
- return console(Log, args);
-}
-
-v8::Handle<v8::Value> consoleProfile(const v8::Arguments &args)
-{
- //DeclarativeDebugTrace cannot handle nested profiling
- //although v8 can handle several profiling at once,
- //we do not allow that. Hence, we pass an empty(default) title
- Q_UNUSED(args);
- QString title;
-
-
-
- v8::Handle<v8::Value> file;
- v8::Handle<v8::Value> function;
- int line;
- jsContext(&file, &line, &function);
-
- if (QDeclarativeProfilerService::startProfiling()) {
- QV8ProfilerService::instance()->startProfiling(title);
-
- QMessageLogger(*v8::String::AsciiValue(file), line,
- *v8::String::AsciiValue(function)).debug("Profiling started.");
- } else {
- QMessageLogger(*v8::String::AsciiValue(file), line,
- *v8::String::AsciiValue(function)).warning(
- "Profiling is already in progress. First, end current profiling session.");
- }
-
- return v8::Undefined();
-}
-
-v8::Handle<v8::Value> consoleProfileEnd(const v8::Arguments &args)
-{
- //DeclarativeDebugTrace cannot handle nested profiling
- //although v8 can handle several profiling at once,
- //we do not allow that. Hence, we pass an empty(default) title
- Q_UNUSED(args);
- QString title;
-
- v8::Handle<v8::Value> file;
- v8::Handle<v8::Value> function;
- int line;
- jsContext(&file, &line, &function);
-
- if (QDeclarativeProfilerService::stopProfiling()) {
- QV8ProfilerService *profiler = QV8ProfilerService::instance();
- profiler->stopProfiling(title);
- QDeclarativeProfilerService::sendProfilingData();
- profiler->sendProfilingData();
-
- QMessageLogger(*v8::String::AsciiValue(file), line,
- *v8::String::AsciiValue(function)).debug("Profiling ended.");
- } else {
- QMessageLogger(*v8::String::AsciiValue(file), line,
- *v8::String::AsciiValue(function)).warning("Profiling was not started.");
- }
-
- return v8::Undefined();
-}
-
-v8::Handle<v8::Value> consoleTime(const v8::Arguments &args)
-{
- if (args.Length() != 1)
- V8THROW_ERROR("console.time(): Invalid arguments");
- QString name = V8ENGINE()->toString(args[0]);
- V8ENGINE()->startTimer(name);
- return v8::Undefined();
-}
-
-v8::Handle<v8::Value> consoleTimeEnd(const v8::Arguments &args)
-{
- if (args.Length() != 1)
- V8THROW_ERROR("console.time(): Invalid arguments");
- QString name = V8ENGINE()->toString(args[0]);
- bool wasRunning;
- qint64 elapsed = V8ENGINE()->stopTimer(name, &wasRunning);
- if (wasRunning) {
- qDebug("%s: %llims", qPrintable(name), elapsed);
- }
- return v8::Undefined();
-}
-
-v8::Handle<v8::Value> consoleCount(const v8::Arguments &args)
-{
- // first argument: name to print. Ignore any additional arguments
- QString name;
- if (args.Length() > 0)
- name = V8ENGINE()->toString(args[0]);
-
- v8::Handle<v8::StackTrace> stackTrace =
- v8::StackTrace::CurrentStackTrace(1, v8::StackTrace::kOverview);
-
- if (stackTrace->GetFrameCount()) {
- v8::Local<v8::StackFrame> frame = stackTrace->GetFrame(0);
-
- QString scriptName = V8ENGINE()->toString(frame->GetScriptName());
- QString functionName = V8ENGINE()->toString(frame->GetFunctionName());
- int line = frame->GetLineNumber();
- int column = frame->GetColumn();
-
- int value = V8ENGINE()->consoleCountHelper(scriptName, line, column);
- QString message = name + QLatin1String(": ") + QString::number(value);
-
- QMessageLogger(qPrintable(scriptName), line,
- qPrintable(functionName)).debug("%s", qPrintable(message));
- }
-
- return v8::Undefined();
-}
-
-v8::Handle<v8::Value> consoleTrace(const v8::Arguments &args)
-{
- if (args.Length() != 0)
- V8THROW_ERROR("console.trace(): Invalid arguments");
-
- QString stack = jsStack();
-
- v8::Handle<v8::Value> file;
- v8::Handle<v8::Value> function;
- int line;
- jsContext(&file, &line, &function);
-
- QMessageLogger(*v8::String::AsciiValue(file), line, *v8::String::AsciiValue(function)).debug(
- "%s", qPrintable(stack));
- return v8::Undefined();
-}
-
-v8::Handle<v8::Value> consoleWarn(const v8::Arguments &args)
-{
- return console(Warn, args);
-}
-
-v8::Handle<v8::Value> consoleAssert(const v8::Arguments &args)
-{
- if (args.Length() == 0)
- V8THROW_ERROR("console.assert(): Missing argument");
-
- if (!args[0]->ToBoolean()->Value()) {
- QString message;
- for (int i = 1; i < args.Length(); ++i) {
- if (i != 1)
- message.append(QLatin1Char(' '));
-
- v8::Local<v8::Value> value = args[i];
- message.append(V8ENGINE()->toString(value->ToString()));
- }
-
- QString stack = jsStack();
-
- v8::Handle<v8::Value> file;
- v8::Handle<v8::Value> function;
- int line;
- jsContext(&file, &line, &function);
-
- QMessageLogger(*v8::String::AsciiValue(file), line, *v8::String::AsciiValue(function)).critical(
- "%s\n%s", qPrintable(message), qPrintable(stack));
-
- }
- return v8::Undefined();
-}
-
-v8::Handle<v8::Value> consoleException(const v8::Arguments &args)
-{
- if (args.Length() == 0)
- V8THROW_ERROR("console.exception(): Missing argument");
-
- console(Error, args, true);
-
- return v8::Undefined();
-}
-
-v8::Handle<v8::Value> stringArg(const v8::Arguments &args)
-{
- QString value = V8ENGINE()->toString(args.This()->ToString());
- if (args.Length() != 1)
- V8THROW_ERROR("String.arg(): Invalid arguments");
-
- v8::Handle<v8::Value> arg = args[0];
- if (arg->IsUint32())
- return V8ENGINE()->toString(value.arg(arg->Uint32Value()));
- else if (arg->IsInt32())
- return V8ENGINE()->toString(value.arg(arg->Int32Value()));
- else if (arg->IsNumber())
- return V8ENGINE()->toString(value.arg(arg->NumberValue()));
- else if (arg->IsBoolean())
- return V8ENGINE()->toString(value.arg(arg->BooleanValue()));
-
- return V8ENGINE()->toString(value.arg(V8ENGINE()->toString(arg)));
-}
-
-/*!
-\qmlmethod bool Qt::isQtObject(object)
-Returns true if \c object is a valid reference to a Qt or QML object, otherwise false.
-*/
-v8::Handle<v8::Value> isQtObject(const v8::Arguments &args)
-{
- if (args.Length() == 0)
- return v8::Boolean::New(false);
-
- return v8::Boolean::New(0 != V8ENGINE()->toQObject(args[0]));
-}
-
-/*!
-\qmlmethod color Qt::rgba(real red, real green, real blue, real alpha)
-
-Returns a color with the specified \c red, \c green, \c blue and \c alpha components.
-All components should be in the range 0-1 inclusive.
-*/
-v8::Handle<v8::Value> rgba(const v8::Arguments &args)
-{
- int argCount = args.Length();
- if (argCount < 3 || argCount > 4)
- V8THROW_ERROR("Qt.rgba(): Invalid arguments");
-
- double r = args[0]->NumberValue();
- double g = args[1]->NumberValue();
- double b = args[2]->NumberValue();
- double a = (argCount == 4) ? args[3]->NumberValue() : 1;
-
- if (r < 0.0) r=0.0;
- if (r > 1.0) r=1.0;
- if (g < 0.0) g=0.0;
- if (g > 1.0) g=1.0;
- if (b < 0.0) b=0.0;
- if (b > 1.0) b=1.0;
- if (a < 0.0) a=0.0;
- if (a > 1.0) a=1.0;
-
- return V8ENGINE()->fromVariant(QVariant::fromValue(QColor::fromRgbF(r, g, b, a)));
-}
-
-/*!
-\qmlmethod color Qt::hsla(real hue, real saturation, real lightness, real alpha)
-
-Returns a color with the specified \c hue, \c saturation, \c lightness and \c alpha components.
-All components should be in the range 0-1 inclusive.
-*/
-v8::Handle<v8::Value> hsla(const v8::Arguments &args)
-{
- int argCount = args.Length();
- if (argCount < 3 || argCount > 4)
- V8THROW_ERROR("Qt.hsla(): Invalid arguments");
-
- double h = args[0]->NumberValue();
- double s = args[1]->NumberValue();
- double l = args[2]->NumberValue();
- double a = (argCount == 4) ? args[3]->NumberValue() : 1;
-
- if (h < 0.0) h=0.0;
- if (h > 1.0) h=1.0;
- if (s < 0.0) s=0.0;
- if (s > 1.0) s=1.0;
- if (l < 0.0) l=0.0;
- if (l > 1.0) l=1.0;
- if (a < 0.0) a=0.0;
- if (a > 1.0) a=1.0;
-
- return V8ENGINE()->fromVariant(QVariant::fromValue(QColor::fromHslF(h, s, l, a)));
-}
-
-/*!
-\qmlmethod rect Qt::rect(int x, int y, int width, int height)
-
-Returns a \c rect with the top-left corner at \c x, \c y and the specified \c width and \c height.
-
-The returned object has \c x, \c y, \c width and \c height attributes with the given values.
-*/
-v8::Handle<v8::Value> rect(const v8::Arguments &args)
-{
- if (args.Length() != 4)
- V8THROW_ERROR("Qt.rect(): Invalid arguments");
-
- double x = args[0]->NumberValue();
- double y = args[1]->NumberValue();
- double w = args[2]->NumberValue();
- double h = args[3]->NumberValue();
-
- return V8ENGINE()->fromVariant(QVariant::fromValue(QRectF(x, y, w, h)));
-}
-
-/*!
-\qmlmethod point Qt::point(int x, int y)
-Returns a Point with the specified \c x and \c y coordinates.
-*/
-v8::Handle<v8::Value> point(const v8::Arguments &args)
-{
- if (args.Length() != 2)
- V8THROW_ERROR("Qt.point(): Invalid arguments");
-
- double x = args[0]->ToNumber()->Value();
- double y = args[1]->ToNumber()->Value();
-
- return V8ENGINE()->fromVariant(QVariant::fromValue(QPointF(x, y)));
-}
-
-/*!
-\qmlmethod Qt::size(int width, int height)
-Returns a Size with the specified \c width and \c height.
-*/
-v8::Handle<v8::Value> size(const v8::Arguments &args)
-{
- if (args.Length() != 2)
- V8THROW_ERROR("Qt.size(): Invalid arguments");
-
- double w = args[0]->ToNumber()->Value();
- double h = args[1]->ToNumber()->Value();
-
- return V8ENGINE()->fromVariant(QVariant::fromValue(QSizeF(w, h)));
-}
-
-/*!
-\qmlmethod Qt::vector3d(real x, real y, real z)
-Returns a Vector3D with the specified \c x, \c y and \c z.
-*/
-v8::Handle<v8::Value> vector3d(const v8::Arguments &args)
-{
- if (args.Length() != 3)
- V8THROW_ERROR("Qt.vector(): Invalid arguments");
-
- double x = args[0]->ToNumber()->Value();
- double y = args[1]->ToNumber()->Value();
- double z = args[2]->ToNumber()->Value();
-
- return V8ENGINE()->fromVariant(QVariant::fromValue(QVector3D(x, y, z)));
-}
-
-/*!
-\qmlmethod Qt::vector4d(real x, real y, real z, real w)
-Returns a Vector4D with the specified \c x, \c y, \c z and \c w.
-*/
-v8::Handle<v8::Value> vector4d(const v8::Arguments &args)
-{
- if (args.Length() != 4)
- V8THROW_ERROR("Qt.vector4d(): Invalid arguments");
-
- double x = args[0]->NumberValue();
- double y = args[1]->NumberValue();
- double z = args[2]->NumberValue();
- double w = args[3]->NumberValue();
-
- return V8ENGINE()->fromVariant(QVariant::fromValue(QVector4D(x, y, z, w)));
-}
-
-/*!
-\qmlmethod color Qt::lighter(color baseColor, real factor)
-Returns a color lighter than \c baseColor by the \c factor provided.
-
-If the factor is greater than 1.0, this functions returns a lighter color.
-Setting factor to 1.5 returns a color that is 50% brighter. If the factor is less than 1.0,
-the return color is darker, but we recommend using the Qt.darker() function for this purpose.
-If the factor is 0 or negative, the return value is unspecified.
-
-The function converts the current RGB color to HSV, multiplies the value (V) component
-by factor and converts the color back to RGB.
-
-If \c factor is not supplied, returns a color 50% lighter than \c baseColor (factor 1.5).
-*/
-v8::Handle<v8::Value> lighter(const v8::Arguments &args)
-{
- if (args.Length() != 1 && args.Length() != 2)
- V8THROW_ERROR("Qt.lighter(): Invalid arguments");
-
- QColor color;
- QVariant v = V8ENGINE()->toVariant(args[0], -1);
- if (v.userType() == QVariant::Color) {
- color = v.value<QColor>();
- } else if (v.userType() == QVariant::String) {
- bool ok = false;
- color = QDeclarativeStringConverters::colorFromString(v.toString(), &ok);
- if (!ok) {
- return v8::Null();
- }
- } else {
- return v8::Null();
- }
-
- qreal factor = 1.5;
- if (args.Length() == 2)
- factor = args[1]->ToNumber()->Value();
-
- color = color.lighter(int(qRound(factor*100.)));
- return V8ENGINE()->fromVariant(QVariant::fromValue(color));
-}
-
-/*!
-\qmlmethod color Qt::darker(color baseColor, real factor)
-Returns a color darker than \c baseColor by the \c factor provided.
-
-If the factor is greater than 1.0, this function returns a darker color.
-Setting factor to 3.0 returns a color that has one-third the brightness.
-If the factor is less than 1.0, the return color is lighter, but we recommend using
-the Qt.lighter() function for this purpose. If the factor is 0 or negative, the return
-value is unspecified.
-
-The function converts the current RGB color to HSV, divides the value (V) component
-by factor and converts the color back to RGB.
-
-If \c factor is not supplied, returns a color 50% darker than \c baseColor (factor 2.0).
-*/
-v8::Handle<v8::Value> darker(const v8::Arguments &args)
-{
- if (args.Length() != 1 && args.Length() != 2)
- V8THROW_ERROR("Qt.darker(): Invalid arguments");
-
- QColor color;
- QVariant v = V8ENGINE()->toVariant(args[0], -1);
- if (v.userType() == QVariant::Color) {
- color = v.value<QColor>();
- } else if (v.userType() == QVariant::String) {
- bool ok = false;
- color = QDeclarativeStringConverters::colorFromString(v.toString(), &ok);
- if (!ok) {
- return v8::Null();
- }
- } else {
- return v8::Null();
- }
-
- qreal factor = 2.0;
- if (args.Length() == 2)
- factor = args[1]->ToNumber()->Value();
-
- color = color.darker(int(qRound(factor*100.)));
- return V8ENGINE()->fromVariant(QVariant::fromValue(color));
-}
-
-/*!
- \qmlmethod color Qt::tint(color baseColor, color tintColor)
- This function allows tinting one color with another.
-
- The tint color should usually be mostly transparent, or you will not be
- able to see the underlying color. The below example provides a slight red
- tint by having the tint color be pure red which is only 1/16th opaque.
-
- \qml
- Item {
- Rectangle {
- x: 0; width: 80; height: 80
- color: "lightsteelblue"
- }
- Rectangle {
- x: 100; width: 80; height: 80
- color: Qt.tint("lightsteelblue", "#10FF0000")
- }
- }
- \endqml
- \image declarative-rect_tint.png
-
- Tint is most useful when a subtle change is intended to be conveyed due to some event; you can then use tinting to more effectively tune the visible color.
-*/
-v8::Handle<v8::Value> tint(const v8::Arguments &args)
-{
- if (args.Length() != 2)
- V8THROW_ERROR("Qt.tint(): Invalid arguments");
-
- // base color
- QColor color;
- QVariant v = V8ENGINE()->toVariant(args[0], -1);
- if (v.userType() == QVariant::Color) {
- color = v.value<QColor>();
- } else if (v.userType() == QVariant::String) {
- bool ok = false;
- color = QDeclarativeStringConverters::colorFromString(v.toString(), &ok);
- if (!ok) {
- return v8::Null();
- }
- } else {
- return v8::Null();
- }
-
- // tint color
- QColor tintColor;
- v = V8ENGINE()->toVariant(args[1], -1);
- if (v.userType() == QVariant::Color) {
- tintColor = v.value<QColor>();
- } else if (v.userType() == QVariant::String) {
- bool ok = false;
- tintColor = QDeclarativeStringConverters::colorFromString(v.toString(), &ok);
- if (!ok) {
- return v8::Null();
- }
- } else {
- return v8::Null();
- }
-
- // tint the base color and return the final color
- QColor finalColor;
- int a = tintColor.alpha();
- if (a == 0xFF)
- finalColor = tintColor;
- else if (a == 0x00)
- finalColor = color;
- else {
- qreal a = tintColor.alphaF();
- qreal inv_a = 1.0 - a;
-
- finalColor.setRgbF(tintColor.redF() * a + color.redF() * inv_a,
- tintColor.greenF() * a + color.greenF() * inv_a,
- tintColor.blueF() * a + color.blueF() * inv_a,
- a + inv_a * color.alphaF());
- }
-
- return V8ENGINE()->fromVariant(QVariant::fromValue(finalColor));
-}
-
-/*!
-\qmlmethod string Qt::formatDate(datetime date, variant format)
-
-Returns a string representation of \c date, optionally formatted according
-to \c format.
-
-The \a date parameter may be a JavaScript \c Date object, a \l{date}{date}
-property, a QDate, or QDateTime value. The \a format parameter may be any of
-the possible format values as described for
-\l{QML:Qt::formatDateTime()}{Qt.formatDateTime()}.
-
-If \a format is not specified, \a date is formatted using
-\l {Qt::DefaultLocaleShortDate}{Qt.DefaultLocaleShortDate}.
-
-\sa Locale
-*/
-v8::Handle<v8::Value> formatDate(const v8::Arguments &args)
-{
- if (args.Length() < 1 || args.Length() > 2)
- V8THROW_ERROR("Qt.formatDate(): Invalid arguments");
-
- Qt::DateFormat enumFormat = Qt::DefaultLocaleShortDate;
- QDate date = V8ENGINE()->toVariant(args[0], -1).toDateTime().date();
- QString formattedDate;
- if (args.Length() == 2) {
- if (args[1]->IsString()) {
- QString format = V8ENGINE()->toVariant(args[1], -1).toString();
- formattedDate = date.toString(format);
- } else if (args[1]->IsNumber()) {
- quint32 intFormat = args[1]->ToNumber()->Value();
- Qt::DateFormat format = Qt::DateFormat(intFormat);
- formattedDate = date.toString(format);
- } else {
- V8THROW_ERROR("Qt.formatDate(): Invalid date format");
- }
- } else {
- formattedDate = date.toString(enumFormat);
- }
-
- return V8ENGINE()->fromVariant(QVariant::fromValue(formattedDate));
-}
-
-/*!
-\qmlmethod string Qt::formatTime(datetime time, variant format)
-
-Returns a string representation of \c time, optionally formatted according to
-\c format.
-
-The \a time parameter may be a JavaScript \c Date object, a QTime, or QDateTime
-value. The \a format parameter may be any of the possible format values as
-described for \l{QML:Qt::formatDateTime()}{Qt.formatDateTime()}.
-
-If \a format is not specified, \a time is formatted using
-\l {Qt::DefaultLocaleShortDate}{Qt.DefaultLocaleShortDate}.
-
-\sa Locale
-*/
-v8::Handle<v8::Value> formatTime(const v8::Arguments &args)
-{
- if (args.Length() < 1 || args.Length() > 2)
- V8THROW_ERROR("Qt.formatTime(): Invalid arguments");
-
- QVariant argVariant = V8ENGINE()->toVariant(args[0], -1);
- QTime time;
- if (args[0]->IsDate() || (argVariant.type() == QVariant::String))
- time = argVariant.toDateTime().time();
- else // if (argVariant.type() == QVariant::Time), or invalid.
- time = argVariant.toTime();
-
- Qt::DateFormat enumFormat = Qt::DefaultLocaleShortDate;
- QString formattedTime;
- if (args.Length() == 2) {
- if (args[1]->IsString()) {
- QString format = V8ENGINE()->toVariant(args[1], -1).toString();
- formattedTime = time.toString(format);
- } else if (args[1]->IsNumber()) {
- quint32 intFormat = args[1]->ToNumber()->Value();
- Qt::DateFormat format = Qt::DateFormat(intFormat);
- formattedTime = time.toString(format);
- } else {
- V8THROW_ERROR("Qt.formatTime(): Invalid time format");
- }
- } else {
- formattedTime = time.toString(enumFormat);
- }
-
- return V8ENGINE()->fromVariant(QVariant::fromValue(formattedTime));
-}
-
-/*!
-\qmlmethod string Qt::formatDateTime(datetime dateTime, variant format)
-
-Returns a string representation of \c datetime, optionally formatted according to
-\c format.
-
-The \a date parameter may be a JavaScript \c Date object, a \l{date}{date}
-property, a QDate, QTime, or QDateTime value.
-
-If \a format is not provided, \a dateTime is formatted using
-\l {Qt::DefaultLocaleShortDate}{Qt.DefaultLocaleShortDate}. Otherwise,
-\a format should be either:
-
-\list
-\o One of the Qt::DateFormat enumeration values, such as
- \c Qt.DefaultLocaleShortDate or \c Qt.ISODate
-\o A string that specifies the format of the returned string, as detailed below.
-\endlist
-
-If \a format specifies a format string, it should use the following expressions
-to specify the date:
-
- \table
- \header \i Expression \i Output
- \row \i d \i the day as number without a leading zero (1 to 31)
- \row \i dd \i the day as number with a leading zero (01 to 31)
- \row \i ddd
- \i the abbreviated localized day name (e.g. 'Mon' to 'Sun').
- Uses QDate::shortDayName().
- \row \i dddd
- \i the long localized day name (e.g. 'Monday' to 'Qt::Sunday').
- Uses QDate::longDayName().
- \row \i M \i the month as number without a leading zero (1-12)
- \row \i MM \i the month as number with a leading zero (01-12)
- \row \i MMM
- \i the abbreviated localized month name (e.g. 'Jan' to 'Dec').
- Uses QDate::shortMonthName().
- \row \i MMMM
- \i the long localized month name (e.g. 'January' to 'December').
- Uses QDate::longMonthName().
- \row \i yy \i the year as two digit number (00-99)
- \row \i yyyy \i the year as four digit number
- \endtable
-
-In addition the following expressions can be used to specify the time:
-
- \table
- \header \i Expression \i Output
- \row \i h
- \i the hour without a leading zero (0 to 23 or 1 to 12 if AM/PM display)
- \row \i hh
- \i the hour with a leading zero (00 to 23 or 01 to 12 if AM/PM display)
- \row \i m \i the minute without a leading zero (0 to 59)
- \row \i mm \i the minute with a leading zero (00 to 59)
- \row \i s \i the second without a leading zero (0 to 59)
- \row \i ss \i the second with a leading zero (00 to 59)
- \row \i z \i the milliseconds without leading zeroes (0 to 999)
- \row \i zzz \i the milliseconds with leading zeroes (000 to 999)
- \row \i AP
- \i use AM/PM display. \e AP will be replaced by either "AM" or "PM".
- \row \i ap
- \i use am/pm display. \e ap will be replaced by either "am" or "pm".
- \endtable
-
- All other input characters will be ignored. Any sequence of characters that
- are enclosed in single quotes will be treated as text and not be used as an
- expression. Two consecutive single quotes ("''") are replaced by a single quote
- in the output.
-
-For example, if the following date/time value was specified:
-
- \code
- // 21 May 2001 14:13:09
- var dateTime = new Date(2001, 5, 21, 14, 13, 09)
- \endcode
-
-This \a dateTime value could be passed to \c Qt.formatDateTime(),
-\l {QML:Qt::formatDate()}{Qt.formatDate()} or \l {QML:Qt::formatTime()}{Qt.formatTime()}
-with the \a format values below to produce the following results:
-
- \table
- \header \i Format \i Result
- \row \i "dd.MM.yyyy" \i 21.05.2001
- \row \i "ddd MMMM d yy" \i Tue May 21 01
- \row \i "hh:mm:ss.zzz" \i 14:13:09.042
- \row \i "h:m:s ap" \i 2:13:9 pm
- \endtable
-
- \sa Locale
-*/
-v8::Handle<v8::Value> formatDateTime(const v8::Arguments &args)
-{
- if (args.Length() < 1 || args.Length() > 2)
- V8THROW_ERROR("Qt.formatDateTime(): Invalid arguments");
-
- Qt::DateFormat enumFormat = Qt::DefaultLocaleShortDate;
- QDateTime dt = V8ENGINE()->toVariant(args[0], -1).toDateTime();
- QString formattedDt;
- if (args.Length() == 2) {
- if (args[1]->IsString()) {
- QString format = V8ENGINE()->toVariant(args[1], -1).toString();
- formattedDt = dt.toString(format);
- } else if (args[1]->IsNumber()) {
- quint32 intFormat = args[1]->ToNumber()->Value();
- Qt::DateFormat format = Qt::DateFormat(intFormat);
- formattedDt = dt.toString(format);
- } else {
- V8THROW_ERROR("Qt.formatDateTime(): Invalid datetime format");
- }
- } else {
- formattedDt = dt.toString(enumFormat);
- }
-
- return V8ENGINE()->fromVariant(QVariant::fromValue(formattedDt));
-}
-
-/*!
-\qmlmethod bool Qt::openUrlExternally(url target)
-Attempts to open the specified \c target url in an external application, based on the user's desktop preferences. Returns true if it succeeds, and false otherwise.
-*/
-v8::Handle<v8::Value> openUrlExternally(const v8::Arguments &args)
-{
- if (args.Length() != 1)
- return V8ENGINE()->fromVariant(false);
-
- bool ret = false;
-#ifndef QT_NO_DESKTOPSERVICES
- ret = QDesktopServices::openUrl(V8ENGINE()->toVariant(resolvedUrl(args), -1).toUrl());
-#endif
- return V8ENGINE()->fromVariant(ret);
-}
-
-/*!
- \qmlmethod url Qt::resolvedUrl(url url)
- Returns \a url resolved relative to the URL of the caller.
-*/
-v8::Handle<v8::Value> resolvedUrl(const v8::Arguments &args)
-{
- QUrl url = V8ENGINE()->toVariant(args[0], -1).toUrl();
- QDeclarativeEngine *e = V8ENGINE()->engine();
- QDeclarativeEnginePrivate *p = 0;
- if (e) p = QDeclarativeEnginePrivate::get(e);
- if (p) {
- QDeclarativeContextData *ctxt = V8ENGINE()->callingContext();
- if (ctxt)
- return V8ENGINE()->toString(ctxt->resolvedUrl(url).toString());
- else
- return V8ENGINE()->toString(url.toString());
- }
-
- return V8ENGINE()->toString(e->baseUrl().resolved(url).toString());
-}
-
-/*!
-\qmlmethod list<string> Qt::fontFamilies()
-Returns a list of the font families available to the application.
-*/
-v8::Handle<v8::Value> fontFamilies(const v8::Arguments &args)
-{
- if (args.Length() != 0)
- V8THROW_ERROR("Qt.fontFamilies(): Invalid arguments");
-
- QFontDatabase database;
- return V8ENGINE()->fromVariant(database.families());
-}
-
-/*!
-\qmlmethod string Qt::md5(data)
-Returns a hex string of the md5 hash of \c data.
-*/
-v8::Handle<v8::Value> md5(const v8::Arguments &args)
-{
- if (args.Length() != 1)
- V8THROW_ERROR("Qt.md5(): Invalid arguments");
-
- QByteArray data = V8ENGINE()->toString(args[0]->ToString()).toUtf8();
- QByteArray result = QCryptographicHash::hash(data, QCryptographicHash::Md5);
- return V8ENGINE()->toString(QLatin1String(result.toHex()));
-}
-
-/*!
-\qmlmethod string Qt::btoa(data)
-Binary to ASCII - this function returns a base64 encoding of \c data.
-*/
-v8::Handle<v8::Value> btoa(const v8::Arguments &args)
-{
- if (args.Length() != 1)
- V8THROW_ERROR("Qt.btoa(): Invalid arguments");
-
- QByteArray data = V8ENGINE()->toString(args[0]->ToString()).toUtf8();
-
- return V8ENGINE()->toString(QLatin1String(data.toBase64()));
-}
-
-/*!
-\qmlmethod string Qt::atob(data)
-ASCII to binary - this function returns a base64 decoding of \c data.
-*/
-v8::Handle<v8::Value> atob(const v8::Arguments &args)
-{
- if (args.Length() != 1)
- V8THROW_ERROR("Qt.atob(): Invalid arguments");
-
- QByteArray data = V8ENGINE()->toString(args[0]->ToString()).toUtf8();
-
- return V8ENGINE()->toString(QLatin1String(QByteArray::fromBase64(data)));
-}
-
-/*!
-\qmlmethod Qt::quit()
-This function causes the QDeclarativeEngine::quit() signal to be emitted.
-Within the \l {QML Viewer}, this causes the launcher application to exit;
-to quit a C++ application when this method is called, connect the
-QDeclarativeEngine::quit() signal to the QCoreApplication::quit() slot.
-*/
-v8::Handle<v8::Value> quit(const v8::Arguments &args)
-{
- QDeclarativeEnginePrivate::get(V8ENGINE()->engine())->sendQuit();
- return v8::Undefined();
-}
-
-/*!
-\qmlmethod object Qt::createQmlObject(string qml, object parent, string filepath)
-
-Returns a new object created from the given \a string of QML which will have the specified \a parent,
-or \c null if there was an error in creating the object.
-
-If \a filepath is specified, it will be used for error reporting for the created object.
-
-Example (where \c parentItem is the id of an existing QML item):
-
-\snippet doc/src/snippets/declarative/createQmlObject.qml 0
-
-In the case of an error, a QtScript Error object is thrown. This object has an additional property,
-\c qmlErrors, which is an array of the errors encountered.
-Each object in this array has the members \c lineNumber, \c columnNumber, \c fileName and \c message.
-For example, if the above snippet had misspelled color as 'colro' then the array would contain an object like the following:
-{ "lineNumber" : 1, "columnNumber" : 32, "fileName" : "dynamicSnippet1", "message" : "Cannot assign to non-existent property \"colro\""}.
-
-Note that this function returns immediately, and therefore may not work if
-the \a qml string loads new components (that is, external QML files that have not yet been loaded).
-If this is the case, consider using \l{QML:Qt::createComponent()}{Qt.createComponent()} instead.
-
-See \l {Dynamic Object Management in QML} for more information on using this function.
-*/
-v8::Handle<v8::Value> createQmlObject(const v8::Arguments &args)
-{
- if (args.Length() < 2 || args.Length() > 3)
- V8THROW_ERROR("Qt.createQmlObject(): Invalid arguments");
-
- struct Error {
- static v8::Local<v8::Value> create(QV8Engine *engine, const QList<QDeclarativeError> &errors) {
- QString errorstr = QLatin1String("Qt.createQmlObject(): failed to create object: ");
-
- v8::Local<v8::Array> qmlerrors = v8::Array::New(errors.count());
- for (int ii = 0; ii < errors.count(); ++ii) {
- const QDeclarativeError &error = errors.at(ii);
- errorstr += QLatin1String("\n ") + error.toString();
- v8::Local<v8::Object> qmlerror = v8::Object::New();
- qmlerror->Set(v8::String::New("lineNumber"), v8::Integer::New(error.line()));
- qmlerror->Set(v8::String::New("columnNumber"), v8::Integer::New(error.column()));
- qmlerror->Set(v8::String::New("fileName"), engine->toString(error.url().toString()));
- qmlerror->Set(v8::String::New("message"), engine->toString(error.description()));
- qmlerrors->Set(ii, qmlerror);
- }
-
- v8::Local<v8::Value> error = v8::Exception::Error(engine->toString(errorstr));
- v8::Local<v8::Object> errorObject = error->ToObject();
- errorObject->Set(v8::String::New("qmlErrors"), qmlerrors);
- return error;
- }
- };
-
- QV8Engine *v8engine = V8ENGINE();
- QDeclarativeEngine *engine = v8engine->engine();
-
- QDeclarativeContextData *context = v8engine->callingContext();
- QDeclarativeContext *effectiveContext = 0;
- if (context->isPragmaLibraryContext)
- effectiveContext = engine->rootContext();
- else
- effectiveContext = context->asQDeclarativeContext();
- Q_ASSERT(context && effectiveContext);
-
- QString qml = v8engine->toString(args[0]->ToString());
- if (qml.isEmpty())
- return v8::Null();
-
- QUrl url;
- if (args.Length() > 2)
- url = QUrl(v8engine->toString(args[2]->ToString()));
- else
- url = QUrl(QLatin1String("inline"));
-
- if (url.isValid() && url.isRelative())
- url = context->resolvedUrl(url);
-
- QObject *parentArg = v8engine->toQObject(args[1]);
- if (!parentArg)
- V8THROW_ERROR("Qt.createQmlObject(): Missing parent object");
-
- QDeclarativeComponent component(engine);
- component.setData(qml.toUtf8(), url);
-
- if (component.isError()) {
- v8::ThrowException(Error::create(v8engine, component.errors()));
- return v8::Undefined();
- }
-
- if (!component.isReady())
- V8THROW_ERROR("Qt.createQmlObject(): Component is not ready");
-
- QObject *obj = component.beginCreate(effectiveContext);
- if (obj)
- QDeclarativeData::get(obj, true)->setImplicitDestructible();
- component.completeCreate();
-
- if (component.isError()) {
- v8::ThrowException(Error::create(v8engine, component.errors()));
- return v8::Undefined();
- }
-
- Q_ASSERT(obj);
-
- obj->setParent(parentArg);
-
- QList<QDeclarativePrivate::AutoParentFunction> functions = QDeclarativeMetaType::parentFunctions();
- for (int ii = 0; ii < functions.count(); ++ii) {
- if (QDeclarativePrivate::Parented == functions.at(ii)(obj, parentArg))
- break;
- }
-
- return v8engine->newQObject(obj);
-}
-
-/*!
-\qmlmethod object Qt::createComponent(url)
-
-Returns a \l Component object created using the QML file at the specified \a url,
-or \c null if an empty string was given.
-
-The returned component's \l Component::status property indicates whether the
-component was successfully created. If the status is \c Component.Error,
-see \l Component::errorString() for an error description.
-
-Call \l {Component::createObject()}{Component.createObject()} on the returned
-component to create an object instance of the component.
-
-For example:
-
-\snippet doc/src/snippets/declarative/createComponent-simple.qml 0
-
-See \l {Dynamic Object Management in QML} for more information on using this function.
-
-To create a QML object from an arbitrary string of QML (instead of a file),
-use \l{QML:Qt::createQmlObject()}{Qt.createQmlObject()}.
-*/
-v8::Handle<v8::Value> createComponent(const v8::Arguments &args)
-{
- if (args.Length() != 1)
- V8THROW_ERROR("Qt.createComponent(): Invalid arguments");
-
- QV8Engine *v8engine = V8ENGINE();
- QDeclarativeEngine *engine = v8engine->engine();
-
- QDeclarativeContextData *context = v8engine->callingContext();
- QDeclarativeContextData *effectiveContext = context;
- if (context->isPragmaLibraryContext)
- effectiveContext = 0;
- Q_ASSERT(context);
-
- QString arg = v8engine->toString(args[0]->ToString());
- if (arg.isEmpty())
- return v8::Null();
-
- QUrl url = context->resolvedUrl(QUrl(arg));
- QDeclarativeComponent *c = new QDeclarativeComponent(engine, url, engine);
- QDeclarativeComponentPrivate::get(c)->creationContext = effectiveContext;
- QDeclarativeData::get(c, true)->setImplicitDestructible();
- return v8engine->newQObject(c);
-}
-
-v8::Handle<v8::Value> qsTranslate(const v8::Arguments &args)
-{
- if (args.Length() < 2)
- V8THROW_ERROR("qsTranslate() requires at least two arguments");
- if (!args[0]->IsString())
- V8THROW_ERROR("qsTranslate(): first argument (context) must be a string");
- if (!args[1]->IsString())
- V8THROW_ERROR("qsTranslate(): second argument (text) must be a string");
- if ((args.Length() > 2) && !args[2]->IsString())
- V8THROW_ERROR("qsTranslate(): third argument (comment) must be a string");
- if ((args.Length() > 3) && !args[3]->IsString())
- V8THROW_ERROR("qsTranslate(): fourth argument (encoding) must be a string");
-
- QV8Engine *v8engine = V8ENGINE();
- QString context = v8engine->toString(args[0]);
- QString text = v8engine->toString(args[1]);
- QString comment;
- if (args.Length() > 2) comment = v8engine->toString(args[2]);
-
- QCoreApplication::Encoding encoding = QCoreApplication::UnicodeUTF8;
- if (args.Length() > 3) {
- QString encStr = v8engine->toString(args[3]);
- if (encStr == QLatin1String("CodecForTr")) {
- encoding = QCoreApplication::CodecForTr;
- } else if (encStr == QLatin1String("UnicodeUTF8")) {
- encoding = QCoreApplication::UnicodeUTF8;
- } else {
- QString msg = QString::fromLatin1("qsTranslate(): invalid encoding '%0'").arg(encStr);
- V8THROW_ERROR((uint16_t *)msg.constData());
- }
- }
-
- int n = -1;
- if (args.Length() > 4)
- n = args[4]->Int32Value();
-
- QString result = QCoreApplication::translate(context.toUtf8().constData(),
- text.toUtf8().constData(),
- comment.toUtf8().constData(),
- encoding, n);
-
- return v8engine->toString(result);
-}
-
-v8::Handle<v8::Value> qsTranslateNoOp(const v8::Arguments &args)
-{
- if (args.Length() < 2)
- return v8::Undefined();
- return args[1];
-}
-
-v8::Handle<v8::Value> qsTr(const v8::Arguments &args)
-{
- if (args.Length() < 1)
- V8THROW_ERROR("qsTr() requires at least one argument");
- if (!args[0]->IsString())
- V8THROW_ERROR("qsTr(): first argument (text) must be a string");
- if ((args.Length() > 1) && !args[1]->IsString())
- V8THROW_ERROR("qsTr(): second argument (comment) must be a string");
- if ((args.Length() > 2) && !args[2]->IsNumber())
- V8THROW_ERROR("qsTr(): third argument (n) must be a number");
-
- QV8Engine *v8engine = V8ENGINE();
- QDeclarativeContextData *ctxt = v8engine->callingContext();
-
- QString path = ctxt->url.toString();
- int lastSlash = path.lastIndexOf(QLatin1Char('/'));
- QString context = (lastSlash > -1) ? path.mid(lastSlash + 1, path.length()-lastSlash-5) : QString();
-
- QString text = v8engine->toString(args[0]);
- QString comment;
- if (args.Length() > 1)
- comment = v8engine->toString(args[1]);
- int n = -1;
- if (args.Length() > 2)
- n = args[2]->Int32Value();
-
- QString result = QCoreApplication::translate(context.toUtf8().constData(), text.toUtf8().constData(),
- comment.toUtf8().constData(), QCoreApplication::UnicodeUTF8, n);
-
- return v8engine->toString(result);
-}
-
-v8::Handle<v8::Value> qsTrNoOp(const v8::Arguments &args)
-{
- if (args.Length() < 1)
- return v8::Undefined();
- return args[0];
-}
-
-v8::Handle<v8::Value> qsTrId(const v8::Arguments &args)
-{
- if (args.Length() < 1)
- V8THROW_ERROR("qsTrId() requires at least one argument");
- if (!args[0]->IsString())
- V8THROW_TYPE("qsTrId(): first argument (id) must be a string");
- if (args.Length() > 1 && !args[1]->IsNumber())
- V8THROW_TYPE("qsTrId(): second argument (n) must be a number");
-
- int n = -1;
- if (args.Length() > 1)
- n = args[1]->Int32Value();
-
- QV8Engine *v8engine = V8ENGINE();
- return v8engine->toString(qtTrId(v8engine->toString(args[0]).toUtf8().constData(), n));
-}
-
-v8::Handle<v8::Value> qsTrIdNoOp(const v8::Arguments &args)
-{
- if (args.Length() < 1)
- return v8::Undefined();
- return args[0];
-}
-
-
-/*!
- \qmlmethod Qt::locale(name)
-
- Returns a JS object representing the locale with the specified
- name, which has the format "language[_territory][.codeset][@modifier]"
- or "C", where:
-
- \list
- \o language is a lowercase, two-letter, ISO 639 language code,
- \o territory is an uppercase, two-letter, ISO 3166 country code,
- \o and codeset and modifier are ignored.
- \endlist
-
- If the string violates the locale format, or language is not a
- valid ISO 369 code, the "C" locale is used instead. If country
- is not present, or is not a valid ISO 3166 code, the most
- appropriate country is chosen for the specified language.
-
- \sa QtQuick2::Locale
-*/
-v8::Handle<v8::Value> locale(const v8::Arguments &args)
-{
- QString code;
- if (args.Length() > 1)
- V8THROW_ERROR("locale() requires 0 or 1 argument");
- if (args.Length() == 1 && !args[0]->IsString())
- V8THROW_TYPE("locale(): argument (locale code) must be a string");
-
- QV8Engine *v8engine = V8ENGINE();
- if (args.Length() == 1)
- code = v8engine->toString(args[0]);
-
- return QDeclarativeLocale::locale(v8engine, code);
-}
-
-} // namespace QDeclarativeBuiltinFunctions
-
-QT_END_NAMESPACE