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