aboutsummaryrefslogtreecommitdiffstats
path: root/share/qtcreator/qmldesigner/propertyEditorQmlSources/imports/StudioControls/TextArea.qml
blob: 3e8b501862b0eb4da0d3f8a51129ee255c1b2c86 (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
119
120
121
122
123
124
125
// Copyright (C) 2023 The Qt Company Ltd.
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0 WITH Qt-GPL-exception-1.0

import QtQuick
import QtQuick.Templates as T
import StudioTheme 1.0 as StudioTheme

TextField {
    id: control

    property StudioTheme.ControlStyle style: StudioTheme.Values.controlStyle

    property real relativePopupX: 0 // TODO Maybe call it leftPadding
    property real popupWidth: control.width
    property string txtStorage

    property int temp: 0

    T.Popup {
        id: popup
        x: control.relativePopupX
        y: control.height - control.style.borderWidth
        width: control.popupWidth
        height: scrollView.height
        background: Rectangle {
            color: control.style.popup.background
            border.color: control.style.interaction
            border.width: control.style.borderWidth
        }

        contentItem: ScrollView {
            id: scrollView
            style: control.style
            padding: 0
            height: Math.min(textAreaPopup.contentHeight + scrollView.topPadding
                             + scrollView.bottomPadding,
                             control.style.maxTextAreaPopupHeight)
            ScrollBar.horizontal.policy: ScrollBar.AlwaysOn
            ScrollBar.vertical.policy: ScrollBar.AlwaysOn

            T.TextArea {
                id: textAreaPopup
                padding: 10
                width: textAreaPopup.contentWidth + textAreaPopup.leftPadding
                       + textAreaPopup.rightPadding
                anchors.fill: parent
                font.pixelSize: control.style.baseFontSize
                color: control.style.text.idle
                selectionColor: control.style.text.selection
                selectedTextColor: control.style.text.selectedText
                selectByMouse: true
                persistentSelection: textAreaPopup.focus

                MouseArea {
                    id: mouseArea
                    anchors.fill: parent
                    enabled: true
                    cursorShape: Qt.IBeamCursor
                    acceptedButtons: Qt.RightButton
                    onPressed: contextMenu.popup(textAreaPopup)
                }
            }
        }

        ContextMenu {
            id: contextMenu
            style: control.style
            __parentControl: textAreaPopup
        }

        AbstractButton {
            id: acceptButton
            style: control.style
            x: popup.width - acceptButton.width
            y: popup.height - control.style.borderWidth
            width: Math.round(control.style.smallControlSize.width)
            height: Math.round(control.style.smallControlSize.height)
            buttonIcon: StudioTheme.Constants.tickIcon
        }

        AbstractButton {
            id: discardButton
            style: control.style
            x: popup.width - acceptButton.width - discardButton.width + control.style.borderWidth
            y: popup.height - control.style.borderWidth
            width: Math.round(control.style.smallControlSize.width)
            height: Math.round(control.style.smallControlSize.height)
            buttonIcon: StudioTheme.Constants.closeCross
        }

        Component.onCompleted: control.storeAndFormatTextInput(control.text)

        onOpened: {
            textAreaPopup.text = control.txtStorage
            control.clear()
        }

        onClosed: {
            control.storeAndFormatTextInput(textAreaPopup.text)
            control.forceActiveFocus()
            textAreaPopup.deselect()
        }
    }

    function storeAndFormatTextInput(inputText) {
        control.txtStorage = inputText
        var pos = control.txtStorage.search(/\n/g)
        var sliceAt = Math.min(pos, 15)
        control.text = control.txtStorage.slice(0, sliceAt).padEnd(sliceAt + 3, '.')
    }

    Keys.onPressed: function(event) {
        if (event.key === Qt.Key_Escape) {
            if (popup.opened)
                popup.close()
            else
                control.focus = false
        }

        if ((event.key === Qt.Key_Return || event.key === Qt.Key_Enter) && !popup.opened) {
            popup.open()
            textAreaPopup.forceActiveFocus()
        }
    }
}