Refactored and added new class ScriptEnvironment

This commit is contained in:
Micke Prag 2010-12-16 12:51:33 +00:00
parent 393ee4eb02
commit fae8606d23
5 changed files with 86 additions and 31 deletions

View file

@ -11,6 +11,7 @@ endif(COMMAND cmake_policy)
SET( telldus-center_SRCS
main.cpp
mainwindow.cpp
scriptenvironment.cpp
tellduscenterapplication.cpp
AutoUpdater.cpp
message.cpp
@ -26,6 +27,7 @@ SET( telldus-center_HDRS
SET( telldus-center_MOC_HDRS
mainwindow.h
scriptenvironment.h
tellduscenterapplication.h
message.h
)

View file

@ -0,0 +1,37 @@
#include "scriptenvironment.h"
#include <QScriptEngine>
#include <QStringList>
#include <QDebug>
class ScriptEnvironment::PrivateData {
public:
QScriptEngine scriptEngine;
};
ScriptEnvironment::ScriptEnvironment(QObject *parent) :
QObject(parent)
{
d = new PrivateData;
connect(&d->scriptEngine, SIGNAL(signalHandlerException(const QScriptValue &)), this, SLOT(scriptException(const QScriptValue&)));
d->scriptEngine.installTranslatorFunctions();
}
ScriptEnvironment::~ScriptEnvironment() {
delete d;
}
QScriptEngine *ScriptEnvironment::engine() const {
return &d->scriptEngine;
}
void ScriptEnvironment::scriptException(const QScriptValue & exception) {
qDebug() << "ScriptException:" << d->scriptEngine.uncaughtExceptionLineNumber() << exception.toString();
qDebug() << "Backtrace:";
foreach( QString row, d->scriptEngine.uncaughtExceptionBacktrace() ) {
qDebug() << row;
}
d->scriptEngine.clearExceptions();
}

View file

@ -0,0 +1,29 @@
#ifndef SCRIPTENVIRONMENT_H
#define SCRIPTENVIRONMENT_H
#include <QObject>
#include <QScriptValue>
class ScriptEnvironment : public QObject
{
Q_OBJECT
public:
ScriptEnvironment(QObject *parent = 0);
~ScriptEnvironment();
QScriptEngine *engine() const;
signals:
public slots:
private slots:
void scriptException( const QScriptValue &exception );
private:
class PrivateData;
PrivateData *d;
};
#endif // SCRIPTENVIRONMENT_H

View file

@ -3,12 +3,13 @@
#include <QDir>
#include <QIcon>
#include <QPluginLoader>
#include <QScriptEngine>
#include <QTranslator>
#include <QScriptEngine>
#include <QDebug>
#include "tellduscenterplugin.h"
#include "plugintree.h"
#include "scriptenvironment.h"
class TelldusCenterPlugin;
@ -19,7 +20,7 @@ class TelldusCenterApplicationPrivate {
public:
PluginList plugins;
MainWindow *mainWindow;
QScriptEngine scriptEngine;
ScriptEnvironment scriptEnvironment;
};
TelldusCenterApplication::TelldusCenterApplication(int &argc, char **argv)
@ -36,11 +37,8 @@ TelldusCenterApplication::~TelldusCenterApplication() {
void TelldusCenterApplication::initialize() {
d->mainWindow = new MainWindow( );
this->setActivationWindow(d->mainWindow, false);
connect(&d->scriptEngine, SIGNAL(signalHandlerException(const QScriptValue &)), this, SLOT(scriptException(const QScriptValue&)));
d->scriptEngine.installTranslatorFunctions();
loadPlugins();
loadScripts();
@ -57,7 +55,7 @@ PluginList TelldusCenterApplication::plugins() const {
}
QScriptValue TelldusCenterApplication::mainWindow() {
QScriptValue value = d->scriptEngine.newQObject(d->mainWindow);
QScriptValue value = d->scriptEnvironment.engine()->newQObject(d->mainWindow);
return value;
}
@ -102,11 +100,11 @@ void TelldusCenterApplication::loadPlugins() {
this->setLibraryPaths( QStringList(pluginsDir.absolutePath()) );
QScriptValue object = d->scriptEngine.newQObject(this);
d->scriptEngine.globalObject().setProperty("application", object);
QScriptValue object = d->scriptEnvironment.engine()->newQObject(this);
d->scriptEnvironment.engine()->globalObject().setProperty("application", object);
QScriptValue mainWindowObject = d->scriptEngine.newQObject(d->mainWindow);
d->scriptEngine.globalObject().property("application").setProperty("mainwindow", mainWindowObject);
QScriptValue mainWindowObject = d->scriptEnvironment.engine()->newQObject(d->mainWindow);
d->scriptEnvironment.engine()->globalObject().property("application").setProperty("mainwindow", mainWindowObject);
foreach (QString fileName, pluginsDir.entryList(QDir::Files)) {
QPluginLoader loader(pluginsDir.absoluteFilePath(fileName));
@ -132,7 +130,7 @@ void TelldusCenterApplication::loadPlugin(QObject *plugin) {
}
void TelldusCenterApplication::loadScripts() {
foreach (QString extension, d->scriptEngine.availableExtensions()) {
foreach (QString extension, d->scriptEnvironment.engine()->availableExtensions()) {
if (extension.startsWith("...")) {
continue;
}
@ -151,13 +149,13 @@ void TelldusCenterApplication::loadScripts() {
}
this->installTranslator(translator);
}
d->scriptEngine.importExtension( extension );
if (d->scriptEngine.hasUncaughtException()) {
qDebug() << QString("Error in %1:%2:").arg(extension).arg(d->scriptEngine.uncaughtExceptionLineNumber())
<< d->scriptEngine.uncaughtException().toString();
d->scriptEnvironment.engine()->importExtension( extension );
if (d->scriptEnvironment.engine()->hasUncaughtException()) {
qDebug() << QString("Error in %1:%2:").arg(extension).arg(d->scriptEnvironment.engine()->uncaughtExceptionLineNumber())
<< d->scriptEnvironment.engine()->uncaughtException().toString();
}
d->scriptEngine.clearExceptions();
d->scriptEnvironment.engine()->clearExceptions();
}
}
@ -185,16 +183,6 @@ TelldusCenterApplication *TelldusCenterApplication::instance() {
return (static_cast<TelldusCenterApplication *>(QCoreApplication::instance()));
}
void TelldusCenterApplication::scriptException(const QScriptValue & exception) {
qDebug() << "ScriptException:" << d->scriptEngine.uncaughtExceptionLineNumber() << exception.toString();
qDebug() << "Backtrace:";
foreach( QString row, d->scriptEngine.uncaughtExceptionBacktrace() ) {
qDebug() << row;
}
d->scriptEngine.clearExceptions();
}
void TelldusCenterApplication::msgReceived(const QString & message) {
this->showMainWindow();
}

View file

@ -18,7 +18,7 @@ class TelldusCenterApplication : public QtSingleApplication
public:
TelldusCenterApplication(int &argc, char **argv);
virtual ~TelldusCenterApplication();
void initialize();
#if defined(Q_WS_MAC)
@ -32,7 +32,7 @@ public:
void loadToolbar();
static TelldusCenterApplication *instance();
signals:
void allDoneLoading();
@ -47,7 +47,6 @@ public slots:
void showMainWindow();
private slots:
void scriptException( const QScriptValue &exception );
void msgReceived ( const QString & message );
private: