From 875566d9568e72bcaffd8bf393073b85062f2810 Mon Sep 17 00:00:00 2001 From: David Rowe Date: Wed, 28 Sep 2016 16:40:38 +1300 Subject: [PATCH] Raise and lower keyboard for HTML fields in Browser window --- interface/resources/qml/Browser.qml | 46 +++++++++++++++---- .../qml/controls-uit/BaseWebView.qml | 2 +- libraries/gl/src/gl/OffscreenQmlSurface.cpp | 32 ++++++++----- 3 files changed, 60 insertions(+), 20 deletions(-) diff --git a/interface/resources/qml/Browser.qml b/interface/resources/qml/Browser.qml index 631036580e..8374fa5a98 100644 --- a/interface/resources/qml/Browser.qml +++ b/interface/resources/qml/Browser.qml @@ -1,5 +1,6 @@ import QtQuick 2.5 import QtQuick.Controls 1.2 +import QtWebChannel 1.0 import QtWebEngine 1.2 import "controls-uit" @@ -19,6 +20,9 @@ ScrollingWindow { property variant permissionsBar: {'securityOrigin':'none','feature':'none'} property alias url: webview.url property alias webView: webview + + property alias eventBridge: eventBridgeWrapper.eventBridge + x: 100 y: 100 @@ -197,32 +201,60 @@ ScrollingWindow { } } - WebEngineView { + WebView { id: webview url: "https://highfidelity.com" + + property alias eventBridgeWrapper: eventBridgeWrapper + + QtObject { + id: eventBridgeWrapper + WebChannel.id: "eventBridgeWrapper" + property var eventBridge; + } + + webChannel.registeredObjects: [eventBridgeWrapper] + + // Create a global EventBridge object for raiseAndLowerKeyboard. + WebEngineScript { + id: createGlobalEventBridge + sourceCode: eventBridgeJavaScriptToInject + injectionPoint: WebEngineScript.DocumentCreation + worldId: WebEngineScript.MainWorld + } + + // Detect when may want to raise and lower keyboard. + WebEngineScript { + id: raiseAndLowerKeyboard + injectionPoint: WebEngineScript.Deferred + sourceUrl: resourceDirectoryUrl + "/html/raiseAndLowerKeyboard.js" + worldId: WebEngineScript.MainWorld + } + + userScripts: [ createGlobalEventBridge, raiseAndLowerKeyboard ] + anchors.top: buttons.bottom anchors.topMargin: 8 anchors.bottom: parent.bottom anchors.left: parent.left anchors.right: parent.right + onFeaturePermissionRequested: { permissionsBar.securityOrigin = securityOrigin; permissionsBar.feature = feature; root.showPermissionsBar(); } + onLoadingChanged: { if (loadRequest.status === WebEngineView.LoadSucceededStatus) { addressBar.text = loadRequest.url } } + onIconChanged: { console.log("New icon: " + icon) } - onNewViewRequested: { - var component = Qt.createComponent("Browser.qml"); - var newWindow = component.createObject(desktop); - request.openIn(newWindow.webView) - } + onWindowCloseRequested: { root.destroy(); } @@ -230,8 +262,6 @@ ScrollingWindow { Component.onCompleted: { desktop.initWebviewProfileHandlers(webview.profile) } - - profile: desktop.browserProfile } } // item diff --git a/interface/resources/qml/controls-uit/BaseWebView.qml b/interface/resources/qml/controls-uit/BaseWebView.qml index cefaf653fc..ef4764b08f 100644 --- a/interface/resources/qml/controls-uit/BaseWebView.qml +++ b/interface/resources/qml/controls-uit/BaseWebView.qml @@ -9,7 +9,7 @@ // import QtQuick 2.5 -import QtWebEngine 1.1 +import QtWebEngine 1.2 WebEngineView { id: root diff --git a/libraries/gl/src/gl/OffscreenQmlSurface.cpp b/libraries/gl/src/gl/OffscreenQmlSurface.cpp index e8b300f171..d53c1289e4 100644 --- a/libraries/gl/src/gl/OffscreenQmlSurface.cpp +++ b/libraries/gl/src/gl/OffscreenQmlSurface.cpp @@ -565,6 +565,19 @@ QObject* OffscreenQmlSurface::finishQmlLoad(std::functionbeginCreate(newContext); if (_qmlComponent->isError()) { @@ -577,6 +590,9 @@ QObject* OffscreenQmlSurface::finishQmlLoad(std::functionsetProperty("eventBridge", QVariant::fromValue(this)); + newContext->setContextProperty("eventBridgeJavaScriptToInject", QVariant(javaScriptToInject)); + f(newContext, newObject); _qmlComponent->completeCreate(); @@ -835,6 +851,9 @@ void OffscreenQmlSurface::onFocusObjectChanged(QObject* object) { disconnect(_currentFocusItem, &QObject::destroyed, this, 0); setKeyboardRaised(_currentFocusItem, false); } + + // Handle QML text fields' focus and unfocus - testing READ_ONLY_PROPERTY prevents action for HTML files. + // HTML text fields are handled via emitWebEvent(). const char* READ_ONLY_PROPERTY = "readOnly"; setKeyboardRaised(item, item->hasActiveFocus() && item->property(READ_ONLY_PROPERTY) == false); _currentFocusItem = item; @@ -897,12 +916,6 @@ void OffscreenQmlSurface::synthesizeKeyPress(QString key) { } void OffscreenQmlSurface::setKeyboardRaised(QObject* object, bool raised) { - - // raise the keyboard only while in HMD mode and it's being requested. - // XXX - // bool value = AbstractViewStateInterface::instance()->isHMDMode() && raised; - // getRootItem()->setProperty("keyboardRaised", QVariant(value)); - if (!object) { return; } @@ -931,16 +944,13 @@ void OffscreenQmlSurface::emitWebEvent(const QVariant& message) { } else { // special case to handle raising and lowering the virtual keyboard if (message.type() == QVariant::String && message.toString() == "_RAISE_KEYBOARD") { - setKeyboardRaised(getRootItem(), true); + setKeyboardRaised(_currentFocusItem, true); } else if (message.type() == QVariant::String && message.toString() == "_LOWER_KEYBOARD") { - setKeyboardRaised(getRootItem(), false); + setKeyboardRaised(_currentFocusItem, false); } else { emit webEventReceived(message); } } } - - - #include "OffscreenQmlSurface.moc"