reenable build of declarative scriptengine
just builds, is still pretty broken
This commit is contained in:
parent
81449003bb
commit
60b37cff34
@ -196,6 +196,7 @@ include(KConfigMacros)
|
|||||||
add_subdirectory( declarativeimports )
|
add_subdirectory( declarativeimports )
|
||||||
add_subdirectory( desktoptheme )
|
add_subdirectory( desktoptheme )
|
||||||
add_subdirectory( plasma )
|
add_subdirectory( plasma )
|
||||||
|
add_subdirectory( scriptengines )
|
||||||
add_subdirectory( shell )
|
add_subdirectory( shell )
|
||||||
|
|
||||||
feature_summary(WHAT ALL FATAL_ON_MISSING_REQUIRED_PACKAGES)
|
feature_summary(WHAT ALL FATAL_ON_MISSING_REQUIRED_PACKAGES)
|
||||||
|
@ -1,3 +1,2 @@
|
|||||||
kde4_no_enable_final(javascript)
|
add_subdirectory(qml)
|
||||||
|
#add_subdirectory(javascript)
|
||||||
add_subdirectory(javascript)
|
|
||||||
|
46
scriptengines/qml/CMakeLists.txt
Normal file
46
scriptengines/qml/CMakeLists.txt
Normal file
@ -0,0 +1,46 @@
|
|||||||
|
# APPLET
|
||||||
|
|
||||||
|
if(KDE_PLATFORM_FEATURE_BINARY_COMPATIBLE_FEATURE_REDUCTION)
|
||||||
|
set(PLASMA_NO_KDEWEBKIT TRUE)
|
||||||
|
set(PLASMA_NO_KNEWSTUFF TRUE)
|
||||||
|
set(PLASMA_NO_SOLID TRUE)
|
||||||
|
set(PLASMA_NO_KIO TRUE)
|
||||||
|
endif(KDE_PLATFORM_FEATURE_BINARY_COMPATIBLE_FEATURE_REDUCTION)
|
||||||
|
|
||||||
|
include_directories(${KDE4_INCLUDE_DIR}/KDE ${PHONON_INCLUDES} ${CMAKE_CURRENT_SOURCE_DIR}/common)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#DECLARATIVE APPLET
|
||||||
|
set(declarative_appletscript_SRCS
|
||||||
|
common/scriptenv.cpp
|
||||||
|
#declarative/toolboxproxy.cpp
|
||||||
|
#declarative/appletcontainer.cpp
|
||||||
|
#declarative/declarativeitemcontainer.cpp
|
||||||
|
declarative/packageaccessmanager.cpp
|
||||||
|
declarative/packageaccessmanagerfactory.cpp
|
||||||
|
declarative/qmlobject.cpp
|
||||||
|
plasmoid/abstractjsappletscript.cpp
|
||||||
|
plasmoid/appletauthorization.cpp
|
||||||
|
plasmoid/appletinterface.cpp
|
||||||
|
plasmoid/declarativeappletscript.cpp
|
||||||
|
)
|
||||||
|
|
||||||
|
include_directories(${PHONON_INCLUDES} ${CMAKE_CURRENT_SOURCE_DIR}/common)
|
||||||
|
|
||||||
|
kde4_add_plugin(plasma_appletscript_declarative ${declarative_appletscript_SRCS})
|
||||||
|
target_link_libraries(plasma_appletscript_declarative
|
||||||
|
${KDE4_PLASMA_LIBS}
|
||||||
|
${KDE4_KIO_LIBS}
|
||||||
|
${KDE4_KDE4SUPPORT_LIBS}
|
||||||
|
${QT_QTSCRIPT_LIBRARY}
|
||||||
|
${QT_QTQML_LIBRARY}
|
||||||
|
${QT_QTUITOOLS_LIBRARY}
|
||||||
|
kdeclarative
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
install(TARGETS plasma_appletscript_declarative DESTINATION ${PLUGIN_INSTALL_DIR})
|
||||||
|
install(FILES data/plasma-scriptengine-applet-declarative.desktop DESTINATION ${SERVICES_INSTALL_DIR})
|
||||||
|
|
||||||
|
|
2
scriptengines/qml/Messages.sh
Normal file
2
scriptengines/qml/Messages.sh
Normal file
@ -0,0 +1,2 @@
|
|||||||
|
#! /usr/bin/env bash
|
||||||
|
$XGETTEXT common/*.cpp dataengine/*.cpp plasmoid/*.cpp runner/*.cpp simplebindings/*.cpp -o $podir/plasma_scriptengine_qscript.pot
|
38
scriptengines/qml/common/authorization.h
Normal file
38
scriptengines/qml/common/authorization.h
Normal file
@ -0,0 +1,38 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2010 Aaron J. Seigo <aseigo@kde.org>
|
||||||
|
*
|
||||||
|
* This program is free software; you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU Library General Public License version 2 as
|
||||||
|
* published by the Free Software Foundation
|
||||||
|
*
|
||||||
|
* 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 Library General Public
|
||||||
|
* License along with this program; if not, write to the
|
||||||
|
* Free Software Foundation, Inc.,
|
||||||
|
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef AUTHORIZATION_H
|
||||||
|
#define AUTHORIZATION_H
|
||||||
|
|
||||||
|
#include <QString>
|
||||||
|
|
||||||
|
#include <KAuthorized>
|
||||||
|
|
||||||
|
class Authorization
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
Authorization() {}
|
||||||
|
virtual ~Authorization() {}
|
||||||
|
|
||||||
|
virtual bool authorizeRequiredExtension(const QString &) { return true; }
|
||||||
|
virtual bool authorizeOptionalExtension(const QString &) { return true; }
|
||||||
|
virtual bool authorizeExternalExtensions() { return true;}// KAuthorized::authorize("plasma/external_script_extensions"); }
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
22
scriptengines/qml/common/declarativescriptenv.cpp
Normal file
22
scriptengines/qml/common/declarativescriptenv.cpp
Normal file
@ -0,0 +1,22 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2010 Aaron J. Seigo <aseigo@kde.org>
|
||||||
|
*
|
||||||
|
* This program is free software; you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU Library General Public License version 2 as
|
||||||
|
* published by the Free Software Foundation
|
||||||
|
*
|
||||||
|
* 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 Library General Public
|
||||||
|
* License along with this program; if not, write to the
|
||||||
|
* Free Software Foundation, Inc.,
|
||||||
|
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#define USEGUI
|
||||||
|
#define DECLARATIVE
|
||||||
|
#include "scriptenv.cpp"
|
||||||
|
|
527
scriptengines/qml/common/scriptenv.cpp
Normal file
527
scriptengines/qml/common/scriptenv.cpp
Normal file
@ -0,0 +1,527 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2007-2008 Richard J. Moore <rich@kde.org>
|
||||||
|
* Copyright 2009 Aaron J. Seigo <aseigo@kde.org>
|
||||||
|
*
|
||||||
|
* This program is free software; you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU Library General Public License version 2 as
|
||||||
|
* published by the Free Software Foundation
|
||||||
|
*
|
||||||
|
* 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 Library General Public
|
||||||
|
* License along with this program; if not, write to the
|
||||||
|
* Free Software Foundation, Inc.,
|
||||||
|
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "scriptenv.h"
|
||||||
|
|
||||||
|
#include <iostream>
|
||||||
|
|
||||||
|
#include <QFile>
|
||||||
|
#include <QMetaEnum>
|
||||||
|
|
||||||
|
#include <KDebug>
|
||||||
|
#include <KDesktopFile>
|
||||||
|
#include <KIO/Job>
|
||||||
|
#include <KLocale>
|
||||||
|
#include <KMimeType>
|
||||||
|
#include <KPluginInfo>
|
||||||
|
#include <KService>
|
||||||
|
#include <KServiceTypeTrader>
|
||||||
|
#include <KShell>
|
||||||
|
#include <KStandardDirs>
|
||||||
|
#include <KRun>
|
||||||
|
#include <klocalizedstring.h>
|
||||||
|
|
||||||
|
#include <Plasma/Package>
|
||||||
|
#include <Plasma/PackageStructure>
|
||||||
|
|
||||||
|
Q_DECLARE_METATYPE(ScriptEnv*)
|
||||||
|
|
||||||
|
ScriptEnv::ScriptEnv(QObject *parent, QScriptEngine *engine)
|
||||||
|
: QObject(parent),
|
||||||
|
m_allowedUrls(NoUrls),
|
||||||
|
m_engine(engine)
|
||||||
|
{
|
||||||
|
connect(m_engine, SIGNAL(signalHandlerException(QScriptValue)), this, SLOT(signalException()));
|
||||||
|
|
||||||
|
setupGlobalObject();
|
||||||
|
}
|
||||||
|
|
||||||
|
ScriptEnv::~ScriptEnv()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
void ScriptEnv::setupGlobalObject()
|
||||||
|
{
|
||||||
|
QScriptValue global = m_engine->globalObject();
|
||||||
|
|
||||||
|
// Add an accessor so we can find the scriptenv given only the engine. The
|
||||||
|
// property is hidden from scripts.
|
||||||
|
global.setProperty("__plasma_scriptenv", m_engine->newQObject(this),
|
||||||
|
QScriptValue::ReadOnly|QScriptValue::Undeletable|QScriptValue::SkipInEnumeration);
|
||||||
|
// Add utility functions
|
||||||
|
#ifndef DECLARATIVE
|
||||||
|
global.setProperty("print", m_engine->newFunction(ScriptEnv::print));
|
||||||
|
#endif
|
||||||
|
global.setProperty("debug", m_engine->newFunction(ScriptEnv::debug));
|
||||||
|
}
|
||||||
|
|
||||||
|
void ScriptEnv::addMainObjectProperties(QScriptValue &value)
|
||||||
|
{
|
||||||
|
value.setProperty("listAddons", m_engine->newFunction(ScriptEnv::listAddons));
|
||||||
|
value.setProperty("loadAddon", m_engine->newFunction(ScriptEnv::loadAddon));
|
||||||
|
value.setProperty("addEventListener", m_engine->newFunction(ScriptEnv::addEventListener));
|
||||||
|
value.setProperty("removeEventListener", m_engine->newFunction(ScriptEnv::removeEventListener));
|
||||||
|
value.setProperty("hasExtension", m_engine->newFunction(ScriptEnv::hasExtension));
|
||||||
|
}
|
||||||
|
|
||||||
|
QScriptEngine *ScriptEnv::engine() const
|
||||||
|
{
|
||||||
|
return m_engine;
|
||||||
|
}
|
||||||
|
|
||||||
|
ScriptEnv *ScriptEnv::findScriptEnv(QScriptEngine *engine)
|
||||||
|
{
|
||||||
|
QScriptValue global = engine->globalObject();
|
||||||
|
return qscriptvalue_cast<ScriptEnv*>(global.property("__plasma_scriptenv"));
|
||||||
|
}
|
||||||
|
|
||||||
|
void ScriptEnv::signalException()
|
||||||
|
{
|
||||||
|
checkForErrors(false);
|
||||||
|
}
|
||||||
|
|
||||||
|
void ScriptEnv::registerEnums(QScriptValue &scriptValue, const QMetaObject &meta)
|
||||||
|
{
|
||||||
|
//manually create enum values. ugh
|
||||||
|
QScriptEngine *engine = scriptValue.engine();
|
||||||
|
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)));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
bool ScriptEnv::include(const QString &path)
|
||||||
|
{
|
||||||
|
QFile file(path);
|
||||||
|
if (!file.open(QIODevice::ReadOnly | QIODevice::Text)) {
|
||||||
|
kWarning() << i18n("Unable to load script file: %1", path);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
QString script = file.readAll();
|
||||||
|
//kDebug() << "Script says" << script;
|
||||||
|
|
||||||
|
// change the context to the parent context so that the include is actually
|
||||||
|
// executed in the same context as the caller; seems to be what javascript
|
||||||
|
// coders expect :)
|
||||||
|
QScriptContext *ctx = m_engine->currentContext();
|
||||||
|
if (ctx && ctx->parentContext()) {
|
||||||
|
ctx->setActivationObject(ctx->parentContext()->activationObject());
|
||||||
|
ctx->setThisObject(ctx->parentContext()->thisObject());
|
||||||
|
}
|
||||||
|
|
||||||
|
m_engine->evaluate(script, path);
|
||||||
|
|
||||||
|
return !checkForErrors(true);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool ScriptEnv::checkForErrors(bool fatal)
|
||||||
|
{
|
||||||
|
if (m_engine->hasUncaughtException()) {
|
||||||
|
emit reportError(this, fatal);
|
||||||
|
if (!fatal) {
|
||||||
|
m_engine->clearExceptions();
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool ScriptEnv::importBuiltinExtension(const QString &extension, QScriptValue &obj)
|
||||||
|
{
|
||||||
|
kDebug() << extension;
|
||||||
|
/*if ("filedialog" == extension) {
|
||||||
|
#ifdef USEGUI
|
||||||
|
FileDialogProxy::registerWithRuntime(m_engine);
|
||||||
|
return true;
|
||||||
|
#endif
|
||||||
|
} else */if ("launchapp" == extension) {
|
||||||
|
m_allowedUrls |= AppLaunching;
|
||||||
|
obj.setProperty("runApplication", m_engine->newFunction(ScriptEnv::runApplication));
|
||||||
|
obj.setProperty("runCommand", m_engine->newFunction(ScriptEnv::runCommand));
|
||||||
|
registerOpenUrl(obj);
|
||||||
|
return true;
|
||||||
|
} else if ("http" == extension) {
|
||||||
|
m_allowedUrls |= HttpUrls;
|
||||||
|
registerGetUrl(obj);
|
||||||
|
registerOpenUrl(obj);
|
||||||
|
return true;
|
||||||
|
} else if ("networkio" == extension) {
|
||||||
|
m_allowedUrls |= HttpUrls | NetworkUrls;
|
||||||
|
registerGetUrl(obj);
|
||||||
|
return true;
|
||||||
|
} else if ("localio" == extension) {
|
||||||
|
m_allowedUrls |= LocalUrls;
|
||||||
|
registerGetUrl(obj);
|
||||||
|
obj.setProperty("userDataPath", m_engine->newFunction(ScriptEnv::userDataPath));
|
||||||
|
obj.setProperty("runCommand", m_engine->newFunction(ScriptEnv::runCommand));
|
||||||
|
return true;
|
||||||
|
} else if ("download" == extension) {
|
||||||
|
obj.setProperty("download", m_engine->newFunction(ScriptEnv::download));
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool ScriptEnv::importExtensions(const KPluginInfo &info, QScriptValue &obj, Authorization &auth)
|
||||||
|
{
|
||||||
|
QStringList requiredExtensions = info.service()->property("X-Plasma-RequiredExtensions", QVariant::StringList).toStringList();
|
||||||
|
if (!requiredExtensions.isEmpty()) {
|
||||||
|
kDebug() << "required extensions are" << requiredExtensions;
|
||||||
|
}
|
||||||
|
|
||||||
|
foreach (const QString &ext, requiredExtensions) {
|
||||||
|
QString extension = ext.toLower();
|
||||||
|
if (m_extensions.contains(extension)) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!auth.authorizeRequiredExtension(extension)) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!importBuiltinExtension(extension, obj)) {
|
||||||
|
if (auth.authorizeExternalExtensions()) {
|
||||||
|
m_engine->importExtension(extension);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (checkForErrors(true)) {
|
||||||
|
return false;
|
||||||
|
} else {
|
||||||
|
m_extensions << extension;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
QStringList optionalExtensions = info.service()->property("X-Plasma-OptionalExtensions", QVariant::StringList).toStringList();
|
||||||
|
if (!optionalExtensions.isEmpty()) {
|
||||||
|
kDebug() << "optional extensions are" << optionalExtensions;
|
||||||
|
}
|
||||||
|
|
||||||
|
foreach (const QString &ext, optionalExtensions) {
|
||||||
|
QString extension = ext.toLower();
|
||||||
|
|
||||||
|
if (m_extensions.contains(extension)) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!auth.authorizeOptionalExtension(extension)) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!importBuiltinExtension(extension, obj)) {
|
||||||
|
if (auth.authorizeExternalExtensions()) {
|
||||||
|
m_engine->importExtension(extension);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!checkForErrors(false)) {
|
||||||
|
m_extensions << extension;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
QSet<QString> ScriptEnv::loadedExtensions() const
|
||||||
|
{
|
||||||
|
return m_extensions;
|
||||||
|
}
|
||||||
|
|
||||||
|
QScriptValue ScriptEnv::debug(QScriptContext *context, QScriptEngine *engine)
|
||||||
|
{
|
||||||
|
if (context->argumentCount() != 1) {
|
||||||
|
return throwNonFatalError(i18n("debug takes one argument"), context, engine);
|
||||||
|
}
|
||||||
|
|
||||||
|
kDebug() << context->argument(0).toString();
|
||||||
|
return engine->undefinedValue();
|
||||||
|
}
|
||||||
|
|
||||||
|
QScriptValue ScriptEnv::throwNonFatalError(const QString &msg, QScriptContext *context, QScriptEngine *engine)
|
||||||
|
{
|
||||||
|
QScriptValue rv = context->throwError(msg);
|
||||||
|
ScriptEnv *env = ScriptEnv::findScriptEnv(engine);
|
||||||
|
if (env) {
|
||||||
|
env->checkForErrors(false);
|
||||||
|
}
|
||||||
|
return rv;
|
||||||
|
}
|
||||||
|
|
||||||
|
QScriptValue ScriptEnv::print(QScriptContext *context, QScriptEngine *engine)
|
||||||
|
{
|
||||||
|
if (context->argumentCount() != 1) {
|
||||||
|
return throwNonFatalError(i18n("print() takes one argument"), context, engine);
|
||||||
|
}
|
||||||
|
|
||||||
|
std::cout << context->argument(0).toString().toLocal8Bit().constData() << std::endl;
|
||||||
|
return engine->undefinedValue();
|
||||||
|
}
|
||||||
|
|
||||||
|
QScriptValue ScriptEnv::listAddons(QScriptContext *context, QScriptEngine *engine)
|
||||||
|
{
|
||||||
|
if (context->argumentCount() < 1) {
|
||||||
|
return throwNonFatalError(i18n("listAddons takes one argument: addon type"), context, engine);
|
||||||
|
}
|
||||||
|
|
||||||
|
const QString type = context->argument(0).toString();
|
||||||
|
|
||||||
|
if (type.isEmpty()) {
|
||||||
|
return engine->undefinedValue();
|
||||||
|
}
|
||||||
|
|
||||||
|
const QString constraint = QString("[X-KDE-PluginInfo-Category] == '%1'").arg(type);
|
||||||
|
KService::List offers = KServiceTypeTrader::self()->query("Plasma/JavascriptAddon", constraint);
|
||||||
|
|
||||||
|
int i = 0;
|
||||||
|
QScriptValue addons = engine->newArray(offers.count());
|
||||||
|
foreach (KService::Ptr offer, offers) {
|
||||||
|
KPluginInfo info(offer);
|
||||||
|
QScriptValue v = engine->newObject();
|
||||||
|
v.setProperty("id", info.pluginName(), QScriptValue::ReadOnly);
|
||||||
|
v.setProperty("name", info.name(), QScriptValue::ReadOnly);
|
||||||
|
addons.setProperty(i++, v);
|
||||||
|
}
|
||||||
|
|
||||||
|
return addons;
|
||||||
|
}
|
||||||
|
|
||||||
|
QScriptValue ScriptEnv::loadAddon(QScriptContext *context, QScriptEngine *engine)
|
||||||
|
{/*
|
||||||
|
if (context->argumentCount() < 2) {
|
||||||
|
return throwNonFatalError(i18n("loadAddon takes two arguments: addon type and addon name to load"), context, engine);
|
||||||
|
}
|
||||||
|
|
||||||
|
const QString type = context->argument(0).toString();
|
||||||
|
const QString plugin = context->argument(1).toString();
|
||||||
|
|
||||||
|
if (type.isEmpty() || plugin.isEmpty()) {
|
||||||
|
return throwNonFatalError(i18n("loadAddon takes two arguments: addon type and addon name to load"), context, engine);
|
||||||
|
}
|
||||||
|
|
||||||
|
const QString constraint = QString("[X-KDE-PluginInfo-Category] == '%1' and [X-KDE-PluginInfo-Name] == '%2'")
|
||||||
|
.arg(type, plugin);
|
||||||
|
KService::List offers = KServiceTypeTrader::self()->query("Plasma/JavascriptAddon", constraint);
|
||||||
|
|
||||||
|
if (offers.isEmpty()) {
|
||||||
|
return throwNonFatalError(i18n("Failed to find Addon %1 of type %2", plugin, type), context, engine);
|
||||||
|
}
|
||||||
|
|
||||||
|
Plasma::PackageStructure::Ptr structure(new JavascriptAddonPackageStructure);
|
||||||
|
const QString subPath = structure->defaultPackageRoot() + '/' + plugin + '/';
|
||||||
|
const QString path = KStandardDirs::locate("data", subPath);
|
||||||
|
Plasma::Package package(path, structure);
|
||||||
|
|
||||||
|
QFile file(package.filePath("mainscript"));
|
||||||
|
if (!file.open(QIODevice::ReadOnly | QIODevice::Text)) {
|
||||||
|
return throwNonFatalError(i18n("Failed to open script file for Addon %1: %2", plugin, package.filePath("mainscript")), context, engine);
|
||||||
|
}
|
||||||
|
|
||||||
|
QTextStream buffer(&file);
|
||||||
|
QString code(buffer.readAll());
|
||||||
|
|
||||||
|
QScriptContext *innerContext = engine->pushContext();
|
||||||
|
innerContext->activationObject().setProperty("registerAddon", engine->newFunction(ScriptEnv::registerAddon));
|
||||||
|
QScriptValue v = engine->newVariant(QVariant::fromValue(package));
|
||||||
|
innerContext->activationObject().setProperty("__plasma_package", v,
|
||||||
|
QScriptValue::ReadOnly |
|
||||||
|
QScriptValue::Undeletable |
|
||||||
|
QScriptValue::SkipInEnumeration);
|
||||||
|
//kDebug() << "context is" << innerContext;
|
||||||
|
engine->evaluate(code, file.fileName());
|
||||||
|
engine->popContext();
|
||||||
|
|
||||||
|
ScriptEnv *env = ScriptEnv::findScriptEnv(engine);
|
||||||
|
if (env && env->checkForErrors(false)) {
|
||||||
|
return false;
|
||||||
|
}*/
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
QScriptValue ScriptEnv::registerAddon(QScriptContext *context, QScriptEngine *engine)
|
||||||
|
{
|
||||||
|
if (context->argumentCount() > 0) {
|
||||||
|
QScriptValue func = context->argument(0);
|
||||||
|
if (func.isFunction()) {
|
||||||
|
QScriptValue obj = func.construct();
|
||||||
|
obj.setProperty("__plasma_package",
|
||||||
|
context->parentContext()->activationObject().property("__plasma_package"),
|
||||||
|
QScriptValue::ReadOnly |
|
||||||
|
QScriptValue::Undeletable |
|
||||||
|
QScriptValue::SkipInEnumeration);
|
||||||
|
|
||||||
|
ScriptEnv *env = ScriptEnv::findScriptEnv(engine);
|
||||||
|
if (env) {
|
||||||
|
QScriptValueList args;
|
||||||
|
args << obj;
|
||||||
|
env->callEventListeners("addoncreated", args);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return engine->undefinedValue();
|
||||||
|
}
|
||||||
|
|
||||||
|
QString ScriptEnv::filePathFromScriptContext(const char *type, const QString &file) const
|
||||||
|
{
|
||||||
|
//kDebug() << type << file;
|
||||||
|
QScriptContext *c = m_engine->currentContext();
|
||||||
|
while (c) {
|
||||||
|
QScriptValue v = c->activationObject().property("__plasma_package");
|
||||||
|
//kDebug() << "variant in parent context?" << v.isVariant();
|
||||||
|
if (v.isVariant()) {
|
||||||
|
const QString path = v.toVariant().value<Plasma::Package>().filePath(type, file);
|
||||||
|
if (!path.isEmpty()) {
|
||||||
|
return path;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
c = c->parentContext();
|
||||||
|
}
|
||||||
|
|
||||||
|
//kDebug() << "fail";
|
||||||
|
return QString();
|
||||||
|
}
|
||||||
|
|
||||||
|
QScriptValue ScriptEnv::addEventListener(QScriptContext *context, QScriptEngine *engine)
|
||||||
|
{
|
||||||
|
if (context->argumentCount() < 2) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
ScriptEnv *env = ScriptEnv::findScriptEnv(engine);
|
||||||
|
if (!env) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
return env->addEventListener(context->argument(0).toString(), context->argument(1));
|
||||||
|
}
|
||||||
|
|
||||||
|
QScriptValue ScriptEnv::removeEventListener(QScriptContext *context, QScriptEngine *engine)
|
||||||
|
{
|
||||||
|
if (context->argumentCount() < 2) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
ScriptEnv *env = ScriptEnv::findScriptEnv(engine);
|
||||||
|
if (!env) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
return env->removeEventListener(context->argument(0).toString(), context->argument(1));
|
||||||
|
}
|
||||||
|
|
||||||
|
QScriptValue ScriptEnv::hasExtension(QScriptContext *context, QScriptEngine *engine)
|
||||||
|
{
|
||||||
|
if (context->argumentCount() < 1) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
ScriptEnv *env = ScriptEnv::findScriptEnv(engine);
|
||||||
|
if (!env) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
return env->m_extensions.contains(context->argument(0).toString().toLower());
|
||||||
|
}
|
||||||
|
|
||||||
|
QScriptValue ScriptEnv::callFunction(QScriptValue &func, const QScriptValueList &args, const QScriptValue &activator)
|
||||||
|
{
|
||||||
|
if (!func.isFunction()) {
|
||||||
|
return m_engine->undefinedValue();
|
||||||
|
}
|
||||||
|
|
||||||
|
QScriptContext *ctx = m_engine->pushContext();
|
||||||
|
ctx->setActivationObject(activator);
|
||||||
|
QScriptValue rv = func.call(activator, args);
|
||||||
|
m_engine->popContext();
|
||||||
|
|
||||||
|
if (m_engine->hasUncaughtException()) {
|
||||||
|
emit reportError(this, false);
|
||||||
|
m_engine->clearExceptions();
|
||||||
|
return m_engine->undefinedValue();
|
||||||
|
}
|
||||||
|
|
||||||
|
return rv;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool ScriptEnv::hasEventListeners(const QString &event) const
|
||||||
|
{
|
||||||
|
return m_eventListeners.contains(event);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool ScriptEnv::callEventListeners(const QString &event, const QScriptValueList &args)
|
||||||
|
{
|
||||||
|
if (!m_eventListeners.contains(event.toLower())) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
QScriptValueList funcs = m_eventListeners.value(event.toLower());
|
||||||
|
QMutableListIterator<QScriptValue> it(funcs);
|
||||||
|
while (it.hasNext()) {
|
||||||
|
callFunction(it.next(), args);
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool ScriptEnv::addEventListener(const QString &event, const QScriptValue &func)
|
||||||
|
{
|
||||||
|
if (func.isFunction() && !event.isEmpty()) {
|
||||||
|
m_eventListeners[event.toLower()].append(func);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool ScriptEnv::removeEventListener(const QString &event, const QScriptValue &func)
|
||||||
|
{
|
||||||
|
bool found = false;
|
||||||
|
|
||||||
|
if (func.isFunction()) {
|
||||||
|
QScriptValueList funcs = m_eventListeners.value(event);
|
||||||
|
QMutableListIterator<QScriptValue> it(funcs);
|
||||||
|
while (it.hasNext()) {
|
||||||
|
if (it.next().equals(func)) {
|
||||||
|
it.remove();
|
||||||
|
found = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (funcs.isEmpty()) {
|
||||||
|
m_eventListeners.remove(event.toLower());
|
||||||
|
} else {
|
||||||
|
m_eventListeners.insert(event.toLower(), funcs);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return found;
|
||||||
|
}
|
||||||
|
|
||||||
|
#ifndef USEGUI
|
||||||
|
#include "scriptenv.moc"
|
||||||
|
#endif
|
125
scriptengines/qml/common/scriptenv.h
Normal file
125
scriptengines/qml/common/scriptenv.h
Normal file
@ -0,0 +1,125 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2007-2008 Richard J. Moore <rich@kde.org>
|
||||||
|
* Copyright 2009 Aaron J. Seigo <aseigo@kde.org>
|
||||||
|
*
|
||||||
|
* This program is free software; you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU Library General Public License version 2 as
|
||||||
|
* published by the Free Software Foundation
|
||||||
|
*
|
||||||
|
* 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 Library General Public
|
||||||
|
* License along with this program; if not, write to the
|
||||||
|
* Free Software Foundation, Inc.,
|
||||||
|
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef SCRIPTENV_H
|
||||||
|
#define SCRIPTENV_H
|
||||||
|
|
||||||
|
#define USEGUI
|
||||||
|
#define DECLARATIVE
|
||||||
|
|
||||||
|
#include <kdemacros.h>
|
||||||
|
#include <QScriptEngine>
|
||||||
|
#include <QSet>
|
||||||
|
|
||||||
|
#include <KPluginInfo>
|
||||||
|
|
||||||
|
#include "authorization.h"
|
||||||
|
|
||||||
|
namespace Plasma
|
||||||
|
{
|
||||||
|
class Package;
|
||||||
|
} // namespace Plasma
|
||||||
|
|
||||||
|
class ScriptEnv : public QObject
|
||||||
|
{
|
||||||
|
Q_OBJECT
|
||||||
|
public:
|
||||||
|
enum AllowedUrl { NoUrls = 0,
|
||||||
|
HttpUrls = 1,
|
||||||
|
NetworkUrls = 2,
|
||||||
|
LocalUrls = 4,
|
||||||
|
AppLaunching = 8};
|
||||||
|
Q_DECLARE_FLAGS(AllowedUrls, AllowedUrl)
|
||||||
|
|
||||||
|
ScriptEnv(QObject *parent, QScriptEngine *engine);
|
||||||
|
~ScriptEnv();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Adds common properties (e.g. registerEventFilter)
|
||||||
|
* for a 'main' object (e.g. plasmoid, engine, runner)
|
||||||
|
*/
|
||||||
|
void addMainObjectProperties(QScriptValue &value);
|
||||||
|
|
||||||
|
/** Returns the QScriptEngine in use. */
|
||||||
|
QScriptEngine *engine() const;
|
||||||
|
|
||||||
|
/** Returns the ScriptEnv in use for a given QScriptEngine or 0. */
|
||||||
|
static ScriptEnv *findScriptEnv(QScriptEngine *engine);
|
||||||
|
|
||||||
|
static void registerEnums(QScriptValue &scriptValue, const QMetaObject &meta);
|
||||||
|
bool include(const QString &path);
|
||||||
|
|
||||||
|
bool importExtensions(const KPluginInfo &info, QScriptValue &obj, Authorization &authorizer);
|
||||||
|
QSet<QString> loadedExtensions() const;
|
||||||
|
|
||||||
|
bool checkForErrors(bool fatal);
|
||||||
|
|
||||||
|
bool addEventListener(const QString &event, const QScriptValue &func);
|
||||||
|
bool removeEventListener(const QString &event, const QScriptValue &func);
|
||||||
|
|
||||||
|
QScriptValue callFunction(QScriptValue &func, const QScriptValueList &args = QScriptValueList(), const QScriptValue &activator = QScriptValue());
|
||||||
|
bool callEventListeners(const QString &event, const QScriptValueList &args = QScriptValueList());
|
||||||
|
bool hasEventListeners(const QString &event) const;
|
||||||
|
|
||||||
|
QString filePathFromScriptContext(const char *type, const QString &file) const;
|
||||||
|
|
||||||
|
Q_SIGNALS:
|
||||||
|
void reportError(ScriptEnv *engine, bool fatal);
|
||||||
|
|
||||||
|
private:
|
||||||
|
void registerGetUrl(QScriptValue &obj){}
|
||||||
|
void registerOpenUrl(QScriptValue &obj){}
|
||||||
|
bool importBuiltinExtension(const QString &extension, QScriptValue &obj);
|
||||||
|
|
||||||
|
static QScriptValue debug(QScriptContext *context, QScriptEngine *engine);
|
||||||
|
static QScriptValue print(QScriptContext *context, QScriptEngine *engine);
|
||||||
|
static QScriptValue runApplication(QScriptContext *context, QScriptEngine *engine){return QScriptValue();}
|
||||||
|
static QScriptValue runCommand(QScriptContext *context, QScriptEngine *engine){return QScriptValue();}
|
||||||
|
static QScriptValue defaultApplication(QScriptContext *context, QScriptEngine *engine);
|
||||||
|
static QScriptValue applicationPath(QScriptContext *context, QScriptEngine *engine);
|
||||||
|
static QScriptValue applicationExists(QScriptContext *context, QScriptEngine *engine);
|
||||||
|
static QScriptValue openUrl(QScriptContext *context, QScriptEngine *engine);
|
||||||
|
static QScriptValue getUrl(QScriptContext *context, QScriptEngine *engine);
|
||||||
|
static QScriptValue download(QScriptContext *context, QScriptEngine *engine){return QScriptValue();}
|
||||||
|
static QScriptValue userDataPath(QScriptContext *context, QScriptEngine *engine){return QScriptValue();}
|
||||||
|
static QScriptValue listAddons(QScriptContext *context, QScriptEngine *engine);
|
||||||
|
static QScriptValue loadAddon(QScriptContext *context, QScriptEngine *engine);
|
||||||
|
static QScriptValue registerAddon(QScriptContext *context, QScriptEngine *engine);
|
||||||
|
static QScriptValue addEventListener(QScriptContext *context, QScriptEngine *engine);
|
||||||
|
static QScriptValue removeEventListener(QScriptContext *context, QScriptEngine *engine);
|
||||||
|
static QScriptValue hasExtension(QScriptContext *context, QScriptEngine *engine);
|
||||||
|
static QScriptValue throwNonFatalError(const QString &msg, QScriptContext *context, QScriptEngine *engine);
|
||||||
|
|
||||||
|
private Q_SLOTS:
|
||||||
|
void signalException();
|
||||||
|
|
||||||
|
private:
|
||||||
|
/** Call to set common properties on the global object **/
|
||||||
|
void setupGlobalObject();
|
||||||
|
|
||||||
|
QSet<QString> m_extensions;
|
||||||
|
AllowedUrls m_allowedUrls;
|
||||||
|
QScriptEngine *m_engine;
|
||||||
|
QHash<QString, QScriptValueList> m_eventListeners;
|
||||||
|
};
|
||||||
|
|
||||||
|
Q_DECLARE_OPERATORS_FOR_FLAGS(ScriptEnv::AllowedUrls)
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
@ -0,0 +1,139 @@
|
|||||||
|
[Desktop Entry]
|
||||||
|
Name=Declarative widget
|
||||||
|
Name[ast]=Elementu gráficu declarativu
|
||||||
|
Name[bg]=Декларативна джаджа
|
||||||
|
Name[bs]=Deklarativna grafička kontrola
|
||||||
|
Name[ca]=Estri declaratiu
|
||||||
|
Name[ca@valencia]=Estri declaratiu
|
||||||
|
Name[cs]=Deklarativní widget
|
||||||
|
Name[da]=Erklærende widget
|
||||||
|
Name[de]=Deklaratives Bedienelement
|
||||||
|
Name[el]=Δηλωτικό συστατικό
|
||||||
|
Name[en_GB]=Declarative widget
|
||||||
|
Name[eo]=Deklarema fenestraĵo
|
||||||
|
Name[es]=Elemento gráfico declarativo
|
||||||
|
Name[et]=Deklaratiivne vidin
|
||||||
|
Name[eu]=Trepeta ezagutarazlea
|
||||||
|
Name[fi]=Deklaratiivinen sovelma
|
||||||
|
Name[fr]=Composant graphique « Declarative »
|
||||||
|
Name[ga]=Giuirléid fhógrach
|
||||||
|
Name[gl]=Widget declarativo
|
||||||
|
Name[he]=ווידג׳ט מוצהר
|
||||||
|
Name[hi]=वर्णनात्मक विजेट
|
||||||
|
Name[hr]=Deklarativni widget
|
||||||
|
Name[hu]=Deklaratív widget
|
||||||
|
Name[ia]=Widget declarative
|
||||||
|
Name[is]=Skilgreiningagræja
|
||||||
|
Name[it]=Oggetto dichiarativo
|
||||||
|
Name[kk]=Мәлімдеме виджеті
|
||||||
|
Name[km]=ធាតុក្រាហ្វិកដែលប្រកាស
|
||||||
|
Name[ko]=Declarative 위젯
|
||||||
|
Name[lt]=Deklaratyvus valdiklis
|
||||||
|
Name[lv]=Deklaratīvais sīkrīks
|
||||||
|
Name[mr]=वर्णनात्मक विजेट
|
||||||
|
Name[nb]=Deklarativt skjermelement
|
||||||
|
Name[nds]=Stüerelement för Verkloren
|
||||||
|
Name[nl]=Widget voor declaratie
|
||||||
|
Name[nn]=Deklarativt skjermelement
|
||||||
|
Name[pa]=ਡਿਕਲਰੇਟਿਵ ਵਿਦਜੈੱਟ
|
||||||
|
Name[pl]=Deklaratywny element interfejsu
|
||||||
|
Name[pt]=Item declarativo
|
||||||
|
Name[pt_BR]=Widget declarativo
|
||||||
|
Name[ro]=Control declarativ
|
||||||
|
Name[ru]=Декларативный виджет
|
||||||
|
Name[si]=ප්රකාශන විජෙට්ටටුව
|
||||||
|
Name[sk]=Deklaratívny widget
|
||||||
|
Name[sl]=Deklarativni gradnik
|
||||||
|
Name[sr]=Декларативни виџет
|
||||||
|
Name[sr@ijekavian]=Декларативни виџет
|
||||||
|
Name[sr@ijekavianlatin]=Deklarativni vidžet
|
||||||
|
Name[sr@latin]=Deklarativni vidžet
|
||||||
|
Name[sv]=Deklarativ grafisk komponent
|
||||||
|
Name[tg]=Видҷети эълонкунӣ
|
||||||
|
Name[tr]=Bildirim parçacığı
|
||||||
|
Name[ug]=ئېنىقلىما ۋىجېت
|
||||||
|
Name[uk]=Декларативний віджет
|
||||||
|
Name[vi]=Widget khai báo
|
||||||
|
Name[wa]=Ahesse di gåyotaedje
|
||||||
|
Name[x-test]=xxDeclarative widgetxx
|
||||||
|
Name[zh_CN]=描述部件
|
||||||
|
Name[zh_TW]=宣告元件
|
||||||
|
Comment=Native Plasma widget written in QML and JavaScript
|
||||||
|
Comment[ast]=Elementu gráficu nativu de Plasma escritu en QML y JavaScript
|
||||||
|
Comment[bg]=Оригинална джаджа за Plasma, написана наQML и JavaScript
|
||||||
|
Comment[bs]=Samosvojni plazma grafičkih kontrola napisana u QML‑u i javaskriptu
|
||||||
|
Comment[ca]=Estri nadiu del Plasma escrit en QML i JavaScript
|
||||||
|
Comment[ca@valencia]=Estri nadiu del Plasma escrit en QML i JavaScript
|
||||||
|
Comment[cs]=Nativní Plasma widget napsaný v QML a JavaScriptu
|
||||||
|
Comment[da]=Hjemmehørende Plasma-widget skrevet i QML og JavaScript
|
||||||
|
Comment[de]=Echtes Plasma-Programm, geschrieben in QML und JavaScript
|
||||||
|
Comment[el]=Εγγενές συστατικό Plasma γραμμένο σε QML και JavaScript
|
||||||
|
Comment[en_GB]=Native Plasma widget written in QML and JavaScript
|
||||||
|
Comment[eo]=Indiĝena fenestraĵo de Plasmo programita per QML kaj Ĝavaskripto
|
||||||
|
Comment[es]=Elemento gráfico nativo de Plasma escrito en QML y JavaScript
|
||||||
|
Comment[et]=QML-is ja JavaScriptis kirjutatud Plasma vidin
|
||||||
|
Comment[eu]=Plasma jatorrizko trepeta QML eta JavaScript-en idatzia
|
||||||
|
Comment[fi]=Natiivi, QML-pohjainen Plasma-sovelma
|
||||||
|
Comment[fr]=Composant graphique natif de Plasma écrit en QML et JavaScript
|
||||||
|
Comment[ga]=Giuirléid dhúchasach Plasma, scríofa in QML agus JavaScript
|
||||||
|
Comment[gl]=Widget nativo de Plasma escrito en QML e JavaScript
|
||||||
|
Comment[he]=ווידג׳טים של Plasma הנכתבים ב־QML וב־JavaScript
|
||||||
|
Comment[hi]=QML और जावास्क्रिप्ट में लिखा गया नेटिव प्लाज्मा विजेट
|
||||||
|
Comment[hr]=Izvorni Plasma widget napisan u QML-u i JavaScriptu
|
||||||
|
Comment[hu]=QML-ben és JavaScriptben írt natív Plazma-widget
|
||||||
|
Comment[ia]=Widget native de Plasma scribite in QLM e JavaScript
|
||||||
|
Comment[is]=Upprunabundin Plasma græja skrifuð í QML og JavaScript
|
||||||
|
Comment[it]=Oggetto nativo di Plasma scritto in QML e JavaScript
|
||||||
|
Comment[ja]=QML と JavaScript で書かれた Plasma のネイティブウィジェット
|
||||||
|
Comment[kk]=QML мен JavaScript-те жазылған Plasma тума виджеті
|
||||||
|
Comment[km]=ធាតុក្រាហ្វិកប្លាស្មាដើម ដែលសរសេរក្នុង JavaScript
|
||||||
|
Comment[kn]=QML ಹಾಗು ಜಾವಾ ಸ್ಕ್ರಿಪ್ಟ್ ನಲ್ಲಿ ಬರೆಯಲಾದ ಸ್ವಾಭಾವಿಕ ಪ್ಲಾಸ್ಮಾ ನಿಯಂತ್ರಣಾ ಸಂಪರ್ಕತಟ (ವಿಡ್ಗೆಟ್)
|
||||||
|
Comment[ko]=QML과 자바스크립트로 작성된 Plasma 위젯
|
||||||
|
Comment[lt]=Nuosavas Plasma valdiklis parašytas QML ir JavaScript kalba
|
||||||
|
Comment[lv]=Plasma sīkrīks, rakstīts QML un JavaScript valodās
|
||||||
|
Comment[mr]=जावास्क्रिप्ट व QML अंतर्गत लिहीले गेलेले मुळ प्लाज्मा विजेट
|
||||||
|
Comment[nb]=Plasmaelement for dette systemet, skrevet i QML og JavaScript
|
||||||
|
Comment[nds]=En orginaal Plasmaelement, schreven in QML un JavaScript
|
||||||
|
Comment[nl]=Hier thuishorend Plasma-widget geschreven in QML en JavaScript
|
||||||
|
Comment[nn]=Plasma-element skriven i QML og JavaScript
|
||||||
|
Comment[pa]=QML ਤੇ ਜਾਵਾ-ਸਕ੍ਰਿਪਟ ਵਿੱਚ ਲਿਖੇ ਨੇਟਿਵ ਪਲਾਜ਼ਮਾ ਵਿਦਜੈੱਟ
|
||||||
|
Comment[pl]=Element interfejsu Plazmy napisany w QML lub JavaScript
|
||||||
|
Comment[pt]=Elemento nativo do Plasma feito em QML e JavaScript
|
||||||
|
Comment[pt_BR]=Widget do Plasma nativo escrito em QML e JavaScript
|
||||||
|
Comment[ro]=Miniaplicație Plasma nativă scrisă în QML și JavaScript
|
||||||
|
Comment[ru]=Виджет Plasma, написанный на языках QML и JavaScript
|
||||||
|
Comment[si]=ජාවා ස්ක්රිප්ට හා QML මගින් ලියූ ප්ලාස්මා විජෙට්ටු
|
||||||
|
Comment[sk]=Natívny plasma widget napísaný v QML a JavaScripte
|
||||||
|
Comment[sl]=Pravi gradnik za Plasmo, ki je napisan v QML-u in JavaScriptu
|
||||||
|
Comment[sr]=Самосвојни плазма виџет написан у КуМЛ‑у и јаваскрипту
|
||||||
|
Comment[sr@ijekavian]=Самосвојни плазма виџет написан у КуМЛ‑у и јаваскрипту
|
||||||
|
Comment[sr@ijekavianlatin]=Samosvojni plasma vidžet napisan u QML‑u i JavaScriptu
|
||||||
|
Comment[sr@latin]=Samosvojni plasma vidžet napisan u QML‑u i JavaScriptu
|
||||||
|
Comment[sv]=Inbyggd grafisk Plasma-komponent skriven i QML och Javascript
|
||||||
|
Comment[tg]=Ин модули Plasma дар QML ва JavaScript навишта шуд
|
||||||
|
Comment[th]=วิดเจ็ตพลาสมาแบบดั้งเดิมที่เขียนด้วย QML และจาวาสคริปต์
|
||||||
|
Comment[tr]=JavaScript ve QML ile yazılmış gerçek Plasma gereci
|
||||||
|
Comment[ug]=QML ۋە JavaScript بىلەن يېزىلغان ئەسلى Plasma ۋىجېتى
|
||||||
|
Comment[uk]=Віджет Плазми, написаний на QML та JavaScript
|
||||||
|
Comment[vi]=Widget Plasma viết bởi QML và JavaScript
|
||||||
|
Comment[wa]=Ahesse askepieye po Plasma eyet scrîte e QML eyet JavaScript
|
||||||
|
Comment[x-test]=xxNative Plasma widget written in QML and JavaScriptxx
|
||||||
|
Comment[zh_CN]=使用 QML 和 JavaScript 编写的原生 Plasma 部件
|
||||||
|
Comment[zh_TW]=用 QML 與 JavaScript 寫的原始 Plasma 元件
|
||||||
|
Type=Service
|
||||||
|
Icon=text-x-script
|
||||||
|
|
||||||
|
X-KDE-ServiceTypes=Plasma/ScriptEngine
|
||||||
|
X-KDE-Library=plasma_appletscript_declarative
|
||||||
|
X-EngineName=declarativeappletscript
|
||||||
|
X-Plasma-API=declarativeappletscript
|
||||||
|
X-Plasma-ComponentTypes=Applet
|
||||||
|
|
||||||
|
X-KDE-PluginInfo-Author=Alexis Menard
|
||||||
|
X-KDE-PluginInfo-Email=menard@kde.org
|
||||||
|
X-KDE-PluginInfo-Name=qmlscript
|
||||||
|
X-KDE-PluginInfo-Version=0.1
|
||||||
|
X-KDE-PluginInfo-Category=Examples
|
||||||
|
X-KDE-PluginInfo-Depends=
|
||||||
|
X-KDE-PluginInfo-License=LGPL
|
||||||
|
X-KDE-PluginInfo-EnabledByDefault=true
|
88
scriptengines/qml/declarative/packageaccessmanager.cpp
Normal file
88
scriptengines/qml/declarative/packageaccessmanager.cpp
Normal file
@ -0,0 +1,88 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2010 Marco Martin <notmart@gmail.com>
|
||||||
|
*
|
||||||
|
* This program is free software; you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU Library General Public License as
|
||||||
|
* published by the Free Software Foundation; either version 2, 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 Library General Public
|
||||||
|
* License along with this program; if not, write to the
|
||||||
|
* Free Software Foundation, Inc.,
|
||||||
|
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "packageaccessmanager.h"
|
||||||
|
|
||||||
|
#include <QNetworkReply>
|
||||||
|
|
||||||
|
#include <Plasma/Package>
|
||||||
|
|
||||||
|
#include "plasmoid/appletauthorization.h"
|
||||||
|
|
||||||
|
class ErrorReply : public QNetworkReply
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
ErrorReply(QNetworkAccessManager::Operation op, const QNetworkRequest &req)
|
||||||
|
: QNetworkReply()
|
||||||
|
{
|
||||||
|
setError(QNetworkReply::ContentOperationNotPermittedError, "The plasmoid has not been authorized to load remote content");
|
||||||
|
setOperation(op);
|
||||||
|
setRequest(req);
|
||||||
|
setUrl(req.url());
|
||||||
|
}
|
||||||
|
|
||||||
|
qint64 readData(char *data, qint64 maxSize)
|
||||||
|
{
|
||||||
|
Q_UNUSED(data);
|
||||||
|
Q_UNUSED(maxSize);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
void abort()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
PackageAccessManager::PackageAccessManager(const Plasma::Package *package, AppletAuthorization *auth, QObject *parent)
|
||||||
|
: KIO::AccessManager(parent),
|
||||||
|
m_package(package),
|
||||||
|
m_auth(auth)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
PackageAccessManager::~PackageAccessManager()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
QNetworkReply *PackageAccessManager::createRequest(QNetworkAccessManager::Operation op, const QNetworkRequest &req, QIODevice *outgoingData)
|
||||||
|
{
|
||||||
|
QUrl reqUrl(req.url());
|
||||||
|
|
||||||
|
if (reqUrl.scheme() == "plasmapackage") {
|
||||||
|
QNetworkRequest request = req;
|
||||||
|
reqUrl.setScheme("file");
|
||||||
|
reqUrl.setPath(m_package->filePath(0, reqUrl.path()));
|
||||||
|
request.setUrl(reqUrl);
|
||||||
|
return QNetworkAccessManager::createRequest(op, request, outgoingData);
|
||||||
|
} else if ((reqUrl.scheme() == "http" && !m_auth->authorizeRequiredExtension("http")) ||
|
||||||
|
((reqUrl.scheme() == "file" || reqUrl.scheme() == "desktop") && !m_auth->authorizeRequiredExtension("localio")) ||
|
||||||
|
(!m_auth->authorizeRequiredExtension("networkio"))) {
|
||||||
|
return new ErrorReply(op, req);
|
||||||
|
} else {
|
||||||
|
#ifndef PLASMA_NO_KIO
|
||||||
|
return KIO::AccessManager::createRequest(op, req, outgoingData);
|
||||||
|
#else
|
||||||
|
return QNetworkAccessManager::createRequest(op, req, outgoingData);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
57
scriptengines/qml/declarative/packageaccessmanager.h
Normal file
57
scriptengines/qml/declarative/packageaccessmanager.h
Normal file
@ -0,0 +1,57 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2010 Marco Martin <notmart@gmail.com>
|
||||||
|
*
|
||||||
|
* This program is free software; you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU Library General Public License as
|
||||||
|
* published by the Free Software Foundation; either version 2, 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 Library General Public
|
||||||
|
* License along with this program; if not, write to the
|
||||||
|
* Free Software Foundation, Inc.,
|
||||||
|
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef PACKAGEACCESSMANAGER_H
|
||||||
|
#define PACKAGEACCESSMANAGER_H
|
||||||
|
|
||||||
|
#include <kdemacros.h>
|
||||||
|
|
||||||
|
#ifndef PLASMA_NO_KIO
|
||||||
|
#include <kio/accessmanager.h>
|
||||||
|
#else
|
||||||
|
#include <QtNetwork/QNetworkAccessManager>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
namespace Plasma
|
||||||
|
{
|
||||||
|
class Package;
|
||||||
|
}
|
||||||
|
|
||||||
|
class AppletAuthorization;
|
||||||
|
|
||||||
|
class PackageAccessManager :
|
||||||
|
#ifdef PLASMA_NO_KIO
|
||||||
|
public QNetworkAccessManager
|
||||||
|
#else
|
||||||
|
public KIO::AccessManager
|
||||||
|
#endif
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
PackageAccessManager(const Plasma::Package *package, AppletAuthorization *auth, QObject *parent = 0);
|
||||||
|
~PackageAccessManager();
|
||||||
|
|
||||||
|
protected:
|
||||||
|
QNetworkReply *createRequest(QNetworkAccessManager::Operation op, const QNetworkRequest &req, QIODevice *outgoingData = 0);
|
||||||
|
|
||||||
|
private:
|
||||||
|
const Plasma::Package *m_package;
|
||||||
|
AppletAuthorization *m_auth;
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif
|
@ -0,0 +1,43 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2010 Marco Martin <notmart@gmail.com>
|
||||||
|
*
|
||||||
|
* This program is free software; you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU Library General Public License as
|
||||||
|
* published by the Free Software Foundation; either version 2, 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 Library General Public
|
||||||
|
* License along with this program; if not, write to the
|
||||||
|
* Free Software Foundation, Inc.,
|
||||||
|
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "packageaccessmanagerfactory.h"
|
||||||
|
|
||||||
|
#include <Plasma/Package>
|
||||||
|
|
||||||
|
#include "packageaccessmanager.h"
|
||||||
|
#include "plasmoid/appletauthorization.h"
|
||||||
|
|
||||||
|
PackageAccessManagerFactory::PackageAccessManagerFactory(const Plasma::Package *package, AppletAuthorization *auth)
|
||||||
|
: QQmlNetworkAccessManagerFactory(),
|
||||||
|
m_package(package),
|
||||||
|
m_auth(auth)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
PackageAccessManagerFactory::~PackageAccessManagerFactory()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
QNetworkAccessManager *PackageAccessManagerFactory::create(QObject *parent)
|
||||||
|
{
|
||||||
|
return new PackageAccessManager(m_package, m_auth, parent);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
45
scriptengines/qml/declarative/packageaccessmanagerfactory.h
Normal file
45
scriptengines/qml/declarative/packageaccessmanagerfactory.h
Normal file
@ -0,0 +1,45 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2010 Marco Martin <notmart@gmail.com>
|
||||||
|
*
|
||||||
|
* This program is free software; you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU Library General Public License as
|
||||||
|
* published by the Free Software Foundation; either version 2, 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 Library General Public
|
||||||
|
* License along with this program; if not, write to the
|
||||||
|
* Free Software Foundation, Inc.,
|
||||||
|
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef PACKAGEACCESSMANAGERFACTORY_H
|
||||||
|
#define PACKAGEACCESSMANAGERFACTORY_H
|
||||||
|
|
||||||
|
#include <QQmlNetworkAccessManagerFactory>
|
||||||
|
|
||||||
|
|
||||||
|
namespace Plasma
|
||||||
|
{
|
||||||
|
class Package;
|
||||||
|
}
|
||||||
|
|
||||||
|
class AppletAuthorization;
|
||||||
|
|
||||||
|
class PackageAccessManagerFactory : public QQmlNetworkAccessManagerFactory
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
PackageAccessManagerFactory(const Plasma::Package *package, AppletAuthorization *auth);
|
||||||
|
~PackageAccessManagerFactory();
|
||||||
|
QNetworkAccessManager *create(QObject *parent);
|
||||||
|
|
||||||
|
private:
|
||||||
|
const Plasma::Package *m_package;
|
||||||
|
AppletAuthorization *m_auth;
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif
|
197
scriptengines/qml/declarative/qmlobject.cpp
Normal file
197
scriptengines/qml/declarative/qmlobject.cpp
Normal file
@ -0,0 +1,197 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2010 Marco Martin <mart@kde.org>
|
||||||
|
*
|
||||||
|
* This program is free software; you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU Library General Public License as
|
||||||
|
* published by the Free Software Foundation; either version 2, 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 Library General Public
|
||||||
|
* License along with this program; if not, write to the
|
||||||
|
* Free Software Foundation, Inc.,
|
||||||
|
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "qmlobject.h"
|
||||||
|
|
||||||
|
|
||||||
|
#include <QQmlComponent>
|
||||||
|
#include <QQmlEngine>
|
||||||
|
#include <QQmlContext>
|
||||||
|
#include <QTimer>
|
||||||
|
|
||||||
|
#include <kdebug.h>
|
||||||
|
#include <kdeclarative.h>
|
||||||
|
|
||||||
|
|
||||||
|
#include "packageaccessmanagerfactory.h"
|
||||||
|
//#include "private/declarative/dataenginebindings_p.h"
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
class QmlObjectPrivate
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
QmlObjectPrivate(QmlObject *parent)
|
||||||
|
: q(parent),
|
||||||
|
engine(0),
|
||||||
|
component(0),
|
||||||
|
root(0),
|
||||||
|
delay(false)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
~QmlObjectPrivate()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
void errorPrint();
|
||||||
|
void execute(const QString &fileName);
|
||||||
|
void finishExecute();
|
||||||
|
void scheduleExecutionEnd();
|
||||||
|
void minimumWidthChanged();
|
||||||
|
void minimumHeightChanged();
|
||||||
|
void maximumWidthChanged();
|
||||||
|
void maximumHeightChanged();
|
||||||
|
void preferredWidthChanged();
|
||||||
|
void preferredHeightChanged();
|
||||||
|
|
||||||
|
|
||||||
|
QmlObject *q;
|
||||||
|
|
||||||
|
QString qmlPath;
|
||||||
|
QQmlEngine* engine;
|
||||||
|
QQmlComponent* component;
|
||||||
|
QObject *root;
|
||||||
|
bool delay : 1;
|
||||||
|
};
|
||||||
|
|
||||||
|
void QmlObjectPrivate::errorPrint()
|
||||||
|
{
|
||||||
|
QString errorStr = "Error loading QML file.\n";
|
||||||
|
if(component->isError()){
|
||||||
|
QList<QQmlError> errors = component->errors();
|
||||||
|
foreach (const QQmlError &error, errors) {
|
||||||
|
errorStr += (error.line()>0?QString(QString::number(error.line()) + QLatin1String(": ")):QLatin1String(""))
|
||||||
|
+ error.description() + '\n';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
kWarning() << component->url().toString() + '\n' + errorStr;
|
||||||
|
}
|
||||||
|
|
||||||
|
void QmlObjectPrivate::execute(const QString &fileName)
|
||||||
|
{
|
||||||
|
if (fileName.isEmpty()) {
|
||||||
|
#ifndef NDEBUG
|
||||||
|
kDebug() << "File name empty!";
|
||||||
|
#endif
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
KDeclarative kdeclarative;
|
||||||
|
kdeclarative.setDeclarativeEngine(engine);
|
||||||
|
kdeclarative.initialize();
|
||||||
|
//binds things like kconfig and icons
|
||||||
|
kdeclarative.setupBindings();
|
||||||
|
|
||||||
|
component->loadUrl(QUrl::fromLocalFile(fileName));
|
||||||
|
|
||||||
|
if (delay) {
|
||||||
|
QTimer::singleShot(0, q, SLOT(scheduleExecutionEnd()));
|
||||||
|
} else {
|
||||||
|
scheduleExecutionEnd();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void QmlObjectPrivate::scheduleExecutionEnd()
|
||||||
|
{
|
||||||
|
if (component->isReady() || component->isError()) {
|
||||||
|
finishExecute();
|
||||||
|
} else {
|
||||||
|
QObject::connect(component, SIGNAL(statusChanged(QQmlComponent::Status)), q, SLOT(finishExecute()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void QmlObjectPrivate::finishExecute()
|
||||||
|
{
|
||||||
|
if (component->isError()) {
|
||||||
|
errorPrint();
|
||||||
|
}
|
||||||
|
|
||||||
|
root = component->create();
|
||||||
|
|
||||||
|
if (!root) {
|
||||||
|
errorPrint();
|
||||||
|
}
|
||||||
|
|
||||||
|
#ifndef NDEBUG
|
||||||
|
kDebug() << "Execution of QML done!";
|
||||||
|
#endif
|
||||||
|
|
||||||
|
emit q->finished();
|
||||||
|
}
|
||||||
|
|
||||||
|
QmlObject::QmlObject(QObject *parent)
|
||||||
|
: QObject(parent),
|
||||||
|
d(new QmlObjectPrivate(this))
|
||||||
|
{
|
||||||
|
d->engine = new QQmlEngine(this);
|
||||||
|
//d->engine->setNetworkAccessManagerFactory(new PackageAccessManagerFactory());
|
||||||
|
|
||||||
|
d->component = new QQmlComponent(d->engine, this);
|
||||||
|
}
|
||||||
|
|
||||||
|
QmlObject::~QmlObject()
|
||||||
|
{
|
||||||
|
// QDeclarativeNetworkAccessManagerFactory *factory = d->engine->networkAccessManagerFactory();
|
||||||
|
// d->engine->setNetworkAccessManagerFactory(0);
|
||||||
|
// delete factory;
|
||||||
|
delete d;
|
||||||
|
}
|
||||||
|
|
||||||
|
void QmlObject::setQmlPath(const QString &path)
|
||||||
|
{
|
||||||
|
d->qmlPath = path;
|
||||||
|
d->execute(path);
|
||||||
|
}
|
||||||
|
|
||||||
|
QString QmlObject::qmlPath() const
|
||||||
|
{
|
||||||
|
return d->qmlPath;
|
||||||
|
}
|
||||||
|
|
||||||
|
void QmlObject::setInitializationDelayed(const bool delay)
|
||||||
|
{
|
||||||
|
d->delay = delay;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool QmlObject::isInitializationDelayed() const
|
||||||
|
{
|
||||||
|
return d->delay;
|
||||||
|
}
|
||||||
|
|
||||||
|
QQmlEngine* QmlObject::engine()
|
||||||
|
{
|
||||||
|
return d->engine;
|
||||||
|
}
|
||||||
|
|
||||||
|
QObject *QmlObject::rootObject() const
|
||||||
|
{
|
||||||
|
return d->root;
|
||||||
|
}
|
||||||
|
|
||||||
|
QQmlComponent *QmlObject::mainComponent() const
|
||||||
|
{
|
||||||
|
return d->component;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#include "moc_qmlobject.cpp"
|
122
scriptengines/qml/declarative/qmlobject.h
Normal file
122
scriptengines/qml/declarative/qmlobject.h
Normal file
@ -0,0 +1,122 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2010 Marco Martin <mart@kde.org>
|
||||||
|
*
|
||||||
|
* This program is free software; you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU Library General Public License as
|
||||||
|
* published by the Free Software Foundation; either version 2, 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 Library General Public
|
||||||
|
* License along with this program; if not, write to the
|
||||||
|
* Free Software Foundation, Inc.,
|
||||||
|
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef QMLOBJECT_H
|
||||||
|
#define QMLOBJECT_H
|
||||||
|
|
||||||
|
#include <QObject>
|
||||||
|
|
||||||
|
|
||||||
|
class QQmlEngine;
|
||||||
|
class QQmlComponent;
|
||||||
|
|
||||||
|
|
||||||
|
class QmlObjectPrivate;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @class QmlObject plasma/declarativewidget.h <Plasma/QmlObject>
|
||||||
|
*
|
||||||
|
* @author Marco Martin <mart@kde.org>
|
||||||
|
*
|
||||||
|
* @short An object that instantiates an entire QML context, with its own declarative engine
|
||||||
|
*
|
||||||
|
* Plasma::QmlObject provides a class for conveniently use QML based
|
||||||
|
* declarative user interfaces inside Plasma widgets.
|
||||||
|
* To one QmlObject corresponds one QML file (that can eventually include others)
|
||||||
|
* tere will be its own QQmlEngine with a single root object,
|
||||||
|
* described in the QML file.
|
||||||
|
*/
|
||||||
|
class QmlObject : public QObject
|
||||||
|
{
|
||||||
|
Q_OBJECT
|
||||||
|
|
||||||
|
Q_PROPERTY(QString qmlPath READ qmlPath WRITE setQmlPath)
|
||||||
|
Q_PROPERTY(bool initializationDelayed READ isInitializationDelayed WRITE setInitializationDelayed)
|
||||||
|
Q_PROPERTY(QObject * rootObject READ rootObject)
|
||||||
|
|
||||||
|
public:
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Constructs a new QmlObject
|
||||||
|
*
|
||||||
|
* @param parent the parent of this object
|
||||||
|
*/
|
||||||
|
explicit QmlObject(QObject *parent = 0);
|
||||||
|
~QmlObject();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sets the path of the QML file to parse and execute
|
||||||
|
*
|
||||||
|
* @param path the absolute path of a QML file
|
||||||
|
*/
|
||||||
|
void setQmlPath(const QString &path);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return the absolute path of the current QML file
|
||||||
|
*/
|
||||||
|
QString qmlPath() const;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sets whether the execution of the QML file has to be delayed later in the event loop. It has to be called before setQmlPath().
|
||||||
|
* In this case will be possible to assign new objects in the main engine context
|
||||||
|
* before the main component gets initialized.
|
||||||
|
* So it will be possible to access it immediately from the QML code.
|
||||||
|
*
|
||||||
|
* @param delay if true the initialization of the QML file will be delayed
|
||||||
|
* at the end of the event loop
|
||||||
|
*/
|
||||||
|
void setInitializationDelayed(const bool delay);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return true if the initialization of the QML file will be delayed
|
||||||
|
* at the end of the event loop
|
||||||
|
*/
|
||||||
|
bool isInitializationDelayed() const;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return the declarative engine that runs the qml file assigned to this widget.
|
||||||
|
*/
|
||||||
|
QQmlEngine* engine();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return the root object of the declarative object tree
|
||||||
|
*/
|
||||||
|
QObject *rootObject() const;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return the main QQmlComponent of the engine
|
||||||
|
*/
|
||||||
|
QQmlComponent *mainComponent() const;
|
||||||
|
|
||||||
|
Q_SIGNALS:
|
||||||
|
/**
|
||||||
|
* Emitted when the parsing and execution of the QML file is terminated
|
||||||
|
*/
|
||||||
|
void finished();
|
||||||
|
|
||||||
|
private:
|
||||||
|
friend class QmlObjectPrivate;
|
||||||
|
QmlObjectPrivate * const d;
|
||||||
|
|
||||||
|
Q_PRIVATE_SLOT(d, void finishExecute())
|
||||||
|
Q_PRIVATE_SLOT(d, void scheduleExecutionEnd())
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
#endif // multiple inclusion guard
|
180
scriptengines/qml/declarative/toolboxproxy.cpp
Normal file
180
scriptengines/qml/declarative/toolboxproxy.cpp
Normal file
@ -0,0 +1,180 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2007 by Aaron Seigo <aseigo@kde.org>
|
||||||
|
* Copyright 2008 by Marco Martin <notmart@gmail.com>
|
||||||
|
* Copyright 2012 by Sebastian Kügler <sebas@kde.org>
|
||||||
|
*
|
||||||
|
* This program is free software; you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU Library General Public License as
|
||||||
|
* published by the Free Software Foundation; either version 2, 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 Library General Public
|
||||||
|
* License along with this program; if not, write to the
|
||||||
|
* Free Software Foundation, Inc.,
|
||||||
|
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "toolboxproxy.h"
|
||||||
|
#include "../plasmoid/appletinterface.h"
|
||||||
|
|
||||||
|
#include <QAction>
|
||||||
|
#include <KIcon>
|
||||||
|
#include <KDebug>
|
||||||
|
|
||||||
|
#include <Plasma/Corona>
|
||||||
|
|
||||||
|
class ToolBoxProxyPrivate {
|
||||||
|
public:
|
||||||
|
bool showing;
|
||||||
|
Plasma::Containment *containment;
|
||||||
|
QList<QAction*> actions;
|
||||||
|
AppletInterface* appletInterface;
|
||||||
|
QAction* addPanelAction;
|
||||||
|
QAction* addWidgetsAction;
|
||||||
|
QAction* configureAction;
|
||||||
|
};
|
||||||
|
|
||||||
|
ToolBoxProxy::ToolBoxProxy(Plasma::Containment *parent, AppletInterface *appletInterface)
|
||||||
|
: AbstractToolBox(parent)
|
||||||
|
{
|
||||||
|
d = new ToolBoxProxyPrivate;
|
||||||
|
d->containment = parent;
|
||||||
|
d->appletInterface = appletInterface;
|
||||||
|
init();
|
||||||
|
}
|
||||||
|
|
||||||
|
ToolBoxProxy::ToolBoxProxy(QObject *parent, const QVariantList &args)
|
||||||
|
: AbstractToolBox(parent, args)
|
||||||
|
{
|
||||||
|
d = new ToolBoxProxyPrivate;
|
||||||
|
d->containment = qobject_cast<Plasma::Containment *>(parent);
|
||||||
|
d->appletInterface = 0;
|
||||||
|
init();
|
||||||
|
}
|
||||||
|
|
||||||
|
ToolBoxProxy::~ToolBoxProxy()
|
||||||
|
{
|
||||||
|
delete d;
|
||||||
|
}
|
||||||
|
|
||||||
|
void ToolBoxProxy::init()
|
||||||
|
{
|
||||||
|
d->showing = false;
|
||||||
|
d->addPanelAction = 0;
|
||||||
|
d->addWidgetsAction = 0;
|
||||||
|
d->configureAction = 0;
|
||||||
|
|
||||||
|
if (d->containment) {
|
||||||
|
connect(d->containment, SIGNAL(immutabilityChanged(Plasma::ImmutabilityType)),
|
||||||
|
this, SLOT(immutabilityChanged(Plasma::ImmutabilityType)));
|
||||||
|
connect(this, SIGNAL(configureRequested(Plasma::Containment*)),
|
||||||
|
d->containment, SIGNAL(configureRequested(Plasma::Containment*)));
|
||||||
|
connect(this, SIGNAL(showAddWidgetsInterface(const QPointF&)),
|
||||||
|
d->containment, SIGNAL(showAddWidgetsInterface(const QPointF&)));
|
||||||
|
}
|
||||||
|
loadActions();
|
||||||
|
}
|
||||||
|
|
||||||
|
void ToolBoxProxy::loadActions()
|
||||||
|
{
|
||||||
|
d->actions.clear();
|
||||||
|
if (d->containment) {
|
||||||
|
if (!d->configureAction) {
|
||||||
|
d->configureAction = new QAction(this);
|
||||||
|
d->configureAction->setText(i18n("%1 Settings", d->containment->name()));
|
||||||
|
d->configureAction->setIcon(KIcon("configure"));
|
||||||
|
d->configureAction->setObjectName("configure");
|
||||||
|
connect(d->configureAction, SIGNAL(triggered()), this, SLOT(configureRequested()));
|
||||||
|
}
|
||||||
|
addTool(d->configureAction);
|
||||||
|
|
||||||
|
if (d->appletInterface) {
|
||||||
|
foreach (QAction *action, d->appletInterface->contextualActions()) {
|
||||||
|
addTool(action);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
foreach (QAction *action, d->containment->actions()) {
|
||||||
|
addTool(action);
|
||||||
|
}
|
||||||
|
foreach (QAction *action, d->containment->corona()->actions()) {
|
||||||
|
addTool(action);
|
||||||
|
}
|
||||||
|
if (!d->addWidgetsAction) {
|
||||||
|
d->addWidgetsAction = new QAction(this);
|
||||||
|
d->addWidgetsAction->setObjectName("add widgets");
|
||||||
|
d->addWidgetsAction->setText(i18n("Add Widgets"));
|
||||||
|
d->addWidgetsAction->setIcon(KIcon("list-add"));
|
||||||
|
connect(d->addWidgetsAction, SIGNAL(triggered()), this, SLOT(addWidgetsRequested()));
|
||||||
|
}
|
||||||
|
if (d->appletInterface && !d->appletInterface->immutable()) {
|
||||||
|
addTool(d->addWidgetsAction);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
emit actionsChanged();
|
||||||
|
}
|
||||||
|
|
||||||
|
QDeclarativeListProperty<QAction> ToolBoxProxy::actions()
|
||||||
|
{
|
||||||
|
return QDeclarativeListProperty<QAction>(this, d->actions);
|
||||||
|
}
|
||||||
|
|
||||||
|
void ToolBoxProxy::addTool(QAction *action)
|
||||||
|
{
|
||||||
|
if (!action || d->actions.contains(action)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (d->appletInterface && d->appletInterface->immutable() && action->objectName() == "add panel") {
|
||||||
|
d->addPanelAction = action;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
connect(action, SIGNAL(destroyed(QObject*)), this, SLOT(actionDestroyed(QObject*)), Qt::UniqueConnection);
|
||||||
|
d->actions.append(action);
|
||||||
|
}
|
||||||
|
|
||||||
|
void ToolBoxProxy::removeTool(QAction *action)
|
||||||
|
{
|
||||||
|
disconnect(action, 0, this, 0);
|
||||||
|
d->actions.removeAll(action);
|
||||||
|
emit actionsChanged();
|
||||||
|
}
|
||||||
|
|
||||||
|
void ToolBoxProxy::actionDestroyed(QObject *object)
|
||||||
|
{
|
||||||
|
d->actions.removeAll(static_cast<QAction*>(object));
|
||||||
|
}
|
||||||
|
|
||||||
|
void ToolBoxProxy::configureRequested()
|
||||||
|
{
|
||||||
|
emit configureRequested(d->containment);
|
||||||
|
}
|
||||||
|
|
||||||
|
void ToolBoxProxy::addWidgetsRequested()
|
||||||
|
{
|
||||||
|
emit showAddWidgetsInterface(QPointF(0, 0));
|
||||||
|
}
|
||||||
|
|
||||||
|
bool ToolBoxProxy::isShowing() const
|
||||||
|
{
|
||||||
|
return d->showing;
|
||||||
|
}
|
||||||
|
|
||||||
|
void ToolBoxProxy::setShowing(const bool show)
|
||||||
|
{
|
||||||
|
if (d->showing == show) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
d->showing = show;
|
||||||
|
}
|
||||||
|
|
||||||
|
void ToolBoxProxy::immutabilityChanged(Plasma::ImmutabilityType immutability)
|
||||||
|
{
|
||||||
|
Q_UNUSED(immutability);
|
||||||
|
loadActions();
|
||||||
|
}
|
||||||
|
|
||||||
|
#include "toolboxproxy.moc"
|
81
scriptengines/qml/declarative/toolboxproxy.h
Normal file
81
scriptengines/qml/declarative/toolboxproxy.h
Normal file
@ -0,0 +1,81 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2007 by Aaron Seigo <aseigo@kde.org>
|
||||||
|
* Copyright 2008 by Marco Martin <notmart@gmail.com>
|
||||||
|
* Copyright 2012 by Sebastian Kügler <sebas@kde.org>
|
||||||
|
*
|
||||||
|
* This program is free software; you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU Library General Public License as
|
||||||
|
* published by the Free Software Foundation; either version 2, 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 Library General Public
|
||||||
|
* License along with this program; if not, write to the
|
||||||
|
* Free Software Foundation, Inc.,
|
||||||
|
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef TOOLBOXPROXY_H
|
||||||
|
#define TOOLBOXPROXY_H
|
||||||
|
|
||||||
|
#include <Plasma/AbstractToolBox>
|
||||||
|
#include <Plasma/Plasma>
|
||||||
|
|
||||||
|
#include <QDeclarativeListProperty>
|
||||||
|
|
||||||
|
class QAction;
|
||||||
|
|
||||||
|
class ToolBoxProxyPrivate;
|
||||||
|
class AppletInterface;
|
||||||
|
|
||||||
|
class ToolBoxProxy : public Plasma::AbstractToolBox
|
||||||
|
{
|
||||||
|
Q_OBJECT
|
||||||
|
Q_PROPERTY(QDeclarativeListProperty<QAction> actions READ actions NOTIFY actionsChanged)
|
||||||
|
|
||||||
|
public:
|
||||||
|
explicit ToolBoxProxy(Plasma::Containment *parent, AppletInterface *appletInterface);
|
||||||
|
explicit ToolBoxProxy(QObject *parent = 0, const QVariantList &args = QVariantList());
|
||||||
|
~ToolBoxProxy();
|
||||||
|
|
||||||
|
bool isShowing() const; // satisfy badly named API
|
||||||
|
void setShowing(const bool show);
|
||||||
|
|
||||||
|
QDeclarativeListProperty<QAction> actions();
|
||||||
|
|
||||||
|
public Q_SLOTS:
|
||||||
|
void configureRequested();
|
||||||
|
void addWidgetsRequested();
|
||||||
|
|
||||||
|
Q_SIGNALS:
|
||||||
|
void actionsChanged();
|
||||||
|
void immutableChanged();
|
||||||
|
|
||||||
|
void configureRequested(Plasma::Containment* containment);
|
||||||
|
void showAddWidgetsInterface(const QPointF& pos);
|
||||||
|
|
||||||
|
private Q_SLOTS:
|
||||||
|
void actionDestroyed(QObject *object);
|
||||||
|
void immutabilityChanged(Plasma::ImmutabilityType immutability);
|
||||||
|
|
||||||
|
private:
|
||||||
|
void init();
|
||||||
|
void loadActions();
|
||||||
|
/**
|
||||||
|
* create a toolbox tool from the given action
|
||||||
|
* @p action the action to associate hte tool with
|
||||||
|
*/
|
||||||
|
void addTool(QAction *action);
|
||||||
|
/**
|
||||||
|
* remove the tool associated with this action
|
||||||
|
*/
|
||||||
|
void removeTool(QAction *action);
|
||||||
|
|
||||||
|
ToolBoxProxyPrivate* d;
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif // TOOLBOXPROXY_H
|
32
scriptengines/qml/plasmoid/abstractjsappletscript.cpp
Normal file
32
scriptengines/qml/plasmoid/abstractjsappletscript.cpp
Normal file
@ -0,0 +1,32 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2010 Marco Martin <mart@kde.org>
|
||||||
|
|
||||||
|
* This program is free software; you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU Library General Public License as
|
||||||
|
* published by the Free Software Foundation; either version 2, 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 Library General Public
|
||||||
|
* License along with this program; if not, write to the
|
||||||
|
* Free Software Foundation, Inc.,
|
||||||
|
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "plasmoid/abstractjsappletscript.h"
|
||||||
|
|
||||||
|
|
||||||
|
AbstractJsAppletScript::AbstractJsAppletScript(QObject *parent, const QVariantList &args)
|
||||||
|
: Plasma::AppletScript(parent)
|
||||||
|
{
|
||||||
|
Q_UNUSED(args);
|
||||||
|
}
|
||||||
|
|
||||||
|
AbstractJsAppletScript::~AbstractJsAppletScript()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
40
scriptengines/qml/plasmoid/abstractjsappletscript.h
Normal file
40
scriptengines/qml/plasmoid/abstractjsappletscript.h
Normal file
@ -0,0 +1,40 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2010 Marco Martin <mart@kde.org>
|
||||||
|
|
||||||
|
* This program is free software; you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU Library General Public License as
|
||||||
|
* published by the Free Software Foundation; either version 2, 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 Library General Public
|
||||||
|
* License along with this program; if not, write to the
|
||||||
|
* Free Software Foundation, Inc.,
|
||||||
|
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef ABSTRACTJS_APPLETSCRIPT_H
|
||||||
|
#define ABSTRACTJS_APPLETSCRIPT_H
|
||||||
|
|
||||||
|
#include <QQmlEngine>
|
||||||
|
|
||||||
|
#include <Plasma/AppletScript>
|
||||||
|
|
||||||
|
class AbstractJsAppletScript : public Plasma::AppletScript
|
||||||
|
{
|
||||||
|
Q_OBJECT
|
||||||
|
|
||||||
|
public:
|
||||||
|
AbstractJsAppletScript(QObject *parent, const QVariantList &args = QVariantList());
|
||||||
|
~AbstractJsAppletScript();
|
||||||
|
|
||||||
|
virtual QQmlEngine *engine() const = 0;
|
||||||
|
virtual bool include(const QString &path) = 0;
|
||||||
|
virtual QString filePath(const QString &type, const QString &file) const = 0;
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif
|
58
scriptengines/qml/plasmoid/appletauthorization.cpp
Normal file
58
scriptengines/qml/plasmoid/appletauthorization.cpp
Normal file
@ -0,0 +1,58 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2010 Aaron J. Seigo <aseigo@kde.org>
|
||||||
|
*
|
||||||
|
* This program is free software; you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU Library General Public License version 2 as
|
||||||
|
* published by the Free Software Foundation
|
||||||
|
*
|
||||||
|
* 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 Library General Public
|
||||||
|
* License along with this program; if not, write to the
|
||||||
|
* Free Software Foundation, Inc.,
|
||||||
|
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <kdemacros.h>
|
||||||
|
|
||||||
|
#include <KAuthorized>
|
||||||
|
#include <klocalizedstring.h>
|
||||||
|
|
||||||
|
|
||||||
|
#include "appletauthorization.h"
|
||||||
|
#include <Plasma/AppletScript>
|
||||||
|
#include <Plasma/Applet>
|
||||||
|
|
||||||
|
AppletAuthorization::AppletAuthorization(Plasma::AppletScript *scriptEngine)
|
||||||
|
: Authorization(),
|
||||||
|
m_scriptEngine(scriptEngine)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
bool AppletAuthorization::authorizeRequiredExtension(const QString &extension)
|
||||||
|
{
|
||||||
|
bool ok = m_scriptEngine->applet()->hasAuthorization(extension);
|
||||||
|
|
||||||
|
if (!ok) {
|
||||||
|
m_scriptEngine->setFailedToLaunch(true,
|
||||||
|
i18n("Authorization for required extension '%1' was denied.",
|
||||||
|
extension));
|
||||||
|
}
|
||||||
|
|
||||||
|
return ok;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool AppletAuthorization::authorizeOptionalExtension(const QString &extension)
|
||||||
|
{
|
||||||
|
return m_scriptEngine->applet()->hasAuthorization(extension);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool AppletAuthorization::authorizeExternalExtensions()
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
44
scriptengines/qml/plasmoid/appletauthorization.h
Normal file
44
scriptengines/qml/plasmoid/appletauthorization.h
Normal file
@ -0,0 +1,44 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2010 Aaron J. Seigo <aseigo@kde.org>
|
||||||
|
*
|
||||||
|
* This program is free software; you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU Library General Public License version 2 as
|
||||||
|
* published by the Free Software Foundation
|
||||||
|
*
|
||||||
|
* 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 Library General Public
|
||||||
|
* License along with this program; if not, write to the
|
||||||
|
* Free Software Foundation, Inc.,
|
||||||
|
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef APPLETAUTHORIZATION_H
|
||||||
|
#define APPLETAUTHORIZATION_H
|
||||||
|
|
||||||
|
#include "authorization.h"
|
||||||
|
|
||||||
|
namespace Plasma {
|
||||||
|
class AppletScript;
|
||||||
|
}
|
||||||
|
|
||||||
|
class SimpleJavaScriptApplet;
|
||||||
|
|
||||||
|
class AppletAuthorization : public Authorization
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
AppletAuthorization(Plasma::AppletScript *scriptEngine);
|
||||||
|
|
||||||
|
bool authorizeRequiredExtension(const QString &extension);
|
||||||
|
bool authorizeOptionalExtension(const QString &extension);
|
||||||
|
bool authorizeExternalExtensions();
|
||||||
|
|
||||||
|
private:
|
||||||
|
Plasma::AppletScript *m_scriptEngine;
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
490
scriptengines/qml/plasmoid/appletinterface.cpp
Normal file
490
scriptengines/qml/plasmoid/appletinterface.cpp
Normal file
@ -0,0 +1,490 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2008 Chani Armitage <chani@kde.org>
|
||||||
|
* Copyright 2008, 2009 Aaron Seigo <aseigo@kde.org>
|
||||||
|
* Copyright 2010 Marco Martin <mart@kde.org>
|
||||||
|
*
|
||||||
|
* This program is free software; you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU Library General Public License as
|
||||||
|
* published by the Free Software Foundation; either version 2, 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 Library General Public
|
||||||
|
* License along with this program; if not, write to the
|
||||||
|
* Free Software Foundation, Inc.,
|
||||||
|
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "appletinterface.h"
|
||||||
|
|
||||||
|
#include <QAction>
|
||||||
|
#include <QDir>
|
||||||
|
#include <QFile>
|
||||||
|
#include <QScriptEngine>
|
||||||
|
#include <QSignalMapper>
|
||||||
|
#include <QTimer>
|
||||||
|
|
||||||
|
#include <KDebug>
|
||||||
|
#include <KGlobalSettings>
|
||||||
|
#include <KIcon>
|
||||||
|
#include <KService>
|
||||||
|
#include <KServiceTypeTrader>
|
||||||
|
|
||||||
|
#include <Plasma/Plasma>
|
||||||
|
#include <Plasma/Applet>
|
||||||
|
#include <Plasma/Corona>
|
||||||
|
#include <Plasma/Package>
|
||||||
|
|
||||||
|
Q_DECLARE_METATYPE(AppletInterface*)
|
||||||
|
|
||||||
|
AppletInterface::AppletInterface(AbstractJsAppletScript *parent)
|
||||||
|
: QObject(parent),
|
||||||
|
m_appletScriptEngine(parent),
|
||||||
|
m_actionSignals(0)
|
||||||
|
{
|
||||||
|
connect(this, SIGNAL(releaseVisualFocus()), applet(), SIGNAL(releaseVisualFocus()));
|
||||||
|
connect(this, SIGNAL(configNeedsSaving()), applet(), SIGNAL(configNeedsSaving()));
|
||||||
|
connect(applet(), SIGNAL(immutabilityChanged(Plasma::ImmutabilityType)), this, SIGNAL(immutableChanged()));
|
||||||
|
connect(applet(), SIGNAL(newStatus(Plasma::ItemStatus)), this, SIGNAL(statusChanged()));
|
||||||
|
connect(m_appletScriptEngine, SIGNAL(formFactorChanged()),
|
||||||
|
this, SIGNAL(formFactorChanged()));
|
||||||
|
connect(m_appletScriptEngine, SIGNAL(locationChanged()),
|
||||||
|
this, SIGNAL(locationChanged()));
|
||||||
|
connect(m_appletScriptEngine, SIGNAL(contextChanged()),
|
||||||
|
this, SIGNAL(contextChanged()));
|
||||||
|
}
|
||||||
|
|
||||||
|
AppletInterface::~AppletInterface()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
AppletInterface *AppletInterface::extract(QScriptEngine *engine)
|
||||||
|
{
|
||||||
|
QScriptValue appletValue = engine->globalObject().property("plasmoid");
|
||||||
|
return qobject_cast<AppletInterface*>(appletValue.toQObject());
|
||||||
|
}
|
||||||
|
|
||||||
|
Plasma::DataEngine* AppletInterface::dataEngine(const QString &name)
|
||||||
|
{
|
||||||
|
return applet()->dataEngine(name);
|
||||||
|
}
|
||||||
|
|
||||||
|
AppletInterface::FormFactor AppletInterface::formFactor() const
|
||||||
|
{
|
||||||
|
return static_cast<FormFactor>(applet()->formFactor());
|
||||||
|
}
|
||||||
|
|
||||||
|
AppletInterface::Location AppletInterface::location() const
|
||||||
|
{
|
||||||
|
return static_cast<Location>(applet()->location());
|
||||||
|
}
|
||||||
|
|
||||||
|
QString AppletInterface::currentActivity() const
|
||||||
|
{
|
||||||
|
return applet()->containment()->activity();
|
||||||
|
}
|
||||||
|
|
||||||
|
AppletInterface::AspectRatioMode AppletInterface::aspectRatioMode() const
|
||||||
|
{
|
||||||
|
return static_cast<AspectRatioMode>(applet()->aspectRatioMode());
|
||||||
|
}
|
||||||
|
|
||||||
|
void AppletInterface::setAspectRatioMode(AppletInterface::AspectRatioMode mode)
|
||||||
|
{
|
||||||
|
applet()->setAspectRatioMode(static_cast<Plasma::AspectRatioMode>(mode));
|
||||||
|
}
|
||||||
|
|
||||||
|
bool AppletInterface::shouldConserveResources() const
|
||||||
|
{
|
||||||
|
return applet()->shouldConserveResources();
|
||||||
|
}
|
||||||
|
|
||||||
|
void AppletInterface::setFailedToLaunch(bool failed, const QString &reason)
|
||||||
|
{
|
||||||
|
m_appletScriptEngine->setFailedToLaunch(failed, reason);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool AppletInterface::isBusy() const
|
||||||
|
{
|
||||||
|
return applet()->isBusy();
|
||||||
|
}
|
||||||
|
|
||||||
|
void AppletInterface::setBusy(bool busy)
|
||||||
|
{
|
||||||
|
applet()->setBusy(busy);
|
||||||
|
}
|
||||||
|
|
||||||
|
AppletInterface::BackgroundHints AppletInterface::backgroundHints() const
|
||||||
|
{
|
||||||
|
return static_cast<BackgroundHints>(static_cast<int>(applet()->backgroundHints()));
|
||||||
|
}
|
||||||
|
|
||||||
|
void AppletInterface::setBackgroundHints(BackgroundHints hint)
|
||||||
|
{
|
||||||
|
applet()->setBackgroundHints(Plasma::BackgroundHints(hint));
|
||||||
|
}
|
||||||
|
|
||||||
|
void AppletInterface::setConfigurationRequired(bool needsConfiguring, const QString &reason)
|
||||||
|
{
|
||||||
|
m_appletScriptEngine->setConfigurationRequired(needsConfiguring, reason);
|
||||||
|
}
|
||||||
|
|
||||||
|
QString AppletInterface::activeConfig() const
|
||||||
|
{
|
||||||
|
return m_currentConfig.isEmpty() ? "main" : m_currentConfig;
|
||||||
|
}
|
||||||
|
|
||||||
|
void AppletInterface::setActiveConfig(const QString &name)
|
||||||
|
{
|
||||||
|
if (name == "main") {
|
||||||
|
m_currentConfig.clear();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
Plasma::ConfigLoader *loader = m_configs.value(name, 0);
|
||||||
|
|
||||||
|
if (!loader) {
|
||||||
|
QString path = m_appletScriptEngine->filePath("config", name + ".xml");
|
||||||
|
if (path.isEmpty()) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
QFile f(path);
|
||||||
|
KConfigGroup cg = applet()->config();
|
||||||
|
loader = new Plasma::ConfigLoader(&cg, &f, this);
|
||||||
|
m_configs.insert(name, loader);
|
||||||
|
}
|
||||||
|
|
||||||
|
m_currentConfig = name;
|
||||||
|
}
|
||||||
|
|
||||||
|
void AppletInterface::writeConfig(const QString &entry, const QVariant &value)
|
||||||
|
{
|
||||||
|
Plasma::ConfigLoader *config = 0;
|
||||||
|
if (m_currentConfig.isEmpty()) {
|
||||||
|
config = applet()->configScheme();
|
||||||
|
} else {
|
||||||
|
config = m_configs.value(m_currentConfig, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (config) {
|
||||||
|
KConfigSkeletonItem *item = config->findItemByName(entry);
|
||||||
|
if (item) {
|
||||||
|
item->setProperty(value);
|
||||||
|
config->blockSignals(true);
|
||||||
|
config->writeConfig();
|
||||||
|
config->blockSignals(false);
|
||||||
|
m_appletScriptEngine->configNeedsSaving();
|
||||||
|
}
|
||||||
|
} else
|
||||||
|
kWarning() << "Couldn't find a configuration entry";
|
||||||
|
}
|
||||||
|
|
||||||
|
QVariant AppletInterface::readConfig(const QString &entry) const
|
||||||
|
{
|
||||||
|
Plasma::ConfigLoader *config = 0;
|
||||||
|
QVariant result;
|
||||||
|
|
||||||
|
if (m_currentConfig.isEmpty()) {
|
||||||
|
config = applet()->configScheme();
|
||||||
|
} else {
|
||||||
|
config = m_configs.value(m_currentConfig, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (config) {
|
||||||
|
result = config->property(entry);
|
||||||
|
}
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
QString AppletInterface::file(const QString &fileType)
|
||||||
|
{
|
||||||
|
return m_appletScriptEngine->filePath(fileType, QString());
|
||||||
|
}
|
||||||
|
|
||||||
|
QString AppletInterface::file(const QString &fileType, const QString &filePath)
|
||||||
|
{
|
||||||
|
return m_appletScriptEngine->filePath(fileType, filePath);
|
||||||
|
}
|
||||||
|
|
||||||
|
QList<QAction*> AppletInterface::contextualActions() const
|
||||||
|
{
|
||||||
|
QList<QAction*> actions;
|
||||||
|
Plasma::Applet *a = applet();
|
||||||
|
if (a->hasFailedToLaunch()) {
|
||||||
|
return actions;
|
||||||
|
}
|
||||||
|
|
||||||
|
foreach (const QString &name, m_actions) {
|
||||||
|
QAction *action = a->action(name);
|
||||||
|
|
||||||
|
if (action) {
|
||||||
|
actions << action;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return actions;
|
||||||
|
}
|
||||||
|
|
||||||
|
void AppletInterface::setActionSeparator(const QString &name)
|
||||||
|
{
|
||||||
|
Plasma::Applet *a = applet();
|
||||||
|
QAction *action = a->action(name);
|
||||||
|
|
||||||
|
if (action) {
|
||||||
|
action->setSeparator(true);
|
||||||
|
} else {
|
||||||
|
action = new QAction(this);
|
||||||
|
action->setSeparator(true);
|
||||||
|
a->addAction(name, action);
|
||||||
|
m_actions.append(name);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void AppletInterface::setAction(const QString &name, const QString &text, const QString &icon, const QString &shortcut)
|
||||||
|
{
|
||||||
|
Plasma::Applet *a = applet();
|
||||||
|
QAction *action = a->action(name);
|
||||||
|
|
||||||
|
if (action) {
|
||||||
|
action->setText(text);
|
||||||
|
} else {
|
||||||
|
action = new QAction(text, this);
|
||||||
|
a->addAction(name, action);
|
||||||
|
|
||||||
|
Q_ASSERT(!m_actions.contains(name));
|
||||||
|
m_actions.append(name);
|
||||||
|
|
||||||
|
if (!m_actionSignals) {
|
||||||
|
m_actionSignals = new QSignalMapper(this);
|
||||||
|
connect(m_actionSignals, SIGNAL(mapped(QString)),
|
||||||
|
m_appletScriptEngine, SLOT(executeAction(QString)));
|
||||||
|
}
|
||||||
|
|
||||||
|
connect(action, SIGNAL(triggered()), m_actionSignals, SLOT(map()));
|
||||||
|
m_actionSignals->setMapping(action, name);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!icon.isEmpty()) {
|
||||||
|
action->setIcon(KIcon(icon));
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!shortcut.isEmpty()) {
|
||||||
|
action->setShortcut(shortcut);
|
||||||
|
}
|
||||||
|
|
||||||
|
action->setObjectName(name);
|
||||||
|
}
|
||||||
|
|
||||||
|
void AppletInterface::removeAction(const QString &name)
|
||||||
|
{
|
||||||
|
Plasma::Applet *a = applet();
|
||||||
|
QAction *action = a->action(name);
|
||||||
|
|
||||||
|
if (action) {
|
||||||
|
if (m_actionSignals) {
|
||||||
|
m_actionSignals->removeMappings(action);
|
||||||
|
}
|
||||||
|
|
||||||
|
delete action;
|
||||||
|
}
|
||||||
|
|
||||||
|
m_actions.removeAll(name);
|
||||||
|
}
|
||||||
|
|
||||||
|
QAction *AppletInterface::action(QString name) const
|
||||||
|
{
|
||||||
|
return applet()->action(name);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool AppletInterface::immutable() const
|
||||||
|
{
|
||||||
|
return applet()->immutability() != Plasma::Mutable;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool AppletInterface::userConfiguring() const
|
||||||
|
{
|
||||||
|
return applet()->isUserConfiguring();
|
||||||
|
}
|
||||||
|
|
||||||
|
int AppletInterface::apiVersion() const
|
||||||
|
{
|
||||||
|
const QString constraint("[X-Plasma-API] == 'javascript' and 'Applet' in [X-Plasma-ComponentTypes]");
|
||||||
|
KService::List offers = KServiceTypeTrader::self()->query("Plasma/ScriptEngine", constraint);
|
||||||
|
if (offers.isEmpty()) {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
return offers.first()->property("X-KDE-PluginInfo-Version", QVariant::Int).toInt();
|
||||||
|
}
|
||||||
|
|
||||||
|
bool AppletInterface::include(const QString &script)
|
||||||
|
{
|
||||||
|
const QString path = m_appletScriptEngine->filePath("scripts", script);
|
||||||
|
|
||||||
|
if (path.isEmpty()) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
return m_appletScriptEngine->include(path);
|
||||||
|
}
|
||||||
|
|
||||||
|
void AppletInterface::debug(const QString &msg)
|
||||||
|
{
|
||||||
|
kDebug() << msg;
|
||||||
|
}
|
||||||
|
|
||||||
|
void AppletInterface::setAssociatedApplication(const QString &string)
|
||||||
|
{
|
||||||
|
applet()->setAssociatedApplication(string);
|
||||||
|
}
|
||||||
|
|
||||||
|
QString AppletInterface::associatedApplication() const
|
||||||
|
{
|
||||||
|
return applet()->associatedApplication();
|
||||||
|
}
|
||||||
|
|
||||||
|
void AppletInterface::setStatus(const AppletInterface::ItemStatus &status)
|
||||||
|
{
|
||||||
|
applet()->setStatus((Plasma::ItemStatus)status);
|
||||||
|
}
|
||||||
|
|
||||||
|
AppletInterface::ItemStatus AppletInterface::status() const
|
||||||
|
{
|
||||||
|
return (AppletInterface::ItemStatus)((int)(applet()->status()));
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
QString AppletInterface::downloadPath(const QString &file)
|
||||||
|
{
|
||||||
|
KDesktopFile config(v.toVariant().value<Plasma::Package>().path() + "/metadata.desktop");
|
||||||
|
KConfigGroup cg = config.desktopGroup();
|
||||||
|
const QString pluginName = cg.readEntry("X-KDE-PluginInfo-Name", QString());
|
||||||
|
destination = KGlobalSettings::downloadPath() + "/Plasma/" + pluginName + '/';
|
||||||
|
}
|
||||||
|
*/
|
||||||
|
|
||||||
|
QStringList AppletInterface::downloadedFiles() const
|
||||||
|
{
|
||||||
|
const QString downloadDir = KGlobalSettings::downloadPath() + "/Plasma/" + applet()->pluginName();
|
||||||
|
QDir dir(downloadDir);
|
||||||
|
return dir.entryList(QDir::Files | QDir::NoSymLinks | QDir::Readable);
|
||||||
|
}
|
||||||
|
|
||||||
|
void AppletInterface::gc()
|
||||||
|
{
|
||||||
|
QTimer::singleShot(0, m_appletScriptEngine, SLOT(collectGarbage()));
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
///////////// ContainmentInterface
|
||||||
|
|
||||||
|
ContainmentInterface::ContainmentInterface(AbstractJsAppletScript *parent)
|
||||||
|
: APPLETSUPERCLASS(parent),
|
||||||
|
m_movableApplets(true)
|
||||||
|
{
|
||||||
|
connect(containment(), SIGNAL(appletRemoved(Plasma::Applet *)), this, SLOT(appletRemovedForward(Plasma::Applet *)));
|
||||||
|
|
||||||
|
connect(containment(), SIGNAL(appletAdded(Plasma::Applet *, const QPointF &)), this, SLOT(appletAddedForward(Plasma::Applet *, const QPointF &)));
|
||||||
|
|
||||||
|
connect(containment(), SIGNAL(screenChanged(int, int, Plasma::Containment*)), this, SIGNAL(screenChanged()));
|
||||||
|
|
||||||
|
connect(containment(), SIGNAL(activityChanged()), this, SIGNAL(activityChanged()));
|
||||||
|
|
||||||
|
if (containment()->corona()) {
|
||||||
|
connect(containment()->corona(), SIGNAL(availableScreenRegionChanged()),
|
||||||
|
this, SIGNAL(availableScreenRegionChanged()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
QVariantList ContainmentInterface::applets()
|
||||||
|
{
|
||||||
|
QVariantList list;
|
||||||
|
int i = 0;
|
||||||
|
foreach (Plasma::Applet *applet, containment()->applets()) {
|
||||||
|
list << QVariant::fromValue(applet);
|
||||||
|
++i;
|
||||||
|
}
|
||||||
|
return list;
|
||||||
|
}
|
||||||
|
|
||||||
|
void ContainmentInterface::setDrawWallpaper(bool drawWallpaper)
|
||||||
|
{
|
||||||
|
m_appletScriptEngine->setDrawWallpaper(drawWallpaper);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool ContainmentInterface::drawWallpaper()
|
||||||
|
{
|
||||||
|
return m_appletScriptEngine->drawWallpaper();
|
||||||
|
}
|
||||||
|
|
||||||
|
ContainmentInterface::Type ContainmentInterface::containmentType() const
|
||||||
|
{
|
||||||
|
return (ContainmentInterface::Type)m_appletScriptEngine->containmentType();
|
||||||
|
}
|
||||||
|
|
||||||
|
void ContainmentInterface::setContainmentType(ContainmentInterface::Type type)
|
||||||
|
{
|
||||||
|
m_appletScriptEngine->setContainmentType((Plasma::Containment::Type)type);
|
||||||
|
}
|
||||||
|
|
||||||
|
int ContainmentInterface::screen() const
|
||||||
|
{
|
||||||
|
return containment()->screen();
|
||||||
|
}
|
||||||
|
|
||||||
|
QRectF ContainmentInterface::screenGeometry(int id) const
|
||||||
|
{
|
||||||
|
QRectF rect;
|
||||||
|
if (containment()->corona()) {
|
||||||
|
rect = QRectF(containment()->corona()->screenGeometry(id));
|
||||||
|
}
|
||||||
|
|
||||||
|
return rect;
|
||||||
|
}
|
||||||
|
|
||||||
|
QVariantList ContainmentInterface::availableScreenRegion(int id) const
|
||||||
|
{
|
||||||
|
QRegion reg;
|
||||||
|
if (containment()->corona()) {
|
||||||
|
reg = containment()->corona()->availableScreenRegion(id);
|
||||||
|
}
|
||||||
|
|
||||||
|
QVariantList regVal;
|
||||||
|
int i = 0;
|
||||||
|
foreach (QRect rect, reg.rects()) {
|
||||||
|
regVal << QVariant::fromValue(QRectF(rect));
|
||||||
|
}
|
||||||
|
return regVal;
|
||||||
|
}
|
||||||
|
|
||||||
|
void ContainmentInterface::appletAddedForward(Plasma::Applet *applet, const QPointF &pos)
|
||||||
|
{
|
||||||
|
emit appletAdded(applet, pos);
|
||||||
|
}
|
||||||
|
|
||||||
|
void ContainmentInterface::appletRemovedForward(Plasma::Applet *applet)
|
||||||
|
{
|
||||||
|
emit appletRemoved(applet);
|
||||||
|
}
|
||||||
|
|
||||||
|
QString ContainmentInterface::activityName() const
|
||||||
|
{
|
||||||
|
//TODO
|
||||||
|
return QString();
|
||||||
|
//return containment()->activityName();
|
||||||
|
}
|
||||||
|
|
||||||
|
QString ContainmentInterface::activityId() const
|
||||||
|
{
|
||||||
|
return containment()->activity();
|
||||||
|
}
|
||||||
|
|
||||||
|
#ifndef USE_JS_SCRIPTENGINE
|
||||||
|
#include "appletinterface.moc"
|
||||||
|
#endif
|
377
scriptengines/qml/plasmoid/appletinterface.h
Normal file
377
scriptengines/qml/plasmoid/appletinterface.h
Normal file
@ -0,0 +1,377 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2008 Chani Armitage <chani@kde.org>
|
||||||
|
* Copyright 2008, 2009 Aaron Seigo <aseigo@kde.org>
|
||||||
|
* Copyright 2010 Marco Martin <mart@kde.org>
|
||||||
|
*
|
||||||
|
* This program is free software; you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU Library General Public License as
|
||||||
|
* published by the Free Software Foundation; either version 2, 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 Library General Public
|
||||||
|
* License along with this program; if not, write to the
|
||||||
|
* Free Software Foundation, Inc.,
|
||||||
|
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef APPLETINTERFACE_H
|
||||||
|
#define APPLETINTERFACE_H
|
||||||
|
|
||||||
|
#include <QAbstractAnimation>
|
||||||
|
#include <QObject>
|
||||||
|
#include <QScriptValue>
|
||||||
|
|
||||||
|
#include <Plasma/Applet>
|
||||||
|
#include <Plasma/Containment>
|
||||||
|
#include <Plasma/DataEngine>
|
||||||
|
#include <Plasma/Theme>
|
||||||
|
|
||||||
|
#include "abstractjsappletscript.h"
|
||||||
|
|
||||||
|
class QAction;
|
||||||
|
class QmlAppletScript;
|
||||||
|
class QSignalMapper;
|
||||||
|
class QSizeF;
|
||||||
|
|
||||||
|
|
||||||
|
namespace Plasma
|
||||||
|
{
|
||||||
|
class ConfigLoader;
|
||||||
|
} // namespace Plasa
|
||||||
|
|
||||||
|
class AppletInterface : public QObject
|
||||||
|
{
|
||||||
|
Q_OBJECT
|
||||||
|
Q_ENUMS(FormFactor)
|
||||||
|
Q_ENUMS(Location)
|
||||||
|
Q_ENUMS(AspectRatioMode)
|
||||||
|
Q_ENUMS(BackgroundHints)
|
||||||
|
Q_ENUMS(QtOrientation)
|
||||||
|
Q_ENUMS(QtModifiers)
|
||||||
|
Q_ENUMS(QtAnchorPoint)
|
||||||
|
Q_ENUMS(QtCorner)
|
||||||
|
Q_ENUMS(QtAlignment)
|
||||||
|
Q_ENUMS(QtMouseButton)
|
||||||
|
Q_ENUMS(AnimationDirection)
|
||||||
|
Q_ENUMS(IntervalAlignment)
|
||||||
|
Q_ENUMS(ThemeColors)
|
||||||
|
Q_ENUMS(ItemStatus)
|
||||||
|
Q_PROPERTY(AspectRatioMode aspectRatioMode READ aspectRatioMode WRITE setAspectRatioMode)
|
||||||
|
Q_PROPERTY(FormFactor formFactor READ formFactor NOTIFY formFactorChanged)
|
||||||
|
Q_PROPERTY(Location location READ location NOTIFY locationChanged)
|
||||||
|
Q_PROPERTY(QString currentActivity READ currentActivity NOTIFY contextChanged)
|
||||||
|
Q_PROPERTY(bool shouldConserveResources READ shouldConserveResources)
|
||||||
|
Q_PROPERTY(QString activeConfig WRITE setActiveConfig READ activeConfig)
|
||||||
|
Q_PROPERTY(bool busy WRITE setBusy READ isBusy)
|
||||||
|
Q_PROPERTY(BackgroundHints backgroundHints WRITE setBackgroundHints READ backgroundHints)
|
||||||
|
Q_PROPERTY(bool immutable READ immutable NOTIFY immutableChanged)
|
||||||
|
Q_PROPERTY(bool userConfiguring READ userConfiguring) // @since 4.5
|
||||||
|
Q_PROPERTY(int apiVersion READ apiVersion CONSTANT)
|
||||||
|
Q_PROPERTY(ItemStatus status READ status WRITE setStatus NOTIFY statusChanged)
|
||||||
|
Q_PROPERTY(QString associatedApplication WRITE setAssociatedApplication READ associatedApplication)
|
||||||
|
|
||||||
|
public:
|
||||||
|
AppletInterface(AbstractJsAppletScript *parent);
|
||||||
|
~AppletInterface();
|
||||||
|
|
||||||
|
//------------------------------------------------------------------
|
||||||
|
//enums copy&pasted from plasma.h because qtscript is evil
|
||||||
|
|
||||||
|
enum FormFactor {
|
||||||
|
Planar = 0, /**< The applet lives in a plane and has two
|
||||||
|
degrees of freedom to grow. Optimize for
|
||||||
|
desktop, laptop or tablet usage: a high
|
||||||
|
resolution screen 1-3 feet distant from the
|
||||||
|
viewer. */
|
||||||
|
MediaCenter, /**< As with Planar, the applet lives in a plane
|
||||||
|
but the interface should be optimized for
|
||||||
|
medium-to-high resolution screens that are
|
||||||
|
5-15 feet distant from the viewer. Sometimes
|
||||||
|
referred to as a "ten foot interface".*/
|
||||||
|
Horizontal, /**< The applet is constrained vertically, but
|
||||||
|
can expand horizontally. */
|
||||||
|
Vertical, /**< The applet is constrained horizontally, but
|
||||||
|
can expand vertically. */
|
||||||
|
Application /**< The Applet lives in a plane and should be optimized to look as a full application,
|
||||||
|
for the desktop or the particular device. */
|
||||||
|
};
|
||||||
|
|
||||||
|
enum Location {
|
||||||
|
Floating = 0, /**< Free floating. Neither geometry or z-ordering
|
||||||
|
is described precisely by this value. */
|
||||||
|
Desktop, /**< On the planar desktop layer, extending across
|
||||||
|
the full screen from edge to edge */
|
||||||
|
FullScreen, /**< Full screen */
|
||||||
|
TopEdge, /**< Along the top of the screen*/
|
||||||
|
BottomEdge, /**< Along the bottom of the screen*/
|
||||||
|
LeftEdge, /**< Along the left side of the screen */
|
||||||
|
RightEdge /**< Along the right side of the screen */
|
||||||
|
};
|
||||||
|
|
||||||
|
enum AspectRatioMode {
|
||||||
|
InvalidAspectRatioMode = -1, /**< Unsetted mode used for dev convenience
|
||||||
|
when there is a need to store the
|
||||||
|
aspectRatioMode somewhere */
|
||||||
|
IgnoreAspectRatio = 0, /**< The applet can be freely resized */
|
||||||
|
KeepAspectRatio = 1, /**< The applet keeps a fixed aspect ratio */
|
||||||
|
Square = 2, /**< The applet is always a square */
|
||||||
|
ConstrainedSquare = 3, /**< The applet is no wider (in horizontal
|
||||||
|
formfactors) or no higher (in vertical
|
||||||
|
ones) than a square */
|
||||||
|
FixedSize = 4 /** The applet cannot be resized */
|
||||||
|
};
|
||||||
|
|
||||||
|
enum ItemStatus {
|
||||||
|
UnknownStatus = 0, /**< The status is unknown **/
|
||||||
|
PassiveStatus = 1, /**< The Item is passive **/
|
||||||
|
ActiveStatus = 2, /**< The Item is active **/
|
||||||
|
NeedsAttentionStatus = 3, /**< The Item needs attention **/
|
||||||
|
AcceptingInputStatus = 4 /**< The Item is accepting input **/
|
||||||
|
};
|
||||||
|
|
||||||
|
//From Qt namespace
|
||||||
|
enum QtModifiers {
|
||||||
|
QtNoModifier = Qt::NoModifier,
|
||||||
|
QtShiftModifier = Qt::ShiftModifier,
|
||||||
|
QtControlModifier = Qt::ControlModifier,
|
||||||
|
QtAltModifier = Qt::AltModifier,
|
||||||
|
QtMetaModifier = Qt::MetaModifier
|
||||||
|
};
|
||||||
|
|
||||||
|
enum QtOrientation {
|
||||||
|
QtHorizontal= Qt::Horizontal,
|
||||||
|
QtVertical = Qt::Vertical
|
||||||
|
};
|
||||||
|
|
||||||
|
enum QtAnchorPoint {
|
||||||
|
QtAnchorLeft = Qt::AnchorLeft,
|
||||||
|
QtAnchorRight = Qt::AnchorRight,
|
||||||
|
QtAnchorBottom = Qt::AnchorBottom,
|
||||||
|
QtAnchorTop = Qt::AnchorTop,
|
||||||
|
QtAnchorHorizontalCenter = Qt::AnchorHorizontalCenter,
|
||||||
|
QtAnchorVerticalCenter = Qt::AnchorVerticalCenter
|
||||||
|
};
|
||||||
|
|
||||||
|
enum QtCorner {
|
||||||
|
QtTopLeftCorner = Qt::TopLeftCorner,
|
||||||
|
QtTopRightCorner = Qt::TopRightCorner,
|
||||||
|
QtBottomLeftCorner = Qt::BottomLeftCorner,
|
||||||
|
QtBottomRightCorner = Qt::BottomRightCorner
|
||||||
|
};
|
||||||
|
|
||||||
|
enum BackgroundHints {
|
||||||
|
NoBackground = Plasma::NoBackground,
|
||||||
|
StandardBackground = Plasma::StandardBackground,
|
||||||
|
TranslucentBackground = Plasma::TranslucentBackground,
|
||||||
|
DefaultBackground = Plasma::DefaultBackground
|
||||||
|
};
|
||||||
|
|
||||||
|
enum ThemeColors {
|
||||||
|
TextColor = Plasma::Theme::TextColor,
|
||||||
|
HighlightColor = Plasma::Theme::HighlightColor,
|
||||||
|
BackgroundColor = Plasma::Theme::BackgroundColor,
|
||||||
|
ButtonTextColor = Plasma::Theme::ButtonTextColor,
|
||||||
|
ButtonBackgroundColor = Plasma::Theme::ButtonBackgroundColor,
|
||||||
|
LinkColor = Plasma::Theme::LinkColor,
|
||||||
|
VisitedLinkColor = Plasma::Theme::VisitedLinkColor
|
||||||
|
};
|
||||||
|
|
||||||
|
enum QtAlignment {
|
||||||
|
QtAlignLeft = 0x0001,
|
||||||
|
QtAlignRight = 0x0002,
|
||||||
|
QtAlignHCenter = 0x0004,
|
||||||
|
QtAlignJustify = 0x0005,
|
||||||
|
QtAlignTop = 0x0020,
|
||||||
|
QtAlignBottom = 0x0020,
|
||||||
|
QtAlignVCenter = 0x0080
|
||||||
|
};
|
||||||
|
|
||||||
|
enum QtMouseButton {
|
||||||
|
QtNoButton = Qt::NoButton,
|
||||||
|
QtLeftButton = Qt::LeftButton,
|
||||||
|
QtRightButton = Qt::RightButton,
|
||||||
|
QtMidButton = Qt::MidButton,
|
||||||
|
QtXButton1 = Qt::XButton1,
|
||||||
|
QtXButton2 = Qt::XButton2
|
||||||
|
};
|
||||||
|
|
||||||
|
enum QtScrollBarPolicy {
|
||||||
|
QtScrollBarAsNeeded = Qt::ScrollBarAsNeeded,
|
||||||
|
QtScrollBarAlwaysOff = Qt::ScrollBarAlwaysOff,
|
||||||
|
QtScrollBarAlwaysOn = Qt::ScrollBarAlwaysOn
|
||||||
|
};
|
||||||
|
|
||||||
|
enum AnimationDirection {
|
||||||
|
AnimationForward = QAbstractAnimation::Forward,
|
||||||
|
AnimationBackward = QAbstractAnimation::Backward
|
||||||
|
};
|
||||||
|
|
||||||
|
enum IntervalAlignment {
|
||||||
|
NoAlignment = 0,
|
||||||
|
AlignToMinute,
|
||||||
|
AlignToHour
|
||||||
|
};
|
||||||
|
|
||||||
|
//-------------------------------------------------------------------
|
||||||
|
|
||||||
|
Q_INVOKABLE void gc();
|
||||||
|
Q_INVOKABLE FormFactor formFactor() const;
|
||||||
|
|
||||||
|
Location location() const;
|
||||||
|
QString currentActivity() const;
|
||||||
|
bool shouldConserveResources() const;
|
||||||
|
|
||||||
|
Q_INVOKABLE AspectRatioMode aspectRatioMode() const;
|
||||||
|
Q_INVOKABLE void setAspectRatioMode(AspectRatioMode mode);
|
||||||
|
|
||||||
|
Q_INVOKABLE void setFailedToLaunch(bool failed, const QString &reason = QString());
|
||||||
|
|
||||||
|
Q_INVOKABLE bool isBusy() const;
|
||||||
|
Q_INVOKABLE void setBusy(bool busy);
|
||||||
|
|
||||||
|
Q_INVOKABLE BackgroundHints backgroundHints() const;
|
||||||
|
Q_INVOKABLE void setBackgroundHints(BackgroundHints hint);
|
||||||
|
|
||||||
|
Q_INVOKABLE void setConfigurationRequired(bool needsConfiguring, const QString &reason = QString());
|
||||||
|
|
||||||
|
Q_INVOKABLE void setActionSeparator(const QString &name);
|
||||||
|
Q_INVOKABLE void setAction(const QString &name, const QString &text,
|
||||||
|
const QString &icon = QString(), const QString &shortcut = QString());
|
||||||
|
|
||||||
|
Q_INVOKABLE void removeAction(const QString &name);
|
||||||
|
|
||||||
|
Q_INVOKABLE QAction *action(QString name) const;
|
||||||
|
|
||||||
|
Q_INVOKABLE QString activeConfig() const;
|
||||||
|
|
||||||
|
Q_INVOKABLE void setActiveConfig(const QString &name);
|
||||||
|
|
||||||
|
Q_INVOKABLE QVariant readConfig(const QString &entry) const;
|
||||||
|
|
||||||
|
Q_INVOKABLE void writeConfig(const QString &entry, const QVariant &value);
|
||||||
|
|
||||||
|
Q_INVOKABLE QString file(const QString &fileType);
|
||||||
|
Q_INVOKABLE QString file(const QString &fileType, const QString &filePath);
|
||||||
|
|
||||||
|
Q_INVOKABLE bool include(const QString &script);
|
||||||
|
|
||||||
|
Q_INVOKABLE void debug(const QString &msg);
|
||||||
|
|
||||||
|
Plasma::DataEngine *dataEngine(const QString &name);
|
||||||
|
|
||||||
|
QList<QAction*> contextualActions() const;
|
||||||
|
bool immutable() const;
|
||||||
|
bool userConfiguring() const;
|
||||||
|
int apiVersion() const;
|
||||||
|
|
||||||
|
static AppletInterface *extract(QScriptEngine *engine);
|
||||||
|
inline Plasma::Applet *applet() const { return m_appletScriptEngine->applet(); }
|
||||||
|
|
||||||
|
void setAssociatedApplication(const QString &string);
|
||||||
|
QString associatedApplication() const;
|
||||||
|
|
||||||
|
void setStatus(const ItemStatus &status);
|
||||||
|
ItemStatus status() const;
|
||||||
|
|
||||||
|
// Q_INVOKABLE QString downloadPath(const QString &file);
|
||||||
|
Q_INVOKABLE QStringList downloadedFiles() const;
|
||||||
|
|
||||||
|
Q_SIGNALS:
|
||||||
|
void releaseVisualFocus();
|
||||||
|
void configNeedsSaving();
|
||||||
|
|
||||||
|
void formFactorChanged();
|
||||||
|
void locationChanged();
|
||||||
|
void contextChanged();
|
||||||
|
void immutableChanged();
|
||||||
|
void statusChanged();
|
||||||
|
|
||||||
|
protected:
|
||||||
|
AbstractJsAppletScript *m_appletScriptEngine;
|
||||||
|
|
||||||
|
private:
|
||||||
|
QStringList m_actions;
|
||||||
|
QSignalMapper *m_actionSignals;
|
||||||
|
QString m_currentConfig;
|
||||||
|
QMap<QString, Plasma::ConfigLoader*> m_configs;
|
||||||
|
};
|
||||||
|
|
||||||
|
class JsAppletInterface : public AppletInterface
|
||||||
|
{
|
||||||
|
Q_OBJECT
|
||||||
|
Q_PROPERTY(QObject *sender READ sender)
|
||||||
|
|
||||||
|
public:
|
||||||
|
JsAppletInterface(AbstractJsAppletScript *parent)
|
||||||
|
: AppletInterface(parent)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
#ifdef USE_JS_SCRIPTENGINE
|
||||||
|
#define APPLETSUPERCLASS JsAppletInterface
|
||||||
|
#else
|
||||||
|
#define APPLETSUPERCLASS AppletInterface
|
||||||
|
#endif
|
||||||
|
|
||||||
|
class ContainmentInterface : public APPLETSUPERCLASS
|
||||||
|
{
|
||||||
|
Q_OBJECT
|
||||||
|
Q_PROPERTY(QVariantList applets READ applets)
|
||||||
|
Q_PROPERTY(bool drawWallpaper READ drawWallpaper WRITE setDrawWallpaper)
|
||||||
|
Q_PROPERTY(Type containmentType READ containmentType WRITE setContainmentType)
|
||||||
|
Q_PROPERTY(int screen READ screen NOTIFY screenChanged)
|
||||||
|
Q_PROPERTY(QString activityName READ activityName NOTIFY activityNameChanged)
|
||||||
|
Q_PROPERTY(QString activityId READ activityId NOTIFY activityIdChanged)
|
||||||
|
Q_ENUMS(Type)
|
||||||
|
|
||||||
|
public:
|
||||||
|
enum Type {
|
||||||
|
NoContainmentType = -1, /**< @internal */
|
||||||
|
DesktopContainment = 0, /**< A desktop containment */
|
||||||
|
PanelContainment, /**< A desktop panel */
|
||||||
|
CustomContainment = 127, /**< A containment that is neither a desktop nor a panel
|
||||||
|
but something application specific */
|
||||||
|
CustomPanelContainment = 128 /**< A customized desktop panel */
|
||||||
|
};
|
||||||
|
ContainmentInterface(AbstractJsAppletScript *parent);
|
||||||
|
|
||||||
|
inline Plasma::Containment *containment() const { return static_cast<Plasma::Containment *>(m_appletScriptEngine->applet()); }
|
||||||
|
|
||||||
|
QVariantList applets();
|
||||||
|
|
||||||
|
void setDrawWallpaper(bool drawWallpaper);
|
||||||
|
bool drawWallpaper();
|
||||||
|
Type containmentType() const;
|
||||||
|
void setContainmentType(Type type);
|
||||||
|
int screen() const;
|
||||||
|
|
||||||
|
QString activityName() const;
|
||||||
|
QString activityId() const;
|
||||||
|
|
||||||
|
Q_INVOKABLE QRectF screenGeometry(int id) const;
|
||||||
|
Q_INVOKABLE QVariantList availableScreenRegion(int id) const;
|
||||||
|
|
||||||
|
Q_SIGNALS:
|
||||||
|
void appletAdded(QObject *applet, const QPointF &pos);
|
||||||
|
void appletRemoved(QObject *applet);
|
||||||
|
void screenChanged();
|
||||||
|
void activityNameChanged();
|
||||||
|
void activityIdChanged();
|
||||||
|
void availableScreenRegionChanged();
|
||||||
|
|
||||||
|
protected Q_SLOTS:
|
||||||
|
void appletAddedForward(Plasma::Applet *applet, const QPointF &pos);
|
||||||
|
void appletRemovedForward(Plasma::Applet *applet);
|
||||||
|
|
||||||
|
private:
|
||||||
|
bool m_movableApplets;
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif
|
379
scriptengines/qml/plasmoid/declarativeappletscript.cpp
Normal file
379
scriptengines/qml/plasmoid/declarativeappletscript.cpp
Normal file
@ -0,0 +1,379 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2009 by Alan Alpert <alan.alpert@nokia.com>
|
||||||
|
* Copyright 2010 by Ménard Alexis <menard@kde.org>
|
||||||
|
|
||||||
|
* This program is free software; you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU Library General Public License as
|
||||||
|
* published by the Free Software Foundation; either version 2, 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 Library General Public
|
||||||
|
* License along with this program; if not, write to the
|
||||||
|
* Free Software Foundation, Inc.,
|
||||||
|
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <QQmlComponent>
|
||||||
|
#include <QQmlContext>
|
||||||
|
#include <QQmlEngine>
|
||||||
|
#include <QQmlExpression>
|
||||||
|
#include <QFile>
|
||||||
|
#include <QTimer>
|
||||||
|
#include <QUiLoader>
|
||||||
|
#include <QWidget>
|
||||||
|
|
||||||
|
#include <KConfigGroup>
|
||||||
|
#include <KDebug>
|
||||||
|
#include <KGlobal>
|
||||||
|
#include <KLocale>
|
||||||
|
#include <KGlobalSettings>
|
||||||
|
#include <klocalizedstring.h>
|
||||||
|
|
||||||
|
#include <Plasma/Applet>
|
||||||
|
#include <Plasma/Package>
|
||||||
|
#include <Plasma/PluginLoader>
|
||||||
|
|
||||||
|
|
||||||
|
#include "plasmoid/declarativeappletscript.h"
|
||||||
|
|
||||||
|
#include "plasmoid/appletinterface.h"
|
||||||
|
|
||||||
|
#include "common/scriptenv.h"
|
||||||
|
#include "declarative/qmlobject.h"
|
||||||
|
//#include "declarative/declarativeitemcontainer_p.h"
|
||||||
|
#include "declarative/packageaccessmanagerfactory.h"
|
||||||
|
|
||||||
|
|
||||||
|
K_EXPORT_PLASMA_APPLETSCRIPTENGINE(declarativeappletscript, DeclarativeAppletScript)
|
||||||
|
|
||||||
|
|
||||||
|
QScriptValue constructIconClass(QScriptEngine *engine);
|
||||||
|
QScriptValue constructKUrlClass(QScriptEngine *engine);
|
||||||
|
QScriptValue constructQPointClass(QScriptEngine *engine);
|
||||||
|
void registerSimpleAppletMetaTypes(QScriptEngine *engine);
|
||||||
|
DeclarativeAppletScript::DeclarativeAppletScript(QObject *parent, const QVariantList &args)
|
||||||
|
: AbstractJsAppletScript(parent, args),
|
||||||
|
m_qmlObject(0),
|
||||||
|
m_toolBoxWidget(0),
|
||||||
|
m_interface(0),
|
||||||
|
m_env(0),
|
||||||
|
m_auth(this)
|
||||||
|
{
|
||||||
|
Q_UNUSED(args);
|
||||||
|
}
|
||||||
|
|
||||||
|
DeclarativeAppletScript::~DeclarativeAppletScript()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
bool DeclarativeAppletScript::init()
|
||||||
|
{
|
||||||
|
m_qmlObject = new QmlObject(applet());
|
||||||
|
m_qmlObject->setInitializationDelayed(true);
|
||||||
|
connect(m_qmlObject, SIGNAL(finished()), this, SLOT(qmlCreationFinished()));
|
||||||
|
//FIXME: what replaced this?
|
||||||
|
//KGlobal::locale()->insertCatalog("plasma_applet_" % description().pluginName());
|
||||||
|
|
||||||
|
//make possible to import extensions from the package
|
||||||
|
//FIXME: probably to be removed, would make possible to use native code from within the package :/
|
||||||
|
//m_qmlObject->engine()->addImportPath(package()->path()+"/contents/imports");
|
||||||
|
|
||||||
|
//use our own custom network access manager that will access Plasma packages and to manage security (i.e. deny access to remote stuff when the proper extension isn't enabled
|
||||||
|
QQmlEngine *engine = m_qmlObject->engine();
|
||||||
|
QQmlNetworkAccessManagerFactory *factory = engine->networkAccessManagerFactory();
|
||||||
|
engine->setNetworkAccessManagerFactory(0);
|
||||||
|
delete factory;
|
||||||
|
engine->setNetworkAccessManagerFactory(new PackageAccessManagerFactory(&package(), &m_auth));
|
||||||
|
|
||||||
|
m_qmlObject->setQmlPath(mainScript());
|
||||||
|
|
||||||
|
if (!m_qmlObject->engine() || !m_qmlObject->engine()->rootContext() || !m_qmlObject->engine()->rootContext()->isValid() || m_qmlObject->mainComponent()->isError()) {
|
||||||
|
QString reason;
|
||||||
|
foreach (QQmlError error, m_qmlObject->mainComponent()->errors()) {
|
||||||
|
reason += error.toString()+'\n';
|
||||||
|
}
|
||||||
|
setFailedToLaunch(true, reason);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
Plasma::Applet *a = applet();
|
||||||
|
Plasma::Containment *cont = qobject_cast<Plasma::Containment *>(a);
|
||||||
|
|
||||||
|
//TODO: assign the graphical root object
|
||||||
|
|
||||||
|
if (cont) {
|
||||||
|
m_interface = new ContainmentInterface(this);
|
||||||
|
//fail? so it's a normal Applet
|
||||||
|
} else {
|
||||||
|
m_interface = new AppletInterface(this);
|
||||||
|
}
|
||||||
|
|
||||||
|
connect(applet(), SIGNAL(activate()),
|
||||||
|
this, SLOT(activate()));
|
||||||
|
|
||||||
|
setupObjects();
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
void DeclarativeAppletScript::qmlCreationFinished()
|
||||||
|
{
|
||||||
|
//If it's a popupapplet and the root object has a "compactRepresentation" component, use that instead of the icon
|
||||||
|
Plasma::Applet *a = applet();
|
||||||
|
m_self->setProperty("rootItem", QVariant::fromValue(m_qmlObject->rootObject()));
|
||||||
|
|
||||||
|
/*TODO: all applets must become pa
|
||||||
|
if (pa) {
|
||||||
|
QQmlComponent *iconComponent = m_qmlObject->rootObject()->property("compactRepresentation").value<QQmlComponent *>();
|
||||||
|
if (iconComponent) {
|
||||||
|
QDeclarativeItem *declarativeIcon = qobject_cast<QDeclarativeItem *>(iconComponent->create(iconComponent->creationContext()));
|
||||||
|
if (declarativeIcon) {
|
||||||
|
pa->setPopupIcon(QIcon());
|
||||||
|
QGraphicsLinearLayout *lay = new QGraphicsLinearLayout(a);
|
||||||
|
lay->setContentsMargins(0, 0, 0, 0);
|
||||||
|
DeclarativeItemContainer *declarativeItemContainer = new DeclarativeItemContainer(a);
|
||||||
|
lay->addItem(declarativeItemContainer);
|
||||||
|
declarativeItemContainer->setDeclarativeItem(declarativeIcon, true);
|
||||||
|
} else {
|
||||||
|
pa->setPopupIcon(a->icon());
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
pa->setPopupIcon(a->icon());
|
||||||
|
}
|
||||||
|
}*/
|
||||||
|
|
||||||
|
Plasma::Containment *pc = qobject_cast<Plasma::Containment *>(a);
|
||||||
|
if (pc) {
|
||||||
|
Plasma::Package pkg = Plasma::PluginLoader::self()->loadPackage("Plasma/Generic");
|
||||||
|
pkg.setPath("org.kde.toolbox");
|
||||||
|
if (pkg.isValid()) {
|
||||||
|
const QString qmlPath = pkg.filePath("mainscript");
|
||||||
|
|
||||||
|
m_toolBoxWidget = new QmlObject(pc);
|
||||||
|
m_toolBoxWidget->setInitializationDelayed(true);
|
||||||
|
m_toolBoxWidget->setQmlPath(qmlPath);
|
||||||
|
|
||||||
|
m_toolBoxWidget->rootObject()->setProperty("plasmoid", QVariant::fromValue(m_self));
|
||||||
|
} else {
|
||||||
|
kWarning() << "Could not load org.kde.toolbox package.";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
QString DeclarativeAppletScript::filePath(const QString &type, const QString &file) const
|
||||||
|
{
|
||||||
|
const QString path = m_env->filePathFromScriptContext(type.toLocal8Bit().constData(), file);
|
||||||
|
|
||||||
|
if (!path.isEmpty()) {
|
||||||
|
return path;
|
||||||
|
}
|
||||||
|
|
||||||
|
return package().filePath(type.toLocal8Bit().constData(), file);
|
||||||
|
}
|
||||||
|
|
||||||
|
void DeclarativeAppletScript::configChanged()
|
||||||
|
{
|
||||||
|
if (!m_env) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
m_env->callEventListeners("configchanged");
|
||||||
|
}
|
||||||
|
|
||||||
|
QObject *DeclarativeAppletScript::loadui(const QString &filename)
|
||||||
|
{
|
||||||
|
QFile f(filename);
|
||||||
|
if (!f.open(QIODevice::ReadOnly)) {
|
||||||
|
kWarning() << i18n("Unable to open '%1'",filename);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
QUiLoader loader;
|
||||||
|
QWidget *w = loader.load(&f);
|
||||||
|
f.close();
|
||||||
|
|
||||||
|
return w;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void DeclarativeAppletScript::constraintsEvent(Plasma::Constraints constraints)
|
||||||
|
{
|
||||||
|
if (constraints & Plasma::FormFactorConstraint) {
|
||||||
|
emit formFactorChanged();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (constraints & Plasma::LocationConstraint) {
|
||||||
|
emit locationChanged();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (constraints & Plasma::ContextConstraint) {
|
||||||
|
emit contextChanged();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void DeclarativeAppletScript::popupEvent(bool popped)
|
||||||
|
{
|
||||||
|
if (!m_env) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
QScriptValueList args;
|
||||||
|
args << popped;
|
||||||
|
|
||||||
|
m_env->callEventListeners("popupEvent", args);
|
||||||
|
}
|
||||||
|
|
||||||
|
void DeclarativeAppletScript::dataUpdated(const QString &name, const Plasma::DataEngine::Data &data)
|
||||||
|
{
|
||||||
|
#if 0
|
||||||
|
TODO: callEventListeners is broken without qscriptengine
|
||||||
|
if (!m_engine) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
QScriptValueList args;
|
||||||
|
args << m_engine->toScriptValue(name) << m_engine->toScriptValue(data);
|
||||||
|
|
||||||
|
m_env->callEventListeners("dataUpdated", args);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
void DeclarativeAppletScript::activate()
|
||||||
|
{
|
||||||
|
#if 0
|
||||||
|
TODO: callEventListeners is broken without qscriptengine
|
||||||
|
if (!m_env) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
m_env->callEventListeners("activate");
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
void DeclarativeAppletScript::executeAction(const QString &name)
|
||||||
|
{
|
||||||
|
if (!m_env) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (m_qmlObject->rootObject()) {
|
||||||
|
QMetaObject::invokeMethod(m_qmlObject->rootObject(), QString("action_" + name).toLatin1(), Qt::DirectConnection);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
bool DeclarativeAppletScript::include(const QString &path)
|
||||||
|
{
|
||||||
|
return m_env->include(path);
|
||||||
|
}
|
||||||
|
|
||||||
|
ScriptEnv *DeclarativeAppletScript::scriptEnv()
|
||||||
|
{
|
||||||
|
return m_env;
|
||||||
|
}
|
||||||
|
|
||||||
|
void DeclarativeAppletScript::setupObjects()
|
||||||
|
{
|
||||||
|
#if 0
|
||||||
|
TODO: make this work with QQmlEngine
|
||||||
|
m_engine = m_qmlObject->scriptEngine();
|
||||||
|
if (!m_engine) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
connect(m_engine, SIGNAL(signalHandlerException(const QScriptValue &)),
|
||||||
|
this, SLOT(signalHandlerException(const QScriptValue &)));
|
||||||
|
|
||||||
|
delete m_env;
|
||||||
|
m_env = new ScriptEnv(this, m_engine);
|
||||||
|
|
||||||
|
QScriptValue global = m_engine->globalObject();
|
||||||
|
|
||||||
|
QScriptValue v = m_engine->newVariant(QVariant::fromValue(*applet()->package()));
|
||||||
|
global.setProperty("__plasma_package", v,
|
||||||
|
QScriptValue::ReadOnly | QScriptValue::Undeletable | QScriptValue::SkipInEnumeration);
|
||||||
|
|
||||||
|
m_self = m_engine->newQObject(m_interface);
|
||||||
|
m_self.setScope(global);
|
||||||
|
global.setProperty("plasmoid", m_self);
|
||||||
|
m_env->addMainObjectProperties(m_self);
|
||||||
|
|
||||||
|
QScriptValue args = m_engine->newArray();
|
||||||
|
int i = 0;
|
||||||
|
foreach (const QVariant &arg, applet()->startupArguments()) {
|
||||||
|
args.setProperty(i, m_engine->newVariant(arg));
|
||||||
|
++i;
|
||||||
|
}
|
||||||
|
global.setProperty("startupArguments", args);
|
||||||
|
|
||||||
|
// Add a global loadui method for ui files
|
||||||
|
QScriptValue fun = m_engine->newFunction(DeclarativeAppletScript::loadui);
|
||||||
|
global.setProperty("loadui", fun);
|
||||||
|
|
||||||
|
ScriptEnv::registerEnums(global, AppletInterface::staticMetaObject);
|
||||||
|
//Make enum values accessible also as plasmoid.Planar etc
|
||||||
|
ScriptEnv::registerEnums(m_self, AppletInterface::staticMetaObject);
|
||||||
|
|
||||||
|
global.setProperty("dataEngine", m_engine->newFunction(DeclarativeAppletScript::dataEngine));
|
||||||
|
global.setProperty("service", m_engine->newFunction(DeclarativeAppletScript::service));
|
||||||
|
global.setProperty("loadService", m_engine->newFunction(DeclarativeAppletScript::loadService));
|
||||||
|
|
||||||
|
//Add stuff from Qt
|
||||||
|
//TODO: move to libkdeclarative?
|
||||||
|
ByteArrayClass *baClass = new ByteArrayClass(m_engine);
|
||||||
|
global.setProperty("ByteArray", baClass->constructor());
|
||||||
|
global.setProperty("QPoint", constructQPointClass(m_engine));
|
||||||
|
|
||||||
|
// Add stuff from KDE libs
|
||||||
|
qScriptRegisterSequenceMetaType<KUrl::List>(m_engine);
|
||||||
|
global.setProperty("Url", constructKUrlClass(m_engine));
|
||||||
|
|
||||||
|
// Add stuff from Plasma
|
||||||
|
global.setProperty("Svg", m_engine->newFunction(DeclarativeAppletScript::newPlasmaSvg));
|
||||||
|
global.setProperty("FrameSvg", m_engine->newFunction(DeclarativeAppletScript::newPlasmaFrameSvg));
|
||||||
|
|
||||||
|
if (!m_env->importExtensions(description(), m_self, m_auth)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
registerSimpleAppletMetaTypes(m_engine);
|
||||||
|
QTimer::singleShot(0, this, SLOT(configChanged()));
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
QObject *DeclarativeAppletScript::dataEngine(const QString &dataEngineName)
|
||||||
|
{
|
||||||
|
return applet()->dataEngine(dataEngineName);
|
||||||
|
}
|
||||||
|
|
||||||
|
QObject *DeclarativeAppletScript::service(const QString &dataEngine, const QString &source)
|
||||||
|
{
|
||||||
|
Plasma::DataEngine *data = applet()->dataEngine(dataEngine);
|
||||||
|
return data->serviceForSource(source);
|
||||||
|
}
|
||||||
|
|
||||||
|
QObject *DeclarativeAppletScript::loadService(const QString &pluginName)
|
||||||
|
{
|
||||||
|
return Plasma::PluginLoader::self()->loadService(pluginName, QVariantList(), applet());
|
||||||
|
}
|
||||||
|
|
||||||
|
QList<QAction*> DeclarativeAppletScript::contextualActions()
|
||||||
|
{
|
||||||
|
if (!m_interface) {
|
||||||
|
return QList<QAction *>();
|
||||||
|
}
|
||||||
|
|
||||||
|
return m_interface->contextualActions();
|
||||||
|
}
|
||||||
|
|
||||||
|
QQmlEngine *DeclarativeAppletScript::engine() const
|
||||||
|
{
|
||||||
|
return m_qmlObject->engine();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
#include "declarativeappletscript.moc"
|
||||||
|
|
87
scriptengines/qml/plasmoid/declarativeappletscript.h
Normal file
87
scriptengines/qml/plasmoid/declarativeappletscript.h
Normal file
@ -0,0 +1,87 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2009 by Alan Alpert <alan.alpert@nokia.com>
|
||||||
|
* Copyright 2010 by Ménard Alexis <menard@kde.org>
|
||||||
|
|
||||||
|
* This program is free software; you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU Library General Public License as
|
||||||
|
* published by the Free Software Foundation; either version 2, 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 Library General Public
|
||||||
|
* License along with this program; if not, write to the
|
||||||
|
* Free Software Foundation, Inc.,
|
||||||
|
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef DECLARATIVE_APPLETSCRIPT_H
|
||||||
|
#define DECLARATIVE_APPLETSCRIPT_H
|
||||||
|
|
||||||
|
#include <kdemacros.h>
|
||||||
|
|
||||||
|
#include "abstractjsappletscript.h"
|
||||||
|
#include "plasmoid/appletauthorization.h"
|
||||||
|
#include <Plasma/DataEngine>
|
||||||
|
|
||||||
|
class AppletInterface;
|
||||||
|
|
||||||
|
class QmlObject;
|
||||||
|
class ScriptEnv;
|
||||||
|
class EngineAccess;
|
||||||
|
|
||||||
|
class DeclarativeAppletScript : public AbstractJsAppletScript
|
||||||
|
{
|
||||||
|
Q_OBJECT
|
||||||
|
|
||||||
|
public:
|
||||||
|
DeclarativeAppletScript(QObject *parent, const QVariantList &args);
|
||||||
|
~DeclarativeAppletScript();
|
||||||
|
|
||||||
|
QString filePath(const QString &type, const QString &file) const;
|
||||||
|
|
||||||
|
QList<QAction*> contextualActions();
|
||||||
|
|
||||||
|
void constraintsEvent(Plasma::Constraints constraints);
|
||||||
|
|
||||||
|
bool include(const QString &path);
|
||||||
|
|
||||||
|
ScriptEnv *scriptEnv();
|
||||||
|
QQmlEngine *engine() const;
|
||||||
|
|
||||||
|
static QObject *loadui(const QString &filename);
|
||||||
|
QObject *dataEngine(const QString &dataEngineName);
|
||||||
|
QObject *service(const QString &dataEngine, const QString &source);
|
||||||
|
QObject *loadService(const QString &pluginName);
|
||||||
|
|
||||||
|
public Q_SLOTS:
|
||||||
|
void executeAction(const QString &name);
|
||||||
|
void dataUpdated(const QString &name, const Plasma::DataEngine::Data &data);
|
||||||
|
//void signalHandlerException(const QObject &exception);
|
||||||
|
void popupEvent(bool popped);
|
||||||
|
void activate();
|
||||||
|
void configChanged();
|
||||||
|
void qmlCreationFinished();
|
||||||
|
|
||||||
|
protected:
|
||||||
|
bool init();
|
||||||
|
void setupObjects();
|
||||||
|
|
||||||
|
Q_SIGNALS:
|
||||||
|
void formFactorChanged();
|
||||||
|
void locationChanged();
|
||||||
|
void contextChanged();
|
||||||
|
|
||||||
|
private:
|
||||||
|
QmlObject *m_qmlObject;
|
||||||
|
QmlObject *m_toolBoxWidget;
|
||||||
|
AppletInterface *m_interface;
|
||||||
|
QObject *m_self;
|
||||||
|
ScriptEnv *m_env;
|
||||||
|
AppletAuthorization m_auth;
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif
|
22
scriptengines/qml/plasmoid/jsappletinterface.cpp
Normal file
22
scriptengines/qml/plasmoid/jsappletinterface.cpp
Normal file
@ -0,0 +1,22 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2010 Marco Martin <mart@kde.org>
|
||||||
|
*
|
||||||
|
* This program is free software; you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU Library General Public License version 2 as
|
||||||
|
* published by the Free Software Foundation
|
||||||
|
*
|
||||||
|
* 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 Library General Public
|
||||||
|
* License along with this program; if not, write to the
|
||||||
|
* Free Software Foundation, Inc.,
|
||||||
|
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#define USE_JS_SCRIPTENGINE
|
||||||
|
#include "appletinterface.cpp"
|
||||||
|
#include "appletinterface.moc"
|
||||||
|
|
Loading…
x
Reference in New Issue
Block a user