diff options
Diffstat (limited to 'src/MetaObjectPublisher.qml')
-rw-r--r-- | src/MetaObjectPublisher.qml | 59 |
1 files changed, 58 insertions, 1 deletions
diff --git a/src/MetaObjectPublisher.qml b/src/MetaObjectPublisher.qml index 2b97c02..226e0a3 100644 --- a/src/MetaObjectPublisher.qml +++ b/src/MetaObjectPublisher.qml @@ -78,6 +78,25 @@ MetaObjectPublisherImpl // object info map set. property bool propertyUpdatesInitialized: false + /** + * Wrap a result value if it's a Qt QObject + * + * @return object info for wrapped Qt Object, + * or the same value if no wrapping needed + * + */ + function wrapResult(result) + { + if (typeof(result) === "object" + && result["objectName"] !== undefined) + { + var ret = wrapObject(result); + initializePropertyUpdates(ret.id, ret.data, result, webChannel); + return ret; + } + return result; + } + function convertQMLArgsToJSArgs(qmlArgs) { // NOTE: QML arguments is a map not an array it seems... @@ -106,12 +125,26 @@ MetaObjectPublisherImpl } if (payload.object) { + var isWrapped = false; var object = registeredObjects[payload.object]; + if (!object) { + object = unwrapObject(payload.object); + if (object) + isWrapped = true; + else + return false + } if (payload.type === "Qt.invokeMethod") { var method = object[payload.method]; if (method !== undefined) { - webChannel.respond(message.id, method.apply(method, payload.args)); + webChannel.respond(message.id, + wrapResult(method.apply(method, payload.args))); + return true; + } + if (isWrapped && payload.method === "deleteLater") { + // invoke `deleteLater` on wrapped QObject indirectly + deleteWrappedObject(object); return true; } return false; @@ -135,6 +168,11 @@ MetaObjectPublisherImpl } return true; } + // connecting to `destroyed` signal of wrapped QObject + if (isWrapped && payload.signal === "destroyed") { + // is a no-op on this side + return true; + } return false; } if (payload.type === "Qt.setProperty") { @@ -248,6 +286,13 @@ MetaObjectPublisherImpl var data = []; for (var objectName in pendingPropertyUpdates) { var object = registeredObjects[objectName]; + if (!object) { + object = unwrapObject(objectName); + if (!object) { + console.error("Got property update for unknown object " + objectName); + continue; + } + } var signals = pendingPropertyUpdates[objectName]; var propertyMap = {}; for (var signalName in signals) { @@ -291,6 +336,18 @@ MetaObjectPublisherImpl } } + onWrappedObjectDestroyed: { // (const QString& id) + // act as if object had sent `destroyed` signal + webChannel.sendMessage("Qt.signal", { + object: id, + signal: "destroyed", + args: [] + }); + delete subscriberCountMap[id]; + delete pendingPropertyUpdates[id]; + delete signalToPropertyMap[id] + } + /** * Aggregate property updates since we get multiple Qt.idle message when we have multiple * clients. They all share the same QWebProcess though so we must take special care to |