Skip to content

Instantly share code, notes, and snippets.

@penk
Last active November 27, 2018 05:33
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save penk/e2f0d2d97319ac5b77f9992865a5ce30 to your computer and use it in GitHub Desktop.
Save penk/e2f0d2d97319ac5b77f9992865a5ce30 to your computer and use it in GitHub Desktop.
Reusing Qt virtual keyboard's existing input method from actual keyboard PoC
(function () {
window.addEventListener("keypress", function (e) {
console.log('keypress:'+String.fromCharCode(e.keyCode));
e.preventDefault();
}, false);
})();
/****************************************************************************
**
** Copyright (C) 2016 The Qt Company Ltd.
** Contact: https://www.qt.io/licensing/
**
** This file is part of the Qt Virtual Keyboard module of the Qt Toolkit.
**
** $QT_BEGIN_LICENSE:GPL$
** Commercial License Usage
** Licensees holding valid commercial Qt licenses may use this file in
** accordance with the commercial license agreement provided with the
** Software or, alternatively, in accordance with the terms contained in
** a written agreement between you and The Qt Company. For licensing terms
** and conditions see https://www.qt.io/terms-conditions. For further
** information use the contact form at https://www.qt.io/contact-us.
**
** GNU General Public License Usage
** Alternatively, this file may be used under the terms of the GNU
** General Public License version 3 or (at your option) any later version
** approved by the KDE Free Qt Foundation. The licenses are as published by
** the Free Software Foundation and appearing in the file LICENSE.GPL3
** included in the packaging of this file. Please review the following
** information to ensure the GNU General Public License requirements will
** be met: https://www.gnu.org/licenses/gpl-3.0.html.
**
** $QT_END_LICENSE$
**
****************************************************************************/
.pragma library
function findChildByProperty(parent, propertyName, propertyValue, compareCb) {
var obj = null
if (parent === null)
return null
var children = parent.children
for (var i = 0; i < children.length; i++) {
obj = children[i]
if (obj.hasOwnProperty(propertyName)) {
if (compareCb !== null) {
if (compareCb(obj[propertyName], propertyValue))
break
} else if (obj[propertyName] === propertyValue) {
break
}
}
obj = findChildByProperty(obj, propertyName, propertyValue, compareCb)
if (obj)
break
}
return obj
}
function findChild(parent, param, matchCb) {
var obj = null
if (parent === null)
return null
var children = parent.children
for (var i = 0; i < children.length; i++) {
obj = children[i]
if (matchCb(obj, param))
break
obj = findChild(obj, param, matchCb)
if (obj)
break
}
return obj
}
import QtQuick 2.0
import QtWebEngine 1.7
import QtQuick.Window 2.2
import QtTest 1.11
import QtQuick.VirtualKeyboard 2.2
import QtQuick.VirtualKeyboard.Settings 2.2
import "utils.js" as Utils
Window {
width: 1024
height: 600
visible: true
TestEvent {
id: testCase
}
property var virtualKeyPressPoint: null
readonly property var keyboard: Utils.findChildByProperty(inputPanel, "objectName", "keyboard", null)
readonly property var keyboardLayoutLoader: Utils.findChildByProperty(keyboard, "objectName", "keyboardLayoutLoader", null)
function findVirtualKey(key) {
return Utils.findChild(keyboardLayoutLoader, key, function(obj, param) {
if (!obj.hasOwnProperty("key") || !obj.hasOwnProperty("text"))
return false
return (typeof param == "number") ? obj.key === param : obj.text.toUpperCase() === param.toUpperCase()
})
}
function findVirtualKeyAlternative(key) {
if (typeof key != "string")
return null
return Utils.findChildByProperty(keyboardLayoutLoader, "effectiveAlternativeKeys", key.toUpperCase(),
function(propertyValue, key) {
if (typeof propertyValue == "string")
return propertyValue.toUpperCase().indexOf(key) !== -1
return propertyValue.filter(function(value) {
return key === value.toUpperCase()
}).length > 0
})
}
WebEngineView {
id: webView
anchors.fill: parent
url: "https://duckduckgo.com"
userScripts: [
WebEngineScript {
injectionPoint: WebEngineScript.DocumentReady
worldId: WebEngineScript.MainWorld
sourceUrl: "./userscript.js"
}
]
onJavaScriptConsoleMessage: {
console.log(message)
var key = message.split(/:/)[1]
var keyObj
if (key != null)
keyObj = findVirtualKey(key)
if (!keyObj && typeof key == "string") {
keyObj = findVirtualKeyAlternative(key)
}
virtualKeyPressPoint = inputPanel.mapFromItem(keyObj, keyObj.width / 2, keyObj.height / 2)
console.log(virtualKeyPressPoint.x, virtualKeyPressPoint.y)
testCase.mouseClick(inputPanel, virtualKeyPressPoint.x, virtualKeyPressPoint.y, Qt.LeftButton, Qt.NoModifier, 2)
}
}
InputPanel {
id: inputPanel
z: 89
y: parent.height
anchors.left: parent.left
anchors.right: parent.right
states: State {
name: "visible"
when: inputPanel.active
PropertyChanges {
target: inputPanel
y: parent.height - inputPanel.height
}
}
transitions: Transition {
id: inputPanelTransition
from: ""
to: "visible"
reversible: true
enabled: !VirtualKeyboardSettings.fullScreenMode
ParallelAnimation {
NumberAnimation {
properties: "y"
duration: 250
easing.type: Easing.InOutQuad
}
}
}
Binding {
target: InputContext
property: "animating"
value: inputPanelTransition.running
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment