aboutsummaryrefslogtreecommitdiffstats
path: root/src/components/WordCandidatePopupList.qml
diff options
context:
space:
mode:
Diffstat (limited to 'src/components/WordCandidatePopupList.qml')
-rw-r--r--src/components/WordCandidatePopupList.qml59
1 files changed, 59 insertions, 0 deletions
diff --git a/src/components/WordCandidatePopupList.qml b/src/components/WordCandidatePopupList.qml
new file mode 100644
index 00000000..a9c802a5
--- /dev/null
+++ b/src/components/WordCandidatePopupList.qml
@@ -0,0 +1,59 @@
+// 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
+
+PopupList {
+ id: wordCandidatePopupList
+
+ readonly property int preferredVisibleItems: {
+ if (!currentItem)
+ return 0
+ var maxHeight = flipVertical ? Qt.inputMethod.cursorRectangle.y : parent.height - Qt.inputMethod.cursorRectangle.height - Qt.inputMethod.cursorRectangle.y
+ var result = Math.min(count, maxVisibleItems)
+ while (result > 2 && result * currentItem.height > maxHeight)
+ --result
+ return result
+ }
+ readonly property bool flipVertical: currentItem &&
+ Qt.inputMethod.cursorRectangle.y + (Qt.inputMethod.cursorRectangle.height / 2) > (parent.height / 2) &&
+ Qt.inputMethod.cursorRectangle.y + Qt.inputMethod.cursorRectangle.height + (currentItem.height * 2) > parent.height
+
+ height: currentItem ? currentItem.height * preferredVisibleItems + (spacing * preferredVisibleItems - 1) : 0
+ Binding {
+ target: wordCandidatePopupList
+ property: "x"
+ value: Math.round(Qt.inputMethod.cursorRectangle.x -
+ (wordCandidatePopupList.currentItem ?
+ (wordCandidatePopupList.currentItem.hasOwnProperty("cursorAnchor") ?
+ wordCandidatePopupList.currentItem.cursorAnchor : wordCandidatePopupList.currentItem.width) : 0))
+ when: wordCandidatePopupList.visible
+ restoreMode: Binding.RestoreBinding
+ }
+ Binding {
+ target: wordCandidatePopupList
+ property: "y"
+ value: Math.round(wordCandidatePopupList.flipVertical ? Qt.inputMethod.cursorRectangle.y - wordCandidatePopupList.height : Qt.inputMethod.cursorRectangle.y + Qt.inputMethod.cursorRectangle.height)
+ when: wordCandidatePopupList.visible
+ restoreMode: Binding.RestoreBinding
+ }
+ model: enabled ? InputContext.inputEngine.wordCandidateListModel : null
+
+ onContentWidthChanged: viewResizeTimer.restart()
+
+ Timer {
+ id: viewResizeTimer
+ interval: 0
+ repeat: false
+ onTriggered: wordCandidatePopupList.width = wordCandidatePopupList.contentWidth
+ }
+
+ Connections {
+ target: wordCandidatePopupList.model ? wordCandidatePopupList.model : null
+ function onActiveItemChanged(index) { wordCandidatePopupList.currentIndex = index }
+ function onItemSelected() { if (wordCandidatePopupList.currentItem) keyboard.soundEffect.play(wordCandidatePopupList.currentItem.soundEffect) }
+ }
+}