Warning, /plasma/plasma-desktop/desktoppackage/contents/configuration/panelconfiguration/Ruler.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.0 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.FrameSvgItem { 0020 id: root 0021 0022 anchors.fill: parent 0023 0024 //Those properties get updated by PanelConfiguration.qml whenever a value in the panel changes 0025 property alias offset: offsetHandle.value 0026 property alias minimumLength: rightMinimumLengthHandle.value 0027 property alias maximumLength: rightMaximumLengthHandle.value 0028 property bool isHorizontal: root.prefix[0] === 'north' || root.prefix[0] === 'south' 0029 0030 property string maximumText: (dialogRoot.vertical ? i18nd("plasma_shell_org.kde.plasma.desktop", "Drag to change maximum height.") : i18nd("plasma_shell_org.kde.plasma.desktop", "Drag to change maximum width.")) + "\n" + i18nd("plasma_shell_org.kde.plasma.desktop", "Double click to reset.") 0031 property string minimumText: (dialogRoot.vertical ? i18nd("plasma_shell_org.kde.plasma.desktop", "Drag to change minimum height.") : i18nd("plasma_shell_org.kde.plasma.desktop", "Drag to change minimum width.")) + "\n" + i18nd("plasma_shell_org.kde.plasma.desktop", "Double click to reset.") 0032 0033 imagePath: "widgets/containment-controls" 0034 implicitWidth: Math.max(offsetHandle.width, rightMinimumLengthHandle.width + rightMaximumLengthHandle.width) 0035 implicitHeight: Math.max(offsetHandle.height, rightMinimumLengthHandle.height + rightMaximumLengthHandle.height) 0036 0037 onMinimumLengthChanged: rightMinimumLengthHandle.value = leftMinimumLengthHandle.value = minimumLength 0038 onMaximumLengthChanged: rightMaximumLengthHandle.value = leftMaximumLengthHandle.value = maximumLength 0039 0040 /* As offset and length have a different meaning in all alignments, the panel shifts on alignment change. 0041 * This could result in wrong panel positions (e.g. panel shifted over monitor border). 0042 * The fancy version would be a recalculation of all values, so that the panel stays at it's current position, 0043 * but this would be error prone and complicated. As the panel alignment is rarely changed, it's not worth it. 0044 * The more easy approach is just setting the panel offset to zero. This makes sure the panel has a valid position and size. 0045 */ 0046 Connections { 0047 target: panel 0048 function onAlignmentChanged() { 0049 offset = 0 0050 } 0051 } 0052 0053 Component.onCompleted: { 0054 offsetHandle.value = panel.offset 0055 rightMinimumLengthHandle.value = panel.minimumLength 0056 rightMaximumLengthHandle.value = panel.maximumLength 0057 leftMinimumLengthHandle.value = panel.minimumLength 0058 leftMaximumLengthHandle.value = panel.maximumLength 0059 } 0060 0061 KSvg.SvgItem { 0062 id: centerMark 0063 imagePath: "widgets/containment-controls" 0064 elementId: dialogRoot.vertical ? "vertical-centerindicator" : "horizontal-centerindicator" 0065 visible: panel.alignment === Qt.AlignCenter 0066 width: dialogRoot.vertical ? parent.width : naturalSize.width 0067 height: dialogRoot.vertical ? naturalSize.height : parent.height 0068 anchors.centerIn: parent 0069 } 0070 0071 SliderHandle { 0072 id: offsetHandle 0073 anchors { 0074 right: !root.isHorizontal ? root.right : undefined 0075 bottom: root.isHorizontal ? root.bottom : undefined 0076 } 0077 graphicElementName: "offsetslider" 0078 description: i18nd("plasma_shell_org.kde.plasma.desktop", "Drag to change position on this screen edge.\nDouble click to reset.") 0079 offset: panel.alignment === Qt.AlignCenter ? 0 : (dialogRoot.vertical ? panel.height : panel.width) / 2 0080 property int position: (dialogRoot.vertical) ? y + height / 2 : x + width / 2 0081 onPositionChanged: { 0082 if (!offsetHandle.hasEverBeenMoved) return; 0083 let panelLength = dialogRoot.vertical ? panel.height : panel.width 0084 let rootLength = dialogRoot.vertical ? root.height : root.width 0085 // Snap at the center 0086 if (Math.abs(position - rootLength / 2) < 5) { 0087 if (panel.alignment !== Qt.AlignCenter) { 0088 panel.alignment = Qt.AlignCenter 0089 // Coordinate change: since we switch from measuring the min/max 0090 // length from the side of the panel to the center of the panel, 0091 // we need to double the distance between the min/max indicators 0092 // and the panel side. 0093 panel.minimumLength += panel.minimumLength - panelLength 0094 panel.maximumLength += panel.maximumLength - panelLength 0095 } 0096 panel.offset = 0 0097 } else if (position > rootLength / 2) { 0098 if (panel.alignment === Qt.AlignCenter) { 0099 // This is the opposite of the previous comment, as we are 0100 // cutting in half the distance between the min/max indicators 0101 // and the side of the panel. 0102 panel.minimumLength -= (panel.minimumLength - panelLength) / 2 0103 panel.maximumLength -= (panel.maximumLength - panelLength) / 2 0104 } 0105 panel.alignment = Qt.AlignRight 0106 panel.offset = Math.round(rootLength - position - offset) 0107 } else if (position <= rootLength / 2) { 0108 if (panel.alignment === Qt.AlignCenter) { 0109 panel.minimumLength -= (panel.minimumLength - panelLength) / 2 0110 panel.maximumLength -= (panel.maximumLength - panelLength) / 2 0111 } 0112 panel.alignment = Qt.AlignLeft 0113 panel.offset = Math.round(position - offset) 0114 } 0115 } 0116 /* The maximum/minimumPosition values are needed to prevent the user from moving a panel with 0117 * center alignment to the left and then drag the position handle to the left. 0118 * This would make the panel to go off the monitor: 0119 * |<- V -> | 0120 * | -> | <- | 0121 * ^move this slider to the left 0122 */ 0123 minimumPosition: { 0124 var size = dialogRoot.vertical ? height : width 0125 switch(panel.alignment){ 0126 case Qt.AlignLeft: 0127 return -size / 2 + offset 0128 case Qt.AlignRight: 0129 return leftMaximumLengthHandle.value - size / 2 - offset 0130 default: 0131 return panel.maximumLength / 2 - size / 2 0132 } 0133 } 0134 //Needed for the same reason as above 0135 maximumPosition: { 0136 var size = dialogRoot.vertical ? height : width 0137 var rootSize = dialogRoot.vertical ? root.height : root.width 0138 switch(panel.alignment){ 0139 case Qt.AlignLeft: 0140 return rootSize - rightMaximumLengthHandle.value - size / 2 + offset 0141 case Qt.AlignRight: 0142 return rootSize - size / 2 - offset 0143 default: 0144 return rootSize - panel.maximumLength / 2 - size / 2 0145 } 0146 } 0147 function defaultPosition(): int /*override*/ { 0148 return 0; 0149 } 0150 } 0151 0152 /* The maximumPosition value for the right handles and the minimumPosition value for the left handles are 0153 * needed to prevent the user from moving a panel with center alignment to the left (right) and then pull one of the 0154 * right (left) sliders to the right (left). 0155 * Because the left and right sliders are coupled, this would make the left (right) sliders to go off the monitor. 0156 * 0157 * |<- V -> | 0158 * | -> | <- | 0159 * ^move this slider to the right 0160 * 0161 * The other max/min Position values just set a minimum panel size 0162 */ 0163 0164 SliderHandle { 0165 id: rightMinimumLengthHandle 0166 anchors { 0167 left: !root.isHorizontal ? root.left : undefined 0168 top: root.isHorizontal ? root.top : undefined 0169 } 0170 description: root.minimumText 0171 alignment: panel.alignment | Qt.AlignLeft 0172 visible: panel.alignment !== Qt.AlignRight 0173 offset: panel.offset 0174 graphicElementName: "minslider" 0175 onValueChanged: panel.minimumLength = value 0176 minimumPosition: offsetHandle.position + Kirigami.Units.gridUnit * 3 0177 maximumPosition: { 0178 var rootSize = dialogRoot.vertical ? root.height : root.width 0179 var size = dialogRoot.vertical ? height : width 0180 panel.alignment === Qt.AlignCenter ? Math.min(rootSize - size/2, rootSize + offset * 2 - size/2) : rootSize - size/2 0181 } 0182 } 0183 0184 SliderHandle { 0185 id: rightMaximumLengthHandle 0186 anchors { 0187 right: !root.isHorizontal ? root.right : undefined 0188 bottom: root.isHorizontal ? root.bottom : undefined 0189 } 0190 description: root.maximumText 0191 alignment: panel.alignment | Qt.AlignLeft 0192 visible: panel.alignment !== Qt.AlignRight 0193 offset: panel.offset 0194 graphicElementName: "maxslider" 0195 onValueChanged: panel.maximumLength = value 0196 minimumPosition: offsetHandle.position + Kirigami.Units.gridUnit * 3 0197 maximumPosition: { 0198 var rootSize = dialogRoot.vertical ? root.height : root.width 0199 var size = dialogRoot.vertical ? height : width 0200 panel.alignment === Qt.AlignCenter ? Math.min(rootSize - size/2, rootSize + offset * 2 - size/2) : rootSize - size/2 0201 } 0202 } 0203 0204 SliderHandle { 0205 id: leftMinimumLengthHandle 0206 anchors { 0207 left: !root.isHorizontal ? root.left : undefined 0208 top: root.isHorizontal ? root.top : undefined 0209 } 0210 description: root.minimumText 0211 alignment: panel.alignment | Qt.AlignRight 0212 visible: panel.alignment !== Qt.AlignLeft 0213 offset: panel.offset 0214 graphicElementName: "maxslider" 0215 onValueChanged: panel.minimumLength = value 0216 maximumPosition: offsetHandle.position - Kirigami.Units.gridUnit * 3 0217 minimumPosition: { 0218 var size = dialogRoot.vertical ? height : width 0219 panel.alignment === Qt.AlignCenter ? Math.max(-size/2, offset*2 - size/2) : -size/2 0220 } 0221 } 0222 0223 SliderHandle { 0224 id: leftMaximumLengthHandle 0225 anchors { 0226 right: !root.isHorizontal ? root.right : undefined 0227 bottom: root.isHorizontal ? root.bottom : undefined 0228 } 0229 description: root.maximumText 0230 alignment: panel.alignment | Qt.AlignRight 0231 visible: panel.alignment !== Qt.AlignLeft 0232 offset: panel.offset 0233 graphicElementName: "minslider" 0234 onValueChanged: panel.maximumLength = value 0235 maximumPosition: offsetHandle.position - Kirigami.Units.gridUnit * 3 0236 minimumPosition: { 0237 var size = dialogRoot.vertical ? height : width 0238 panel.alignment === Qt.AlignCenter ? Math.max(-size/2, offset*2 - size/2) : -size/2 0239 } 0240 } 0241 }