61 lines
1.5 KiB
QML
61 lines
1.5 KiB
QML
import QtQuick
|
|
import qs.Commons
|
|
import "DisplayModel.js" as DisplayModel
|
|
|
|
Rectangle {
|
|
id: root
|
|
|
|
property var monitors: []
|
|
property string selectedName: ""
|
|
readonly property int snapThreshold: 60
|
|
|
|
signal selected(string name)
|
|
signal monitorMoved(string name, int x, int y)
|
|
signal layoutSettled()
|
|
|
|
readonly property var bounds: DisplayModel.layoutBounds(root.monitors)
|
|
readonly property real fitScale: DisplayModel.canvasScale(
|
|
bounds,
|
|
Math.max(1, width - Style.spaceReal(24)),
|
|
Math.max(1, height - Style.spaceReal(24)))
|
|
|
|
color: Util.alpha(Color.background, 0.35)
|
|
radius: Style.cardRadius
|
|
border.width: 1
|
|
border.color: Util.alpha(Color.foreground, 0.15)
|
|
clip: true
|
|
|
|
Item {
|
|
id: stage
|
|
width: root.bounds.width * root.fitScale
|
|
height: root.bounds.height * root.fitScale
|
|
anchors.centerIn: parent
|
|
|
|
Repeater {
|
|
model: root.monitors
|
|
|
|
MonitorCard {
|
|
required property var modelData
|
|
monitor: modelData
|
|
canvasScale: root.fitScale
|
|
originX: root.bounds.x
|
|
originY: root.bounds.y
|
|
selected: modelData.name === root.selectedName
|
|
onPicked: root.selected(modelData.name)
|
|
onMoved: function(x, y) { root.monitorMoved(modelData.name, x, y) }
|
|
onDropped: root.layoutSettled()
|
|
}
|
|
}
|
|
}
|
|
|
|
Text {
|
|
anchors.centerIn: parent
|
|
visible: root.monitors.length === 0
|
|
text: "No monitors reported"
|
|
textFormat: Text.PlainText
|
|
color: Util.alpha(Color.foreground, 0.6)
|
|
font.family: Style.font.family
|
|
font.pixelSize: Style.font.bodySmall
|
|
}
|
|
}
|