3
0
mirror of https://github.com/Qortal/Brooklyn.git synced 2025-02-12 18:25:53 +00:00

480 lines
17 KiB
QML
Raw Normal View History

/*
SPDX-FileCopyrightText: 2013 Marco Martin <mart@kde.org>
SPDX-License-Identifier: GPL-2.0-or-later
*/
import QtQuick 2.15
import QtQuick.Controls 2.5 as QQC2
import QtQuick.Layouts 1.0
import org.kde.plasma.components 3.0 as PlasmaComponents3
import org.kde.plasma.core 2.0 as PlasmaCore
import org.kde.plasma.configuration 2.0
import org.kde.kquickcontrolsaddons 2.0 as KQuickControlsAddons
import org.kde.kirigami 2.19 as Kirigami
Item {
id: root
// Do not use Layout's implicitWidth/implicitHeight as they are updated too late (BUG 443294)
implicitWidth: Math.max(addWidgetsButton.implicitWidth, addSpacerButton.implicitWidth, settingsButton.implicitWidth, spinBoxLabel.implicitWidth, spinBox.implicitWidth) + PlasmaCore.Units.smallSpacing * 2
implicitHeight: Math.max(addWidgetsButton.implicitHeight, addSpacerButton.implicitHeight, settingsButton.implicitHeight, spinBoxLabel.implicitHeight, spinBox.implicitHeight) + PlasmaCore.Units.smallSpacing * 5
readonly property string addWidgetsButtonText: i18nd("plasma_shell_org.kde.plasma.desktop", "Add Widgets…")
readonly property string addSpacerButtonText: i18nd("plasma_shell_org.kde.plasma.desktop", "Add Spacer")
readonly property string settingsButtonText: i18nd("plasma_shell_org.kde.plasma.desktop", "More Options…")
KQuickControlsAddons.MouseEventListener {
id: mel
cursorShape: Qt.SizeAllCursor
anchors.fill: parent
property int lastX
property int lastY
property int startMouseX
property int startMouseY
onPressed: {
dialogRoot.closeContextMenu();
lastX = mouse.screenX
lastY = mouse.screenY
startMouseX = mouse.x
startMouseY = mouse.y
tooltip.visible = true
}
onPositionChanged: {
panel.screenToFollow = mouse.screen;
var newLocation = panel.location;
//If the mouse is in an internal rectangle, do nothing
if ((mouse.screenX < panel.screenGeometry.x + panel.screenGeometry.width/3 ||
mouse.screenX > panel.screenGeometry.x + panel.screenGeometry.width/3*2) ||
(mouse.screenY < panel.screenGeometry.y + panel.screenGeometry.height/3 ||
mouse.screenY > panel.screenGeometry.y + panel.screenGeometry.height/3*2))
{
var screenAspect = panel.screenGeometry.height / panel.screenGeometry.width;
if (mouse.screenY < panel.screenGeometry.y+(mouse.screenX-panel.screenGeometry.x)*screenAspect) {
if (mouse.screenY < panel.screenGeometry.y + panel.screenGeometry.height-(mouse.screenX-panel.screenGeometry.x)*screenAspect) {
newLocation = PlasmaCore.Types.TopEdge;
} else {
newLocation = PlasmaCore.Types.RightEdge;
}
} else {
if (mouse.screenY < panel.screenGeometry.y + panel.screenGeometry.height-(mouse.screenX-panel.screenGeometry.x)*screenAspect) {
newLocation = PlasmaCore.Types.LeftEdge;
} else {
newLocation = PlasmaCore.Types.BottomEdge;
}
}
}
panel.location = newLocation
switch (newLocation) {
case PlasmaCore.Types.TopEdge:
var y = Math.max(mouse.screenY - mapToItem(dialogRoot, 0, startMouseY).y, panel.height);
configDialog.y = y;
panel.distance = Math.max(y - panel.height - panel.screenToFollow.geometry.y, 0);
break
case PlasmaCore.Types.LeftEdge:
var x = Math.max(mouse.screenX - mapToItem(dialogRoot, startMouseX, 0).x, panel.width);
configDialog.x = x;
panel.distance = Math.max(x - panel.width - panel.screenToFollow.geometry.x, 0);
break;
case PlasmaCore.Types.RightEdge:
var x = Math.min(mouse.screenX - mapToItem(dialogRoot, startMouseX, 0).x, mouse.screen.geometry.x + mouse.screen.size.width - panel.width - configDialog.width);
configDialog.x = x;
panel.distance = Math.max(mouse.screen.size.width - (x - mouse.screen.geometry.x) - panel.width - configDialog.width, 0);
break;
case PlasmaCore.Types.BottomEdge:
default:
var y = Math.min(mouse.screenY - mapToItem(dialogRoot, 0, startMouseY).y, mouse.screen.geometry.y + mouse.screen.size.height - panel.height - configDialog.height);
configDialog.y = y;
panel.distance = Math.max(mouse.screen.size.height - (y - mouse.screen.geometry.y) - panel.height - configDialog.height, 0);
}
lastX = mouse.screenX
lastY = mouse.screenY
}
onReleased: {
panel.distance = 0
panelResetAnimation.running = true
}
}
QQC2.Action {
shortcut: "Escape"
onTriggered: {
// avoid leaving the panel in an inconsistent state when escaping while dragging it
if (mel.pressed) {
return
}
if (contextMenuLoader.opened) {
contextMenuLoader.close()
} else {
configDialog.close()
}
}
}
GridLayout {
id: buttonsLayout_1
rows: 1
columns: 1
flow: plasmoid.formFactor === PlasmaCore.Types.Horizontal ? GridLayout.TopToBottom : GridLayout.LeftToRight
anchors.margins: rowSpacing
anchors.topMargin: plasmoid.formFactor === PlasmaCore.Types.Vertical ? rowSpacing + closeButton.height : rowSpacing
rowSpacing: PlasmaCore.Units.smallSpacing
columnSpacing: PlasmaCore.Units.smallSpacing
PlasmaComponents3.Button {
id: addWidgetsButton
text: root.addWidgetsButtonText
icon.name: "list-add"
Layout.fillWidth: true
onClicked: {
configDialog.close();
configDialog.showAddWidgetDialog();
}
}
PlasmaComponents3.Button {
id: addSpacerButton
text: root.addSpacerButtonText
icon.name: "distribute-horizontal-x"
Layout.fillWidth: true
onClicked: {
configDialog.addPanelSpacer();
}
}
}
GridLayout {
id: row
columns: dialogRoot.vertical ? 1 : 4
rows: dialogRoot.vertical ? 4 : 1
anchors.centerIn: parent
rowSpacing: PlasmaCore.Units.smallSpacing
columnSpacing: PlasmaCore.Units.smallSpacing
PlasmaComponents3.Label {
Layout.fillWidth: true
wrapMode: Text.Wrap
horizontalAlignment: Qt.AlignHCenter
text: i18ndc("plasma_shell_org.kde.plasma.desktop", "Minimize the length of this string as much as possible", "Drag to move")
}
Item {
Layout.preferredWidth: dialogRoot.vertical ? 0 : PlasmaCore.Units.gridUnit * 8
Layout.preferredHeight: dialogRoot.vertical ? PlasmaCore.Units.gridUnit * 8 : 0
}
PlasmaComponents3.Label {
id: spinBoxLabel
Layout.fillWidth: true
wrapMode: Text.Wrap
text: panel.location === PlasmaCore.Types.LeftEdge || panel.location === PlasmaCore.Types.RightEdge ? i18nd("plasma_shell_org.kde.plasma.desktop", "Panel width:") : i18nd("plasma_shell_org.kde.plasma.desktop", "Panel height:")
}
PlasmaComponents3.SpinBox {
id: spinBox
Layout.fillWidth: true
editable: true
focus: !Kirigami.InputMethod.willShowOnActive
from: 20 // below this size, the panel is mostly unusable
to: PlasmaCore.Types.LeftEdge || panel.location === PlasmaCore.Types.RightEdge ? panel.screenToFollow.geometry.width / 2 : panel.screenToFollow.geometry.height / 2
stepSize: 2
value: panel.thickness
onValueModified: {
panel.thickness = value
// Adjust the position of the config bar too
switch (panel.location) {
case PlasmaCore.Types.TopEdge:
configDialog.y = Qt.binding(function() { return panel.y + panel.thickness });
break;
case PlasmaCore.Types.LeftEdge:
configDialog.x = Qt.binding(function() { return panel.x + panel.thickness });
break;
case PlasmaCore.Types.RightEdge:
configDialog.x = Qt.binding(function() { return panel.x - configDialog.width });
break;
case PlasmaCore.Types.BottomEdge:
default:
configDialog.y = Qt.binding(function() { return panel.y - configDialog.height });
break;
}
}
DragHandler {
property int magnitude: PlasmaCore.Units.gridUnit
target: null
xAxis.enabled: panel.location == PlasmaCore.Types.LeftEdge || panel.location == PlasmaCore.Types.RightEdge
yAxis.enabled: panel.location == PlasmaCore.Types.TopEdge || panel.location == PlasmaCore.Types.BottomEdge
grabPermissions: PointerHandler.CanTakeOverFromAnything
onTranslationChanged: {
var distance
switch (panel.location) {
case PlasmaCore.Types.TopEdge:
distance = translation.y
break;
case PlasmaCore.Types.LeftEdge:
distance = translation.x
break;
case PlasmaCore.Types.RightEdge:
distance = -translation.x
break;
case PlasmaCore.Types.BottomEdge:
default:
distance = -translation.y
break;
}
parent.value = parent.value + (Math.floor(distance / magnitude) * parent.stepSize)
parent.valueModified()
}
}
}
}
PlasmaComponents3.Label {
id: placeHolder
visible: false
text: addWidgetsButtonText + addSpacerButtonText + settingsButtonText
}
Connections {
target: configDialog
function onVisibleChanged() {
if (!configDialog.visible) {
settingsButton.checked = false
}
}
}
GridLayout {
id: buttonsLayout_2
rows: 1
columns: 1
flow: plasmoid.formFactor === PlasmaCore.Types.Horizontal ? GridLayout.TopToBottom : GridLayout.LeftToRight
anchors.margins: rowSpacing
rowSpacing: PlasmaCore.Units.smallSpacing
columnSpacing: PlasmaCore.Units.smallSpacing
PlasmaComponents3.Button {
id: settingsButton
text: root.settingsButtonText
icon.name: "configure"
Layout.fillWidth: true
checkable: true
onCheckedChanged: {
if (checked) {
contextMenuLoader.open()
} else {
contextMenuLoader.close()
}
}
}
PlasmaComponents3.ToolButton {
id: closeButton
parent: plasmoid.formFactor === PlasmaCore.Types.Horizontal ? buttonsLayout_2 : root
anchors.right: plasmoid.formFactor === PlasmaCore.Types.Horizontal ? undefined : parent.right
icon.name: "window-close"
onClicked: {
configDialog.close()
}
PlasmaComponents3.ToolTip {
text: i18nd("plasma_shell_org.kde.plasma.desktop", "Close")
}
}
Loader {
id: contextMenuLoader
property bool opened: item && item.visible
onOpenedChanged: settingsButton.checked = opened
source: "MoreSettingsMenu.qml"
active: false
function open() {
active = true
item.visible = true
}
function close() {
if (item) {
item.visible = false
}
}
}
}
//BEGIN States
states: [
State {
name: "TopEdge"
PropertyChanges {
target: root
height: root.implicitHeight
}
AnchorChanges {
target: root
anchors {
top: undefined
bottom: root.parent.bottom
left: root.parent.left
right: root.parent.right
}
}
AnchorChanges {
target: buttonsLayout_1
anchors {
verticalCenter: root.verticalCenter
top: undefined
bottom: undefined
left: root.left
right: undefined
}
}
AnchorChanges {
target: buttonsLayout_2
anchors {
verticalCenter: root.verticalCenter
top: undefined
bottom: undefined
left: undefined
right: root.right
}
}
PropertyChanges {
target: buttonsLayout_1
width: buttonsLayout_1.implicitWidth
}
PropertyChanges {
target: buttonsLayout_2
width: buttonsLayout_2.implicitWidth
}
},
State {
name: "BottomEdge"
PropertyChanges {
target: root
height: root.implicitHeight
}
AnchorChanges {
target: root
anchors {
top: root.parent.top
bottom: undefined
left: root.parent.left
right: root.parent.right
}
}
AnchorChanges {
target: buttonsLayout_1
anchors {
verticalCenter: root.verticalCenter
top: undefined
bottom: undefined
left: root.left
right: undefined
}
}
AnchorChanges {
target: buttonsLayout_2
anchors {
verticalCenter: root.verticalCenter
top: undefined
bottom: undefined
left: undefined
right: root.right
}
}
PropertyChanges {
target: buttonsLayout_1
width: buttonsLayout_1.implicitWidth
}
PropertyChanges {
target: buttonsLayout_2
width: buttonsLayout_2.implicitWidth
}
},
State {
name: "LeftEdge"
PropertyChanges {
target: root
width: root.implicitWidth
}
AnchorChanges {
target: root
anchors {
top: root.parent.top
bottom: root.parent.bottom
left: undefined
right: root.parent.right
}
}
AnchorChanges {
target: buttonsLayout_1
anchors {
verticalCenter: undefined
top: root.top
bottom: undefined
left: root.left
right: root.right
}
}
AnchorChanges {
target: buttonsLayout_2
anchors {
verticalCenter: undefined
top: undefined
bottom: root.bottom
left: root.left
right: root.right
}
}
},
State {
name: "RightEdge"
PropertyChanges {
target: root
width: root.implicitWidth
}
AnchorChanges {
target: root
anchors {
top: root.parent.top
bottom: root.parent.bottom
left: root.parent.left
right: undefined
}
}
AnchorChanges {
target: buttonsLayout_1
anchors {
verticalCenter: undefined
top: root.top
bottom: undefined
left: root.left
right: root.right
}
}
AnchorChanges {
target: buttonsLayout_2
anchors {
verticalCenter: undefined
top: undefined
bottom: root.bottom
left: root.left
right: root.right
}
}
}
]
//END States
}