summaryrefslogtreecommitdiff
path: root/ComboBox.qml
blob: 06992410d3367f35eb5fa4232c575d4b790f8cf7 (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
import QtQuick 2.15
import QtQuick.Window 2.15
import QtQuick.Controls 2.15
import QtQuick.Controls.impl 2.15
import QtQuick.Templates 2.15 as T
import Bootstrap 5.3

T.ComboBox {
	id: control
	font: Bootstrap.bodyFont

	implicitWidth: Math.max(implicitBackgroundWidth
		+ leftInset + rightInset,
	implicitContentWidth + leftPadding + rightPadding)
	implicitHeight: Math.max(implicitBackgroundHeight
		+ topInset + bottomInset,
	implicitContentHeight + topPadding + bottomPadding,
	implicitIndicatorHeight + topPadding + bottomPadding)

	leftPadding: padding
		+ (!control.mirrored || !indicator || !indicator.visible
		? 0 : indicator.width + spacing)
	rightPadding: padding
		+ (control.mirrored || !indicator || !indicator.visible
		? 0 : indicator.width + spacing)

	delegate: ItemDelegate {
		width: ListView.view.width
		palette.text: control.palette.text
		palette.highlightedText: control.palette.highlightedText
		font.weight: control.currentIndex === index
			? Font.DemiBold : Font.Normal
		highlighted: control.highlightedIndex === index
		hoverEnabled: control.hoverEnabled
		contentItem: Text {
			text: control.textRole ? (Array.isArray(control.model)
				? modelData[control.textRole]
				: model[control.textRole]) : modelData
			font: control.font
			color: Bootstrap.bodyColor
			verticalAlignment: Text.AlignVCenter
		}
		background: Rectangle {
			color: Bootstrap.bodyBg
		}
	}

	indicator: ColorImage {
		x: control.mirrored ? control.padding
			: control.width - width - control.padding
		y: control.topPadding + (control.availableHeight - height) / 2
		color: control.palette.dark
		defaultColor: "#353637"
		source: "qrc:/qt-project.org/imports/QtQuick/Controls.2/images/double-arrow.png"
		opacity: enabled ? 1 : 0.3
	}

	contentItem: T.TextField {
		leftPadding: !control.mirrored
			? 12 : control.editable && activeFocus ? 3 : 1
		rightPadding: control.mirrored
			? 12 : control.editable && activeFocus ? 3 : 1
		topPadding: 6 - control.padding
		bottomPadding: 6 - control.padding

		text: control.editable ? control.editText : control.displayText

		enabled: control.editable
		autoScroll: control.editable
		readOnly: control.down
		inputMethodHints: control.inputMethodHints
		validator: control.validator
		selectByMouse: control.selectTextByMouse

		font: control.font
		color: Bootstrap.bodyColor
		selectionColor: control.palette.highlight
		selectedTextColor: control.palette.highlightedText
		verticalAlignment: Text.AlignVCenter

		background: Rectangle {
			visible: control.enabled && control.editable
				&& !control.flat
			border.width: parent && parent.activeFocus ? 2 : 1
			border.color: parent && parent.activeFocus
				? control.palette.highlight
				: control.palette.button
			color: Bootstrap.bodyBg
		}
	}

	background: Rectangle {
		implicitWidth: 140
		implicitHeight: 40

		color: Bootstrap.bodyBg
		border.color: control.palette.highlight
		border.width: !control.editable && control.visualFocus ? 2 : 0
		visible: !control.flat || control.down
		radius: 8
	}

	popup: T.Popup {
		y: control.height
		width: control.width
		height: Math.min(contentItem.implicitHeight,
			control.Window.height - topMargin - bottomMargin)
		topMargin: 6
		bottomMargin: 6

		contentItem: ListView {
			clip: true
			implicitHeight: contentHeight
			model: control.delegateModel
			currentIndex: control.highlightedIndex
			highlightMoveDuration: 0

			Rectangle {
				z: 10
				width: parent.width
				height: parent.height
				color: "transparent"
				border.color: control.palette.mid
			}

			T.ScrollIndicator.vertical: ScrollIndicator { }
		}

		background: Rectangle {
			color: Bootstrap.bodyBg
		}
	}
}