1
0
mirror of https://github.com/AvengeMedia/DankMaterialShell.git synced 2026-06-07 19:59:14 -04:00
Files
DankMaterialShell/quickshell/Modules/ControlCenter/Components/EditModeWidgetDelegate.qml
T
bbedward 8c20f448ed control center: improve drag handling
misc: fix layer shell enum usage
2026-06-01 13:16:47 -04:00

243 lines
6.1 KiB
QML

import QtQuick
import qs.Common
import qs.Services
import qs.Widgets
Item {
id: root
property var grid: null
property int sourceIndex: -1
property var widgetData: null
property Component widgetComponent: null
property bool isSlider: false
property real slotX: 0
property real slotY: 0
property real cellW: 100
property real cellH: 60
property bool dragging: !!grid && grid.draggingSourceIndex === sourceIndex
signal removeWidget(int index)
signal toggleWidgetSize(int index)
signal configRequested(int index, var widgetData, var anchor)
width: cellW
height: cellH
z: dragging ? 10000 : 1
Binding {
target: root
property: "x"
value: root.slotX
when: !root.dragging
restoreMode: Binding.RestoreNone
}
Binding {
target: root
property: "y"
value: root.slotY
when: !root.dragging
restoreMode: Binding.RestoreNone
}
onXChanged: {
if (dragging && grid)
grid.updateDragTarget(x + width / 2, y + height / 2);
}
onYChanged: {
if (dragging && grid)
grid.updateDragTarget(x + width / 2, y + height / 2);
}
Behavior on x {
enabled: !root.dragging
NumberAnimation {
duration: Theme.expressiveDurations.normal
easing.type: Easing.BezierSpline
easing.bezierCurve: Theme.expressiveCurves.expressiveEffects
}
}
Behavior on y {
enabled: !root.dragging
NumberAnimation {
duration: Theme.expressiveDurations.normal
easing.type: Easing.BezierSpline
easing.bezierCurve: Theme.expressiveCurves.expressiveEffects
}
}
Rectangle {
id: dragIndicator
anchors.fill: parent
color: "transparent"
border.color: Theme.primary
border.width: root.dragging ? 2 : 0
radius: Theme.cornerRadius
opacity: root.dragging ? 0.8 : 1.0
z: root.dragging ? 10000 : 1
Behavior on border.width {
NumberAnimation {
duration: 150
}
}
Behavior on opacity {
NumberAnimation {
duration: 150
}
}
}
Loader {
id: widgetLoader
anchors.fill: parent
sourceComponent: root.widgetComponent
property var widgetData: root.widgetData
property int widgetIndex: root.sourceIndex
property int globalWidgetIndex: root.sourceIndex
property int widgetWidth: root.widgetData?.width || 50
MouseArea {
id: editModeBlocker
anchors.fill: parent
enabled: true
acceptedButtons: Qt.AllButtons
onPressed: function (mouse) {
mouse.accepted = true;
}
onWheel: function (wheel) {
wheel.accepted = true;
}
z: 100
}
}
MouseArea {
id: dragArea
anchors.fill: parent
cursorShape: Qt.OpenHandCursor
drag.target: root
drag.axis: Drag.XAndYAxis
drag.smoothed: false
onPressed: function (mouse) {
cursorShape = Qt.ClosedHandCursor;
if (root.grid)
root.grid.beginDrag(root.sourceIndex);
}
onReleased: function (mouse) {
cursorShape = Qt.OpenHandCursor;
if (root.grid)
root.grid.endDrag();
}
}
Rectangle {
id: removeButton
width: 16
height: 16
radius: 8
color: Theme.error
anchors.top: parent.top
anchors.right: parent.right
anchors.margins: -4
z: 10
DankIcon {
anchors.centerIn: parent
name: "close"
size: 12
color: Theme.primaryText
}
MouseArea {
anchors.fill: parent
cursorShape: Qt.PointingHandCursor
onClicked: root.removeWidget(root.sourceIndex)
}
}
SizeControls {
anchors.bottom: parent.bottom
anchors.left: parent.left
anchors.margins: -6
z: 10
currentSize: root.widgetData?.width || 50
isSlider: root.isSlider
widgetIndex: root.sourceIndex
onSizeChanged: newSize => {
var widgets = SettingsData.controlCenterWidgets.slice();
if (root.sourceIndex >= 0 && root.sourceIndex < widgets.length) {
widgets[root.sourceIndex].width = newSize;
SettingsData.set("controlCenterWidgets", widgets);
}
}
}
readonly property bool hasConfigMenu: widgetData?.id === "diskUsage"
Rectangle {
id: configButton
width: 16
height: 16
radius: 8
color: Theme.primary
anchors.top: removeButton.top
anchors.right: removeButton.left
anchors.rightMargin: 4
visible: root.hasConfigMenu
z: 10
DankIcon {
anchors.centerIn: parent
name: "settings"
size: 12
color: Theme.primaryText
}
MouseArea {
anchors.fill: parent
cursorShape: Qt.PointingHandCursor
onClicked: root.configRequested(root.sourceIndex, root.widgetData, configButton)
}
}
Rectangle {
id: dragHandle
width: 16
height: 12
radius: 2
color: Theme.primary
anchors.top: parent.top
anchors.left: parent.left
anchors.margins: 4
z: 15
opacity: root.dragging ? 1.0 : 0.7
DankIcon {
anchors.centerIn: parent
name: "drag_indicator"
size: 10
color: Theme.primaryText
}
Behavior on opacity {
NumberAnimation {
duration: 150
}
}
}
Rectangle {
anchors.fill: parent
color: Qt.rgba(Theme.primary.r, Theme.primary.g, Theme.primary.b, 0.08)
radius: Theme.cornerRadius
border.color: "transparent"
border.width: 0
z: -1
}
}