mirror of
https://github.com/kossLAN/dots.git
synced 2025-11-05 06:59:50 -05:00
112 lines
3 KiB
QML
112 lines
3 KiB
QML
import QtQuick
|
|
import qs
|
|
|
|
Item {
|
|
id: root
|
|
width: 800
|
|
height: 600
|
|
|
|
property color overlayColor: "#80000000"
|
|
property rect selectionRect: Qt.rect(0, 0, 0, 0)
|
|
property point startPosition: Qt.point(0, 0)
|
|
property real borderSize: 2
|
|
|
|
signal areaSelected(rect selection)
|
|
|
|
// only send signal when selection rectangle has finished
|
|
onVisibleChanged: {
|
|
if (!visible)
|
|
selectionRect.width -= borderSize;
|
|
selectionRect.height -= borderSize;
|
|
areaSelected(selectionRect);
|
|
}
|
|
|
|
MouseArea {
|
|
id: selectionArea
|
|
anchors.fill: parent
|
|
hoverEnabled: true
|
|
|
|
onReleased: root.visible = false
|
|
|
|
onPressed: mouse => {
|
|
root.startPosition = Qt.point(mouse.x, mouse.y);
|
|
rectangle.x = mouse.x;
|
|
rectangle.y = mouse.y;
|
|
rectangle.width = 0;
|
|
rectangle.height = 0;
|
|
root.selectionRect = Qt.rect(rectangle.x, rectangle.y, rectangle.width, rectangle.height);
|
|
}
|
|
|
|
onPositionChanged: mouse => {
|
|
if (pressed) {
|
|
rectangle.x = Math.min(root.startPosition.x, mouse.x);
|
|
rectangle.y = Math.min(root.startPosition.y, mouse.y);
|
|
rectangle.width = Math.abs(mouse.x - root.startPosition.x);
|
|
rectangle.height = Math.abs(mouse.y - root.startPosition.y);
|
|
|
|
root.selectionRect = Qt.rect(rectangle.x, rectangle.y, rectangle.width, rectangle.height);
|
|
}
|
|
}
|
|
}
|
|
|
|
Rectangle {
|
|
id: overlayStart
|
|
color: root.overlayColor
|
|
visible: !selectionArea.containsPress
|
|
anchors.fill: parent
|
|
}
|
|
|
|
Rectangle {
|
|
id: overlayTop
|
|
color: root.overlayColor
|
|
x: 0
|
|
y: 0
|
|
width: parent.width
|
|
height: Math.max(0, rectangle.y)
|
|
visible: selectionArea.containsPress
|
|
}
|
|
|
|
Rectangle {
|
|
id: overlayLeft
|
|
color: root.overlayColor
|
|
x: 0
|
|
y: rectangle.y
|
|
width: Math.max(0, rectangle.x)
|
|
height: Math.max(0, rectangle.height)
|
|
visible: selectionArea.containsPress
|
|
}
|
|
|
|
Rectangle {
|
|
id: overlayRight
|
|
color: root.overlayColor
|
|
x: rectangle.x + rectangle.width
|
|
y: rectangle.y
|
|
width: Math.max(0, parent.width - (rectangle.x + rectangle.width))
|
|
height: Math.max(0, rectangle.height)
|
|
visible: selectionArea.containsPress
|
|
}
|
|
|
|
Rectangle {
|
|
id: overlayBottom
|
|
color: root.overlayColor
|
|
x: 0
|
|
y: rectangle.y + rectangle.height
|
|
width: parent.width
|
|
height: Math.max(0, parent.height - (rectangle.y + rectangle.height))
|
|
visible: selectionArea.containsPress
|
|
}
|
|
|
|
// The visible selection rectangle with border drawn above overlays
|
|
Rectangle {
|
|
id: rectangle
|
|
color: "transparent"
|
|
border.color: ShellSettings.colors.active_translucent
|
|
border.width: root.borderSize
|
|
x: 0
|
|
y: 0
|
|
width: 0
|
|
height: 0
|
|
z: 1
|
|
visible: selectionArea.containsPress
|
|
}
|
|
}
|