aboutsummaryrefslogtreecommitdiffstats
path: root/share/qtcreator/qmldesigner/collectionEditorQmlSource/CollectionDetailsEditDelegate.qml
blob: 6a3146a81886003bef398833c2c0bf41d53fc118 (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
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
// Copyright (C) 2023 The Qt Company Ltd.
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0

import QtQuick
import CollectionDetails 1.0 as CollectionDetails
import StudioControls 1.0 as StudioControls
import StudioHelpers as StudioHelpers
import StudioTheme 1.0 as StudioTheme
import QtQuick.Templates as T

Item {
    id: root

    required property var columnType

    TableView.onCommit: {
        if (editorLoader.changesAccepted && edit !== editorLoader.acceptedValue)
            edit = editorLoader.acceptedValue
    }

    onActiveFocusChanged: {
        if (root.activeFocus && !editorLoader.triggered && editorLoader.item) {
            editorLoader.triggered = true
            editorLoader.item.open()
        }

        // active focus should be checked again, because it might be affected by editorLoader.item
        if (root.activeFocus && editorLoader.editor)
            editorLoader.editor.forceActiveFocus()
    }

    Loader {
        id: editorLoader

        active: true

        property var editor: editorLoader.item ? editorLoader.item.editor : null
        property var editValue: editorLoader.editor ? editorLoader.editor.editValue : null
        property var acceptedValue: null
        property bool changesAccepted: true
        property bool triggered: false

        Connections {
            id: modifierFocusConnection

            target: editorLoader.editor
            enabled: editorLoader.item !== undefined

            function onActiveFocusChanged() {
                if (!modifierFocusConnection.target.activeFocus) {
                    editorLoader.acceptedValue = editorLoader.editValue
                    root.TableView.commit()
                }
            }
        }

        Component {
            id: textEditor

            EditorPopup {
                editor: textField

                StudioControls.TextField {
                    id: textField

                    property alias editValue: textField.text

                    actionIndicator.visible: false
                    translationIndicatorVisible: false

                    onRejected: editorLoader.changesAccepted = false
                }
            }
        }

        Component {
            id: realEditor

            EditorPopup {

                editor: realField

                StudioControls.RealSpinBox {
                    id: realField

                    property alias editValue: realField.realValue

                    actionIndicator.visible: false
                    realFrom: -9e9
                    realTo: 9e9
                    realStepSize: 1.0
                    decimals: 6
                    trailingZeroes: false
                }
            }
        }

        Component {
            id: integerEditor

            EditorPopup {

                editor: integerField

                StudioControls.SpinBox {
                    id: integerField

                    property alias editValue: integerField.value

                    actionIndicatorVisible: false
                    spinBoxIndicatorVisible: true
                    from: -2147483647
                    to: 2147483647
                    decimals: 0
                }
            }
        }

        Component {
            id: boolEditor

            EditorPopup {

                editor: boolField

                StudioControls.CheckBox {
                    id: boolField

                    property alias editValue: boolField.checked

                    actionIndicatorVisible: false
                }
            }
        }
    }

    component EditorPopup: T.Popup {
        id: editorPopup

        required property Item editor

        implicitHeight: contentHeight
        implicitWidth: contentWidth

        focus: true
        visible: false

        Connections {
            target: editorPopup.editor

            function onActiveFocusChanged() {
                if (!editorPopup.activeFocus)
                    editorPopup.close()
                else if (edit)
                    editorPopup.editor.editValue = edit
            }
        }

        Connections {
            target: editorPopup.editor.Keys

            function onEscapePressed() {
                editorLoader.changesAccepted = false
                editorPopup.close()
            }
        }
    }

    states: [
        State {
            name: "default"
            when: columnType !== CollectionDetails.DataType.Boolean
                  && columnType !== CollectionDetails.DataType.Color
                  && columnType !== CollectionDetails.DataType.Integer
                  && columnType !== CollectionDetails.DataType.Real

            PropertyChanges {
                target: editorLoader
                sourceComponent: textEditor
            }
        },
        State {
            name: "integer"
            when: columnType === CollectionDetails.DataType.Integer

            PropertyChanges {
                target: editorLoader
                sourceComponent: integerEditor
            }
        },
        State {
            name: "real"
            when: columnType === CollectionDetails.DataType.Real

            PropertyChanges {
                target: editorLoader
                sourceComponent: realEditor
            }
        },
        State {
            name: "bool"
            when: columnType === CollectionDetails.DataType.Boolean

            PropertyChanges {
                target: editorLoader
                sourceComponent: boolEditor
            }
        },
        State {
            name: "color"
            when: columnType === CollectionDetails.DataType.Color

            PropertyChanges {
                target: editorLoader
                sourceComponent: null
            }
        }
    ]
}