From 3c2f9acd39c0b3a37fc494f329e7b4e512c3670c Mon Sep 17 00:00:00 2001 From: "Anthony J. Thibault" Date: Tue, 3 Jan 2017 15:43:21 -0800 Subject: [PATCH] Hooked up EventBridge to TabletScriptingInterface. --- .../resources/qml/hifi/tablet/TabletRoot.qml | 8 +++++ .../qml/hifi/tablet/TabletWebView.qml | 9 +++--- interface/src/ui/overlays/Web3DOverlay.cpp | 4 +-- .../src/RenderableWebEntityItem.cpp | 4 +-- .../src/TabletScriptingInterface.cpp | 18 ++++++++---- .../src/TabletScriptingInterface.h | 29 ++++++++++++++++--- 6 files changed, 55 insertions(+), 17 deletions(-) diff --git a/interface/resources/qml/hifi/tablet/TabletRoot.qml b/interface/resources/qml/hifi/tablet/TabletRoot.qml index 9186c4b086..f72bbd5c7d 100644 --- a/interface/resources/qml/hifi/tablet/TabletRoot.qml +++ b/interface/resources/qml/hifi/tablet/TabletRoot.qml @@ -3,6 +3,7 @@ import QtQuick 2.0 Item { id: tabletRoot objectName: "tabletRoot" + property var eventBridge; function loadSource(url) { loader.source = url; @@ -19,6 +20,13 @@ Item { width: parent.width height: parent.height + + onLoaded: { + // propogate eventBridge to WebEngineView + if (loader.item.hasOwnProperty("eventBridge")) { + loader.item.eventBridge = eventBridge; + } + } } width: 480 diff --git a/interface/resources/qml/hifi/tablet/TabletWebView.qml b/interface/resources/qml/hifi/tablet/TabletWebView.qml index 1bdba0ad22..0f697d634e 100644 --- a/interface/resources/qml/hifi/tablet/TabletWebView.qml +++ b/interface/resources/qml/hifi/tablet/TabletWebView.qml @@ -1,9 +1,10 @@ import QtQuick 2.0 import QtWebEngine 1.2 -WebEngineView { - id: webEngineView - height: parent.height - width: parent.width +import "../../controls" as Controls + +Controls.WebView { + } + diff --git a/interface/src/ui/overlays/Web3DOverlay.cpp b/interface/src/ui/overlays/Web3DOverlay.cpp index 89ec70ca22..fe48b05f5e 100644 --- a/interface/src/ui/overlays/Web3DOverlay.cpp +++ b/interface/src/ui/overlays/Web3DOverlay.cpp @@ -61,7 +61,7 @@ Web3DOverlay::~Web3DOverlay() { if (rootItem && rootItem->objectName() == "tabletRoot") { auto tabletScriptingInterface = DependencyManager::get(); - tabletScriptingInterface->setQmlTabletRoot("com.highfidelity.interface.tablet.system", nullptr); + tabletScriptingInterface->setQmlTabletRoot("com.highfidelity.interface.tablet.system", nullptr, nullptr); } // Fix for crash in QtWebEngineCore when rapidly switching domains @@ -138,7 +138,7 @@ void Web3DOverlay::loadSourceURL() { if (_webSurface->getRootItem() && _webSurface->getRootItem()->objectName() == "tabletRoot") { auto tabletScriptingInterface = DependencyManager::get(); - tabletScriptingInterface->setQmlTabletRoot("com.highfidelity.interface.tablet.system", _webSurface->getRootItem()); + tabletScriptingInterface->setQmlTabletRoot("com.highfidelity.interface.tablet.system", _webSurface->getRootItem(), _webSurface.data()); } } } diff --git a/libraries/entities-renderer/src/RenderableWebEntityItem.cpp b/libraries/entities-renderer/src/RenderableWebEntityItem.cpp index bdb84fadc7..df28769964 100644 --- a/libraries/entities-renderer/src/RenderableWebEntityItem.cpp +++ b/libraries/entities-renderer/src/RenderableWebEntityItem.cpp @@ -268,7 +268,7 @@ void RenderableWebEntityItem::loadSourceURL() { if (_webSurface->getRootItem() && _webSurface->getRootItem()->objectName() == "tabletRoot") { auto tabletScriptingInterface = DependencyManager::get(); - tabletScriptingInterface->setQmlTabletRoot("com.highfidelity.interface.tablet.system", _webSurface->getRootItem()); + tabletScriptingInterface->setQmlTabletRoot("com.highfidelity.interface.tablet.system", _webSurface->getRootItem(), _webSurface.data()); } } } @@ -372,7 +372,7 @@ void RenderableWebEntityItem::destroyWebSurface() { if (rootItem && rootItem->objectName() == "tabletRoot") { auto tabletScriptingInterface = DependencyManager::get(); - tabletScriptingInterface->setQmlTabletRoot("com.highfidelity.interface.tablet.system", nullptr); + tabletScriptingInterface->setQmlTabletRoot("com.highfidelity.interface.tablet.system", nullptr, nullptr); } // Fix for crash in QtWebEngineCore when rapidly switching domains diff --git a/libraries/script-engine/src/TabletScriptingInterface.cpp b/libraries/script-engine/src/TabletScriptingInterface.cpp index bafa9ab4b4..f32a8827c1 100644 --- a/libraries/script-engine/src/TabletScriptingInterface.cpp +++ b/libraries/script-engine/src/TabletScriptingInterface.cpp @@ -29,10 +29,10 @@ QObject* TabletScriptingInterface::getTablet(const QString& tabletId) { } } -void TabletScriptingInterface::setQmlTabletRoot(QString tabletId, QQuickItem* qmlTabletRoot) { +void TabletScriptingInterface::setQmlTabletRoot(QString tabletId, QQuickItem* qmlTabletRoot, QObject* qmlOffscreenSurface) { TabletProxy* tablet = qobject_cast(getTablet(tabletId)); - if (tablet) { - tablet->setQmlTabletRoot(qmlTabletRoot); + if (tablet && qmlOffscreenSurface) { + tablet->setQmlTabletRoot(qmlTabletRoot, qmlOffscreenSurface); } else { qCWarning(scriptengine) << "TabletScriptingInterface::setupTablet() bad tablet object"; } @@ -72,10 +72,12 @@ static void addButtonProxyToQmlTablet(QQuickItem* qmlTablet, TabletButtonProxy* buttonProxy->setQmlButton(qobject_cast(qmlButton)); } -void TabletProxy::setQmlTabletRoot(QQuickItem* qmlTabletRoot) { +void TabletProxy::setQmlTabletRoot(QQuickItem* qmlTabletRoot, QObject* qmlOffscreenSurface) { std::lock_guard guard(_mutex); + _qmlOffscreenSurface = qmlOffscreenSurface; _qmlTabletRoot = qmlTabletRoot; - if (_qmlTabletRoot) { + if (_qmlTabletRoot && _qmlOffscreenSurface) { + QObject::connect(_qmlOffscreenSurface, SIGNAL(webEventReceived(QVariant)), this, SIGNAL(webEventReceived(QVariant))); gotoHomeScreen(); } else { removeButtonsFromHomeScreen(); @@ -141,6 +143,12 @@ void TabletProxy::removeButton(QObject* tabletButtonProxy) { } } +void TabletProxy::emitScriptEvent(QVariant msg) { + if (_qmlOffscreenSurface) { + QMetaObject::invokeMethod(_qmlOffscreenSurface, "emitScriptEvent", Qt::AutoConnection, Q_ARG(QVariant, msg)); + } +} + void TabletProxy::addButtonsToHomeScreen() { auto tablet = getQmlTablet(); if (!tablet) { diff --git a/libraries/script-engine/src/TabletScriptingInterface.h b/libraries/script-engine/src/TabletScriptingInterface.h index 68ae9c291a..3c913cbd9d 100644 --- a/libraries/script-engine/src/TabletScriptingInterface.h +++ b/libraries/script-engine/src/TabletScriptingInterface.h @@ -37,7 +37,7 @@ public: */ Q_INVOKABLE QObject* getTablet(const QString& tabletId); - void setQmlTabletRoot(QString tabletId, QQuickItem* qmlTabletRoot); + void setQmlTabletRoot(QString tabletId, QQuickItem* qmlTabletRoot, QObject* qmlOffscreenSurface); protected: std::mutex _mutex; @@ -46,7 +46,7 @@ protected: /**jsdoc * @class TabletProxy - * @property name {string} name of this tablet + * @property name {string} READ_ONLY: name of this tablet */ class TabletProxy : public QObject { Q_OBJECT @@ -54,7 +54,7 @@ class TabletProxy : public QObject { public: TabletProxy(QString name); - void setQmlTabletRoot(QQuickItem* qmlTabletRoot); + void setQmlTabletRoot(QQuickItem* qmlTabletRoot, QObject* qmlOffscreenSurface); /**jsdoc * transition to the home screen @@ -85,6 +85,23 @@ public: Q_INVOKABLE void removeButton(QObject* tabletButtonProxy); QString getName() const { return _name; } + + /**jsdoc + * Used to send an event to the html/js embedded in the tablet + * @function TabletProxy#emitScriptEvent + * @param msg {object|string} + */ + Q_INVOKABLE void emitScriptEvent(QVariant msg); + +signals: + /**jsdoc + * Signaled when this tablet receives an event from the html/js embedded in the tablet + * @function TabletProxy#webEventReceived + * @param msg {object|string} + * @returns {Signal} + */ + void webEventReceived(QVariant msg); + protected: void addButtonsToHomeScreen(); @@ -95,19 +112,23 @@ protected: std::mutex _mutex; std::vector> _tabletButtonProxies; QQuickItem* _qmlTabletRoot { nullptr }; + QObject* _qmlOffscreenSurface { nullptr }; }; /**jsdoc * @class TabletButtonProxy - * @property imageUrl {string} + * @property uuid {QUuid} READ_ONLY: uniquely identifies this button */ class TabletButtonProxy : public QObject { Q_OBJECT + Q_PROPERTY(QUuid uuid READ getUuid) public: TabletButtonProxy(const QVariantMap& properties); void setQmlButton(QQuickItem* qmlButton); + QUuid getUuid() const { return _uuid; } + /**jsdoc * Returns the current value of this button's properties * @function TabletButtonProxy#getProperties