aboutsummaryrefslogtreecommitdiffstats
path: root/tests/auto/inputpanel/data/inputpanel/handwritinginputpanel.qml
blob: 7b81a42f823276ad4aa5773c9b21efbe3f610e23 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
// Copyright (C) 2016 The Qt Company Ltd.
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only

import QtTest
import QtQuick
import QtQuick.VirtualKeyboard
import "handwriting.js" as Handwriting
import "utils.js" as Utils

HandwritingInputPanel {
    id: handwritingInputPanel
    z: 99

    property var testcase
    readonly property var inputMethod: InputContext.inputEngine.inputMethod
    readonly property var wordCandidatePopupList: Utils.findChildByProperty(handwritingInputPanel, "objectName", "wordCandidatePopupList", null)

    anchors.fill: parent

    signal inputMethodResult(var text)

    Connections {
        target: InputContext
        function onPreeditTextChanged() { if (InputContext.preeditText.length > 0) inputMethodResult(InputContext.preeditText) }
    }

    Connections {
        target: InputContext.inputEngine
        function onVirtualKeyClicked(key, text, modifiers, isAutoRepeat) { inputMethodResult(text) }
    }

    SignalSpy {
        id: inputMethodResultSpy
        target: handwritingInputPanel
        signalName: "inputMethodResult"
    }

    SignalSpy {
        id: wordCandidateListChangedSpy
        target: wordCandidatePopupList.model
        signalName: "dataChanged"
    }

    function wordCandidatePopupListSearchSuggestion(suggestion, timeout) {
        if (wordCandidatePopupList.visible === false)
            return false

        if (timeout !== undefined && timeout > 0) {
            // Note: Not using SignalSpy.wait() since it causes the test case to fail in case the signal is not emitted
            wordCandidateListChangedSpy.clear()
            var dt = new Date()
            var startTime = dt.getTime()
            while (wordCandidateListChangedSpy.count == 0) {
                dt = new Date()
                var elapsedTime = dt.getTime() - startTime
                if (elapsedTime >= timeout)
                    break
                var maxWait = Math.min(timeout - elapsedTime, 50)
                testcase.wait(maxWait)
            }
        }

        var suggestionFound = false
        var origIndex = handwritingInputPanel.wordCandidatePopupList.currentIndex
        if (origIndex !== -1) {
            while (true) {
                if (handwritingInputPanel.wordCandidatePopupList.model.dataAt(handwritingInputPanel.wordCandidatePopupList.currentIndex) === suggestion) {
                    suggestionFound = true
                    break
                }
                if (handwritingInputPanel.wordCandidatePopupList.currentIndex === handwritingInputPanel.wordCandidatePopupList.count - 1)
                    break
                handwritingInputPanel.wordCandidatePopupList.incrementCurrentIndex()
            }
            if (!suggestionFound) {
                while (handwritingInputPanel.wordCandidatePopupList.currentIndex !== origIndex) {
                    handwritingInputPanel.wordCandidatePopupList.decrementCurrentIndex()
                }
            }
            testcase.waitForRendering(handwritingInputPanel)
        }
        return suggestionFound
    }

    function wordCandidatePopupListSelectCurrentItem() {
        if (!handwritingInputPanel.wordCandidatePopupList.currentItem)
            return false
        testcase.wait(200)
        var itemPos = handwritingInputPanel.mapFromItem(handwritingInputPanel.wordCandidatePopupList.currentItem,
                                                        handwritingInputPanel.wordCandidatePopupList.currentItem.width / 2,
                                                        handwritingInputPanel.wordCandidatePopupList.currentItem.height / 2)
        testcase.mouseClick(handwritingInputPanel, itemPos.x, itemPos.y, Qt.LeftButton, 0, 20)
        testcase.waitForRendering(handwritingInputPanel)
        return true
    }

    function emulateHandwriting(ch, instant) {
        if (!available)
            return false
        active = true
        var hwrInputArea = Utils.findChildByProperty(handwritingInputPanel, "objectName", "hwrInputArea", null)
        inputMethodResultSpy.clear()
        if (!Handwriting.emulate(testcase, hwrInputArea, ch, instant)) {
            console.warn("Cannot produce the symbol '%1' in full screen handwriting mode".arg(ch))
            return false
        }
        if (isSuperimposedHandwriting())
            return true;
        inputMethodResultSpy.wait(3000)
        return inputMethodResultSpy.count > 0
    }

    function isSuperimposedHandwriting() {
        if (!available)
            return false
        return inputMethod != null && inputMethod.hasOwnProperty("superimposed") && inputMethod.superimposed;
    }
}