diff --git a/contourd/recommendation/RecommendationScriptEngine.cpp b/contourd/recommendation/RecommendationScriptEngine.cpp index 5d7dbcfa..64c0da78 100644 --- a/contourd/recommendation/RecommendationScriptEngine.cpp +++ b/contourd/recommendation/RecommendationScriptEngine.cpp @@ -1,236 +1,246 @@ /* * Copyright (C) 2011 Ivan Cukic * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2, * or (at your option) any later version, 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 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 "RecommendationScriptEngine.h" #include "RecommendationScriptEngine_p.h" #include #include #include #include #include #include #include #include #include #include #include "sensors/dbus/DBusSensor.h" namespace Contour { RecommendationScriptEngineConfig::RecommendationScriptEngineConfig(QObject * parent, KConfigGroup * config) : QObject(parent), m_config(config) { } RecommendationScriptEngineConfig::~RecommendationScriptEngineConfig() { delete m_config; } #define CREATE_CONFIG_METHODS(TYPE, TYPECASE) \ TYPE RecommendationScriptEngineConfig::TYPECASE##Value(const QString & field, TYPE defaultValue) const \ { return m_config->readEntry(field, defaultValue); } \ void RecommendationScriptEngineConfig::Set##TYPECASE##Value(const QString & field, TYPE newValue) const \ { kDebug() << field << newValue; m_config->writeEntry(field, newValue); m_config->sync(); } CREATE_CONFIG_METHODS(bool, Bool) CREATE_CONFIG_METHODS(int, Int) CREATE_CONFIG_METHODS(QString, String) CREATE_CONFIG_METHODS(QStringList, StringList) #undef CREATE_CONFIG_METHODS /** * */ RecommendationScriptEngine::RecommendationScriptEngine(QObject * parent, const QString & script) : RecommendationEngine(parent), d(new Private()) { d->script = script; kDebug() << "RecommendationScriptEngine()" << script << name(); d->delay.setInterval(300); d->delay.setSingleShot(true); + d->autoremove = config()->readEntry("autoRemoveChosenRecommendation", true); + connect(&(d->delay), SIGNAL(timeout()), this, SLOT(sendUpdateNotification())); } RecommendationScriptEngine::~RecommendationScriptEngine() { delete d; } void RecommendationScriptEngine::init() { Contour::RecommendationEngine::init(); QFile file(KStandardDirs::locate("data", "contour/scripts/" + d->script + "/main.js")); if (!file.open(QIODevice::ReadOnly)) { kDebug() << "Failed to open main.js for" << d->script; return; } d->engine = new QScriptEngine(this); connect(d->engine, SIGNAL(signalHandlerException(QScriptValue)), this, SLOT(signalHandlerException(QScriptValue))); d->engine->globalObject().setProperty("self", d->engine->newQObject(this)); const QScriptValue & result = d->engine->evaluate(QTextStream(&file).readAll()); if (d->engine->hasUncaughtException()) { int line = d->engine->uncaughtExceptionLineNumber(); kDebug() << "uncaught exception at line" << line << ":" << result.toString(); } } void RecommendationScriptEngine::activate(const QString & id, const QString & action) { if (d->autoremove) removeRecommendation(id); emit activationRequested(id, action); } +void RecommendationScriptEngine::setAutoRemoveChosenRecommendation(bool remove) +{ + d->autoremove = remove; + KConfigGroup * cg = config(); + cg->writeEntry("autoRemoveChosenRecommendation", d->autoremove); + cg->sync(); +} + QString RecommendationScriptEngine::name() const { kDebug() << d->script; return d->script; } QScriptValue RecommendationScriptEngine::getSensor(const QString & sensor) { kDebug() << "sensor" << sensor; QObject * result = NULL; if (sensor == "DBus") { kDebug() << "Returning the D-Bus sensor. This is not in QtMobility"; result = new DBusSensor(); } else { result = new QtMobility::QSensor(sensor.toAscii()); } return d->engine->newQObject(result, QScriptEngine::AutoOwnership); } QScriptValue RecommendationScriptEngine::getConfig() { return d->engine->newQObject(new RecommendationScriptEngineConfig(this, config())); } QScriptValue RecommendationScriptEngine::getTimer(int msec) { kDebug() << "timer" << msec; QTimer * timer = new QTimer(); timer->setSingleShot(false); timer->setInterval(msec); timer->start(); return d->engine->newQObject(timer, QScriptEngine::AutoOwnership); } void RecommendationScriptEngine::openUrl(const QString & url) { QDesktopServices::openUrl(QUrl(url)); } void RecommendationScriptEngine::signalHandlerException(const QScriptValue & exception) { kDebug() << "exception" << exception.toVariant(); } void RecommendationScriptEngine::addRecommendation( double score, const QString & id, const QString & title, const QString & description, const QString & icon ) { // kDebug() << d->script << score << id << title; int i = 0; while (d->recommendations.size() > i && d->recommendations[i].score > score) { ++i; } RecommendationItem ri; ri.score = score; ri.id = id; ri.title = title; ri.description = description; ri.icon = icon; d->recommendations.insert(i, ri); delayedUpdateNotification(); } void RecommendationScriptEngine::removeRecommendation(const QString & id) { QMutableListIterator < RecommendationItem > i(d->recommendations); while (i.hasNext()) { RecommendationItem ri = i.next(); if (ri.id == id) { i.remove(); } } delayedUpdateNotification(); } void RecommendationScriptEngine::removeRecommendations() { d->recommendations.clear(); delayedUpdateNotification(); } void RecommendationScriptEngine::delayedUpdateNotification() { d->delay.start(); } void RecommendationScriptEngine::sendUpdateNotification() { // just in case, although it is a single-shot d->delay.stop(); emit recommendationsUpdated(d->recommendations); } } // namespace Contour // class RecommendationScriptEngine diff --git a/contourd/recommendation/RecommendationScriptEngine.h b/contourd/recommendation/RecommendationScriptEngine.h index f1c9ab80..bf49bcab 100644 --- a/contourd/recommendation/RecommendationScriptEngine.h +++ b/contourd/recommendation/RecommendationScriptEngine.h @@ -1,86 +1,86 @@ /* * Copyright (C) 2011 Ivan Cukic * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2, * or (at your option) any later version, 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 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 RECOMMENDATIONSCRIPTENGINE_H_ #define RECOMMENDATIONSCRIPTENGINE_H_ #include "RecommendationEngine.h" #include namespace Contour { /** * */ class RecommendationScriptEngine: public RecommendationEngine { Q_OBJECT RECOMMENDATION_ENGINE public: RecommendationScriptEngine(QObject * parent, const QString & script); virtual ~RecommendationScriptEngine(); virtual void init(); virtual void activate(const QString & id, const QString & action = QString()); - void autoRemoveChosenRecommendation(bool remove = true); - Q_SIGNALS: // note that you need to pass sorted items to // this method (sorted by the score) void recommendationsUpdated(const QList & recommendations); void activationRequested(const QString & id, const QString & action); public Q_SLOTS: + void setAutoRemoveChosenRecommendation(bool remove = true); + // TODO: These could be removed to some plugins or whatever QScriptValue getSensor(const QString & sensor); QScriptValue getTimer(int msec); QScriptValue getConfig(); void openUrl(const QString & url); public Q_SLOTS: void addRecommendation( double score, const QString & id, const QString & title, const QString & description, const QString & icon ); void removeRecommendation(const QString & id); void removeRecommendations(); private Q_SLOTS: void signalHandlerException(const QScriptValue & exception); void delayedUpdateNotification(); void sendUpdateNotification(); private: class Private; Private * const d; }; } // namespace Contour #endif // RECOMMENDATIONSCRIPTENGINE_H_