Warning, /frameworks/qqc2-desktop-style/org.kde.desktop/SpinBox.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 org.kde.kirigami as Kirigami
0013 import org.kde.qqc2desktopstyle.private as StylePrivate
0014
0015 T.SpinBox {
0016 id: controlRoot
0017 Kirigami.Theme.colorSet: Kirigami.Theme.View
0018 Kirigami.Theme.inherit: false
0019
0020 implicitWidth: Math.max(styleitem.fullRectSizeHint.width,
0021 implicitBackgroundWidth + leftInset + rightInset,
0022 implicitContentWidth + leftPadding + rightPadding)
0023 implicitHeight: Math.max(styleitem.fullRectSizeHint.height,
0024 implicitBackgroundHeight + topInset + bottomInset,
0025 implicitContentHeight + topPadding + bottomPadding)
0026
0027 padding: 6
0028 leftPadding: controlRoot.mirrored ? ___rPadding : ___lPadding
0029 rightPadding: controlRoot.mirrored ? ___lPadding : ___rPadding
0030
0031 readonly property int ___lPadding: styleitem.upRectSizeHint.x === styleitem.downRectSizeHint.x ? horizontalPadding : styleitem.downRectSizeHint.width
0032 readonly property int ___rPadding: styleitem.upRectSizeHint.x === styleitem.downRectSizeHint.x ? styleitem.downRectSizeHint.width : styleitem.upRectSizeHint.width
0033
0034 hoverEnabled: true
0035 wheelEnabled: true
0036 editable: true
0037
0038 validator: IntValidator {
0039 locale: controlRoot.locale.name
0040 bottom: Math.min(controlRoot.from, controlRoot.to)
0041 top: Math.max(controlRoot.from, controlRoot.to)
0042 }
0043
0044 inputMethodHints: Qt.ImhFormattedNumbersOnly
0045
0046 contentItem: T.TextField {
0047 readonly property TextMetrics _textMetrics: TextMetrics {
0048 text: controlRoot.textFromValue(controlRoot.to, controlRoot.locale)
0049 font: controlRoot.font
0050 }
0051 // Sometimes textMetrics.width isn't as wide as the actual text; add 2
0052 implicitWidth: Math.max(_textMetrics.width + 2, Math.round(contentWidth))
0053 + leftPadding + rightPadding
0054 implicitHeight: Math.round(contentHeight) + topPadding + bottomPadding
0055 z: 2
0056 font: controlRoot.font
0057 palette: controlRoot.palette
0058 text: controlRoot.textFromValue(controlRoot.value, controlRoot.locale)
0059 color: Kirigami.Theme.textColor
0060 selectionColor: Kirigami.Theme.highlightColor
0061 selectedTextColor: Kirigami.Theme.highlightedTextColor
0062 selectByMouse: true
0063 hoverEnabled: false // let hover events propagate to SpinBox
0064 verticalAlignment: Qt.AlignVCenter
0065 readOnly: !controlRoot.editable
0066 validator: controlRoot.validator
0067 inputMethodHints: controlRoot.inputMethodHints
0068
0069 // SpinBox does not update its value during editing, see QTBUG-91281
0070 onTextEdited: if (controlRoot.contentItem.text.length > 0 && acceptableInput) {
0071 controlRoot.value = controlRoot.valueFromText(controlRoot.contentItem.text, controlRoot.locale)
0072 controlRoot.valueModified()
0073 }
0074
0075 // Since the contentItem receives focus (we make them editable by default),
0076 // the screen reader reads its Accessible properties instead of the SpinBox's
0077 Accessible.name: controlRoot.Accessible.name
0078 Accessible.description: controlRoot.Accessible.description
0079 }
0080
0081 up.indicator: Item {
0082 implicitWidth: styleitem.upRect.width
0083 implicitHeight: styleitem.upRect.height
0084
0085 x: styleitem.upRect.x
0086 y: styleitem.upRect.y
0087 }
0088 down.indicator: Item {
0089 implicitWidth: styleitem.downRect.width
0090 implicitHeight: styleitem.downRect.height
0091
0092 x: styleitem.downRect.x
0093 y: styleitem.downRect.y
0094 }
0095
0096 background: StylePrivate.StyleItem {
0097 id: styleitem
0098 control: controlRoot
0099 elementType: "spinbox"
0100 anchors.fill: parent
0101 hover: controlRoot.hovered
0102 hasFocus: controlRoot.activeFocus
0103 enabled: controlRoot.enabled
0104
0105 // static hints calculated once for minimum sizes
0106 property rect upRectSizeHint: styleitem.subControlRect("up")
0107 property rect downRectSizeHint: styleitem.subControlRect("down")
0108 property rect editRectSizeHint: styleitem.subControlRect("edit")
0109 property rect fullRectSizeHint: styleitem.computeBoundingRect([upRectSizeHint, downRectSizeHint, editRectSizeHint])
0110
0111 // dynamic hints calculated every resize to keep the buttons in place
0112 property rect upRect: upRectSizeHint
0113 property rect downRect: downRectSizeHint
0114
0115 function recompute() {
0116 upRect = styleitem.subControlRect("up")
0117 downRect = styleitem.subControlRect("down")
0118 }
0119
0120 onWidthChanged: recompute()
0121 onHeightChanged: recompute()
0122
0123 value: {
0124 var value = 0;
0125 if (controlRoot.up.hovered || controlRoot.up.pressed) {
0126 value |= 1 << 0;
0127 }
0128 if (controlRoot.down.hovered || controlRoot.down.pressed) {
0129 value |= 1 << 1;
0130 }
0131 if (controlRoot.value !== controlRoot.to) {
0132 value |= 1 << 2;
0133 }
0134 if (controlRoot.value !== controlRoot.from) {
0135 value |= 1 << 3;
0136 }
0137 return value;
0138 }
0139 }
0140 }