summaryrefslogtreecommitdiff
path: root/declarativewatchlet.cpp
diff options
context:
space:
mode:
authorJavier S. Pedro <maemo@javispedro.com>2011-09-16 17:47:24 +0200
committerJavier <javier@pcjavier.(none)>2011-09-16 17:47:24 +0200
commitaa1c0fd3146b4ed055d181c99d52463afa6bedbb (patch)
treef6fb8d9693ad8c545ddabf76312f8f33b5b9878f /declarativewatchlet.cpp
downloadsowatch-aa1c0fd3146b4ed055d181c99d52463afa6bedbb.tar.gz
sowatch-aa1c0fd3146b4ed055d181c99d52463afa6bedbb.zip
Initial import
Diffstat (limited to 'declarativewatchlet.cpp')
-rw-r--r--declarativewatchlet.cpp94
1 files changed, 94 insertions, 0 deletions
diff --git a/declarativewatchlet.cpp b/declarativewatchlet.cpp
new file mode 100644
index 0000000..1b9c836
--- /dev/null
+++ b/declarativewatchlet.cpp
@@ -0,0 +1,94 @@
+#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 attached properties");
+ _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()
+{
+ _wrapper->activate();
+ _scene->update();
+}
+
+void DeclarativeWatchlet::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;
+ }
+}