diff --git a/.config/quickshell/modules/common/widgets/DragManager.qml b/.config/quickshell/modules/common/widgets/DragManager.qml new file mode 100644 index 000000000..2e59034de --- /dev/null +++ b/.config/quickshell/modules/common/widgets/DragManager.qml @@ -0,0 +1,60 @@ +import "root:/modules/common" +import "root:/services" +import QtQuick +import QtQuick.Controls +import QtQuick.Layouts + +MouseArea { // Flick to dismiss + id: root + hoverEnabled: true + acceptedButtons: Qt.LeftButton + + property bool interactive: true + property bool automaticallyReset: true + readonly property real dragDiffX: _dragDiffX + readonly property real dragDiffY: _dragDiffY + + signal dragPressed(diffX: real, diffY: real) + signal dragReleased(diffX: real, diffY: real) + + property real startX: 0 + property real startY: 0 + property bool dragging: false + property real _dragDiffX: 0 + property real _dragDiffY: 0 + + function resetDrag() { + _dragDiffX = 0 + _dragDiffY = 0 + } + + onPressed: (mouse) => { + if (!root.interactive) return; + if (mouse.button === Qt.LeftButton) { + startX = mouse.x + startY = mouse.y + } + } + onReleased: (mouse) => { + if (!root.interactive) return; + dragging = false + root.dragReleased(_dragDiffX, _dragDiffY); + if (root.automaticallyReset) { + root.resetDrag(); + } + } + onPositionChanged: (mouse) => { + if (!root.interactive) return; + if (mouse.buttons & Qt.LeftButton) { + root._dragDiffX = mouse.x - startX + root._dragDiffY = mouse.y - startY + const dist = Math.sqrt(root._dragDiffX * root._dragDiffX + root._dragDiffY * root._dragDiffY); + root.dragPressed(_dragDiffX, _dragDiffY); + root.dragging = true; + } + } + onCanceled: (mouse) => { + if (!root.interactive) return; + released(mouse); + } +}