/**************************************************************************** ** ** 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$ ** ****************************************************************************/ import QtQuick 2.0 // Deliberately imported after QtQuick to avoid missing restoreMode property in Binding. Fix in Qt 6. import QtQml 2.14 import QtQuick.VirtualKeyboard 2.3 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 onActiveItemChanged: wordCandidatePopupList.currentIndex = index onItemSelected: if (wordCandidatePopupList.currentItem) keyboard.soundEffect.play(wordCandidatePopupList.currentItem.soundEffect) } }