Warning, /plasma/plasma-desktop/desktoppackage/contents/configuration/panelconfiguration/SliderHandle.qml is written in an unsupported language. File is not indexed.
0001 /*
0002 SPDX-FileCopyrightText: 2013 Marco Martin <mart@kde.org>
0003
0004 SPDX-License-Identifier: GPL-2.0-or-later
0005 */
0006
0007 import QtQuick 2.15
0008 import QtQuick.Layouts 1.0
0009 import QtQuick.Controls 2.4 as QQC2
0010 import org.kde.plasma.plasmoid 2.0
0011 import org.kde.plasma.core as PlasmaCore
0012 import org.kde.plasma.extras 2.0 as PlasmaExtras
0013 import org.kde.kirigami 2.20 as Kirigami
0014 import org.kde.ksvg 1.0 as KSvg
0015 import org.kde.plasma.components 3.0 as PC3
0016 import org.kde.plasma.shell.panel 0.1 as Panel
0017 import org.kde.kquickcontrols 2.0
0018
0019 KSvg.SvgItem {
0020 id: root
0021
0022 //Those properties get updated by PanelConfiguration.qml whenever a value changes
0023 imagePath: "widgets/containment-controls"
0024 elementId: parent.prefix + '-' + graphicElementName
0025 width: naturalSize.width
0026 height: naturalSize.height
0027
0028 //value expressed by this slider, this is the distance to offset
0029 property int value
0030
0031 //name of the graphics to load
0032 property string graphicElementName
0033
0034 //where the point "0" is
0035 property int offset: 0
0036
0037 /*handle type: behave in different ways based on the alignment:
0038 * alignment === Qt.AlignRight: Panel aligned to right and handle value relative to the right
0039 * alignment === Qt.AlignLeft: Panel aligned to left and handle relative to the left
0040 * (alignment !== Qt.AlignRight) && (alignment & Qt.AlignRight): Panel aligned to the center and handle right of offset and value doubled
0041 * (alignment !== Qt.AlignLeft) && (alignment & Qt.AlignLeft): Panel aligned to the center and handle left of offset and value doubled
0042 * else: Panel aligned to center and handle relative to the center
0043 * Note that right/left and top/bottom are interchangeable
0044 */
0045 property int alignment: panel.alignment
0046
0047 //The maximum/minimum Position (X/Y) the silder can be moved to
0048 property int minimumPosition
0049 property int maximumPosition
0050 //Provide default position for "reset" action.
0051 function defaultPosition(): int {
0052 var dialogSize, panelSize;
0053 if (dialogRoot.vertical) {
0054 dialogSize = dialogRoot.height;
0055 panelSize = panel.height;
0056 } else {
0057 dialogSize = dialogRoot.width;
0058 panelSize = panel.width;
0059 }
0060 return (value === panelSize) ? dialogSize : panelSize;
0061 }
0062
0063 // Handle name displayed as a tooltip.
0064 property string description
0065
0066 property bool hasEverBeenMoved: false
0067
0068 function syncPos() {
0069 if (dialogRoot.vertical) {
0070 if (alignment === Qt.AlignRight) {
0071 y = root.parent.height - (value + offset + root.height/2)
0072 } else if (alignment === Qt.AlignLeft) {
0073 y = value + offset - root.height/2
0074 } else {
0075 if (root.alignment & Qt.AlignRight) {
0076 y = root.parent.height/2 - value/2 + offset - root.height/2
0077 } else if (root.alignment & Qt.AlignLeft) {
0078 y = root.parent.height/2 + value/2 + offset - root.height/2
0079 } else {
0080 y = root.parent.height/2 + value + offset -root.height/2
0081 }
0082 }
0083 } else {
0084 if (alignment === Qt.AlignRight) {
0085 x = root.parent.width - (value + offset + root.width/2)
0086 } else if (alignment === Qt.AlignLeft) {
0087 x = value + offset - root.width/2
0088 } else {
0089 if (root.alignment & Qt.AlignRight) {
0090 x = root.parent.width/2 - value/2 + offset - root.width/2
0091 } else if (root.alignment & Qt.AlignLeft) {
0092 x = root.parent.width/2 + value/2 + offset -root.width/2
0093 } else {
0094 x = root.parent.width/2 + value + offset -root.width/2
0095 }
0096 }
0097 }
0098 }
0099 onValueChanged: syncPos()
0100 onOffsetChanged: syncPos()
0101 onAlignmentChanged: syncPos()
0102 Connections {
0103 target: root.parent
0104 function onWidthChanged() {
0105 syncPos()
0106 }
0107 function onHeightChanged() {
0108 syncPos()
0109 }
0110 }
0111
0112 PC3.ToolTip {
0113 text: root.description
0114 visible: root.description !== "" && ((area.containsMouse && !area.containsPress) || area.activeFocus)
0115 }
0116
0117 MouseArea {
0118 id: area
0119 drag {
0120 target: parent
0121 axis: (dialogRoot.vertical) ? Drag.YAxis : Drag.XAxis
0122 minimumX: root.minimumPosition
0123 minimumY: root.minimumPosition
0124 maximumX: root.maximumPosition
0125 maximumY: root.maximumPosition
0126 }
0127 anchors {
0128 fill: parent
0129 leftMargin: (dialogRoot.vertical) ? 0 : -Kirigami.Units.gridUnit
0130 rightMargin: (dialogRoot.vertical) ? 0 : -Kirigami.Units.gridUnit
0131 topMargin: (dialogRoot.vertical) ? -Kirigami.Units.gridUnit : 0
0132 bottomMargin: (dialogRoot.vertical) ? -Kirigami.Units.gridUnit : 0
0133 }
0134
0135 readonly property int keyboardMoveStepSize: Math.ceil((root.maximumPosition - root.minimumPosition) / 20)
0136
0137 activeFocusOnTab: true
0138 hoverEnabled: true
0139 cursorShape: dialogRoot.vertical ? Qt.SizeVerCursor : Qt.SizeHorCursor
0140
0141 Accessible.description: root.description
0142
0143 Keys.onEnterPressed: doubleClicked(null);
0144 Keys.onReturnPressed: doubleClicked(null);
0145 Keys.onSpacePressed: doubleClicked(null);
0146
0147 // BEGIN Arrow keys
0148 Keys.onUpPressed: if (dialogRoot.vertical) {
0149 root.y = Math.max(root.minimumPosition, root.y - ((event.modifiers & Qt.ShiftModifier) ? 1 : keyboardMoveStepSize));
0150 changePosition();
0151 } else {
0152 event.accepted = false;
0153 }
0154 Keys.onDownPressed: if (dialogRoot.vertical) {
0155 root.y = Math.min(root.maximumPosition, root.y + ((event.modifiers & Qt.ShiftModifier) ? 1 : keyboardMoveStepSize));
0156 changePosition();
0157 } else {
0158 event.accepted = false;
0159 }
0160 Keys.onLeftPressed: if (!dialogRoot.vertical) {
0161 root.x = Math.max(root.minimumPosition, root.x - ((event.modifiers & Qt.ShiftModifier) ? 1 : keyboardMoveStepSize));
0162 changePosition();
0163 } else {
0164 event.accepted = false;
0165 }
0166 Keys.onRightPressed: if (!dialogRoot.vertical) {
0167 root.x = Math.min(root.maximumPosition, root.x + ((event.modifiers & Qt.ShiftModifier) ? 1 : keyboardMoveStepSize));
0168 changePosition();
0169 } else {
0170 event.accepted = false;
0171 }
0172 // END Arrow keys
0173
0174 onPositionChanged: {
0175 if (!drag.active) {
0176 return;
0177 }
0178 changePosition();
0179 }
0180 onDoubleClicked: {
0181 root.value = root.defaultPosition();
0182 }
0183
0184 function changePosition() {
0185 root.hasEverBeenMoved = true
0186 if (dialogRoot.vertical) {
0187 if (root.alignment === Qt.AlignRight) {
0188 root.value = root.parent.height - (root.y + offset + root.height/2)
0189 } else if (alignment === Qt.AlignLeft) {
0190 root.value = root.y - offset + root.height/2
0191 //Center
0192 } else {
0193 if (root.alignment & Qt.AlignRight) {
0194 root.value = (root.parent.height/2 - root.y + offset)*2 - root.height
0195 } else if (root.alignment & Qt.AlignLeft) {
0196 root.value = (root.y - offset - root.parent.height/2)*2 + root.height
0197 } else {
0198 var value = root.y - root.parent.height/2 - offset + root.height/2
0199 //Snap
0200 if (Math.abs(value) < 5) {
0201 root.value = 0
0202 } else {
0203 root.value = value
0204 }
0205 }
0206 }
0207 } else {
0208 if (root.alignment === Qt.AlignRight) {
0209 root.value = root.parent.width - (root.x + offset + root.width/2)
0210 } else if (alignment === Qt.AlignLeft) {
0211 root.value = root.x - offset + root.width/2
0212 //Center
0213 } else {
0214 if (root.alignment & Qt.AlignRight) {
0215 root.value = (root.parent.width/2 - root.x + offset)*2 - root.width
0216 } else if (root.alignment & Qt.AlignLeft) {
0217 root.value = (root.x - offset - root.parent.width/2)*2 + root.width
0218 } else {
0219 var value = root.x - root.parent.width/2 - offset + root.width/2
0220 //Snap
0221 if (Math.abs(value) < 5) {
0222 root.value = 0
0223 } else {
0224 root.value = value
0225 }
0226 }
0227 }
0228 }
0229 }
0230
0231 PlasmaExtras.Highlight {
0232 anchors.fill: parent
0233 visible: parent.activeFocus
0234 hovered: true
0235 }
0236 }
0237 }