204 lines
5.3 KiB
C++
204 lines
5.3 KiB
C++
#include "tellduscenterapplication.h"
|
|
#include <QMessageBox>
|
|
#include <QDir>
|
|
#include <QIcon>
|
|
#include <QPluginLoader>
|
|
#include <QTranslator>
|
|
#include <QScriptEngine>
|
|
|
|
#include <QDebug>
|
|
#include "tellduscenterplugin.h"
|
|
#include "plugintree.h"
|
|
#include "scriptenvironment.h"
|
|
|
|
#define DEFINE_STRING_HELPER(X) #X
|
|
#define DEFINE_STRING(X) DEFINE_STRING_HELPER(X)
|
|
|
|
class TelldusCenterPlugin;
|
|
|
|
typedef QList<TelldusCenterPlugin *> PluginList;
|
|
|
|
|
|
class TelldusCenterApplicationPrivate {
|
|
public:
|
|
PluginList plugins;
|
|
MainWindow *mainWindow;
|
|
ScriptEnvironment *scriptEnvironment;
|
|
};
|
|
|
|
TelldusCenterApplication::TelldusCenterApplication(int &argc, char **argv)
|
|
:QtSingleApplication(argc, argv)
|
|
{
|
|
d = new TelldusCenterApplicationPrivate;
|
|
connect(this, SIGNAL(messageReceived(const QString &)), this, SLOT(msgReceived(const QString &)));
|
|
d->scriptEnvironment = new ScriptEnvironment(this);
|
|
}
|
|
|
|
TelldusCenterApplication::~TelldusCenterApplication() {
|
|
qDeleteAll(d->plugins);
|
|
delete d;
|
|
}
|
|
|
|
void TelldusCenterApplication::initialize() {
|
|
d->mainWindow = new MainWindow( d->scriptEnvironment );
|
|
|
|
this->setActivationWindow(d->mainWindow, false);
|
|
|
|
loadPlugins();
|
|
loadScripts();
|
|
loadToolbar();
|
|
|
|
emit allDoneLoading();
|
|
}
|
|
|
|
PluginList TelldusCenterApplication::plugins() const {
|
|
if (d->plugins.empty()) {
|
|
return PluginList();
|
|
}
|
|
return d->plugins;
|
|
}
|
|
|
|
QScriptValue TelldusCenterApplication::mainWindow() {
|
|
QScriptValue value = d->scriptEnvironment->engine()->newQObject(d->mainWindow);
|
|
return value;
|
|
}
|
|
|
|
void TelldusCenterApplication::showMainWindow() {
|
|
d->mainWindow->show();
|
|
}
|
|
|
|
bool TelldusCenterApplication::isMainWindowShown() {
|
|
return d->mainWindow->isVisible();
|
|
}
|
|
|
|
#if defined(Q_WS_MAC)
|
|
bool TelldusCenterApplication::event(QEvent *event)
|
|
{
|
|
switch (event->type()) {
|
|
case QEvent::ApplicationActivate: {
|
|
showMainWindow();
|
|
return true;
|
|
}
|
|
default:
|
|
break;
|
|
}
|
|
return QApplication::event(event);
|
|
}
|
|
#endif
|
|
|
|
void TelldusCenterApplication::eventTriggered( const QString &name, const QString &title ) {
|
|
qDebug() << "Systray - eventTriggered:" << name << title;
|
|
}
|
|
|
|
void TelldusCenterApplication::loadPlugins() {
|
|
QDir pluginsDir = QDir(qApp->applicationDirPath());
|
|
QStringList paths;
|
|
|
|
#if defined(Q_OS_MAC)
|
|
if (pluginsDir.dirName() == "MacOS") {
|
|
pluginsDir.cdUp();
|
|
}
|
|
#endif
|
|
|
|
if (pluginsDir.cd("Plugins")) {
|
|
paths << pluginsDir.absolutePath();
|
|
}
|
|
|
|
|
|
#if defined(Q_OS_UNIX)
|
|
paths << DEFINE_STRING(PLUGIN_LIB_PATH);
|
|
#endif
|
|
|
|
this->setLibraryPaths( paths );
|
|
|
|
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));
|
|
QObject *plugin = loader.instance();
|
|
if (plugin) { //Load the plugin
|
|
loadPlugin(plugin);
|
|
}
|
|
}
|
|
}
|
|
|
|
void TelldusCenterApplication::loadPlugin(QObject *plugin) {
|
|
TelldusCenterPlugin *iPlugin = qobject_cast<TelldusCenterPlugin *>(plugin);
|
|
if (!iPlugin) {
|
|
return;
|
|
}
|
|
QObject *qObjectPlugin = qobject_cast<QObject *>(plugin);
|
|
if (qObjectPlugin) {
|
|
if (qObjectPlugin->metaObject()->indexOfSignal( QMetaObject::normalizedSignature("hej()") ) >= 0) {
|
|
connect(qObjectPlugin, SIGNAL(hej()), this, SLOT(aboutQt()));
|
|
}
|
|
}
|
|
d->plugins.append(iPlugin);
|
|
}
|
|
|
|
void TelldusCenterApplication::loadScripts() {
|
|
foreach (QString extension, d->scriptEnvironment->engine()->availableExtensions()) {
|
|
if (extension.startsWith("...")) {
|
|
continue;
|
|
}
|
|
foreach(QDir dir, this->libraryPaths()) {
|
|
dir.cd("script");
|
|
QString path = extension;
|
|
path.replace('.', '/');
|
|
if (!dir.cd(path)) {
|
|
continue;
|
|
}
|
|
QTranslator *translator = new QTranslator(this);
|
|
if (!translator->load("translation_" + QLocale::system().name(), dir.absolutePath())) {
|
|
delete translator;
|
|
continue;
|
|
}
|
|
this->installTranslator(translator);
|
|
}
|
|
|
|
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->scriptEnvironment->engine()->clearExceptions();
|
|
}
|
|
}
|
|
|
|
void TelldusCenterApplication::loadToolbar() {
|
|
if (!d->plugins.empty()) {
|
|
QSet<QString> toolbarIcons;
|
|
foreach( TelldusCenterPlugin *plugin, d->plugins ) {
|
|
QStringList widgets = plugin->widgets();
|
|
foreach( QString widget, widgets ) {
|
|
d->mainWindow->addWidget( widget, plugin->iconForPage( PluginTree::page(widget) ), plugin->widget(widget, d->mainWindow) );
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
void TelldusCenterApplication::addWidget( const QString &page, const QString &icon, QWidget *widget ) {
|
|
QString path;
|
|
QFileInfo info(icon);
|
|
if (info.isRelative()) {
|
|
QDir dir = d->scriptEnvironment->currentDir();
|
|
path = dir.filePath(icon);
|
|
} else {
|
|
path = icon;
|
|
}
|
|
|
|
d->mainWindow->addWidget(page, QIcon(path), widget);
|
|
}
|
|
|
|
void TelldusCenterApplication::addWidget( const QString &page, const QIcon &icon, QWidget *widget ) {
|
|
d->mainWindow->addWidget(page, icon, widget);
|
|
}
|
|
|
|
TelldusCenterApplication *TelldusCenterApplication::instance() {
|
|
return (static_cast<TelldusCenterApplication *>(QCoreApplication::instance()));
|
|
}
|
|
|
|
void TelldusCenterApplication::msgReceived(const QString & message) {
|
|
this->showMainWindow();
|
|
}
|