blob: 2a3330d05d476ce1bc8a721a79aed8ac782d8e96 (
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
|
// Copyright (C) 2026 The Qt Company Ltd.
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only
pragma ComponentBehavior: Bound
import QtQuick
import QtQuick.Controls
import Audio
ComboBox {
id: root
property string currentFile: currentText ? `Sounds/${currentText}` : ""
required property int initialIndex
model: audioFilesModel.getModel()
background: Rectangle {
border.color: root.pressed ? Constants.primaryColor : Constants.secondaryColor
border.width: root.visualFocus ? 3 : 2
color: root.pressed ? Constants.secondaryColor : "black"
implicitHeight: 30
radius: 2
}
contentItem: Text {
color: "white"
elide: Text.ElideRight
leftPadding: 10
rightPadding: root.indicator.width + 10
text: root.displayText
verticalAlignment: Text.AlignVCenter
}
delegate: ItemDelegate {
id: delegate
required property int index
highlighted: root.highlightedIndex === index
background: Rectangle {
color: delegate.highlighted ? Constants.darkGray : "black"
implicitWidth: delegate.contentItem.implicitWidth
width: popup.width
}
contentItem: Text {
anchors.fill: parent
color: delegate.highlighted ? "#ff0000" : "white"
elide: Text.ElideRight
leftPadding: 10
text: root.model[delegate.index]
verticalAlignment: Text.AlignVCenter
}
}
indicator: Canvas {
id: canvas
contextType: "2d"
height: 8
width: 12
x: root.width - canvas.width - root.rightPadding
y: root.topPadding + (root.availableHeight - canvas.height) / 2
onPaint: {
let margin = 2;
context.reset();
context.lineWidth = 2;
context.strokeStyle = "white";
context.lineCap = "round";
context.beginPath();
context.moveTo(margin, margin);
context.lineTo(width / 2, height - margin);
context.lineTo(width - margin, margin);
context.stroke();
}
Connections {
function onPressedChanged() {
canvas.requestPaint();
}
target: root
}
}
popup: Popup {
id: popup
implicitHeight: contentItem.implicitHeight
implicitWidth: 200
padding: 2
y: root.height + 2
background: Rectangle {
border.color: Constants.primaryColor
border.width: 2
color: "black"
}
contentItem: ListView {
clip: true
currentIndex: root.highlightedIndex
implicitHeight: Math.min(contentHeight, 200)
model: popup.visible ? root.delegateModel : null
}
}
Component.onCompleted: {
currentIndex = root.initialIndex % model.length;
}
AudioFilesModel {
id: audioFilesModel
}
}
|