From 3d5e8fc213da50f3d0760ee81476cccd87c70585 Mon Sep 17 00:00:00 2001 From: "Anthony J. Thibault" Date: Fri, 2 Sep 2016 12:15:30 -0700 Subject: [PATCH] First pass of keyboard raising and lowering --- .../resources/html/raiseAndLowerKeyboard.js | 18 ++++++++++-------- interface/resources/qml/controls/WebView.qml | 12 ++++++++---- .../src/RenderableWebEntityItem.cpp | 13 ++++++++++++- .../src/RenderableWebEntityItem.h | 1 + .../system/controllers/handControllerGrab.js | 2 +- 5 files changed, 32 insertions(+), 14 deletions(-) diff --git a/interface/resources/html/raiseAndLowerKeyboard.js b/interface/resources/html/raiseAndLowerKeyboard.js index 18b3c44453..5190950332 100644 --- a/interface/resources/html/raiseAndLowerKeyboard.js +++ b/interface/resources/html/raiseAndLowerKeyboard.js @@ -9,20 +9,22 @@ // (function () { var POLL_FREQUENCY = 500; // ms - var lastRaiseKeyboard = false; + var MAX_WARNINGS = 3; + var numWarnings = 0; + function shouldRaiseKeyboard() { return document.activeElement.nodeName == "INPUT" || document.activeElement.nodeName == "TEXTAREA"; }; + setInterval(function () { - var newRaiseKeyboard = shouldRaiseKeyboard(); - if (newRaiseKeyboard != lastRaiseKeyboard) { - var event = newRaiseKeyboard ? "_RAISE_KEYBOARD" : "_LOWER_KEYBOARD"; - if (typeof EventBridge != "undefined") { - EventBridge.emitWebEvent(event); - } else { + var event = shouldRaiseKeyboard() ? "_RAISE_KEYBOARD" : "_LOWER_KEYBOARD"; + if (typeof EventBridge != "undefined") { + EventBridge.emitWebEvent(event); + } else { + if (numWarnings < MAX_WARNINGS) { console.log("WARNING: no global EventBridge object found"); + numWarnings++; } - lastRaiseKeyboard = newRaiseKeyboard; } }, POLL_FREQUENCY); })(); diff --git a/interface/resources/qml/controls/WebView.qml b/interface/resources/qml/controls/WebView.qml index 99b2bda237..9eb079bfaa 100644 --- a/interface/resources/qml/controls/WebView.qml +++ b/interface/resources/qml/controls/WebView.qml @@ -5,6 +5,7 @@ import QtWebChannel 1.0 Item { property alias url: root.url property alias eventBridge: eventBridgeWrapper.eventBridge + property bool keyboardRaised: false QtObject { id: eventBridgeWrapper @@ -17,7 +18,7 @@ Item { x: 0 y: 0 width: parent.width - height: parent.height - keyboard1.height + height: keyboardRaised ? parent.height - keyboard.height : parent.height // creates a global EventBridge object. WebEngineScript { @@ -61,6 +62,7 @@ Item { } onUrlChanged: { + keyboardRaised = false; var originalUrl = url.toString(); root.newUrl = urlHandler.fixupUrl(originalUrl).toString(); if (root.newUrl !== originalUrl) { @@ -104,9 +106,11 @@ Item { // virtual keyboard Keyboard { - id: keyboard1 - x: 197 - y: 182 + id: keyboard + y: keyboardRaised ? parent.height : 0 + height: keyboardRaised ? 200 : 0 + visible: keyboardRaised + enabled: keyboardRaised anchors.right: parent.right anchors.rightMargin: 0 anchors.left: parent.left diff --git a/libraries/entities-renderer/src/RenderableWebEntityItem.cpp b/libraries/entities-renderer/src/RenderableWebEntityItem.cpp index fb4f020a1b..e3c5dac2c0 100644 --- a/libraries/entities-renderer/src/RenderableWebEntityItem.cpp +++ b/libraries/entities-renderer/src/RenderableWebEntityItem.cpp @@ -55,7 +55,14 @@ void WebEntityAPIHelper::emitWebEvent(const QVariant& message) { if (QThread::currentThread() != thread()) { QMetaObject::invokeMethod(this, "emitWebEvent", Qt::QueuedConnection, Q_ARG(QVariant, message)); } else { - emit webEventReceived(message); + // special case to handle raising and lowering the virtual keyboard + if (message.type() == QVariant::String && message.toString() == "_RAISE_KEYBOARD" && _ptr) { + _ptr->setKeyboardRaised(true); + } else if (message.type() == QVariant::String && message.toString() == "_LOWER_KEYBOARD" && _ptr) { + _ptr->setKeyboardRaised(false); + } else { + emit webEventReceived(message); + } } } @@ -357,3 +364,7 @@ void RenderableWebEntityItem::synthesizeKeyPress(QString key) { void RenderableWebEntityItem::emitScriptEvent(const QVariant& message) { _webEntityAPIHelper.emitScriptEvent(message); } + +void RenderableWebEntityItem::setKeyboardRaised(bool raised) { + _webSurface->getRootItem()->setProperty("keyboardRaised", QVariant(raised)); +} diff --git a/libraries/entities-renderer/src/RenderableWebEntityItem.h b/libraries/entities-renderer/src/RenderableWebEntityItem.h index 6a19bd12cd..9cf661aa70 100644 --- a/libraries/entities-renderer/src/RenderableWebEntityItem.h +++ b/libraries/entities-renderer/src/RenderableWebEntityItem.h @@ -64,6 +64,7 @@ public: bool needsToCallUpdate() const override { return _webSurface != nullptr; } void emitScriptEvent(const QVariant& message); + void setKeyboardRaised(bool raised); SIMPLE_RENDERABLE(); diff --git a/scripts/system/controllers/handControllerGrab.js b/scripts/system/controllers/handControllerGrab.js index d285ddf5d8..f99cec28cd 100644 --- a/scripts/system/controllers/handControllerGrab.js +++ b/scripts/system/controllers/handControllerGrab.js @@ -21,7 +21,7 @@ Script.include("/~/system/libraries/Xform.js"); // add lines where the hand ray picking is happening // var WANT_DEBUG = false; -var WANT_DEBUG_STATE = true; +var WANT_DEBUG_STATE = false; var WANT_DEBUG_SEARCH_NAME = null; //