diff --git a/interface/src/ui/overlays/Overlays.cpp b/interface/src/ui/overlays/Overlays.cpp index 759353f7d3..c65dddb4ab 100644 --- a/interface/src/ui/overlays/Overlays.cpp +++ b/interface/src/ui/overlays/Overlays.cpp @@ -292,6 +292,14 @@ QString Overlays::getOverlayType(unsigned int overlayId) const { return ""; } +QObject* Overlays::getOverlayObject(unsigned int id) { + Overlay::Pointer thisOverlay = getOverlay(id); + if (thisOverlay) { + return qobject_cast(&(*thisOverlay)); + } + return nullptr; +} + unsigned int Overlays::getParentPanel(unsigned int childId) const { Overlay::Pointer overlay = getOverlay(childId); auto attachable = std::dynamic_pointer_cast(overlay); diff --git a/interface/src/ui/overlays/Overlays.h b/interface/src/ui/overlays/Overlays.h index 47607aa7a3..1fed3bc1fb 100644 --- a/interface/src/ui/overlays/Overlays.h +++ b/interface/src/ui/overlays/Overlays.h @@ -155,6 +155,15 @@ public slots: */ QString getOverlayType(unsigned int overlayId) const; + /**jsdoc + * Get the overlay Script object. + * + * @function Overlays.getOverlayObject + * @param {Overlays.OverlayID} overlayID The ID of the overlay to get the script object of. + * @return {Object} The script object for the overlay if found. + */ + QObject* getOverlayObject(unsigned int id); + /**jsdoc * Get the ID of the overlay at a particular point on the HUD/screen. * diff --git a/interface/src/ui/overlays/Web3DOverlay.cpp b/interface/src/ui/overlays/Web3DOverlay.cpp index fb8eaf5f5a..07adce75e5 100644 --- a/interface/src/ui/overlays/Web3DOverlay.cpp +++ b/interface/src/ui/overlays/Web3DOverlay.cpp @@ -68,6 +68,9 @@ Web3DOverlay::~Web3DOverlay() { QObject::disconnect(_hoverLeaveConnection); _hoverLeaveConnection = QMetaObject::Connection(); + QObject::disconnect(_webEventReceivedConnection); + _webEventReceivedConnection = QMetaObject::Connection(); + // The lifetime of the QML surface MUST be managed by the main thread // Additionally, we MUST use local variables copied by value, rather than // member variables, since they would implicitly refer to a this that @@ -147,6 +150,8 @@ void Web3DOverlay::render(RenderArgs* args) { QCoreApplication::postEvent(_webSurface->getWindow(), touchEvent); } }); + + _webEventReceivedConnection = connect(_webSurface.data(), &OffscreenQmlSurface::webEventReceived, this, &Web3DOverlay::webEventReceived); } vec2 halfSize = getSize() / 2.0f; diff --git a/interface/src/ui/overlays/Web3DOverlay.h b/interface/src/ui/overlays/Web3DOverlay.h index 15ef9701a5..b9ad69dbb9 100644 --- a/interface/src/ui/overlays/Web3DOverlay.h +++ b/interface/src/ui/overlays/Web3DOverlay.h @@ -51,6 +51,9 @@ public: virtual Web3DOverlay* createClone() const override; +signals: + void webEventReceived(const QVariant& message); + private: QSharedPointer _webSurface; QMetaObject::Connection _connection; @@ -68,6 +71,8 @@ private: QMetaObject::Connection _mouseReleaseConnection; QMetaObject::Connection _mouseMoveConnection; QMetaObject::Connection _hoverLeaveConnection; + + QMetaObject::Connection _webEventReceivedConnection; }; #endif // hifi_Web3DOverlay_h diff --git a/scripts/system/libraries/WebTablet.js b/scripts/system/libraries/WebTablet.js index 37eb5df90c..093f999bb1 100644 --- a/scripts/system/libraries/WebTablet.js +++ b/scripts/system/libraries/WebTablet.js @@ -85,10 +85,18 @@ WebTablet = function (url, width, dpi, clientOnly) { this.state = "idle"; }; +WebTablet.prototype.setURL = function (url) { + Overlays.editOverlay(this.webOverlayID, { url: url }); +}; + WebTablet.prototype.setScriptURL = function (scriptURL) { Overlays.editOverlay(this.webOverlayID, { scriptURL: scriptURL }); }; +WebTablet.prototype.getOverlayObject = function () { + return Overlays.getOverlayObject(this.webOverlayID); +}; + WebTablet.prototype.destroy = function () { Overlays.deleteOverlay(this.webOverlayID); Entities.deleteEntity(this.tabletEntityID); diff --git a/scripts/system/marketplaces/marketplaces.js b/scripts/system/marketplaces/marketplaces.js index 8938b7f7b2..2570bca308 100644 --- a/scripts/system/marketplaces/marketplaces.js +++ b/scripts/system/marketplaces/marketplaces.js @@ -28,7 +28,6 @@ var marketplaceWindow = new OverlayWebWindow({ visible: false }); marketplaceWindow.setScriptURL(MARKETPLACES_DIRECTORY_SCRIPT_URL); - marketplaceWindow.webEventReceived.connect(function (data) { if (data === "INJECT_CLARA") { marketplaceWindow.setScriptURL(MARKETPLACES_CLARA_SCRIPT_URL); @@ -65,10 +64,22 @@ function showMarketplace(marketplaceID) { marketplaceWebTablet = new WebTablet(MARKETPLACES_URL, null, null, true); Settings.setValue(persistenceKey, marketplaceWebTablet.pickle()); marketplaceWebTablet.setScriptURL(MARKETPLACES_DIRECTORY_SCRIPT_URL); + marketplaceWebTablet.getOverlayObject().webEventReceived.connect(function (data) { + if (data === "INJECT_CLARA") { + marketplaceWebTablet.setScriptURL(MARKETPLACES_CLARA_SCRIPT_URL); + } + if (data === "INJECT_HIFI") { + marketplaceWebTablet.setScriptURL(MARKETPLACES_HFIF_SCRIPT_URL); + } + if (data === "RELOAD_DIRECTORY") { + marketplaceWebTablet.setScriptURL(MARKETPLACES_DIRECTORY_SCRIPT_URL); + marketplaceWebTablet.setURL(""); // Force reload of URL. + marketplaceWebTablet.setURL(MARKETPLACES_URL); + } + }); } else { var url = MARKETPLACES_URL; if (marketplaceID) { - // $$$$$$$ TODO url = url + "/items/" + marketplaceID; } marketplaceWindow.setURL(url);