[prev in list] [next in list] [prev in thread] [next in thread]
List: kde-commits
Subject: [Amarok] 3cdb6da: Add undeclared qmetatype, make msvc happy.
From: Alejandro Wainzinger <aikawarazuni () gmail ! com>
Date: 2010-06-06 9:57:13
Message-ID: 201006060957.o569vDXl026357 () kore ! kollide ! net
[Download RAW message or body]
commit 3cdb6da542c0c932a24630cfa86600ea1cb6c07d
Author: Alejandro Wainzinger <aikawarazuni@gmail.com>
Date: Sun Jun 6 03:02:34 2010 -0700
Add undeclared qmetatype, make msvc happy.
diff --git a/src/context/scriptengine/javascript/simplejavascriptapplet.cpp \
b/src/context/scriptengine/javascript/simplejavascriptapplet.cpp index \
36afd6b..20d99b4 100644
--- a/src/context/scriptengine/javascript/simplejavascriptapplet.cpp
+++ b/src/context/scriptengine/javascript/simplejavascriptapplet.cpp
@@ -1,849 +1,850 @@
-/****************************************************************************************
- * Copyright (c) 2007-2008 Richard J. Moore <rich@kde.org> \
*
- * \
*
- * This program is free software; you can redistribute it and/or modify it under \
*
- * the terms of the GNU General Public License as published by the Free Software \
*
- * Foundation; either version 2 of the License, or (at your option) any later \
*
- * version. \
*
- * \
*
- * This program is distributed in the hope that it will be useful, but WITHOUT ANY \
*
- * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A \
*
- * PARTICULAR PURPOSE. See the GNU General Public License for more details. \
*
- * \
*
- * You should have received a copy of the GNU General Public License along with \
*
- * this program. If not, see <http://www.gnu.org/licenses/>. \
*
- ****************************************************************************************/
-
-#include "simplejavascriptapplet.h"
-
-#include "PaletteHandler.h"
-
-#include <QScriptEngine>
-#include <QFile>
-#include <QUiLoader>
-#include <QGraphicsLayout>
-#include <QPainter>
-#include <QWidget>
-
-#include <KDebug>
-#include <KLocale>
-#include <KStandardDirs>
-#include <KConfigGroup>
-
-#include <Plasma/Applet>
-#include <Plasma/Svg>
-#include <Plasma/FrameSvg>
-#include <Plasma/Package>
-
-#include "appletinterface.h"
-
-using namespace Plasma;
-
-#include "bind_dataengine.h"
-
-Q_DECLARE_METATYPE(QPainter*)
-Q_DECLARE_METATYPE(QStyleOptionGraphicsItem*)
-Q_DECLARE_METATYPE(SimpleJavaScriptApplet*)
-Q_DECLARE_METATYPE(AppletInterface*)
-Q_DECLARE_METATYPE(Applet*)
-Q_DECLARE_METATYPE(QGraphicsWidget*)
-Q_DECLARE_METATYPE(QGraphicsLayout*)
-Q_DECLARE_METATYPE(KConfigGroup)
-
-Q_SCRIPT_DECLARE_QMETAOBJECT(AppletInterface, SimpleJavaScriptApplet*)
-
-QScriptValue constructPainterClass(QScriptEngine *engine);
-QScriptValue constructGraphicsItemClass(QScriptEngine *engine);
-QScriptValue constructLinearLayoutClass(QScriptEngine *engine);
-QScriptValue constructKUrlClass(QScriptEngine *engine);
-QScriptValue constructTimerClass(QScriptEngine *engine);
-QScriptValue constructFontClass(QScriptEngine *engine);
-QScriptValue constructQRectFClass(QScriptEngine *engine);
-QScriptValue constructQPointClass(QScriptEngine *engine);
-QScriptValue constructQSizeFClass(QScriptEngine *engine);
-
-
-class DummyService : public Service
-{
-public:
- ServiceJob *createJob(const QString &operation, QMap<QString, QVariant> \
¶meters)
- {
- Q_UNUSED(operation)
- Q_UNUSED(parameters)
- return 0;
- }
-};
-
-/*
- * Workaround the fact that QtScripts handling of variants seems a bit broken.
- */
-QScriptValue variantToScriptValue(QScriptEngine *engine, QVariant var)
-{
- if (var.isNull()) {
- return engine->nullValue();
- }
-
- switch(var.type())
- {
- case QVariant::Invalid:
- return engine->nullValue();
- case QVariant::Bool:
- return QScriptValue(engine, var.toBool());
- case QVariant::Date:
- return engine->newDate(var.toDateTime());
- case QVariant::DateTime:
- return engine->newDate(var.toDateTime());
- case QVariant::Double:
- return QScriptValue(engine, var.toDouble());
- case QVariant::Int:
- case QVariant::LongLong:
- return QScriptValue(engine, var.toInt());
- case QVariant::String:
- return QScriptValue(engine, var.toString());
- case QVariant::Time: {
- QDateTime t(QDate::currentDate(), var.toTime());
- return engine->newDate(t);
- }
- case QVariant::UInt:
- return QScriptValue(engine, var.toUInt());
- default:
- if (var.typeName() == QLatin1String("KUrl")) {
- return QScriptValue(engine, var.value<KUrl>().prettyUrl());
- } else if (var.typeName() == QLatin1String("QColor")) {
- return QScriptValue(engine, var.value<QColor>().name());
- } else if (var.typeName() == QLatin1String("QUrl")) {
- return QScriptValue(engine, var.value<QUrl>().toString());
- }
- break;
- }
-
- return qScriptValueFromValue(engine, var);
-}
-
-
-QScriptValue qScriptValueFromData(QScriptEngine *engine, const DataEngine::Data \
&data)
-{
- DataEngine::Data::const_iterator begin = data.begin();
- DataEngine::Data::const_iterator end = data.end();
- DataEngine::Data::const_iterator it;
-
- QScriptValue obj = engine->newObject();
-
- for (it = begin; it != end; ++it) {
- //kDebug() << "setting" << it.key() << "to" << it.value();
- QString prop = it.key();
- prop.replace(' ', '_');
- obj.setProperty(prop, variantToScriptValue(engine, it.value()));
- }
-
- return obj;
-}
-
-QScriptValue qScriptValueFromKConfigGroup(QScriptEngine *engine, const KConfigGroup \
&config)
-{
- QScriptValue obj = engine->newObject();
-
- if (!config.isValid()) {
- return obj;
- }
-
- QMap<QString, QString> entryMap = config.entryMap();
- QMap<QString, QString>::const_iterator it = entryMap.constBegin();
- QMap<QString, QString>::const_iterator begin = it;
- QMap<QString, QString>::const_iterator end = entryMap.constEnd();
-
- //setting the group name
- obj.setProperty("__name", QScriptValue(engine, config.name()));
-
- //setting the key/value pairs
- for (it = begin; it != end; ++it) {
- //kDebug() << "setting" << it.key() << "to" << it.value();
- QString prop = it.key();
- prop.replace(' ', '_');
- obj.setProperty(prop, variantToScriptValue(engine, it.value()));
- }
-
- return obj;
-}
-
-void kConfigGroupFromScriptValue(const QScriptValue& obj, KConfigGroup &config)
-{
- KConfigSkeleton *skel = new KConfigSkeleton();
- config = KConfigGroup(skel->config(), obj.property("__name").toString());
-
- QScriptValueIterator it(obj);
-
- while (it.hasNext()) {
- it.next();
- //kDebug() << it.name() << "is" << it.value().toString();
- if (it.name() != "__name") {
- config.writeEntry(it.name(), it.value().toString());
- }
- }
-}
-
-void registerEnums(QScriptEngine *engine, QScriptValue &scriptValue, const \
QMetaObject &meta)
-{
- //manually create enum values. ugh
- for (int i=0; i < meta.enumeratorCount(); ++i) {
- QMetaEnum e = meta.enumerator(i);
- //kDebug() << e.name();
- for (int i=0; i < e.keyCount(); ++i) {
- //kDebug() << e.key(i) << e.value(i);
- scriptValue.setProperty(e.key(i), QScriptValue(engine, e.value(i)));
- }
- }
-}
-
-KSharedPtr<UiLoader> SimpleJavaScriptApplet::s_widgetLoader;
-
-SimpleJavaScriptApplet::SimpleJavaScriptApplet(QObject *parent, const QVariantList \
&args)
- : Plasma::AppletScript(parent)
-{
- Q_UNUSED(args)
-// kDebug() << "Script applet launched, args" << applet()->startupArguments();
-
- m_engine = new QScriptEngine(this);
- importExtensions();
-}
-
-SimpleJavaScriptApplet::~SimpleJavaScriptApplet()
-{
- if (s_widgetLoader.count() == 1) {
- s_widgetLoader.clear();
- }
-}
-
-void SimpleJavaScriptApplet::reportError()
-{
- kDebug() << "Error: " << m_engine->uncaughtException().toString()
- << " at line " << m_engine->uncaughtExceptionLineNumber() << endl;
- kDebug() << m_engine->uncaughtExceptionBacktrace();
-}
-
-void SimpleJavaScriptApplet::configChanged()
-{
- QScriptValue fun = m_self.property("configChanged");
- if (!fun.isFunction()) {
- kDebug() << "Script: plasmoid.configChanged is not a function, " << \
fun.toString();
- return;
- }
-
- QScriptContext *ctx = m_engine->pushContext();
- ctx->setActivationObject(m_self);
- //kDebug() << "calling plasmoid";
- fun.call(m_self);
- m_engine->popContext();
-
- if (m_engine->hasUncaughtException()) {
- reportError();
- }
-}
-
-void SimpleJavaScriptApplet::dataUpdated(const QString &name, const DataEngine::Data \
&data)
-{
- QScriptValue fun = m_self.property("dataUpdate");
- if (!fun.isFunction()) {
- kDebug() << "Script: dataUpdate is not a function, " << fun.toString();
- return;
- }
-
- QScriptValueList args;
- args << m_engine->toScriptValue(name) << m_engine->toScriptValue(data);
-
- QScriptContext *ctx = m_engine->pushContext();
- ctx->setActivationObject(m_self);
- fun.call(m_self, args);
- m_engine->popContext();
-
- if (m_engine->hasUncaughtException()) {
- reportError();
- }
-}
-
-void SimpleJavaScriptApplet::executeAction(const QString &name)
-{
- callFunction("action_" + name);
- /*
- QScriptValue fun = m_self.property("action_" + name);
- if (fun.isFunction()) {
- QScriptContext *ctx = m_engine->pushContext();
- ctx->setActivationObject(m_self);
- fun.call(m_self);
- m_engine->popContext();
-
- if (m_engine->hasUncaughtException()) {
- reportError();
- }
- }*/
-}
-
-void SimpleJavaScriptApplet::paintInterface(QPainter *p, const \
QStyleOptionGraphicsItem *option, const QRect &contentsRect)
-{
- Q_UNUSED(option)
- Q_UNUSED(contentsRect)
-
- QScriptValue drawB = m_self.property("drawAppletBackground");
- if (drawB.isFunction()) {
- //kDebug() << "Script: drawB is defined, " << drawB.toString();
- QScriptContext *ctx = m_engine->pushContext();
- ctx->setActivationObject(m_self);
- QScriptValue ret = drawB.call(m_self);
- m_engine->popContext();
- if( ret.toBool() )
- { // told to draw standard background
- //kDebug() << "told to draw bg";
- p->save();
- p->setRenderHint( QPainter::Antialiasing );
- QPainterPath path;
- path.addRoundedRect( applet()->boundingRect().adjusted( 0, 1, -1, -1 ), \
3, 3 );
- //p->fillPath( path, gradient );
- QColor highlight = PaletteHandler::highlightColor( 0.4, 1.05 );
- highlight.setAlpha( 120 );
- p->fillPath( path, highlight );
- p->restore();
-
- p->save();
- p->setRenderHint( QPainter::Antialiasing );
- QColor col = PaletteHandler::highlightColor( 0.3, .7 );
- p->setPen( col );
- p->drawRoundedRect( applet()->boundingRect().adjusted( 2, 2, -2, -2 ), \
3, 3 );
- p->restore();
- }
- }
-
- //kDebug() << "paintInterface() (c++)";
- QScriptValue fun = m_self.property("paintInterface");
- if (!fun.isFunction()) {
- //kDebug() << "Script: paintInterface is not a function, " << \
fun.toString();
- AppletScript::paintInterface(p, option, contentsRect);
- return;
- }
-
- QScriptValueList args;
- args << m_engine->toScriptValue(p);
- args << m_engine->toScriptValue(const_cast<QStyleOptionGraphicsItem*>(option));
- args << m_engine->toScriptValue(contentsRect);
-
- QScriptContext *ctx = m_engine->pushContext();
- ctx->setActivationObject(m_self);
- fun.call(m_self, args);
- m_engine->popContext();
-
- if (m_engine->hasUncaughtException()) {
- reportError();
- }
-}
-
-QList<QAction*> SimpleJavaScriptApplet::contextualActions()
-{
- return m_interface->contextualActions();
-}
-
-void SimpleJavaScriptApplet::callFunction(const QString &functionName, const \
QScriptValueList &args)
-{
- QScriptValue fun = m_self.property(functionName);
- if (fun.isFunction()) {
- QScriptContext *ctx = m_engine->pushContext();
- ctx->setActivationObject(m_self);
- fun.call(m_self, args);
- m_engine->popContext();
-
- if (m_engine->hasUncaughtException()) {
- reportError();
- }
- }
-}
-
-void SimpleJavaScriptApplet::constraintsEvent(Plasma::Constraints constraints)
-{
- QString functionName;
-
- if (constraints & Plasma::FormFactorConstraint) {
- callFunction("formFactorChanged");
- }
-
- if (constraints & Plasma::LocationConstraint) {
- callFunction("locationChanged");
- }
-
- if (constraints & Plasma::ContextConstraint) {
- callFunction("contextChanged");
- }
-}
-
-bool SimpleJavaScriptApplet::init()
-{
- setupObjects();
-
- kDebug() << "ScriptName:" << applet()->name();
- kDebug() << "ScriptCategory:" << applet()->category();
-
- QFile file(mainScript());
- if (!file.open(QIODevice::ReadOnly | QIODevice::Text)) {
- kWarning() << "Unable to load script file";
- return false;
- }
-
- QString script = file.readAll();
- //kDebug() << "Script says" << script;
-
- m_engine->evaluate(script);
- if (m_engine->hasUncaughtException()) {
- reportError();
- return false;
- }
-
- return true;
-}
-
-void SimpleJavaScriptApplet::importExtensions()
-{
- return; // no extension, so do bother wasting cycles
-
- /*
- QStringList extensions;
- //extensions << "qt.core" << "qt.gui" << "qt.svg" << "qt.xml" << "qt.plasma";
- //extensions << "qt.core" << "qt.gui" << "qt.xml";
- foreach (const QString &ext, extensions) {
- kDebug() << "importing " << ext << "...";
- QScriptValue ret = m_engine->importExtension(ext);
- if (ret.isError()) {
- kDebug() << "failed to import extension" << ext << ":" << \
ret.toString();
- }
- }
- kDebug() << "done importing extensions.";
- */
-}
-
-void SimpleJavaScriptApplet::setupObjects()
-{
- QScriptValue global = m_engine->globalObject();
-
- // Bindings for data engine
- m_engine->setDefaultPrototype(qMetaTypeId<DataEngine*>(), \
m_engine->newQObject(new DataEngine()));
- m_engine->setDefaultPrototype(qMetaTypeId<Service*>(), m_engine->newQObject(new \
DummyService()));
- m_engine->setDefaultPrototype(qMetaTypeId<ServiceJob*>(), \
m_engine->newQObject(new ServiceJob(QString(), QString(), QMap<QString, \
QVariant>())));
-
- global.setProperty("i18n", \
m_engine->newFunction(SimpleJavaScriptApplet::jsi18n));
- global.setProperty("i18nc", \
m_engine->newFunction(SimpleJavaScriptApplet::jsi18nc));
- global.setProperty("i18np", \
m_engine->newFunction(SimpleJavaScriptApplet::jsi18np));
- global.setProperty("i18ncp", \
m_engine->newFunction(SimpleJavaScriptApplet::jsi18ncp));
- global.setProperty("dataEngine", \
m_engine->newFunction(SimpleJavaScriptApplet::dataEngine));
- global.setProperty("service", \
m_engine->newFunction(SimpleJavaScriptApplet::service));
- qScriptRegisterMetaType<DataEngine::Data>(m_engine, qScriptValueFromData, 0, \
QScriptValue());
- qScriptRegisterMetaType<KConfigGroup>(m_engine, qScriptValueFromKConfigGroup, \
kConfigGroupFromScriptValue, QScriptValue());
-
- // Expose applet interface
- m_interface = new AppletInterface(this);
- m_self = m_engine->newQObject(m_interface);
- m_self.setScope(global);
- global.setProperty("plasmoid", m_self);
-
- QScriptValue args = m_engine->newArray();
- int i = 0;
- foreach (const QVariant &arg, applet()->startupArguments()) {
- args.setProperty(i, variantToScriptValue(arg));
- ++i;
- }
- global.setProperty("startupArguments", args);
-
- registerEnums(m_engine, global, AppletInterface::staticMetaObject);
-
-
- // Add a global loadui method for ui files
- QScriptValue fun = m_engine->newFunction(SimpleJavaScriptApplet::loadui);
- global.setProperty("loadui", fun);
-
- fun = m_engine->newFunction(SimpleJavaScriptApplet::print);
- global.setProperty("print", fun);
-
-
- // Work around bug in 4.3.0
- qMetaTypeId<QVariant>();
-
- // Add constructors
- global.setProperty("PlasmaSvg", \
m_engine->newFunction(SimpleJavaScriptApplet::newPlasmaSvg));
- global.setProperty("PlasmaFrameSvg", \
m_engine->newFunction(SimpleJavaScriptApplet::newPlasmaFrameSvg));
-
- // Add stuff from 4.4
- global.setProperty("QPainter", constructPainterClass(m_engine));
- global.setProperty("QGraphicsItem", constructGraphicsItemClass(m_engine));
- global.setProperty("QTimer", constructTimerClass(m_engine));
- global.setProperty("QFont", constructFontClass(m_engine));
- global.setProperty("QRectF", constructQRectFClass(m_engine));
- global.setProperty("QSizeF", constructQSizeFClass(m_engine));
- global.setProperty("QPoint", constructQPointClass(m_engine));
- global.setProperty("LinearLayout", constructLinearLayoutClass(m_engine));
- global.setProperty("Url", constructKUrlClass(m_engine));
-
- installWidgets(m_engine);
-}
-
-QString SimpleJavaScriptApplet::findDataResource(const QString &filename)
-{
- QString path("plasma-script/%1");
- return KGlobal::dirs()->findResource("data", path.arg(filename));
-}
-
-void SimpleJavaScriptApplet::debug(const QString &msg)
-{
- kDebug() << msg;
-}
-
-#if 0
-QScriptValue SimpleJavaScriptApplet::dataEngine(QScriptContext *context, \
QScriptEngine *engine)
-{
- if (context->argumentCount() != 1)
- return context->throwError("dataEngine takes one argument");
-
- QString dataEngine = context->argument(0).toString();
-
- Script *self = engine->fromScriptValue<Script*>(context->thisObject());
-
- DataEngine *data = self->dataEngine(dataEngine);
- return engine->newQObject(data);
-}
-#endif
-
-QScriptValue SimpleJavaScriptApplet::jsi18n(QScriptContext *context, QScriptEngine \
*engine)
-{
- if (context->argumentCount() < 1) {
- return context->throwError(i18n("i18n() takes at least one argument"));
- }
-
- KLocalizedString message = ki18n(context->argument(0).toString().toUtf8());
-
- int numArgs = context->argumentCount();
- for (int i = 1; i < numArgs; ++i) {
- message.subs(context->argument(i).toString());
- }
-
- return engine->newVariant(message.toString());
-}
-
-QScriptValue SimpleJavaScriptApplet::jsi18nc(QScriptContext *context, QScriptEngine \
*engine)
-{
- if (context->argumentCount() < 2) {
- return context->throwError(i18n("i18nc() takes at least two arguments"));
- }
-
- KLocalizedString message = ki18nc(context->argument(0).toString().toUtf8(),
- context->argument(1).toString().toUtf8());
-
- int numArgs = context->argumentCount();
- for (int i = 2; i < numArgs; ++i) {
- message.subs(context->argument(i).toString());
- }
-
- return engine->newVariant(message.toString());
-}
-
-QScriptValue SimpleJavaScriptApplet::jsi18np(QScriptContext *context, QScriptEngine \
*engine)
-{
- if (context->argumentCount() < 2) {
- return context->throwError(i18n("i18np() takes at least two arguments"));
- }
-
- KLocalizedString message = ki18np(context->argument(0).toString().toUtf8(),
- context->argument(1).toString().toUtf8());
-
- int numArgs = context->argumentCount();
- for (int i = 2; i < numArgs; ++i) {
- message.subs(context->argument(i).toString());
- }
-
- return engine->newVariant(message.toString());
-}
-
-QScriptValue SimpleJavaScriptApplet::jsi18ncp(QScriptContext *context, QScriptEngine \
*engine)
-{
- if (context->argumentCount() < 3) {
- return context->throwError(i18n("i18ncp() takes at least three arguments"));
- }
-
- KLocalizedString message = ki18ncp(context->argument(0).toString().toUtf8(),
- context->argument(1).toString().toUtf8(),
- context->argument(2).toString().toUtf8());
-
- int numArgs = context->argumentCount();
- for (int i = 3; i < numArgs; ++i) {
- message.subs(context->argument(i).toString());
- }
-
- return engine->newVariant(message.toString());
-}
-
-QScriptValue SimpleJavaScriptApplet::dataEngine(QScriptContext *context, \
QScriptEngine *engine)
-{
- if (context->argumentCount() != 1) {
- return context->throwError(i18n("dataEngine() takes one argument"));
- }
-
- QString dataEngine = context->argument(0).toString();
-
- QScriptValue appletValue = engine->globalObject().property("plasmoid");
- //kDebug() << "appletValue is " << appletValue.toString();
-
- QObject *appletObject = appletValue.toQObject();
- if (!appletObject) {
- return context->throwError(i18n("Could not extract the AppletObject"));
- }
-
- AppletInterface *interface = qobject_cast<AppletInterface*>(appletObject);
- if (!interface) {
- return context->throwError(i18n("Could not extract the Applet"));
- }
-
- DataEngine *data = interface->dataEngine(dataEngine);
- return engine->newQObject(data);
-}
-
-QScriptValue SimpleJavaScriptApplet::service(QScriptContext *context, QScriptEngine \
*engine)
-{
- if (context->argumentCount() != 2) {
- return context->throwError(i18n("service() takes two arguments"));
- }
-
- QString dataEngine = context->argument(0).toString();
-
- QScriptValue appletValue = engine->globalObject().property("plasmoid");
- //kDebug() << "appletValue is " << appletValue.toString();
-
- QObject *appletObject = appletValue.toQObject();
- if (!appletObject) {
- return context->throwError(i18n("Could not extract the AppletObject"));
- }
-
- AppletInterface *interface = qobject_cast<AppletInterface*>(appletObject);
- if (!interface) {
- return context->throwError(i18n("Could not extract the Applet"));
- }
-
- DataEngine *data = interface->dataEngine(dataEngine);
- QString source = context->argument(1).toString();
- Service *service = data->serviceForSource(source);
- //kDebug( )<< "lets try to get" << source << "from" << dataEngine;
- return engine->newQObject(service);
-}
-
-QScriptValue SimpleJavaScriptApplet::loadui(QScriptContext *context, QScriptEngine \
*engine)
-{
- if (context->argumentCount() != 1) {
- return context->throwError(i18n("loadui() takes one argument"));
- }
-
- QString filename = context->argument(0).toString();
- QFile f(filename);
- if (!f.open(QIODevice::ReadOnly)) {
- return context->throwError(i18n("Unable to open '%1'",filename));
- }
-
- QUiLoader loader;
- QWidget *w = loader.load(&f);
- f.close();
-
- return engine->newQObject(w);
-}
-
-QString SimpleJavaScriptApplet::findSvg(QScriptEngine *engine, const QString &file)
-{
- QScriptValue appletValue = engine->globalObject().property("plasmoid");
- //kDebug() << "appletValue is " << appletValue.toString();
-
- QObject *appletObject = appletValue.toQObject();
- if (!appletObject) {
- return file;
- }
-
- AppletInterface *interface = qobject_cast<AppletInterface*>(appletObject);
- if (!interface) {
- return file;
- }
-
- QString path = interface->package()->filePath("images", file + ".svg");
- if (path.isEmpty()) {
- path = interface->package()->filePath("images", file + ".svgz");
-
- if (path.isEmpty()) {
- return file;
- }
- }
-
- return path;
-}
-
-QScriptValue SimpleJavaScriptApplet::newPlasmaSvg(QScriptContext *context, \
QScriptEngine *engine)
-{
- if (context->argumentCount() == 0) {
- return context->throwError(i18n("Constructor takes at least 1 argument"));
- }
-
- QString filename = context->argument(0).toString();
- QObject *parent = 0;
-
- if (context->argumentCount() == 2) {
- parent = qscriptvalue_cast<QObject *>(context->argument(1));
- }
-
- bool parentedToApplet = false;
- if (!parent) {
- QScriptValue appletValue = engine->globalObject().property("plasmoid");
- //kDebug() << "appletValue is " << appletValue.toString();
-
- QObject *appletObject = appletValue.toQObject();
- if (appletObject) {
- AppletInterface *interface = \
qobject_cast<AppletInterface*>(appletObject);
- if (interface) {
- parentedToApplet = true;
- parent = interface->applet();
- }
- }
- }
-
- Svg *svg = new Svg(parent);
- svg->setImagePath(parentedToApplet ? filename : findSvg(engine, filename));
- return engine->newQObject(svg);
-}
-
-QScriptValue SimpleJavaScriptApplet::newPlasmaFrameSvg(QScriptContext *context, \
QScriptEngine *engine)
-{
- if (context->argumentCount() == 0) {
- return context->throwError(i18n("Constructor takes at least 1 argument"));
- }
-
- QString filename = context->argument(0).toString();
- QObject *parent = 0;
-
- if (context->argumentCount() == 2) {
- parent = qscriptvalue_cast<QObject *>(context->argument(1));
- }
-
- bool parentedToApplet = false;
- if (!parent) {
- QScriptValue appletValue = engine->globalObject().property("plasmoid");
- //kDebug() << "appletValue is " << appletValue.toString();
-
- QObject *appletObject = appletValue.toQObject();
- if (appletObject) {
- AppletInterface *interface = \
qobject_cast<AppletInterface*>(appletObject);
- if (interface) {
- parentedToApplet = true;
- parent = interface->applet();
- }
- }
- }
-
- FrameSvg *frameSvg = new FrameSvg(parent);
- frameSvg->setImagePath(parentedToApplet ? filename : findSvg(engine, filename));
- return engine->newQObject(frameSvg);
-}
-
-
-void SimpleJavaScriptApplet::installWidgets(QScriptEngine *engine)
-{
- QScriptValue globalObject = engine->globalObject();
- if (!s_widgetLoader) {
- s_widgetLoader = new UiLoader;
- }
-
- foreach (const QString &widget, s_widgetLoader->availableWidgets()) {
- QScriptValue fun = engine->newFunction(createWidget);
- QScriptValue name = engine->toScriptValue(widget);
- fun.setProperty(QString("functionName"), name,
- QScriptValue::ReadOnly | QScriptValue::Undeletable | \
QScriptValue::SkipInEnumeration);
- fun.setProperty(QString("prototype"), createPrototype(engine, \
name.toString()));
-
- globalObject.setProperty(widget, fun);
- }
-}
-
-QScriptValue SimpleJavaScriptApplet::createWidget(QScriptContext *context, \
QScriptEngine *engine)
-{
- if (context->argumentCount() > 1) {
- return context->throwError(i18n("CreateWidget takes one argument"));
- }
-
- QGraphicsWidget *parent = 0;
- if (context->argumentCount()) {
- parent = qscriptvalue_cast<QGraphicsWidget*>(context->argument(0));
-
- if (!parent) {
- return context->throwError(i18n("The parent must be a \
QGraphicsWidget"));
- }
- }
-
- if (!parent) {
- QScriptValue appletValue = engine->globalObject().property("plasmoid");
- //kDebug() << "appletValue is " << appletValue.toString();
-
- QObject *appletObject = appletValue.toQObject();
- if (!appletObject) {
- return context->throwError(i18n("Could not extract the AppletObject"));
- }
-
- AppletInterface *interface = qobject_cast<AppletInterface*>(appletObject);
- if (!interface) {
- return context->throwError(i18n("Could not extract the Applet"));
- }
-
- parent = interface->applet();
- }
-
- QString self = context->callee().property("functionName").toString();
- if (!s_widgetLoader) {
- s_widgetLoader = new UiLoader;
- }
-
- QGraphicsWidget *w = s_widgetLoader->createWidget(self, parent);
-
- if (!w) {
- return QScriptValue();
- }
-
- QScriptValue fun = engine->newQObject(w);
- fun.setPrototype(context->callee().property("prototype"));
-
- //register enums will be accessed for instance as frame.Sunken for Frame \
shadow...
- registerEnums(engine, fun, *w->metaObject());
-
- return fun;
-}
-
-QScriptValue SimpleJavaScriptApplet::notSupported(QScriptContext *context, \
QScriptEngine *engine)
-{
- Q_UNUSED(engine)
- QString message = context->callee().property("message").toString();
- return context->throwError(i18n("This operation was not supported, %1", message) \
);
-}
-
-
-QScriptValue SimpleJavaScriptApplet::print(QScriptContext *context, QScriptEngine \
*engine)
-{
- if (context->argumentCount() != 1) {
- return context->throwError(i18n("print() takes one argument"));
- }
-
- kDebug() << context->argument(0).toString();
- return engine->undefinedValue();
-}
-
-QScriptValue SimpleJavaScriptApplet::createPrototype(QScriptEngine *engine, const \
QString &name)
-{
- Q_UNUSED(name)
- QScriptValue proto = engine->newObject();
-
- // Hook for adding extra properties/methods
- return proto;
-}
-
-QScriptValue SimpleJavaScriptApplet::variantToScriptValue(QVariant var)
-{
- return ::variantToScriptValue(m_engine, var);
-}
-
-K_EXPORT_PLASMA_APPLETSCRIPTENGINE(qscriptapplet, SimpleJavaScriptApplet)
-
-#include "simplejavascriptapplet.moc"
-
-
+/****************************************************************************************
+ * Copyright (c) 2007-2008 Richard J. Moore <rich@kde.org> \
* + * \
* + * This program is free software; you can redistribute it and/or modify it under \
* + * the terms of the GNU General Public License as published by the Free Software \
* + * Foundation; either version 2 of the License, or (at your option) any later \
* + * version. \
* + * \
* + * This program is distributed in the hope that it will be useful, but WITHOUT ANY \
* + * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A \
* + * PARTICULAR PURPOSE. See the GNU General Public License for more details. \
* + * \
* + * You should have received a copy of the GNU General Public License along with \
* + * this program. If not, see <http://www.gnu.org/licenses/>. \
* + ****************************************************************************************/
+
+#include "simplejavascriptapplet.h"
+
+#include "PaletteHandler.h"
+
+#include <QScriptEngine>
+#include <QFile>
+#include <QUiLoader>
+#include <QGraphicsLayout>
+#include <QPainter>
+#include <QWidget>
+
+#include <KDebug>
+#include <KLocale>
+#include <KStandardDirs>
+#include <KConfigGroup>
+
+#include <Plasma/Applet>
+#include <Plasma/Svg>
+#include <Plasma/FrameSvg>
+#include <Plasma/Package>
+
+#include "appletinterface.h"
+
+using namespace Plasma;
+
+#include "bind_dataengine.h"
+
+Q_DECLARE_METATYPE(QPainter*)
+Q_DECLARE_METATYPE(QStyleOptionGraphicsItem*)
+Q_DECLARE_METATYPE(SimpleJavaScriptApplet*)
+Q_DECLARE_METATYPE(AppletInterface*)
+Q_DECLARE_METATYPE(Applet*)
+Q_DECLARE_METATYPE(QGraphicsWidget*)
+Q_DECLARE_METATYPE(QGraphicsLayout*)
+Q_DECLARE_METATYPE(KConfigGroup)
+Q_DECLARE_METATYPE(DataEngine*)
+
+Q_SCRIPT_DECLARE_QMETAOBJECT(AppletInterface, SimpleJavaScriptApplet*)
+
+QScriptValue constructPainterClass(QScriptEngine *engine);
+QScriptValue constructGraphicsItemClass(QScriptEngine *engine);
+QScriptValue constructLinearLayoutClass(QScriptEngine *engine);
+QScriptValue constructKUrlClass(QScriptEngine *engine);
+QScriptValue constructTimerClass(QScriptEngine *engine);
+QScriptValue constructFontClass(QScriptEngine *engine);
+QScriptValue constructQRectFClass(QScriptEngine *engine);
+QScriptValue constructQPointClass(QScriptEngine *engine);
+QScriptValue constructQSizeFClass(QScriptEngine *engine);
+
+
+class DummyService : public Service
+{
+public:
+ ServiceJob *createJob(const QString &operation, QMap<QString, QVariant> \
¶meters) + {
+ Q_UNUSED(operation)
+ Q_UNUSED(parameters)
+ return 0;
+ }
+};
+
+/*
+ * Workaround the fact that QtScripts handling of variants seems a bit broken.
+ */
+QScriptValue variantToScriptValue(QScriptEngine *engine, QVariant var)
+{
+ if (var.isNull()) {
+ return engine->nullValue();
+ }
+
+ switch(var.type())
+ {
+ case QVariant::Invalid:
+ return engine->nullValue();
+ case QVariant::Bool:
+ return QScriptValue(engine, var.toBool());
+ case QVariant::Date:
+ return engine->newDate(var.toDateTime());
+ case QVariant::DateTime:
+ return engine->newDate(var.toDateTime());
+ case QVariant::Double:
+ return QScriptValue(engine, var.toDouble());
+ case QVariant::Int:
+ case QVariant::LongLong:
+ return QScriptValue(engine, var.toInt());
+ case QVariant::String:
+ return QScriptValue(engine, var.toString());
+ case QVariant::Time: {
+ QDateTime t(QDate::currentDate(), var.toTime());
+ return engine->newDate(t);
+ }
+ case QVariant::UInt:
+ return QScriptValue(engine, var.toUInt());
+ default:
+ if (var.typeName() == QLatin1String("KUrl")) {
+ return QScriptValue(engine, var.value<KUrl>().prettyUrl());
+ } else if (var.typeName() == QLatin1String("QColor")) {
+ return QScriptValue(engine, var.value<QColor>().name());
+ } else if (var.typeName() == QLatin1String("QUrl")) {
+ return QScriptValue(engine, var.value<QUrl>().toString());
+ }
+ break;
+ }
+
+ return qScriptValueFromValue(engine, var);
+}
+
+
+QScriptValue qScriptValueFromData(QScriptEngine *engine, const DataEngine::Data \
&data) +{
+ DataEngine::Data::const_iterator begin = data.begin();
+ DataEngine::Data::const_iterator end = data.end();
+ DataEngine::Data::const_iterator it;
+
+ QScriptValue obj = engine->newObject();
+
+ for (it = begin; it != end; ++it) {
+ //kDebug() << "setting" << it.key() << "to" << it.value();
+ QString prop = it.key();
+ prop.replace(' ', '_');
+ obj.setProperty(prop, variantToScriptValue(engine, it.value()));
+ }
+
+ return obj;
+}
+
+QScriptValue qScriptValueFromKConfigGroup(QScriptEngine *engine, const KConfigGroup \
&config) +{
+ QScriptValue obj = engine->newObject();
+
+ if (!config.isValid()) {
+ return obj;
+ }
+
+ QMap<QString, QString> entryMap = config.entryMap();
+ QMap<QString, QString>::const_iterator it = entryMap.constBegin();
+ QMap<QString, QString>::const_iterator begin = it;
+ QMap<QString, QString>::const_iterator end = entryMap.constEnd();
+
+ //setting the group name
+ obj.setProperty("__name", QScriptValue(engine, config.name()));
+
+ //setting the key/value pairs
+ for (it = begin; it != end; ++it) {
+ //kDebug() << "setting" << it.key() << "to" << it.value();
+ QString prop = it.key();
+ prop.replace(' ', '_');
+ obj.setProperty(prop, variantToScriptValue(engine, it.value()));
+ }
+
+ return obj;
+}
+
+void kConfigGroupFromScriptValue(const QScriptValue& obj, KConfigGroup &config)
+{
+ KConfigSkeleton *skel = new KConfigSkeleton();
+ config = KConfigGroup(skel->config(), obj.property("__name").toString());
+
+ QScriptValueIterator it(obj);
+
+ while (it.hasNext()) {
+ it.next();
+ //kDebug() << it.name() << "is" << it.value().toString();
+ if (it.name() != "__name") {
+ config.writeEntry(it.name(), it.value().toString());
+ }
+ }
+}
+
+void registerEnums(QScriptEngine *engine, QScriptValue &scriptValue, const \
QMetaObject &meta) +{
+ //manually create enum values. ugh
+ for (int i=0; i < meta.enumeratorCount(); ++i) {
+ QMetaEnum e = meta.enumerator(i);
+ //kDebug() << e.name();
+ for (int i=0; i < e.keyCount(); ++i) {
+ //kDebug() << e.key(i) << e.value(i);
+ scriptValue.setProperty(e.key(i), QScriptValue(engine, e.value(i)));
+ }
+ }
+}
+
+KSharedPtr<UiLoader> SimpleJavaScriptApplet::s_widgetLoader;
+
+SimpleJavaScriptApplet::SimpleJavaScriptApplet(QObject *parent, const QVariantList \
&args) + : Plasma::AppletScript(parent)
+{
+ Q_UNUSED(args)
+// kDebug() << "Script applet launched, args" << applet()->startupArguments();
+
+ m_engine = new QScriptEngine(this);
+ importExtensions();
+}
+
+SimpleJavaScriptApplet::~SimpleJavaScriptApplet()
+{
+ if (s_widgetLoader.count() == 1) {
+ s_widgetLoader.clear();
+ }
+}
+
+void SimpleJavaScriptApplet::reportError()
+{
+ kDebug() << "Error: " << m_engine->uncaughtException().toString()
+ << " at line " << m_engine->uncaughtExceptionLineNumber() << endl;
+ kDebug() << m_engine->uncaughtExceptionBacktrace();
+}
+
+void SimpleJavaScriptApplet::configChanged()
+{
+ QScriptValue fun = m_self.property("configChanged");
+ if (!fun.isFunction()) {
+ kDebug() << "Script: plasmoid.configChanged is not a function, " << \
fun.toString(); + return;
+ }
+
+ QScriptContext *ctx = m_engine->pushContext();
+ ctx->setActivationObject(m_self);
+ //kDebug() << "calling plasmoid";
+ fun.call(m_self);
+ m_engine->popContext();
+
+ if (m_engine->hasUncaughtException()) {
+ reportError();
+ }
+}
+
+void SimpleJavaScriptApplet::dataUpdated(const QString &name, const DataEngine::Data \
&data) +{
+ QScriptValue fun = m_self.property("dataUpdate");
+ if (!fun.isFunction()) {
+ kDebug() << "Script: dataUpdate is not a function, " << fun.toString();
+ return;
+ }
+
+ QScriptValueList args;
+ args << m_engine->toScriptValue(name) << m_engine->toScriptValue(data);
+
+ QScriptContext *ctx = m_engine->pushContext();
+ ctx->setActivationObject(m_self);
+ fun.call(m_self, args);
+ m_engine->popContext();
+
+ if (m_engine->hasUncaughtException()) {
+ reportError();
+ }
+}
+
+void SimpleJavaScriptApplet::executeAction(const QString &name)
+{
+ callFunction("action_" + name);
+ /*
+ QScriptValue fun = m_self.property("action_" + name);
+ if (fun.isFunction()) {
+ QScriptContext *ctx = m_engine->pushContext();
+ ctx->setActivationObject(m_self);
+ fun.call(m_self);
+ m_engine->popContext();
+
+ if (m_engine->hasUncaughtException()) {
+ reportError();
+ }
+ }*/
+}
+
+void SimpleJavaScriptApplet::paintInterface(QPainter *p, const \
QStyleOptionGraphicsItem *option, const QRect &contentsRect) +{
+ Q_UNUSED(option)
+ Q_UNUSED(contentsRect)
+
+ QScriptValue drawB = m_self.property("drawAppletBackground");
+ if (drawB.isFunction()) {
+ //kDebug() << "Script: drawB is defined, " << drawB.toString();
+ QScriptContext *ctx = m_engine->pushContext();
+ ctx->setActivationObject(m_self);
+ QScriptValue ret = drawB.call(m_self);
+ m_engine->popContext();
+ if( ret.toBool() )
+ { // told to draw standard background
+ //kDebug() << "told to draw bg";
+ p->save();
+ p->setRenderHint( QPainter::Antialiasing );
+ QPainterPath path;
+ path.addRoundedRect( applet()->boundingRect().adjusted( 0, 1, -1, -1 ), \
3, 3 ); + //p->fillPath( path, gradient );
+ QColor highlight = PaletteHandler::highlightColor( 0.4, 1.05 );
+ highlight.setAlpha( 120 );
+ p->fillPath( path, highlight );
+ p->restore();
+
+ p->save();
+ p->setRenderHint( QPainter::Antialiasing );
+ QColor col = PaletteHandler::highlightColor( 0.3, .7 );
+ p->setPen( col );
+ p->drawRoundedRect( applet()->boundingRect().adjusted( 2, 2, -2, -2 ), \
3, 3 ); + p->restore();
+ }
+ }
+
+ //kDebug() << "paintInterface() (c++)";
+ QScriptValue fun = m_self.property("paintInterface");
+ if (!fun.isFunction()) {
+ //kDebug() << "Script: paintInterface is not a function, " << \
fun.toString(); + AppletScript::paintInterface(p, option, contentsRect);
+ return;
+ }
+
+ QScriptValueList args;
+ args << m_engine->toScriptValue(p);
+ args << m_engine->toScriptValue(const_cast<QStyleOptionGraphicsItem*>(option));
+ args << m_engine->toScriptValue(contentsRect);
+
+ QScriptContext *ctx = m_engine->pushContext();
+ ctx->setActivationObject(m_self);
+ fun.call(m_self, args);
+ m_engine->popContext();
+
+ if (m_engine->hasUncaughtException()) {
+ reportError();
+ }
+}
+
+QList<QAction*> SimpleJavaScriptApplet::contextualActions()
+{
+ return m_interface->contextualActions();
+}
+
+void SimpleJavaScriptApplet::callFunction(const QString &functionName, const \
QScriptValueList &args) +{
+ QScriptValue fun = m_self.property(functionName);
+ if (fun.isFunction()) {
+ QScriptContext *ctx = m_engine->pushContext();
+ ctx->setActivationObject(m_self);
+ fun.call(m_self, args);
+ m_engine->popContext();
+
+ if (m_engine->hasUncaughtException()) {
+ reportError();
+ }
+ }
+}
+
+void SimpleJavaScriptApplet::constraintsEvent(Plasma::Constraints constraints)
+{
+ QString functionName;
+
+ if (constraints & Plasma::FormFactorConstraint) {
+ callFunction("formFactorChanged");
+ }
+
+ if (constraints & Plasma::LocationConstraint) {
+ callFunction("locationChanged");
+ }
+
+ if (constraints & Plasma::ContextConstraint) {
+ callFunction("contextChanged");
+ }
+}
+
+bool SimpleJavaScriptApplet::init()
+{
+ setupObjects();
+
+ kDebug() << "ScriptName:" << applet()->name();
+ kDebug() << "ScriptCategory:" << applet()->category();
+
+ QFile file(mainScript());
+ if (!file.open(QIODevice::ReadOnly | QIODevice::Text)) {
+ kWarning() << "Unable to load script file";
+ return false;
+ }
+
+ QString script = file.readAll();
+ //kDebug() << "Script says" << script;
+
+ m_engine->evaluate(script);
+ if (m_engine->hasUncaughtException()) {
+ reportError();
+ return false;
+ }
+
+ return true;
+}
+
+void SimpleJavaScriptApplet::importExtensions()
+{
+ return; // no extension, so do bother wasting cycles
+
+ /*
+ QStringList extensions;
+ //extensions << "qt.core" << "qt.gui" << "qt.svg" << "qt.xml" << "qt.plasma";
+ //extensions << "qt.core" << "qt.gui" << "qt.xml";
+ foreach (const QString &ext, extensions) {
+ kDebug() << "importing " << ext << "...";
+ QScriptValue ret = m_engine->importExtension(ext);
+ if (ret.isError()) {
+ kDebug() << "failed to import extension" << ext << ":" << \
ret.toString(); + }
+ }
+ kDebug() << "done importing extensions.";
+ */
+}
+
+void SimpleJavaScriptApplet::setupObjects()
+{
+ QScriptValue global = m_engine->globalObject();
+
+ // Bindings for data engine
+ m_engine->setDefaultPrototype(qMetaTypeId<DataEngine*>(), \
m_engine->newQObject(new DataEngine())); + \
m_engine->setDefaultPrototype(qMetaTypeId<Service*>(), m_engine->newQObject(new \
DummyService())); + m_engine->setDefaultPrototype(qMetaTypeId<ServiceJob*>(), \
m_engine->newQObject(new ServiceJob(QString(), QString(), QMap<QString, \
QVariant>()))); +
+ global.setProperty("i18n", \
m_engine->newFunction(SimpleJavaScriptApplet::jsi18n)); + \
global.setProperty("i18nc", m_engine->newFunction(SimpleJavaScriptApplet::jsi18nc)); \
+ global.setProperty("i18np", \
m_engine->newFunction(SimpleJavaScriptApplet::jsi18np)); + \
global.setProperty("i18ncp", \
m_engine->newFunction(SimpleJavaScriptApplet::jsi18ncp)); + \
global.setProperty("dataEngine", \
m_engine->newFunction(SimpleJavaScriptApplet::dataEngine)); + \
global.setProperty("service", \
m_engine->newFunction(SimpleJavaScriptApplet::service)); + \
qScriptRegisterMetaType<DataEngine::Data>(m_engine, qScriptValueFromData, 0, \
QScriptValue()); + qScriptRegisterMetaType<KConfigGroup>(m_engine, \
qScriptValueFromKConfigGroup, kConfigGroupFromScriptValue, QScriptValue()); +
+ // Expose applet interface
+ m_interface = new AppletInterface(this);
+ m_self = m_engine->newQObject(m_interface);
+ m_self.setScope(global);
+ global.setProperty("plasmoid", m_self);
+
+ QScriptValue args = m_engine->newArray();
+ int i = 0;
+ foreach (const QVariant &arg, applet()->startupArguments()) {
+ args.setProperty(i, variantToScriptValue(arg));
+ ++i;
+ }
+ global.setProperty("startupArguments", args);
+
+ registerEnums(m_engine, global, AppletInterface::staticMetaObject);
+
+
+ // Add a global loadui method for ui files
+ QScriptValue fun = m_engine->newFunction(SimpleJavaScriptApplet::loadui);
+ global.setProperty("loadui", fun);
+
+ fun = m_engine->newFunction(SimpleJavaScriptApplet::print);
+ global.setProperty("print", fun);
+
+
+ // Work around bug in 4.3.0
+ qMetaTypeId<QVariant>();
+
+ // Add constructors
+ global.setProperty("PlasmaSvg", \
m_engine->newFunction(SimpleJavaScriptApplet::newPlasmaSvg)); + \
global.setProperty("PlasmaFrameSvg", \
m_engine->newFunction(SimpleJavaScriptApplet::newPlasmaFrameSvg)); +
+ // Add stuff from 4.4
+ global.setProperty("QPainter", constructPainterClass(m_engine));
+ global.setProperty("QGraphicsItem", constructGraphicsItemClass(m_engine));
+ global.setProperty("QTimer", constructTimerClass(m_engine));
+ global.setProperty("QFont", constructFontClass(m_engine));
+ global.setProperty("QRectF", constructQRectFClass(m_engine));
+ global.setProperty("QSizeF", constructQSizeFClass(m_engine));
+ global.setProperty("QPoint", constructQPointClass(m_engine));
+ global.setProperty("LinearLayout", constructLinearLayoutClass(m_engine));
+ global.setProperty("Url", constructKUrlClass(m_engine));
+
+ installWidgets(m_engine);
+}
+
+QString SimpleJavaScriptApplet::findDataResource(const QString &filename)
+{
+ QString path("plasma-script/%1");
+ return KGlobal::dirs()->findResource("data", path.arg(filename));
+}
+
+void SimpleJavaScriptApplet::debug(const QString &msg)
+{
+ kDebug() << msg;
+}
+
+#if 0
+QScriptValue SimpleJavaScriptApplet::dataEngine(QScriptContext *context, \
QScriptEngine *engine) +{
+ if (context->argumentCount() != 1)
+ return context->throwError("dataEngine takes one argument");
+
+ QString dataEngine = context->argument(0).toString();
+
+ Script *self = engine->fromScriptValue<Script*>(context->thisObject());
+
+ DataEngine *data = self->dataEngine(dataEngine);
+ return engine->newQObject(data);
+}
+#endif
+
+QScriptValue SimpleJavaScriptApplet::jsi18n(QScriptContext *context, QScriptEngine \
*engine) +{
+ if (context->argumentCount() < 1) {
+ return context->throwError(i18n("i18n() takes at least one argument"));
+ }
+
+ KLocalizedString message = ki18n(context->argument(0).toString().toUtf8());
+
+ int numArgs = context->argumentCount();
+ for (int i = 1; i < numArgs; ++i) {
+ message.subs(context->argument(i).toString());
+ }
+
+ return engine->newVariant(message.toString());
+}
+
+QScriptValue SimpleJavaScriptApplet::jsi18nc(QScriptContext *context, QScriptEngine \
*engine) +{
+ if (context->argumentCount() < 2) {
+ return context->throwError(i18n("i18nc() takes at least two arguments"));
+ }
+
+ KLocalizedString message = ki18nc(context->argument(0).toString().toUtf8(),
+ context->argument(1).toString().toUtf8());
+
+ int numArgs = context->argumentCount();
+ for (int i = 2; i < numArgs; ++i) {
+ message.subs(context->argument(i).toString());
+ }
+
+ return engine->newVariant(message.toString());
+}
+
+QScriptValue SimpleJavaScriptApplet::jsi18np(QScriptContext *context, QScriptEngine \
*engine) +{
+ if (context->argumentCount() < 2) {
+ return context->throwError(i18n("i18np() takes at least two arguments"));
+ }
+
+ KLocalizedString message = ki18np(context->argument(0).toString().toUtf8(),
+ context->argument(1).toString().toUtf8());
+
+ int numArgs = context->argumentCount();
+ for (int i = 2; i < numArgs; ++i) {
+ message.subs(context->argument(i).toString());
+ }
+
+ return engine->newVariant(message.toString());
+}
+
+QScriptValue SimpleJavaScriptApplet::jsi18ncp(QScriptContext *context, QScriptEngine \
*engine) +{
+ if (context->argumentCount() < 3) {
+ return context->throwError(i18n("i18ncp() takes at least three arguments"));
+ }
+
+ KLocalizedString message = ki18ncp(context->argument(0).toString().toUtf8(),
+ context->argument(1).toString().toUtf8(),
+ context->argument(2).toString().toUtf8());
+
+ int numArgs = context->argumentCount();
+ for (int i = 3; i < numArgs; ++i) {
+ message.subs(context->argument(i).toString());
+ }
+
+ return engine->newVariant(message.toString());
+}
+
+QScriptValue SimpleJavaScriptApplet::dataEngine(QScriptContext *context, \
QScriptEngine *engine) +{
+ if (context->argumentCount() != 1) {
+ return context->throwError(i18n("dataEngine() takes one argument"));
+ }
+
+ QString dataEngine = context->argument(0).toString();
+
+ QScriptValue appletValue = engine->globalObject().property("plasmoid");
+ //kDebug() << "appletValue is " << appletValue.toString();
+
+ QObject *appletObject = appletValue.toQObject();
+ if (!appletObject) {
+ return context->throwError(i18n("Could not extract the AppletObject"));
+ }
+
+ AppletInterface *interface = qobject_cast<AppletInterface*>(appletObject);
+ if (!interface) {
+ return context->throwError(i18n("Could not extract the Applet"));
+ }
+
+ DataEngine *data = interface->dataEngine(dataEngine);
+ return engine->newQObject(data);
+}
+
+QScriptValue SimpleJavaScriptApplet::service(QScriptContext *context, QScriptEngine \
*engine) +{
+ if (context->argumentCount() != 2) {
+ return context->throwError(i18n("service() takes two arguments"));
+ }
+
+ QString dataEngine = context->argument(0).toString();
+
+ QScriptValue appletValue = engine->globalObject().property("plasmoid");
+ //kDebug() << "appletValue is " << appletValue.toString();
+
+ QObject *appletObject = appletValue.toQObject();
+ if (!appletObject) {
+ return context->throwError(i18n("Could not extract the AppletObject"));
+ }
+
+ AppletInterface *interface = qobject_cast<AppletInterface*>(appletObject);
+ if (!interface) {
+ return context->throwError(i18n("Could not extract the Applet"));
+ }
+
+ DataEngine *data = interface->dataEngine(dataEngine);
+ QString source = context->argument(1).toString();
+ Service *service = data->serviceForSource(source);
+ //kDebug( )<< "lets try to get" << source << "from" << dataEngine;
+ return engine->newQObject(service);
+}
+
+QScriptValue SimpleJavaScriptApplet::loadui(QScriptContext *context, QScriptEngine \
*engine) +{
+ if (context->argumentCount() != 1) {
+ return context->throwError(i18n("loadui() takes one argument"));
+ }
+
+ QString filename = context->argument(0).toString();
+ QFile f(filename);
+ if (!f.open(QIODevice::ReadOnly)) {
+ return context->throwError(i18n("Unable to open '%1'",filename));
+ }
+
+ QUiLoader loader;
+ QWidget *w = loader.load(&f);
+ f.close();
+
+ return engine->newQObject(w);
+}
+
+QString SimpleJavaScriptApplet::findSvg(QScriptEngine *engine, const QString &file)
+{
+ QScriptValue appletValue = engine->globalObject().property("plasmoid");
+ //kDebug() << "appletValue is " << appletValue.toString();
+
+ QObject *appletObject = appletValue.toQObject();
+ if (!appletObject) {
+ return file;
+ }
+
+ AppletInterface *interface = qobject_cast<AppletInterface*>(appletObject);
+ if (!interface) {
+ return file;
+ }
+
+ QString path = interface->package()->filePath("images", file + ".svg");
+ if (path.isEmpty()) {
+ path = interface->package()->filePath("images", file + ".svgz");
+
+ if (path.isEmpty()) {
+ return file;
+ }
+ }
+
+ return path;
+}
+
+QScriptValue SimpleJavaScriptApplet::newPlasmaSvg(QScriptContext *context, \
QScriptEngine *engine) +{
+ if (context->argumentCount() == 0) {
+ return context->throwError(i18n("Constructor takes at least 1 argument"));
+ }
+
+ QString filename = context->argument(0).toString();
+ QObject *parent = 0;
+
+ if (context->argumentCount() == 2) {
+ parent = qscriptvalue_cast<QObject *>(context->argument(1));
+ }
+
+ bool parentedToApplet = false;
+ if (!parent) {
+ QScriptValue appletValue = engine->globalObject().property("plasmoid");
+ //kDebug() << "appletValue is " << appletValue.toString();
+
+ QObject *appletObject = appletValue.toQObject();
+ if (appletObject) {
+ AppletInterface *interface = \
qobject_cast<AppletInterface*>(appletObject); + if (interface) {
+ parentedToApplet = true;
+ parent = interface->applet();
+ }
+ }
+ }
+
+ Svg *svg = new Svg(parent);
+ svg->setImagePath(parentedToApplet ? filename : findSvg(engine, filename));
+ return engine->newQObject(svg);
+}
+
+QScriptValue SimpleJavaScriptApplet::newPlasmaFrameSvg(QScriptContext *context, \
QScriptEngine *engine) +{
+ if (context->argumentCount() == 0) {
+ return context->throwError(i18n("Constructor takes at least 1 argument"));
+ }
+
+ QString filename = context->argument(0).toString();
+ QObject *parent = 0;
+
+ if (context->argumentCount() == 2) {
+ parent = qscriptvalue_cast<QObject *>(context->argument(1));
+ }
+
+ bool parentedToApplet = false;
+ if (!parent) {
+ QScriptValue appletValue = engine->globalObject().property("plasmoid");
+ //kDebug() << "appletValue is " << appletValue.toString();
+
+ QObject *appletObject = appletValue.toQObject();
+ if (appletObject) {
+ AppletInterface *interface = \
qobject_cast<AppletInterface*>(appletObject); + if (interface) {
+ parentedToApplet = true;
+ parent = interface->applet();
+ }
+ }
+ }
+
+ FrameSvg *frameSvg = new FrameSvg(parent);
+ frameSvg->setImagePath(parentedToApplet ? filename : findSvg(engine, filename));
+ return engine->newQObject(frameSvg);
+}
+
+
+void SimpleJavaScriptApplet::installWidgets(QScriptEngine *engine)
+{
+ QScriptValue globalObject = engine->globalObject();
+ if (!s_widgetLoader) {
+ s_widgetLoader = new UiLoader;
+ }
+
+ foreach (const QString &widget, s_widgetLoader->availableWidgets()) {
+ QScriptValue fun = engine->newFunction(createWidget);
+ QScriptValue name = engine->toScriptValue(widget);
+ fun.setProperty(QString("functionName"), name,
+ QScriptValue::ReadOnly | QScriptValue::Undeletable | \
QScriptValue::SkipInEnumeration); + fun.setProperty(QString("prototype"), \
createPrototype(engine, name.toString())); +
+ globalObject.setProperty(widget, fun);
+ }
+}
+
+QScriptValue SimpleJavaScriptApplet::createWidget(QScriptContext *context, \
QScriptEngine *engine) +{
+ if (context->argumentCount() > 1) {
+ return context->throwError(i18n("CreateWidget takes one argument"));
+ }
+
+ QGraphicsWidget *parent = 0;
+ if (context->argumentCount()) {
+ parent = qscriptvalue_cast<QGraphicsWidget*>(context->argument(0));
+
+ if (!parent) {
+ return context->throwError(i18n("The parent must be a \
QGraphicsWidget")); + }
+ }
+
+ if (!parent) {
+ QScriptValue appletValue = engine->globalObject().property("plasmoid");
+ //kDebug() << "appletValue is " << appletValue.toString();
+
+ QObject *appletObject = appletValue.toQObject();
+ if (!appletObject) {
+ return context->throwError(i18n("Could not extract the AppletObject"));
+ }
+
+ AppletInterface *interface = qobject_cast<AppletInterface*>(appletObject);
+ if (!interface) {
+ return context->throwError(i18n("Could not extract the Applet"));
+ }
+
+ parent = interface->applet();
+ }
+
+ QString self = context->callee().property("functionName").toString();
+ if (!s_widgetLoader) {
+ s_widgetLoader = new UiLoader;
+ }
+
+ QGraphicsWidget *w = s_widgetLoader->createWidget(self, parent);
+
+ if (!w) {
+ return QScriptValue();
+ }
+
+ QScriptValue fun = engine->newQObject(w);
+ fun.setPrototype(context->callee().property("prototype"));
+
+ //register enums will be accessed for instance as frame.Sunken for Frame \
shadow... + registerEnums(engine, fun, *w->metaObject());
+
+ return fun;
+}
+
+QScriptValue SimpleJavaScriptApplet::notSupported(QScriptContext *context, \
QScriptEngine *engine) +{
+ Q_UNUSED(engine)
+ QString message = context->callee().property("message").toString();
+ return context->throwError(i18n("This operation was not supported, %1", message) \
); +}
+
+
+QScriptValue SimpleJavaScriptApplet::print(QScriptContext *context, QScriptEngine \
*engine) +{
+ if (context->argumentCount() != 1) {
+ return context->throwError(i18n("print() takes one argument"));
+ }
+
+ kDebug() << context->argument(0).toString();
+ return engine->undefinedValue();
+}
+
+QScriptValue SimpleJavaScriptApplet::createPrototype(QScriptEngine *engine, const \
QString &name) +{
+ Q_UNUSED(name)
+ QScriptValue proto = engine->newObject();
+
+ // Hook for adding extra properties/methods
+ return proto;
+}
+
+QScriptValue SimpleJavaScriptApplet::variantToScriptValue(QVariant var)
+{
+ return ::variantToScriptValue(m_engine, var);
+}
+
+K_EXPORT_PLASMA_APPLETSCRIPTENGINE(qscriptapplet, SimpleJavaScriptApplet)
+
+#include "simplejavascriptapplet.moc"
+
+
[prev in list] [next in list] [prev in thread] [next in thread]
Configure |
About |
News |
Add a list |
Sponsored by KoreLogic