diff --git a/interface/resources/qml/MarketplaceDialog.qml b/interface/resources/qml/MarketplaceDialog.qml new file mode 100644 index 0000000000..3fdd9b2b4d --- /dev/null +++ b/interface/resources/qml/MarketplaceDialog.qml @@ -0,0 +1,51 @@ +import Hifi 1.0 +import QtQuick 2.3 +import QtQuick.Controls 1.2 +import QtQuick.Window 2.2 +import QtQuick.Dialogs 1.2 +import QtQuick.Controls.Styles 1.3 +import QtWebKit 3.0 + +CustomDialog { + title: "Test Dlg" + id: testDialog + objectName: "Browser" + width: 720 + height: 720 + resizable: true + + MarketplaceDialog { + id: marketplaceDialog + } + + Item { + id: clientArea + // The client area + anchors.fill: parent + anchors.margins: parent.margins + anchors.topMargin: parent.topMargin + + + ScrollView { + anchors.fill: parent + WebView { + objectName: "WebView" + id: webview + url: "https://metaverse.highfidelity.com/marketplace" + anchors.fill: parent + onNavigationRequested: { + console.log(request.url) + if (!marketplaceDialog.navigationRequested(request.url)) { + console.log("Application absorbed the request") + request.action = WebView.IgnoreRequest; + return; + } + console.log("Application passed on the request") + request.action = WebView.AcceptRequest; + return; + } + } + } + + } +} diff --git a/interface/resources/qml/componentCreation.js b/interface/resources/qml/componentCreation.js deleted file mode 100644 index 15a828d6f8..0000000000 --- a/interface/resources/qml/componentCreation.js +++ /dev/null @@ -1,29 +0,0 @@ -var component; -var instance; -var parent; - -function createObject(parentObject, url) { - parent = parentObject; - component = Qt.createComponent(url); - if (component.status == Component.Ready) - finishCreation(); - else - component.statusChanged.connect(finishCreation); -} - -function finishCreation() { - if (component.status == Component.Ready) { - instance = component.createObject(parent, {"x": 100, "y": 100}); - if (instance == null) { - // Error Handling - console.log("Error creating object"); - } else { - instance.enabled = true - } - } else if (component.status == Component.Error) { - // Error Handling - console.log("Error loading component:", component.errorString()); - } else { - console.log("Unknown component status: " + component.status); - } -} \ No newline at end of file diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index 9ae54ac83e..8c93418153 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -52,6 +52,8 @@ #include #include #include +#include +#include #include #include @@ -82,6 +84,7 @@ #include #include #include +#include #include @@ -132,6 +135,7 @@ #include "ui/DialogsManager.h" #include "ui/InfoView.h" #include "ui/LoginDialog.h" +#include "ui/MarketplaceDialog.h" #include "ui/Snapshot.h" #include "ui/StandAloneJSConsole.h" #include "ui/Stats.h" @@ -743,12 +747,26 @@ void Application::initializeGL() { InfoView::showFirstTime(INFO_HELP_PATH); } +class OAuthFactory : public QQmlNetworkAccessManagerFactory { + QThreadStorage oauthNetworkAccessManagers; +public: + virtual QNetworkAccessManager * create(QObject * parent) { + if (!oauthNetworkAccessManagers.hasLocalData()) { + oauthNetworkAccessManagers.setLocalData(OAuthNetworkAccessManager::getInstance()); + } + return oauthNetworkAccessManagers.localData(); + } +}; + void Application::initializeUi() { AddressBarDialog::registerType(); LoginDialog::registerType(); + MarketplaceDialog::registerType(); auto offscreenUi = DependencyManager::get(); offscreenUi->create(_glWidget->context()->contextHandle()); + offscreenUi->qmlEngine()->setNetworkAccessManagerFactory(new OAuthFactory()); + offscreenUi->qmlEngine()->networkAccessManager(); offscreenUi->resize(_glWidget->size()); offscreenUi->setProxyWindow(_window->windowHandle()); offscreenUi->setBaseUrl(QUrl::fromLocalFile(PathUtils::resourcesPath() + "/qml/")); @@ -1129,7 +1147,9 @@ void Application::keyPressEvent(QKeyEvent* event) { break; case Qt::Key_Backslash: - Menu::getInstance()->triggerOption(MenuOption::Chat); + MarketplaceDialog::show(); + + //Menu::getInstance()->triggerOption(MenuOption::Chat); break; case Qt::Key_Up: diff --git a/interface/src/scripting/WindowScriptingInterface.cpp b/interface/src/scripting/WindowScriptingInterface.cpp index 6ed3e48274..46ca0c160f 100644 --- a/interface/src/scripting/WindowScriptingInterface.cpp +++ b/interface/src/scripting/WindowScriptingInterface.cpp @@ -51,7 +51,7 @@ void WindowScriptingInterface::setFocus() { } void WindowScriptingInterface::raiseMainWindow() { - Application::getInstance()->getWindow()->raise(); +// Application::getInstance()->getWindow()->raise(); } void WindowScriptingInterface::setCursorVisible(bool visible) { diff --git a/interface/src/ui/MarketplaceDialog.cpp b/interface/src/ui/MarketplaceDialog.cpp new file mode 100644 index 0000000000..34d3414ef4 --- /dev/null +++ b/interface/src/ui/MarketplaceDialog.cpp @@ -0,0 +1,49 @@ +// +// AddressBarDialog.cpp +// +// Created by Bradley Austin Davis on 2015/04/14 +// Copyright 2015 High Fidelity, Inc. +// +// Distributed under the Apache License, Version 2.0. +// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html +// + +#include "Application.h" +#include "MarketplaceDialog.h" + + +#include + +#include "DependencyManager.h" + +QML_DIALOG_DEF(MarketplaceDialog) + + +MarketplaceDialog::MarketplaceDialog(QQuickItem *parent) : OffscreenQmlDialog(parent) { + this-> +} + +bool MarketplaceDialog::navigationRequested(const QString & url) { + qDebug() << url; + if (Application::getInstance()->canAcceptURL(url)) { + qDebug() << "Trying to send url to the app"; + if (Application::getInstance()->acceptURL(url)) { + qDebug() << "Sent url to the app"; + return false; // we handled it, so QWebPage doesn't need to handle it + } + } + return true; +} + +//https://metaverse.highfidelity.com/marketplace + +// +//bool DataWebPage::acceptNavigationRequest(QWebFrame* frame, const QNetworkRequest& request, QWebPage::NavigationType type) { +// QString urlString = request.url().toString(); +// if (Application::getInstance()->canAcceptURL(urlString)) { +// if (Application::getInstance()->acceptURL(urlString)) { +// return false; // we handled it, so QWebPage doesn't need to handle it +// } +// } +// return true; +//} \ No newline at end of file diff --git a/interface/src/ui/MarketplaceDialog.h b/interface/src/ui/MarketplaceDialog.h new file mode 100644 index 0000000000..137bb0bea7 --- /dev/null +++ b/interface/src/ui/MarketplaceDialog.h @@ -0,0 +1,29 @@ +// +// AddressBarDialog.h +// +// Created by Bradley Austin Davis on 2015/04/14 +// Copyright 2015 High Fidelity, Inc. +// +// Distributed under the Apache License, Version 2.0. +// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html +// + +#pragma once +#ifndef hifi_MarketplaceDialog_h +#define hifi_MarketplaceDialog_h + +#include + +class MarketplaceDialog : public OffscreenQmlDialog +{ + Q_OBJECT + QML_DIALOG_DECL + +public: + MarketplaceDialog(QQuickItem *parent = 0); + + Q_INVOKABLE bool navigationRequested(const QString & url); + +}; + +#endif diff --git a/tests/render-utils/src/main.cpp b/tests/render-utils/src/main.cpp index 9d7363c241..28d542e51a 100644 --- a/tests/render-utils/src/main.cpp +++ b/tests/render-utils/src/main.cpp @@ -27,6 +27,8 @@ #include #include #include +#include + #include #include #include @@ -189,6 +191,8 @@ public: }); installEventFilter(offscreenUi.data()); offscreenUi->resume(); + QWebEnginePage *page = new QWebEnginePage; + page->runJavaScript("'Java''' 'Script'", [](const QVariant &result) { qDebug() << result; }); } virtual ~QTestWindow() { @@ -210,9 +214,22 @@ protected: switch (event->key()) { case Qt::Key_L: if (event->modifiers() & Qt::CTRL) { + auto offscreenUi = DependencyManager::get(); + offscreenUi->qmlEngine()->clearComponentCache(); DependencyManager::get()->toggle(QString("TestDialog.qml"), "TestDialog"); } break; + case Qt::Key_K: + if (event->modifiers() & Qt::CTRL) { + DependencyManager::get()->toggle(QString("Browser.qml"), "Browser"); + } + break; + case Qt::Key_J: + if (event->modifiers() & Qt::CTRL) { + QObject * obj = DependencyManager::get()->findObject("WebView"); + qDebug() << obj; + } + break; } QWindow::keyPressEvent(event); }