plasma-framework/src/declarativeimports/plasmacomponents3/ComboBox.qml
Nate Graham 5447cef2d8 Port to singleton Units
The context property version is slower to access and won't be supported
in Qt6. Let's port away from it and use the singleton version instead.

Here was my full process for making this change:

1. Made the change with `find . -name '*.qml' | xargs perl -pi -e 's/units\./PlasmaCore\.Units\./g'`
2. Verified no more occurrences with `grep -r " units."`
3. Made sure this didn't change any comments in a silly way by inspecting the output of `git diff | grep "+   " | grep "//"`
4. Manually inspected the full git diff to make sure there were no other unintentional or silly changes (there were none)
5. verified that all changed files have the PlasmaCore import with the correct name with `for FILE in `git status | grep modified | cut -d ":" -f 3`; do grep -q "as PlasmaCore" $FILE || echo "$FILE needs the PlasmaCore import"; done` (one needed the import)
2021-03-07 13:34:47 +00:00

209 lines
7.2 KiB
QML

/*
SPDX-FileCopyrightText: 2016 Marco Martin <mart@kde.org>
SPDX-License-Identifier: LGPL-2.0-or-later
*/
import QtQuick 2.6
import QtQuick.Window 2.2
import QtQuick.Templates @QQC2_VERSION@ as T
import QtQuick.Controls @QQC2_VERSION@ as Controls
import QtGraphicalEffects 1.0
import org.kde.plasma.core 2.0 as PlasmaCore
import org.kde.kirigami 2.5 as Kirigami
import "private" as Private
import "mobiletextselection" as MobileTextSelection
T.ComboBox {
id: control
implicitWidth: Math.max(PlasmaCore.Units.gridUnit, contentItem.implicitWidth)
+ leftPadding + rightPadding + indicator.implicitWidth + rightPadding
implicitHeight: Math.max(PlasmaCore.Units.gridUnit, contentItem.implicitHeight)
+ topPadding + bottomPadding
baselineOffset: contentItem.y + contentItem.baselineOffset
hoverEnabled: true
topPadding: surfaceNormal.margins.top
leftPadding: surfaceNormal.margins.left
rightPadding: surfaceNormal.margins.right + PlasmaCore.Units.gridUnit * 2
bottomPadding: surfaceNormal.margins.bottom
delegate: ItemDelegate {
width: control.popup.width
text: control.textRole ? (Array.isArray(control.model) ? modelData[control.textRole] : model[control.textRole]) : modelData
highlighted: control.highlightedIndex == index
property bool separatorVisible: false
}
indicator: PlasmaCore.SvgItem {
implicitWidth: PlasmaCore.Units.iconSizes.small
implicitHeight: implicitWidth
anchors {
right: parent.right
rightMargin: surfaceNormal.margins.right
verticalCenter: parent.verticalCenter
}
svg: PlasmaCore.Svg {
imagePath: "widgets/arrows"
colorGroup: PlasmaCore.Theme.ButtonColorGroup
}
elementId: "down-arrow"
}
contentItem: T.TextField {
id: textField
padding: 0
text: control.editable ? control.editText : control.displayText
enabled: control.editable
autoScroll: control.editable
readOnly: control.down || !control.hasOwnProperty("editable") || !control.editable
inputMethodHints: control.inputMethodHints
validator: control.validator
// Work around Qt bug where NativeRendering breaks for non-integer scale factors
// https://bugreports.qt.io/browse/QTBUG-70481
renderType: Screen.devicePixelRatio % 1 !== 0 ? Text.QtRendering : Text.NativeRendering
color: PlasmaCore.ColorScope.textColor
selectionColor: Kirigami.Theme.highlightColor
selectedTextColor: Kirigami.Theme.highlightedTextColor
selectByMouse: !Kirigami.Settings.tabletMode
cursorDelegate: Kirigami.Settings.tabletMode ? mobileCursor : undefined
font: control.font
horizontalAlignment: Text.AlignLeft
verticalAlignment: Text.AlignVCenter
opacity: control.enabled ? 1 : 0.3
onFocusChanged: {
if (focus) {
MobileTextSelection.MobileTextActionsToolBar.controlRoot = textField;
}
}
onTextChanged: MobileTextSelection.MobileTextActionsToolBar.shouldBeVisible = false;
onPressed: MobileTextSelection.MobileTextActionsToolBar.shouldBeVisible = true;
onPressAndHold: {
if (!Kirigami.Settings.tabletMode) {
return;
}
forceActiveFocus();
cursorPosition = positionAt(event.x, event.y);
selectWord();
}
}
Component {
id: mobileCursor
MobileTextSelection.MobileCursor {
target: textField
}
}
MobileTextSelection.MobileCursor {
target: textField
selectionStartHandle: true
property var rect: textField.positionToRectangle(textField.selectionStart)
//FIXME: this magic values seem to be always valid, for every font,every dpi, every scaling
x: rect.x + 5
y: rect.y + 6
}
background: PlasmaCore.FrameSvgItem {
id: surfaceNormal
anchors.fill: parent
readonly property bool editable: control.hasOwnProperty("editable") && control.editable
imagePath: editable ? "widgets/lineedit" : "widgets/button"
prefix: editable
? "base"
: (control.pressed ? "pressed" : "normal")
Private.ButtonShadow {
anchors.fill: parent
showShadow: !parent.editable && !control.pressed
}
Private.TextFieldFocus {
visible: parent.editable
z: -1
state: control.activeFocus ? "focus" : (control.hovered ? "hover" : "hidden")
anchors.fill: parent
}
Private.ButtonFocus {
anchors.fill: parent
showFocus: control.activeFocus && !control.pressed
}
Private.ButtonHover {
anchors.fill: parent
showHover: control.hovered && !control.pressed
}
MouseArea {
anchors {
fill: parent
leftMargin: control.leftPadding
rightMargin: control.rightPadding
}
acceptedButtons: Qt.NoButton
onWheel: {
if (wheel.pixelDelta.y < 0 || wheel.angleDelta.y < 0) {
control.currentIndex = Math.min(control.currentIndex + 1, delegateModel.count -1);
} else {
control.currentIndex = Math.max(control.currentIndex - 1, 0);
}
control.activated(control.currentIndex);
}
}
}
popup: T.Popup {
x: control.mirrored ? control.width - width : 0
y: control.height
width: Math.max(control.width, 150)
implicitHeight: contentItem.implicitHeight
topMargin: 6
bottomMargin: 6
contentItem: ListView {
id: listView
clip: true
implicitHeight: contentHeight
model: control.popup.visible ? control.delegateModel : null
currentIndex: control.highlightedIndex
highlightRangeMode: ListView.ApplyRange
highlightMoveDuration: 0
// HACK: When the ComboBox is not inside a top-level Window, it's Popup does not inherit
// the LayoutMirroring options. This is a workaround to fix this by enforcing
// the LayoutMirroring options properly.
// QTBUG: https://bugreports.qt.io/browse/QTBUG-66446
LayoutMirroring.enabled: Qt.application.layoutDirection === Qt.RightToLeft
LayoutMirroring.childrenInherit: true
T.ScrollBar.vertical: Controls.ScrollBar { }
}
background: Rectangle {
anchors {
fill: parent
margins: -1
}
radius: 2
color: theme.viewBackgroundColor
border.color: Qt.rgba(PlasmaCore.ColorScope.textColor.r, PlasmaCore.ColorScope.textColor.g, PlasmaCore.ColorScope.textColor.b, 0.3)
layer.enabled: true
layer.effect: DropShadow {
transparentBorder: true
radius: 4
samples: 8
horizontalOffset: 2
verticalOffset: 2
color: Qt.rgba(0, 0, 0, 0.3)
}
}
}
}