5447cef2d8
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)
209 lines
7.2 KiB
QML
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)
|
|
}
|
|
}
|
|
}
|
|
}
|