From 84db58dbc63ecc8791c5c719910a2c6e06d9d1dd Mon Sep 17 00:00:00 2001 From: "Anthony J. Thibault" Date: Tue, 20 Dec 2016 12:16:11 -0800 Subject: [PATCH] Make tablet.qml work on Web3DOverlay --- .../resources/qml/hifi/tablet/Tablet.qml | 2 +- interface/src/ui/overlays/Web3DOverlay.cpp | 75 ++++++++++++++----- interface/src/ui/overlays/Web3DOverlay.h | 3 +- .../src/RenderableWebEntityItem.cpp | 2 + scripts/system/help.js | 1 - 5 files changed, 63 insertions(+), 20 deletions(-) diff --git a/interface/resources/qml/hifi/tablet/Tablet.qml b/interface/resources/qml/hifi/tablet/Tablet.qml index 8203b9f972..3e0a9d8c14 100644 --- a/interface/resources/qml/hifi/tablet/Tablet.qml +++ b/interface/resources/qml/hifi/tablet/Tablet.qml @@ -171,7 +171,7 @@ Item { console.log("Tablet.onCompleted!"); var component = Qt.createComponent("TabletButton.qml"); var buttons = []; - for (var i = 0; i < 5; i++) { + for (var i = 0; i < 6; i++) { var button = component.createObject(flowMain); button.inDebugMode = true; buttons.push(button); diff --git a/interface/src/ui/overlays/Web3DOverlay.cpp b/interface/src/ui/overlays/Web3DOverlay.cpp index ee1a0f5256..cd9f60aa82 100644 --- a/interface/src/ui/overlays/Web3DOverlay.cpp +++ b/interface/src/ui/overlays/Web3DOverlay.cpp @@ -18,16 +18,16 @@ #include #include +#include +#include #include #include #include -#include -#include -#include -#include -#include - #include +#include +#include +#include +#include static const float DPI = 30.47f; static const float INCHES_TO_METERS = 1.0f / 39.3701f; @@ -36,7 +36,7 @@ static const float OPAQUE_ALPHA_THRESHOLD = 0.99f; QString const Web3DOverlay::TYPE = "web3d"; -Web3DOverlay::Web3DOverlay() : _dpi(DPI) { +Web3DOverlay::Web3DOverlay() : _dpi(DPI) { _touchDevice.setCapabilities(QTouchDevice::Position); _touchDevice.setType(QTouchDevice::TouchScreen); _touchDevice.setName("RenderableWebEntityItemTouchDevice"); @@ -57,6 +57,24 @@ Web3DOverlay::Web3DOverlay(const Web3DOverlay* Web3DOverlay) : Web3DOverlay::~Web3DOverlay() { if (_webSurface) { + QQuickItem* rootItem = _webSurface->getRootItem(); + + // TABLET_UI_HACK: TODO: update this with rootTablet + if (rootItem && rootItem->objectName() == "tablet") { + auto tabletScriptingInterface = DependencyManager::get(); + tabletScriptingInterface->setQmlTablet("com.highfidelity.interface.tablet.system", nullptr); + } + + // Fix for crash in QtWebEngineCore when rapidly switching domains + // Call stop on the QWebEngineView before destroying OffscreenQMLSurface. + if (rootItem) { + QObject* obj = rootItem->findChild("webEngineView"); + if (obj) { + // stop loading + QMetaObject::invokeMethod(obj, "stop"); + } + } + _webSurface->pause(); _webSurface->disconnect(_connection); @@ -101,6 +119,32 @@ void Web3DOverlay::update(float deltatime) { */ } +void Web3DOverlay::loadSourceURL() { + + QUrl sourceUrl(_url); + if (sourceUrl.scheme() == "http" || sourceUrl.scheme() == "https" || + _url.toLower().endsWith(".htm") || _url.toLower().endsWith(".html")) { + + _webSurface->setBaseUrl(QUrl::fromLocalFile(PathUtils::resourcesPath() + "/qml/")); + _webSurface->load("Web3DOverlay.qml"); + _webSurface->resume(); + _webSurface->getRootItem()->setProperty("url", _url); + _webSurface->getRootItem()->setProperty("scriptURL", _scriptURL); + _webSurface->getRootContext()->setContextProperty("ApplicationInterface", qApp); + + } else { + _webSurface->setBaseUrl(QUrl::fromLocalFile(PathUtils::resourcesPath())); + _webSurface->load(_url, [&](QQmlContext* context, QObject* obj) {}); + _webSurface->resume(); + + // TABLET_UI_HACK: TODO: update this to use rootTablet. + if (_webSurface->getRootItem() && _webSurface->getRootItem()->objectName() == "tablet") { + auto tabletScriptingInterface = DependencyManager::get(); + tabletScriptingInterface->setQmlTablet("com.highfidelity.interface.tablet.system", _webSurface->getRootItem()); + } + } +} + void Web3DOverlay::render(RenderArgs* args) { if (!_visible || !getParentVisible()) { return; @@ -119,12 +163,9 @@ void Web3DOverlay::render(RenderArgs* args) { // and the current rendering load) _webSurface->setMaxFps(10); _webSurface->create(currentContext); - _webSurface->setBaseUrl(QUrl::fromLocalFile(PathUtils::resourcesPath() + "/qml/")); - _webSurface->load("Web3DOverlay.qml"); - _webSurface->resume(); - _webSurface->getRootItem()->setProperty("url", _url); - _webSurface->getRootItem()->setProperty("scriptURL", _scriptURL); - _webSurface->getRootContext()->setContextProperty("ApplicationInterface", qApp); + + loadSourceURL(); + _webSurface->resize(QSize(_resolution.x, _resolution.y)); currentContext->makeCurrent(currentSurface); @@ -150,7 +191,7 @@ void Web3DOverlay::render(RenderArgs* args) { point.setPos(windowPoint); QList touchPoints; touchPoints.push_back(point); - QTouchEvent* touchEvent = new QTouchEvent(QEvent::TouchEnd, nullptr, Qt::NoModifier, Qt::TouchPointReleased, + QTouchEvent* touchEvent = new QTouchEvent(QEvent::TouchEnd, nullptr, Qt::NoModifier, Qt::TouchPointReleased, touchPoints); touchEvent->setWindow(_webSurface->getWindow()); touchEvent->setDevice(&_touchDevice); @@ -167,7 +208,7 @@ void Web3DOverlay::render(RenderArgs* args) { vec4 color(toGlm(getColor()), getAlpha()); Transform transform = getTransform(); - + // FIXME: applyTransformTo causes tablet overlay to detach from tablet entity. // Perhaps rather than deleting the following code it should be run only if isFacingAvatar() is true? /* @@ -237,7 +278,7 @@ void Web3DOverlay::handlePointerEvent(const PointerEvent& event) { if (event.getType() == PointerEvent::Move) { // Forward a mouse move event to the Web surface. - QMouseEvent* mouseEvent = new QMouseEvent(QEvent::MouseMove, windowPoint, windowPoint, windowPoint, Qt::NoButton, + QMouseEvent* mouseEvent = new QMouseEvent(QEvent::MouseMove, windowPoint, windowPoint, windowPoint, Qt::NoButton, Qt::NoButton, Qt::NoModifier); QCoreApplication::postEvent(_webSurface->getWindow(), mouseEvent); } @@ -338,7 +379,7 @@ void Web3DOverlay::setURL(const QString& url) { _url = url; if (_webSurface) { AbstractViewStateInterface::instance()->postLambdaEvent([this, url] { - _webSurface->getRootItem()->setProperty("url", url); + loadSourceURL(); }); } } diff --git a/interface/src/ui/overlays/Web3DOverlay.h b/interface/src/ui/overlays/Web3DOverlay.h index 45ec9fbc50..db45b073e2 100644 --- a/interface/src/ui/overlays/Web3DOverlay.h +++ b/interface/src/ui/overlays/Web3DOverlay.h @@ -28,6 +28,7 @@ public: Web3DOverlay(const Web3DOverlay* Web3DOverlay); virtual ~Web3DOverlay(); + void loadSourceURL(); virtual void render(RenderArgs* args) override; virtual const render::ShapeKey getShapeKey() override; @@ -46,7 +47,7 @@ public: glm::vec2 getSize(); - virtual bool findRayIntersection(const glm::vec3& origin, const glm::vec3& direction, float& distance, + virtual bool findRayIntersection(const glm::vec3& origin, const glm::vec3& direction, float& distance, BoxFace& face, glm::vec3& surfaceNormal) override; virtual Web3DOverlay* createClone() const override; diff --git a/libraries/entities-renderer/src/RenderableWebEntityItem.cpp b/libraries/entities-renderer/src/RenderableWebEntityItem.cpp index 7e51249830..34e3fa87b7 100644 --- a/libraries/entities-renderer/src/RenderableWebEntityItem.cpp +++ b/libraries/entities-renderer/src/RenderableWebEntityItem.cpp @@ -366,6 +366,8 @@ void RenderableWebEntityItem::destroyWebSurface() { tabletScriptingInterface->setQmlTablet("com.highfidelity.interface.tablet.system", nullptr); } + // Fix for crash in QtWebEngineCore when rapidly switching domains + // Call stop on the QWebEngineView before destroying OffscreenQMLSurface. if (rootItem) { QObject* obj = rootItem->findChild("webEngineView"); if (obj) { diff --git a/scripts/system/help.js b/scripts/system/help.js index d1be9f6e79..c8e14a80a6 100644 --- a/scripts/system/help.js +++ b/scripts/system/help.js @@ -27,7 +27,6 @@ Script.scriptEnding.connect(function () { tablet.removeButton(button); - button.clicked.disconnect(onClicked); }); }()); // END LOCAL_SCOPE