pragma ComponentBehavior: Bound import Quickshell import Quickshell.Services.SystemTray import QtQuick import QtQuick.Shapes import qs.hyprchrome.theme // One tray item as a chamfered cell. Declares `modelData` required so it can be // a Repeater delegate directly, without an Item wrapper in between. // // Left click activates, right click opens the item's own menu — anchored under // the cell rather than at the window edge, since this rail sits along the top. MouseArea { id: cell required property SystemTrayItem modelData property int iconSize: 18 property int chamfer: 4 implicitWidth: cell.iconSize + 8 implicitHeight: cell.iconSize + 8 acceptedButtons: Qt.LeftButton | Qt.RightButton hoverEnabled: true cursorShape: Qt.PointingHandCursor onClicked: event => { if (event.button === Qt.LeftButton) { cell.modelData.activate(); } else if (cell.modelData.hasMenu) { const window = cell.QsWindow?.window; if (window) { const anchor = cell.mapToItem(null, 0, cell.height); cell.modelData.display(window, anchor.x, anchor.y); } } event.accepted = true; } Shape { anchors.fill: parent preferredRendererType: Shape.CurveRenderer ShapePath { strokeWidth: 1 strokeColor: cell.containsMouse ? Theme.accent : Theme.textAlpha(0.18) fillColor: cell.containsMouse ? Theme.selection : Theme.textAlpha(0.06) startX: cell.chamfer startY: 0 PathLine { x: cell.width; y: 0 } PathLine { x: cell.width; y: cell.height - cell.chamfer } PathLine { x: cell.width - cell.chamfer; y: cell.height } PathLine { x: 0; y: cell.height } PathLine { x: 0; y: cell.chamfer } PathLine { x: cell.chamfer; y: 0 } Behavior on strokeColor { ColorAnimation { duration: 150 } } } } Image { anchors.centerIn: parent source: cell.modelData.icon width: cell.iconSize height: cell.iconSize fillMode: Image.PreserveAspectFit smooth: true } }