From 2344d15dbcedf8e5ae09bd6e85c56cb709868b7f Mon Sep 17 00:00:00 2001 From: David Rowe Date: Wed, 28 Sep 2016 16:41:01 +1300 Subject: [PATCH] Raise and lower keyboard for HTML fields in Marketplace window --- interface/resources/qml/QmlWebWindow.qml | 18 ++++++++++++++++++ libraries/ui/src/QmlWebWindowClass.cpp | 24 +++++++++++++++++++++++- libraries/ui/src/QmlWebWindowClass.h | 3 +++ 3 files changed, 44 insertions(+), 1 deletion(-) diff --git a/interface/resources/qml/QmlWebWindow.qml b/interface/resources/qml/QmlWebWindow.qml index 153498e2f7..7ea45bff6b 100644 --- a/interface/resources/qml/QmlWebWindow.qml +++ b/interface/resources/qml/QmlWebWindow.qml @@ -66,6 +66,24 @@ Windows.ScrollingWindow { anchors.fill: parent focus: true 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 ] } } } diff --git a/libraries/ui/src/QmlWebWindowClass.cpp b/libraries/ui/src/QmlWebWindowClass.cpp index b964f305a4..5a357a83d4 100644 --- a/libraries/ui/src/QmlWebWindowClass.cpp +++ b/libraries/ui/src/QmlWebWindowClass.cpp @@ -43,7 +43,29 @@ void QmlWebWindowClass::emitWebEvent(const QVariant& webMessage) { if (QThread::currentThread() != thread()) { QMetaObject::invokeMethod(this, "emitWebEvent", Qt::QueuedConnection, Q_ARG(QVariant, webMessage)); } else { - emit webEventReceived(webMessage); + // Special cases for raising and lowering the virtual keyboard. + if (webMessage.type() == QVariant::String && webMessage.toString() == "_RAISE_KEYBOARD") { + setKeyboardRaised(asQuickItem(), true); + } else if (webMessage.type() == QVariant::String && webMessage.toString() == "_LOWER_KEYBOARD") { + setKeyboardRaised(asQuickItem(), false); + } else { + emit webEventReceived(webMessage); + } + } +} + +void QmlWebWindowClass::setKeyboardRaised(QObject* object, bool raised) { + if (!object) { + return; + } + + QQuickItem* item = dynamic_cast(object); + while (item) { + if (item->property("keyboardRaised").isValid()) { + item->setProperty("keyboardRaised", QVariant(raised)); + return; + } + item = dynamic_cast(item->parentItem()); } } diff --git a/libraries/ui/src/QmlWebWindowClass.h b/libraries/ui/src/QmlWebWindowClass.h index 86d0e9b2c4..95851d2857 100644 --- a/libraries/ui/src/QmlWebWindowClass.h +++ b/libraries/ui/src/QmlWebWindowClass.h @@ -33,6 +33,9 @@ signals: protected: QString qmlSource() const override { return "QmlWebWindow.qml"; } + +private: + void setKeyboardRaised(QObject* object, bool raised); }; #endif