From c7e878cd16487c39589fcaf099921307ba169545 Mon Sep 17 00:00:00 2001 From: Milian Wolff Date: Thu, 31 Oct 2013 16:17:22 +0100 Subject: Simplify code by doing more in QML and less in C++ Change-Id: I4f4f101b40b3f509371819100ad70d2b2a5731f4 Reviewed-by: Pierre Rossi --- src/MetaObjectPublisher.qml | 51 +++++++++++++++++++++++++++++++------------ src/qtmetaobjectpublisher.cpp | 21 ++++-------------- src/qtmetaobjectpublisher.h | 26 ++-------------------- 3 files changed, 43 insertions(+), 55 deletions(-) (limited to 'src') diff --git a/src/MetaObjectPublisher.qml b/src/MetaObjectPublisher.qml index 60da753..f182c7f 100644 --- a/src/MetaObjectPublisher.qml +++ b/src/MetaObjectPublisher.qml @@ -40,44 +40,67 @@ ****************************************************************************/ import QtQuick 2.0 - import Qt.labs.WebChannel 1.0 MetaObjectPublisherPrivate { + /** + * This map contains the registered objects indexed by their name. + */ + property variant registeredObjects + + /** + * Handle the given WebChannel client request and write to the given response. + * + * @return true if the request was handled, false otherwise. + */ function handleRequest(payload, webChannel, response) { - var object = namedObject(payload.object); - var ret; - if (payload.type == "Qt.invokeMethod") { + if (!payload.type) { + return false; + } + var object = payload.object ? registeredObjects[payload.object] : null; + + var ret = undefined; + if (payload.type === "Qt.invokeMethod" && object) { ret = (object[payload.method])(payload.args); - } else if (payload.type == "Qt.connectToSignal") { + } else if (payload.type === "Qt.connectToSignal" && object) { object[payload.signal].connect( function(a,b,c,d,e,f,g,h,i,j) { webChannel.broadcast("Qt.signal", JSON.stringify({object: payload.object, signal: payload.signal, args: [a,b,c,d,e,f,g,h,i,j]})); }); - } else if (payload.type == "Qt.getProperty") { + } else if (payload.type === "Qt.getProperty" && object) { ret = object[payload.property]; - } else if (payload.type == "Qt.setProperty") { + } else if (payload.type === "Qt.setProperty" && object) { object[payload.property] = payload.value; - } else if (payload.type == "Qt.getObjects") { - ret = registeredClassInfo(); + } else if (payload.type === "Qt.getObjects") { + var ret = {}; + for (var name in registeredObjects) { + object = registeredObjects[name]; + if (object) { + ret[name] = classInfoForObject(object); + } + } + } else if (payload.type === "Qt.Debug") { + console.log("DEBUG: ", payload.message); } else { return false; } - if (ret) { + if (ret != undefined) { response.send(JSON.stringify(ret)); - } else { - response.noop(); } return true; } function registerObjects(objects) { - for (var name in objects) { - addObject(name, objects[name]); + // joining a JS map and a QML one is not as easy as one would assume... + for (var name in registeredObjects) { + if (!objects[name]) { + objects[name] = registeredObjects[name]; + } } + registeredObjects = objects; } } diff --git a/src/qtmetaobjectpublisher.cpp b/src/qtmetaobjectpublisher.cpp index c1ac1c5..b073fb0 100644 --- a/src/qtmetaobjectpublisher.cpp +++ b/src/qtmetaobjectpublisher.cpp @@ -40,13 +40,14 @@ ****************************************************************************/ #include "qtmetaobjectpublisher.h" -#include + #include #include #include +#include -QtMetaObjectPublisher::QtMetaObjectPublisher(QObject *parent) : - QObject(parent) +QtMetaObjectPublisher::QtMetaObjectPublisher(QObject *parent) + : QObject(parent) { } @@ -71,17 +72,3 @@ QVariantMap QtMetaObjectPublisher::classInfoForObject(QObject *object) const data["properties"] = qtProperties; return data; } - -QVariantMap QtMetaObjectPublisher::registeredClassInfo() const -{ - QVariantMap ret; - - QMap< QString, QPointer< QObject > >::const_iterator it = objects.constBegin(); - for (; it != objects.constEnd(); ++it) { - if (it.value()) { - ret[it.key()] = classInfoForObject(it.value()); - } - } - - return ret; -} diff --git a/src/qtmetaobjectpublisher.h b/src/qtmetaobjectpublisher.h index 13c4bba..573d120 100644 --- a/src/qtmetaobjectpublisher.h +++ b/src/qtmetaobjectpublisher.h @@ -44,37 +44,15 @@ #include #include -#include -#include class QtMetaObjectPublisher : public QObject { Q_OBJECT - Q_PROPERTY(QStringList objectNames READ objectNames) public: explicit QtMetaObjectPublisher(QObject *parent = 0); - Q_INVOKABLE QVariantMap classInfoForObject(QObject*) const; - - QStringList objectNames() const { return objects.keys(); } - - Q_INVOKABLE QObject* namedObject(const QString& name) const - { - if (!objects.contains(name)) - return 0; - return objects[name]; - } - - Q_INVOKABLE QVariantMap registeredClassInfo() const; -public slots: - void addObject(const QString& name, QObject* object) - { - objects[name] = object; - } - -private: - QMap > objects; - + Q_INVOKABLE QVariantMap classInfoForObject(QObject *object) const; }; #endif // QTMETAOBJECTPUBLISHER_H + -- cgit v1.2.1