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:
Marco Martin 2011-04-07 22:37:34 +02:00
parent 2754c01add
commit 2a54c9c416
7 changed files with 40 additions and 160 deletions

View File

@ -20,6 +20,8 @@
#include "datamodel.h"
#include "datasource_p.h"
#include <QTimer>
#include <KDebug>
namespace Plasma
@ -140,6 +142,11 @@ DataModel::DataModel(QObject* parent)
this, SIGNAL(countChanged()));
connect(this, SIGNAL(modelReset()),
this, SIGNAL(countChanged()));
m_roleNamesTimer = new QTimer(this);
m_roleNamesTimer->setSingleShot(true);
connect(m_roleNamesTimer, SIGNAL(timeout()),
this, SLOT(syncRoleNames()));
}
DataModel::~DataModel()
@ -253,6 +260,13 @@ void DataModel::setItems(const QString &sourceName, const QVariantList &list)
setRoleNames(m_roleNames);
}
m_roleNamesTimer->start(0);
}
void DataModel::syncRoleNames()
{
setRoleNames(m_roleNames);
//make the declarative view reload everything,
//would be nice an incremental update but is not possible
emit modelReset();

View File

@ -26,6 +26,7 @@
#include <Plasma/DataEngine>
class QTimer;
namespace Plasma
{
@ -125,10 +126,12 @@ Q_SIGNALS:
private Q_SLOTS:
void dataUpdated(const QString &sourceName, const Plasma::DataEngine::Data &data);
void removeSource(const QString &sourceName);
void syncRoleNames();
private:
DataSource *m_dataSource;
QString m_keyRoleFilter;
QTimer *m_roleNamesTimer;
QMap<QString, QVector<QVariant> > m_items;
QHash<int, QByteArray> m_roleNames;
QHash<QString, int> m_roleIds;

View File

@ -127,7 +127,6 @@ set(declarative_appletscript_SRCS
plasmoid/appletauthorization.cpp
plasmoid/appletinterface.cpp
plasmoid/declarativeappletscript.cpp
plasmoid/engineaccess.cpp
plasmoid/themedsvg.cpp
simplebindings/bytearrayclass.cpp
simplebindings/bytearrayprototype.cpp

View File

@ -46,7 +46,6 @@
#include "plasmoid/declarativeappletscript.h"
#include "engineaccess.h"
#include "plasmoid/appletinterface.h"
#include "plasmoid/themedsvg.h"
@ -123,18 +122,12 @@ bool DeclarativeAppletScript::init()
m_interface = new AppletInterface(this);
}
m_engineAccess = new EngineAccess(this);
m_declarativeWidget->engine()->rootContext()->setContextProperty("__engineAccess", m_engineAccess);
connect(applet(), SIGNAL(extenderItemRestored(Plasma::ExtenderItem*)),
this, SLOT(extenderItemRestored(Plasma::ExtenderItem*)));
connect(applet(), SIGNAL(activate()),
this, SLOT(activate()));
//Glorious hack:steal the engine
QDeclarativeExpression *expr = new QDeclarativeExpression(m_declarativeWidget->engine()->rootContext(), m_declarativeWidget->rootObject(), "__engineAccess.setEngine(this)");
expr->evaluate();
delete expr;
setupObjects();
return true;
}
@ -352,10 +345,19 @@ ScriptEnv *DeclarativeAppletScript::scriptEnv()
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);
m_engineAccess->deleteLater();
QScriptValue newGlobalObject = m_engine->newObject();
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.setScope(global);
@ -394,6 +396,16 @@ void DeclarativeAppletScript::setupObjects()
global.setProperty("Svg", m_engine->newFunction(DeclarativeAppletScript::newPlasmaSvg));
global.setProperty("FrameSvg", m_engine->newFunction(DeclarativeAppletScript::newPlasmaFrameSvg));
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)
@ -460,67 +472,6 @@ QScriptEngine *DeclarativeAppletScript::engine() const
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)
{
kWarning()<<"Exception caught: "<<exception.toVariant();

View File

@ -47,8 +47,6 @@ public:
DeclarativeAppletScript(QObject *parent, const QVariantList &args);
~DeclarativeAppletScript();
void setEngine(QScriptValue &val);
QString filePath(const QString &type, const QString &file) const;
void executeAction(const QString &name);

View File

@ -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"

View File

@ -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