3
0
mirror of https://github.com/Qortal/Brooklyn.git synced 2025-02-12 10:15:54 +00:00
Scare Crowe d2ebfd0519 QortalOS Titan 5.60.12
Screw the description like that inbred T3Q
2022-03-05 21:17:59 +05:00

420 lines
14 KiB
QML

/*
SPDX-FileCopyrightText: 2013 Marco Martin <mart@kde.org>
SPDX-License-Identifier: GPL-2.0-or-later
*/
import QtQuick 2.0
import org.kde.plasma.core 2.0 as PlasmaCore
import org.kde.plasma.configuration 2.0
PlasmaCore.FrameSvgItem {
id: root
//Those properties get updated by PanelConfiguration.qml whenever a value in the panel changes
property alias offset: offsetHandle.value
property alias minimumLength: minimumLengthHandle.value
property alias maximumLength: maximumLengthHandle.value
imagePath: "widgets/containment-controls"
state: "BottomEdge"
implicitWidth: offsetHandle.width + minimumLengthHandle.width
implicitHeight: offsetHandle.height + minimumLengthHandle.height
onMinimumLengthChanged: leftMinimumLengthHandle.value = minimumLength
onMaximumLengthChanged: leftMaximumLengthHandle.value = maximumLength
/* As offset and length have a different meaning in all alignments, the panel shifts on alignment change.
* This could result in wrong panel positions (e.g. panel shifted over monitor border).
* The fancy version would be a recalculation of all values, so that the panel stays at it's current position,
* but this would be error prone and complicated. As the panel alignment is rarely changed, it's not worth it.
* The more easy approach is just setting the panel offset to zero. This makes sure the panel has a valid position and size.
*/
Connections {
target: panel
function onAlignmentChanged() {
offset = 0
}
}
Component.onCompleted: {
offsetHandle.value = panel.offset
minimumLengthHandle.value = panel.minimumLength
maximumLengthHandle.value = panel.maximumLength
leftMinimumLengthHandle.value = panel.minimumLength
leftMaximumLengthHandle.value = panel.maximumLength
}
PlasmaCore.Svg {
id: containmentControlsSvg
imagePath: "widgets/containment-controls"
}
PlasmaCore.SvgItem {
id: centerMark
svg: containmentControlsSvg
elementId: dialogRoot.vertical ? "vertical-centerindicator" : "horizontal-centerindicator"
visible: panel.alignment === Qt.AlignCenter
width: dialogRoot.vertical ? parent.width : naturalSize.width
height: dialogRoot.vertical ? naturalSize.height : parent.height
anchors.centerIn: parent
}
SliderHandle {
id: offsetHandle
graphicElementName: "offsetslider"
onValueChanged: panel.offset = value
property int position: (dialogRoot.vertical) ? y : x
/* The maximum/minimumPosition values are needed to prevent the user from moving a panel with
* center alignment to the left and then drag the position handle to the left.
* This would make the panel to go off the monitor:
* |<- V -> |
* | -> | <- |
* ^move this slider to the left
*/
minimumPosition: {
var size = dialogRoot.vertical ? height : width
switch(panel.alignment){
case Qt.AlignLeft:
return -size / 2
case Qt.AlignRight:
return leftMaximumLengthHandle.value - size / 2
default:
return panel.maximumLength / 2 - size / 2
}
}
//Needed for the same reason as above
maximumPosition: {
var size = dialogRoot.vertical ? height : width
var dialogRootSize = dialogRoot.vertical ? dialogRoot.height : dialogRoot.width
switch(panel.alignment){
case Qt.AlignLeft:
return dialogRootSize - maximumLengthHandle.value - size / 2
case Qt.AlignRight:
return dialogRootSize - size / 2
default:
return dialogRootSize - panel.maximumLength / 2 - size / 2
}
}
}
/* The maximumPosition value for the right handles and the minimumPosition value for the left handles are
* needed to prevent the user from moving a panel with center alignment to the left (right) and then pull one of the
* right (left) sliders to the right (left).
* Because the left and right sliders are coupled, this would make the left (right) sliders to go off the monitor.
*
* |<- V -> |
* | -> | <- |
* ^move this slider to the right
*
* The other max/min Position values just set a minimum panel size
*/
SliderHandle {
id: minimumLengthHandle
alignment: panel.alignment | Qt.AlignLeft
visible: panel.alignment !== Qt.AlignRight
offset: panel.offset
graphicElementName: "minslider"
onValueChanged: panel.minimumLength = value
minimumPosition: offsetHandle.position + PlasmaCore.Units.gridUnit * 3
maximumPosition: {
var dialogRootSize = dialogRoot.vertical ? dialogRoot.height : dialogRoot.width
var size = dialogRoot.vertical ? height : width
panel.alignment === Qt.AlignCenter ? Math.min(dialogRootSize - size/2, dialogRootSize + offset * 2 - size/2) : dialogRootSize - size/2
}
}
SliderHandle {
id: maximumLengthHandle
alignment: panel.alignment | Qt.AlignLeft
visible: panel.alignment !== Qt.AlignRight
offset: panel.offset
graphicElementName: "maxslider"
onValueChanged: panel.maximumLength = value
minimumPosition: offsetHandle.position + PlasmaCore.Units.gridUnit * 3
maximumPosition: {
var dialogRootSize = dialogRoot.vertical ? dialogRoot.height : dialogRoot.width
var size = dialogRoot.vertical ? height : width
panel.alignment === Qt.AlignCenter ? Math.min(dialogRootSize - size/2, dialogRootSize + offset * 2 - size/2) : dialogRootSize - size/2
}
}
SliderHandle {
id: leftMinimumLengthHandle
alignment: panel.alignment | Qt.AlignRight
visible: panel.alignment !== Qt.AlignLeft
offset: panel.offset
graphicElementName: "minslider"
onValueChanged: panel.minimumLength = value
maximumPosition: offsetHandle.position - PlasmaCore.Units.gridUnit * 3
minimumPosition: {
var size = dialogRoot.vertical ? height : width
panel.alignment === Qt.AlignCenter ? Math.max(-size/2, offset*2 - size/2) : -size/2
}
}
SliderHandle {
id: leftMaximumLengthHandle
alignment: panel.alignment | Qt.AlignRight
visible: panel.alignment !== Qt.AlignLeft
offset: panel.offset
graphicElementName: "maxslider"
onValueChanged: panel.maximumLength = value
maximumPosition: offsetHandle.position - PlasmaCore.Units.gridUnit * 3
minimumPosition: {
var size = dialogRoot.vertical ? height : width
panel.alignment === Qt.AlignCenter ? Math.max(-size/2, offset*2 - size/2) : -size/2
}
}
states: [
State {
name: "TopEdge"
PropertyChanges {
target: root
prefix: "north"
height: root.implicitHeight
}
AnchorChanges {
target: root
anchors {
top: root.parent.top
bottom: undefined
left: root.parent.left
right: root.parent.right
}
}
AnchorChanges {
target: offsetHandle
anchors {
top: undefined
bottom: root.bottom
left: undefined
right: undefined
}
}
AnchorChanges {
target: minimumLengthHandle
anchors {
top: root.top
bottom: undefined
left: undefined
right: undefined
}
}
AnchorChanges {
target: maximumLengthHandle
anchors {
top: undefined
bottom: root.bottom
left: undefined
right: undefined
}
}
AnchorChanges {
target: leftMinimumLengthHandle
anchors {
top: root.top
bottom: undefined
left: undefined
right: undefined
}
}
AnchorChanges {
target: leftMaximumLengthHandle
anchors {
top: undefined
bottom: root.bottom
left: undefined
right: undefined
}
}
},
State {
name: "BottomEdge"
PropertyChanges {
target: root
prefix: "south"
height: root.implicitHeight
}
AnchorChanges {
target: root
anchors {
top: undefined
bottom: root.parent.bottom
left: root.parent.left
right: root.parent.right
}
}
AnchorChanges {
target: offsetHandle
anchors {
top: root.top
bottom: undefined
left: undefined
right: undefined
}
}
AnchorChanges {
target: minimumLengthHandle
anchors {
top: undefined
bottom: root.bottom
left: undefined
right: undefined
}
}
AnchorChanges {
target: maximumLengthHandle
anchors {
top: root.top
bottom: undefined
left: undefined
right: undefined
}
}
AnchorChanges {
target: leftMinimumLengthHandle
anchors {
top: undefined
bottom: root.bottom
left: undefined
right: undefined
}
}
AnchorChanges {
target: leftMaximumLengthHandle
anchors {
top: root.top
bottom: undefined
left: undefined
right: undefined
}
}
},
State {
name: "LeftEdge"
PropertyChanges {
target: root
prefix: "west"
width: root.implicitWidth
}
AnchorChanges {
target: root
anchors {
top: root.parent.top
bottom: root.parent.bottom
left: root.parent.left
right: undefined
}
}
AnchorChanges {
target: offsetHandle
anchors {
top: undefined
bottom: undefined
left: undefined
right: root.right
}
}
AnchorChanges {
target: minimumLengthHandle
anchors {
top: undefined
bottom: undefined
left: root.left
right: undefined
}
}
AnchorChanges {
target: maximumLengthHandle
anchors {
top: undefined
bottom: undefined
left: undefined
right: root.right
}
}
AnchorChanges {
target: leftMinimumLengthHandle
anchors {
top: undefined
bottom: undefined
left: root.left
right: undefined
}
}
AnchorChanges {
target: leftMaximumLengthHandle
anchors {
top: undefined
bottom: undefined
left: undefined
right: root.right
}
}
},
State {
name: "RightEdge"
PropertyChanges {
target: root
prefix: "east"
width: root.implicitWidth
}
AnchorChanges {
target: root
anchors {
top: root.parent.top
bottom: root.parent.bottom
left: undefined
right: root.parent.right
}
}
AnchorChanges {
target: offsetHandle
anchors {
top: undefined
bottom: undefined
left: parent.left
right: undefined
}
}
AnchorChanges {
target: minimumLengthHandle
anchors {
top: undefined
bottom: undefined
left: undefined
right: parent.right
}
}
AnchorChanges {
target: maximumLengthHandle
anchors {
top: undefined
bottom: undefined
left: parent.left
right: undefined
}
}
AnchorChanges {
target: leftMinimumLengthHandle
anchors {
top: undefined
bottom: undefined
left: undefined
right: parent.right
}
}
AnchorChanges {
target: leftMaximumLengthHandle
anchors {
top: undefined
bottom: undefined
left: parent.left
right: undefined
}
}
}
]
}