mirror of
https://github.com/tomasriveral/nixos.git
synced 2026-08-12 18:30:46 +02:00
199 lines
5.2 KiB
QML
199 lines
5.2 KiB
QML
pragma ComponentBehavior: Bound
|
|
|
|
import QtQuick
|
|
import Quickshell
|
|
import Quickshell.Io
|
|
import Quickshell.Wayland
|
|
import "../components"
|
|
|
|
// TODO: make configurable: cursor visibility, screen freeze
|
|
PanelWindow {
|
|
id: root
|
|
|
|
required property var controller
|
|
|
|
exclusionMode: ExclusionMode.Ignore
|
|
anchors {
|
|
left: true
|
|
right: true
|
|
top: true
|
|
bottom: true
|
|
}
|
|
color: "transparent"
|
|
WlrLayershell.keyboardFocus: WlrKeyboardFocus.Exclusive
|
|
WlrLayershell.namespace: "shell:screenshot"
|
|
|
|
visible: screencopy.hasContent
|
|
ScreencopyView {
|
|
id: screencopy
|
|
captureSource: root.screen
|
|
anchors.fill: parent
|
|
paintCursor: false
|
|
}
|
|
|
|
Process {
|
|
id: cmd
|
|
running: false
|
|
onExited: notifyCmd.running = true
|
|
}
|
|
Process {
|
|
id: notifyCmd
|
|
command: ["notify-send", "\"Screenshot copied\"", "\"The screenshot was copied to your clipboard\""]
|
|
running: false
|
|
onExited: root.controller.isOpen = false
|
|
}
|
|
|
|
contentItem {
|
|
focus: true
|
|
Keys.onEscapePressed: root.controller.isOpen = false
|
|
|
|
Keys.onReturnPressed: () => {
|
|
const x = Math.ceil(root.left);
|
|
const y = Math.ceil(root.top);
|
|
const w = Math.floor(root.right - root.left);
|
|
const h = Math.floor(root.bottom - root.top);
|
|
cmd.command = ["sh", "-c", `grim -g "${x},${y} ${w}x${h}" - | wl-copy`];
|
|
cmd.running = true;
|
|
}
|
|
}
|
|
|
|
property var left: 0
|
|
property var top: 0
|
|
property var right: 0
|
|
property var bottom: 0
|
|
|
|
Canvas {
|
|
id: canvas
|
|
anchors.fill: parent
|
|
|
|
readonly property var borderExtendX: 56
|
|
readonly property var borderExtendY: 48
|
|
readonly property var borderWidthH: 12
|
|
readonly property var borderWidthV: 18
|
|
|
|
onPaint: {
|
|
var ctx = getContext("2d");
|
|
ctx.reset();
|
|
|
|
// Background
|
|
ctx.fillStyle = "#44000000";
|
|
ctx.fillRect(0, 0, root.width, root.height);
|
|
|
|
// Border
|
|
ctx.fillStyle = "#824524";
|
|
ctx.fillRect(root.left - borderExtendX, root.top - borderWidthH, root.right - root.left + borderExtendX * 2, borderWidthH);
|
|
ctx.fillRect(root.left - borderExtendX, root.bottom, root.right - root.left + borderExtendX * 2, borderWidthH);
|
|
ctx.fillRect(root.left - borderWidthV, root.top - borderExtendY, borderWidthV, root.bottom - root.top + borderExtendY * 2);
|
|
ctx.fillRect(root.right, root.top - borderExtendY, borderWidthV, root.bottom - root.top + borderExtendY * 2);
|
|
|
|
// Rect
|
|
ctx.clearRect(root.left, root.top, root.right - root.left, root.bottom - root.top);
|
|
}
|
|
}
|
|
|
|
Rope {
|
|
id: topLeftRope
|
|
anchors.fill: parent
|
|
start: Qt.vector2d(0, 0)
|
|
end: Qt.vector2d(0, 0)
|
|
}
|
|
Rope {
|
|
id: topRightRope
|
|
anchors.fill: parent
|
|
start: Qt.vector2d(0, 0)
|
|
end: Qt.vector2d(0, 0)
|
|
}
|
|
Rope {
|
|
id: bottomRightRope
|
|
anchors.fill: parent
|
|
start: Qt.vector2d(0, 0)
|
|
end: Qt.vector2d(0, 0)
|
|
}
|
|
Rope {
|
|
id: bottomLeftRope
|
|
anchors.fill: parent
|
|
start: Qt.vector2d(0, 0)
|
|
end: Qt.vector2d(0, 0)
|
|
}
|
|
|
|
RopeTie {
|
|
x: root.left - width / 2
|
|
y: root.top - height / 2
|
|
}
|
|
RopeTie {
|
|
x: root.right - width / 2
|
|
y: root.top - height / 2
|
|
}
|
|
RopeTie {
|
|
x: root.right - width / 2
|
|
y: root.bottom - height / 2
|
|
}
|
|
RopeTie {
|
|
x: root.left - width / 2
|
|
y: root.bottom - height / 2
|
|
}
|
|
|
|
MouseArea {
|
|
anchors.fill: parent
|
|
|
|
onPressed: e => {
|
|
root.left = e.x;
|
|
root.top = e.y;
|
|
root.right = e.x;
|
|
root.bottom = e.y;
|
|
}
|
|
onPositionChanged: e => {
|
|
if (e.x > root.left) {
|
|
root.right = e.x;
|
|
}
|
|
|
|
if (e.y > root.top) {
|
|
root.bottom = e.y;
|
|
}
|
|
}
|
|
}
|
|
|
|
onLeftChanged: () => {
|
|
canvas.requestPaint();
|
|
topLeftRope.end = Qt.vector2d(left, top);
|
|
bottomLeftRope.end = Qt.vector2d(left, bottom);
|
|
}
|
|
onTopChanged: () => {
|
|
canvas.requestPaint();
|
|
topLeftRope.end = Qt.vector2d(left, top);
|
|
topRightRope.end = Qt.vector2d(right, top);
|
|
}
|
|
onRightChanged: () => {
|
|
canvas.requestPaint();
|
|
topRightRope.end = Qt.vector2d(right, top);
|
|
bottomRightRope.end = Qt.vector2d(right, bottom);
|
|
}
|
|
onBottomChanged: () => {
|
|
canvas.requestPaint();
|
|
bottomRightRope.end = Qt.vector2d(right, bottom);
|
|
bottomLeftRope.end = Qt.vector2d(left, bottom);
|
|
}
|
|
|
|
onWidthChanged: () => {
|
|
left = width / 2;
|
|
right = width / 2;
|
|
|
|
topRightRope.start = Qt.vector2d(width, 0);
|
|
bottomRightRope.start = Qt.vector2d(width, height);
|
|
}
|
|
onHeightChanged: () => {
|
|
top = height / 2;
|
|
bottom = height / 2;
|
|
|
|
bottomRightRope.start = Qt.vector2d(width, height);
|
|
bottomLeftRope.start = Qt.vector2d(0, height);
|
|
}
|
|
|
|
component RopeTie: Image {
|
|
width: 48
|
|
height: 48
|
|
source: "../assets/rope-tie.png"
|
|
smooth: false
|
|
}
|
|
}
|