Warning, /frameworks/qqc2-desktop-style/org.kde.desktop/ComboBox.qml is written in an unsupported language. File is not indexed.
0001 /* 0002 SPDX-FileCopyrightText: 2017 Marco Martin <mart@kde.org> 0003 SPDX-FileCopyrightText: 2017 The Qt Company Ltd. 0004 0005 SPDX-License-Identifier: LGPL-3.0-only OR GPL-2.0-or-later 0006 */ 0007 0008 0009 import QtQuick 0010 import QtQuick.Window 0011 import QtQuick.Templates as T 0012 import QtQuick.Controls as Controls 0013 import org.kde.kirigami as Kirigami 0014 import org.kde.desktop.private as Private 0015 import org.kde.qqc2desktopstyle.private as StylePrivate 0016 0017 T.ComboBox { 0018 id: controlRoot 0019 0020 Kirigami.Theme.colorSet: editable ? Kirigami.Theme.View : Kirigami.Theme.Button 0021 Kirigami.Theme.inherit: false 0022 0023 implicitWidth: Math.max(implicitBackgroundWidth + leftInset + rightInset, 0024 implicitContentWidth + leftPadding + rightPadding) 0025 implicitHeight: Math.max(implicitBackgroundHeight + topInset + bottomInset, 0026 implicitContentHeight + topPadding + bottomPadding, 0027 implicitIndicatorHeight + topPadding + bottomPadding) 0028 0029 baselineOffset: contentItem.y + contentItem.baselineOffset 0030 0031 hoverEnabled: true 0032 wheelEnabled: true 0033 0034 padding: 5 0035 leftPadding: editable && mirrored ? 24 : padding 0036 rightPadding: editable && !mirrored ? 24 : padding 0037 0038 delegate: ItemDelegate { 0039 required property var model 0040 required property int index 0041 width: ListView.view.width 0042 text: model[controlRoot.textRole] 0043 highlighted: controlRoot.highlightedIndex == index 0044 property bool separatorVisible: false 0045 Kirigami.Theme.colorSet: controlRoot.Kirigami.Theme.inherit ? controlRoot.Kirigami.Theme.colorSet : Kirigami.Theme.View 0046 Kirigami.Theme.inherit: controlRoot.Kirigami.Theme.inherit 0047 } 0048 0049 indicator: Item {} 0050 0051 /* ensure that the combobox and its popup have enough width for all of its items 0052 * TODO remove for KF6 because it is fixed by Qt6 */ 0053 onCountChanged: { 0054 let maxWidth = 75 0055 for (let i = 0; i < count; ++i) { 0056 maxWidth = Math.max(maxWidth, fontMetrics.boundingRect(controlRoot.textAt(i)).width) 0057 } 0058 styleitem.contentWidth = maxWidth 0059 } 0060 0061 FontMetrics { 0062 id: fontMetrics 0063 } 0064 0065 contentItem: T.TextField { 0066 padding: 0 0067 text: controlRoot.editable ? controlRoot.editText : controlRoot.displayText 0068 0069 enabled: controlRoot.editable 0070 autoScroll: controlRoot.editable 0071 readOnly: controlRoot.down 0072 0073 visible: controlRoot.editable 0074 inputMethodHints: controlRoot.inputMethodHints 0075 validator: controlRoot.validator 0076 0077 // Work around Qt bug where NativeRendering breaks for non-integer scale factors 0078 // https://bugreports.qt.io/browse/QTBUG-67007 0079 renderType: Screen.devicePixelRatio % 1 !== 0 ? Text.QtRendering : Text.NativeRendering 0080 color: controlRoot.enabled ? Kirigami.Theme.textColor : Kirigami.Theme.disabledTextColor 0081 selectionColor: Kirigami.Theme.highlightColor 0082 selectedTextColor: Kirigami.Theme.highlightedTextColor 0083 0084 selectByMouse: !Kirigami.Settings.tabletMode 0085 cursorDelegate: Kirigami.Settings.tabletMode ? mobileCursor : null 0086 0087 font: controlRoot.font 0088 horizontalAlignment: Text.AlignLeft 0089 verticalAlignment: Text.AlignVCenter 0090 opacity: controlRoot.enabled ? 1 : 0.3 0091 0092 onFocusChanged: { 0093 if (focus) { 0094 Private.MobileTextActionsToolBar.controlRoot = this; 0095 } 0096 } 0097 0098 onTextChanged: Private.MobileTextActionsToolBar.shouldBeVisible = false; 0099 onPressed: Private.MobileTextActionsToolBar.shouldBeVisible = true; 0100 0101 onPressAndHold: { 0102 if (!Kirigami.Settings.tabletMode) { 0103 return; 0104 } 0105 forceActiveFocus(); 0106 cursorPosition = positionAt(event.x, event.y); 0107 selectWord(); 0108 } 0109 } 0110 0111 Component { 0112 id: mobileCursor 0113 Private.MobileCursor { 0114 target: controlRoot.contentItem 0115 } 0116 } 0117 0118 Private.MobileCursor { 0119 target: controlRoot.contentItem 0120 selectionStartHandle: true 0121 readonly property rect rect: target.positionToRectangle(target.selectionStart) 0122 x: rect.x + 5 0123 y: rect.y + 6 0124 } 0125 0126 background: StylePrivate.StyleItem { 0127 id: styleitem 0128 control: controlRoot 0129 elementType: "combobox" 0130 flat: controlRoot.flat 0131 anchors.fill: parent 0132 hover: controlRoot.hovered 0133 on: controlRoot.down 0134 hasFocus: controlRoot.activeFocus 0135 enabled: controlRoot.enabled 0136 // contentHeight as in QComboBox magic numbers taken from QQC1 style 0137 contentHeight: Math.max(Math.ceil(textHeight("")), 14) + 2 0138 text: controlRoot.displayText 0139 properties: { 0140 "editable": control.editable 0141 } 0142 } 0143 0144 popup: T.Popup { 0145 Kirigami.OverlayZStacking.layer: Kirigami.OverlayZStacking.Menu 0146 z: Kirigami.OverlayZStacking.z 0147 0148 y: controlRoot.height 0149 width: controlRoot.width 0150 implicitHeight: contentItem.implicitHeight 0151 topMargin: 6 0152 bottomMargin: 6 0153 Kirigami.Theme.colorSet: Kirigami.Theme.View 0154 Kirigami.Theme.inherit: controlRoot.Kirigami.Theme.inherit 0155 modal: true 0156 dim: true 0157 closePolicy: Controls.Popup.CloseOnEscape | Controls.Popup.CloseOnPressOutside 0158 0159 // Forces it to have a transparent dimmer. 0160 // A dimmer is needed for "click outside" to work reliably in some views 0161 // but default dimmer would, well, dim the contents in pure QtQuick windows, 0162 // like ApplicationWindow, which we don't want. 0163 Controls.Overlay.modal: Item { } 0164 0165 contentItem: ScrollView { 0166 LayoutMirroring.enabled: controlRoot.mirrored 0167 LayoutMirroring.childrenInherit: true 0168 0169 background: Rectangle { 0170 color: Kirigami.Theme.backgroundColor 0171 } 0172 ScrollBar.horizontal.policy: ScrollBar.AlwaysOff 0173 ListView { 0174 id: listView 0175 0176 // this causes us to load at least one delegate 0177 // this is essential in guessing the contentHeight 0178 // which is needed to initially resize the popup 0179 cacheBuffer: 1 0180 0181 implicitHeight: contentHeight 0182 model: controlRoot.delegateModel 0183 delegate: controlRoot.delegate 0184 currentIndex: controlRoot.highlightedIndex 0185 highlightRangeMode: ListView.ApplyRange 0186 highlightMoveDuration: 0 0187 boundsBehavior: Flickable.StopAtBounds 0188 } 0189 } 0190 background: Kirigami.ShadowedRectangle { 0191 anchors { 0192 fill: parent 0193 margins: -1 0194 } 0195 radius: 2 0196 color: Kirigami.Theme.backgroundColor 0197 0198 border.color: Kirigami.ColorUtils.linearInterpolation(Kirigami.Theme.backgroundColor, Kirigami.Theme.textColor, Kirigami.Theme.frameContrast) 0199 border.width: 1 0200 0201 shadow.xOffset: 0 0202 shadow.yOffset: 2 0203 shadow.color: Qt.rgba(0, 0, 0, 0.3) 0204 shadow.size: 8 0205 } 0206 } 0207 }