144 lines
5.0 KiB
QML
144 lines
5.0 KiB
QML
// Copyright (C) 2016 The Qt Company Ltd.
|
|
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only
|
|
|
|
import QtQuick
|
|
// Deliberately imported after QtQuick to avoid missing restoreMode property in Binding. Fix in Qt 6.
|
|
import QtQml
|
|
import QtQuick.VirtualKeyboard
|
|
import QtQuick.VirtualKeyboard.Components
|
|
|
|
/*!
|
|
\qmltype InputPanel
|
|
\inqmlmodule QtQuick.VirtualKeyboard
|
|
|
|
\brief Provides the virtual keyboard UI.
|
|
\ingroup qmlclass
|
|
\ingroup qtvirtualkeyboard-qml
|
|
|
|
The keyboard size is automatically calculated from the available
|
|
width; that is, the keyboard maintains the aspect ratio specified by the current
|
|
style. Therefore the application should only set the \l {Item::}{width} and \l {Item::}{y}
|
|
coordinates of the InputPanel, and not the \l {Item::}{height}.
|
|
|
|
As with \l {Qt Virtual Keyboard QML Types}{all other QML types} provided by
|
|
the module, the \c QT_IM_MODULE environment variable must be set to
|
|
\c qtvirtualkeyboard before using InputPanel. For more information, see
|
|
\l {Loading the Plugin}.
|
|
|
|
\note You can have only one InputPanel instance in your application. The panel
|
|
will not be blocked by modal dialogs, but it can be obscured by items with a higher
|
|
\l {Item::}{z} value.
|
|
*/
|
|
|
|
Item {
|
|
id: inputPanel
|
|
|
|
/*!
|
|
\qmlproperty bool InputPanel::active
|
|
\since QtQuick.VirtualKeyboard 2.0
|
|
|
|
This property reflects the active status of the input panel.
|
|
The keyboard should be made visible to the user when this property is
|
|
\c true.
|
|
*/
|
|
property alias active: keyboard.active
|
|
|
|
/*!
|
|
\qmlproperty bool InputPanel::externalLanguageSwitchEnabled
|
|
\since QtQuick.VirtualKeyboard 2.4
|
|
|
|
This property enables the external language switch mechanism.
|
|
When this property is \c true, the virtual keyboard will not show
|
|
the built-in language popup, but will emit the \l externalLanguageSwitch
|
|
signal instead. The application can handle this signal and show a
|
|
custom language selection dialog instead.
|
|
*/
|
|
property bool externalLanguageSwitchEnabled
|
|
|
|
/*!
|
|
\qmlsignal InputPanel::externalLanguageSwitch(var localeList, int currentIndex)
|
|
\since QtQuick.VirtualKeyboard 2.4
|
|
|
|
This signal is emitted when \l externalLanguageSwitchEnabled is \c true
|
|
and the \l {user-guide-language}{language switch key} is pressed by the user.
|
|
|
|
It serves as a hook to display a custom language dialog instead of
|
|
the built-in language popup in the virtual keyboard.
|
|
|
|
The \a localeList parameter contains a list of locale names to choose
|
|
from. To get more information about a particular language, use the
|
|
\l[QtQml]{Qt::locale()}{Qt.locale()} function. The \a currentIndex
|
|
is the index of current locale in the \a localeList. This item should
|
|
be highlighted as the current item in the UI.
|
|
|
|
To select a new language, use the \l {VirtualKeyboardSettings::locale}
|
|
{VirtualKeyboardSettings.locale} property.
|
|
|
|
Below is an example that demonstrates a custom language dialog implementation:
|
|
|
|
\snippet qtvirtualkeyboard-custom-language-popup.qml popup
|
|
|
|
The dialog would then be declared:
|
|
|
|
\snippet qtvirtualkeyboard-custom-language-popup.qml declaring
|
|
|
|
In the application's InputPanel, add the following code:
|
|
|
|
\snippet qtvirtualkeyboard-custom-language-popup.qml using
|
|
|
|
The custom dialog will now be shown when the language switch key is pressed.
|
|
*/
|
|
signal externalLanguageSwitch(var localeList, int currentIndex)
|
|
|
|
/*! \internal */
|
|
property alias keyboard: keyboard
|
|
|
|
/*! \internal */
|
|
property bool desktopPanel: false
|
|
|
|
SelectionControl {
|
|
objectName: "selectionControl"
|
|
x: -parent.x
|
|
y: -parent.y
|
|
enabled: active && !keyboard.fullScreenMode && !desktopPanel
|
|
}
|
|
|
|
implicitHeight: keyboard.height - keyboard.wordCandidateView.y
|
|
Keyboard {
|
|
id: keyboard
|
|
anchors.left: parent.left
|
|
anchors.right: parent.right
|
|
anchors.bottom: parent.bottom
|
|
}
|
|
MouseArea {
|
|
z: -1
|
|
anchors.fill: keyboard
|
|
enabled: active
|
|
hoverEnabled: active
|
|
}
|
|
|
|
Binding {
|
|
target: InputContext.priv
|
|
property: "keyboardRectangle"
|
|
value: keyboardRectangle()
|
|
when: !InputContext.animating && inputPanel.active
|
|
}
|
|
|
|
/*! \internal */
|
|
function keyboardRectangle() {
|
|
const forBindingX = x
|
|
const forBindingY = y
|
|
const rect = desktopPanel ?
|
|
Qt.rect(keyboard.x,
|
|
keyboard.y + keyboard.wordCandidateView.y,
|
|
keyboard.width,
|
|
keyboard.height - keyboard.wordCandidateView.y) :
|
|
Qt.rect(0, 0, width, height)
|
|
if (keyboard.shadowInputControl.visible) {
|
|
rect.y -= keyboard.shadowInputControl.height
|
|
rect.height += keyboard.shadowInputControl.height
|
|
}
|
|
return mapToItem(null, rect)
|
|
}
|
|
}
|