use the engine access in DeclarativeWidget
now DeclarativeWidget itself steals the scriptengine, so use it instead of having the hack there
This commit is contained in:
parent
2754c01add
commit
2a54c9c416
@ -20,6 +20,8 @@
|
|||||||
#include "datamodel.h"
|
#include "datamodel.h"
|
||||||
#include "datasource_p.h"
|
#include "datasource_p.h"
|
||||||
|
|
||||||
|
#include <QTimer>
|
||||||
|
|
||||||
#include <KDebug>
|
#include <KDebug>
|
||||||
|
|
||||||
namespace Plasma
|
namespace Plasma
|
||||||
@ -140,6 +142,11 @@ DataModel::DataModel(QObject* parent)
|
|||||||
this, SIGNAL(countChanged()));
|
this, SIGNAL(countChanged()));
|
||||||
connect(this, SIGNAL(modelReset()),
|
connect(this, SIGNAL(modelReset()),
|
||||||
this, SIGNAL(countChanged()));
|
this, SIGNAL(countChanged()));
|
||||||
|
|
||||||
|
m_roleNamesTimer = new QTimer(this);
|
||||||
|
m_roleNamesTimer->setSingleShot(true);
|
||||||
|
connect(m_roleNamesTimer, SIGNAL(timeout()),
|
||||||
|
this, SLOT(syncRoleNames()));
|
||||||
}
|
}
|
||||||
|
|
||||||
DataModel::~DataModel()
|
DataModel::~DataModel()
|
||||||
@ -253,6 +260,13 @@ void DataModel::setItems(const QString &sourceName, const QVariantList &list)
|
|||||||
setRoleNames(m_roleNames);
|
setRoleNames(m_roleNames);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
m_roleNamesTimer->start(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
void DataModel::syncRoleNames()
|
||||||
|
{
|
||||||
|
setRoleNames(m_roleNames);
|
||||||
|
|
||||||
//make the declarative view reload everything,
|
//make the declarative view reload everything,
|
||||||
//would be nice an incremental update but is not possible
|
//would be nice an incremental update but is not possible
|
||||||
emit modelReset();
|
emit modelReset();
|
||||||
|
@ -26,6 +26,7 @@
|
|||||||
|
|
||||||
#include <Plasma/DataEngine>
|
#include <Plasma/DataEngine>
|
||||||
|
|
||||||
|
class QTimer;
|
||||||
|
|
||||||
namespace Plasma
|
namespace Plasma
|
||||||
{
|
{
|
||||||
@ -125,10 +126,12 @@ Q_SIGNALS:
|
|||||||
private Q_SLOTS:
|
private Q_SLOTS:
|
||||||
void dataUpdated(const QString &sourceName, const Plasma::DataEngine::Data &data);
|
void dataUpdated(const QString &sourceName, const Plasma::DataEngine::Data &data);
|
||||||
void removeSource(const QString &sourceName);
|
void removeSource(const QString &sourceName);
|
||||||
|
void syncRoleNames();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
DataSource *m_dataSource;
|
DataSource *m_dataSource;
|
||||||
QString m_keyRoleFilter;
|
QString m_keyRoleFilter;
|
||||||
|
QTimer *m_roleNamesTimer;
|
||||||
QMap<QString, QVector<QVariant> > m_items;
|
QMap<QString, QVector<QVariant> > m_items;
|
||||||
QHash<int, QByteArray> m_roleNames;
|
QHash<int, QByteArray> m_roleNames;
|
||||||
QHash<QString, int> m_roleIds;
|
QHash<QString, int> m_roleIds;
|
||||||
|
@ -127,7 +127,6 @@ set(declarative_appletscript_SRCS
|
|||||||
plasmoid/appletauthorization.cpp
|
plasmoid/appletauthorization.cpp
|
||||||
plasmoid/appletinterface.cpp
|
plasmoid/appletinterface.cpp
|
||||||
plasmoid/declarativeappletscript.cpp
|
plasmoid/declarativeappletscript.cpp
|
||||||
plasmoid/engineaccess.cpp
|
|
||||||
plasmoid/themedsvg.cpp
|
plasmoid/themedsvg.cpp
|
||||||
simplebindings/bytearrayclass.cpp
|
simplebindings/bytearrayclass.cpp
|
||||||
simplebindings/bytearrayprototype.cpp
|
simplebindings/bytearrayprototype.cpp
|
||||||
|
@ -46,7 +46,6 @@
|
|||||||
|
|
||||||
#include "plasmoid/declarativeappletscript.h"
|
#include "plasmoid/declarativeappletscript.h"
|
||||||
|
|
||||||
#include "engineaccess.h"
|
|
||||||
#include "plasmoid/appletinterface.h"
|
#include "plasmoid/appletinterface.h"
|
||||||
#include "plasmoid/themedsvg.h"
|
#include "plasmoid/themedsvg.h"
|
||||||
|
|
||||||
@ -123,18 +122,12 @@ bool DeclarativeAppletScript::init()
|
|||||||
m_interface = new AppletInterface(this);
|
m_interface = new AppletInterface(this);
|
||||||
}
|
}
|
||||||
|
|
||||||
m_engineAccess = new EngineAccess(this);
|
|
||||||
m_declarativeWidget->engine()->rootContext()->setContextProperty("__engineAccess", m_engineAccess);
|
|
||||||
|
|
||||||
connect(applet(), SIGNAL(extenderItemRestored(Plasma::ExtenderItem*)),
|
connect(applet(), SIGNAL(extenderItemRestored(Plasma::ExtenderItem*)),
|
||||||
this, SLOT(extenderItemRestored(Plasma::ExtenderItem*)));
|
this, SLOT(extenderItemRestored(Plasma::ExtenderItem*)));
|
||||||
connect(applet(), SIGNAL(activate()),
|
connect(applet(), SIGNAL(activate()),
|
||||||
this, SLOT(activate()));
|
this, SLOT(activate()));
|
||||||
|
|
||||||
//Glorious hack:steal the engine
|
setupObjects();
|
||||||
QDeclarativeExpression *expr = new QDeclarativeExpression(m_declarativeWidget->engine()->rootContext(), m_declarativeWidget->rootObject(), "__engineAccess.setEngine(this)");
|
|
||||||
expr->evaluate();
|
|
||||||
delete expr;
|
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
@ -352,10 +345,19 @@ ScriptEnv *DeclarativeAppletScript::scriptEnv()
|
|||||||
|
|
||||||
void DeclarativeAppletScript::setupObjects()
|
void DeclarativeAppletScript::setupObjects()
|
||||||
{
|
{
|
||||||
QScriptValue global = m_engine->globalObject();
|
m_engine = m_declarativeWidget->scriptEngine();
|
||||||
|
connect(m_engine, SIGNAL(signalHandlerException(const QScriptValue &)),
|
||||||
|
this, SLOT(signalHandlerException(const QScriptValue &)));
|
||||||
|
QScriptValue originalGlobalObject = m_engine->globalObject();
|
||||||
|
|
||||||
m_declarativeWidget->engine()->rootContext()->setContextProperty("__engineAccess", 0);
|
QScriptValue newGlobalObject = m_engine->newObject();
|
||||||
m_engineAccess->deleteLater();
|
|
||||||
|
m_engine->setGlobalObject(newGlobalObject);
|
||||||
|
|
||||||
|
delete m_env;
|
||||||
|
m_env = new ScriptEnv(this, m_engine);
|
||||||
|
|
||||||
|
QScriptValue global = m_engine->globalObject();
|
||||||
|
|
||||||
m_self = m_engine->newQObject(m_interface);
|
m_self = m_engine->newQObject(m_interface);
|
||||||
m_self.setScope(global);
|
m_self.setScope(global);
|
||||||
@ -394,6 +396,16 @@ void DeclarativeAppletScript::setupObjects()
|
|||||||
global.setProperty("Svg", m_engine->newFunction(DeclarativeAppletScript::newPlasmaSvg));
|
global.setProperty("Svg", m_engine->newFunction(DeclarativeAppletScript::newPlasmaSvg));
|
||||||
global.setProperty("FrameSvg", m_engine->newFunction(DeclarativeAppletScript::newPlasmaFrameSvg));
|
global.setProperty("FrameSvg", m_engine->newFunction(DeclarativeAppletScript::newPlasmaFrameSvg));
|
||||||
global.setProperty("ExtenderItem", m_engine->newFunction(DeclarativeAppletScript::newPlasmaExtenderItem));
|
global.setProperty("ExtenderItem", m_engine->newFunction(DeclarativeAppletScript::newPlasmaExtenderItem));
|
||||||
|
|
||||||
|
if (!m_env->importExtensions(description(), m_self, m_auth)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
qScriptRegisterSequenceMetaType<KUrl::List>(m_engine);
|
||||||
|
registerNonGuiMetaTypes(m_engine);
|
||||||
|
registerSimpleAppletMetaTypes(m_engine);
|
||||||
|
|
||||||
|
QTimer::singleShot(0, this, SLOT(configChanged()));
|
||||||
}
|
}
|
||||||
|
|
||||||
QScriptValue DeclarativeAppletScript::dataEngine(QScriptContext *context, QScriptEngine *engine)
|
QScriptValue DeclarativeAppletScript::dataEngine(QScriptContext *context, QScriptEngine *engine)
|
||||||
@ -460,67 +472,6 @@ QScriptEngine *DeclarativeAppletScript::engine() const
|
|||||||
return m_engine;
|
return m_engine;
|
||||||
}
|
}
|
||||||
|
|
||||||
void DeclarativeAppletScript::setEngine(QScriptValue &val)
|
|
||||||
{
|
|
||||||
if (val.engine() == m_engine) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
m_engine = val.engine();
|
|
||||||
connect(m_engine, SIGNAL(signalHandlerException(const QScriptValue &)),
|
|
||||||
this, SLOT(signalHandlerException(const QScriptValue &)));
|
|
||||||
QScriptValue originalGlobalObject = m_engine->globalObject();
|
|
||||||
|
|
||||||
QScriptValue newGlobalObject = m_engine->newObject();
|
|
||||||
|
|
||||||
QString eval = QLatin1String("eval");
|
|
||||||
QString version = QLatin1String("version");
|
|
||||||
|
|
||||||
{
|
|
||||||
QScriptValueIterator iter(originalGlobalObject);
|
|
||||||
QVector<QString> names;
|
|
||||||
QVector<QScriptValue> values;
|
|
||||||
QVector<QScriptValue::PropertyFlags> flags;
|
|
||||||
while (iter.hasNext()) {
|
|
||||||
iter.next();
|
|
||||||
|
|
||||||
QString name = iter.name();
|
|
||||||
|
|
||||||
if (name == version) {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (name != eval) {
|
|
||||||
names.append(name);
|
|
||||||
values.append(iter.value());
|
|
||||||
flags.append(iter.flags() | QScriptValue::Undeletable);
|
|
||||||
}
|
|
||||||
newGlobalObject.setProperty(iter.scriptName(), iter.value());
|
|
||||||
|
|
||||||
// m_illegalNames.insert(name);
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
m_engine->setGlobalObject(newGlobalObject);
|
|
||||||
|
|
||||||
delete m_env;
|
|
||||||
m_env = new ScriptEnv(this, m_engine);
|
|
||||||
//m_env->addMainObjectProperties(newGlobalObject);
|
|
||||||
|
|
||||||
setupObjects();
|
|
||||||
|
|
||||||
if (!m_env->importExtensions(description(), m_self, m_auth)) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
qScriptRegisterSequenceMetaType<KUrl::List>(m_engine);
|
|
||||||
registerNonGuiMetaTypes(m_engine);
|
|
||||||
registerSimpleAppletMetaTypes(m_engine);
|
|
||||||
|
|
||||||
QTimer::singleShot(0, this, SLOT(configChanged()));
|
|
||||||
}
|
|
||||||
|
|
||||||
void DeclarativeAppletScript::signalHandlerException(const QScriptValue &exception)
|
void DeclarativeAppletScript::signalHandlerException(const QScriptValue &exception)
|
||||||
{
|
{
|
||||||
kWarning()<<"Exception caught: "<<exception.toVariant();
|
kWarning()<<"Exception caught: "<<exception.toVariant();
|
||||||
|
@ -47,8 +47,6 @@ public:
|
|||||||
DeclarativeAppletScript(QObject *parent, const QVariantList &args);
|
DeclarativeAppletScript(QObject *parent, const QVariantList &args);
|
||||||
~DeclarativeAppletScript();
|
~DeclarativeAppletScript();
|
||||||
|
|
||||||
void setEngine(QScriptValue &val);
|
|
||||||
|
|
||||||
QString filePath(const QString &type, const QString &file) const;
|
QString filePath(const QString &type, const QString &file) const;
|
||||||
|
|
||||||
void executeAction(const QString &name);
|
void executeAction(const QString &name);
|
||||||
|
@ -1,40 +0,0 @@
|
|||||||
/*
|
|
||||||
* 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 "engineaccess.h"
|
|
||||||
#include "scriptenv.h"
|
|
||||||
|
|
||||||
#include "plasmoid/declarativeappletscript.h"
|
|
||||||
|
|
||||||
EngineAccess::EngineAccess(DeclarativeAppletScript *parent)
|
|
||||||
: QObject(parent),
|
|
||||||
m_appletScriptEngine(parent)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
EngineAccess::~EngineAccess()
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
void EngineAccess::setEngine(QScriptValue val)
|
|
||||||
{
|
|
||||||
m_appletScriptEngine->setEngine(val);
|
|
||||||
}
|
|
||||||
|
|
||||||
#include "engineaccess.moc"
|
|
@ -1,45 +0,0 @@
|
|||||||
/*
|
|
||||||
* 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 ENGINEACCESS_H
|
|
||||||
#define ENGINEACCESS_H
|
|
||||||
|
|
||||||
#include <QObject>
|
|
||||||
|
|
||||||
#include <QScriptValue>
|
|
||||||
|
|
||||||
class DeclarativeAppletScript;
|
|
||||||
|
|
||||||
class EngineAccess : public QObject
|
|
||||||
{
|
|
||||||
Q_OBJECT
|
|
||||||
|
|
||||||
|
|
||||||
public:
|
|
||||||
EngineAccess(DeclarativeAppletScript *parent);
|
|
||||||
~EngineAccess();
|
|
||||||
|
|
||||||
Q_INVOKABLE void setEngine(QScriptValue val);
|
|
||||||
|
|
||||||
private:
|
|
||||||
DeclarativeAppletScript *m_appletScriptEngine;
|
|
||||||
|
|
||||||
};
|
|
||||||
|
|
||||||
#endif
|
|
Loading…
x
Reference in New Issue
Block a user