Files
nixos/other/quickshell/bar/systray/SysTray.qml
T

145 lines
5.2 KiB
QML

pragma ComponentBehavior: Bound
import QtQuick
import QtQuick.Layouts
import QtQuick.Effects
import Quickshell
import Quickshell.Services.SystemTray
import "../../theme" as Theme
import ".."
import "../.."
import "../../components"
Rectangle {
id: root
required property var bar
implicitWidth: row.implicitWidth + 10
Layout.fillHeight: true
color: Theme.Colors.sysTrayColor1
RowLayout {
id: row
implicitWidth: childrenRect.width
spacing: 5
anchors {
fill: parent
margins: 5
}
Repeater {
model: SystemTray.items
Item {
id: item
required property SystemTrayItem modelData
property bool targetMenuOpen: false
Layout.fillHeight: true
implicitWidth: height
Image {
anchors {
top: parent.top
bottom: parent.bottom
horizontalCenter: parent.horizontalCenter
}
width: height
source: item.modelData.icon
scale: item.targetMenuOpen ? 0.8 : 1
MouseArea {
id: mouseArea
anchors.fill: parent
acceptedButtons: Qt.LeftButton | Qt.RightButton | Qt.MiddleButton
// showPressed: item.targetMenuOpen || (pressedButtons & ~Qt.RightButton)
// fillWindowWidth: true
// extraVerticalMargin: row.spacing / 2
onClicked: event => {
event.accepted = true;
if (event.button == Qt.LeftButton) {
item.modelData.activate();
} else if (event.button == Qt.MiddleButton) {
item.modelData.secondaryActivate();
}
}
onPressed: event => {
if (event.button == Qt.RightButton && item.modelData.hasMenu) {
item.targetMenuOpen = !item.targetMenuOpen;
}
}
onWheel: event => {
event.accepted = true;
const points = event.angleDelta.y / 120;
item.modelData.scroll(points, false);
}
// property var tooltip: TooltipItem {
// tooltip: root.bar.tooltip
// owner: mouseArea
//
// show: mouseArea.containsMouse
//
// Text {
// id: tooltipText
// text: item.modelData.tooltipTitle != "" ? item.modelData.tooltipTitle : item.modelData.id
// color: "white"
// }
// }
LazyLoader {
active: item.targetMenuOpen
PopupWindow {
id: rightclickMenu
anchor.window: root.bar
visible: true
Component.onCompleted: () => {
root.bar.focusable = true;
const pos = mouseArea.mapToGlobal(mouseArea.x, mouseArea.y);
anchor.rect.x = pos.x;
anchor.rect.y = pos.y + mouseArea.height;
}
Connections {
target: item
function onTargetMenuOpenChanged() {
root.bar.focusable = false;
}
}
contentItem {
focus: true
Keys.onEscapePressed: item.targetMenuOpen = false
}
implicitWidth: Math.max(1, menuView.implicitWidth)
implicitHeight: Math.max(1, menuView.implicitHeight)
color: Theme.Colors.sysTrayColor1
Rectangle {
anchors.fill: parent
color: Theme.Colors.sysTrayColor3
MenuView {
id: menuView
anchors.fill: parent
menu: item.modelData.menu
onClose: item.targetMenuOpen = false
}
}
}
}
}
}
}
}
}
}