diff options
Diffstat (limited to 'libsowatch/declarativewatchlet.cpp')
-rw-r--r-- | libsowatch/declarativewatchlet.cpp | 96 |
1 files changed, 96 insertions, 0 deletions
diff --git a/libsowatch/declarativewatchlet.cpp b/libsowatch/declarativewatchlet.cpp new file mode 100644 index 0000000..7e6768e --- /dev/null +++ b/libsowatch/declarativewatchlet.cpp @@ -0,0 +1,96 @@ +#include <QtCore/QDebug> +#include <QtDeclarative/QtDeclarative> +#include "watchserver.h" +#include "declarativewatchwrapper.h" +#include "declarativewatchlet.h" + +using namespace sowatch; + +bool DeclarativeWatchlet::_registered = false; + +DeclarativeWatchlet::DeclarativeWatchlet(WatchServer* server, const QString& id) : + GraphicsWatchlet(server, id), + _engine(0), + _component(0), + _item(0), + _wrapper(0) +{ + setScene(new QGraphicsScene(this)); + + if (!_registered) { + qmlRegisterUncreatableType<DeclarativeWatchWrapper>("com.javispedro.sowatch", 1, 0, + "Watch", "Watch is only available via the 'watch' object"); + _registered = true; + } + + _engine = new QDeclarativeEngine(this); + _wrapper = new DeclarativeWatchWrapper(server->watch(), this); + + _engine->rootContext()->setContextProperty("watch", _wrapper); +} + +void DeclarativeWatchlet::setSource(const QUrl &url) +{ + if (_item) { + scene()->removeItem(_item); + delete _item; + _item = 0; + } + if (_component) { + delete _component; + _component = 0; + } + if (!url.isEmpty()) { + _component = new QDeclarativeComponent(_engine, url, this); + connect(_component, SIGNAL(statusChanged(QDeclarativeComponent::Status)), + SLOT(handleComponentStatus(QDeclarativeComponent::Status))); + if (!_component->isLoading()) { + /* No signals are going to be generated for this. */ + handleComponentStatus(_component->status()); + } else { + connect(_component, SIGNAL(statusChanged(QDeclarativeComponent::Status)), + this, SLOT(handleComponentStatus(QDeclarativeComponent::Status))); + } + } +} + +void DeclarativeWatchlet::activate() +{ + Watchlet::activate(); + _wrapper->activate(); + _scene->update(); +} + +void DeclarativeWatchlet::deactivate() +{ + Watchlet::deactivate(); + _wrapper->deactivate(); +} + +void DeclarativeWatchlet::handleComponentStatus(QDeclarativeComponent::Status status) +{ + QObject *obj; + disconnect(_component, SIGNAL(statusChanged(QDeclarativeComponent::Status)), + this, SLOT(handleComponentStatus(QDeclarativeComponent::Status))); + switch (status) { + case QDeclarativeComponent::Null: + case QDeclarativeComponent::Loading: + /* Nothing to do */ + break; + case QDeclarativeComponent::Ready: + obj = _component->create(); + if (_component->isError()) { + qWarning() << "QML has instantation errors:"; + qWarning() << _component->errors(); + return; + } + Q_ASSERT(_item == 0); + _item = qobject_cast<QDeclarativeItem*>(obj); + scene()->addItem(_item); + break; + case QDeclarativeComponent::Error: + qWarning() << "QML has errors:"; + qWarning() << _component->errors(); + break; + } +} |